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

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

Пересечения объектов

Ответ
Поиск в этой теме
Непрочитано 14.11.2014, 09:06 #1
Пересечения объектов
sam_n
 
Регистрация: 04.06.2013
Сообщений: 34

Хочу написать на VBA программку, которая бы определяла накладываются ли на чертеже объекты друг на друга, для проверки оформления чертежа.
Конечно же сразу выбор пал на IntersectWith, но из-за того, что он сравнивает каждый объект с каждым (цикл в цикле) на больших чертежах виснет ужасно.
Может у кого есть предложения, как можно избавиться от вложенного цикла? Не обязательно на VBA, LISP тоже подойдет.
Можно ли непосредственно без цикла найти объекты, пересекающие заданный?
Просмотров: 3799
 
Непрочитано 14.11.2014, 09:52
#2
Кулик Алексей aka kpblc
Moderator

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


Так пересечение или наложение? И чем не нравится overkill?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.11.2014, 10:07
#3
VVA

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


В дополнение к #2 TotalPurge
Цитата:
Основные возможности послойной оптимизации чертежа:
•Поиск и удаление дублирующих объектов.
•Поиск и удаление объектов расположенных в области перекрытия других объектов.
•Поиск и замена одним примитивом двух и более сонаправленных объектов образующих узел сопряжения.
•Поиск и замена одним примитивом двух и более сонаправленных объектов расположенных с частичным перекрытием друг относительно друга.
...
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.11.2014, 10:35
#4
Сергей812


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


Насколько понимаю, здесь идет речь о том - чтобы выноски, блоки и прочие элементы чертежа не налезали друг на друга и были полностью читаемыми.
Сергей812 вне форума  
 
Непрочитано 14.11.2014, 10:40
#5
Кулик Алексей aka kpblc
Moderator

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


Это еще один вариант. Который решается вообще отдельным алгоритмом (как мне кажется).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.11.2014, 11:57
#6
sam_n


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


Нет, здесь совсем в другом дело.
Привязываю много чужих чертежей. Они зеркаляться и немного меняются. Чтобы не просматривать каждый чертеж, хочу через HighLight выделить накладывающиеся объекты (см. рис.).
Да и в целом полезная штука будет.

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это еще один вариант. Который решается вообще отдельным алгоритмом (как мне кажется).
А каким?)
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 57
Размер:	162.8 Кб
ID:	138705  
sam_n вне форума  
 
Непрочитано 14.11.2014, 12:26
#7
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


Цитата:
Сообщение от sam_n Посмотреть сообщение
А каким?)
http://en.wikipedia.org/wiki/Automatic_label_placement
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 14.11.2014, 12:38
#8
sam_n


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


Цитата:
Сообщение от bargool Посмотреть сообщение
ссылка-то конечно интересная, но, bargool, ты мне предлагаешь все заново перечерчивать?
sam_n вне форума  
 
Непрочитано 14.11.2014, 12:49
#9
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


Цитата:
Сообщение от sam_n Посмотреть сообщение
ссылка-то конечно интересная, но, bargool, ты мне предлагаешь все заново перечерчивать?
Неа. Это если захочешь автоматически размещать.
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 14.11.2014, 13:06
#10
sam_n


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


Цитата:
Сообщение от bargool Посмотреть сообщение
Неа. Это если захочешь автоматически размещать.
спасибо)
sam_n вне форума  
 
Непрочитано 14.11.2014, 20:10
#11
Дима_

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


чего-то такое уже писал
з.ы. и тут дописывал
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.11.2014, 21:07
#12
sam_n


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
чего-то такое уже писал
з.ы. и тут дописывал
Аха... Дима, это получается ты IntersectWith заменил GetBoundingBox и вместо вложенного цикла проверяешь количество объектов внутри контура?
Пока еще не попробовал у себя, но идея отличная.
sam_n вне форума  
 
Автор темы   Непрочитано 18.11.2014, 08:29
#13
sam_n


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


Попробовал сначала сделать так

Код:
[Выделить все]
 pnt3 = objSelSet.Item(i).GetBoundingBox(pnt1, pnt2) 'границы текста
curobjSet.Select acSelectionSetCrossing, pnt2, pnt1 'набор с объектами внутри границ текста
If curobjSet.Count>1 Then objSelSet.Item(i).Highlight True 'если в наборе больше одного объекта, выделяем текст
Но выделение происходило не секущей рамкой, а обычной. То есть, если только часть объекта попадает в границы текста, он не выделяется.
Тогда сделал через лисп.

Код:
[Выделить все]
 pnt3 = objSelSet.Item(i).GetBoundingBox(pnt1, pnt2) 'границы текста
MyModelSpace.SendCommand "(setq curObject (ssget ""_C"" '(" & pnt2(0) & " " & pnt2(1) & ") '(" & pnt1(0) & " " & pnt1(1) & "))) " 'набор с объектами внутри границ текста
MyModelSpace.SendCommand "(setvar ""USERI1"" (sslength curObject)) " 'в vba передаю через системную переменную
If MyModelSpace.GetVariable("USERI1") >1 Then objSelSet.Item(i).Highlight True 'если в наборе больше одного объекта, выделяем текст
все работает как надо за исключением одного факта, если рассматриваемый объект на экране крупный, то все отлично
(setq curObject (ssget "_C" '(428505.472855683 -16045.090204883) '(428142.814881789 -16195.090204883))) <Selection set: 2a3>
(setvar "USERI1" (sslength curObject)) 1

Но если сделать его очень мелким
(setq curObject (ssget "_C" '(428505.472855683 -16045.090204883) '(428142.814881789 -16195.090204883))) <Selection set: 2cc>
(setvar "USERI1" (sslength curObject)) 11

То есть захватывает лишние объекты, которых по факту там нет. Как видно координаты рамки одни и те же, OSMODE в 0 результатов не дал. Есть у кого-нибудь идеи по этому поводу?
sam_n вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Пересечения объектов



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Аттестация в Минрегионе по негосударственной экспертизе Людмила Охр Прочее. Архитектура и строительство 350 14.02.2015 17:50
Развертка линии пересечения 3D объектов alextv Программирование 3 14.06.2009 19:30
Нахождение точек пересечения объектов с заданной погрешностью на VBA helpstud Программирование 3 07.05.2009 17:28
Линия пересечения объектов в 3d, где она? fefe AutoCAD 3 01.02.2007 11:10