Макрос для черчения линий с пользовательскими настройками
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос для черчения линий с пользовательскими настройками

Макрос для черчения линий с пользовательскими настройками

Ответ
Поиск в этой теме
Непрочитано 17.02.2020, 14:15 #1
Макрос для черчения линий с пользовательскими настройками
mr.frai1992
 
Регистрация: 10.04.2019
Сообщений: 47

Появилась необходимость составить макрос который выполнял бы следующие действия:
1. Загружал нужный тип линии если он не загружен
2. Устанавливал вышеупомянутый стиль
3. Устанавливал масштаб линии =1
4. Вызывал ПЛиния (далее пользователь рисует что ему нужно)
5. после завершения построения устанавливает стиль типа линий <ПоСлою>
Вот такая пачка... Я застопорился на этапе добавления и выбора типа линии. Добавлять получается но макрос все время зависает (останавливается и спрашивает пользователя, но после ввода требуемого не продолжается) на: Тип линий "Мембрана" уже загружен. Перезагрузить его? <Д>.
вот то что у меня вышло
Код:
[Выделить все]
 ^C^C-ТИПЛИН;з;Мембрана;z:/GGP-L/Линии/Lin_K.lin;z:/GGP-L/Линии/Membr.shp;^m;^C^C-ТИПЛИН;у;Мембрана;^C^C
Нужна помощь
Просмотров: 7124
 
Непрочитано 17.02.2020, 17:03
| 1 #2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,924
<phrase 1=


mr.frai1992, а может все проще можно, например Инструментальные палитры
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 17.02.2020, 19:59
#3
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


Так я и хочу в палитру добавить, но нужно не 5 кнопок, а одна. Иначе получается вообще нет смысла с макросами заморачиваться)
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 20:05
#4
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
Так я и хочу в палитру добавить, но нужно не 5 кнопок, а одна. Иначе получается вообще нет смысла с макросами заморачиваться)
Из ТЗ первого поста это неочевидно..
Т.е. в процессе черчения нужен выбор в диалоге другого типа линия или слоя или толщины цвета?
Либо вычертить в заданном слое нужным цветом, толщиной и типом полилинию, отрезок или иное? Палитра самое то, какая разница где кнопка
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 17.02.2020, 20:05
2 | #5
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Я могу лисп предложить.

Код:
[Выделить все]
 (vl-load-com)
