Получение информации из рамки Autodesk SPDS

Автор Тема: Получение информации из рамки Autodesk SPDS  (Прочитано 8608 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ответ, увы, находится не в рамках .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-кода. Но то, что требуется - я получаю!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Пашин Евгений, у тебя допущена одна, но очень серьезная ошибка: функция (arx) не возвращает список загруженных .NET-сборок. Это можно получить только через .NET (где-то соответствующая статья была). Можно, конечно, на .NET написать соответствующий функционал и подсунуть его в lisp, но зачем?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Если обрабатывать только вариант загруженного 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!!
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Эту функцию я хотел использовать на случай, если у кого-нибудь загружена или не загружена библиотека spdsextproxy.dll, то есть, если нужно получить точку вставки блока при загруженной библиотеке, то ищем первым вариантом (через точку вставки), если не установлена, то вторым (через GetBoundingBox).

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

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

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


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

Я правильно понимаю, что можно в эту строку вставлять ISiberiaFormat или IAcadBlockReference? Или AcDbBlockReference?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пашин Евгений, у тебя допущена одна, но очень серьезная ошибка: функция (arx) не возвращает список загруженных .NET-сборок.
У него расширение dll, но вполе возможно, что это arx/dbx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Александр Ривилис, возможно. Но требует проверки.
Мне строго-настрого запретили что-то добавлять или удалять в чертеже
Я разве говорю про добавление в чертеж? Я говорю о разработке LISP-функции на .NET (при условии, что она вообще необходима).
Я правильно понимаю, что можно в эту строку вставлять ISiberiaFormat или IAcadBlockReference?
Скорее, ISiberiaFormat - ведь для него выполняется проверка-то.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Я говорю о разработке LISP-функции на .NET (при условии, что она вообще необходима).

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