Расчленить таблицу или размер
Уж не знаю зачем, но понадобилось на форуме разбить таблицу.
Известно, что у объекта 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 |