Re: Макрос на кнопке для изменения свойств обьекта
> kpblc
Самостоятельно я собирал два раза. И оба раза не работало. Я синтаксиса не знаю. И посмотреть негде.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопке для изменения свойств обьекта
> kpblc
Самостоятельно я собирал два раза. И оба раза не работало. Я синтаксиса не знаю. И посмотреть негде.
> Forma
см. > Forma (2005-08-16 15:50:43):
?книгу В.Света "AutoCAD Язык макросов и создание кнопок" все-таки купить не помешает.?
Есть такая книга у меня. Ничего в ней не понимаю.
Читать надо повнимательнее. Сколько раз уже говорено - не по диагонали надо читать техническую литературу, не по диагонали... И каждую страницу. Там все написано и описано.
> kpblc
Нет сил у меня на эту книгу. Не понимаю я автора. Я человек системный.
> kpblc
Работает только первая часть.
Создает слой. А дальше начинается кутерьма какая то. Даже не описать. Ты сам то проверял работу этого макроса? Или так, слепил из того что было.
> kpblc
Честно говоря, нехорошо этот макрос работает. Слой-то создается, но все затыкается на изменении свойств. Надо бы вот так, IMHO, записать часть макроса, касающегося _change:
_Change;\;_Prop;_Layer;06-DIM;;
> kpblc
Прошу прощения, вот полный макрос:
^C^C_-Layer;_Make;06-DIM;_ON;06-DIM;_Color;3;;_Ltype;Continuous;;_LWeight;0.25;;_Plot;_Plot;;_Thaw;06-DIM;_Unlock;06-DIM;;_Change;\;_Prop;_Layer;06-DIM;;
> Forma
^C^C_-Layer;_Make;06-DIM;_ON;06-DIM;_Color;3;;_Ltype;Continuous;;_LWeight;0.25;;_Plot;_Plot;;_Thaw;06-DIM;_Unlock;06-DIM;;_Change;\;_Properties;_Layer;06-DIM;;
Называется - найди 2 отличия.
Оффтоп:
Честно говоря, Forma, у тебя ситуация весьма сильно напоминает старую притчу: стоит мужик и пилит дерево тупой пилой. К нему подходит другой и спрашивает:
- Ты чего делаешь?
- Дерево пилю.
- Так тупая пила-то, заточи!
- Нет времени...
Не проще ли полдня потерять, потом за 5 минут долететь?
О, пока печатал, уже обогнали :)
Forma, все равно - найди отличия и пойми, что было не так.
> Владимир Громов
Вот уже теплее.
1. Кнопка переключает на слой "06-DIM";
2. Если его нет, то слой этот создается:
Это хорошо!
3. Остался третий, последний пункт.
Мне нужно "Не заселектируйте обьект", а , вне зависимости ни от чего, я селектирую обьекты. Затем кликаю по кнопке и эти обьекты приобретают свойства "06-DIM" (Или уходят в этот слой. Не в терминологии дело)
Значит попробуй заменить в маросе ;\; на ;_last; - будет тебе дополнительный бонус
> kpblc
Я бы рад сделать, да не понимаю этих нюансов.
Нда, не срабатывает. Сорри. Меня мучает один вопрос - а выпадающий список "слой" вообще не работает? С ним-то попроще будет все-таки: выделил объекты, выбрал в списке подходящий слой и все - выбор на слое болтается. Замороженные, заблокированные и отключенные слои не обрабатываются. Чем подход плох?
> kpblc
Насчет "тупой пилы" согласен. Что делать? Такой наш российский менталитет. И я такой. Признаю.
> kpblc
Плох тем, что долго это. У меня "родных" слоев - десять. И больше себе не позволяю. Но! Остальных 5-10-15 не мои. Пока в названиях, смыслах разберешься. И в каждом другом чертеже все по другому. А работать надо быстро. Тем более я лет десять работал по этой схеме в другом CADе. Привык.
> Forma
Да я-то не собирался писать макрос для данной задачи, хотелось просто разобраться с макросом kpblc, прошу прощения.
> Владимир Громов
Ну ладно. Прошу прощения.
> Forma
Не надо обощать - у меня, надеюсь, все-таки не такой.
Если медленно, то окно свойств сделает то же самое. А _.qselect вообще позволяет сразу весь чертеж прошерстить - это так, для справки.
Схема работы (меня достало, если честно, рассказывать элементарные вещи, но, похоже, без этого не обойтись): просто, тупо и наглядно.
Создается шаблон, в котором есть все свои "родные" слои. Через _.insert вставляется блоком пришедший чертеж, для него делается _.explode. Выбор объектов - любым методом, потом через список слоев, или через _.change, или через панель Properties заменить на выбранных объектах все что угодно.
Более продвинутый способ - использовать CAD-стандарты. Его рассказывать в очередной раз не буду, недавно приводил цитаты по этому делу - поиск рулез!
> Владимир Громов
> kpblc
Жаль. А так все хорошо пошло.
Закончится тоже неплохо. Значится так, делаем лисп-файл (записать как kpblc-changeprop.lsp по путям поддержки ACADa):
;|============================================================================= * Функция изменения свойства наборов объектов. * Параметры: * layer-name - имя слоя. Слой должен существовать. * Примеры вызова: (kpblc-changeprop "0") - перенос на слой "0" (kpblc-changeprop "01-Arrows") - перенос на слой "01-Arrows" =============================================================================|; (defun kpblc-changeprop (layer-name / selset cur_ent) (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (setq selset (ssget)) (vla-endundomark *kpblc-activedoc*) (vla-startundomark *kpblc-activedoc*) (while (and selset (> (sslength selset) 0) ) ;_ end of and (setq cur_ent (ssname selset 0)) (ssdel cur_ent selset) (entmod (subst (cons 8 layer-name) (assoc 8 (entget cur_ent)) (entget cur_ent) ) ;_ end of subst ) ;_ end of entmod (entupd cur_ent) ) ;_ end of while (vla-endundomark *kpblc-activedoc*) ) ;_ end of defun
И макрос становится нечто типа такого:
^C^C_-Layer;_Make;06-DIM;_ON;06-DIM;_Color;3;;_Ltype;Continuous;;_LWeight;0.25;;_Plot;_Plot;;_Thaw;06-DIM;_Unlock;06-DIM;;(if (not *kpblc-activedoc*) (load "kpblc-changeprop.lsp"));(kpblc-changeprop "06-DIM");
На случай, если уже были мои лиспы подгружены, то код макроса станет
^C^C_-Layer;_Make;06-DIM;_ON;06-DIM;_Color;3;;_Ltype;Continuous;;_LWeight;0.25;;_Plot;_Plot;;_Thaw;06-DIM;_Unlock;06-DIM;;(if (not (kpblc-changeprop)) (load "kpblc-changeprop.lsp"));(kpblc-changeprop "06-DIM");
Для гарантированной загрузки макрос будет
^C^C_-Layer;_Make;06-DIM;_ON;06-DIM;_Color;3;;_Ltype;Continuous;;_LWeight;0.25;;_Plot;_Plot;;_Thaw;06-DIM;_Unlock;06-DIM;;(load "kpblc-changeprop.lsp");(kpblc-changeprop "06-DIM");
Выбирай по вкусу и цвету. Есть вариант более продвинутый, но я его уже приводил и повторяться не буду. Если и это не нравится, то платите финансы, сделаю менюшку (достало заниматься такой работой впустую, если честно)
Вот программа, записанная как макрос для кнопки. Сначала надо выделить объекты, а потом щелкнуть по кнопке. Слой создается с параметрами по умолчанию. Лучше заранее создать нужный слой и настроить его. Если объекты не будут заранее выбраны, а то получится чепуха.
^P(setq ss (ssget)) (vl-cmdf "_-LAYER" "_M" "06-DIM" "") (if ss (vl-cmdf "_Change" ss "" "_Prop" "_Layer" "06-DIM" "")) (princ)
> Владимир Громов
Опять только частично. На кнопке должно быть три функции:
1. Кнопка переключает на слой "06-DIMENSION";
2. Если его нет, то слой этот создается; (_Color;3;_Ltype;Continuous;_LWeight;0.05;; и т.д. что там нужно)
3. Заселектированные обьекты кликая по этой кнопке, приобретают свойства слоя "06-DIMENSION";
Все это должно работать независимо друг от друга. Три функции на одной кнопке.
Если это, в принципе, не возможно сделать в AutoCAD, закрываем тему.
> Forma
Ну, если в принципе вам лень скомпоновать под себя макрос из кучи вышеприведенных примеров, то и пусть эта тема закрывается.
> Владимир Громов
Мне не лень. Я не знаю синтаксиса.
> Forma
Вот только через месяц стало ясно, что кнопка должна выполнять три функции, причем в зависимости от наличия слоя и наличия или отсутствия выбранных заранее объектов. Почему же нельзя было сразу подробно расписать условия? Главное сейчас - это добавить в макрос проверку наличия выбранных объектов, т.е. выполнять (ssget) или нет. Пока не соображу, как это сделать попроще и книжки нет под рукой...
Ндааа... Примеров мало, кода мало, разъяснений мало... Forma, есть предложение: ты пишешь ТЗ, я делаю менюшки. Ессно, не бесплатно. Полгода (или побольше - зависит от подробности ТЗ и объема работы) и у тебя будет все чего тебе хоцца. А? Как идея?
А то решения-то на самом деле однотипные, а вот системы не видно.
> Владимир Громов
Мое мнение - надо делать на самом деле несколько лиспов: один создает список возможных слоев с настройками для них; второй активирует (или создает) слой из списка; третий переносит объекты на данный слой. При необходимости - запросы и предупреждения. Приводить все здесь не вижу смысла, если честно - слишком много кода, который да, универсален, но его применять для одной задачи - как из гаубицы по муравьям - грохоту много, а эффект близок к нулю.
> Forma
Учиться "никогда не поздно и никому не рано" (с) "Кавказская пленница"
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопке для изменения свойств обьекта
Форум работает на PunBB, при поддержке Informer Technologies, Inc