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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Поиск блоков пересекающих полилинию

Поиск блоков пересекающих полилинию

Ответ
Поиск в этой теме
Непрочитано 03.08.2015, 16:07 #1
Поиск блоков пересекающих полилинию
tujn08
 
Регистрация: 26.12.2013
Сообщений: 284

Привет!
Помогите найти/написать функцию:
1) есть полилинии
2) есть дин.блоки
3) есть 2Д точки: начало и конец на полилинии (между точками могут быть несколько вершин). Эти точки могу являться как началом и концом полилинии, так и просто точки на линии

надо найти все блоки у которых точка вставки блока находится на участке п.3
Просмотров: 20838
 
Непрочитано 03.08.2015, 17:53
#2
Кулик Алексей aka kpblc
Moderator

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


Ну и в чем собственно вопрос? Получить точку вставки дин.блока, найти ближайшую к нему на полилинии, сверить расстояние с 0 (возможно, с некоторой точностью).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.08.2015, 18:39
#3
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Опять шлейф с пожарными датчиками?

----- добавлено через ~2 мин. -----
http://forum.dwg.ru/showthread.php?t=82243
Nike вне форума  
 
Автор темы   Непрочитано 03.08.2015, 20:23
#4
tujn08


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


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

Цитата:
Сообщение от Nike Посмотреть сообщение
Опять шлейф с пожарными датчиками?
Почти - кабельный журнал под несколько разделов сразу см.выше ответ.

----- добавлено через 45 сек. -----
Блоки с переходом высоты тут не размещал еще
Вложения
Тип файла: dwg
DWG 2010
тестовый_файл_для_cable_magazine 24_07_15 - копия.dwg (126.1 Кб, 1476 просмотров)
tujn08 вне форума  
 
Непрочитано 03.08.2015, 20:32
#5
Кулик Алексей aka kpblc
Moderator

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


tujn08, ну йопырысыты! Ты просил алгоритм (поскольку ни кода не предоставил с указанием места "на котором споткнулся", ни языка не обозначил) - я тебе его дал. Этого что, мало?

----- добавлено через 53 сек. -----
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Вспомним задачу про короткий "путь между станциями метро"
Вспоминать не собираюсь. У тебя была поставлена конкретная задача:
Цитата:
Сообщение от tujn08 Посмотреть сообщение
надо найти все блоки у которых точка вставки блока находится на участке п.3
Остальное - лишнее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.08.2015, 21:16
#6
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Остальное - лишнее.
Не понял предложение. Что лишнее?


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

PS
блок могут пересекать сразу несколько линий (на "перекрестке"). Не суть Влияет- просто для информации

----- добавлено через ~13 мин. -----
Щас припоминаю, что есть функция поиска к ближайшей точке (вершине), но надо будет создавать дополнительные вершины на линии- так?
tujn08 вне форума  
 
Непрочитано 03.08.2015, 22:01
#7
Кулик Алексей aka kpblc
Moderator

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


Поехали с самого начала... На каком языке пишешь? Под AutoCAD или клон-кад?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.08.2015, 23:14
#8
Сергей812


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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
2) блок должен находиться между двумя точками (найденными заранее), но при этом быть на линии (п.1)- как это реализовать?
уравнение прямой, проходящей через две точки? Ну еще, естественно, с учетом погрешности.
Сергей812 вне форума  
 
Непрочитано 04.08.2015, 02:30
1 | #9
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от tujn08 Посмотреть сообщение
3) есть 2Д точки: начало и конец на полилинии (между точками могут быть несколько вершин). Эти точки могу являться как началом и концом полилинии, так и просто точки на линии
как вариант
запомнить как есть, обрезать полилинии в этих точках, на полученной полилинии найти блоки, вернуть все как было...
roaa вне форума  
 
Автор темы   Непрочитано 04.08.2015, 07:36
#10
tujn08


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
уравнение прямой, проходящей через две точки?
Добрался до работы - из файл думаю будет понятно.

log- промежуточная информация для понимания и отладки
cable_magazine - длина между блоков.
На пути от блока до блока могут быть другие блоки, от которых и надо получить дополнительное расстояние.
Просто уравнение прямой не подойдет т.к. трасса может быть проложена "змейкой".
Вложения
Тип файла: dwg
DWG 2010
тестовый_файл_для_cable_magazine 24_07_15 - копия.dwg (228.5 Кб, 1277 просмотров)
Тип файла: rar Desktop.rar (2.2 Кб, 19 просмотров)
tujn08 вне форума  
 
Непрочитано 04.08.2015, 07:36
#11
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Не подходит.
Вспомним задачу про короткий "путь между станциями метро", где станции это блоки, "метро"(если так можно выразиться- рельсы) - это полилинии.
Функцию по нахождению пути по максимально трем полилиниям написал. Одна полилиния может пересекать несколько блоков (переход высоты с отметки на отметку- например арка через догору). Нужно найти только те блоки которые попадают в определенный отрезок (в большинстве случаев это не вершины линии).
Offtop: "Ты втираешь мне какую-то дичь" (с)

