Расчленить таблицу или размер

Уж не знаю зачем, но понадобилось на форуме разбить таблицу.

Известно, что у объекта ACAD_TABLE (равно как и у DIMENSION) метода vla-explode не существует. Но это не значит, что нельзя написать свой вариант ;) Чем и займемся.

И у таблицы, и у размера - если посмотреть на ename-представление - есть DXF-группа 2, в которой хранятся строки вида соответственно "*T#* и "*D#*". Фактически это указатели на блоки, внутри которых болтается все описание графической части таблицы.

Поскольку ename-представление просто придется использовать (средствами ActiveX до этих данных не добраться), работа кода в нетекущем документе может вызывать проблемы. Хотя мне уже много раз говорили, что вроде бы все работает нормально - но "пуганая ворона летает дальше и живет дольше". Представленный код для нетекущего документа я бы использовать не стал.

Общая идея проста: получаем указатель на блок таблицы, копируем оттуда все объекты в пространство владельца таблицы, для таблицы переносим в точку вставки (для размера переносить не надо!) и уничтожаем (если попросили) исходник. Правда, тут гарантированно есть три подводных камня: поля, и особенно формулы (таблицы с полями я не проверял и не тестировал, каюсь ;)). Второе - таблицы / размеры внутри внешних ссылок. Третье - примитивы лежат не в мировой системе координат.

Если забить на эти проблемные места, код получается простой до ужаса:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
(vl-load-com)
(defun _kpblc-explode-dim-and-table (ent erase / doc owner def ent_lst ins res_lst)
                                    ;|
*    Попытка разбить таблицу или размер
*    Параметры вызова:
  ent    ; разбиваемый примитив (таблица или размер). Должен лежать на незаблокированном и незамороженном слое.
  erase  ; t -> уничтожать исходный примитив.
*    Возвращает список полученных в результате разбиения примитивов, объединенных в variant
*    Примеры использования:
(_kpblc-explode-dim-and-table (car (entsel "\nSelect table to explode : ")) t)
(_kpblc-explode-dim-and-table (car (entsel "\nSelect table to explode : ")) nil)
|;

  (if (and (setq ent (cond ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                           ((= (type ent) 'vla-object) ent)
                           ) ;_ end of cond
                 ) ;_ end of setq
           (setq doc (vla-get-document ent))
           (setq owner (vla-objectidtoobject doc (vla-get-ownerid ent)))
           (setq def (cdr (assoc 2 (entget (vlax-vla-object->ename ent))))
                 (setq def (vla-item (vla-get-blocks doc) def))
                 ) ;_ end of setq
           ) ;_ end of and
    (progn (vlax-for sub def (setq ent_lst (cons sub ent_lst)))
           (setq ent_lst (vlax-make-variant
                           (vlax-safearray-fill (vlax-make-safearray vlax-vbobject (cons 0 (1- (length ent_lst)))) ent_lst)
                           ) ;_ end of vlax-make-variant
                 ) ;_ end of setq
           (cond ((= (vla-get-objectname ent) "AcDbTable")
                  (setq ins     (vla-get-insertionpoint ent)
                        res_lst (vla-copyobjects doc ent_lst owner)
                        ) ;_ end of setq
                  (foreach ent (vlax-safearray->list (vlax-variant-value res_lst))
                    (vla-move ent (vlax-3d-point '(0. 0. 0.)) ins)
                    ) ;_ end of foreach
                  )
                 ((wcmatch (strcase (vla-get-objectname ent)) "*DIMENSION")
                  (setq res_lst (vla-copyobjects doc ent_lst owner))
                  )
                 ) ;_ end of cond
           (if erase
             (vl-catch-all-apply (function (lambda () (vla-erase ent))))
             ) ;_ end of if
           res_lst
           ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

Размещено в AutoCAD, Autodesk, Код LISP, Новости, Функции LISP · Метки:



Поделитесь своим мнением


Я не робот.