|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Аналог REFEDIT с указанием имени внешней ссылки?
Москва
Регистрация: 08.10.2007
Сообщений: 42
|
||
Просмотров: 4072
|
|
||||
Регистрация: 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, то буду благодарен за помощь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Павлюкас, Думаю это тебе подойдет: Copy to XRef
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 08.10.2007
Москва
Сообщений: 42
|
Именно в контексте текущего файла, так, как это сделано командой Refedit. Не открывая файл, на который ссылается XRef
VVA Спасибо за ссылку - очень полезно, но у меня немного другая проблема. Опишу более детально. У меня есть определённый объект во внешней ссылке, в который я записываю данные что-то на подобие XData. (Property Set -называются из AutoCad Architecture) Их я записываю в копию объекта. Естесственно, что они не изменяют настоящий объект. Так вот после того, как я открываю Xref с помощью RefEdit и сразу закрываю его - данные с копии объекта перезаписываются в настоящий объект, а с помощью программы, на которую вы дали мне ссылку - этого не происходит. Я уже попробовал. Последний раз редактировалось Павлюкас, 14.04.2011 в 18:31. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Тогда используй vla-CopyObjects. Или (что лично мне было бы проще) - вообще напрямую оттуда читать PropertySet'ы.
Вопрос становится интересным: а что дальше планируется с этими объектами и данными делать?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 08.10.2007
Москва
Сообщений: 42
|
Алексей, считать свойства - это вообще не проблема.
Задача именно записывать эти свойства из Xref'а в конструкции с сохранением. Вот представь - у меня есть несколько Xref'ов внутри которых есть однотипные объекты "AEC_WINDOW" Мне необходимо создать спецификацию на эти объекты. Для этого я программно записываю в каждый объект его позицию (Пример: Ок1, Ок2, Д1, Д2 и т.д.) Причём Ок1 может быть в разных конструкциях. Вторым этапом я считываю эти позиции и создаю спецификацию. Это можно сделать и не используя Property Set, но они мне нужны для оформления, когда я создаю теги "AEC_MVBLOCK_REF", аттрибутами которых будут значения Property Set. Написал как-то сумбурно, но думаю ты поймёшь, т.к. разбираешься в ACA |
|||
![]() |
|
||||
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-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 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))) И впал в ступор. Если интересно, могу бросить код В фоновом режиме - это с открыванием файлов, чтобы их открытие видел пользователь? Это не вариант. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Фоновый режим с ObjectDBX - это значит, что файлы открываются, но не появляются в списке открытых файлов и пользователь это вряд ли успеет проконтролировать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Рассказываю как командой -refedit достучаться практически до любой ссылки и блока через выбор их точкой:
Для начала, как правильно говорил Kpblc, надо создать набор из всех внешних ссылок и блоков пространства модели. Потом выписать от туда точки их вставки. Зайти в коллекцию блоков и нужной ссылке или блоку в координаты 0,0,0 вставить точку. Потом всем элементам, включая простые примитивы, выключить видимость и по очереди включать нужный блок, запускать -refedit и указывать его точку вставки. При открытии блока или ссылки точку удалять. Команда -refedit автоматически откроет для редактирования по месту именно тот объект, который вы указали. |
||||
![]() |
|
||||
Регистрация: 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. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
настройка уведомлений об изменении внешней ссылки чертежа без выхода из текущего окна | 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 |