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

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

аналог ssget или определение наличия примитива в точке

Ответ
Поиск в этой теме
Непрочитано 11.01.2006, 21:33 #1
аналог ssget или определение наличия примитива в точке
sv_ispu
 
проектирование,монтаж,наладка
 
Иваново
Регистрация: 14.11.2005
Сообщений: 20

Координаты точки занесены в переменную pt. нужно выяснить проходят ли через эту точку примитивы. Все происходит в пространстве модели в текущем чертеже. Ответ должен быть либо дя, либо нет. Все просто...
С помощью
Код:
эта точка проверяется только в том случае, когда ее видно на экране, иначе возвращяется nil. Как еще можно проверить точку на наличие примитивов?
Просмотров: 5658
 
Непрочитано 11.01.2006, 23:14 Re: аналог ssget или определение наличия примитива в точке
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от sv_ispu
Координаты точки занесены в переменную pt. нужно выяснить проходят ли через эту точку примитивы. Все происходит в пространстве модели в текущем чертеже. Ответ должен быть либо дя, либо нет. Все просто...
С помощью
Код:
эта точка проверяется только в том случае, когда ее видно на экране, иначе возвращяется nil. Как еще можно проверить точку на наличие примитивов?
Мне кажется логичным перед использованием функции SSGET
в этом случае всегда сначала ставить:

Код:
[Выделить все]
(command "_.zoom" "_all")
или
Код:
[Выделить все]
(command "_.zoom" "_e")
~'J'~
fixo вне форума  
 
Непрочитано 11.01.2006, 23:21
#3
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Я бы порекомендовал тупо:
Код:
[Выделить все]
(command "_.zoom" "_a")
(setq mySet(ssget pt))
(command "_.zoom" "_p")
Для отрезков, кривых и ломаных (исключая блоки, текст, размеры и др.) можно использовать проверку всех примитивов функцией vlax-curve-getClosestPointTo (для 3D, т. е. совпадения всех трёх координат) или vlax-curve-getPointToProjection (для 2D, т. е. для совпадения проекции линии на плоскость через которую проходит точка с точкой), сравнивая растояния от точки до соответствующей линии через EQUAL с небольшим допуском.

Ну и на конец "глючноватый" vla-getIntersectWith c XLine построенной через эту точку временной XLine. В принципе годится для всего, но на практике иногда обманывает. Надо ещё помнить о том что при отсутствии пересечения возвращается "неправильный" массив с нижним индексом больше вехнего.

Наверное (command "_.zoom" "_a") самое надёжное. Может ещё кто что умное по этому поводу скажет...
{Smirnoff} вне форума  
 
Непрочитано 11.01.2006, 23:23
#4
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Во! Уже опередили
{Smirnoff} вне форума  
 
Непрочитано 11.01.2006, 23:27
#5
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от {Smirnoff}
Во! Уже опередили
Ага...
http://www.autocad.ru/cgi-bin/f1/boa...20060111213129
Елпанов Евгений вне форума  
 
Непрочитано 12.01.2006, 00:56
#6
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


