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

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

Полилиния с одной/двумя стрелками на концах

Ответ
Поиск в этой теме
Непрочитано 03.12.2023, 11:22 #1
Полилиния с одной/двумя стрелками на концах
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 759

Есть код 2008 года Полилиния с одной/двумя стрелками на концах https://www.theswamp.org/index.php?t...2814#msg252814
Код:
[Выделить все]
 (defun c:ArPline (/ ActDoc CurSpace StPt NumList VecList tempPt Ang tempPt2 Ang2 PtMsg)
	; Draw a single polyline with arrow heads on (both) end(s), with the ability to change the width of the main body, and set the
	;  length of the arrow head(s) and width.
	;  Global variables:
	;  [ GlbVarHeadType ] = Single or Double
	;  [ GlbVarBodyWidth ] = Width of main part of polyline
	;  [ GlbVarArrowLength ] = Length of arrow head
	;  [ GlbVarArrowWidth ] = Width of arrow head at wide part
	
	(setq ActDoc (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	(setq CurSpace
		(vlax-get
			ActDoc
			(if (equal (getvar 'CVport) 1)
				'PaperSpace
				'ModelSpace
			)
		)
	)
	(if (not GlbVarHeadType)
		(setq GlbVarHeadType "Single")
	)
	(if (not GlbVarBodyWidth)
		(setq GlbVarBodyWidth 0.0)
	)
	(if (not GlbVarArrowLength)
		(progn
			(setq GlbVarArrowLength (getdist "\n Enter length of arrow head: "))
			(setq GlbVarArrowWidth (getdist "\n Enter width of arrow head: "))
		)
	)
	(while (not (equal (type StPt) 'LIST))
		(initget "Single Double Arrow Body")
		(setq StPt
			(getpoint
				(strcat
					"\n Arrow length = "
					(rtos GlbVarArrowLength)
					", Arrow width = "
					(rtos GlbVarArrowWidth)
					", Body width = "
					(rtos GlbVarBodyWidth)
					", Head(s) = "
					GlbVarHeadType
					"\n Select first point [Single/Double headed/Arrow options/Body width]: "
				)
			)
		)
		(if (equal (type StPt) 'STR)
			(cond
				((= StPt "Arrow")
					(setq GlbVarArrowLength (getdist "\n Enter length of arrow head: "))
					(setq GlbVarArrowWidth (getdist "\n Enter width of arrow head: "))
				)
				((= StPt "Body")
					(setq GlbVarBodyWidth (getdist "\n Enter width for main part of pline: "))
				)
				(T
					(setq GlbVarHeadType StPt)
				)
			)
		)
	)
	(if
		(and
			StPt
			(equal (type StPt) 'LIST)
			(setq VecList (list StPt 1))
			(setq StPt (trans StPt 1 0))
			(setq NumList (list (cadr StPt) (car StPt)))
			(setq PtMsg "\n Select next point [Undo]: ")
		)
		(while
			(and
				(not (initget "Undo"))
				(setq tempPt (getpoint (car VecList) PtMsg))
			)
			(setq PtMsg "\r Select next point [Undo]: ")
			(if (= tempPt "Undo")
				(if (> (length NumList) 2)
					(progn
						(redraw)
						(setq NumList (cddr NumList))
						(if (> (length VecList) 2)
							(setq VecList (cdddr VecList))
						)
						(if (> (length VecList) 2)
							(progn
								(setq LastPt (trans (car VecList) 1 0))
								(setq Ang2 (angle LastPt (trans (cadddr VecList) 1 0)))
								(grvecs (reverse (cddr VecList)))
							)
						)
						(if
							(and
								(= GlbVarHeadType "Double")
								(equal (length NumList) 4)
							)
							(progn
								(setq NumList (cddr NumList))
								(setq Ang nil)
							)
						)
					)
					(setq PtMsg "\r   Cannot undo any futher.\n Select next point [Undo]: ")
				)
				(progn
					(setq LastPt (trans (car VecList) 1 0))
					(setq VecList
						(cons
							tempPt
							(cons
								1
								(cons tempPt VecList)
							)
						)
					)
					(setq tempPt (trans tempPt 1 0))
					(if
						(and
							(= GlbVarHeadType "Double")
							(not Ang)
						)
						(progn
							(setq Ang (angle StPt tempPt))
							(setq tempPt2 (polar StPt Ang GlbVarArrowLength))
							(setq NumList
								(cons
									(cadr tempPt2)
									(cons
										(car tempPt2)
										NumList
									)
								)
							)
						)
					)
					(setq Ang2 (angle tempPt LastPt))
					(setq LastPt tempPt)
					(setq NumList
						(cons
							(cadr tempPt)
							(cons (car tempPt) NumList)
						)
					)
					(grvecs (reverse (cddr VecList)))
				)
			)
		)
	)
	(redraw)
	(if (> (length NumList) 2)
		(progn
			(setq tempPt2 (polar LastPt Ang2 GlbVarArrowLength))
			(setq NumList
				(append
					(list (car NumList) (cadr NumList))
					(cons
						(cadr tempPt2)
						(cons
							(car tempPt2)
							(cddr NumList)
						)
					)
				)
			)
			(setq PlObj (vlax-invoke CurSpace 'AddLightWeightPolyline (reverse NumList)))
			(vla-put-ConstantWidth PlObj GlbVarBodyWidth)
			(vla-SetWidth PlObj (- (/ (length NumList) 2) 2) GlbVarArrowWidth 0.0)
			(if (= GlbVarHeadType "Double")
				(vla-SetWidth PlObj 0 0.0 GlbVarArrowWidth)
			)
		)
	)
	(princ)
)
У меня в AutoCAD 2015 rus выдает ошибку:
Команда: ARPLINE ; ошибка: неверный тип аргумента: numberp: nil
Подскажите, пожалуйста, как можно исправить... Спасибо.

Миниатюры
Нажмите на изображение для увеличения
Название: ArPline.png
Просмотров: 85
Размер:	4.3 Кб
ID:	260332  

Просмотров: 1124
 
Непрочитано 03.12.2023, 12:19
#2
Кулик Алексей aka kpblc
Moderator

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


Советую загрузить код в VLIDE, поставить точку останова и смотреть пошагово, что и где идет не так. Ну и заодно выставить "Break on error" в меню "Debug".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2023, 13:09
#3
Ingpro


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


После
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
поставить точку останова
выскакивает окно Инфо :callback-entry
останавливается на 87 строке, или я неправильно понимаю
Код:
[Выделить все]
 (if (> (length VecList) 2)
а что с этим делать?

Последний раз редактировалось Ingpro, 03.12.2023 в 13:15.
Ingpro вне форума  
 
Непрочитано 03.12.2023, 13:34
#4
Кулик Алексей aka kpblc
Moderator

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


Значит в какой-то момент VecList становится nil. На строке 84 надо проверять длину VecList, выяснять, откуда оно вообще берется и теде. Я не зря говорю про точку останова и пошаговое выполнение кода
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2023, 15:07
#5
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
надо проверять длину VecList
Мне это ни о чём не говорит, к сожалению...
Ingpro вне форума  
 
Непрочитано 03.12.2023, 15:34
#6
Кулик Алексей aka kpblc
Moderator

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


Ну, тогда можно обратиться в тему https://forum.dwg.ru/showthread.php?t=22894 (обучение на примере) и спросить почему код не срабатывает.
Кстати, не помешает пример dwg и описание последовательности действий, которые приводят к такой ошибке.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2023, 15:47
#7
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кстати, не помешает пример dwg и описание последовательности действий, которые приводят к такой ошибке.
Команда просит ввести 1-ю - 2-ю точки и ; ошибка: неверный тип аргумента: numberp: nil в любом dwg...
Ingpro вне форума  
 
Непрочитано 03.12.2023, 15:52
#8
Кулик Алексей aka kpblc
Moderator

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


Лично мне за пару десятков попыток пока не удалось "поломать" код.

----- добавлено через 41 сек. -----
Цитата:
Сообщение от Ingpro Посмотреть сообщение
Команда просит ввести 1-ю - 2-ю точки и ; ошибка: неверный тип аргумента: numberp: nil в любом dwg...
Работа в мировой системе координат? Длина стрелки меньше чем длина полилинии?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.12.2023, 16:49
#9
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Работа в мировой системе координат? Длина стрелки меньше чем длина полилинии?
Да и длина стрелки, конечно, меньше длины PL, мне кажется она должна быть стандартной, как стрелка в размере... На картинке из поста #1 всё видно...
Ingpro вне форума  
 
Непрочитано 03.12.2023, 17:26
#10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
мне кажется она должна быть стандартной,
Именно что кажется: длину стрелки задает сам пользователь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.12.2023, 18:37
#11
EStranger


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


Цитата:
Команда просит ввести 1-ю - 2-ю точки и ; ошибка: неверный тип аргумента: numberp: nil в любом dwg...
Проверил (Acad2023) - загрузил, вызвал команду ArPline, при первом запуске она спросила длину стрелки, ширину стрелки и только потом первую и вторую и т.д. точки. Всё абсолютно корректно отработало и изобразило Pline со стрелкой.
При повторном запуске уже длину и ширину не спрашивает, а сразу спрашивает точки, но можно вызвать опцию Arrow options и поменять ранее введенные длину и ширину стрелки. Какую длину и ширину Вы вводили при первом запуске? Введите снова через опцию Arrow options, ну например, длина 5, ширина 2.5 - все должна отрисовать нормально. Мне тоже непонятно о чем Вы рассуждаете когда говорите: ...мне кажется она должна быть стандартной, как стрелка в размере... Какую ВЫ задали - такая и будет отрисована. Вы её задавали? Если при первом запуске вместо цифр длины и ширины просто нажать Enter, то будет ошибка.
EStranger вне форума  
 
Автор темы   Непрочитано 03.12.2023, 19:04
#12
Ingpro


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


Цитата:
Сообщение от EStranger Посмотреть сообщение
Если при первом запуске вместо цифр длины и ширины просто нажать Enter, то будет ошибка
Спасибо, EStranger, задаю длину и ширину - всё нормально...
Привычка - рисовать ПЛ начиная с нач. точки...
Ingpro вне форума  
 
Непрочитано 03.12.2023, 19:48
#13
Кулик Алексей aka kpblc
Moderator

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


Я ж не просто так сказал:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
не помешает <...> описание последовательности действий, которые приводят к такой ошибке.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Полилиния с одной/двумя стрелками на концах



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Моделирование опирания прогонов в SCAD на балку при помощи жестких вставок на концах стержня. Consructor_ingener1 SCAD 12 16.03.2020 14:21
Толстая (прерывистая) полилиния iRun AutoCAD 4 14.02.2011 21:38
Что такое 2D полилиния? Баловник AutoCAD 3 22.01.2009 02:46
Визуальный стиль и полилиния - разладились настройки? discovery AutoCAD 3 23.12.2008 08:07
Как узнать полилиния, построена по часов стрелке или против Paradox Программирование 2 01.02.2005 15:53