Точка вставки блока есть, координаты точек, между которыми искать, есть. Какие, (простите) нахрен, несколько линий? Какие перепады высоты? Ощущение, что изобретается велосипед, но при этом разговор идет о влиянии массонов на устойчивость Эйфелевой башни.
RNB вне форума  
 
Автор темы   Непрочитано 04.08.2015, 07:46
#12
tujn08


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


Цитата:
Сообщение от RNB Посмотреть сообщение
Точка вставки блока есть, координаты точек, между которыми искать, есть.
Вот точки 1 и 2. надо найти блоки между ними на линии.
Я пояснял всю ситуацию до этого.

----- добавлено через ~36 мин. -----

Натолкнуло на мысль:
Если расстояние от Конца линии до Первой точки меньше чем расстояние от конца до проверяемой точки
И
Если расстояние от Начала линии до Ввторой точки меньше чем расстояние от конца до проверяемой точки
То проверяемая точка лежит между Первой и Второй точками.
Предварительно проверить какая точка из двух лежит ближе к началу линии.

----- добавлено через 32 сек. -----
всем спасибо!
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 76
Размер:	10.9 Кб
ID:	154376  

Последний раз редактировалось tujn08, 04.08.2015 в 08:23.
tujn08 вне форума  
 
Непрочитано 04.08.2015, 09:39
#13
Сергей812


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


Ну я вообще бы искал пересечение полилинии с блоком.. потому что промахнулся пользователь, плюхнул блок рядом с полилинией. Визуально для него блок на полилинии, а реально алгоритм на определении нахождения точки вставки блока на сегменте полилинии будет этот блок пропускать.. или наоборот - при большой дельте захватывать и соседние блоки. А пересечение - в инете примеров более чем. А уж когда нашел полилинию - найти, к каким ближайшим смежным двум ее вершинам ближе всего вставка блока - задача тривиальная. Если это вообще нужно.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.08.2015, 10:00
#14
tujn08


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


Я тоже хотел найти точки пересечения блока с линией, но выдаются минимум 3 точки- включая атрибутов которых не видно + габариты блока. Тот же блок может пересекать и другую линии. Это не то,что нужно.
Вот я искал точку вставки блока с концом линии с точностью - вполне гуд. А щас начал ломать голову как найти на участке это пересечение ))).
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ну я вообще бы искал пересечение полилинии с блоком
----- добавлено через ~5 мин. -----
к примеру:
(79.7366 217.659 -1.0e-008
134.718 217.659 -1.0e-008
134.718 217.659 1.0e-008
79.7366 217.659 1.0e-008)

не вижу нужной: (104.84 217.65 0.0)
tujn08 вне форума  
 
Непрочитано 04.08.2015, 10:32
#15
Сергей812


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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Я тоже хотел найти точки пересечения блока с линией, но выдаются минимум 3 точки- включая атрибутов которых не видно + габариты блока. Тот же блок может пересекать и другую линии. Это не то,что нужно.
Вот я искал точку вставки блока с концом линии с точностью - вполне гуд. А щас начал ломать голову как найти на участке это пересечение ))).
Хотите сделать полностью автоматическую систему? - тогда должна быть проведена нормализация (стандартизация) имен слоев и т.д. Настраиваться связи - каким кабелям в каких слоях данный блок может подсоединяться - для возможности фильтрации. А пересечение блоков с полилинией-чтобы только найти данную полилинию, а потом DistanceTO(Точка вставки блока) для поиска ближайших вершин полилинии.

----- добавлено через ~7 мин. -----
p.s. Давно отказался от попыток сделать полностью автоматическую систему - так как овчина не стоит выделки, имхо.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.08.2015, 11:19
#16
tujn08


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
(стандартизация) имен слоев и т.д
Это и делаю ))
1) стандартизация
2) автматизация
3) увеличение качества и объемов.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А пересечение блоков с полилинией-чтобы только найти данную полилинию,
надо другой метод я считаю. Блок громоздкий и следовательно будет пересекать несколько линий- усложнит хоть и не намного.
Надо проверить принадлежит ли точка этой линии - дальше по алгоритму как писал выше.
tujn08 вне форума  
 
Непрочитано 04.08.2015, 12:20
#17
Сергей812


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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
надо другой метод я считаю. Блок громоздкий и следовательно будет пересекать несколько линий- усложнит хоть и не намного.
Надо проверить принадлежит ли точка этой линии - дальше по алгоритму как писал выше.
Пробуйте. Вы сейчас по сути пытаетесь теоретически предугадать все возможные "шишки" и "подводные камни", на которых спотыкались целые команды разработчиков вертикальных решений/программ для автоматизации проектирования) только опытным путем на реальных задачах выясняются все плюсы и минусы.
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.08.2015, 12:43
#18
tujn08


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


