Программное удаление поля

Понадобилось сегодня снести поле из атрибута. Казалось бы - чего проще? Колоти через тот же vla-put-textstring, в чем проблема?

Проблема в том, что если в новых данных есть часть строки, полностью повторяющая значение поля на момент выполнения, то поле не уничтожается. Проблема обнаружена в ACAD2020x64.

Проверить несложно: создаем 2 текста, в одном из них - текст, к примеру "1", во втором - просто поле со ссылкой на первый текст.

Потом

1
2
(setq text (vlax-ename->vla-object (car (entsel)))) ; выбираем второй текст
(vla-put-textstring text "01234")

Если FIELDEVAL равна 31, просто выполняем регенерацию и удивляемся результату.

На самом деле снести поле не так уж и сложно. Данные о полях хранятся в расширенном словаре на примитиве, в записи с именем ACAD_FIELD. Так что код становится очень простым:

1
2
3
4
5
6
7
8
(setq att (vlax-ename->vla-object (car (nentsel)))) ;; выбираем атрибут
(if (equal (vla-get-hasextensiondictionary att) :vlax-true) ; проверка наличия словаря
  (progn (setq dict (vla-getextensiondictionary att))
         (vla-remove dict "ACAD_FIELD") ; удаление записи ACAD_FIELD
         (vl-catch-all-apply (function (lambda () (vla-delete dict)))) ; пробуем вообще удалить словарь
  ) ;_ end of progn
) ;_ end of if
(vla-put-textstring att "Новое значение")

Словарь можно и не удалять, это не сильно критично. Главное - удалить запись.

P.S. Код не сработает, если примитив находится на заблокированном или замороженном слое.

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



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


Я не робот.