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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Требуется помощь, дабы написать на лиспе программу проверяющую топологию

Требуется помощь, дабы написать на лиспе программу проверяющую топологию

Ответ
Поиск в этой теме
Непрочитано 15.10.2008, 17:59 #1
Требуется помощь, дабы написать на лиспе программу проверяющую топологию
WeMaN
 
Регистрация: 19.08.2008
Сообщений: 52

В автокаде создаю топографические планы. Собственно, возникла острая необходимость написать программу проверки топологии. Смысл объясню сначала на практике, а затем изложу, как я вижу реализацию данного действия.

Итак, практически, имеем, условные знаки (которые являются блоками) и текстовые объекты, эти объекты, при автоматической расстановке, частенько пересекаются друг с другом: бывает блоки условных знаков наползают на текст, блоки наползают друг на друга, текст наползает на текст. Если объектов на планшете порядка несколька тысяч, то отслеживать все пересечения довольно проблематично, поэтому у меня возникла мысль намного облегчить работу.

Далее, собственно, как я вижу предстоящую прогрумму:
- все блоки и текст автоматически обводятся по контуру линиями, получаются прямоугольники по контурам объектов, эти прямоугольники для удобства перекидываются в автоматически создающийся слой (ну к примеру "topologia", причём при повторном запуске программы слой будет называться "topologia2", "topologia3" и т.д.)
- те прямоугольники, которые либо пересекаются, либо находятся на близком расстоянии друг от дуга (ну там какое нить число допуска расстояния придумать самое оптимальное, например расстояние между прямоугольниками меньше "1" так же считается пересечением), ну в общем пересекающиеся прямоугольники остаются на слое, остальные все удаляются нафиг.
- Тем самым, выделив все остающиеся прямоугольники и разукрасив их броским цветом, например красным мы сразу заметим где объекты наползают друг на друга, а где нет. естественно, после устраение всех топологических ошибок слой с прямоугольниками удаляется.

Теперь перечень очевидных (для меня) проблем при реализации:

- Есть ли функция которая текст и блоки по контуру обведёт замнкнутой 4 угольной линией, т.е. прямоугольником?
- С текстом в принципе решение есть, весь текст можно заменить фигурами , и тем самым осуществлять создание прямоугольников по блокам и фигурам(а не текстом), но как это реализовать то?
- И вообще, возможно ли создать слой, и оставить в нём именно те объекты, которые пересекаются?
- Ну и главное, собственно как будет выглядеть функция проверки пересечение прямоугольников, думается мне как проверка одинаковых координат между полилиниями, но тоже непонятно как, может есть какие то уже существующие решение...

В общем, очень надеюсь на помощь специалистов, ради написания данной програмки сел изучать автолисп, но пока знание довольно сыроваты ) Заранее спасибо

ЗЫ
Ежели кто знает ещё какие нибудь программы проверяющие топологию в автокаде, буду очень признателен если поделитесь
Просмотров: 8008
 
Непрочитано 15.10.2008, 18:33
#2
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Кое что ответил здесь.

http://www.caduser.ru/cgi-bin/f1/board.cgi?t=44456SK

Последний раз редактировалось Donhuan, 15.10.2008 в 19:26.
Donhuan вне форума  
 
Автор темы   Непрочитано 15.10.2008, 18:52
#3
WeMaN


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


Можешь ссылку покорректней, а то шота зайти не могу
WeMaN вне форума  
 
Непрочитано 15.10.2008, 23:05
#4
Кулик Алексей aka kpblc
Moderator

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


Куда конкретней-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.10.2008, 23:42
#5
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Да не ссылка действительно корявая была, исправлял
Donhuan вне форума  
 
Непрочитано 16.10.2008, 15:46
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Алгоритм чуть другой но результат такой-же:
Код:
[Выделить все]
(vl-load-com)
(defun sstolist (ss / i lst)
(setq i 0)
(repeat (sslength ss)
(setq lst (append lst (list (ssname ss i))) i (1+ i))
);end of repeat
lst
);end of sstolist

