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

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

проверка линий на параллельность

Ответ
Поиск в этой теме
Непрочитано 20.07.2009, 12:26 #1
проверка линий на параллельность
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 445

у меня есть лисп , аналог команды trim.

Код:
[Выделить все]
(defun c:zod99 (/ obj ss1)
(princ "\nпродляет или обрезает линии до пересечения с выбранной")
(setq obj (vlax-ename->vla-object(car(entsel))))
(setq ss1(vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))
(setq ss1 (vl-remove obj(mapcar 'vlax-ename->vla-object ss1)))
(mapcar '(lambda(name)
	(if	(not	(or	(equal	(-
						(atof(angtos(vla-get-angle obj)0 1))
						(atof(angtos(vla-get-angle name)0 1))
					)
				0)
				(equal	(-
						(atof(angtos(vla-get-angle obj)0 1))
						(atof(angtos(vla-get-angle name)0 1))
					)
				180)

			)
		)
		(progn
			(setq intpt(vlax-safearray->list(vlax-variant-value(vla-IntersectWith obj name 3))))
			(if	(>
					(DISTANCE (vlax-curve-getStartPoint name) intpt)
					(DISTANCE (vlax-curve-getEndPoint name) intpt)
				)
				(vla-put-EndPoint name (vlax-3d-point intpt))
				(vla-put-StartPoint name (vlax-3d-point intpt))
			)
			)
		)
	)
ss1)
(princ)
)
в середине лиспа идет проверка на паралельность линий, либо паралельных только визуально.если попадается полилиния вместо отрезка то выскакивает ошибка(знаю что можно через vl-catch-all-apply можно избавиться от этого).мне интересно есть ли какой нибудь другой способ на проверку паралельности(включая полилинии если они состоят из 2 точек)?
Просмотров: 3948
 
Непрочитано 20.07.2009, 12:55
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Я бы сделал так:
Код:
[Выделить все]
(defun paralel (pt1 pt2 pt3 pt4);паралельность прямых pt1-pt2, pt3-pt4.
(or	(equal (getvektor pt1 pt2) (getvektor pt3 pt4) 0.001)
	(equal (getvektor pt1 pt2) (getvektor pt4 pt3) 0.001)
);end of or
);end of paralel
(defun getvektor (pt1 pt2 / tmp); единичный вектор направления заданный точками pt1 pt2.
(setq tmp (mapcar '- pt1 pt2))
(if (not (equal tmp '(0.0 0.0 0.0)))
(mapcar '(lambda (x) (/ (float x) (apply 'max (mapcar 'abs tmp)))) tmp)
);end of if
);end of getvektor
И подставляй конечные точки.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 20.07.2009 в 17:31.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.07.2009, 15:45
#3
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


одно но.некоторые прямые не являются абсолютно паралельными,т.е. визуально начерчены паралельно а по данным расхождеие в 1 тысячную.и они соединятся далеко за пределами чертежа. как можно определить границы чертежа?
Composter вне форума  
 
Непрочитано 20.07.2009, 16:03
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Исправил код (все время про эти допуски забываю) на 0.001.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.07.2009, 16:18
#5
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


а для чего две проверки .по моему можно обойтись одной
(equal (getvektor pt1 pt2) (getvektor pt3 pt4) 0.001)
ведь значение берется по модулю и от перестановки местами pt3 и pt4 ничего не измениться.
все таки хотелось бы знать как определить границы чертежа.
Composter вне форума  
 
Непрочитано 20.07.2009, 17:02
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Composter Посмотреть сообщение
а для чего две проверки .по моему можно обойтись одной
(equal (getvektor pt1 pt2) (getvektor pt3 pt4) 0.001)
ведь значение берется по модулю и от перестановки местами pt3 и pt4 ничего не измениться.
Меняется. Вектора '(0 0 1) и '(0 0 -1) разнонаправленные, но параллельные.
Цитата:
Сообщение от Composter Посмотреть сообщение
все таки хотелось бы знать как определить границы чертежа.
(getvar "EXTMIN") и (getvar "EXTMAX")
Александр Ривилис вне форума  
 
Непрочитано 20.07.2009, 17:28
#7
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


ИМХО для проверки лучше использовать векторное произведение
zamtmn вне форума  
 
Автор темы   Непрочитано 20.07.2009, 17:32
#8
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


за переменные спасибо.
так вот в этом месте,
(mapcar 'abs tmp)
функция избавляется от минусов.вроде не должно получиться -1
Composter вне форума  
 
Непрочитано 20.07.2009, 17:32
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Добавил в #2 проверку на одинаковость точек (раньше вылетало по ошибке деления на ноль).
то composer (apply 'max (mapcar 'abs tmp)) - вернет естественно всегда положительное число, но на него делиться (float x) - который может быть и отрицательным - в итоге знак сохраняеться. Начерти любую линию и (getvektor (getpoint) (getpoint)) в одну и другую сторону - увидишь что вектор изменится.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 20.07.2009 в 17:41.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.07.2009, 21:00
#10
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


торможу.ну тогда можно добавить одну команду что бы целую строку не писать
(mapcar '(lambda (x) (/ (abs(float x)) (apply 'max (mapcar 'abs tmp)))) tmp)
Composter вне форума  
 
Непрочитано 21.07.2009, 00:59
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Тогда у тебя вектор неверный получится - всегда положительный - (-1 1 0) паралелен (1 -1 0), но не (1 1 0) - последний ему строго перпендикулярен.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.07.2009, 01:30
#12
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


убедил.
еще вопрос.я вот таким образом проверяю лежит ли точка пересечения в границах чертежа
Код:
[Выделить все]
(and
	(>=(car intpt)(car(getvar "EXTMIN")))
	(<=(car intpt)(car(getvar "EXTMAX")))
	(>=(cadr intpt)(cadr(getvar "EXTMIN")))
	(<=(cadr intpt)(cadr(getvar "EXTMAX")))
)
можно ли это сделать по другому?

Последний раз редактировалось Composter, 21.07.2009 в 12:35.
Composter вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > проверка линий на параллельность



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Объединение дуг, линий в единый объект, Как объединить? Vladimir.P AutoCAD 41 25.01.2015 08:03
Печать со скрытием линий вызывает ошибку Autocad-приложения и его закрытие. BM60 AutoCAD 7 27.04.2009 20:10
Близко расположенные линии в чертеже сливаются. Wowik53 AutoCAD 50 01.11.2008 21:40
Как Извлечь из строки числа Kostinok Программирование 7 12.08.2008 08:00