Значит сделаю просто:
1) проверка на пересечение блокИ-линия
2) проверю все точки пересекающих блоков на нахождение их между нужными точками
Условия:
1) точка вставки должна быть почти на линии ( используем радиус от концов участка, погрешность уже становиться большой, если точка не по центру участка линии). Попасть в центр нужного участка - маленькая вероятность, что радует.
2) блок не должен пересекать другие линии - уже проблемотично т.к. габариты блока довольно большие. (делить блок на два разных блока?! - не серьезно...)
Мда... надо подумать еще варианты
tujn08 вне форума  
 
Непрочитано 04.08.2015, 12:54
#19
Сергей812


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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Попасть в центр нужного участка - маленькая вероятность, что радует.
и не надейтесь.. все возможные варианты надо рассматривать)
Сергей812 вне форума  
 
Непрочитано 04.08.2015, 13:53
#20
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от tujn08 Посмотреть сообщение
1) есть полилинии
2) есть дин.блоки
3) есть 2Д точки: начало и конец на полилинии (между точками могут быть несколько вершин). Эти точки могу являться как началом и концом полилинии, так и просто точки на линии
Накидал на скорую руку. Останется найти блоки на этой полилинии, а этого на форуме найти можно много...
Код:
[Выделить все]
 
(defun _poly_copy ( poly pt1 pt2 / plcopy pozp)
;;; Функция копирования полилинии от точки до точки
;;; Аргументы:
;;;   poly - vla-object или ent name полилинии
;;;   pt1, pt2 - точки
;;; Вызов:
;;; (_poly_copy (car (entsel))(getpoint "\n1:")(getpoint "\n2:"))
;;; Возвращает vla созданной полилинии

(defun LM:ListsUnion ( l / x u )
;;---------------------=={ Lists Union }==--------------------;;
;;                                                            ;;
;;  Returns a list expressing the union of a set of lists     ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  l - a list of lists for which to return the union         ;;
;;------------------------------------------------------------;;
;;  Returns:  A list of distinct items in the set of lists    ;;
;;------------------------------------------------------------;;
;|
_$ (LM:ListsUnion '((1 2 3 4 5) (1 3 5 7 9) (2 4 6 8)))
(1 2 3 4 5 7 9 6 8)
|;
  (setq l (apply 'append l))
  (while (setq x (car l)) (setq u (cons x u) l (vl-remove x l)))
  (reverse u)
)

(defun _sensor_row_num ( n0 nx )
;;; функция раскладки числа на ряд чисел
;;;   nx - число конечное
;;;   n0 - число начальное
;;; Вызов: (_sensor_row_num 1 5)
;;; Возврат (1 2 3 4 5)
  (cond 
    ((and (= (type n0) 'INT)(= (type nx) 'INT))
     (setq res nil)
     (if (> nx n0)
       (repeat (1+ (- nx n0))(setq res (cons nx res)  nx (1- nx)))
       (repeat (1+ (- n0 nx))(setq res (cons nx res)  nx (1+ nx)))
     )
     res
    )
  )
)

  (cond
        ((eq (type poly) 'ENAME)
         (_poly_copy (vlax-ename->vla-object poly) pt1 pt2)
        )
        ((not pt1)
         (setq pt1 (vlax-curve-getStartPoint poly))
         (_poly_copy poly pt1 pt2)
        )
        ((not pt2)
         (setq pt2 (vlax-curve-getEndPoint poly))
         (_poly_copy poly pt1 pt2)
        )
        ((> (vlax-curve-getDistAtPoint poly pt1)(vlax-curve-getDistAtPoint poly pt2))
         (_poly_copy poly pt2 pt1)
        )
        ((and
           (setq plcopy (vla-copy poly))
           (setq temp (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates plcopy))))
         )
         (setq pozp 
                    (LM:ListsUnion 
                      (mapcar '(lambda (x)(list (setq xt (* x 2))(1+ xt)))
                        (_sensor_row_num 
                          (atoi (rtos (vlax-curve-getParamAtPoint plcopy pt1)))
                          (1+ (atoi (rtos (vlax-curve-getParamAtPoint plcopy pt2))))
                        )
                      )
                    )
               
         )
         (setq tempp nil)
         (mapcar '(lambda (poz)(setq tempp (cons (nth poz temp) tempp))) pozp)
         (setq tempp (reverse tempp)
               tempp (subst (car pt1)(nth 0 tempp) tempp)
               tempp (subst (cadr pt1)(nth 1 tempp) tempp)
               tempp (reverse (subst (car pt2)(nth 1 (reverse tempp))(reverse tempp)))
               tempp (reverse (subst (cadr pt2)(nth 0 (reverse tempp))(reverse tempp)))
         )
         (vla-put-coordinates plcopy 
           (vlax-make-variant 
             (vlax-safearray-fill
	             (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length tempp)))) 
	             tempp
	           )
	         )
	       )
	       plcopy
        )
        (t nil)
  )
)

Последний раз редактировалось roaa, 04.08.2015 в 14:06.
roaa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Поиск блоков пересекающих полилинию

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
AutoCAD 2012 Поиск по атрибутам блоков yurka52rus AutoCAD 8 17.07.2020 12:09
Lisp. Поиск блоков в файлах и замена атрибутов AlexKey LISP 3 12.09.2013 16:39