(defun c:topolog ( / ss ss1 lay i )
(setq 	ss (ssget "_x" (list (cons -4 "<OR") (cons 0 "INSERT") (cons 0 "TEXT") (cons 0 "MTEXT") (cons -4 "OR>")))
	ss1 (ssadd))
(if ss
(progn
(setq lay "Topolog" i 1)
(while  (tblsearch "layer" (strcat lay (itoa i)))
(setq i (1+ i))
);end of while
(setq lay (strcat lay (itoa i)) ss (sstolist ss))
(foreach tmp ss
(setq ss (cdr ss))
(foreach tmp2 ss
(if 	(>   
(vlax-safearray-get-u-bound 
(vlax-variant-value 
(vla-IntersectWith (vlax-ename->vla-object tmp) (vlax-ename->vla-object tmp2) acExtendNone)
) 1)
	0)
(progn (ssadd tmp ss1) (ssadd tmp2 ss1))
);end of if
);end of foreach tmp2
);end of foreach tmp
(mapcar '(lambda (obj / minpt maxpt)
(vla-GetBoundingBox (vlax-ename->vla-object obj) 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt) maxpt (vlax-safearray->list maxpt))
(entmakex (list 
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 4)
(cons 70 1)
(cons 8 lay)
(cons 62 1)
(cons 10 minpt)
(cons 10 (list (car minpt) (cadr maxpt)))
(cons 10 maxpt)
(cons 10 (list (car maxpt) (cadr minpt)))
))
);end of lambda
(sstolist ss1)
);end of mapcar
(if (= (sslength ss1) 0)
(princ "Пересекающихся объектов не найдено.\n")
(princ (strcat "Найдено " (itoa (sslength ss1)) " пересекающихся объектов. Выделены с слое " lay "\n"))
)
);end of progn
(princ "Пересекающихся объектов не найдено.\n")
);end if
(princ)
);end of topolog
P.S. Запускать командой TOPOLOG
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 16.10.2008 в 15:58.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.10.2008, 08:51
#7
WeMaN


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


Спасибо тебе большое, ты мне очень сильна помог!
WeMaN вне форума  
 
Непрочитано 17.10.2008, 15:12
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Немного подумав понял что ту же работу можно сделать быстрее в количество раз примерно равное количеству проверяемых элементов (то есть если эл-тов 10000, то и выполняться будет в 10000 раз бытрее):
Код:
[Выделить все]
(vl-load-com)
(defun sstolist (ss / i lst)
(setq i 0)
(repeat (sslength ss)
(setq lst (append lst (list (ssname ss i))) i (1+ i))
);end of repeat
lst
);end of sstolist

(defun c:topolog ( / ss ss1 lay flist i minpt maxpt lstbox)
(setq flist (list (cons -4 "<OR") (cons 0 "INSERT") (cons 0 "TEXT") (cons 0 "MTEXT") (cons -4 "OR>"))	
ss (ssget "_x" flist)
);end of setq
(if ss
(progn
(setq lay "Topolog" i 1)
(while  (tblsearch "layer" (strcat lay (itoa i)))
(setq i (1+ i))
);end of while
(setq lay (strcat lay (itoa i)) ss (sstolist ss) i 0)
(foreach obj ss
(vla-GetBoundingBox (vlax-ename->vla-object obj) 'minpt 'maxpt)
(setq 	minpt (vlax-safearray->list minpt) maxpt (vlax-safearray->list maxpt)
	lstbox (list minpt (list (car minpt) (cadr maxpt)) maxpt (list (car maxpt) (cadr minpt)))
	ss1 (ssget "_CP" lstbox flist)
);end of setq
(if ss1
(if (> (sslength ss1) 1)
(progn
(entmakex (append (list 
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 4)
(cons 70 1)
(cons 8 lay)
(cons 62 1)
);end of list
(mapcar '(lambda (x) (cons 10 x)) lstbox)
));end of entmakex & append
(setq i (1+ i))
);end of progn
));end of if * 2
);end of foreach
(if (= i 0)
(princ "\nПересечений не найдено")
(princ (strcat "\nНайдено " (itoa i) " пересечений, выделенных в слое " lay "." ))
)
);end of progn
(princ "\nОбъектов не найдено")
);end if
(princ)
);end of topolog
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.10.2008, 10:47
#9
WeMaN


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


