Как удалить все атрибуты из всех блоков с AutoLISP, используя ObjectDBX - PullRequest
1 голос
/ 26 февраля 2020

Я хочу удалить все атрибуты блока внутри чертежа, используя метод AutoLISP ObjectDBX.

Следующая программа работает хорошо: она удаляет атрибуты всех блоков внутри чертежа, но когда я редактирую этот блок в блоке Редактор, я вижу, что все атрибуты все еще там.

Я думаю, мне нужно удалить этот атрибут из определения блока.

;[dwgin]--input drawing file
;[dwgout]-- Output drawing fath with name
;function 'LM:GetDocumentObject' lee mac function to open drawing in ObjectDBX method
(defun DBXAttDelete ( dwgin dwgout / doc flg val )
    (if (setq doc (LM:GetDocumentObject dwgin))
        (progn
            (vlax-for lyt (vla-get-layouts doc)
                (vlax-for obj (vla-get-block lyt)
                    (if (and (= "AcDbBlockReference" (vla-get-objectname obj))
                             (= :vlax-true (vla-get-hasattributes obj))
                        )
                        (foreach att (vlax-invoke obj 'getattributes)              

                    (if (vl-catch-all-error-p (setq err (vl-catch-all-apply 'vla-delete (list att))))
                      (princ (strcat "\nERROR: " (vl-catch-all-error-message err)))

                    )
                        )
                    )
                )
            )
           (vla-saveas doc dwgout)
            (vlax-release-object doc)
            flg
        )
        (prompt (strcat "\nThe drawing \"" dwgin "\" was not found or could not be accessed."))
    )
)

Можете ли вы помочь найти, где мне нужно улучшить / исправить эту программу.

1 Ответ

1 голос
/ 28 февраля 2020

Учтите, что определение блока по сути является «планом» для блока, а каждая ссылка на блок - это экземпляр, отображающий объекты, найденные в определении блока, в заданном 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."))
    )
)
...