Программное удаление поля
Понадобилось сегодня снести поле из атрибута. Казалось бы - чего проще? Колоти через тот же 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. Код не сработает, если примитив находится на заблокированном или замороженном слое.