Переименование динамических состояний видимости блоков с использованием VBA - PullRequest
0 голосов
/ 07 ноября 2018

Как изменить или переименовать состояния видимости для динамического блока в AutoCAD с помощью VBA, аналогично нажатию RENAME в диалоговом окне «Состояние видимости», которое появляется при вводе команды BVSTATE в редакторе блоков?

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 ноября 2018

Короче говоря, не можно переименовывать динамические состояния видимости блоков напрямую, используя LISP или VBA API, не прибегая к вызову стандартных команд AutoCAD, например, используя функцию AutoLISP command, или sendcommand метод.

Параметры динамического блока, содержащиеся в определении блока, не предоставляются объектной модели ActiveX и поэтому не могут быть изменены с помощью Visual LISP или VBA.

Такие параметры открыты для Vanilla AutoLISP путем проверки данных DXF, хранящихся в словаре расширений объекта BLOCK_RECORD, но такие данные нельзя изменить с помощью entmod, и при этом они не дают каких-либо значимых свойства после преобразования в эквивалентное представление VLA-объекта.


Что бы это ни стоило, вы можете получить доступ к данным DXF параметра динамического блока, используя следующий маршрут через API AutoLISP:

Сначала получите сущность BLOCK:

(setq bl (tblobjname "block" "YourBlockName"))

Затем получите родительскую BLOCK_RECORD сущность:

(setq br (cdr (assoc 330 (entget bl))))

Теперь получите словарь расширений из группы 360 DXF (в производственном коде должны использоваться дополнительные проверки на наличие "{ACAD_XDICTIONARY" для группы 102 DXF):

(setq d1 (cdr (assoc 360 (entget br))))

Теперь поищите в этом словаре запись ACAD_ENHANCEDBLOCK:

(setq d2 (dictsearch d1 "acad_enhancedblock"))

Это даст данные DXF для объекта ACAD_EVALUATION_GRAPH.

Затем можно выполнить итерацию по группе 360 DXF в данных DXF, чтобы получить данные DXF для каждого параметра динамического блока, найденного в определении блока, например ::101037.

_$ (foreach dxf d2 (if (= 360 (car dxf)) (print (cdr (assoc 0 (entget (cdr dxf)))))))

"BLOCKPOLARPARAMETER" 
"BLOCKPOLARGRIP" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKPOLARSTRETCHACTION" 
"BLOCKFLIPPARAMETER" 
"BLOCKFLIPGRIP" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKFLIPACTION" 
"BLOCKVISIBILITYPARAMETER" 
"BLOCKVISIBILITYGRIP" 
"BLOCKGRIPLOCATIONCOMPONENT" 
"BLOCKGRIPLOCATIONCOMPONENT"
...