Тема: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Подскажите, пожалуйста : какие аргументы должны быть у функции (vla-IntersectWith ...) ? Спасибо.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

IntersectWith Method
Gets the points where one object intersects another object in the drawing.
Signature

RetVal = object.IntersectWith(IntersectObject, ExtendOption) 

Object All Drawing Objects (Except Pviewport and PolygonMesh) The object or objects this method applies to.
IntersectObject Object, input-only;
The object can be one of All Drawing Objects.
ExtendOption AcExtendOption enum; input-only
This option specifies if none, one or both, of the objects are to be extended in order to attempt an intersection.
acExtendNone Does not extend either object.
acExtendThisEntity Extends the base object.
acExtendOtherEntity Extends the object passed as an argument.
acExtendBoth Extends both objects.
RetVal Variant (array of doubles)
The array of points where one object intersects another object in the drawing.
Remarks
If the two objects do not intersect, no data is returned. You can request the point of intersection that would occur if one or both of the objects were extended to meet the other. For example, in the following illustration, Line1 is the base object from which this method was called and line3 is the object passed as a parameter. If the ExtendOption passed is acExtendThisEntity, point A is returned as the point where line1 would intersect line3 if line1 were extended. If the ExtendOption is acExtendOtherEntity, no data is returned because even if line3 were extended, it would not intersect line1.
If the intersection type is acExtendBothEntities and line2 is passed as the parameter entity, point B is returned. If the ExtendOption is acExtendNone and line2 is the parameter entity, no data is returned.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Спасибо. Разбираюсь.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

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

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Циклы?
В смысле, в одном цикле (внешнем) перебираются окружности, а в другом (внутри первого) отрезки.
Долго работать будет :(

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Да, видимо, долго. Увы ! А ведь неплохо было бы ... Спасибо.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

(defun get-intersections (/ res selset int _kpblc-conv-list-to-3dpoints)
  (defun _kpblc-conv-list-to-3dpoints (lst / res)
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                 (if (cadr lst)
                   (cadr lst)
                   0.
                   ) ;_ end of if
                 (if (caddr lst)
                   (caddr lst)
                   0.
                   ) ;_ end of if
                 ) ;_ end of list
               (_kpblc-conv-list-to-3dpoints (cdddr lst))
               ) ;_ end of cons
         ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun
  (if (setq selset (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))))
    (progn
      (setq selset (mapcar 'vlax-ename->vla-object selset))
      (foreach ent selset
    (foreach ent2 (cdr (member ent selset))
      (setq int (vla-intersectwith ent ent2 acextendnone))
      (if (>= (vlax-safearray-get-u-bound (vlax-variant-value int) 1) 0)
        (setq
          res (append res
              (_kpblc-conv-list-to-3dpoints
                (vlax-safearray->list (vlax-variant-value int))
                ) ;_ end of _kpblc-conv-list-to-3dpoints
              ) ;_ end of append
          ) ;_ end of setq
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

> VK
А я другого варианта и представить-то не могу :(

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Да, сложновато. А если выбирать только окружности и линии ?

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

> SRAIBIKUS
А самому поменять слово (ssget) на нужные параметы? Не судьба?

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Понял, спасибо. Зациклился на мелочах.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Помогите все-таки разобраться в порядке моих действий (никак не пойму, как найти точку пересечения) :
1. Нахожу имя 1-го примитива ENT1
и преобразовываю в VLA-объект A1
(SETQ A1(VLax-ename->vla-object ENT1)) - ВОЗВРАЩАЕТ #<VLA-OBJECT IAcadCircle 0106fb74>
2. Нахожу имя 2-го примитива ENT2
и преобразовываю в VLA-объект A2
(SETQ A2(VLax-ename->vla-object ENT2)) - ВОЗВРАЩАЕТ #<VLA-OBJECT IAcadLine 0106dee4>
3. Нахожу "якобы" точку пересечения -
(SETQ A3(vla-intersectwith A1 A2 acextendnone)) - ВОЗВРАЩАЕТ :
#<variant 8197 ...>
то есть ВАРИАНТ!!! , а его значение :
(SETQ A3(vlax-variant-value A3)) -
ВОЗВРАЩАЕТ #<safearray...>
А как же найти точку сопряжения двух примитивов ? Извините за профанство, но что-то в учебнике я не нашел простого примера. Спасибо заранее, но уж очень хочется освоить VLISP...

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

> SRAIBIKUS
Ууу, как все запущенно...
1. получаем пересечение и преобразовываем его в safearray:

(setq int (vla-IntersectWith (vlax-ename->vla-object (car (entsel))) (vlax-ename->vla-object (car (entsel))) acExtendNone)
safe (vlax-variant-value int))

После этого получаем:
int -> #<variant 8197 ...>
safe -> #<safearray...>
проверяем верхнюю границу safe, потому что если пересечений не было, верхняя граница будет отрицательной.

(>= (vlax-safearray-get-u-bound safe 1) 0)

И если условие выполняется, то преобразовываем в список:

(setq lst (vlax-safearray->list safe))

И преобразовываем lst в список 3Д-точек.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Огромное спасибо. Но то, что "запущено" - перебор, потому как если нет знаний, то и запускать-то нечего. Полный ноль в этом отношении. Спасибо еще раз.

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

В догонку Если нужно:
Функция vla-intersectwith реализует метод IntersectWith, имеющий два аргумента.
Получает точки где один объект пересекает другой объект на чертеже.
Синтаксис:
(vla-intersectwith <VLA1> <VLA2> <int_flag>)
RetVal = object.IntersectWith(IntersectObject, ExtendOption)
<VLA1> - Базовый объект. Все объекты чертежа (кроме Pviewport и PolygonMesh). Объект или объекты для которых этот метод доступен.
<VLA2> - Объект аргумент. Объектом могут быть все объекты чертежа.
<int_flag> - Признак продолжения объекта до пересечения.
Признак определяет ни один объект не продолжается, один или оба, объектов должны быть условно продолжены  до пересечения.
Не продолжает объект.    0
Продолжает базовый объект, т.е. <VLA1>    1
Продолжает объект переданный как аргумент, т.е. <VLA2>    2
Продолжает оба объекта.    3
   
Возвращает:
Variant (массив действительных чисел). Массив точек в которых одни объекты пересекают другие объекты на чертеже.
Коментарий
Если объекты не пересекаются, то функция ничего не возвращает. Вы можете запросить точку пересечения, которое должно происходить если один или оба объекта были условно продолжены до пересечения. Например, в следующей
иллюстрации, line1 - базовый объект указанный как <VLA1> и line3 - объект указанный как аргумент <VLA2>. Если признак <int_flag> передан как  - 1, функция вернет точку с координатами где line1 пересеклась бы с line3 если бы line1 была бы продолжена. Если признак <int_flag> передан как  - 2, функция ни чего не вернет поскольку даже если бы line3 была бы продолжена, она все равно не пересеклась бы с line1.
Если признак <int_flag> передан как  -  3 и line2 передан как аргумент <VLA2>, функция вернет координаты точки В. Если признак <int_flag> передан как  -  0 и line2 - объект параметра, как аргумент <VLA2>, функция не вернет ничего.
Пример использования функции vla-intersectwith
; (C) 2005 by S.Sinitca
; ptlst1 - глобальная перемпеременная
; flag - глобальная перемпеременная
(defun fun1 (/ vlaobj1 vlaobj2 var1 sfarr1)
   (setq vlaobj1 (si_vlpntrslct))
   (princ vlaobj1)
   (setq vlaobj2 (si_vlpntrslct))
   (princ vlaobj2)
   (setq var1 (vla-intersectwith vlaobj1 vlaobj2 flag))
   (setq sfarr1 (vlax-variant-value var1))
   (setq ptlst1 (vlax-safearray->list sfarr1))
); end defun fun1
(defun fun2 ()
   (princ "\nflag=")
   (princ flag)
   (setq flag (getint
      "\nЗначение глобальной переменной FLAG [0/1/2/3]:")
   );end setq flag
);end defun fan2

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Да еще забыл для примера использования:
;-1-2-------------------------------------------------------------
; Группа функций для преобразования имя примитива во VLA-объект
; Аргументы: НЕТ
; Глобальные переменные: НЕ ИСПОЛЬЗУЕТ
; Локальные переменные: НЕТ
; Возращает: имя примитива в виде #<VLA-OBJECT IAcadLine 02ac4514>
;-----------------------------------------------------------------
; Вариант выбора - последний не удаленный
(defun si_vlpntrlst ()
   (vlax-ename->vla-object (entlast))
)
; Вариант выбора - интерактивный
(defun si_vlpntrslct ()
   (vlax-ename->vla-object (car (entsel)))
)

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Огромное спасибо за помощь. (Больше месяц мучить людей не буду : ухожу в отпуск.) В любом случае почитаю  и "посчитаю". Спасибо всем !

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

> sergcd2
Промпт? Или translate.ru?
Функции не очень. Достаточно промахнуться при выборе и привет, пишите письма мелким почерком. Кроме того, я (как пользователь) не собираюсь помнить значения каких-то там флагов. Как программист же я буду использовать символьные представления констант по одной единственной причине: если Autodesk или MS (или обе) поменяют чего-то внутри (например, размеры памяти, отдаваемые под Integer значения - что и случилось в .NET 2002, кстати), мне не надо будет ползать по всем кодам и править 4 на 8.
(getint) вкупе с "[0/1/2/3]" лично у меня вызовут рефлекторное нажатие правой кнопки для вызова конт.меню.
Теперь насчет конвертации. http://www.arcada.com.ua/forum/viewtopic.php?t=504 видел?

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

Это не программа, а только пример использования.
выдержка из хелпа, который делал для себя.
Вопрос был об аргументах функции vla-intersectwith, я так понимаю, что у человека была проблема разобраться: в ACAD HELPe на примере VBA два аргумента а в LISPe три аргумента

Re: Какие аргументы должны быть у функции (vla-IntersectWith ...)?

http://www.cad.dp.ua/stats/content.php? … a_doc.html