Назначение текстовых стилей

Столкнулся я тут с задачкой "назначить текстовым примитивам определенный стиль". Казалось бы, ничто не предвещало беды...

Ну что там может быть такого страшного? Отфильтровать внешние ссылки, разблокировать и разморозить слои, пройтись по всем примитивам и для текстовых назначить стиль стандартным 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

И обрабатываем примитивы. Вот так...

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



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


Я не робот.