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

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

lisp: Длина по полилинии до точки

Ответ
Поиск в этой теме
Непрочитано 13.12.2007, 21:57 #1
lisp: Длина по полилинии до точки
vosh
 
Регистрация: 13.12.2007
Сообщений: 45

Добрый.
Гуру выручайте, помогите хотя бы с сутью (придайте ускорение)
Есть полилиния обычная ломаная, с дугами (ось). Есть точка лежащая на этой полилинии либо крайне близкая к ней.
Задачи:
1. Найти длину пути от начала полилинии до точки.
2. В случае если точка "не совсем" на полилинии определить точку пересечения полилинии и перпендикуляра (а если окружность?) опущенного из точки.
Первая задача архи важная. Возможно вторая тоже, но сейчас я ломаю голову над первой
Просмотров: 7030
 
Непрочитано 13.12.2007, 22:15
#2
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я бы сначала вычислил сегмент полилинии, наиболее близкий к координатам точки. Точка имеет X, Y, и Z. Узлы полилинии тоже имеют XYZ вот берем X. Еесли X предидущего узла меньше X точки, а X последующего больше, то по X точка лежит между этими двумя узлами. Тоже с Y и Z. Выявлены два узла полилинии и надо определить тип сегмента дуга или прямая. Если дуга, то ищем радиус, центр дуги и взяв за исходную отметку координаты того узла, от которого надо произвести расчет вычисляем длинну дуги.

Ну а остальное просто берем из свойств полилинии (все остальные сегменты).
Supermax вне форума  
 
Автор темы   Непрочитано 13.12.2007, 22:42
#3
vosh


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


Supermax, спасибо, неожиданно оперативно. Теперь задумался о перпендикуляре. Буду признателен за другие идеи тем более если они будут с кодом.
vosh вне форума  
 
Непрочитано 13.12.2007, 23:22
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Все, что я помню, это то, что плоскость образована тремя точками дуги. Центр дуги, один край и другой. Произвольная точка висит над этой плоскостью и надо определить расстояние до плоскости. Потом считается трехугольник, где гипотенуза - радиус дуги (это если точка внутри дуги, то есть расстояние от центра дуги до точки меньше радиуса дуги). Один катет - расстояние от оточки до центра дуги, высота треугольника - расстояние от точки к плоскости образованной дугой и второй катет вычисляется по эти данным. Все это делается черех XYZ и называется тригонометрией. Полистай справочник.
Supermax вне форума  
 
Непрочитано 14.12.2007, 03:46
#5
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun test (/ ent pt)
  (vl-load-com)
  (if
    (and
      (= (type
           (setq
             ent (vl-catch-all-apply
                   '(lambda ()
                      (entsel
                        "\nПинок на полилинии или чего там надо <Иди нафиг> : "
                        ) ;_ end of entsel
                      ) ;_ end of lambda
                   ) ;_ end of vl-catch-all-apply
             ) ;_ end of setq
           ) ;_ end of type
         'list
         ) ;_ end of =
      (= (type (setq pt
                      (vl-catch-all-apply
                        '(lambda ()
                           (cond
                             ((getpoint
                                "\nА теперь точка <Использовать где тыкал только что> : "
                                ) ;_ end of getpoint
                              )
                             (t (cadr ent))
                             ) ;_ end of cond
                           ) ;_ end of lambda
                        ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'list
         ) ;_ end of =
      ) ;_ end of and
     (alert
       (strcat
         "\nРасстояние от начала выбранного примитива до ближайшей к указанной точке : "
         (rtos (vlax-curve-getdistatpoint
                 (setq ent (vlax-ename->vla-object (car ent)))
                 (vlax-curve-getclosestpointto ent pt)
                 ) ;_ end of vlax-curve-getdistatpoint
               2
               4
               ) ;_ end of rtos
         "\nТо же, от конца (гусары, молчать!) : "
         (rtos (- (vlax-curve-getdistatpoint ent (vlax-curve-getendpoint ent))
                  (vlax-curve-getdistatpoint
                    ent
                    (vlax-curve-getclosestpointto ent pt)
                    ) ;_ end of vlax-curve-getdistatpoint
                  ) ;_ end of -
               2
               4
               ) ;_ end of rtos
         ) ;_ end of strcat
       ) ;_ end of alert
     ) ;_ end of if
  ) ;_ end of defun
Вроде работает...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.12.2007, 09:32
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,861
<phrase 1= Отправить сообщение для VVA с помощью Skype™


1. Расстояние от начала полилинии до опеделенной точки
2. vlax-curve-getclosestpointto или vlax-curve-getClosestPointToProjection даст ближайшую точку к полилинии
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.12.2007, 10:00
#7
vosh


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


Работает! Оба пункта. Так быстро написал код?
vosh вне форума  
 
Автор темы   Непрочитано 14.12.2007, 10:10
#8
vosh


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


VVA, "vlax-curve-getclosestpointto или vlax-curve-getClosestPointToProjection даст ближайшую точку к полилинии", - это комманды lisp? Сорри за вопрос, уже вижу как у тебя потянулись руки писать : "юзай поиск!" Но все же ответа "да" или "нет" было бы достаточно, желательно с указанием названия буманого источника знаний по знаниям этого уровня. Ибо до сего момента приходилось пользоваться рваной информацией по простейшим функциям с помощью которой не представлялось возможным либо усложнялось до нельзя реализация моей идеи. Хотя для мелочевки хватало
vosh вне форума  
 
