Вращение множества объектов вокруг локальных центров.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вращение множества объектов вокруг локальных центров.

Вращение множества объектов вокруг локальных центров.

Ответ
Поиск в этой теме
Непрочитано 05.12.2005, 11:26 #1
Вращение множества объектов вокруг локальных центров.
B2Slow
 
Иркутск
Регистрация: 20.06.2005
Сообщений: 57

Ни в поиске ни в хелпе не нашел способ повернуть одновременно несколько выделенных объектов вокруг своих центров массы. Мож у кого лиспик завалялся или ссылка.
Спасибо.
Просмотров: 9377
 
Непрочитано 05.12.2005, 11:30
#2
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,342


Можно сделать блок с точкой вставки в центре вращения и в свойствам задать угол поворота
asys вне форума  
 
Автор темы   Непрочитано 05.12.2005, 11:34
#3
B2Slow


 
Регистрация: 20.06.2005
Иркутск
Сообщений: 57


Цитата:
Сообщение от Asys
Можно сделать блок с точкой вставки в центре вращения и в свойствам задать угол поворота
А как можно выделив 100 объектов получить 100 блоков?
Или предлагаете создать их по отдельности?)) Так это то же самое, что поворачивать вручную..
B2Slow вне форума  
 
Непрочитано 05.12.2005, 11:46
#4
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,342


Цитата:
А как можно выделив 100 объектов получить 100 блоков?
Согласен, не пойдет
asys вне форума  
 
Непрочитано 05.12.2005, 11:57
#5
ZDN


 
Регистрация: 12.03.2005
Сообщений: 29


Как вариант команда toolpack->object->modify->Rotate@Bounding Center.
Toolpack выложен на этом сате.
ZDN вне форума  
 
Непрочитано 05.12.2005, 11:59
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Поскольку прозвучало "центр масс", подозреваю, что надо проворачивать над регионами или солидами. А тогда можно и таким манером (говорю сразу, все по-топорному, т.к. с методом vla-rotate что-то не получилось с наскоку - точку variant и safearray сводят с ума):
Код:
[Выделить все]
(defun c:mrotate_center	(/ selset item rot_angle adoc)
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	selset	  (ssget)
	rot_angle (getreal "\nУкажите угол поворота <0.0> : ")
	) ;_ end of setq
  (if (not rot_angle)
    (setq rot_angle 0)
    ) ;_ end of if
  (vla-startundomark adoc)
  (while (and selset
	      (> (sslength selset) 0)
	      ) ;_ end of and
    (setq item (ssname selset 0))
    (ssdel item selset)
    (setq item (vlax-ename->vla-object item))
    (if	(vlax-property-available-p item 'centroid)
      (vl-cmdf "_.rotate"
	       (vlax-vla-object->ename item)
	       ""
	       (vlax-safearray->list (vlax-variant-value (vla-get-centroid item)))
	       rot_angle
	       ) ;_ end of vl-cmdf
      ) ;_ end of if
    ) ;_ end of while
  (vla-endundomark adoc)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.12.2005, 12:11
#7
B2Slow


 
Регистрация: 20.06.2005
Иркутск
Сообщений: 57


Цитата:
Сообщение от ZDN
Как вариант команда toolpack->object->modify->Rotate@Bounding Center.
Toolpack выложен на этом сате.
К сож на работе загрузка файлов запрещена, а домой еще не скоро..
kpblc, эту операцию нужно проворачивать в основном над прямоугольниками из полилиний.
B2Slow вне форума  
 
Непрочитано 05.12.2005, 12:32
1 | #8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Дык ить, ета... Предупреждать надо. Что придется работать над фактически описанным прямоугольником. Тогда попробуй такое:
Код:
[Выделить все]
(defun c:mrotate_center	(/ selset item rot_angle adoc min_point max_point)
  (defun loc:mid-2-point (minp maxp)
    (setq minp (vlax-safearray->list minp)
	  maxp (vlax-safearray->list maxp)
	  ) ;_ end of setq
    (list (/ (+ (car maxp) (car minp)) 2)
	  (/ (+ (cadr maxp) (cadr minp)) 2)
	  (/ (+ (caddr maxp) (caddr minp)) 2)
	  ) ;_ end of list
    ) ;_ end of defun
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	selset	  (ssget)
	rot_angle (getreal "\nУкажите угол поворота <0.0> : ")
	) ;_ end of setq
  (if (not rot_angle)
    (setq rot_angle 0)
    ) ;_ end of if
  (vla-startundomark adoc)
  (while (and selset
	      (> (sslength selset) 0)
	      ) ;_ end of and
    (setq item (ssname selset 0))
    (ssdel item selset)
    (setq item (vlax-ename->vla-object item))
    (vla-getboundingbox item 'min_point 'max_point)
    (vl-cmdf "_.rotate"
	     (vlax-vla-object->ename item)
	     ""
	     (loc:mid-2-point min_point max_point)
	     rot_angle
	     ) ;_ end of vl-cmdf
    ) ;_ end of while
  (vla-endundomark adoc)
  ) ;_ end of defun