(defun C:TEST (/ *error* linetype linetypefile oldCELTYPE oldCELTSCALE adoc)
	(defun *error* (msg)
		(vla-EndUndoMark adoc)
		(setvar "CELTYPE" oldCELTYPE)
		(setvar "CELTSCALE" oldCELTSCALE)
	)
	(setq linetype "Мембрана" ;;; имя типа линий
		  linetypefile "Z:\\GGP-L\\Линии\\Lin_K.lin" ;;; путь и имя файла с типом линиии 
		  oldCELTYPE (getvar "CELTYPE")	;;; запоминаем значение системной переменной CELTYPE
		  oldCELTSCALE (getvar "CELTSCALE");;; запоминаем значение системной переменной CELTYPE
		  adoc (vla-get-ActiveDocument (vlax-get-acad-object)) ;;; указатель на текущий документ 
	)
	(vla-StartUndoMark adoc) ;;; задаем начальную метку отмены
	
	;;; 1. Загружаем нужный тип линии если он не загружен	
	(if (not (tblobjname "LType" linetype)) (vla-load (vla-get-Linetypes adoc) linetype linetypefile))
	;;; 2. Устанавливаем вышеупомянутый стиль
	(setvar "CELTYPE" linetype )
	;;; 3. Устанавливал масштаб линии =1
	(setvar "CELTSCALE" 1)
	;;; 4. Вызываем ПЛиния 
	(vl-cmdf "_PLINE")
	;;; (далее пользователь рисует что ему нужно)
	(while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
	;;; 5. После завершения построения восстанавливаем тип линий и масштаб типа линий
	(*error* nil)
)

Последний раз редактировалось skkkk, 17.02.2020 в 20:39.
skkkk вне форума  
 
Непрочитано 17.02.2020, 20:06
1 | #6
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Все же начерти линию, настрой как надо и просто перетащи на палитру, может это оно?
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 17.02.2020, 20:09
#7
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Offtop: Удалил. doctorraz опередил с таким же ответом
skkkk вне форума  
 
Автор темы   Непрочитано 17.02.2020, 20:18
#8
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Все же начерти линию, настрой как надо и просто перетащи на палитру, может это оно?
Не сразу понял о чем говорите) теперь даже смешно как просто) буду пробовать и так и предложенным skkkk лиспом. Спасибо за помощь!
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 20:29
#9
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
опередил с таким же ответом
Zenon опередил всех, быстро и исчерпывающе
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 17.02.2020, 20:55
2 | #10
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Zenon опередил всех, быстро и исчерпывающе
Так-то да, но не все и не для всего их любят, эти палитры (многие - зря), и поэтому я подумал, что может, тут как раз такой случай. Может, mr.frai1992, например, хотел на горячую кнопку повесить или на алиасы настроить надо вдруг, поэтому я и решил дать такой вариант, тем более код уже такой был, я по сути исправил только имя файла и типа линии плюс выделил это дело в команду и удалил лишнего немного по мелочи. Ну и комментарии добавил. Много лет лежала программка без дела, подумал: авось, сгодится кому
(КСТАТИ, исправил-таки не всё - тип линии в теле кода не прописал нужный - откорректировал #5)

А вообще изначально было сделано так, чтоб при нажатии номера типа линии (по принятой условно нумерации) вызывались разные вариации типов и прочих настроек линий. Применительно к типу и масштабу, что-то вроде:
Код:
[Выделить все]
 (vl-load-com)
(defun C:1 () (custom_plines "Мембрана" 3))
(defun C:2 () (custom_plines "Continuous" 1))
(defun custom_plines (linetype linetypescale / *error* linetype linetypefile oldCELTYPE oldCELTSCALE adoc)
	(defun *error* (msg)
		(vla-EndUndoMark adoc)
		(setvar "CELTYPE" oldCELTYPE)
		(setvar "CELTSCALE" oldCELTSCALE)
	)
	(setq linetypefile "Z:\\GGP-L\\Линии\\Lin_K.lin" ;;; путь и имя файла с типом линиии 
		  oldCELTYPE (getvar "CELTYPE")	;;; запоминаем значение системной переменной CELTYPE
		  oldCELTSCALE (getvar "CELTSCALE");;; запоминаем значение системной переменной CELTYPE
		  adoc (vla-get-ActiveDocument (vlax-get-acad-object)) ;;; указатель на текущий документ 
	)
	(vla-StartUndoMark adoc) ;;; задаем начальную метку отмены
	
	;;; 1. Загружаем нужный тип линии если он не загружен	
	(if (not (tblobjname "LType" linetype)) (vla-load (vla-get-Linetypes adoc) linetype linetypefile))
	;;; 2. Устанавливаем вышеупомянутый стиль
	(setvar "CELTYPE" linetype )
	;;; 3. Устанавливал масштаб линии =1
	(setvar "CELTSCALE" linetypescale)
	;;; 4. Вызываем ПЛиния 
	(vl-cmdf "_PLINE")
	;;; (далее пользователь рисует что ему нужно)
	(while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
	;;; 5. После завершения построения восстанавливаем тип линий и масштаб типа линий
	(*error* nil)
)
В данном примере при вызове из командной строки команды "1" - начертится полилиния с типом "Мембрана" в мастшабе 3, "2" - "Continuous" в мастштабе 1 и т.д.

В некоторых случаях такой подход оказывался удобнее палитры.

Последний раз редактировалось skkkk, 17.02.2020 в 21:03.
skkkk вне форума  
 
Автор темы   Непрочитано 17.02.2020, 21:05
#11
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


skkkk, интересная опция с номерами попробую)
а насчет для чего нужно - вообще для палитры инструментов и нужно (пока)) пытаюсь постепенно разобраться в средствах и способах автоматизации проектирования применительно к родной мастерской) вот по мере "разбирательств" и возникают вопросы) Так как мне это нужно в сетевую палитру инструментов, которая, надеюсь, постепенно превратится в удобные панели, больше подходит лисп. Еще раз спасибо skkkk
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 21:08
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


У сетевых палитр в чистом ACAD есть огромный недостаток: отсутствие автоматической синхронизации. Только вручную, только хардкор.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.02.2020, 21:22
#13
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


получилась полуавтоматическая - при перезапуске автокада все обновляется. В моем случае на мастерской в max 20 машин такое решение устраивает в 90% случаев
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 21:26
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Было бы интересно посмотреть на решение - потому что у меня не вышло нормально синхронизировать. Знания NET на нуле, а лиспом не срабатывало больше чем в половине случаев.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.02.2020, 21:33
#15
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Сеть имеется в виду облако или локальная сеть?
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 17.02.2020, 21:36
#16
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


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

