Назначение текстовых стилей
Столкнулся я тут с задачкой "назначить текстовым примитивам определенный стиль". Казалось бы, ничто не предвещало беды...
Ну что там может быть такого страшного? Отфильтровать внешние ссылки, разблокировать и разморозить слои, пройтись по всем примитивам и для текстовых назначить стиль стандартным vla-put-textstyle...
Ан нет, на некоторых файлах такой подход приводил к ошибке. При этом очистка файла, его проверка, открытие в разных версиях AutoCAD никакого эффекта не давали.
Начал разбираться, и выяснилось, что ошибку генерирует та самая vla-put-textstyle. Дамп объекта через ActiveX показывал "все хорошо, все замечательно". Но вот ename-представление (ох, как же иногда пригождается статья О пользе ename-представлений!) показало, что в обычном TEXT-примитиве отсутствует группа 7, как раз и отвечающая за стиль (ну, понятно, стиль Standard и все такое...)! Используем немного переделанный старый код из ruCad'a (подробно описана в )
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 47 48 49 50 51 52 53 54 | (defun _lispru-ent-modify-autoregen (ent bit value ext_regen / ent_list old_dxf new_dxf layer_dxf70) ;| * Функция модификации указанного бита примитива * Параметры вызова: * entity - примитив, полученный через (entsel), (entlast) etc * bit - dxf-код, значение которого надо установить * value - новое значение * regen - выполнять или нет регенерацию примитива сразу. t/ nil * Примеры вызова: (_lispru-ent-modify-autoregen (entlast) 8 "0" t) ; перенести последний примитив на слой 0 (_lispru-ent-modify-autoregen (entsel) 62 10 nil) ; установить выбранному примитиву цвет 10 * Возвращаемое значение: * примитив с модифицированным dxf-списком. Примитив перерисовывается в * зависимости от значения ключа ext_regen |; (if (not (and (or (= (strcase (cdr (assoc 0 (entget ent))) nil) "STYLE") (= (strcase (cdr (assoc 0 (entget ent))) nil) "DIMSTYLE") (= (strcase (cdr (assoc 0 (entget ent))) nil) "LAYER") ) ;_ end of or (= bit 100) ) ;_ end of and ) ;_ end of not (progn (setq ent_list (entget ent) new_dxf (cons bit (if (and (= bit 62) (= (type value) 'str)) (if (= (strcase value) "BYLAYER") 256 0 ) ;_ end of if value ) ;_ end of if ) ;_ end of cons ) ;_ end of setq (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list)))) (progn (entmod (if old_dxf (subst new_dxf old_dxf ent_list) (append ent_list (list new_dxf)) ) ;_ end of if ) ;_ end of entmod (if ent_regen (entupd ent) (redraw ent) ) ;_ end of if ) ;_ end of progn ) ;_ end of if ) ;_ end of progn ) ;_ end of if ent ) ;_ end of defun |
И обрабатываем примитивы. Вот так...