Как по маске анонимного элемента попытаться определить его тип

В чатах по программированию время от времени спрашивают "можно ли по имени типа анонимного блока определить, что это такое вообще"

В принципе да, можно:
*U - анонимные блоки. Возможен вариант, что это на самом деле динамические блоки с измененным хотя бы одним параметром. Но анонимным блоком от этого он быть не перестает ;)
*D - блоки размеров (да, размер тоже блок!)
*T - блоки таблиц AutoCAD. Можно проверить, выполнив (cdr (assoc 2 (entget (car (entsel))))) и указав на любую таблицу.

Кроме того, есть еще гарантированно "типа анонимное" в dwg: *A - анонимные группы. Вроде бы и записи AcDgnLs к этому имеют какое-то отношение, уже точно не помню.

На всякий случай: анонимные блоки, если у них нет ни одного вхождения, в AutoCAD при закрытии чертежа автоматически уничтожаются. Это 100% работает на *U-блоках. Возможно, будет работать и на *D / *T, но тут не проверял.

Проверяю автоудаление для NC23.1
NC23.1 – ну дома только оно и установлено…

Все проверки буду делать через лисп, поскольку это тупо, просто, и достаточно быстро.

Создаю lsp файл, в котором для начала прописываю команду, которая просто выведет в ком.строку имена всех определений блоков (на тот мусор, который будет выводиться в ком.строку при загрузке lsp, пока что плевать с высокой колокольни):

1
2
3
4
5
6
7
8
9
10
11
12
(vl-load-com)

(defun c:get-all-blocks (/ adoc def_list)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vlax-for def (vla-get-blocks adoc)
    (setq def_list (cons (vla-get-name def) def_list))
  )
  (foreach item (vl-sort def_list (function <))
    (princ (strcat "\n" item))
  )
  (princ)
)

Запуск NC, загрузка lsp, вызов команды:

1
2
3
4
5
6
7
8
9
10
11
12
13
Команда: GET-ALL-BLOCKS

GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Теперь дополню код парой команд: одна просто создаст анонимный блок с отрезком внутри, вторая – создаст анонимный блок с окружностью, и вставит его в пространство модели. Для начала первая, загрузка, запуск, проверка имен блоков:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun c:create-unnamed-block (/ adoc def)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq def (vla-add
              (vla-get-blocks adoc)
              (vlax-3d-point '(0. 0. 0.))
              "*U"
            )
  )
  (vla-addline def
               (vlax-3d-point '(0. 0. 0.))
               (vlax-3d-point '(10. 10. 0))
  )
  (vla-endundomark adoc)
  (princ)
)

Ну и лог выполнения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Команда: CREATE-UNNAMED-BLOCK

CREATE-UNNAMED-BLOCK - CREATE-UNNAMED-BLOCK
Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U13
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

*U13 появился – запомню. Ну ок, теперь сохранение файла, закрытие и повторное открытие. Ну и проверка имен блоков:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SAVE,БСОХРАНИТЬ,СОХРАНИТЬ,УРЛСОХРАНИ - Сохранить
CLOSE,ЗАКРЫТЬ,ПОКИНУТЬ - Закрыть
OPEN,ИМПОРТА,ОТКРЫТЬ,УРЛОТКРОЙ - Открыть...
Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Где *U131? А нету его, снесен.

Теперь команда с созданием анонимного блока со вставкой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun c:create-and-insert-unnamed-block (/ adoc def)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq def (vla-add
              (vla-get-blocks adoc)
              (vlax-3d-point '(0. 0. 0.))
              "*U"
            )
  )
  (vla-addcircle
    def
    (vlax-3d-point '(0. 0. 0.))
    20.
  )
  (vla-insertblock (vla-get-modelspace adoc)
                   (vlax-3d-point '(0. 0. 0.))
                   (vla-get-name def)
                   1.
                   1.
                   1.
                   0.
  )
  (vla-endundomark adoc)
  (princ)
)

Ну и лог выполнения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
APPLOAD,ЗАГПРИЛ - Загрузка приложения...
C:CREATE-AND-INSERT-UNNAMED-BLOCK
Команда: GET-ALL-BLOCKS

GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique
Команда: CREATE-UNNAMED-BLOCK
CREATE-UNNAMED-BLOCK - CREATE-UNNAMED-BLOCK

Команда: CREATE-AND-INSERT-UNNAMED-BLOCK
CREATE-AND-INSERT-UNNAMED-BLOCK - CREATE-AND-INSERT-UNNAMED-BLOCK

Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U11
*U12
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Отлично, сохраняю, закрываю, переоткрываю…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SAVE,БСОХРАНИТЬ,СОХРАНИТЬ,УРЛСОХРАНИ - Сохранить
CLOSE,ЗАКРЫТЬ,ПОКИНУТЬ - Закрыть
OPEN,ИМПОРТА,ОТКРЫТЬ,УРЛОТКРОЙ - Открыть...
Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U12
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Т.е. анонимный блок, у которого не было вхождений (*U11), помахал ручкой.

Интересно, а что будет, если поставить размер?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Команда: DIMLINEAR
DIMLINEAR,РЗМЛИНЕЙНЫЙ - Линейный
Укажите начало первой выносной линии или <выбрать объект>:
Укажите начало второй выносной линии:
Укажите местоположение размерной линии или [Мтекст/Текст/Угол/Горизонтальный/Вертикальный/Повернутый]:

Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*D13
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U12
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Видно, что появился *D блок. Даже если снести размер как сущность, блок никуда не девается:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Укажите противоположный угол:
E,ERASE,С,СТЕРЕТЬ - Удаление
1 найдено
Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*D13
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U12
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Переоткрываю файл (естественно, с сохранением):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CLOSE,ЗАКРЫТЬ,ПОКИНУТЬ - Закрыть
OPEN,ИМПОРТА,ОТКРЫТЬ,УРЛОТКРОЙ - Открыть...
Команда: GET-ALL-BLOCKS
GET-ALL-BLOCKS - GET-ALL-BLOCKS
*Model_Space
*Paper_Space
*Paper_Space6
*Paper_Space7
*Paper_Space8
*U12
_ARCHTICK
_DOT
_NONE
_OPEN30
_Oblique

Как видно, *D-блок был уничтожен автоматически.

Ну, с таблицами ACAD уже играться не буду )))

Размещено в AutoCAD, nanoCAD, Код LISP · Метки: , ,



Поделитесь своим мнением


Я не робот.