Тема: Как узнать имя объекта по координатам?

> AnteC
Если они в углах полилинии, то получив список координат этих углов, можно анализировать и сравнивать.
Но... Если на полилинии между ууглами, то большой "гемор.." с анализом.
Мне так кажется.....

Re: Как узнать имя объекта по координатам?

Подскажите плиз как узнать имя объекта (точнее точки) зная ее координаты (в этой точке находится
не только она но и полилинии).
спасибо

Re: Как узнать имя объекта по координатам?

> AnteC
Выбор "секущей рамкой" малого размера с вашими координатами центра рамки.
Поличаем список примитивов, а дальше анализ и выбор того что хотите.

Re: Как узнать имя объекта по координатам?

> ABoltrushko
А размер секущей рамки, что бы был равен допуску по точности вычисления координат...

Re: Как узнать имя объекта по координатам?

А еще, учитывая, что примитив - точка, можно организовать фильтр по координатам и типу примитива. Это будет работать дольше (просматривается весь чертеж), зато можно находить примитивы за пределами видимой области экрана.

Re: Как узнать имя объекта по координатам?

> AnteC
"как узнать имя объекта (точнее точки)..."
Если имеется ввиду POINT, тогда по совету Александр Ривилиса (2005-11-02 22:08:26)

Re: Как узнать имя объекта по координатам?

тогда еще вопрос допустим я выбрал объекты с помощью ssget  но с помощью какой функции после
этого вывести в список свойства?
и еще вопрос по команде entlast выбирается последний созданный объект нельзя ли
изменить не на последний а на выбранный (может функция какаят есть) ?
по совету Александра не получиться (точней будет работать ОООчень долго тк чертеж большой а компы к сожелению слабые :(  )

Re: Как узнать имя объекта по координатам?

Честно говоря, не понял, что надо получить в результате-то? Имя объекта (которое в группе -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

Re: Как узнать имя объекта по координатам?

Нужно вывести св-ва объектов (точек) находящихся на выбранной (entsel) полилинии

Re: Как узнать имя объекта по координатам?

> 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 и проверять расстояние между данной точкой и точкой на прямой на соответствие допуску.

Re: Как узнать имя объекта по координатам?

(if ptSet
  (sssetfirst nil hlSet)
  ); end if

(if - абсолютно не нужен, случайно напечатал. А теперь только заметил...

Re: Как узнать имя объекта по координатам?

Спасибо всем кто откликнулся сделал как подсказал
kpblc

естественно модифицировав код ... получилось все нормально только пришлось написать код, который экран отодвигает чтобы была видна вся полилиния
Еще раз респект :)

Re: Как узнать имя объекта по координатам?

> Александр Ривилис
Подскажите пожалуйста как организовать фильтр по координате z?
Все примитивы чертежа - точки, предварительно в программе уже получен список всех координат Z для всех точек (Z1 Z2 Z3 .... Zn) - coord_list, причем одинаковых координат в списке нет.
Я никак не могу докумекать как описать фильтр в цикле

(foreach z_coor coord_list
(setq work_set (ssget "_X" ???????????))
трам пам пам
)

Re: Как узнать имя объекта по координатам?

> Random
Пример:

(setq z 123.456)
(setq work_set (ssget "_X" (list '(-4 . "=")(cons 38 z))))

~'O'~

Re: Как узнать имя объекта по координатам?

> 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
)

Re: Как узнать имя объекта по координатам?

> Александр Ривилис
Отличный фильтр!
Раньше не знал о фильтре по диапазону, для одной координаты...