Непрочитано 14.12.2007, 10:22
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,861
<phrase 1= Отправить сообщение для VVA с помощью Skype™


функции, начинающиеся на vlax-*; vl-*; vla-*; vlr-*; - это функции Visual Lisp, расширения Lisp, загружаемого ф-цией (vl-load-com). Покупай книгу Полещука, общайся на этом форуме и скоро будешь сточить подобные проги так же быстро, как Алексей.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.12.2007, 10:28
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,861
<phrase 1= Отправить сообщение для VVA с помощью Skype™


1. Набери в командной строке VLIDE
2. В том что откроется нажми Ctrl N
3. Набери/скопируй vlax-curve-getclosestpointto, курсор оставь на этом слове и нажми Ctrl F1, затем кнопочку OK
4. Читай
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.12.2007, 21:35
#11
vosh


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


Супермакс, крыс, vva, спасибо за советы. Код Алексея похудел и тут же подрос раз в 5 за сегодня . Идею реализовал, осталось оформление. Походу еще возникнут вопросы но уже мелочевка, очень надеюсь найду на форуме ответы. А если нет то ждите активности в понедельник. За сим откланиваюсь и ухожу с головой выходные
ЗЫ: Полещук рулит!
vosh вне форума  
 
Непрочитано 13.07.2013, 06:29
#12
Ali111


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


Цитата:
Сообщение от vosh Посмотреть сообщение
Добрый.
Гуру выручайте, помогите хотя бы с сутью (придайте ускорение)
Есть полилиния обычная ломаная, с дугами (ось). Есть точка лежащая на этой полилинии либо крайне близкая к ней.
Задачи:
1. Найти длину пути от начала полилинии до точки.
2. В случае если точка "не совсем" на полилинии определить точку пересечения полилинии и перпендикуляра (а если окружность?) опущенного из точки.
Первая задача архи важная. Возможно вторая тоже, но сейчас я ломаю голову над первой
надо малость переделать
Есть полилиния обычная ломаная, с дугами (ось). Есть БЛОК с атрибутами лежащий на этой полилинии либо крайне близкая к ней.
Задачи:
1. Найти длину пути от начала полилинии до БАЗОВОЙ ТОЧКИ БЛОКА .
2. В случае если точка "не совсем" на полилинии определить точку пересечения полилинии и перпендикуляра (а если окружность?) опущенного из БАЗОВОЙ ТОЧКИ БЛОКА.
3. вставить оптом найденные значения длин на пересечениях в атрибут соответствующих блоков


файл прилагается acad2013
Вложения
Тип файла: dwg
DWG 2013
Пример для проставки пикетажа.dwg (113.6 Кб, 2573 просмотров)

Последний раз редактировалось Ali111, 13.07.2013 в 07:04.
Ali111 вне форума  
 
Непрочитано 14.07.2013, 21:07
#13
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Ali111 Посмотреть сообщение
надо малость переделать
Кому надо?
Do$ вне форума  
 
Непрочитано 15.07.2013, 11:00
#14
Ali111


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Кому надо?

Мню надо
Ali111 вне форума  
 
Непрочитано 15.07.2013, 13:26
#15
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


И в чем проблема?
Do$ вне форума  
 
Непрочитано 15.07.2013, 13:40
#16
Ali111


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


не знаю что в коде изменить, чтоб получилось
в частности: как создать список предварительного выбора блоков
как определить длины полилиний до каждого блока
и как применить полученные длины к блокам ничего не перепутав
Ali111 вне форума  
 
Непрочитано 15.07.2013, 13:42
#17
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
И в чем проблема?
Цитата:
Сообщение от Ali111 Посмотреть сообщение
не знаю
пичаль
gomer вне форума  
 
Непрочитано 15.07.2013, 13:54
#18
Ali111


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


Ali111 вне форума  
 
Непрочитано 15.07.2013, 14:43
#19
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Ali111 Посмотреть сообщение
в частности: как создать список предварительного выбора блоков
С помощью SSGET.
Цитата:
Сообщение от Ali111 Посмотреть сообщение
как определить длины полилиний до каждого блока
У выбранных блоков находим точку вставки: DXF код 10 или vla-get-InsertionPoint.
От этой точки вставки определяем расстояния вдоль полилинии, используя функции vlax-curve-...
Цитата:
Сообщение от Ali111 Посмотреть сообщение
и как применить полученные длины к блокам ничего не перепутав
Все делать в цикле, на каждой итерации будет обрабатываться только один блок. В таком варианте ничего не перепутается.
Do$ вне форума  
 
Непрочитано 15.07.2013, 15:10
#20
Ali111


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
С помощью SSGET.

У выбранных блоков находим точку вставки: DXF код 10 или vla-get-InsertionPoint.
От этой точки вставки определяем расстояния вдоль полилинии, используя функции vlax-curve-...

Все делать в цикле, на каждой итерации будет обрабатываться только один блок. В таком варианте ничего не перепутается.
спасибо за дельный совет
попробую разобрать.
и собрать
Ali111 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > lisp: Длина по полилинии до точки

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расстояние от начала полилинии до опеделенной точки bimari AutoCAD 36 08.07.2019 09:18
Координаты точки пересечения line и pline (LISP) paradoxvaha LISP 3 10.07.2007 13:04
Координаты точки, лежащей на полилинии Al_Taron Программирование 1 27.11.2006 09:45
Lisp - проблема с получением точки? Кулик Алексей aka kpblc LISP 3 08.09.2006 15:14
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19