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

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

LISP.как сделать аналог boundary?

Ответ
Поиск в этой теме
Непрочитано 07.04.2011, 15:03 #1
LISP.как сделать аналог boundary?
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 445

я хочу написать аналог boundary для прямоугольников.т.е пространство ограничено четыремя линиями.у меня есть только одна мысль,что после указания точки внутри прямоугольника лисп будет перебирать все примитивы через vlax-curve-getClosestPointTo и найдя четыре минимальных расстояния ,выберет 4 линии и найдет их точки пересечения.правда еще надо будет проверить на их пересечение или наоборот параллельность,так как таких прямоугольников много на чертеже.есть ли какой нибудь более простой способ?например можно ли от точки построить ортогональные линии в 4 направления от нее, и найти первый примитив который с каждой из них пересекается?
Просмотров: 2080
 
Непрочитано 07.04.2011, 16:08
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Не совсем конкретно
Прямоугольник в твоем понимании - это 4 отдельных линии (или 4 отдельных полилинии),
или это замкнутая 4-х вершинная полилиния которая создается
командой "rectanglе" ???
И если отдельные, то как они соприкасаются: только в крайних точках (тогда юзай команду "pedit")
или они продолжаются за точки пересечения -
смотрим "bpoly"
Приложенный рисунок тоже ускорил бы ответ,
хотя я пас
Только мысли вслух...
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 07.04.2011, 16:25
#3
Composter

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


вот есть файл,в нем раскладка панелей.линии разделяют эти панели.я хочу написать лисп ,что бы я щелкал внутри любой ячейки,он определял точки пересечения линий.
Вложения
Тип файла: dwg
DWG 2004
111.dwg (241.2 Кб, 437 просмотров)
Composter вне форума  
 
Непрочитано 07.04.2011, 16:52
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Composter, А сама _boundary чем не подходит? Есть еще и _-boundary
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.04.2011, 16:55
#5
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Composter, как намекнул VVA, типа так

Код:
[Выделить все]
 
(defun rect_bound( / last_obj lst_points)
  (while (vl-cmdf "_.-boundary" (getpoint "\nУкажите внутреннюю точку: ") "")
    (setq last_obj (entlast))
    (if (= (cdr (assoc 0 (entget last_obj))) "LWPOLYLINE")
      (progn
        (setq lst_points (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) (entget last_obj))))
        (entdel last_obj)
        )
      )
    (prompt (strcat "Точки пересечения линий: " (vl-princ-to-string lst_points)))
    )
  )
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 07.04.2011, 17:21
#6
Composter

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


ну во-первых мне не нужна линия,а точки пересечения нужны,для последующей вставки в них динамического блока.
во вторых boundary иногда глючит,особенно если линии доведены не до конца.
ну а в последних приходится порой работать в чужих файлах.для примера попробуйте в прикрепленном файле окно обвести с помощью boundary.
а с помощью метода IntersectWith можно найти пересечение линий,если их условно продлить
Вложения
Тип файла: dwg
DWG 2004
222.dwg (172.8 Кб, 478 просмотров)
Composter вне форума  
 
Автор темы   Непрочитано 14.04.2011, 15:58
#7
Composter

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


