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

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

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

Ответ
Поиск в этой теме
Непрочитано 17.02.2020, 14:15
Макрос для черчения линий с пользовательскими настройками
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
Нужна помощь
Просмотров: 6477
 
Непрочитано 17.02.2020, 22:02
#21
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для 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
С.-Петербург
Сообщений: 39,831


Проблема в том, что рано или поздно появляется пользователь, которому "вот этот вот значок не нравицца от слова совсем, да и вообще его надо снести". Я понимаю, что это можно отладить теми же разрешениями, но просто мне подобное не нравится (может, потому, что у меня на обслуге было чуть побольше пользователей - раз этак в 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
С.-Петербург
Сообщений: 39,831


Цитата:
Сообщение от 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 Кб, 3 просмотров)
Тип файла: lsp check_pline_typ.LSP (755 байт, 2 просмотров)

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


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


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 39,831


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

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для 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
С.-Петербург
Сообщений: 39,831


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,653


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,831


Ищи файл с определением функции и подгружай его.
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 39,831


#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
С.-Петербург
Сообщений: 39,831


Пока было совещание, нарисовался код:
Код:
[Выделить все]
 (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
С.-Петербург
Сообщений: 39,831


Возвращается то, что было изначально. ИМХО эт более правильно: по окончании работы система возвращается в тот вид, который был ДО вызова функции (см. "САПР на базе", там все описано
__________________
Моя библиотека 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