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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как получить указатель на вложенные в блоки объекты по вычисленной точке?

Как получить указатель на вложенные в блоки объекты по вычисленной точке?

Ответ
Поиск в этой теме
Непрочитано 06.07.2009, 15:35 #1
Как получить указатель на вложенные в блоки объекты по вычисленной точке?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,844

Доброго всем!
Суть такова: программно вычисляется некая точка в пространстве модели. Точка практически гарантированно находится вне экрана ("не видна"). Необходимо получить указатели на объекты, проходящие через эту точку, с указателями на описания блоков и внешних ссылок, в которые входят эти объекты.
nentselp с указанием в качестве параметра этой точки возвращает nil, если точка находится вне активного экрана. Аналогичный результат (точнее, его отстутствие) выдает и ssget с ключами типа _+W:V.
Хочется в результате получить список вида
Код:
[Выделить все]
'((Указатель на объект) (Указатель на вхождение блока-владельца) <...> (Указатель на вхождение внешней ссылки))
Выполнять постоянный (vla-zoomall (vlax-get-acad-object)) и (vla-zoomprevious (vlax-get-acad-object)) не годится - модель достаточно тяжелая и регенерироваться будет недопустимо долго. Проход по всем примитивам, конечно, попытаться реализовать можно, но это слишком тяжело будет - многоуровневые вложения внешних ссылок и блоков повергают меня в трепет.
Посоветуйте, пожалуйста, метод, гарантированно возвращающий список самого объекта и его владельцев. Спасибо.
---
P.S. Используется AutoCAD Architecture 2008 Eng + SP1.
P.P.S. Для примера: можно нарисовать отрезок с координатами от '(0. 0. 0.) до '(10. 20. 30.), pan'ом смесить изображение за границы экрана и выполнить в vlide или ком.строке
Код:
[Выделить все]
(nentselp '(0. 0. 0.))
---
Добавлено: через указанную точку может проходить несколько объектов, получать указатели надо на все. К сожалению, это критично
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 06.07.2009 в 15:59.
Просмотров: 4145
 
Непрочитано 06.07.2009, 20:44
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Доброго всем!
Суть такова: программно вычисляется некая точка в пространстве модели. Точка практически гарантированно находится вне экрана ("не видна"). Необходимо получить указатели на объекты, проходящие через эту точку, с указателями на описания блоков и внешних ссылок, в которые входят эти объекты.
nentselp с указанием в качестве параметра этой точки возвращает nil, если точка находится вне активного экрана. Аналогичный результат (точнее, его отстутствие) выдает и ssget с ключами типа _+W:V.
Хочется в результате получить список вида
Код:
[Выделить все]
'((Указатель на объект) (Указатель на вхождение блока-владельца) <...> (Указатель на вхождение внешней ссылки))
Выполнять постоянный (vla-zoomall (vlax-get-acad-object)) и (vla-zoomprevious (vlax-get-acad-object)) не годится - модель достаточно тяжелая и регенерироваться будет недопустимо долго. Проход по всем примитивам, конечно, попытаться реализовать можно, но это слишком тяжело будет - многоуровневые вложения внешних ссылок и блоков повергают меня в трепет.
Посоветуйте, пожалуйста, метод, гарантированно возвращающий список самого объекта и его владельцев. Спасибо.
---
P.S. Используется AutoCAD Architecture 2008 Eng + SP1.
P.P.S. Для примера: можно нарисовать отрезок с координатами от '(0. 0. 0.) до '(10. 20. 30.), pan'ом смесить изображение за границы экрана и выполнить в vlide или ком.строке
Код:
[Выделить все]
(nentselp '(0. 0. 0.))
---
Добавлено: через указанную точку может проходить несколько объектов, получать указатели надо на все. К сожалению, это критично
А почему нельзя перед этим сместиться в эту точку
Код:
[Выделить все]
(command "._zoom" "_C" pt 1.0)
затем
Код:
[Выделить все]
(ssget (list (car pt)(cadr pt)) (list (cons 0 "Чё надо")))
потом обработка результата и возврат в окопы:
Код:
[Выделить все]
(command "._zoom" "_p")
Впрочем ты ж так пробовал наверняка...

~'J'~
Олег (jr.) вне форума  
 
Непрочитано 06.07.2009, 23:02
#3
VVA

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


Кулик Алексей aka kpblc, Автокада под рукой нет, чтобы проверить, но ,как говорится, в порядке бреда:
1. ssget за пределами экрана выбирать не хочет. Но обладают ли такими недостатками activeX методы ?. Я имею ввиду vla-select, vla-SelectByPolygon, vla-SelectAtPoint. Пример можно посмотреть у MENZI ENGINEERING: VxSsetSelect - ActiveX counterpart to 'ssget'
2. Объект точка (POINT) тоже имеет метод IntersectWith. Создаешь в нужной координате точку (Или как вариант создать маленький прямоуголькик по размеру прицела или с нужными тебе допусками. Это, наверное, даже лучше.) и перебором посмотреть что ее (его) пересекает.
Таким образом (если один из вариантов сработает) можно получить указатели на блоки или внешние ссылки. А вот как получить указатель на пересекаемый объект блока - вопрос.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.07.2009, 23:27
#4
Кулик Алексей aka kpblc
Moderator

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


Олег (jr.), спасибо Но, к сожалению, применение командных методов моментально приводит к регенерации модели (да и vla-zoom* Добавлено: тоже потребует в результате выполнения регенерации). А это приличные потери времени - от 20 секунд и выше.
VVA, спасибо, но... Я не уверен, что ActiveX-методы построения набора поддерживают ключи типа _:U или _:V. Спасибо за наводку, полезу в справку
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 06.07.2009 в 23:33.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.07.2009, 10:55
#5
Дима_

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


А если точка лежит внутри GetBoundingBox'а пойдет? Если да и файлы большие то можно создать одним рекурсивным сканированием (по блокам и ссылкам) список по всем объектам с координатами pt1,pt2, Далее взять максимально возможное значение по х (ну допустим xmax=1000000000) и записать все точки в виде y*xmax=x, отсоритровать по обоим точкам (что то типо двух таблиц по pt1-объект, pt2-объект). После этого берем произвольную точку xy преобразуем ее в число и сразу отсекаем по принципу больше меньше все ненужные объекты - если объектов действительно много - думаю будет быстрей на порядок, а может и на несколько.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 07.07.2009, 10:58
#6
Кулик Алексей aka kpblc
Moderator

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


Да, похоже, так и придется делать. С постоянным polar и trans...
Что называется, "брутальный" метод.
Спасибо
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.07.2009, 11:28
#7
Дима_

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


А зачем постоянный транс и полар?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 07.07.2009, 11:39
#8
Кулик Алексей aka kpblc
Moderator

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


Так блоки-то имеют точку вставки не только '(0. 0. 0.), да и угол поворота у них не обязательно 0
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.07.2009, 12:34
#9
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Но ведь Акад "внутри себя" как-то определяет все эти вещи? Если это не вынесено в интерфейсы LISP и ActiveX, надо копать в направлении ARX...

PS Мне, конечно, легко говорить, т. к. сам в ARX не шарю Гуру ARX, отзовитесь!
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как получить указатель на вложенные в блоки объекты по вычисленной точке?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удобней копировать объекты VVN AutoCAD 15 20.10.2016 01:24
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как получить объекты из блока? ivspec Программирование 4 03.04.2006 15:35
Как получить таблицу свойств объектов такую же как в OrCad passat AutoCAD 1 08.12.2004 01:12