Помогите с лиспом преобразования в 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)
);конец 
Просмотров: 4677
 
Непрочитано 23.03.2015, 16:10
#2
Кулик Алексей aka kpblc
Moderator

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


Чего?
__________________
Моя библиотека 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,426


Сложный фильтр - это всего лишь сложный фильтр. Используй группировку с 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,426


"Неправильно ты, дядя Федор, бутерброд ешь" (с)
Тебе кто мешает сформировать набор таким образом
Код:
[Выделить все]
(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,426


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


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


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


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

И такая проблема меня мучает: запустил приложение или функцию один два раза - все хорошо. Но вскоре ни одна функция не выдает результата в командной строке- приходится новый чертеж создавать. В чем причина? как устранять?
tujn08 вне форума  
 
Непрочитано 26.03.2015, 11:30
#21
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По-моему, vla-intersectwith глубоко параллельно на видимость объектов
Насколько помню, когда пробовал использовать аналогичную функцию в ActiveX/Interop для автонумерации блоков "на ходу" при рисовании полилинии через нее - то при уходе предыдущего узла полилинии за пределы экрана пересечение получить не удавалось.

И видел программу лисповскую (скомпилированную в fas) - которая автоматически нумеровала блоки по полилинии.. так она заметно дергала экран по зуму на всю полилинию, инициализировала атрибуты блоков и потом возвращалась обратно.
Сергей812 вне форума  
 
Непрочитано 26.03.2015, 12:08
#22
gomer

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И видел программу лисповскую (скомпилированную в fas) - которая автоматически нумеровала блоки по полилинии.. так она заметно дергала экран по зуму на всю полилинию, инициализировала атрибуты блоков и потом возвращалась обратно.
возможно там проблема была не с vla-intersectwith а с ssget
gomer вне форума  
 
Непрочитано 26.03.2015, 12:44
1 | #23
Кулик Алексей aka kpblc
Moderator

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


Вот этому коду глубоко параллельно, на экране примитивы или нет...
Код:
[Выделить все]
 (vl-load-com)

(defun zxc (/ fun_intersect _kpblc-conv-selset-to-ename _kpblc-conv-vla-to-list ss_pline ss_insert adoc obj res)

  (defun fun_intersect (pline insert line / _res)
    (or ((lambda ()
           (vla-put-startpoint line (vlax-3d-point (cdr (assoc "min" insert))))
           (vla-put-endpoint
             line
             (vlax-3d-point
               (list (cadr (assoc "min" insert))
                     (caddr (assoc "max" insert))
                     (cadddr (assoc "min" insert))
                     ) ;_ end of list
               ) ;_ end of vlax-3d-point
             ) ;_ end of vla-put-EndPoint
           (_kpblc-conv-vla-to-list (vla-intersectwith pline line acextendnone))
           ) ;_ end of lambda
         )
        ((lambda ()
           (vla-put-startpoint
             line
             (vlax-3d-point
               (list (cadr (assoc "min" insert))
                     (caddr (assoc "max" insert))
                     (cadddr (assoc "min" insert))
                     ) ;_ end of list
               ) ;_ end of vlax-3d-point
             ) ;_ end of vla-put-StartPoint
           (vla-put-endpoint line (vlax-3d-point (cdr (assoc "max" insert))))
           (_kpblc-conv-vla-to-list (vla-intersectwith pline line acextendnone))
           ) ;_ end of lambda
         )
        ((lambda ()
           (vla-put-startpoint
             line
             (vlax-3d-point
               (list (cadr (assoc "max" insert))
                     (caddr (assoc "min" insert))
                     (cadddr (assoc "min" insert))
                     ) ;_ end of list
               ) ;_ end of vlax-3d-point
             ) ;_ end of vla-put-StartPoint
           (vla-put-endpoint line (vlax-3d-point (cdr (assoc "max" insert))))
           (_kpblc-conv-vla-to-list (vla-intersectwith pline line acextendnone))
           ) ;_ end of lambda
         )
        ((lambda ()
           (vla-put-startpoint line (vlax-3d-point (cdr (assoc "min" insert))))
           (vla-put-endpoint
             line
             (vlax-3d-point
               (list (cadr (assoc "max" insert))
                     (caddr (assoc "min" insert))
                     (cadddr (assoc "min" insert))
                     ) ;_ end of list
               ) ;_ end of vlax-3d-point
             ) ;_ end of vla-put-endpoint
           (_kpblc-conv-vla-to-list (vla-intersectwith pline line acextendnone))
           ) ;_ end of lambda
         )
        ) ;_ end of or
    ) ;_ end of defun


  (defun _kpblc-conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar (function _kpblc-conv-vla-to-list) value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (= (type value) 'vla-object)
            (vlax-property-available-p value 'count)
            ) ;_ end of and
       (vlax-for sub value
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (if (and (setq ss_pline (mapcar
                            (function vlax-ename->vla-object)
                            (_kpblc-conv-selset-to-ename (ssget "_X" '((0 . "LWPOLYLINE") (8 . "pro") (67 . 0))))
                            ) ;_ end of mapcar
                 ) ;_ end of setq
           (setq ss_insert (mapcar (function (lambda (x / minp maxp)
                                               (vla-getboundingbox (setq x (vlax-ename->vla-object x)) 'minp 'maxp)
                                               (setq minp (vlax-safearray->list minp)
                                                     maxp (vlax-safearray->list maxp)
                                                     ) ;_ end of setq
                                               (list (cons "obj" x)
                                                     (cons "min" minp)
                                                     (cons "max" maxp)
                                                     ) ;_ end of list
                                               ) ;_ end of lambda
                                             ) ;_ end of function
                                   (_kpblc-conv-selset-to-ename (ssget "_X" '((0 . "INSERT") (8 . "AK_PR") (67 . 0))))
                                   ) ;_ end of mapcar
                 ) ;_ end of setq
           ) ;_ end of and
    (progn
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (setq obj (vla-addline
                  (vla-get-modelspace adoc)
                  (vlax-3d-point '(0. 0. 0.))
                  (vlax-3d-point '(0. 10. 0.))
                  ) ;_ end of vla-AddLine
            ) ;_ end of setq
      (setq res (mapcar
                  (function
                    (lambda (pline_obj)
                      (list (cons "pline" pline_obj)
                            (cons "insert"
                                  (mapcar (function (lambda (x) (cdr (assoc "obj" x))))
                                          (vl-remove-if-not
                                            (function
                                              (lambda (ins_obj)
                                                (fun_intersect pline_obj ins_obj obj)
                                                ) ;_ end of lambda
                                              ) ;_ end of function
                                            ss_insert
                                            ) ;_ end of vl-remove-if-not
                                          ) ;_ end of mapcar
                                  ) ;_ end of cons
                            ) ;_ end of list
                      ) ;_ end of lambda
                    ) ;_ end of function
                  ss_pline
                  ) ;_ end of mapcar
            ) ;_ end of setq
      (vla-erase obj)
      (vla-endundomark adoc)
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun

(defun c:test (/ color)
  ;; Проверка работы функции zxc
  (setq color 1)
  (foreach item (zxc)
    (vla-put-color (cdr (assoc "pline" item)) color)
    (setq color (1+ color))
    (foreach obj (cdr (assoc "insert" item))
      (vla-put-color obj color)
      ) ;_ end of foreach
    (setq color (1+ color))
    ) ;_ end of foreach
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.03.2015, 13:27
#24
tujn08


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


буду изучать, но..
Код:
[Выделить все]
  (
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa787c8>) ("insert" #<VLA-OBJECT IAcadBlockReference 000000002b2551b8>)) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78888>) ("insert"))
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78948>) ("insert" #<VLA-OBJECT IAcadBlockReference 000000003a919ca8>)) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78a08>) ("insert" #<VLA-OBJECT IAcadBlockReference 000000002b255538>)) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78ac8>) ("insert"))
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78f48>) ("insert")) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78dc8>) ("insert")) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa790c8>) ("insert" #<VLA-OBJECT IAcadBlockReference 000000003a919bc8>)) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa78d08>) ("insert")) 
 (("pline" . #<VLA-OBJECT IAcadLWPolyline 000000003aa79248>) ("insert" #<VLA-OBJECT IAcadBlockReference 000000003a919ca8> #<VLA-OBJECT IAcadBlockReference 000000003a919d88>))
 )
я так понял 5 линий остались свободными. Ааа пардон ))) цель то другая. Я уже решил, что полностью мою задачу решили, а тут только нахождение линий и блоков которые пересекаются. Я с VLA объектами еще не дружу

Спасибо!

----- добавлено через ~2 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот этому коду
Начал разбирать, но до таких программ мне еще далеко.
Коротко закомментировать сможешь?
Мне не понятно зачем нам изменять свойства (vla-put-startpoint line) и другие defun
Вложения
Тип файла: dwg
DWG 2010
Чертеж18.dwg (58.2 Кб, 474 просмотров)
tujn08 вне форума  
 
Непрочитано 26.03.2015, 17:47
#25
VVA

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


Есть готовое решение
Учти так же, что
Цитата:
Сообщение от Лентяй Посмотреть сообщение
Участвует потому, что метод vla-IntersectWith учитывает и блоки, но (ВНИМАМНИЕ!) учитывает не пересечение ЭЛЕМЕНТОВ БЛОКОВ, а их ГАБАРИТОВ (boundaries), получаемых методом vla-getBoundingBox.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.03.2015, 18:47
#26
tujn08


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Есть готовое решение
От туда и брал часть кода. Как ни крути мне надо самому написать LISP иначе не разберусь. Про габариты блока знаю еще до программирования.
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