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

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

Autolisp. Поиск пересечения точки с 3дполилинией

Ответ
Поиск в этой теме
Непрочитано 17.11.2010, 11:38 #1
Autolisp. Поиск пересечения точки с 3дполилинией
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, помогите. Есть такой код
Код:
[Выделить все]
(defun spoint ()
  
  (setq b (cons 10 (inter bp1 ug dpoi)))
  (setq w (nth 1 b))
  (if (/= w nil)
    (setq a (cdr b))
    (setq a nil)
  )  

)


(defun inter (bp1 ug dpoi / ss)
  (If (setq
    ss (ssget "_F" (list bp1 (polar bp1 ug dpoi)))
      )
    (cadr (cadddr (car (ssnamex ss))))
  )
)
В нем происходит следующее: есть lwpolyline с ненулевым значением elevation, либо здполилиния с заданной координатой z (не ноль). Тыкаем две точки в любом месте и этот кусок находит координату пересечения наших точек в нуле с первой встречной линией не важно в нуле она или не в нуле. Все круто, но нужно что бы она всегда находила только точки не в нуле, а нулевые как бы не замечала. Т.е. попалась на пути 3д полилиния с высотой 100, я получаю координату пересечения линии и моего отрезка, а если попался какой-нибудь текст или что угодно с высотой ноль либо вообще без высоты, то я пропускаю этот объект и смотрю дальше, пока не встречу 3дполилинию или лвполилинию. Помогите плиз.
Просмотров: 3820
 
Непрочитано 17.11.2010, 12:34
1 | #2
TararykovDG

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


Zaghim, вместо строки
(ssget "_F" (list bp1 (polar bp1 ug dpoi)))
напиши так
(ssget "_F" (list bp1 (polar bp1 ug dpoi)) (list (cons -4 "<OR") (cons -4 "<AND") (cons 0 "POLYLINE") (cons 70 8) (cons -4 "AND>") (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons -4 ">") (cons 38 0) (cons -4 "AND>") (cons -4 "OR>")))
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 17.11.2010, 13:03
#3
Zaghim


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


Спасибо, но к сожалению как-то не корректно работает.

Последний раз редактировалось Zaghim, 17.11.2010 в 13:13.
Zaghim вне форума  
 
Непрочитано 17.11.2010, 13:16
1 | #4
TararykovDG

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


Zaghim, а что возвращает
(setq ss (ssget "_F" (list bp1 (polar bp1 ug dpoi)) (list (cons -4 "<OR") (cons -4 "<AND") (cons 0 "POLYLINE") (cons 70 8) (cons -4 "AND>") (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons -4 ">") (cons 38 0) (cons -4 "AND>") (cons -4 "OR>"))))
(ssnamex ss)

видимо (ssget...) возвращает пустой набор, значит нет ни одного примитива удовлетоворяющего фильтру записанному в ssget.

Нужно разбираться:
(list
(cons -4 "<OR") - начало логического или
(cons -4 "<AND") - начало логического и
(cons 0 "POLYLINE") - выбрать примитивы типа "POLYLINE"
(cons 70 8) - тип "POLYLINE" 3d полилиния
(cons -4 "AND>") - конец логического и
(cons -4 "<AND") - начало логического и
(cons 0 "LWPOLYLINE") - выбрать примитивы типа "LWPOLYLINE"
(cons -4 ">") (cons 38 0) - выбрать LWPOLYLINE у которго уровень больше 0 (нуля)
(cons -4 "AND>") - конец логического и
(cons -4 "OR>") - конец логического или
)
__________________
cadtools

Последний раз редактировалось TararykovDG, 17.11.2010 в 13:21.
TararykovDG вне форума  
 
Автор темы   Непрочитано 17.11.2010, 13:21
#5
Zaghim


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


Я немного не в том месте запустил прогу и она ничего не находила. Сейчас запустил между линий с высотой и в одном месте воткнул текст, так вот пересечения находились все, но в том месте, где текст явно не правильно...

