| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как добраться до свойств объекта, находящегося во внешней ссылке, не входя в саму ссылку?

Как добраться до свойств объекта, находящегося во внешней ссылке, не входя в саму ссылку?

Ответ
Поиск в этой теме
Непрочитано 13.11.2014, 18:56 #1
Как добраться до свойств объекта, находящегося во внешней ссылке, не входя в саму ссылку?
Profan
 
Москва
Регистрация: 25.12.2005
Сообщений: 13,627

Эта тема является в некотором роде продолжением ранее созданной темы
http://forum.dwg.ru/showthread.php?t=116612

Реально надо проставить выноску к воздуховоду (объект AutoCAD MEP), находящемуся во внешней ссылке, но в текущем чертеже.
Попробовал так:
Код:
[Выделить все]
(defun C:СВОС ( / echo dmzn osm obj ss слой name имя_разм имя_сист отм сечение номер высота длина te mtxtxref)
(setq echo (getvar "CMDECHO"))
(princ "\n Укажите внешнюю ссылку: ")
(vl-cmdf "_-refedit" pause "_Ok" "_all" "_no")
    (setq dmzn (getvar "DIMZIN"))
    (setvar "DIMZIN" 1)
    (setq osm (getvar "OSMODE"))
    (princ "\n Работаю...")
(setq obj (entsel "\n Укажите воздуховод: "))
(if obj
    (progn
    (setvar "CMDECHO" 0)
    (command "_-UNITS" "2" "0" "" "" "0" "_N")
    (setq ss(entget (car obj)))
    (cond
    ((= (cdr (assoc 0 ss)) "AECB_DUCT")
    (princ "\n Воздуховод.")
    (setq слой (vlax-get-property (vlax-ename->vla-object (car obj)) 'Layer))
    (setq name слой)
    (princ (strcat "\n\n" name))
    (setq имя_разм (vlax-get-property (vlax-ename->vla-object (car obj)) 'SizeName))
    (princ "\n Имя размера   ")(princ имя_разм)
    (setq имя_сист (vlax-get-property (vlax-ename->vla-object (car obj)) 'SystemName))
    (princ "\n Имя системы   ")(princ имя_сист)
    (setq отм (/ (vlax-get-property (vlax-ename->vla-object (car obj)) 'Elevation)1000))
    (princ "\n Отм. оси воздуховода  ")(princ отм)
          (setq сечение (vlax-get-property (vlax-ename->vla-object (car obj)) 'CrossSectionSize))
          (setq номер (+ (vl-string-search "x" сечение) 2))
          (setq высота (substr сечение номер))
          (setq высота (/ (atof высота) 1000))
          (princ "\n Высота воздуховода в м  ") (princ высота)
    (setq отм (- отм (/ высота 2)))
    (princ "\n Отм. низа воздуховода  ")(princ отм)    
    (setq длина (/(vlax-get-property (vlax-ename->vla-object (car obj)) 'Length) 1000))
    (princ "\n L = ")(princ длина)(princ "\n")
    (setq te (strcat "L=" (rtos длина 2 0) "м Отм.н.=" (rtos отм 2 3)))
    (setq mtxtxref (strcat имя_сист " " сечение "\n" te))
    )
    ((/= (cdr (assoc 0 ss)) "AECB_DUCT") (princ "\n Это не воздуховод!"))
    ) ; cond
    ) ; progn
    (princ "\n Объект не выбран.")
) ; if
    (setvar "DIMZIN" dmzn)
(vl-cmdf "_refclose" "_disc")
    (setvar "cmdecho" 0)
    (setvar "OSMODE" 0)
(if mtxtxref
    (progn
    (princ "\n Построение мультивыноски: укажите 1-ю и 2-ю точки.")
    (vl-cmdf "_mleader"  pause pause mtxtxref)
    ) ; progn
    (princ "\n Данных нет.")
) ; if
    (setvar "cmdecho" echo)
    (setvar "OSMODE" osm)
(princ)
)
Проникаем во внешнюю ссылку, запоминаем некоторые свойства воздуховода в переменную, выходим из внешней ссылки и строим мультивыноску с текстом, взятым из этой переменной.
Очень медленно работает программа и неустойчиво. Если промахнешься, указывая внешнюю ссылку, программа нелепо зацикливается.
Так вот, нет ли способа решить эту задачу средствами VLisp, не проникая во внешнюю ссылку?
Имя функции написано русскими буквами.
Добавлю еще, что стиль мультивыноски создан заранее.
Просмотров: 3585
 
Непрочитано 13.11.2014, 19:43
#2
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Profan, объект внешней ссылки без проникновения в нее можно получить так:
Код:
[Выделить все]
(setq obj (car (nentsel "\n Укажите воздуховод: ")))
skkkk вне форума  
 
Автор темы   Непрочитано 13.11.2014, 20:02
#3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Спасибо. Я-то думал, что nentsel только с блоками (insert) работает...
Profan вне форума  
 
Непрочитано 13.11.2014, 20:09
#4
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Profan Посмотреть сообщение
Я-то думал, что nentsel только с блоками (insert) работает...
Так ведь блок и внешняя ссылка для Автокада - суть одно и то же. Есть конечно разница, но например, дампы (entget(car(entsel))) и того и другого возвращают тип объекта (0 . "INSERT"). Они очень во многом похожи с точки зрения программного подхода.
skkkk вне форума  
 
Автор темы   Непрочитано 13.11.2014, 20:40
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Я другие дампы тупо сравнивал, чтоб мне пусто было:
Код:
[Выделить все]
(vlax-dump-object (vlax-ename->vla-object (car (entsel))) t)
Profan вне форума  
 
Непрочитано 13.11.2014, 22:08
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Profan, С точки зрения лиспа разницы между вн. ссылкой и блоком нет. Описание и того и другого находиться в таблице блоков
На этом основывается команда
BGCOLORXREF - Меняет цвет выбранных внешних ссылок (только в текущем сеансе)

Она тупо красит в указанный цвет все примитивы внешней ссылки. Правда их цвет меняется только в текущем сеансе, но для печати этого достаточно.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.11.2014, 22:24
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Да тут, понимаешь, не только распечатать надо (а, может, и совсем не надо) - надо эту подоснову с нарисованными, например, отверстиями в стенах и перекрытиях для пропуска коммуникаций передать архитекторам в виде задания. Хорошо бы, чтобы цвет изменился навсегда.
Profan вне форума  
 
Непрочитано 13.11.2014, 23:00
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Тогда открывать файл и работать с ним напрямую. Например, через ObjectDBX.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.11.2014, 08:03
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда открывать файл и работать с ним напрямую. Например, через ObjectDBX.
Ниже ссылки на примеры и готовые функции
Copy to XRef
Reset XRef Layers
ObjectDBX Wrapper
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.11.2014, 09:56
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Тоже часть, на русском: http://autolisp.ru/2010/04/08/procee...tive-document/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как добраться до свойств объекта, находящегося во внешней ссылке, не входя в саму ссылку?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консервация объектов незавершенного строительства msv_mnv Обследование зданий и сооружений 6 11.11.2017 23:07
Ввод в эксплуатацию салона красоты - нужно ли (и в какой форме) согласование с пожарниками ? drill_man Прочее. Архитектура и строительство 4 20.09.2013 12:03
Запись параметров вставки внешней ссылки в саму внешнюю ссылку. Supermax Программирование 72 27.07.2009 16:30