Учтите, что определение блока по сути является «планом» для блока, а каждая ссылка на блок - это экземпляр, отображающий объекты, найденные в определении блока, в заданном c положении, масштабе, повороте и ориентации на чертеже. .
Атрибуты также имеют Атрибут Определения внутри блока Определение и соответствующие Атрибут Ссылки прикреплен к каждому блоку Ссылка . Такие ссылки на атрибуты могут затем содержать различное текстовое содержимое для каждой ссылки на блок, вставленной в чертеж.
Кроме того, интересно, что ссылки на атрибуты могут также программно присоединяться к ссылке на блок независимо от определения блока, однако это не разрешается при работе AutoCAD с использованием стандартного внешнего интерфейса.
Таким образом, чтобы удалить все атрибуты из чертежа, вам необходимо удалить ссылки на атрибуты, связанные со всеми ссылками на блоки, и определения атрибутов из соответствующих определений блоков.
Вы также можете хотите разблокировать заблокированные слои перед выполнением операции удаления и снова заблокировать ранее заблокированные слои после этой операции.
Поскольку макеты являются просто типом блока, для обработки всех макетов будет достаточно итерации по коллекции блоков, блоки и вложенные блоки (исключая внешние ссылки):
(defun DBXAttDelete ( dwgin dwgout / doc lck )
(if (setq doc (LM:GetDocumentObject dwgin))
(progn
(vlax-for lay (vla-get-layers doc)
(if (= :vlax-true (vla-get-lock lay))
(progn
(setq lck (cons lay lck))
(vla-put-lock lay :vlax-false)
)
)
)
(vlax-for blk (vla-get-blocks doc)
(if (= :vlax-false (vla-get-isxref blk))
(vlax-for obj blk
(cond
( (= "AcDbBlockReference" (vla-get-objectname obj))
(if (= :vlax-true (vla-get-hasattributes obj))
(foreach att (vlax-invoke obj 'getattributes)
(vla-delete att)
)
)
)
( (= "AcDbAttributeDefinition" (vla-get-objectname obj))
(vla-delete obj)
)
)
)
)
)
(foreach lay lck
(vla-put-lock lay :vlax-true)
)
(vla-saveas doc dwgout)
(vlax-release-object doc)
t
)
(prompt (strcat "\nThe drawing \"" dwgin "\" was not found or could not be accessed."))
)
)