Предупреждаю сразу - производится именно поворот относительно текущего положения на указанный угол! Если оставить 0, то ничего не поменяется!
---
Добавлено:
Вот этот вариант может быть немного побыстрее - нет одного лишнего преобразования:
Код:
[Выделить все]
(defun c:mrotate_center2 (/ selset item rot_angle adoc min_point max_point)
  (defun loc:mid-2-point (minp maxp)
    (setq minp (vlax-safearray->list minp)
	  maxp (vlax-safearray->list maxp)
	  ) ;_ end of setq
    (list (/ (+ (car maxp) (car minp)) 2)
	  (/ (+ (cadr maxp) (cadr minp)) 2)
	  (/ (+ (caddr maxp) (caddr minp)) 2)
	  ) ;_ end of list
    ) ;_ end of defun
  (setq	adoc	  (vla-get-activedocument (vlax-get-acad-object))
	selset	  (ssget)
	rot_angle (getreal "\nУкажите угол поворота <0.0> : ")
	) ;_ end of setq
  (if (not rot_angle)
    (setq rot_angle 0)
    ) ;_ end of if
  (vla-startundomark adoc)
  (while (and selset
	      (> (sslength selset) 0)
	      ) ;_ end of and
    (setq item (ssname selset 0))
    (ssdel item selset)
    (vla-getboundingbox (vlax-ename->vla-object item) 'min_point 'max_point)
    (vl-cmdf "_.rotate"
	     item
	     ""
	     (loc:mid-2-point min_point max_point)
	     rot_angle
	     ) ;_ end of vl-cmdf
    ) ;_ end of while
  (vla-endundomark adoc)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.12.2005, 12:49
#9
B2Slow


 
Регистрация: 20.06.2005
Иркутск
Сообщений: 57


kpblc, то что нужно... спасибо большое!
B2Slow вне форума  
 
Непрочитано 05.12.2005, 22:28
#10
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


эх , kpblc, kpblc, прошше надо быть - зря я, что-ли вам умные книжки высылал?
Код:
[Выделить все]
(defun c:mrotate_center2 (/ ass ra rp) 
  (ssget)
  (setq ass (vla-get-ActiveSelectionset (vla-get-activedocument (vlax-get-acad-object)))
	ra (getreal "\nУкажите угол поворота <0.0> : "));setq 
  (if (not ra) (setq ra 0)) 
  (vla-startundomark adoc)
  (vlax-for ent ass
    (vla-getboundingbox ent 'mn 'mx)
    (setq rp (vlax-3d-point (mapcar '(lambda (x y) (/ (+ x y) 2)) (vlax-safearray->list mn)
				    (vlax-safearray->list mx))))
    (vla-rotate ent rp (* (/ ra 180) pi)));vlax-for
 (vla-endundomark adoc)
);end
Лентяй вне форума  
 
Непрочитано 06.12.2005, 08:02
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Хныкая и утирая крокодиловы слезки:
Эх, Лентяй, Лентяй... Прошше не почучацца
В общем, тут дело такое. У меня с ActiveSelectionSet отношения что-то не сложились - железяка (2005) упрямо при попытке (sssetfirst) обратиться к ActiveSelectionSet показывала предыдущий выбор, пока новый объект не выделен. Т.е. у меня получилось так, что ActiveSelectionSet есть не активный выбор, а последний. Т.е. фактически надо проверять на наличие ActiveSelectionSet, очищать его и потом запрашивать новый. Головняк, и я пошел старым проверенным путем.
А lamdba-функции у меня качественными не получаются. Наверное (да не наверное, а точно!), мозгов не хватат.
И (в голос) - ну один меня, один! Если меня много, я теряюсь среди себя!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.12.2005, 08:43
#12
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
В общем, тут дело такое. У меня с ActiveSelectionSet отношения что-то не сложились
Вы мине, канешна, звиняйте, дядьку, но ActiveSelectionSet - это не теща, чтобы с ним складывать отношения. Это просто ass (надеюсь, вы знаете что значит "ass" по-английски), и обходиться с ним следует соответственно. :twisted:
Цитата:
Т.е. у меня получилось так, что ActiveSelectionSet есть не активный выбор, а последний.
Вот тут - непонятка. Каким же должени быть этот набор по вашему? По-моему, и это подтверждается практикой, коя, как всех нас в детстве учили, есть критерий истины, - он именно последний, ибо в него входят элементы, выбранные последними. А иначе, какой же он тогда активный :?:
Цитата:
Т.е. фактически надо проверять на наличие ActiveSelectionSet, .
ASS пребывает вовеки ! :!: (Согластитесь, что в этом - большой философский смысл). Ибо, где есть ActiveDocument, при нем всегда неотлучно пребывает ActiveSelestionSet, пусть даже и пустой.
Цитата:
...очищать его и потом запрашивать новый
А вот это делать категорически не стоит, ибо бесполезно есть. ASS обновляется каждый раз (и опять - большая жизненная правда :idea: ) сам при новом выборе объектов, будь то ssget, vla-getEntity и т.д. если же вам создать набор объектов, с которыми что-то делать, и при этом приедется выбирать другие объекты, то первыичный набор следует проименовать и добавть в коллекцию SelectioSets, откуда потом посредством vla-item и вытаскивать.
Цитата:
А lamdba-функции у меня качественными не получаются.
Терпение и труд! Вместо того, чтобы поылать кого-нибудь нах, сотворите соответствующую lambda-функцию. :evil: Через некоторое время результаты не замедлят сказаться, и вы будете ими приятно поражены. Успехов!
Лентяй вне форума  
 
Непрочитано 06.12.2005, 09:11
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Дык ить я ж ожидал от ActiveSelectionSet'a аналог поведения (ssget). Ан не вышло. Квалификации-то все ж маловато
По проверке получилось следующее:
Складываем:
Код:
[Выделить все]
(setq ass (vla-get-ActiveSelectionset (vla-get-activedocument (vlax-get-acad-object))))
и
Цитата:
Сообщение от Лентяй
<...> где есть ActiveDocument, при нем всегда неотлучно пребывает ActiveSelestionSet, пусть даже и пустой<...>
Вот-вот. А если он не пустой, то ass вернет не только переводное слово, но и предыдущий выбор. Т.е. приходится делать нечто типа
Код:
[Выделить все]
(vla-select selset acSelectionSetWindow)
и обращаться уже к нему. Фактически vla-вариант (ssget) imho.
Лентяй, при всем уважении - настоятельная просьба: меня - ОДИН!!! См. подпись
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.12.2005, 02:48
#14
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
kpblc: Дык ить я ж ожидал от ActiveSelectionSet'a аналог поведения (ssget). Ан не вышло. Квалификации-то все ж маловато. По проверке получилось следующее:
Складываем: (setq ass (vla-get-ActiveSelectionset (vla-get-activedocument (vlax-get-acad-object))))
и Лентяй : <...> где есть ActiveDocument, при нем всегда неотлучно пребывает ActiveSelestionSet, пусть даже и пустой<...>
Вот-вот. А если он не пустой, то ass вернет не только переводное слово, но и предыдущий выбор.
Ни хрена не понял! У меня обращение к АС всегда возвращает то, что было в ssget, конвертированное в object-ы, и иначе никогда не было.
Но не надо отчаиваться. Я тут немножко поизвращался и наваял верчение не только вокруг центров, но и вокуг точки относительно мин. угла. Наслаждайтесь!
Код:
[Выделить все]
(defun c:MRot (/ ass ra rp pn pt dst pts om) 
  (ssget) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
	   ass (vla-get-ActiveSelectionset adoc)
	   om (getvar "OSMODE"));setq
  (initget "Point Center")
  (setq kw (getkword "\nSelect Rotation Mode: [Point/Center] <Center>"))
  (if (null kw) (setq kw "Center"))
  (if (= kw "Point")
    (progn (setq obj (vla-item ass 0))
      (vla-highlight obj :vlax-true)
      (vla-getboundingbox obj 'pn 'px)
      (setq pn (vlax-safearray->list pn) 
	       pt (getpoint pt "\nEnter Rotation Point: ")
	       dst (distance pn pt) ang (angle pn pt))
      (vla-update obj));if
  (setq ra (getreal "\nEnter Rotation Angle <0.0> : "))		       
  (if (not ra) (setq ra 0))
  (vla-startundomark adoc) 
  (vlax-for ent ass 
    (vla-getboundingbox ent 'mn 'mx)
    (setq pts (mapcar 'vlax-safearray->list (list mn mx))
	     rp (vlax-3d-point (if (= kw "Point") (polar (car pts) ang dst)
			      (mapcar '(lambda (x y) (/ (+ x y) 2)) (car pts) (cadr pts)))));setq
    (vla-rotate ent rp (* (/ ra 180) pi)));vlax-for
  (setvar "OSMODE" om)
  (vla-endundomark adoc) 
);end
Лентяй вне форума  
 
Автор темы   Непрочитано 07.12.2005, 08:20
#15
B2Slow


 
Регистрация: 20.06.2005
Иркутск
Сообщений: 57


Лентяй, а почему оно не загружается?:

Command: _appload MROT.lsp successfully loaded.
Command: ; error: malformed list on input

и что означает "вокуг точки относительно мин. угла"

И еще, не хотел флеймить дополнительным топиком..
"Что лучше?" VBA или Lisp? Что может позволить бейсик и не может позволить лисп и наоборот, при одинаковых трудозатратах?
Прошу прощения за полуриторический вопрос, но если есть, что сказать, то извольте..
B2Slow вне форума  
 
Непрочитано 07.12.2005, 09:05
#16
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Почему. почему... Скобочку пропустил Мгого вас тут - на всех скобочек не напасешься... Вот, добавил
Код:
[Выделить все]
(defun c:MRot (/ ass ra rp pn pt dst pts om) 
  (ssget) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)) 
      ass (vla-get-ActiveSelectionset adoc) 
      om (getvar "OSMODE"));setq 
  (initget "Point Center") 
  (setq kw (getkword "\nSelect Rotation Mode: [Point/Center]: <Center>")) 
  (if (null kw) (setq kw "Center")) 
  (if (= kw "Point") 
    (progn (setq obj (vla-item ass 0)) 
      (vla-highlight obj :vlax-true) 
      (vla-getboundingbox obj 'pn 'px) 
      (setq pn (vlax-safearray->list pn) 
          pt (getpoint pt "\nEnter Rotation Point: ") 
          dst (distance pn pt) ang (angle pn pt)) 
      (vla-update obj)));if
  (setq ra (getreal "\nEnter Rotation Angle <0.0> : "))              
  (if (not ra) (setq ra 0)) 
  (vla-startundomark adoc) 
  (vlax-for ent ass 
    (vla-getboundingbox ent 'mn 'mx) 
    (setq pts (mapcar 'vlax-safearray->list (list mn mx)) 
        rp (vlax-3d-point (if (= kw "Point") (polar (car pts) ang dst) 
               (mapcar '(lambda (x y) (/ (+ x y) 2)) (car pts) (cadr pts)))));setq 
    (vla-rotate ent rp (* (/ ra 180) pi)));vlax-for 
  (setvar "OSMODE" om) 
  (vla-endundomark adoc) 
);end
Цитата:
и что означает "вокуг точки относительно мин. угла"
Имеется ввиду, что точка поворота задается относительно угла прямоугольника. имеющего минимальные координаты - левого нижнего то есть. Запустишь прогу - увидишь.
Цитата:
Что может позволить бейсик и не может позволить лисп и наоборот, при одинаковых трудозатратах?
Я в VBA не силенб больше по ActiveX. Эта штука помощнее и, в общем-то, поудобнее AutoLISP'a, хотя есть несколько финтов. которые в AutoLISP'е делать легче. Хорошо то, что они прекрасно сочетаются друг с другом.
Лентяй вне форума  
 
Непрочитано 07.12.2005, 09:28
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Категорически не согласен насчет "сочетаются". Для ради интересу можно попробовать передать вычисленные значения из лиспа в VBA и наоборот. Геморрой тот еще. Приходится использовать либо setenv / getenv, либо ini-файлы.
Если lisp позволяет не только ActiveX работать с примитивами, то VBA - только объектная модель. Да, многие вещи лучше, проще и дешевле делать ActiveX / VBA, но некоторые моменты лично мне проще сделать через entmake / entmakex.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.12.2005, 09:43
#18
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


За что люблю, так это за категоричность несогласия вплоть до пренебрежения смыслом того, с чем не соглашаешься. Тебе, kpblc, русским по белому нарписли:
Цитата:
"...больше по ActiveX. Эта штука помощнее и, в общем-то, поудобнее AutoLISP'a..."
Так в чем несогласие-то?
Лентяй вне форума  
 
Непрочитано 07.12.2005, 09:56
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


сорри, значит, понял неправильно. Подумал, что фраза "Они прекрасно сочетаются друг с другом" относится на связку VBA <-> LISP.
Бывает, особенно с утра пораньше.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.12.2005, 10:00
#20
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
kpblc: Бывает, особенно с утра пораньше.
Понятно! Рабочий день, значица, начинаем с просмотра форумов :twisted: :?:
Лентяй вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вращение множества объектов вокруг локальных центров.