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

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

Помогите с лиспом преобразования в vlax-объект

Ответ
Поиск в этой теме
Непрочитано 23.03.2015, 15:37 #1
Помогите с лиспом преобразования в vlax-объект
tujn08
 
Регистрация: 26.12.2013
Сообщений: 283

тип данных после излечения из набора LIST. Как сделать, что бы был ENAME?

Код:
[Выделить все]
 (vl-load-com)
(progn
(setq a (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "pro")))); создали набор
(setq i -1 b (sslength a));счетчик
(setq i (1+ i))
(setq pl (entmake (entget (ssname a i)))); следующий примитив из набора
		(setq d_pl (vlax-curve-getDistAtParam (vlax-ename->vla-object pl) (vlax-curve-getEndParam pl)));перевели в ВЛА объект и получили длину 
		(setq p2 (rtos d_pl)); длина сидит тут в виде текста
		(setq ccord_begin0 (vlax-curve-getPointAtParam pl (vlax-curve-getStartParam pl)));начальная точка примитива
		(setq ccord_finish0 (vlax-curve-getPointAtParam pl (vlax-curve-getEndParam pl)));конечноая точка примитива
		;переводим точки в текст, объединяем списки
		;(setq ccord_begin (strcat (rtos (setq x1 (nth 0 ccord_begin0))) " "
		;						  (rtos (setq y1 (nth 1 ccord_begin0)))))
		(setq x1 (nth 0 ccord_begin0))
		(setq y1 (nth 1 ccord_begin0))
		;переводим точки в текст, объединяем списки
		;(setq ccord_finish (strcat (rtos (setq x2 (nth 0 ccord_finish0))) " "
		;						   (rtos (setq y2 (nth 1 ccord_finish0)))))
		(setq x2 (nth 0 ccord_finish0))
		(setq y2 (nth 1 ccord_finish0))
		
	(princ "\n X1:" x1)
	(princ "\n Y1:" y1)
	(princ "\n X2:" x2)
	(princ "\n Y2:" y2)
	(princ "\n длина:" p2)
);конец 
Просмотров: 4663
 
Непрочитано 23.03.2015, 16:10
#2
Кулик Алексей aka kpblc
Moderator

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


Чего?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2015, 17:42
#3
tujn08


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


И сам немного не понял, когда прочитал. Мне надо создать набор из условий "сложного фильтра". Дальше извлекать из набора примитив и получать его свойства: координаты начала и конца линии.

Возможно есть путь проще.
Полная задача: тут. В текущий момент мне надо найти какие линии имеют общую точку(с условием, что можно будет погрешность задавать) т.е. составить "карту метро", а потом добавить "станции" в виде блоков и искать короткий путь между выбранными блоками.
tujn08 вне форума  
 
Непрочитано 23.03.2015, 17:54
#4
Кулик Алексей aka kpblc
Moderator

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


Сложный фильтр - это всего лишь сложный фильтр. Используй группировку с OR, AND - ИМХО самое то будет. Подробнее - справка по ssget и примеры для него.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2015, 18:04
#5
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сложный фильтр - это всего лишь сложный фильтр.
Я так понял список нужного мне не даст- а так хотелось хранить все примитивы по группам.
Поясните мне как новичку:

Что быстрее: фильтр или OR, AND?
Фильтр занимает меньше строк кода и кажется, что работает быстрее(не проверял конечно). Ну вот к примеру на OR, AND:
Код:
[Выделить все]
 (defun	c:dlina (/)	
;(textscr)
(vl-load-com)
	 (setq pl (entnext) a T)
	 ;(setq 	pl (car(entsel "Выберите объект")))
(while (and a pl);(setq pl (car(entnext))) ; начало цикла
    (if (and (equal (cdr(assoc '0  (entget pl))) "LWPOLYLINE" ) ; сразу два условия (первое)
           (equal (cdr(assoc '8 (entget pl))) "pro" )) ; сразу два условия (второе)
(progn ; выполнит в случае успеха сразу двух условий
		(setq d_pl (vlax-curve-getDistAtParam (vlax-ename->vla-object pl) (vlax-curve-getEndParam pl)))
		(setq p2 (rtos d_pl))
		;(setq ccord_begin0 (vlax-curve-getStartParam pl) ccord_finish0 (vlax-curve-getEndParam pl)) ;получение первой и последней вершины линии, но выдает количество вершин
		(setq ccord_begin0 (vlax-curve-getPointAtParam pl (vlax-curve-getStartParam pl)))
		(setq ccord_finish0 (vlax-curve-getPointAtParam pl (vlax-curve-getEndParam pl)))
		(setq ccord_begin (strcat (rtos (setq x1 (nth 0 ccord_begin0))) " "
								  (rtos (setq y1 (nth 1 ccord_begin0)))))
		;(setq ccord_begin (read ccord_begin0)); использовать nth потом rtos потом strcat
		(setq ccord_finish (strcat (rtos (setq x2 (nth 0 ccord_finish0))) " "
								   (rtos (setq y2 (nth 1 ccord_finish0)))))
		;(setq ccord_finish (cvunit ccord_finish0 listp stringp))
		;(type p2)
		;(setq p3 (list(cdr(assoc '-1  (entget pl)))))
			(setq p3 (vl-prin1-to-string (cdr(assoc '-1  (entget pl)))))
			(setq p3 (strcat "Длина найденной полилинии:   " p2 
						 "\nНачало в (X Y):   " ccord_begin 
						 "\nКонец в (X Y):   " ccord_finish 
						 "\nИмя:   " p3 ))
		(alert p3)
		;(setq d_pl (vlax-vla-object->ename pl))
		;(setq pl d_pl)
		;(setq pl () p2 () p3 () d_pl () );ccord_begin () ccord_finish())
	  )
(progn ; выполнит в случае провала сразу двух условий
		(setq p3 (vl-prin1-to-string (cdr(assoc '-1  (entget pl)))))
		(if (or (/= (cdr(assoc '0  (entget pl))) "LWPOLYLINE" )
		        (= (cdr(assoc '0  (entget pl))) "LWPOLYLINE" ))
	(progn ; выполнит в случае успеха, провала в сразу двух условий
				(setq p4 (cdr(assoc '8 (entget pl))))
				(setq p5 (cdr(assoc '0  (entget pl))))
				;(setq p6 (rtos p5))
				(setq p3 (strcat "Не выполняются условия AND:   "  
								"\nОбъект находится в слое:   " p4
								"\nОбъект является:   " p5
								"\nИмя:   " p3 ))
								(alert p3))
	(progn ; выполнит в случае провала, в провале в сразу двух условий
				(alert "Что-то не так..."))
				;(alert "Не выполняется условие AND")
				;(princ "не выполняется условие AND \n")(princ pl) (terpri);(princ "       ")(terpri)
		)
)
	)
   (setq pl (entnext pl))
)
)
tujn08 вне форума  
 
Непрочитано 23.03.2015, 20:57
#6
Кулик Алексей aka kpblc
Moderator

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


"Неправильно ты, дядя Федор, бутерброд ешь" (с)
Тебе кто мешает сформировать набор таким образом
Код:
[Выделить все]
(setq ss1 (ssget "_X" '((0 . "LWPOLYLINE") (8 . "pro"))))
и потом его уже обрабатывать? И это только самый простой пример.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2015, 21:16
#7
tujn08


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


Смотрим:
Код:
[Выделить все]
 (setq a (ssget "_X" '((0 . "LWPOLYLINE") (8 . "0")))); создали набор
(setq i -1 b (sslength a));счетчик
(setq i (1+ i))
(setq pl (entget (ssname a i)))
TYPE pl = LIST

требуется что бы был ENAME - наборами ни как?
tujn08 вне форума  
 
Непрочитано 23.03.2015, 21:32
1 | #8
Кулик Алексей aka kpblc
Moderator

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


entget убери и будет тебе ename
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2015, 22:59
#9
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
entget убери и будет тебе ename
То, что надо!!! Спасибо!

Вопрос один еще не закрыт:
1) Что быстрее: фильтр или OR, AND?
Просто мне кажется, что OR, AND будет проверять каждый примитив, а список нет. Хотя набор их 30 000 объектов составлялся достаточно долго. Получается любой метод будет перебирать все примитивы не зависимо от того какое условие ставить первым т.е. "искать в слое линию или линию в слое"

В модели больше 500 000 примитивов. Из них надо найти 20 примерно. В любом случае завтра поэкспериментирую. Возможно добавить машинное время для сравнение?-есть код
tujn08 вне форума  
 
Непрочитано 24.03.2015, 00:00
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Что быстрее: фильтр или OR, AND?
это как в хвост и в гриву... в лучшем случае они окажутся равными по скорости, но в твоем случае скорей всего условие выполнится в самом последнем элементе при любой раскладке
gomer вне форума  
 
Непрочитано 24.03.2015, 10:12
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от tujn08 Посмотреть сообщение
В модели больше 500 000 примитивов.
С такими объемами быстрее будет переход на Net/ObjectARX, скорее всего)
Сергей812 вне форума  
 
Автор темы   Непрочитано 24.03.2015, 10:22
#12
tujn08


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


Всем спасибо! Дельные ответы.
tujn08 вне форума  
 
Автор темы   Непрочитано 26.03.2015, 10:09
#13
tujn08


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


Кулик Алексей aka kpblc.

Помоги еще раз. В определении объектов на пересечение ошибка у меня. Надо найти пересечение всех блоки из набора со всеми линиями из другого набора. Если не пересекаются, то выдать ошибку (это недопустимо в чертеже). Если пересекаются, то составить список (карту/дерево) к этому списку я буду добавлять все линии и в конце еще один блок. Дальше длину пути сравнивать, если есть альтернативные, то спрашивать какой выбрать.

Код:
[Выделить все]
 (defun c:zxc (/)
(vl-load-com)
	(progn
(setq a (ssget "_X"  (list (cons 8 "pro") (cons 0 "LWPOLYLINE")))); создали набор линий
(setq a_bl (ssget "_X"  (list (cons 8 "AK_PR") (cons 0 "INSERT"))));набор из блоков
(setq i -1 b (sslength a));начлаьное значение счетчика линий
(setq y -1 s (sslength a_bl)) ;счетчик блоков
(repeat b ;цикл по количеству элементов
	(setq i (1+ i)); счетчик в работе
	(setq pl (ssname a i)) ; берем элемент согласно счетчику из набора
	(set (read(strcat (itoa i) "_dlin")) (vlax-curve-getDistAtParam (vlax-ename->vla-object pl) (vlax-curve-getEndParam pl))); получаем длину в i_dlin
	(set (read(strcat (itoa i) "_x1y1")) (vlax-curve-getPointAtParam pl (vlax-curve-getStartParam pl)));получаем начальные координаты XYZ
	(set (read(strcat (itoa i) "_x2y2")) (vlax-curve-getPointAtParam pl (vlax-curve-getEndParam pl)));получаем конечные координаты XYZ
	(set (read(strcat (itoa i) "_name")) (vl-prin1-to-string (cdr(assoc '-1  (entget pl)))));получаем имя линии
); конец цикла формирование всех переменных
	);конец progn
	(progn ;ищем пересечения блока и линии
	(repeat s
	(setq y (1+ y));счетчик в работе блоков
		(setq pl_bl (ssname a_bl y));берем элемент согласно счетчику из набора блоков
		(setq obj_bl (vlax-ename->vla-object pl_bl));выбрать объект из набора блоков
		(setq obj_lin (vla-IntersectWith obj (vlax-ename->vla-object 
		(setq pl_lin 
		           (progn 
			       (setq i -1 b (sslength a)) ;обнуление счетчика линий 
	               (setq i (1+ i)); счетчик в работе линий
		           (repeat b (ssname a i))
				   (if (> (vlax-safearray-get-u-bound (vlax-variant-value temp) 1)'0) 
			(progn (alert (rtos "Пересекаются")))	
			(progn (alert (rtos "Не пересекаются")))
					);if
				    );progn 
		) ;setq pl_lin 
											) acExtendThisEntity))
		;(setq as (ssname a i)) ;(repeat b 
		;(a i) 
			;(if (> (vlax-safearray-get-u-bound (vlax-variant-value temp) 1)
			;'0) 
			;(progn (alert (rtos "Пересекаются")))	
			;(progn (alert (rtos "Не пересекаются")))
			;)
		;) i)
		;																		) acExtendThisEntity))
		
	); конец цикла
	);конец progn
); конец defun
Вложения
Тип файла: dwg
DWG 2010
Чертеж15.dwg (57.6 Кб, 989 просмотров)
tujn08 вне форума  
 
Непрочитано 26.03.2015, 10:16
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от tujn08 Посмотреть сообщение
vla-IntersectWith
Насколько помню, ищет пересечения только на видимой на экране части чертежа. Т.е. надо запомнить текущее состояние виемпорта модели, отзумировать - чтобы все влезло на экран и потом только обрабатывать.
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.03.2015, 10:28
#15
tujn08


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Насколько помню, ищет пересечения только на видимой на экране части чертежа. Т.е. надо запомнить текущее состояние виемпорта модели, отзумировать - чтобы все влезло на экран и потом только обрабатывать.
Интересно- не знал.
tujn08 вне форума  
 
Непрочитано 26.03.2015, 10:43
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


эта такая же ситуация, как с попыткой выделить мышкой объекты - когда один из углов рамки выбора уходит за пределы экраны, то часть объектов внутри рамки (вне экрана и на границе) будет проигнорирована.. такая реализация у autodesk)
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.03.2015, 11:00
#17
tujn08


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
та такая же ситуация
Это я знаю. Вроде можно же отключать это? Или я с Компасом путаю.
tujn08 вне форума  
 
Непрочитано 26.03.2015, 11:06
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Это я знаю. Вроде можно же отключать это? Или я с Компасом путаю.
Если бы это можно было отключать) Просто с "движком" автокада как-то связано - вначале было сделано так, а потом - уже традиции) И люди просто обходят эти ограничения с помощью зуммирования..
Сергей812 вне форума  
 
Непрочитано 26.03.2015, 11:06
#19
Кулик Алексей aka kpblc
Moderator

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


По-моему, vla-intersectwith глубоко параллельно на видимость объектов. Дело в другом: пересекаться могут несоставные объекты (отрезки, дуги, полилинии). Тексты, таблицы, размеры, блоки, внешние ссылки - это отдельная песня, не всегда гарантирующая нормальный результат.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.03.2015, 11:20
#20
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Дело в другом:
Мне особо не важны эти моменты. У меня будут в основном прямоугольные блоки. Даже, если появятся тексты рядом с блоком- сделаю такие блоки или подвод линии так, что бы погрешность в расстоянии была наименьшей. Сей час мне надо просто получить информацию: если пересечения есть, то добавить в список (скорее всего с ключами), если нет то обработать дальше или выдать ошибку, что пользователь допустил ошибку.

И такая проблема меня мучает: запустил приложение или функцию один два раза - все хорошо. Но вскоре ни одна функция не выдает результата в командной строке- приходится новый чертеж создавать. В чем причина? как устранять?
tujn08 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите с лиспом преобразования в vlax-объект



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение дуг, линий в единый объект, Как объединить? Vladimir.P AutoCAD 41 25.01.2015 08:03
Помогите отклассифицировать проектируемый объект. Clod Прочее. Архитектура и строительство 4 28.01.2012 20:59
Помогите расценить объект Варюшенков Д.Е. Разное 8 02.04.2010 16:24
Помогите преобразовать каркас спиральной канавки в твердотельный объект... Sota AutoCAD 12 06.01.2010 09:33
Помогите создать не AutoCAD-овский ARX объект Caduser AutoCAD 5 24.09.2004 07:59