Щас попытаюсь еще раз, может не так поняли меня. В общем при первоначальном варианте если внутри двух линий с высотой был текст, она выберет текст, а нужно что бы она мимо текста пролетела и воткнулась в линию с высотой. Т.е. обратясь к этому куску кода 1 раз она должна выбрать тока линии с высотами и пропустить все остальное, еще проще получить координату пересечения только моего отрезка с объектом имеющим высоту.

Последний раз редактировалось Zaghim, 17.11.2010 в 13:35.
Zaghim вне форума  
 
Непрочитано 17.11.2010, 14:02
1 | #6
TararykovDG

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


В общем-то я так и понял и именно из этих соображений и давал ответ. Так вот, строка кода (ssget "_F" (list bp1 (polar bp1 ug dpoi))) (подсказанная Вам Disney в другой теме) как Вы и сказали формирует набор из всех примитивов чертежа, пересекаемых линией задаваемой точками bp1 и (polar bp1 ug dpoi). Теперь сюда мы добавили фильтр (list (cons -4 "<OR") (cons -4 "<AND") (cons 0 "POLYLINE") (cons 70 8) (cons -4 "AND>") (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons -4 ">") (cons 38 0) (cons -4 "AND>") (cons -4 "OR>")) и получили строку (ssget "_F" (list bp1 (polar bp1 ug dpoi)) (list (cons -4 "<OR") (cons -4 "<AND") (cons 0 "POLYLINE") (cons 70 8) (cons -4 "AND>") (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons -4 ">") (cons 38 0) (cons -4 "AND>") (cons -4 "OR>"))). Т. е. формируем набор из всех примитивов чертежа, пересекаемых линией задаваемой точками bp1 и (polar bp1 ug dpoi) и удовлетворяющих фильтру, а именно наш примитив должен быть либо 3d полилинией, либо обычной ("LWPOLYLINE") полилинией лежащей на не нулевом уровне. Таким образом все остальные примитивы (даже пересекаемые заданной линией) не должны попасть в формируемый набор.
Zaghim, выложи файл чертежа, точки bp1 и (polar bp1 ug dpoi) зарисуй красными окружностями
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 17.11.2010, 14:41
#7
Zaghim


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


Воткнул в код простановку точки, что бы можно было увидеть с чем она пересеклась...вроде текст пропускает...хм хм хм... значит косяк мой при обработке или еще где...буду разбираться. СПАСИБО!!!

