Почему так работает "_line" ? - Lisp

Узнай цену своей работы

Формулировка задачи:

Доброго всем времени суток!
(defun c:my_point ()
  (setq p1 (getpoint "\nââåäèòå áàçîâóþ òî÷êó:")) ;
  (setq p2 (polar p1 pi 100))		; Çàäàåì êîîðäèíàòû òî÷êè p2
  (setq p3 (polar p2 (/ (- pi) 2) 100))	;
  (command "_line" p1 p2 "")		; ðèñóåì ëèíèþ 1
  (setq line1 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà
  (command "_line" p2 p3 "")		; ðèñóåì ëèíèþ 2
  (setq line2 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà
  (setvar "FILLETRAD" 10)		; óñòàíàâëèâàåì ñèñòåìíóþ ïåðåìåííóþ ðàäèóñà

  ;(command "_Fillet" line1 line2)	; Ñîïðÿæåíèå		

)
Если я пишу

(command "_line" p1 p2 p3 "")

то проблем нет, рисует горизонталь и далее перпендикулярно вниз. Все логично и как нужно, но если я рисую линии отдельно:

(command "_line" p1 p2 "")

(command "_line" p2 p3 "")

то вторая (перпендикулярная) линия начинается из середины горизонтальной и идет под углом к точке p3. Что не так?
Решил эту проблему переставлением координат местами, в итоге с сопряжением снова не то что то.. Не могу понять почему?
(defun c:my_point ()
  (setq p1 (getpoint "\nââåäèòå áàçîâóþ òî÷êó:")) ;
  (setq p2 (polar p1 pi 100))		; Çàäàåì êîîðäèíàòû òî÷êè p2
  (setq p3 (polar p2 (/ (- pi) 2) 100))	; Çàäàåì êîîðäèíàòû òî÷êè p3
  (setq p4 (polar p3 0 100))		; Çàäàåì êîîðäèíàòû òî÷êè p3  
  (command "_line" p1 p2 "")		; ðèñóåì ëèíèþ 1
  (setq line1 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà
  (command "_line" p3 p2 "")		; ðèñóåì ëèíèþ 2
  (setq line2 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà

  (command "_line" p4 p1 "")		; ðèñóåì ëèíèþ 1
  (setq line3 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà
  (command "_line" p4 p3 "")		; ðèñóåì ëèíèþ 2
  (setq line4 (entlast))		; Çàïèñûâàåì èìÿ îáúåêòà

  (setvar "FILLETRAD" 10)		; óñòàíàâëèâàåì ñèñòåìíóþ ïåðåìåííóþ ðàäèóñà

  (command "_Fillet" line1 line2)	; Ñîïðÿæåíèå
  (command "_Fillet" line3 line4)	; Ñîïðÿæåíèå
  (command "_Fillet" line2 line3)	; Ñîïðÿæåíèå
  (command "_Fillet" line1 line4)	; Ñîïðÿæåíèå	

)
Задача нарисовать квадрат с сопряжением в углах =5

Решение задачи: «Почему так работает "_line" ?»

textual
Листинг программы
(defun C:MYPOINT ( / *error* osm blm cme flt p1 p2 p3 p4 )
 
  (defun *error* (msg)
   ; Восстанавливаем системные переменные osmode , blipmode , cmdecho
    (setvar 'osmode osm)
    (setvar 'blipmode blm)
    (setvar 'cmdecho cme)
    (setvar 'filletrad flt)
    (princ)
  )
  
  ;; Запоминаем и обнуляем системные переменные osmode , blipmode , cmdecho
  (setq osm (getvar 'osmode))
  (setq blm (getvar 'blipmode))
  (setq cme (getvar 'cmdecho))
  (setq flt (getvar 'filletrad))
  
  ;; Задаем координаты точки p1
  (setq p1 (getpoint "\nВведите базовую точку:"))
                   
  (setq p2 (polar p1 pi 100))           ; Задаем координаты точки p2
  (setq p3 (polar p2 (/ (- pi) 2) 100)) ; Задаем координаты точки p3
  (setq p4 (polar p3 0 100))            ; Задаем координаты точки p3
 
  (setvar 'cmdecho  0) 
  (setvar 'osmode   0)
  (setvar 'blipmode 0)
 
  (command "_line" p1 p2 "")        ; рисуем линию 1
  (setq line1 (entlast))        ; Записываем имя объекта
 
  (command "_line" p2 p3 "")        ; рисуем линию 2
  (setq line2 (entlast))        ; Записываем имя объекта
 
  (command "_line" p3 p4 "")        ; рисуем линию 3
  (setq line3 (entlast))        ; Записываем имя объекта 
 
  (command "_line" p4 p1 "")        ; рисуем линию 4
  (setq line4 (entlast))        ; Записываем имя объекта
 
  (setvar 'filletrad 10)       ; устанавливаем системную переменную радиуса
 
  (command "_Fillet" line1 line2)   ; Сопряжение
  (command "_Fillet" line2 line3)   ; Сопряжение
  (command "_Fillet" line3 line4)   ; Сопряжение
  (command "_Fillet" line4 line1)   ; Сопряжение
 
 
 (*error* nil)
 
)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5