вот что у меня получилось
Код:
[Выделить все]
(defun c:zod47 ( / pt1 pt2 pt3 ray1 ray2 ray3 ray4 min_dist1 min_dist2 min_dist3 min_dist4 spisok1 xl1 xl2 xl3 xl4 din_at)
(defun spisok->spisok3 (n)
(if	(listp(car(reverse n)))
	n
	(append (list (list(car n)(cadr n)(caddr n))) (spisok->spisok3(cdddr n)))
)
)
(setq
min_dist1 (distance (getvar "EXTMAX")(getvar "EXTMin"))
min_dist2 (distance (getvar "EXTMAX")(getvar "EXTMin"))
min_dist3 (distance (getvar "EXTMAX")(getvar "EXTMin"))
min_dist4 (distance (getvar "EXTMAX")(getvar "EXTMin"))
)
(setq pt1 (getpoint "Укажите точку"))
(setq ray1(vla-addray
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))pt1)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))(list (car pt1)(1+(cadr pt1))(caddr pt1)))
))
(setq ray2(vla-addray
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))pt1)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))(list (1+(car pt1))(cadr pt1)(caddr pt1)))
))
(setq ray3(vla-addray
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))pt1)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))(list (car pt1)(1-(cadr pt1))(caddr pt1)))
))
(setq ray4(vla-addray
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))pt1)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt1) 1)))(list (1-(car pt1))(cadr pt1)(caddr pt1)))
))
(mapcar '(lambda (ent_name)
	(cond	(	(listp(vl-catch-all-apply 'vlax-safearray->list(list(vlax-variant-value(vla-IntersectWith ray1 (vlax-ename->vla-object ent_name)0)))))
				(progn
					(setq n 0
						spisok1 (vlax-safearray->list(vlax-variant-value(vla-IntersectWith ray1 (vlax-ename->vla-object ent_name)0)))
					)
					(mapcar '(lambda(x)
						(if	(< (distance pt1 x)min_dist1)
							(setq	min_dist1 (distance pt1 x)
								pol_pt1 x
							)
						)	)
					(spisok->spisok3 spisok1))
					(setq spisok1 nil)
				)
			)
			(	(listp(vl-catch-all-apply 'vlax-safearray->list(list(vlax-variant-value(vla-IntersectWith ray2 (vlax-ename->vla-object ent_name)0)))))
				(progn
					(setq n 0
						spisok1 (vlax-safearray->list(vlax-variant-value(vla-IntersectWith ray2 (vlax-ename->vla-object ent_name)0)))
					)
					(mapcar '(lambda(x)
						(if	(< (distance pt1 x)min_dist2)
							(setq	min_dist2 (distance pt1 x)
								pol_pt2 x
							)
						)	)
					(spisok->spisok3 spisok1))
					(setq spisok1 nil)
				)
			)
			(	(listp(vl-catch-all-apply 'vlax-safearray->list(list(vlax-variant-value(vla-IntersectWith ray3 (vlax-ename->vla-object ent_name)0)))))
				(progn
					(setq n 0
						spisok1 (vlax-safearray->list(vlax-variant-value(vla-IntersectWith ray3 (vlax-ename->vla-object ent_name)0)))
					)
					(mapcar '(lambda(x)
						(if	(< (distance pt1 x)min_dist3)
							(setq	min_dist3 (distance pt1 x)
								pol_pt3 x
							)
						)	)
					(spisok->spisok3 spisok1))
					(setq spisok1 nil)
				)
			)
			(	(listp(vl-catch-all-apply 'vlax-safearray->list(list(vlax-variant-value(vla-IntersectWith ray4 (vlax-ename->vla-object ent_name)0)))))
				(progn
					(setq n 0
						spisok1 (vlax-safearray->list(vlax-variant-value(vla-IntersectWith ray4 (vlax-ename->vla-object ent_name)0)))
					)
					(mapcar '(lambda(x)
						(if	(< (distance pt1 x)min_dist4)
							(setq	min_dist4 (distance pt1 x)
								pol_pt4 x
							)
						)	)
					(spisok->spisok3 spisok1))
					(setq spisok1 nil)
				)
			)
	)
	)
(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
)
(setq xl1(vla-addxline
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt1) 1)))pol_pt1)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt1) 1)))(list (1+(car pol_pt1))(cadr pol_pt1)(caddr pol_pt1)))
))
(setq xl2(vla-addxline
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt2) 1)))pol_pt2)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt2) 1)))(list (car pol_pt2)(1+(cadr pol_pt2))(caddr pol_pt2)))
))
(setq xl3(vla-addxline
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt3) 1)))pol_pt3)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt3) 1)))(list (1+(car pol_pt3))(cadr pol_pt3)(caddr pol_pt3)))
))
(setq xl4(vla-addxline
(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt4) 1)))pol_pt4)
(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pol_pt4) 1)))(list (car pol_pt4)(1+(cadr pol_pt4))(caddr pol_pt4)))
))
(setq 
pt2	(vlax-safearray->list(vlax-variant-value(vla-IntersectWith xl1 xl2 0)))
pt3	(vlax-safearray->list(vlax-variant-value(vla-IntersectWith xl3 xl4 0)))
)
(vla-erase xl1)
(vla-erase xl2)
(vla-erase xl3)
(vla-erase xl4)
(vla-erase ray1)
(vla-erase ray2)
(vla-erase ray3)
(vla-erase ray4)
(setq din_at
	(vlax-safearray->list(vlax-variant-value(vla-GetDynamicBlockProperties
		(vla-InsertBlock	(vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object)))
					(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0 (- (length pt3) 1)))pt3)
					d_block_name
					1.0 1.0 1.0 0.0)
	)))
)
(mapcar	'(lambda (name)
			(cond
					((equal (vla-get-PropertyName name) "Dlina")			(vla-put-value name (vlax-make-variant (-(car pt2)(car pt3))))			)
					((equal (vla-get-PropertyName name) "Visota")			(vla-put-value name (vlax-make-variant (-(cadr pt2)(cadr pt3))))			)
				)
				)
din_at)
(princ)
)
соответсвенно список ss1 и блок сс1 я до этого задал.мож это еще как нить можно оптимизировать?а то если до этого выделить кучу лишних примитивов в список ss1 то очучается заметное обрабатывание этого количества примитивов.я вот еще что подумал,вот в этой теме http://forum.dwg.ru/showthread.php?t=14528 авторы предлагают либо вручную вычертить примитив либо выбрать замкнутую линию(я не все предложенные варианты испробовал),можно использовать мой вариант,по крайней мере это хорошо для архитекторов которые проставляют площадь помещений,а в них уже отрисованы дверные проемы.правда с оговоркой что нужно тыкать ,что бы ортогонали от точки не попадали в дверной проем
Composter вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP.как сделать аналог boundary?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти пустые контуры АлексЮстасу Программирование 4 26.02.2011 02:54
Как сделать курсив GOST Type A (или B) в размерных выносках? igor_skor AutoCAD 5 22.01.2011 11:42
некорректная и неустойчивая работа BOUNDARY в режиме "Pick Points" АлексЮстасу Баги и пожелания в Autodesk 10 25.03.2010 03:39
Как сделать автонумерацию блоков? Сергей123 Программирование 1 24.01.2006 17:20