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

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

Как создать несколько блоков в один клик?

Ответ
Поиск в этой теме
Непрочитано 02.10.2011, 18:45 #1
Как создать несколько блоков в один клик?
Cfytrr
 
Балка на балку, кирпич на кирпич...
 
Питер
Регистрация: 09.10.2007
Сообщений: 4,818

Приветствую.
Возможно это уже обсуждалось, но мне решение не удалось найти.
Есть несколько примитивов как используя групповой выбор превратить их в отдельные блоки (имена могут быть любыми, точка вставки: любая точка на примитиве)?
Созданные блоки должны заменить исходные примитивы.
Стандартная методика позволяет создавать блоки только по одному
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.
Просмотров: 2719
 
Непрочитано 02.10.2011, 19:05
#2
Лиспер


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


Ничего не понял. Что, надо сделать так - выделил объекты, нажал кнопку, блок готов? Так можно и макросом обойтись, наверное.
Или надо что-то другое?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 02.10.2011, 19:27
#3
Cfytrr

Балка на балку, кирпич на кирпич...
 
Регистрация: 09.10.2007
Питер
Сообщений: 4,818
Отправить сообщение для Cfytrr с помощью Skype™


Лиспер,
Есть солиды N1, N2, N3 ... Nn, хотелось бы, выделив их рамочкой, получить на их месте Блок N1 , N2, N3 ... Nn. И, было бы совсем замечательно, если имена этих блоков будут содержать некую общую маску и соответствующий порядковый номер.
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.
Cfytrr вне форума  
 
Непрочитано 02.10.2011, 22:36
#4
Лиспер


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


То есть внутри блока один и только один солид, так?
Если да, то в качестве первой прикидки:
Код:
[Выделить все]
 (vl-load-com)

(defun c:conv3d (/ _lispru-get-objectid _lispru-objectidtoobject adoc selset res mask counter name blk_ blk_ref)

  (defun _lispru-get-objectid (obj)
    (vlax-get-property obj
                       (strcat "ObjectID"
                               (if (> (vl-string-search "x64" (getvar "platform")) 0)
                                 "32"
                                 ""
                                 ) ;_ end of if
                               ) ;_ end of strcat
                       ) ;_ end of vlax-get-property
    ) ;_ end of defun

  (defun _lispru-objectidtoobject (doc id)
    (vlax-invoke-method doc
                        (strcat "ObjectIDToObject"
                                (if (> (vl-string-search "x64" (getvar "platform")) 0)
                                  "32"
                                  ""
                                  ) ;_ end of if
                                ) ;_ end of strcat
                        id
                        ) ;_ end of vlax-invoke-method
    ) ;_ end of defun

  (setq mask "dwgru_solid_")
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for blk_def (vla-get-blocks adoc)
    ((lambda (/ tmp)
       (if (wcmatch (strcase
                      (setq name (cond
                                   ((vlax-property-available-p blk_def 'effectivename) (vla-get-effectivename blk_def))
                                   (t (vla-get-name blk_def))
                                   ) ;_ end of cond
                            ) ;_ end of setq
                      ) ;_ end of strcase
                    (strcat (strcase mask) "*")
                    ) ;_ end of wcmatch
         (setq tmp (atoi (substr name (1+ (strlen mask)))))
         ) ;_ end of if
       (setq counter (if counter
                       (max counter tmp)
                       tmp
                       ) ;_ end of if
             ) ;_ end of setq
       ) ;_ end of lambda
     )
    ) ;_ end of vlax-for
  (if (not counter)
    (setq counter 0)
    ) ;_ end of if
  (if (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget "_:l" '((0 . "3dsolid")))
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
    ((lambda (/ pt)
       (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
                         ) ;_ end of lambda
                       )
                      ) ;_ end of mapcar
         (setq pt      (if (vlax-property-available-p ent 'centroid)
                         (vlax-safearray->list (vlax-variant-value (vla-get-centroid ent)))
                         ((lambda (/ minp maxp)
                            (vla-getboundingbox ent 'minp 'maxp)
                            (vlax-safearray->list minp)
                            ) ;_ end of lambda
                          )
                         ) ;_ end of if
               counter (1+ counter)
               blk_    (vla-add (vla-get-blocks adoc)
                                (vlax-3d-point pt)
                                (strcat mask (itoa counter))
                                ) ;_ end of vla-add
               ) ;_ end of setq
         (vla-copyobjects adoc
                          (vlax-make-variant
                            (vlax-safearray-fill
                              (vlax-make-safearray vlax-vbobject '(0 . 0))
                              (list ent)
                              ) ;_ end of vlax-safearray-fill
                            ) ;_ end of vlax-make-variant
                          blk_
                          ) ;_ end of vla-copyobjects
         (vla-insertblock (_lispru-objectidtoobject adoc (vla-get-ownerid ent))
                          (vlax-3d-point pt)
                          (strcat mask (itoa counter))
                          1.
                          1.
                          1.
                          0.
                          ) ;_ end of vla-InsertBlock
         (vla-erase ent)
         ) ;_ end of foreach
       ) ;_ end of lambda
     )
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Код практически не проверял.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 03.10.2011, 07:36
#5
Cfytrr

Балка на балку, кирпич на кирпич...
 
Регистрация: 09.10.2007
Питер
Сообщений: 4,818
Отправить сообщение для Cfytrr с помощью Skype™


Лиспер,
Спасибо, работает!
А можно сделать так что бы код запрашивал маску для имени блоков, и затем использовал ее для наименования остальных блоков в файле?
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.
Cfytrr вне форума  
 
Непрочитано 03.10.2011, 08:28
#6
Лиспер


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


Да, конечно. Замени строку (setq mask <...>) на запрос строки - и все. У меня сейчас шансов нуль сделать это
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 03.10.2011, 09:27
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Cfytrr Посмотреть сообщение
Есть несколько примитивов как используя групповой выбор превратить их в отдельные блоки
Все выбранное в блок. Напомните ЛИСП.
Смотри команды
SETUBnn
SETNBnn
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.10.2011, 20:07
#8
Cfytrr

Балка на балку, кирпич на кирпич...
 
Регистрация: 09.10.2007
Питер
Сообщений: 4,818
Отправить сообщение для Cfytrr с помощью Skype™


Лиспер, VVA, Спасибо.
__________________
...переменная FILEDIA создана для привлечения пользователей к форумам.

Последний раз редактировалось Cfytrr, 03.10.2011 в 21:23.
Cfytrr вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как создать несколько блоков в один клик?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как распечатать несколько файлов за один раз. Lenich AutoCAD 35 27.06.2012 10:53
Текстовой стиль Один или несколько? Vova AutoCAD 44 31.10.2008 10:34
Несколько штриховок в одном своем файле *.pat Pave1 AutoCAD 6 27.08.2008 07:52
Как объеденить несколько файлов PAT в один? Borikv AutoCAD 16 06.08.2008 11:37
Печать (несколько layout за один раз) Малюк AutoCAD 2 25.07.2008 10:38