Создание слоев и стилей. Откуда берутся стартовые настройки?
Сегодня получил вопрос - при программном создании слоя новый слой откуда тащит свои настройки? Со слоя "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 берет настройки "откуда-то из космоса". Подозреваю, что и при создании табличных стилей, размерных стилей и т.п. ситуация не изменится (но не проверял).
Подводя небольшие итоги: можно "пофилонить" и создать стиль (ну или слой) с настройками "по умолчанию". Но как оно будет работать и насколько будет удовлетворять клиента / программиста - большой вопрос. Во избежание любых непонятных ситуаций намного дешевле создавать подобные элементы с прямым указанием соответствующих свойств.
Как обычно, ИМХО
Создавая новый слой\стиль следует принудительно задавать важные настройки, не надеясь на настройки по умолчанию, поскольку если в будущем эти самые настройки по умолчанию вдруг начнут назначаться по иному принципу - это может оказаться неприятным "сюрпризом". Поэтому лично я предпочитаю перестраховываться и чётко обозначать все настройки (во всяком случае все, важные для решаемой мною задачи).
имхо
Так и я про то же Но вопрос был "ведь автоматом создаем, а что создаем и почему?" - это и было предметом исследования
Здравствуйте. Существует ли возможность при создании слоя (через _m) программно задать "неизменение" статуса Включенности слоя, если этот слой в файле уже присутствует? Или там также - все, что не указано принудительно - берется из этого специального космоса, где слои всегда "On". У меня в настроенном файле-шаблоне есть слой, выключенный по умолчанию, но при открытии этого файла lisp "заново создает" слой и опять его включает.
Ну в таком случае я бы точно не использовал командные методы. Проходим по таблице слоев, проверяем наличие элемента, устанавливаем для него "какие-то" свойства.
Статья посвящена вопросу "если просто создать слой, откуда берутся незаданные параметры?", а не вопросу поведения командных методов. Насколько я помню, _m создает слой, но выполняется ли там настройка, и если да, то какая - не знаю. Командные методы стараюсь вообще не использовать.