В чем разница между описанием блока и его вхождением?
Частенько начинающие программисты путают понятия "описания" и "вхождения". В чем же разница?
Как ни парадоксально, принципиальная. Когда мы создаем блок - мы создаем описание блока (определяем, что в него входит) - BlockDefinition. Когда мы вставляем блок - мы определяем вхождение блока - BlockReference.
Описание блока с каким-то определенным именем в чертеже может быть одно и только одно. Вхождений может быть сколько угодно.
В описании блока есть определения атрибутов (и у атрибутов можно определить тэг, приглашение, значение по умолчанию, свойства (скрытый / постоянный и т.п.) и многие другие параметры). Во вхождении блока есть вхождения атрибутов - и тут ни тэг, ни значение по умолчанию, ни свойства скрытости / постоянности не отредактировать.
В описании блока нет таких элементов, как "точка вставки блока" (прошу не путать с определенным динамическим параметром!), масштабы по осям, поворот, система координат, слой (для всего блока), цвет (для всего блока) и т.п. Создать вхождение блока без этого невозможно.
Если по условиям задачи надо вычленить значение текстовой строки из атрибута, мы обращаемся ко вхождению блока.
Надо сказать, что "все элементы, из которых состоит такой-то блок, должны получить красный цвет", мы обращаемся к описанию блока.
Обращение ко вхождению блока выполняется так же, как и к любому примитиву чертежа: (car (entsel)), элемент набора и т.п. И у этого примитива мы можем получить и изменить и точку вставки, и масштабы, и слой, и цвет, и (при условии, что блок динамический) - текущие значения динамических параметров, и с атрибутами поработать (если они, конечно, есть). У вхождения (начиная с версии AutoCAD2006) есть понятие имени и эффективного (реального для дин.блоков) имени, которые изменить нельзя.
Описание блока лежит в неграфической области файла, в таблице "BLOCKS" (для ename-вариантов поиска). Также указание на описание блока можно получить через коллекцию Blocks документа (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "И здесь имя блока"). У описания блока свойства эффективного имени нет. Зато есть свойство имени, которое легко поддается программному изменению.
я правильно понимаю, что если например стоит задача изменить скажем "слой" входящих в блоки штриховок,
то необходимо:
1ое - изменить слой штриховок во всех BlockDefinition базы данных чертежа
2ое - изменить слой штриховок во всех BlockReference
???
1ое - на случай вставки этого блока в последующем
2ое - поскольку внесение изменений в BlockDefinition не отражается в уже существующих BlockReference
это всё так? а то я не уверен в своих представлениях...
Не совсем. BlockReference сам поменяет слой штриховок. В этом и смысл блоков - меняем в одном месте, остальное подхватывается автоматом.