И не лень вам всем..?
Держите лиспу, ибо добр аз есмь днесь:
Код:
[Выделить все]
(defun pt-chk (pt eps / ass pt1 pt2)
  (setq ass (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
  (if (/= (vla-get-count ass) 0) (vla-clear ass))
  (setq pt1 (list (- (car pt) eps) (- (cadr pt) eps) (last pt))
	pt2 (list (+ (car pt) eps) (+ (cadr pt) eps) (last pt)))
  (vla-select ass acSelectionSetCrossing (vlax-3d-point pt1) (vlax-3d-point pt2))
  (if (= (vla-get-count ass) 0) nil T)
  (vla-clear ass)
)
pt - 3d точка, eps - допуск, например, 0,001.
Лентяй вне форума  
 
Непрочитано 12.01.2006, 01:11
#7
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>Лентяй
А разве если пользоваться выделением рамкой через ВЛА, то можно указывать точки вне экрана? Например без ВЛА тоже можно, но глючит...
Елпанов Евгений вне форума  
 
Непрочитано 12.01.2006, 05:59
#8
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Мне - можно, я - гуру
Лентяй вне форума  
 
Непрочитано 12.01.2006, 08:16
#9
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


А теперь - серьезно. :shock: Конечно. нельзя указать мышью(!) на экране точку, если она находится за пределами экрана. Но, если требуется выбрать точку, координаты которй известны заранее, то ее местонахождение совершенно не важно. Она может быть даже в другом пространстве :!: Так же и указание рамки. Поскольку точки углов рамки назначаются программно по вычисленному значению, а не указываются вручную, то их доступность на экоране роли не имеет и значения не играет.
Лентяй вне форума  
 
Непрочитано 12.01.2006, 08:41
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Раньше пробовал пользоваться подобными методами без VLA
(ssget pt1 pt2)
и были большие проблеммы вне видимой части экрана, по этому и спросил...
Буду тестировать Ваш вариант, может и правда работает.
Елпанов Евгений вне форума  
 
Непрочитано 12.01.2006, 10:06
#11
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Цитата:
Сообщение от Лентяй
Так же и указание рамки. Поскольку точки углов рамки назначаются программно по вычисленному значению, а не указываются вручную, то их доступность на экоране роли не имеет и значения не играет.
Если точка находится вне экрана, будут проблемы....
VetalBY вне форума  
 
Непрочитано 12.01.2006, 14:12
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Лентяй
...Поскольку точки углов рамки назначаются программно по вычисленному значению, а не указываются вручную, то их доступность на экоране роли не имеет и значения не играет...
Еще как имеет и играет!!!
Александр Ривилис вне форума  
 
Непрочитано 12.01.2006, 17:12
#13
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Может проще в этом случае пользовать опции выбора :
Код:
[Выделить все]
(setq pt '(500. 500. 0.))
(setq ss (ssget "_C" pt pt ))
или опции совокупно с фильтрами
Код:
[Выделить все]
(setq ss (ssget "_C" pt pt (list (cons 0 "SPLINE,*LINE,ARC,INSERT,*TEXT"))))
и т.д.

~'J'~
fixo вне форума  
 
Непрочитано 12.01.2006, 17:35
#14
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Все это правильно и все работает, если точка находиться на экране. Если же нет, значит зуммировать чертеж и использовать ssget или аналоги. Второй способ - пробежаться по базе и найти все примитивы, проходящие через точку. Если проверять надо все примитивы, тогда второй вариант будет при насыщенном чертеже медленно работать. Но возможно надо выбирать не все примитивы, а какие-то определенные (например имеющие XData), то тогда использовать можно ssget "_X" и фильтр выбора.
Можно попробовать и вариант с c XLine.
Я в свое время использовал ssget "_X" и фильтр выбора, далее искал, пробегаясь по набору...
VetalBY вне форума  
 
Непрочитано 12.01.2006, 17:36
#15
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Fatty
Может проще в этом случае пользовать опции выбора...
Проще-то проще, но точка (точки) все равно должны быть на экране.
Александр Ривилис вне форума  
 
Непрочитано 12.01.2006, 19:12
#16
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Александр Ривилис
Цитата:
Сообщение от Fatty
Может проще в этом случае пользовать опции выбора...
Проще-то проще, но точка (точки) все равно должны быть на экране.
Согласен, об этом я и говорил в начале страницы

fixo вне форума  
 
Непрочитано 12.01.2006, 20:56
#17
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Александр Ривилис: Еще как имеет и играет!!!
Гм, как показала дальнейшая проверка, действительно - и имеет, и играет. :shock: Так что признаю свою ошибку, обещаю исправить и устранить. Одно только не понятно - почему. По идее, программный выбор должен быть ограничен исключительно базой данных, на практике же select'ы работают только в видимой области. Непонятка получается... :?
Лентяй вне форума  
 
Непрочитано 12.01.2006, 21:16
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Лентяй
...Одно только не понятно - почему. По идее, программный выбор должен быть ограничен исключительно базой данных, на практике же select'ы работают только в видимой области. Непонятка получается... :?
Тут то как раз все понятно. Эта тенденция сохраняется в AutoCAD начиная как минимум с версии 10 (т.е. уже болше 15 лет). Когда AutoCAD показывает на экране примитивы, содержащиеся в чертеже, он выполняет преобразование из 3D в 2D (с учетом направления взгляда) и отсекает все что за пределами экрана. По этому множеству он и выполняет поиск, который во много раз эффективнее поиска в его собственной базе. А вот (ssget "_X" ...) действительно выполняет поиск по всей базе данных.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > аналог ssget или определение наличия примитива в точке