Тема: Как узнать имя объекта по координатам?
> AnteC
Если они в углах полилинии, то получив список координат этих углов, можно анализировать и сравнивать.
Но... Если на полилинии между ууглами, то большой "гемор.." с анализом.
Мне так кажется.....
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Как узнать имя объекта по координатам?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
> AnteC
Если они в углах полилинии, то получив список координат этих углов, можно анализировать и сравнивать.
Но... Если на полилинии между ууглами, то большой "гемор.." с анализом.
Мне так кажется.....
Подскажите плиз как узнать имя объекта (точнее точки) зная ее координаты (в этой точке находится
не только она но и полилинии).
спасибо
> AnteC
Выбор "секущей рамкой" малого размера с вашими координатами центра рамки.
Поличаем список примитивов, а дальше анализ и выбор того что хотите.
> ABoltrushko
А размер секущей рамки, что бы был равен допуску по точности вычисления координат...
А еще, учитывая, что примитив - точка, можно организовать фильтр по координатам и типу примитива. Это будет работать дольше (просматривается весь чертеж), зато можно находить примитивы за пределами видимой области экрана.
> AnteC
"как узнать имя объекта (точнее точки)..."
Если имеется ввиду POINT, тогда по совету Александр Ривилиса (2005-11-02 22:08:26)
тогда еще вопрос допустим я выбрал объекты с помощью ssget но с помощью какой функции после
этого вывести в список свойства?
и еще вопрос по команде entlast выбирается последний созданный объект нельзя ли
изменить не на последний а на выбранный (может функция какаят есть) ?
по совету Александра не получиться (точней будет работать ОООчень долго тк чертеж большой а компы к сожелению слабые :( )
Честно говоря, не понял, что надо получить в результате-то? Имя объекта (которое в группе -1), мягкий указатель (330) или что-то иное? По (entget(entlast)) выводится следующее:
((-1 . <Entity name: 7ef6bf68>) (0 . "POINT") (330 . <Entity name: 7ef6bcf8>) (5 . "E5") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPoint") (10 765.401 267.085 0.0) (210 0.0 0.0 1.0) (50 . 0.0))
И какие свойства надо получать? Может, нечто типа:
(defun c:point-list (/ selset counter item result) (setq selset (ssget) counter 0 result '() ) ;_ end of setq (while (setq item (ssname selset counter)) (setq counter (1+ counter)) (if (= (cdr (assoc 0 (entget item))) "POINT") (setq result (append (list (assoc 67 (entget item)) (assoc 8 (entget item)) (assoc 10 (entget item)) ) ;_ end of list result ) ;_ end of append ) ;_ end of setq ) ;_ end of if ) ;_ end of while result ) ;_ end of defun
Нужно вывести св-ва объектов (точек) находящихся на выбранной (entsel) полилинии
> AnteC
Вы студент наверное? Вот так можно найти точки лежащие на полилинии (подсвечиваются). А уж примитивы из получившегося набора и их свойства попробуйте извлечь сами.
(defun c:selpts(/ dxfLst verLst ptSet) (setq dxfLst(entget(car(entsel "\nSelect pline: "))) verLst(mapcar 'cdr (vl-remove-if '(lambda(x)(/=(car x)10))dxfLst)) ptSet(ssget "_F" verLst '((0 . "POINT"))) ) (sssetfirst nil ptSet) (princ) ); end of c:selpts
Подсказываю. Примитивы извлекаются функцией SSNAME по их порядковому номеру. Значит надо делать цикл REPEAT c числом повторов равной длинне набора (SSLENGTH ptSet). А потом с помощью функции ENTGET получать список который и содержит всю информацию о свойствах.
А если серьёзнее то:
(defun c:ptln(/ lnSet vlaCurve mPt xPt ptSet Count curPt ordLst hlSet) (vl-load-com) (princ "\nSelect line") (if (setq lnSet (ssget "_:S" '((0 . "*LINE,CIRCLE,ARC,ELLIPSE") (-4 . "<NOT")(0 . "MLINE")(-4 . "NOT>")))) (progn (setq vlaCurve (vlax-ename->vla-object (ssname lnSet 0))) (vla-GetBoundingBox vlaCurve 'minPt 'maxPt) (setq mPt(vlax-safearray->list minPt) xPt(vlax-safearray->list maxPt) ptSet(ssget "_C" mPt xPt '((0 . "POINT"))) Count 0 hlSet(ssadd) ); end setq (repeat(sslength ptSet) (setq curPt(ssname ptSet Count) ordLst(cdr(assoc 10(entget curPt))) ); end setq (if (vlax-curve-getParamAtPoint vlaCurve ordLst) (ssadd curPt hlSet) ); end if (setq Count(1+ Count)) ); end repeat (if ptSet (sssetfirst nil hlSet) ); end if ); end progn ); end if (princ) ); end of
А если еще серьёзнее, с допуском, то использовать вместо vlax-curve-getParamAtPoint vlax-curve-getClosestPointTo и проверять расстояние между данной точкой и точкой на прямой на соответствие допуску.
(if ptSet (sssetfirst nil hlSet) ); end if
(if - абсолютно не нужен, случайно напечатал. А теперь только заметил...
Спасибо всем кто откликнулся сделал как подсказал
kpblc
естественно модифицировав код ... получилось все нормально только пришлось написать код, который экран отодвигает чтобы была видна вся полилиния
Еще раз респект :)
> Александр Ривилис
Подскажите пожалуйста как организовать фильтр по координате z?
Все примитивы чертежа - точки, предварительно в программе уже получен список всех координат Z для всех точек (Z1 Z2 Z3 .... Zn) - coord_list, причем одинаковых координат в списке нет.
Я никак не могу докумекать как описать фильтр в цикле
(foreach z_coor coord_list (setq work_set (ssget "_X" ???????????)) трам пам пам )
> Random
Пример:
(setq z 123.456) (setq work_set (ssget "_X" (list '(-4 . "=")(cons 38 z))))
~'O'~
> Random
> Олег(jr.)
А я бы предложил бы такую функцию:
;---------------------------------------------------- ; Функция возвращает набор примитивов-точек, имеющих ; координату Z в диапазоне z-eps < Z < z+eps. ; Если eps не задана, т.е. nil - eps ; принимается равным 1e-3 ;---------------------------------------------------- (defun sel_point_by_z ( z eps / ss) (if (not (numberp z)) (setq z 0.0)) (if (not (numberp eps)) (setq eps 1e-3)) (setq ss (ssget "_X" (list (cons 0 "POINT") (cons -4 "<and") (cons -4 "*,*,<") (cons 10 (list 0.0 0.0 (+ z eps))) (cons -4 "*,*,>") (cons 10 (list 0.0 0.0 (- z eps))) (cons -4 "and>") ))) ss )
> Александр Ривилис
Отличный фильтр!
Раньше не знал о фильтре по диапазону, для одной координаты...
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Как узнать имя объекта по координатам?
Форум работает на PunBB, при поддержке Informer Technologies, Inc