Ух ты намного быстрее! Раньше он проверял 2000 за 2 минуты, сейчас за 20 секунд! Огромное спасибо!
А в чём была фишка, почему медленно так было?
WeMaN вне форума  
 
Непрочитано 18.10.2008, 20:26
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от WeMaN Посмотреть сообщение
Ух ты намного быстрее! Раньше он проверял 2000 за 2 минуты, сейчас за 20 секунд! Огромное спасибо!
А в чём была фишка, почему медленно так было?
Грубо говоря в первом варианте он проверял кажый элемент к каждому - то есть если 5 эл-тов то проверялось 1-2,1-3,1-4,1-5,2-3,2-4,2-5,3-4,3-5,4-5 - итого 10 проверок, во втором он проверяет каждый элемент по 1 разу. Сама проверка (1 цикл) более долгая, но их количество гораздо меньше.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.10.2008, 18:39
#11
WeMaN


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


намного удобнее, ибо, если на карте около 100 000 объектов, то думается мне проверка не закончилась бы никогда
WeMaN вне форума  
 
Непрочитано 23.01.2011, 22:48
#12
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от WeMaN Посмотреть сообщение
- все блоки и текст автоматически обводятся по контуру линиями, получаются прямоугольники по контурам объектов,
- те прямоугольники, которые либо пересекаются, либо находятся на близком расстоянии друг от дуга (ну там какое нить число допуска расстояния придумать самое оптимальное, например расстояние между прямоугольниками меньше "1" так же считается пересечением), ну в общем пересекающиеся прямоугольники остаются на слое, остальные все удаляются нафиг.
Можно немного уточнить задачу?
1. Прямоугольники ведь не являются настоящими габаритами блоков. Есть блоки-окружности, есть - почти треугольники, есть разной сложной формы. При габаритах-прямоугольниках в одних случаях не найдутся слишком близко расположенные блоки-подписи, а в других случая пометятся реально не пересекающиеся блоки-подписи.
(Для подписей прямоугольных габаритов, наверное, достаточно).
Т.е. нужно находить и анализировать не прямоугольные, а реальные габариты блоков - линией, очерчивающей все входящие в блоки элементы.
2. Допуск на пересечение-наложение желательно дать возможность определять самому пользователю.
АлексЮстасу на форуме  
 
Непрочитано 23.01.2011, 22:50
#13
Кулик Алексей aka kpblc
Moderator

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


Есть сильное желание объединить эту тему и http://forum.dwg.ru/showthread.php?t=46571
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.01.2011, 22:55
#14
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть сильное желание объединить эту тему и http://forum.dwg.ru/showthread.php?t=46571
Темы очень родственные, есть общее - габариты блоков-подписей, но у каждой задачи вроде бы своя специфика?

В дополнение к #12:
3. При повторных запусках хорошо бы удалять предыдущие габариты пересекающихся блоков-подписей.

Последний раз редактировалось АлексЮстасу, 23.01.2011 в 23:45.
АлексЮстасу на форуме  
 
Непрочитано 24.01.2011, 00:07
#15
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Т.е. нужно находить и анализировать не прямоугольные, а реальные габариты блоков - линией, очерчивающей все входящие в блоки элементы.
2. Допуск на пересечение-наложение желательно дать возможность определять самому пользователю.
Представь блок - три кружочка расположенные как углы равностороннего треугольника - а теперь скажи где проходят его "реальные габариты".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2011, 00:34
#16
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Представь блок - три кружочка расположенные как углы равностороннего треугольника - а теперь скажи где проходят его "реальные габариты".
Согласен!
Должен был написать "габариты, близкие к реальным". Для трех кружочков, наверное, достаточно габарита-треугольника.
АлексЮстасу на форуме  
 
