Создание слоев и стилей. Откуда берутся стартовые настройки?

Сегодня получил вопрос - при программном создании слоя новый слой откуда тащит свои настройки? Со слоя "0"? С текущего слоя? Еще откуда-то?

Гадать не хотелось, а гарантированно предсказуемого ответа я не знал.

Сейчас появилось немного времени на проведение небольшого исследования.

AutoCAD 2014 SP1, новый файл на основе acadiso.dwt, два слоя:

Наименование слоя Настройки
0 Цвет : 1
Тип линии: Center
Вес линии: 2.00
Layer1 Цвет : 3
Тип линии: Continuous
Вес линии: 0.20

Активный слой - Layer1. После установки всех элементов файл сохраняется, закрывается и снова открывается.

Рассматриваем несколько вариантов создания слоя (после каждого создания выполняется очистка файла):

  • Командный

    1
    (command "_.-layer" "_n" "Layer2" "")
  • entmakex
    1
    2
    3
    4
    5
    6
    7
    (entmakex '((0 . "LAYER")
                (100 . "AcDbSymbolTableRecord")
                (100 . "AcDbLayerTableRecord")
                (2 . "Layer2")
                (70 . 0)
                )
              ) ;_ end of entmakex

    Это минимум данных, необходимых для создания слоя.

  • через entmod меняем слой у существующего примитива. Т.е. рисуем отрезок, помещаем его, например, на слой "0", а потом через функцию entmod и entupd меняем ему слой:
    1
    2
    3
    (setq ent (car (entsel)))
    (entmod (subst (cons 8 "Layer2") (assoc 8 (entget ent)) (entget ent)))
    (entupd ent)
  • ActiveX
    1
    2
    (vl-load-com)
    (vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) "Layer2")

Выяснилась интереснейшая штука: независимо ни от чего слой создавался со следующими настройками: цвет 7, слой включен, разморожен и разблокирован, тип линии - Continuous (Непрерывный), вес линии - по умолчанию (acLnWtByLwDefault), прозрачность 0, слой выводится на печать.

Откуда AutoCAD тащит эти настройки - лично мне неизвестно. Но результат интересный.

А что будет, если подобную шутку провернуть, например, над текстовым стилем? Понятно, что вариант с entmod не прокатит - все же стиль придется сначала создать. Про командный метод тоже придется забыть - там все настройки задаются. Остается только 2 варианта: либо полноценный entmakex, либо ActiveX:

1
2
3
4
5
6
7
8
;; entmakex
(entmakex '((0 . "STYLE")
            (100 . "AcDbSymbolTableRecord")
            (100 . "AcDbTextStyleTableRecord")
            (2 . "Style2Ent")
            (70 . 0)
            )
          ) ;_ end of entmakex
1
2
3
;; ActiveX
(vl-load-com)
(vla-add (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object))) "Style2VLA")

И теперь посмотрим, что получилось:

Свойство entmakex ActiveX
FontName В 2014 был установлен "@Arial Unicode MS.shx" - первый в списке shx-фонт
BigFont Не установлен
Height 0.0
Width factor 1.0

Остальные свойства у стиля Standard я не менял, но не думаю, что будет что-то изменено. Т.е., получается, что при создании текстового стиля AutoCAD берет настройки "откуда-то из космоса". Подозреваю, что и при создании табличных стилей, размерных стилей и т.п. ситуация не изменится (но не проверял).

Подводя небольшие итоги: можно "пофилонить" и создать стиль (ну или слой) с настройками "по умолчанию". Но как оно будет работать и насколько будет удовлетворять клиента / программиста - большой вопрос. Во избежание любых непонятных ситуаций намного дешевле создавать подобные элементы с прямым указанием соответствующих свойств.

Как обычно, ИМХО ;)



Комментарии

Есть 4 коммент. к “Создание слоев и стилей. Откуда берутся стартовые настройки?”
  1. Создавая новый слой\стиль следует принудительно задавать важные настройки, не надеясь на настройки по умолчанию, поскольку если в будущем эти самые настройки по умолчанию вдруг начнут назначаться по иному принципу - это может оказаться неприятным "сюрпризом".  Поэтому лично я предпочитаю перестраховываться и чётко обозначать все настройки (во всяком случае все, важные для решаемой мною задачи).
    имхо

  2. Кулик Алексей aka kpblc пишет:

    Так и я про то же :) Но вопрос был "ведь автоматом создаем, а что создаем и почему?" - это и было предметом исследования ;)

  3. Павел пишет:

    Здравствуйте. Существует ли возможность при создании слоя (через _m) программно задать "неизменение" статуса Включенности слоя, если этот слой в файле уже присутствует? Или там также - все, что не указано принудительно - берется из этого специального космоса, где слои всегда "On". У меня в настроенном файле-шаблоне есть слой, выключенный по умолчанию, но при открытии этого файла lisp "заново создает" слой и опять его включает.

  4. Кулик Алексей aka kpblc пишет:

    Ну в таком случае я бы точно не использовал командные методы. Проходим по таблице слоев, проверяем наличие элемента, устанавливаем для него "какие-то" свойства.
    Статья посвящена вопросу "если просто создать слой, откуда берутся незаданные параметры?", а не вопросу поведения командных методов. Насколько я помню, _m создает слой, но выполняется ли там настройка, и если да, то какая - не знаю. Командные методы стараюсь вообще не использовать.

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


Я не робот.