Сейчас натыкал кучу текста между линий и прога начала косячить...ничего не понимаю(((

Хрень получается...выкладываю 2 картинки. На первой я откладываю линию, иду по ней с шагом 1 и в каждой точке нахожу пересечения с высотными линиями и смотрю их высоту... потом эту высоту строю в виде графика в 2д виде...смотрите что получается если текст стоит...если его нет идет прямая а тут постоянные обрывы((((
Миниатюры
Нажмите на изображение для увеличения
Название: 111.jpg
Просмотров: 127
Размер:	92.4 Кб
ID:	48357  Нажмите на изображение для увеличения
Название: 222.jpg
Просмотров: 89
Размер:	39.3 Кб
ID:	48358  

Последний раз редактировалось Zaghim, 17.11.2010 в 15:21.
Zaghim вне форума  
 
Непрочитано 17.11.2010, 15:03
#8
TararykovDG

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


Удачи! Да, вот еще я написал так (cons -4 ">") (cons 38 0) - это значит выбрать только те объекты уровень, которых больше нуля, а надо наверное все которые не равны нулю, тогда замени на это (cons -4 "<>") (cons 38 0)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 17.11.2010, 15:23
#9
Zaghim


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


Только в этом случае или вообще везде? Можно полный код, потому что как раз в этом и проблема.
В общем дело не в этом))) Такая же фигня рисуется как на картинке выше...блин(((

Поправка... если это будет такая же лвполилиния или 3дполилиния с 0 высотой или просто линия, она ее пропускает!!!!!!!! А вот с текстом какой-то косяк(((((((

Последний раз редактировалось Zaghim, 17.11.2010 в 15:52.
Zaghim вне форума  
 
Непрочитано 17.11.2010, 15:51
#10
TararykovDG

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Хрень получается...выкладываю 2 картинки.
Да выложи dwg файл или что, там секретные материалы?
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 17.11.2010, 16:13
#11
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Поиск пересечения точки с 3дполилинией
Точка ни с чем пересекаться не может.
Profan вне форума  
 
Непрочитано 17.11.2010, 17:32
#12
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Zaghim, так тебе что нужно, найти одну ближайшую? или сразу все с не лежащими в нуле полилиниями, а по ним профиль построить?
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 17.11.2010, 20:30
#13
Zaghim


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


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

Последний раз редактировалось Zaghim, 17.11.2010 в 20:35.
Zaghim вне форума  
 
Непрочитано 18.11.2010, 08:16
#14
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Ладна... зайдём с другой стороны, какие конкретно данные тебе нужны для построения профиля?
Их можно сразу извлечь(вычеслить) ещё при нахождении ближайшей(или сразу всех пересекаемых полилиний не в 0), а не потом повторно выбирая полилинию в ранее найденной точки.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 18.11.2010, 09:20
#15
Zaghim


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


Я делаю так
Код:
[Выделить все]
(setq ob (ssget "_c" mp1a mp1b))
  (setq ob1 (entget (ssname ob 0)))
  (setq lob (cdr (assoc 0 ob1)))
  (if (equal lob "LWPOLYLINE")
    (setq prob1 (cdr (assoc 38 ob1)))
    (progn
       (setq ob1 (entget (entnext (cdr (car ob1)))))
       (setq prob1 (cdr (assoc 10 ob1)))
       (setq prob1 (nth 2 prob1))
    )
  )
Т.е. если лв полилиния, я беру значение elevation (она же высота), если 3д полилиния, то беру значение координаты Z!
Соответственно точки mp1a mp1b - это небольшие отступы в стороны от точки пересечения с высотной линией, что бы выбрать потом эту же линию... гимморно делаю, знаю...просто на более продвинутый код мозгов не хватает, приходится извращаться...

Последний раз редактировалось Zaghim, 18.11.2010 в 09:27.
Zaghim вне форума  
 
Непрочитано 18.11.2010, 21:37
1 | #16
Кулик Алексей aka kpblc
Moderator

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


Почему-то начинаю подозревать, что код из http://www.cadtutor.net/forum/showth...ll=1#post56521 поможет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.11.2010, 21:47
#17
Zaghim


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


Не могу скачать код, да и с английским плохо. Можно выложить тут и объяснить, что там делается?
Zaghim вне форума  
 
Непрочитано 19.11.2010, 06:38
#18
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
да и с английским плохо
Стыдно инженеру не знать англицкий.

Почитай ту тему на русском с первой страницы, правда там не совсем корректный перевод, но всё же лучше чем никак.

Ну и пока Алексей спит, выложу его код, тебе же явно не терпится
Вложения
Тип файла: zip qp1.zip (9.0 Кб, 90 просмотров)
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 19.11.2010, 09:25
#19
Zaghim


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


Спасибо. Но блин, там не код, а просто кодище... очень хотелось бы что бы работало по существующему коду...те же фильтры или еще что добавить...просто вставлять щас другое очень гиморно, перелопатить всю прогу придется((((
Zaghim вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Поиск пересечения точки с 3дполилинией



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты точки пересечения сплайна и прямой 4_maxim_4 Программирование 1 22.09.2010 06:27
Поиск нормативного документа, указывающего угол пересечения автомобильной дороги и водопропускной трубы *AllA* Поиск литературы, чертежей, моделей и прочих материалов 65 28.06.2010 13:46
Точки пересечения примитивов Ева Программирование 3 11.03.2009 17:12
Нахождение точки пересечения на 3D сети Electa AutoCAD 15 16.12.2008 18:36
Координаты точки пересечения line и pline (LISP) paradoxvaha LISP 3 10.07.2007 13:04