Непрочитано 24.01.2011, 01:32
#17
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Поверь мне на слово - термины "реальные габариты", "габариты близкие к реальным", "чтоб было красиво", "причесать" и пр. - для автокада далекие понятия. Попробуй описать задачу более конкретными выражениями - "пересекает", "совпадает" - только не торопись - семь раз отмерь...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2011, 03:29
#18
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Поверь мне на слово - термины "реальные габариты", "габариты близкие к реальным", "чтоб было красиво", "причесать" и пр. - для автокада далекие понятия. Попробуй описать задачу более конкретными выражениями - "пересекает", "совпадает" - только не торопись - семь раз отмерь...
Виноват, не сразу сообразил, а вначале должен был сказать: примерно одновременно с появлением этой темы - осенью же, параллельно и независимо, KAI тоже неплохо решил эту задачу.
Я увлекся предложениями "из любви к искусству".

Хорошо поставил ты вопрос - теперь мучаюсь.
Шаг, которым можно обобщать габариты - 0.2 рабочих единицы.
Найти самые удаленные от центра блока точки, и соединить?
А прямоугольные габариты относительно чего определяются?
АлексЮстасу на форуме  
 
Непрочитано 24.01.2011, 11:33
#19
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Шаг, которым можно обобщать габариты - 0.2 рабочих единицы.
Найти самые удаленные от центра блока точки, и соединить?
А прямоугольные габариты относительно чего определяются?
1. Честное слово - я не понимаю что такое "обобщить габариты" с шагом 0.2 единицы.
2. Самая удаленная точка может быть одна (если несколько - то только в случае что они равноудаленны от центра - какой смысл их соединять).
3. Берутся самые нижняя, верхняя, лева и правая точки - и строится прямоугольник высший У-левейший Х, высший У-правейший Х, нижайший У-правейший Х, нижайший У-левейший Х.
Когда созреет идея (алгоритм) попробуй сам (или попроси коллегу) сделать пару манипуляций строго по ней - сразу станет понятно.
p.s. пойми правильно - я ни грамма не прикалываюсь, просто общаемся мы немного на разных языках.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2011, 18:38
#20
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Дима_ Посмотреть сообщение
1. Честное слово - я не понимаю что такое "обобщить габариты" с шагом 0.2 единицы.
2. Самая удаленная точка может быть одна (если несколько - то только в случае что они равноудаленны от центра - какой смысл их соединять).
3. Берутся самые нижняя, верхняя, лева и правая точки - и строится прямоугольник высший У-левейший Х, высший У-правейший Х, нижайший У-правейший Х, нижайший У-левейший Х.
Когда созреет идея (алгоритм) попробуй сам (или попроси коллегу) сделать пару манипуляций строго по ней - сразу станет понятно.
p.s. пойми правильно - я ни грамма не прикалываюсь, просто общаемся мы немного на разных языках.
Вот так KAI строит габариты блоков.
С учетом заданного допуска на пересечения.
Причем, учитывает и штриховки (Hatch), оставшиеся без границ, и динамические блоки, и их атрибуты, полилинии с переменной шириной, и т.п.
Судя по всему, габариты строятся всегда выпуклым контуром, что для данных блоков (их размеры сравнимы с размерами допусков) вполне приемлемо. Видно, что габариты упрощены ("обобщены") с некоторым шагом (здесь - примерно 0.3).
Но как такой принцип построения габаритов описать правильными словами - я пока не придумал.
Миниатюры
Нажмите на изображение для увеличения
Название: Габариты_блоков.jpg
Просмотров: 90
Размер:	14.1 Кб
ID:	52238  
АлексЮстасу на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Требуется помощь, дабы написать на лиспе программу проверяющую топологию