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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Редактирование элемента во внешней ссылке без команды _refedit

Lisp. Редактирование элемента во внешней ссылке без команды _refedit

Ответ
Поиск в этой теме
Непрочитано 03.04.2011, 19:51 #1
Lisp. Редактирование элемента во внешней ссылке без команды _refedit
молодой человек
 
Регистрация: 14.11.2007
Сообщений: 159

Здравствуйте!
Пытаюсь добавить к блоку, который находится во внешней ссылке, атрибут:
Код:
[Выделить все]
;;;(kos_create_atr_block_xref  "Введите значение атрибута" "диаметр" "12")
(defun kos_create_atr_block_xref ( podskazra name_atr umolch / )
  (setq lst        (nentsel)
	ent        (car (cadddr lst)); редактируемый элемент (блок)
	ename      (last (cadddr lst)); внешняя ссылка
        actdoc     (vla-get-ActiveDocument(vlax-get-acad-object))
        obj        (vla-Item (vla-get-Blocks actdoc)(vla-get-name (vlax-ename->vla-object ename)))
	adoc       (vla-get-XRefDatabase obj);
	block_name (cdr (assoc 2 (entget ent)))
  )
  (if (setq ent (tblobjname "block" block_name))
    (progn
      
      (setq blk_def (vla-add (vla-get-blocks adoc)   
                             (vlax-3d-point '(0. 0. 0.))
                             block_name
                    ) ;_ end of vla-add
      ) ;_ end of setq
      (vla-addattribute
             blk_def
             2.5
             9
             podskazra
             (vlax-3d-point '(0. 0. 0.))
             name_atr
             umolch
      )
      ;;;      Синхронизируем атрибуты
     (vl-cmdf "_AttSync" "имя"  block_name)
    )
  )
);
Но ничего не происходит.
То же самое не получается и с расширенными данными(вместо атрибута).
Подскажите, пожалуйста, что не так делаю?
Просмотров: 3163
 
Непрочитано 03.04.2011, 20:44
#2
Кулик Алексей aka kpblc
Moderator

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


1. Добавлять атрибуты надо к описанию блока, а не к его вхождению.
2. Если собираешься работать с внешними ссылками и при этом сохранять внесенные изменения, то придется изучать ObjectDBX и работать с неактивным документом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.04.2011, 22:09
#3
молодой человек


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


Спасибо за участие!
1. Просто мой блок, к которому я пытаюсь добавить атрибут(или РД), является вхождением внешней ссылки.
2. ObjectDBX находится в ObjectARX?

А РД возможно прикрепить к моему блоку во внешней ссылке?
молодой человек вне форума  
 
Непрочитано 03.04.2011, 22:38
#4
Кулик Алексей aka kpblc
Moderator

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


Отвечу в обратном порядке
2. ObjectDBX может вызываться из lisp: http://autolisp.ru/2010/04/08/procee...tive-document/
1. Чтобы нормально работать с внешней ссылкой, сначала файл надо открыть в фоновом режиме, внести все изменения, сохранить и закрыть файл, и выполнить обновление вхождения файла внешней ссылки в текущем файле.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.04.2011, 23:08
#5
молодой человек


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


Спасибо большое, буду разбираться!
молодой человек вне форума  
 
Автор темы   Непрочитано 08.04.2011, 16:19
#6
молодой человек


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


Код:
[Выделить все]
;;;(kos_create_atr_block_xref  "Введите значение атрибута" "диаметр" "12")
(defun kos_create_atr_block_xref ( podskazra name_atr umolch / )
  
  (setq lst        (nentsel)
	ent        (car (cadddr lst)); редактируемый элемент (блок)
	ename      (last (cadddr lst)); внешняя ссылка
	block_name (cdr (assoc 2 (entget ent)))
	file-name    (vla-get-path (vlax-ename->vla-object ename))
  )
  (setq svr (vla-getinterfaceobject
             (vlax-get-acad-object)
               (strcat "ObjectDBX.AxDbDocument."
                   (vl-princ-to-string
                   (fix (atof (getvar "acadver")))
                   ) ;_ end of vl-princ-to-string
                 ) ;_ end of strcat
         ))
  (vla-open svr file-name)
  ;;;  Ищем все блоки во внешней ссылке
  (setq res ((lambda (/ lst)
               (vlax-for item (vla-get-blocks svr)
                 (setq lst (cons item lst))
                 ) ;_ end of vlax-for
               (reverse lst)
               ) ;_ end of lambda
             )
        ) ;_ end of setq
  
   ;;;  Находим нужный блок
  (setq block (VL-REMOVE-IF-NOT (function (lambda (a) (= "-10x2835x1635" (vla-get-name a)))) res))

  ;;;  Добавляем атрибут к найденному блоку
  (if (setq block_name0 (vla-get-name (car block)))
    (progn
      
      (setq blk_def (vla-add (vla-get-blocks svr)   
                             (vlax-3d-point '(0. 0. 0.))
                             block_name0
                    ) ;_ end of vla-add
      ) ;_ end of setq
      (vla-addattribute
             blk_def
             2.5
             9
             podskazra
             (vlax-3d-point '(0. 0. 0.))
             name_atr
             umolch
      )
      ;;;      Синхронизируем атрибуты
        (if (not (member "battman.arx" (arx))) 
          (arxload "battman.arx") 
        ) ;_ end of if 
        (acet-attsync block_name0); ругается,что Таблица блоков не содержит такого блока с атрибутами: -10x2835x1635.

    )
  )
  
  (vla-saveas svr file-name)
  (vlax-release-object svr)
  (setq svr nil)
  
);defun kos_create_atr_block
В итоге атрибут добавляется в нужный блок, но не получается синхронизировать этот атрибут в открываемом файле (он же внешняя ссылка)
И ещё 2 вопроса:
1. Не могу найти команду, которая бы обновляла внешнюю ссылку?
Команда (vla-update (vlax-ename->vla-object ename)) ничего не делает.
2. Как получить все элементы, находящиеся в модели открываемого файла?
молодой человек вне форума  
 
Непрочитано 08.04.2011, 17:50
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Не могу найти команду, которая бы обновляла внешнюю ссылку?
А команда (command "_-XREF" ...) ?

Цитата:
Сообщение от молодой человек Посмотреть сообщение
Как получить все элементы, находящиеся в модели открываемого файла?
Ты имеешь ввиду ссылки? Ищешь блок с именем ссылки в таблице блоков.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.04.2011, 19:08
#8
молодой человек


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


Цитата:
А команда (command "_-XREF" ...) ?
спасибо, получилось

Цитата:
Ты имеешь ввиду ссылки? Ищешь блок с именем ссылки в таблице блоков.
Не совсем это, но уже разобрался. Надо было добраться через указатель ObjectDBX (переменная svr).
Если кому-то будет интересно, то вот так:

Код:
[Выделить все]
 (setq res ((lambda (/ lst)
               (vlax-for item (vla-get-modelspace svr); 
                 (setq lst (cons item lst))
                 ) ;_ end of vlax-for
               (reverse lst)
               ) ;_ end of lambda
             )
  )
Осталось разобраться как синхронизировать атрибут в блоке, расположенный в неактивном документе (внешней ссылке)?
А можно ли вообще добавить атрибут к блоку без применения синхронизации атрибутов?

Последний раз редактировалось молодой человек, 09.04.2011 в 14:03.
молодой человек вне форума  
 
Непрочитано 08.04.2011, 23:00
#9
den-33


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


Подскажите, можно ли обновить внешюю ссылку без использования (command "_-XREF" ...) и vl-cmdf, а с использованием ActiveX.
den-33 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Редактирование элемента во внешней ссылке без команды _refedit

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42