----- добавлено через 25 сек. -----
doctorraz, локальная
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 21:39
#17
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
а в самом компьютере включена автосинхронизация всей папки с инструментами
С этого места пожалста поподробнее
Моя мысль дальше SUBST не идет пока))
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 17.02.2020, 21:44
#18
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


сейчас не могу скрин сделать (на домашнем компьютере этого нет) но там все просто: ПКМ по папке -> автоматическая синхронизация (может не дословно). Да и делал я это только на тот случай если буду в командировке а мой ПК забудут включить (он же сервер), палитра у всех работала без сбоев.
если сервер постоянно включен то и так все работает и обновляется при перезапуске автокада
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 21:46
#19
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


тож пытался задавать пути для палитр.. со временем АК начинает их мешать и дублировать, или руки у мну не той системы(( если таскать палитры с машины на машину.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 17.02.2020, 21:49
#20
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


там я путь задавал для палитры только один z:/GGP-L/Palette/
или я что-то не понял?
ЗЫ 4 месяца полет нормальный)
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 22:02
#21
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
путь задавал для палитры только один
возможно поэтому у меня плохо получилось, я к стандартному добавлял свой, плюс палитры по своему пути синхронизировались с другой машины, не пошло, и фих с ним
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 17.02.2020, 22:22
#22
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Проблема в том, что рано или поздно появляется пользователь, которому "вот этот вот значок не нравицца от слова совсем, да и вообще его надо снести". Я понимаю, что это можно отладить теми же разрешениями, но просто мне подобное не нравится (может, потому, что у меня на обслуге было чуть побольше пользователей - раз этак в 5..7 как минимум).
Ну и опять же - если добавить инструметров в палитру (а еще лучше - вообще отдельную палитру создать, а старую какую-нибудь удалить), далеко не факт, что кеширование и прописывание нового состояния палитр будет выполнено корректно. По крайней мере у меня получалось в лучшем случае через раз.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.02.2020, 22:40
#23
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


ну в принципе да пока мне упрощает то что все на месте (в одном здании) и нас немного, опять же никто пока просто не знает как там что-то можно сломать) потом если что-то толковое из моих потуг получится можно будет пробовать внедрять по институту а там уже ~350 раб мест) будет весело)
а если серьезно то поменять что-то пользователь может только для себя (на своем компьютере)
Добавлял и новые вкладки палитры все прекрасно обновляется только приходится первый раз после создания новой вкладки вручную добавить ее в группу а потом инструменты на ней обновляются стабильно (добавляются в конце соответствующей вкладки)
З.Ы. и раз уже пошел такой оффтоп то может подскажите с чего начать создавать справку по командам? чтоб как у людей ПКМ->справка
с ростом палитры в ней все больше возникает необходимость)
З.Ы.Ы. может важно может нет создавались все инструменты на AC2016 но почти все компьютеры в сети с АС2014

Последний раз редактировалось mr.frai1992, 17.02.2020 в 22:46.
mr.frai1992 вне форума  
 
Непрочитано 17.02.2020, 23:05
#24
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
с чего начать создавать справку по командам?
я когда-то пользовал Help&Manual, поскольку она позволяет создавать chm-справку (которую всего лишь надо кешировать на локалки), и к которой из-под лиспа можно обращаться через setfuhelp. Но это на любителя.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.02.2020, 23:24
#25
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


Спасибо уже качаю буду пробовать

----- добавлено через ~10 ч. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
А вообще изначально было сделано так, чтоб при нажатии номера типа линии (по принятой условно нумерации) вызывались разные вариации типов и прочих настроек линий. Применительно к типу и масштабу, что-то вроде:

Код:
[Выделить все]
  (vl-load-com)
