Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Пашин Евгений от 23-09-2015, 09:11:10

Название: Получение информации из рамки Autodesk SPDS
Отправлено: Пашин Евгений от 23-09-2015, 09:11:10
Ответ, увы, находится не в рамках .NET, но решение заключается в том, что все параметры с примитивов я получаю с помощью LISP.

Если Александр Ривилис посчитает нужным, то он перенесет эту тему в другой раздел:

Код - Auto/Visual Lisp [Выбрать]
  1. (setq loadedarx (arx)) ;получили список загруженных приложений
  2. (if (member "spdsextproxy.dll" loadedarx) ; проверили что в этом списке есть SPDS Extention
  3.   (progn ; если загружен SPDS Extention
  4.     (setq obj (car (entsel)) ; получили EntityName
  5.           dxflist (entget obj) ; получили DXF список параметров объекта
  6.     )
  7.     (setq koor (cdr (assoc 10 dxflist))) ; получили содержание группы с кодом 10 - точка вставки
  8.     (princ "\nAutodesk SPDS Extention загружен!")
  9.     (princ "\nТочка вставки рамки формата: ")
  10.     (princ koor)
  11.     (setq vlaobj (vlax-ename->vla-object obj)
  12.           form (vlax-get-property vlaobj 'Designation) ; получили свойство с форматом рамки
  13.           orient (vlax-get-property vlaobj 'Orientation) ; получили свойство с ориентацией
  14.           scale (vlax-get-property vlaobj 'OverallScale) ; получили свойство с масштабом
  15.     ) ; end of setq
  16.     (princ "\nФормат: А")
  17.     (princ form)
  18.     (if (= orient 0) (princ " Горизонтальный") (princ " Вертикальный"))
  19.     (princ "\nМасштаб: ")
  20.     (princ scale)
  21.   );end of progn
  22.   (progn ; если не загружен SPDS Extention
  23.     (setq obj (car (entsel))
  24.           vlaobj (vlax-ename->vla-object obj)
  25.     ) ; end of setq
  26.     (vla-GetBoundingBox vlaobj 'minp 'maxp) ; получили массив с крайними координатами
  27.     (setq minkoor (vlax-safearray->list minp) ; получили минимальную координату
  28.           maxkoor (vlax-safearray->list maxp) ; получили максимальную координату
  29.     ) ; end of setq
  30.     (princ "\nAutodesk SPDS Extention не загружен!")
  31.     (princ "\nЛевая нижняя координата рамки формата: ")
  32.     (princ minkoor)
  33.     (princ "\nПравая верхняя координата рамки формата: ")
  34.     (princ maxkoor)
  35.   );end of progn
  36. );end of if

Код подработаю и выложу уже готовый ответ с учетом загрузки данного LISP-кода. Но то, что требуется - я получаю!
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Алексей Кулик от 23-09-2015, 11:35:28
Пашин Евгений, у тебя допущена одна, но очень серьезная ошибка: функция (arx) не возвращает список загруженных .NET-сборок. Это можно получить только через .NET (где-то соответствующая статья была). Можно, конечно, на .NET написать соответствующий функционал и подсунуть его в lisp, но зачем?
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Алексей Кулик от 23-09-2015, 11:41:38
Если обрабатывать только вариант загруженного Autodesk SPDS Extension, то как вариант:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun test (/ fun_get ent)
  4.   (defun fun_get (obj prop)
  5.     (if (vlax-property-available-p obj prop)
  6.       (vl-princ-to-string (vlax-get-property obj prop))
  7.       "Не определено"
  8.       ) ;_ end of if
  9.     ) ;_ end of defun
  10.  
  11.   (if (= (type
  12.            (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nУкажите формат <Отмена> : "))))))
  13.            ) ;_ end of type
  14.          'ename
  15.          ) ;_ end of =
  16.     (if (= (vla-get-objectname ent) "УКАЖИ ObjectName для объекта формата")
  17.       (princ (strcat "\nТочка вставки формата: "
  18.                      (vl-princ-to-string (cdr (assoc 10 (entget ent))))
  19.                      "\nФормат: A"
  20.                      (fun_get (vlax-ename->vla-object ent) 'designation)
  21.                      " "
  22.                      (fun_get (vlax-ename->vla-object ent) 'orientation)
  23.                      "\nМасштаб : "
  24.                      (fun_get (vlax-ename->vla-object ent) 'overallscale)
  25.                      ) ;_ end of strcat
  26.              ) ;_ end of princ
  27.       ) ;_ end of if
  28.     ) ;_ end of if
  29.   ) ;_ end of defun
  30.  

Обрати внимание на строку 16!!
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Пашин Евгений от 23-09-2015, 11:49:21
Эту функцию я хотел использовать на случай, если у кого-нибудь загружена или не загружена библиотека spdsextproxy.dll, то есть, если нужно получить точку вставки блока при загруженной библиотеке, то ищем первым вариантом (через точку вставки), если не установлена, то вторым (через GetBoundingBox).

Вручную запускаю этот код - работает!

Можно, конечно, на .NET написать соответствующий функционал и подсунуть его в lisp, но зачем?

Мне строго-настрого запретили что-то добавлять или удалять в чертеже, так что придется решать этот вопрос без копирования объектов и их взрывов... Выкручивают руки :)


(if (= (vla-get-objectname ent) "УКАЖИ ObjectName для объекта формата")

Я правильно понимаю, что можно в эту строку вставлять ISiberiaFormat или IAcadBlockReference? Или AcDbBlockReference?
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Александр Ривилис от 23-09-2015, 11:54:49
Пашин Евгений, у тебя допущена одна, но очень серьезная ошибка: функция (arx) не возвращает список загруженных .NET-сборок.
У него расширение dll, но вполе возможно, что это arx/dbx
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Алексей Кулик от 23-09-2015, 12:02:14
Александр Ривилис, возможно. Но требует проверки.
Мне строго-настрого запретили что-то добавлять или удалять в чертеже
Я разве говорю про добавление в чертеж? Я говорю о разработке LISP-функции на .NET (при условии, что она вообще необходима).
Я правильно понимаю, что можно в эту строку вставлять ISiberiaFormat или IAcadBlockReference?
Скорее, ISiberiaFormat - ведь для него выполняется проверка-то.
Название: Re: Получение информации из рамки Autodesk SPDS
Отправлено: Пашин Евгений от 23-09-2015, 12:10:08
Я говорю о разработке LISP-функции на .NET (при условии, что она вообще необходима).

Я так еще не умею делать.