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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Аналог REFEDIT с указанием имени внешней ссылки?

Аналог REFEDIT с указанием имени внешней ссылки?

Ответ
Поиск в этой теме
Непрочитано 14.04.2011, 16:10 #1
Аналог REFEDIT с указанием имени внешней ссылки?
Павлюкас
 
Москва
Регистрация: 08.10.2007
Сообщений: 42

Задача такая.
Необходимо открыть внешнюю ссылку на запись,
но стандартная команда ._-Refedit не позволяет указать имя Xref'а, а предоставляет только возможность выбрать сам Xref.

Может кто поделиться готовыми решениями по работе с внешними ссылками?
Просмотров: 4072
 
Непрочитано 14.04.2011, 16:47
#2
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


А что надо сделать-то?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 14.04.2011, 17:00
#3
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Для решения моей задачи -
необходимо открыть внешнюю ссылку, допустим вставить туда линию и сразу закрыть её с сохранением.
И таких Xref'ов у меня несколько.
Проблема использования стандартной функции RefEdit заключается в том, что выбирать необходимо либо сам Xref, либо указывать точкой.
Код я набросал, но он меня не устраивает. Схема не устойчивая. Не всегда срабатывает.
Поэтому хотелось бы по имени Xref'а открывать его на редактирование

(progn
(command"-refedit" pnt "ok")
(if (= (logand (getvar "CMDACTIVE") 31) 0)
(progn (alert "Программа не может быть выполнена. Закройте файлы конструкций, на которые ссылаются выбранные Xref'ы")(exit)))

(command "n" "c" (polar (polar pnt pi 10) (* 1.5 pi) 10) (polar (polar pnt 0 10) (/ pi 2.) 10))

(if (> (logand (getvar "CMDACTIVE") 31) 0)
(command"""")
(command"-refedit" pnt "ok" "" "")
)(command"_.refclose" "s"))
Если есть готовые решения, на Lisp или Net, то буду благодарен за помощь
Павлюкас вне форума  
 
Непрочитано 14.04.2011, 17:53
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Для работы с закрытым документом есть dbx. Если известно, что с ним надо сделать, то вопрос решаемый.
но если "вставить туда линию" надо в контексте того файла, в который вставлена внеш. ссылка - тогда не знаю.
kp+ вне форума  
 
Непрочитано 14.04.2011, 17:58
#5
VVA

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


Павлюкас, Думаю это тебе подойдет: Copy to XRef
Цитата:
This program enables a user to quickly copy a selection of objects to a selected XRef, without the need to open the XRef.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.04.2011, 18:03
#6
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Именно в контексте текущего файла, так, как это сделано командой Refedit. Не открывая файл, на который ссылается XRef

VVA
Спасибо за ссылку - очень полезно, но у меня немного другая проблема.
Опишу более детально.
У меня есть определённый объект во внешней ссылке, в который я записываю данные
что-то на подобие XData. (Property Set -называются из AutoCad Architecture)
Их я записываю в копию объекта.
Естесственно, что они не изменяют настоящий объект.
Так вот после того, как я открываю Xref с помощью RefEdit и сразу закрываю его - данные с копии объекта
перезаписываются в настоящий объект, а с помощью программы, на которую вы дали мне ссылку - этого не происходит.
Я уже попробовал.

Последний раз редактировалось Павлюкас, 14.04.2011 в 18:31.
Павлюкас вне форума  
 
Непрочитано 14.04.2011, 19:41
#7
Кулик Алексей aka kpblc
Moderator

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


Тогда используй vla-CopyObjects. Или (что лично мне было бы проще) - вообще напрямую оттуда читать PropertySet'ы.
Вопрос становится интересным: а что дальше планируется с этими объектами и данными делать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.04.2011, 20:44
#8
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Алексей, считать свойства - это вообще не проблема.
Задача именно записывать эти свойства из Xref'а в конструкции с сохранением.

Вот представь - у меня есть несколько Xref'ов внутри которых есть однотипные объекты "AEC_WINDOW"
Мне необходимо создать спецификацию на эти объекты.
Для этого я программно записываю в каждый объект его позицию
(Пример: Ок1, Ок2, Д1, Д2 и т.д.) Причём Ок1 может быть в разных конструкциях.
Вторым этапом я считываю эти позиции и создаю спецификацию.
Это можно сделать и не используя Property Set, но они мне нужны
для оформления, когда я создаю теги "AEC_MVBLOCK_REF", аттрибутами которых будут значения Property Set.

Написал как-то сумбурно, но думаю ты поймёшь, т.к. разбираешься в ACA
Павлюкас вне форума  
 
Непрочитано 14.04.2011, 21:12
#9
Кулик Алексей aka kpblc
Moderator

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


Да, примерно понял. Тогда я бы делал примерно по следующему алгоритму:
1. Прочитать все вхождения внешних ссылок пространства модели. Для упрощения предполагаем, что все ссылки вставлены в '(0.0 0.0 0.0) и каждый файл внешней ссылки имеет base равной '(0.0 0.0 0.0)
2. Из них "повыдергивать" объекты нужного типа (это будут, скорее всего, vla-указатели; забрать оттуда, например, базовые точки - не проблема).
3. Оттуда же - PropertySet'ы соответствующие
4. Сформировать номера марок.
5. Используя ObjectDBX, открывать файлы в фоновом режиме и записывать туда соответствующие значения. Объекты фильтровать по точке вставки (это как минимум; для гарантии можно получить еще и Anchor, и угол поворота, и стиль - в общем, все, что угодно )
6. Сохранить файл.
Примерно так.
P.S. Я сам думал подобное реализовать, но как-то руки не дошли.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.04.2011, 21:43
#10
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Вот смотри, как я поступил, но результат опять нулевой.

По аналогии с программой, которую VVA подбросил (За что спасибо)
через dbx получил указатели на пространство модели Xref'а
Дальше нашёл все объекты "AecDbWindow"
Добрался до их Property Set.
Изменил их.
Дампом удостоверился, что они перезаписались
сделал
(vla-update xrv)
(vla-saveas dbx dwg)
(setq doc (vla-get-ActiveDocument (setq ac (vlax-get-acad-object))))
(vla-Reload (vla-item (vla-get-Blocks doc) (vla-get-name xrv)))

И впал в ступор.
Если интересно, могу бросить код

В фоновом режиме - это с открыванием файлов, чтобы их открытие видел пользователь?
Это не вариант.
Павлюкас вне форума  
 
Непрочитано 14.04.2011, 22:48
#11
Кулик Алексей aka kpblc
Moderator

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


Фоновый режим с ObjectDBX - это значит, что файлы открываются, но не появляются в списке открытых файлов и пользователь это вряд ли успеет проконтролировать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.04.2011, 10:01
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Рассказываю как командой -refedit достучаться практически до любой ссылки и блока через выбор их точкой:

Для начала, как правильно говорил Kpblc, надо создать набор из всех внешних ссылок и блоков пространства модели.
Потом выписать от туда точки их вставки.
Зайти в коллекцию блоков и нужной ссылке или блоку в координаты 0,0,0 вставить точку.
Потом всем элементам, включая простые примитивы, выключить видимость и по очереди включать нужный блок, запускать -refedit и указывать его точку вставки.

При открытии блока или ссылки точку удалять.
Команда -refedit автоматически откроет для редактирования по месту именно тот объект, который вы указали.
Supermax вне форума  
 
Автор темы   Непрочитано 15.04.2011, 11:33
#13
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Всё, вопрос снят. Решил задачу опираясь на ObjectDBX.
Огромное спасибо участникам дискуссии за помощь.
Идея, создания точки и потом её удаление - хороший вариант, но теперь пользоваться стандартной командой _.refedit
не вижу смысла, раз так просто добраться до исходного файла.
Если кому интересно, то код выкладываю, но это просто набросок

(defun pah:XrefDBXInit (lstxrefs / xrv dwg dbx)
;;; (setq lstXrefsInit (pah:XrefDBXInit (list (car (entsel)))))
(mapcar '(lambda (x)
(setq xrv (vlax-ename->vla-object x))
(setq dwg
(cond
( (wcmatch (setq dwg (vla-get-Path xrv)) "`.*")

(LM:Relative->Full (getvar 'DWGPREFIX) dwg)
)
( dwg )
)
)
(vl-catch-all-error-p
(vl-catch-all-apply 'vla-open
(list (setq dbx (LM:ObjectDBXDocument)) dwg)))
(list xrv dwg dbx)
)
lstxrefs)
)

(progn (setq lstobjs nil)
(mapcar '(lambda (x)
(vlax-for ENT (vla-get-ModelSpace (nth 2 x))
(if (vl-position (vla-get-objectname ENT) "AecDbWindow")
(setq lstobjs (cons ent lstobjs))
)
)) lstXrefsInit)
;;; Получаю все объекты AecDbWindow
(reverse lstobjs)
)


(defun pah:XrefDBXRELEASE (lstxrefs / doc)
;;; (pah:XrefDBXRELEASE lstXrefsInit)
(mapcar '(lambda (x)
(vla-saveas (nth 2 x) (nth 1 x))
(vla-Reload (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-get-name (nth 0 x))))
(LM:ReleaseObject (nth 2 x))
)
lstxrefs))
Функции (LM:....) брал из ссылки

Последний раз редактировалось Павлюкас, 15.04.2011 в 11:38.
Павлюкас вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Аналог REFEDIT с указанием имени внешней ссылки?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
настройка уведомлений об изменении внешней ссылки чертежа без выхода из текущего окна and.rey AutoCAD 5 09.08.2019 09:19
Цвет линий внешней ссылки igormgsu AutoCAD 7 13.06.2010 22:56
Обновление внешней ссылки Андрюха_вода AutoCAD 2 16.03.2010 14:51
Запись параметров вставки внешней ссылки в саму внешнюю ссылку. Supermax Программирование 72 27.07.2009 16:30