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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно повернуть выбранные блоки к указанной точке?

Как программно повернуть выбранные блоки к указанной точке?

Ответ
Поиск в этой теме
Непрочитано 03.03.2009, 16:55 #1
Как программно повернуть выбранные блоки к указанной точке?
zamtmn
 
КИПиА
 
Tyumen
Регистрация: 21.03.2005
Сообщений: 1,352

Стоит задача - в чертеже куча блоков с атрибутами, нужно их (блоки с атрибутами) повернуть так чтобы ось У координатной системы блока смотрела на указанную пользователем точку. т.е. выбираем блоки, тыкаем точку, каждый блок поворачивается с учетом своего местоположения относительно точки.
Очень нужен такой лисп, сам в лиспе - . буду благодарен за любую помошь

Последний раз редактировалось zamtmn, 03.03.2009 в 23:58.
Просмотров: 4511
 
Непрочитано 03.03.2009, 22:49
#2
Кулик Алексей aka kpblc
Moderator

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


Как вариант:
Код:
[Выделить все]
(defun c:rotate-blocks (/ adoc rot)
  (vl-load-com)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type (setq rot (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (cond
                                      ((getangle "\nУкажите угол поворота очси Y для блоков <90.>: "))
                                      (t (/ pi 2.))
                                      ) ;_ end of cond
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'real
              ) ;_ end of =
           (setq rot (- rot (/ pi 2.)))
           (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (ssget "_:L" '((0 . "INSERT")))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           ) ;_ end of and
    (foreach ent (mapcar (function vlax-ename->vla-object)
                         ((lambda (/ tab item)
                            (repeat (setq tab  nil
                                          item (sslength selset)
                                          ) ;_ end setq
                              (setq tab (cons (ssname selset (setq item (1- item))) tab))
                              ) ;_ end of repeat
                            tab
                            ) ;_ end of lambda
                          )
                         ) ;_ end of mapcar
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-put-rotation ent rot)
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2009, 23:01
#3
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Спасибо, но не совсем то, у Вас все блоки поворачиваются на одинаковый угол. а надо угол расчитать для каждого блока отдельно: 90-(угол между xwcs и вектором(точка вставки блока, точка указанная пользователем))
zamtmn вне форума  
 
Непрочитано 03.03.2009, 23:10
#4
Кулик Алексей aka kpblc
Moderator

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


Кстати, пока не забыл - название темы лучше поменять на более информативное.
Код:
[Выделить все]
(defun c:rotate-blocks (/ adoc pt)
  (vl-load-com)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type (setq pt (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (getpoint "\nУкажите точку <Отмена> : ")
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (ssget "_:L" '((0 . "INSERT")))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           ) ;_ end of and
    (foreach ent (mapcar (function vlax-ename->vla-object)
                         ((lambda (/ tab item)
                            (repeat (setq tab  nil
                                          item (sslength selset)
                                          ) ;_ end setq
                              (setq tab (cons (ssname selset (setq item (1- item))) tab))
                              ) ;_ end of repeat
                            tab
                            ) ;_ end of lambda
                          )
                         ) ;_ end of mapcar
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-put-rotation
              ent
              (+ (angle pt (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint ent)))) (/ pi 2.))
              ) ;_ end of vla-put-rotation
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
---
Добавлено: гарантированно работает только для WCS. Для немировой системы не гонял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2009, 23:17
#5
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Оно самое. спасибо
Информативней название не могу придумать.
zamtmn вне форума  
 
Непрочитано 03.03.2009, 23:27
#6
Кулик Алексей aka kpblc
Moderator

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


Один из вариантов (у меня тоже фантазия не безграничная):
"Как программно повернуть выбранные блоки к указанной точке?"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2009, 23:57
#7
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


хозяин - барин
zamtmn вне форума  
 
Непрочитано 16.01.2020, 10:56
#8
IL-14


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


Добрый день!
Подскажите, плз, что нужно изменить в тексте программы, чтобы на указанную пользователем точку смотрела не ось У координатной системы блока, а ось Х?
IL-14 вне форума  
 
Непрочитано 16.01.2020, 11:27
1 | 1 #9
Кулик Алексей aka kpblc
Moderator

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


Убрать добавление угла в 90 градусов, наверное.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.01.2020, 11:34
#10
IL-14


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


Логично, спасибо. )

Последний раз редактировалось IL-14, 20.01.2020 в 10:33.
IL-14 вне форума  
 
Непрочитано 20.01.2020, 10:33
#11
IL-14


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


А можно изменить этот лисп так, чтобы он находил примитив (линия или полилиния в блоках) максимальной длины, определял угол между этим примитивом и осью Х и разворачивал блоки параллельно оси Х, или это долго (сложно)?
IL-14 вне форума  
 
Непрочитано 20.01.2020, 12:20
| 1 #12
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от IL-14 Посмотреть сообщение
А можно изменить этот лисп так, чтобы он находил примитив (линия или полилиния в блоках) максимальной длины, определял угол между этим примитивом и осью Х и разворачивал блоки параллельно оси Х, или это долго (сложно)?
Без примера чертежа - очень сложно понять, чего Вы хотите
kp+ вне форума  
 
Непрочитано 20.01.2020, 12:34
#13
IL-14


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


Суть в том, что есть сотни блоков (панелей), имеющих длинную сторону, повернутую относительно оси х. Система координат блока не совпадает с этой длинной стороной (иначе можно было бы решить вопрос имеющимся лиспом). Нужно расположить длинные стороны блоков вдоль оси Х. Я так понимаю, программно можно вычислять угол между самой длинной линией (полилинией) в блоке и осью Х, затем поворачивать блок на этот угол. Либо располагать систему координат в блоке вдоль самого длинного примитива.
Вложения
Тип файла: dwg
DWG 2013
2020-01-01_OF_VP_КМД_E.dwg (5.58 Мб, 6 просмотров)

Последний раз редактировалось IL-14, 21.01.2020 в 01:16.
IL-14 вне форума  
 
Непрочитано 21.01.2020, 15:21
1 | #14
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Ловите код и пример результата работы. Для наглядности оставлены копии блоков в исходном положении, зеленым показаны линии, которые признаны самыми длинными. Определять длину хитрозакрученных полилиний в данных блоках бесполезно.
Вызов прежний - rotate-blocks, первая функция the_longest_line_angle - вспомогательная.
Код:
[Выделить все]
 (defun the_longest_line_angle (ent /
			       clone DROVA LINES THE_LONGEST_LINE THE_LONGEST_LINE_ANGLE_
			      )
  (setq lines nil)
  (setq clone (vla-copy ent));;;;;;;;;;!!!!!!!1
  ;(setq clone ent);;;;;;;;;;;@@@@@@@@@
  (setq drova (vlax-safearray->list
              (vlax-variant-value
                (vla-explode clone)))
  );дрова от подорваного блока
  (foreach poleno drova
    (if (= (vla-get-objectname poleno) "AcDbLine")
      (setq lines (append lines (list poleno)))
    )
  )
  (setq the_longest_line (car (vl-sort lines (function (lambda (e1 e2) (> (vla-get-Length e1) (vla-get-Length e2)))))))
  (setq the_longest_line_angle_ (vla-get-angle the_longest_line))
  (vla-put-color the_longest_line acgreen)
  (setq drova (vl-remove the_longest_line drova));;;;;;;;;!!!!!!!!!!!!
  (foreach poleno drova
    (vla-delete poleno);удаление очередного "полена"
    (vlax-release-object poleno);очистка места, занятого "поленом"
  )
  the_longest_line_angle_
)  


(defun c:rotate-blocks (/ adoc pt DELTA ENT SELSET)
  (vl-load-com)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and    T
;;;	      (= (type (setq pt (vl-catch-all-apply
;;;                               (function
;;;                                 (lambda ()
;;;                                   (getpoint "\nУкажите точку <Отмена> : ")
;;;                                   ) ;_ end of lambda
;;;                                 ) ;_ end of function
;;;                               ) ;_ end of vl-catch-all-apply
;;;                          ) ;_ end of setq
;;;                    ) ;_ end of type
;;;              'list
;;;              ) ;_ end of =
           (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (ssget "_:L" '((0 . "INSERT")))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           ) ;_ end of and
    (foreach ent
	     (mapcar (function vlax-ename->vla-object)
                         ((lambda (/ tab item)
                            (repeat (setq tab  nil
                                          item (sslength selset)
                                          ) ;_ end setq
                              (setq tab (cons (ssname selset (setq item (1- item))) tab))
                              ) ;_ end of repeat
                            tab
                            ) ;_ end of lambda
                          )
                         ) ;_ end of mapcar
      (setq delta (the_longest_line_angle ent))
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-put-rotation
              ent
              (- (vla-get-rotation ent) delta)
              ) ;_ end of vla-put-rotation
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
PS IL-14, вот все равно не понимаю, зачем это понадобилось. Или надо было совсем не так? Вы просто не привели пример того, что должно получиться.
Offtop: PPS Это неловкое ощущение, когда прикручиваю свои добавки к творениям мастеров...
Вложения
Тип файла: dwg
DWG 2010
2020-01-01_OF_VP_КМД_E+.dwg (6.37 Мб, 6 просмотров)
kp+ вне форума  
 
Непрочитано 21.01.2020, 15:52
#15
IL-14


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


Цитата:
Сообщение от kp+ Посмотреть сообщение

PS IL-14, вот все равно не понимаю, зачем это понадобилось. Или надо было совсем не так? Вы просто не привели пример того, что должно получиться.
Offtop: PPS Это неловкое ощущение, когда прикручиваю свои добавки к творениям мастеров...
Огромное спасибо! Суть в том, что в акад блоки попадают из Ревита экспортом. Их около 4000. Их нужно определенным образом обработать и передать в Италию станочникам, которые отказываются делать обработку файлов сами. Горизонтальное положение панелей - одно из их требований. Без автоматизации эти файлы можно год обрабатывать. Еще раз спасибо!
IL-14 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно повернуть выбранные блоки к указанной точке?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Группы или блоки? Mikhail AutoCAD 89 07.10.2016 14:20
Чертеж превратился в точку Vadim2268 AutoCAD 20 28.08.2008 11:21
Pline через выбранные блоки gabrin Программирование 3 04.08.2008 22:25
шаблоны.. блоки.. программы.. kolobrod Программирование 9 29.01.2007 11:15
Как пронумеровать блоки Neznayka AutoCAD 2 20.05.2006 12:41