(defun C:1 () (custom_plines "Мембрана" 3))
(defun C:2 () (custom_plines "Continuous" 1))
(defun custom_plines (linetype linetypescale / *error* linetype linetypefile oldCELTYPE oldCELTSCALE adoc)
	(defun *error* (msg)
		(vla-EndUndoMark adoc)
		(setvar "CELTYPE" oldCELTYPE)
		(setvar "CELTSCALE" oldCELTSCALE)
	)
	(setq linetypefile "Z:\\GGP-L\\Линии\\Lin_K.lin" ;;; путь и имя файла с типом линиии 
		  oldCELTYPE (getvar "CELTYPE")	;;; запоминаем значение системной переменной CELTYPE
		  oldCELTSCALE (getvar "CELTSCALE");;; запоминаем значение системной переменной CELTYPE
		  adoc (vla-get-ActiveDocument (vlax-get-acad-object)) ;;; указатель на текущий документ 
	)
	(vla-StartUndoMark adoc) ;;; задаем начальную метку отмены
	
	;;; 1. Загружаем нужный тип линии если он не загружен	
	(if (not (tblobjname "LType" linetype)) (vla-load (vla-get-Linetypes adoc) linetype linetypefile))
	;;; 2. Устанавливаем вышеупомянутый стиль
	(setvar "CELTYPE" linetype )
	;;; 3. Устанавливал масштаб линии =1
	(setvar "CELTSCALE" linetypescale)
	;;; 4. Вызываем ПЛиния 
	(vl-cmdf "_PLINE")
	;;; (далее пользователь рисует что ему нужно)
	(while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
	;;; 5. После завершения построения восстанавливаем тип линий и масштаб типа линий
	(*error* nil)
)
В данном примере при вызове из командной строки команды "1" - начертится полилиния с типом "Мембрана" в мастшабе 3, "2" - "Continuous" в мастштабе 1 и т.д.
Попробовал что-то не хочет работать полностью: команда 2 работает а 1 не хочет совсем (не то что ошибку выбивает а вообще ничего не пишет и не добавляет тип линии)
Попробовал так сделать (может и фигню пишу ибо мало понимаю):
Код:
[Выделить все]
 (vl-load-com)
;;;(defun C:1 () (custom_plines "Мембрана" 1))
;;;(defun C:2 () (custom_plines "Continuous" 1))
(defun С:custom_plines () (linetype linetypescale / *error* linetype linetypefile oldCELTYPE oldCELTSCALE adoc)
	(defun *error* (msg)
		(vla-EndUndoMark adoc)
		(setvar "CELTYPE" oldCELTYPE)
		(setvar "CELTSCALE" oldCELTSCALE)
	)
	(setq linetypefile "Z:\\GGP-L\\Линии\\Lin_K.lin" ;;; путь и имя файла с типом линиии 
		  oldCELTYPE (getvar "CELTYPE")	;;; запоминаем значение системной переменной CELTYPE
		  oldCELTSCALE (getvar "CELTSCALE");;; запоминаем значение системной переменной CELTYPE
		  adoc (vla-get-ActiveDocument (vlax-get-acad-object)) ;;; указатель на текущий документ 
	)
	(vla-StartUndoMark adoc) ;;; задаем начальную метку отмены
	
	;;; 1. Загружаем нужный тип линии если он не загружен	
	(if (not (tblobjname "LType" linetype)) (vla-load (vla-get-Linetypes adoc) linetype linetypefile))
	;;; 2. Устанавливаем вышеупомянутый стиль
	(setvar "CELTYPE" linetype )
	;;; 3. Устанавливал масштаб линии =1
	(setvar "CELTSCALE" linetypescale)
	;;; 4. Вызываем ПЛиния 
	(vl-cmdf "_PLINE")
	;;; (далее пользователь рисует что ему нужно)
	(while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
	;;; 5. После завершения построения восстанавливаем тип линий и масштаб типа линий
	(*error* nil)
)
пишет автокад:
Команда: CUSTOM_PLINES
неверный тип аргумента: numberp: #<SUBR @0000011b16ab2188 *ERROR*>

----- добавлено через ~4 ч. -----
Поковырялся еще как смог
вот что получилось
Код:
[Выделить все]
 (defun C:check_pline_typ (/ linetyp_name WID)
;;; Устанавливаем тип линий
  (load_global_variable)
  (initget 1 )(setq linetyp_name (getstring T "\nИмя типа линии: "))
  (if (not (tblobjname "ltype" linetyp_name))
    (vla-load (vla-get-Linetypes active_document) linetyp_name "Lin_K.lin")
    )
  (vla-put-ActiveLinetype active_document (vla-item (vla-get-linetypes active_document) linetyp_name))
;;; Устанавливаем толщину линий  
    (initget 1 )(setq WID (getreal "\nТолщина полилинии: "))
  (setvar "PLINEWID" (/ WID (getvar "CANNOSCALEVALUE")))
;;; Вызываем полилинию   
  (vl-cmdf "_PLINE") 
;;; Меняем стиль линии на "по слою"  
  (while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
  (command "_.linetype" "у" "bylayer")

  )
ЕСТЬ НО:
1. когда вызываю из командной строки по факту все работает как надо но всплывает nil
Команда: CHECK_PLINE_TYP
Имя типа линии: мембрана
Толщина полилинии: 0
nil
Задайте параметр [?/Создать/Загрузить/Установить]:
в конце жму esc и тип линий остается по слою а нарисованная линия по типу мембрана
2. когда попробовал посадить на кнопку макросом
Код:
[Выделить все]
^C^C(if (null C:check_pline_typ)(load "check_pline_typ"));check_pline_typ;мембрана;0;^C
то линию вообще рисовать не хочет а сразу устанавливает тип линии по слою и ждет завершения
Задайте параметр [?/Создать/Загрузить/Установить]:
попробовал
Код:
[Выделить все]
^C^C(if (null C:check_pline_typ)(load "check_pline_typ"));check_pline_typ;мембрана;0;\;^C
плохо попробовал
Код:
[Выделить все]
^C^C(if (null C:check_pline_typ)(load "check_pline_typ"));check_pline_typ;мембрана;0;\\\;^C
рисует 2 сегмента и завершает устанавливая по слою
но что-то я не так написал - должен рисовать столько сегментов сколько нужно и только потом заканчивать
тут точно нужна подсказка сам не найду
Вложения
Тип файла: lsp custom_plines.lsp (1.7 Кб, 4 просмотров)
Тип файла: lsp check_pline_typ.LSP (755 байт, 3 просмотров)

Последний раз редактировалось mr.frai1992, 18.02.2020 в 13:04.
mr.frai1992 вне форума  
 
Непрочитано 19.02.2020, 03:10
1 | #26
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
Попробовал что-то не хочет работать полностью: команда 2 работает а 1 не хочет совсем (не то что ошибку выбивает а вообще ничего не пишет и не добавляет тип линии)
Код из #10 я проверял на АС2011 со своими типами линий - и он работал.
Вероятные причины отказа:
1). Возможно, я (или не я) что-то напутал в пути к файлу или имени файла типов линий. Лиспу при указании пути нужен двойной обратный слэш. Очевидно, что если папку, где он лежит, добавить в пути доступа в настройках, то путь можно и не указывать.

2). В типе линий присутствуют символы (буквы), при этом в описании типа линии этим символам присвоен некий текстовый стиль, который не загружен в чертеж. Тут либо следить за тем, чтоб он был загружен, либо создавать его принудительно. Я делаю это примерно так:
Код:
[Выделить все]
 (setq txt_style_name "GOST_15")
(if (null (tblobjname "STYLE" txt_style_name))
	(progn 
		(setq oldANGDIR (getvar "ANGDIR"))
		(setvar "ANGDIR" 0)
		(vla-Add (vla-get-TextStyles (vla-get-ActiveDocument (vlax-get-acad-object))) txt_style_name)
		(setvar "ANGDIR" oldANGDIR)
		(vla-put-FontFile (vlax-ename->vla-object (tblobjname "style" txt_style_name)) "GOST")
		(vla-put-ObliqueAngle (vlax-ename->vla-object (tblobjname "style" txt_style_name))(angtof "15" 4))
	)
)
Стилю текста я задаю только шрифт и наклон, можно назначить по аналогии и другие свойства.
Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
Попробовал так сделать (может и фигню пишу ибо мало понимаю):
Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
Код:
[Выделить все]
(defun С:custom_plines () (linetype linetypescale / .........
Так действительно, нельзя. Если после defun идет C:, то это уже не функция, а команда, а она не может иметь аргументов. Отличие функции в том, что мы можем задавать ей аргументы, такие как linetype и linetypescale, а затем эту функцию обернуть в команду (и если надо, то не в одну). Это удобно, когда нам нужно несколько команд с одинаковым функционалом, но с разными настройками - тогда мы переменные перемещаем в аргументы функции и оборачиваем в команды (в нашем случае - 1 и 2), которые чертят разные линии, используя одну программу. Надеюсь, не слишком сложно объяснил. Подробнее - тут, в разделе Команда или функция ?

3). Может, еще что-то, но для точного диагноза лучше бы приложить файл dwg с нужной линией и сам файл типа линии (его потребуется предварительно заархивировать)
Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
1. когда вызываю из командной строки по факту все работает как надо но всплывает nil
Функция лиспа command всегда возвращает nil. Чтобы не всплывал, в конец кода надо добавить (princ).

Цитата:
Сообщение от mr.frai1992 Посмотреть сообщение
2. когда попробовал посадить на кнопку макросом
Насколько я помню, команду, созданную из лиспа, нельзя использовать в макросах. Точнее, использовать можно, вызывая ее из макроса как (C:check_pline_typ), но нельзя ей далее задавать опции. Для этого и задаются аргументы и интерактивные функции (запрос чего-то у пользователя) внутри лисп-кода.
skkkk вне форума  
 
Непрочитано 19.02.2020, 08:08
| 1 #27
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Цитата:
Сообщение от skkkk Посмотреть сообщение
Насколько я помню, команду, созданную из лиспа, нельзя использовать в макросах.
Насколько я помню, можно, и даже без скобок. Главное, чтоб лисп был загружен.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2020, 09:09
#28
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


без скобок если (defun c:ff()) ^C^Cff
если (defun ff()) скобки нужны в макросе ^C^C(ff)
не вызывается повторно пробелом
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 19.02.2020, 09:23
#29
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


doctorraz, так разговор-то о командах, а не о функциях
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.02.2020, 09:36
#30
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


skkkk, не все понял пока и соответственно не все получилось правильно через функцию... но оно таки заработало как надо
Получилось что у меня это будет универсальный лисп для рисования полилинии с каким-то определенным (прописанным в макросе команды на кнопке) набором свойств, после выполнения которого тип линии возвращается в "По Слою". То что мне и было нужно в идеале)
Вот итоги постижения непостижимого) (для меня это первый опыт более-менее (скорее менее) самостоятельной работы с кодом lisp)
Код:
[Выделить все]
 (defun C:check_pline_typ (/ linetyp_name WID)
;;; Устанавливаем тип линий
  (load_global_variable)
  (initget 1 )(setq linetyp_name (getstring T "\nИмя типа линии: "))
  (if (not (tblobjname "ltype" linetyp_name))
    (vla-load (vla-get-Linetypes active_document) linetyp_name "Lin_K.lin")
    )
  (vla-put-ActiveLinetype active_document (vla-item (vla-get-linetypes active_document) linetyp_name))
;;; Устанавливаем толщину линий  
    (initget 1 )(setq WID (getreal "\nТолщина полилинии: "))
  (setvar "PLINEWID" (/ WID (getvar "CANNOSCALEVALUE")))
;;; Вызываем полилинию   
  (vl-cmdf "_PLINE") 
;;; Меняем стиль линии на "по слою"  
  (while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
  (command "_.linetype" "у" "bylayer")
  (command)
(princ)
  )
 
Макрос команды
Код:
[Выделить все]
^C^C(if (null C:check_pline_typ)(load "check_pline_typ"));check_pline_typ;мембрана;0;
Еще раз спасибо за помощь!
mr.frai1992 вне форума  
 
Непрочитано 19.02.2020, 13:40
1 | #31
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Насколько я помню, можно, и даже без скобок
Да, ты прав. Offtop: Не пользовался макросами уже лет десять, с тех пор, как перелез на лисп. Спутал с другой ситуацией: такие команды (созданные лиспом с помощью defun С:) нельзя вызывать из лиспа, используя command. Заработался что-то.
Прошу прощения.
skkkk вне форума  
 
Автор темы   Непрочитано 26.02.2020, 09:57
#32
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


Еще одна проблема вскрылась с лиспом
На моем компьютере работает без вопросов, а на другом не хочет( пишет:
no function definition: LOAD_GLOBAL_VARIABLE
У меня автокад 2016 вин10х64
На других машинах вин7х64 ас2016 и другой вариант вин7х32 ас2014
не было в начале (vl-load-com) уже добавил - не помогло
mr.frai1992 вне форума  
 
Непрочитано 26.02.2020, 10:08
#33
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Ищи файл с определением функции и подгружай его.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.02.2020, 10:15
#34
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


В смысле check_pline_typ.lsp? Или я что-то не понял
Вот что происходит в ком строке после клика по кнопке
Код:
[Выделить все]
Команда: (if (null C:check_pline_typ)(load "check_pline_typ"))
C:CHECK_PLINE_TYP
Команда: check_pline_typ
; ошибка: no function definition: LOAD_GLOBAL_VARIABLE
Команда:
Команда: мембрана
Неизвестная команда "МЕМБРАНА".  Для вызова справки нажмите F1.
Команда: 0
Неизвестная команда "0".  Для вызова справки нажмите F1.
Команда: *Прервано*
вот попробовал вручную подгрузить лисп и вызвать
Код:
[Выделить все]
Команда: _appload check_pline_typ.LSP успешно загружено.
Команда: check_pline_typ
; ошибка: no function definition: LOAD_GLOBAL_VARIABLE
Объясните пожалуйста поподробнее
mr.frai1992 вне форума  
 
Непрочитано 26.02.2020, 10:25
1 | #35
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


#30, идет вызов функции (load_global_variable). Ищи lsp файл со словами
Код:
[Выделить все]
(defun load_global_variable
Искренне надеюсь, что оно не в каком-нибудь fas / vlx / dll
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.02.2020, 10:27
#36
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47




----- добавлено через ~23 мин. -----
Оказалось не все так страшно)
Вот как должен выглядеть код лиспа чтобы все работало
Код:
[Выделить все]
 (vl-load-com)
(defun load_global_variable (/ var-acad-ver); начало работы с расширением lisp'а
  (setq var-acad-ver (getvar "ACADVER"))
  (setq *file-system-object*(vlax-get-or-create-object "Scripting.FileSystemobject"))
  (setq acad_application (vlax-get-acad-object))
  (if
    (vl-catch-all-error-p
      (setq C3D_Application (vl-catch-all-apply
			      'vla-getInterfaceObject
			      (list
				acad_application
				(cond
				  ((eq var-acad-ver "17.1s (LMS Tech)")"AeccXUiLand.AeccApplication.5.0"); Acad 2008
				  ((eq var-acad-ver "17.2s (LMS Tech)")"AeccXUiLand.AeccApplication.6.0"); Acad 2009
				  ((eq var-acad-ver "18.0s (LMS Tech)")"AeccXUiLand.AeccApplication.7.0"); Acad 2010
				  ((eq var-acad-ver "18.1s (LMS Tech)")"AeccXUiLand.AeccApplication.8.0"); Acad 2011
				  ((eq var-acad-ver "18.2s (LMS Tech)")"AeccXUiLand.AeccApplication.9.0"); Acad 2012
				  ((eq var-acad-ver "19.0s (LMS Tech)")"AeccXUiLand.AeccApplication.10.0"); Acad 2013
				  ((eq var-acad-ver "19.1s (LMS Tech)")"AeccXUiLand.AeccApplication.10.3"); Acad 2014
				  ((eq var-acad-ver "20.0s (LMS Tech)")"AeccXUiLand.AeccApplication.10.4"); Acad 2015
				  ((eq var-acad-ver "20.1s (LMS Tech)")"AeccXUiLand.AeccApplication.10.5"); Acad 2016
				  ((eq var-acad-ver "21.0s (LMS Tech)")"AeccXUiLand.AeccApplication.11.0"); Acad 2017
				  ((eq var-acad-ver "22.0s (LMS Tech)")"AeccXUiLand.AeccApplication.12.0"); Acad 2018
				  ((eq var-acad-ver "23.0s (LMS Tech)")"AeccXUiLand.AeccApplication.13.0"); Acad 2019
				  )
				)))
      )
    (progn
      (setq C3D_Application nil)
      )
    (progn
      (setq C3D_active_document (vla-get-ActiveDocument C3D_Application))
      (setq C3D_points (vlax-get C3D_active_document 'points))
      )
    )
  (setq active_document (vla-get-ActiveDocument acad_application))
  (setq layouts_document (vla-get-Layouts active_document))
  (setq model_spece (vla-get-ModelSpace active_document))
  (setq paper_spece (vla-get-PaperSpace active_document))
  (setq blocks_spece (vla-get-Blocks active_document))
  (princ)
  )
;;;Лисп для рисования полилинии с каким-то определенным (прописанным в макросе команды на кнопке) набором свойств, после выполнения которого тип линии возвращается в "По Слою"
;;;Макрос команды
;;;^C^C(if (null C:check_pline_typ)(load "check_pline_typ"));check_pline_typ;мембрана;0;
(defun C:check_pline_typ (/ linetyp_name WID)
;;; Устанавливаем тип линий
  (load_global_variable)
  (initget 1 )(setq linetyp_name (getstring T "\nИмя типа линии: "))
  (if (not (tblobjname "ltype" linetyp_name))
    (vla-load (vla-get-Linetypes active_document) linetyp_name "Lin_K.lin")
    )
  (vla-put-ActiveLinetype active_document (vla-item (vla-get-linetypes active_document) linetyp_name))
;;; Устанавливаем толщину линий  
    (initget 1 )(setq WID (getreal "\nТолщина полилинии: "))
  (setvar "PLINEWID" (/ WID (getvar "CANNOSCALEVALUE")))
;;; Вызываем полилинию   
  (vl-cmdf "_PLINE") 
;;; Меняем стиль линии на "по слою"  
  (while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
  (command "_.linetype" "у" "bylayer")
;;; Имитация нажатия Esc
  (command)
;;; Нужно ставить после comand чтобы не вылазило nil
(princ)
  )
 
Кулик Алексей aka kpblc, спасибо!!!
mr.frai1992 вне форума  
 
Непрочитано 26.02.2020, 11:16
#37
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Пока было совещание, нарисовался код:
Код:
[Выделить все]
 (defun c:check-pl-type (/ adoc lt_name lt_file sysvar pl_width)
  (if (and (= (type
                (setq lt_name (vl-catch-all-apply (function (lambda () (getstring t "\nВведите имя типа линии <Текущий> : ")))))
                ) ;_ end of type
              'str
              ) ;_ end of =
           (= (type
                (setq pl_width (vl-catch-all-apply
                                 (function (lambda (/ _w)
                                             (setq _w (getvar "plinewid"))
                                             (initget 4)
                                             (cond ((getreal (strcat "\nВведите толщину полилинии <" (rtos _w 2) "> : ")))
                                                   (t _w)
                                                   ) ;_ end of cond
                                             ) ;_ end of lambda
                                           ) ;_ end of function
                                 ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'real
              ) ;_ end of =
           ) ;_ end of and
    (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
           (setq lt_name (vl-string-trim " " lt_name))
           (if (and (setq lt_file (findfile "lin_k.lin"))
                    (/= lt_name "")
                    (not
                      (vl-catch-all-error-p
                        (vl-catch-all-apply (function (lambda () (vla-load (vla-get-linetypes adoc) lt_name lt_file))))
                        ) ;_ end of vl-catch-all-error-p
                      ) ;_ end of not
                    ) ;_ end of and
             (setq sysvar (list (cons "celtype" lt_name)))
             ) ;_ end of if
           (setq sysvar (append (list (cons "plinewid" (/ pl_width (getvar "cannoscalevalue")))) sysvar))
           (vl-cmdf "_.pline")
           (while (> (getvar "cmdactive") 0) (vl-cmdf pause))
           (foreach item sysvar (setvar (car item) (cdr item)))
           (vla-endundomark adoc)
           ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.02.2020, 13:30
#38
mr.frai1992


 
Регистрация: 10.04.2019
Сообщений: 47


Кулик Алексей aka kpblc, это получается то же самое только использует другие функции чтобы не было зависимости от load_global_variable?
Спасибо) осталось только добавить чтобы тип линий возвращался на по слою
Код:
[Выделить все]
 ;;; Меняем стиль линии на "по слою"  
  (while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause))
  (command "_.linetype" "у" "bylayer")
;;; Имитация нажатия Esc
  (command)
;;; Нужно ставить после comand чтобы не вылазило nil
(princ)
mr.frai1992 вне форума  
 
Непрочитано 26.02.2020, 13:46
#39
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,446


Возвращается то, что было изначально. ИМХО эт более правильно: по окончании работы система возвращается в тот вид, который был ДО вызова функции (см. "САПР на базе", там все описано
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос для черчения линий с пользовательскими настройками



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен макрос выявления "неправильных" ортогональных линий Малявка Программирование 22 03.03.2021 21:18
Макрос VBA Excel для извлечения таблиц из линий, полилиний, текста из DWG файлов в Excel с помощью NanoCAD/AutoCAD JZY Готовые программы 8 14.07.2016 06:31
Как удалить тип линии Tolyanovich AutoCAD 48 20.11.2014 09:24
Простановка осевых линий на отводах трубопроводов. макрос. никто не видел? ssn Программирование 39 13.05.2013 13:12
Нужен макрос для черчения почасовых графиков SON Программирование 2 03.08.2010 21:11