Тема: LISP. Поворот рисунка во вьюпорте

Программа наподобие alignspace, но не изменяет масштаб, что
важно для меня. Первая разворачивает рисунок на восток(направо). Вторая на север(наверх). Нужно зайти во въюпорт и запустить прогу. Выбрать две точки. Разворот идёт вокруг первой точки.
Вторая разворачивается или на север или на восток. Если прогу запустили до того как войти во вьюпорт то она может смасштабировать по предыдущему вьюпорту.

;;;;;;;;povorot na vostok (napravo)
(defun c:vv( / Lay pLay spis_Lay nameset nameVP msht
               msht_str ptp p1p p1 p2 myline p1_p p1_New)
(setq snp (getvar "Osmode"))
(setvar "Osmode" 1536)
(command "_.pspace")
(setq Lay (getvar "CTAB"))
(setq spLay (cons 410 Lay))
(setq spis_Lay (list '( 0 . "VIEWPORT") spLay '(68 . 2)))
(setq nameset (ssget "X"  spis_Lay))
(setq nameVP (ssname nameset 0))
(setq msht (acet-ms-to-ps 1 nameVP))
(setq msht_str (strcat (rtos msht) "XP"))
(command "_.mspace")
(setq p1 (reverse(cdr(reverse(getpoint "pick")))))
(setq p2 (reverse(cdr(reverse(getpoint "second pick")))))
(setq ptp (trans p1 1 2))
(setq p1p (trans ptp 2 3)) ;pervaya tochka v paperspace
(command "LINE" p1 p2 "")
(setq myline (entlast))
(command "ucs" "_ob" myline)
(entdel myline)
(command "plan" "_c")
(command "zoom" "_s" msht_str)
(setq p1_p (trans p1p 3 2))
(setq p1_New (trans p1_p 2 1))
(command "pan" '(0 0 0) p1_New)
(command "_.pspace")
(setvar "Osmode" snp)
)
;;;povorachivaet na sever(naverh)
(defun c:nn( / Lay pLay spis_Lay nameset nameVP msht p3
               msht_str ptp p1p p1 p2 myline p1_p p1_New
               dist ugol ugol_new deltaX deltaY new_X new_Y)
(setq snp (getvar "Osmode"))
(setvar "Osmode" 1536)
(command "_.pspace")
(setq Lay (getvar "CTAB"))
(setq spLay (cons 410 Lay))
(setq spis_Lay (list '( 0 . "VIEWPORT") spLay '(68 . 2)))
(setq nameset (ssget "X"  spis_Lay))
(setq nameVP (ssname nameset 0))
(setq msht (acet-ms-to-ps 1 nameVP))
(setq msht_str (strcat (rtos msht) "XP"))
(command "_.mspace")
(setq p1 (reverse(cdr(reverse(getpoint "pick")))))
(setq p2 (reverse(cdr(reverse(getpoint "second pick")))))
(setq dist (distance p1 p2))
(setq ugol (angle p1 p2))
(setq ugol_new (- ugol (/ pi 2.0)))
(setq deltaX (* (cos ugol_new) dist))
(setq deltaY (* (sin ugol_new) dist))
(setq new_X (+ (car p1)  deltaX))
(setq new_Y (+ (cadr p1) deltaY))
(setq p3 (list new_X new_Y))
(setq ptp (trans p1 1 2))
(setq p1p (trans ptp 2 3)) ;pervaya tochka v paperspace
(command "LINE" p1 p3 "")
(setq myline (entlast))
(command "ucs" "_ob" myline)
(entdel myline)
(command "plan" "_c")
(command "zoom" "_s" msht_str)
(setq p1_p (trans p1p 3 2))
(setq p1_New (trans p1_p 2 1))
(command "pan" '(0 0 0) p1_New)
(command "_.pspace")
(setvar "Osmode" snp)
)

Пожалуйста критика. Только не смертельная.

Re: LISP. Поворот рисунка во вьюпорте

Здравствуйте .
Поворот модели во Viewport можно выполнить и проще (без изменения масштаба)"_.dview" с опциями /twist и на запрос вводишь величину угла с + ,или с - ... и все

Re: LISP. Поворот рисунка во вьюпорте

Спасибо. Попробую переделать программки на основе зтой команды.

Re: LISP. Поворот рисунка во вьюпорте

Всё тоже самое. Но на основе dview. Только поворот идёт не вокруг первой точки, а вокруг
центра вьюпорта. Вокруг первой точки пока не получается. А может и не надо.

(defun c:nn( / snp p1 p2 ugol_rad ugol_grd_x)
;;;;;;;;;;;;;;povorot na sever(naverh)
(setq snp (getvar "Osmode"))
(setvar "Osmode" 1536)
(command "_.mspace")
(setq p1 (reverse(cdr(reverse(getpoint "\nKlik point1")))))
(setq p2 (reverse(cdr(reverse(getpoint "\nKlik point2")))))
(setq ugol_rad (angle p1 p2))
(setq ugol_grd_x (* ugol_rad 57.2958))
(setq ugol_grd_y (- 90.0 ugol_grd_x))
(command "dview" "all" "" "TW" ugol_grd_y "")
(setvar "Osmode" snp)
)
(defun c:vv( / snp p1 p2 dist ugol ugol_new
               deltaX deltaY new_X new_Y p3
               ugol_rad ugol_grd_x ugol_grd_y)
;;;;;;;;;povorot na vostok(napravo)
(setq snp (getvar "Osmode"))
(setvar "Osmode" 1536)
(command "_.mspace")
(setq p1 (reverse(cdr(reverse(getpoint "\nKlik point1")))))
(setq p2 (reverse(cdr(reverse(getpoint "\nKlik point2")))))
(setq dist (distance p1 p2))
(setq ugol (angle p1 p2))
(setq ugol_new (+ ugol (/ pi 2.0)))
(setq deltaX (* (cos ugol_new) dist))
(setq deltaY (* (sin ugol_new) dist))
(setq new_X (+ (car p1)  deltaX))
(setq new_Y (+ (cadr p1) deltaY))
(setq p3 (list new_X new_Y))
(setq ugol_rad (angle p1 p3))
(setq ugol_grd_x (* ugol_rad 57.2958))
(setq ugol_grd_y (- 90.0 ugol_grd_x))
(command "dview" "all" "" "TW" ugol_grd_y "")
(setvar "Osmode" snp)
)

Re: LISP. Поворот рисунка во вьюпорте

Вариант макроса. "planview1.bmp" - имя моей иконки. Сделайте свою, кому надо. Принцип: используются две команды: задать новую ПСК поворотом вокруг оси Z, показать вид в плане, вернуть предыдущую ПСК.
[_Button("Поворот в окне", "planview1.bmp", "planview1.bmp")]^C^C(setq vcentrsib (getvar "VIEWCTR") vsizesib (getvar "VIEWSIZE")) _UCS _Z \\_PLAN _cur _UCS _P _zoom _c !vcentrsib !vsizesib

Re: LISP. Поворот рисунка во вьюпорте

Можно просто вводить в ком строку mvsetup и все поворачивать с минусом или с плюсом)))

Re: LISP. Поворот рисунка во вьюпорте

> Velik
Про alignspace можно тоже самое сказать mvsetup+zoom