Тема: Как в неактивном документе запустить функцию

и получить в активный документ, результат этой функции?
Схема такая
Из активного документа открыть неактивный
запустить там функцию
получить в активный документ её результат.
Если можно конкретный пример.

Re: Как в неактивном документе запустить функцию

Дак проблем никаких при работе через объектную модель (VLA- функции).

Re: Как в неактивном документе запустить функцию

;;;   ПРИМЕР. Функция открытия файла
;;;   namfil - полное имя файла.
;;;   docs - the collection of all AutoCAD drawings that are open
;;;   in the current session.  (vla-get-documents (vlax-get-acad-object))
(defun open-file (namfil docs / CT DOC)
  (setq ct 0)
;;;   Проверяем может наш уже открыт.
;;;   Если да, повторно не открывать, а получить указатель на уже открытый.
  (while (and (> (vla-get-count docs) ct) (not doc))
    (if (eq namfil (vla-get-fullname (vla-item docs ct)))
      (setq doc (vla-item docs ct))
    ) ;_ end of if
    (setq ct (1+ ct))
  ) ;_ end of while
;;;   Открываем документ если среди открытых нет нашего т. е. namfil
  (if (not doc)
    (setq doc (vl-catch-all-apply 'vla-open (list docs namfil)))
  ) ;_ end of if
  (if (vl-catch-all-error-p doc)
;;;   Если не смогли открыть возвращаем nil.
    (setq doc nil)
;;;   Если открыли возвращаем VLA-объект (указатель открытого документа).
    doc
  ) ;_ end of if
) ;_ end of defun
;;;
;;;   Функция закрытия файла.
;;;   namfil - имя файла которое будет выводиться
;;;   если не смогли сохранить или nil если сообщение не нужно.
;;;   doc - VLA-объект (указатель закрываемого документа).
;;;   Если save = t при закрытии сохранять.
;;;   ==========================================================
(defun close-file (doc namfil save / ERR)
  (if save
    (setq err (vl-catch-all-apply 'vla-save (list doc)))
  ) ;_ end of if
;;;   Если не можем сохранить и задано имя файла и нужно сохранять, то ...
  (if (and (vl-catch-all-error-p err) namfil save)
    (alert (strcat "Не могу сохранить файл:\n" namfil))
  ) ;_ end of if
  (vla-close doc :vlax-false)
) ;_ end of defun

А дальше сам.

Re: Как в неактивном документе запустить функцию

Простенький пример. На диске D должен быть файл test.dwg

(defun C:TEST ( / from File obj )
(vl-load-com)
(setq from "D:\\test.dwg")
(setq File (vla-open (vla-get-documents(vlax-get-acad-object))  from))
;;;Делать все надо vla методами
(princ "\nИмя файла-")(princ (vlax-variant-value (vla-GetVariable File "DWGNAME")))
(princ "\nТекущий слой-")(princ (vlax-variant-value (vla-GetVariable File "CLAYER")))
(princ "\nКол-во объектов в модели-")(princ (vla-get-Count (vla-get-ModelSpace File)))
(princ "\nРисуем линию от 0,0 до 100,100")
(setq obj (vla-AddLine (vla-get-ModelSpace file) (vlax-3d-point '(0 0 0))(vlax-3d-point '(100 100 0))))
(vla-put-color obj  acRed)
(vla-saveas File from ac2004_dwg)
;(vla-put-ActiveDocument  (vlax-get-acad-object) File) ;_Можно сделать активным
(vla-close File)
(vlax-release-object File)
(princ)
)

См. работу с файлами
https://www.caduser.ru/forum/topic29936.html
https://www.caduser.ru/forum/topic28268.html
http://dwg.ru/forum/printtopic.php?t=6302
Через ObjectDBX.AxDbDocument
http://dwg.ru/forum/viewtopic.php?t=10010
http://dwg.ru/forum/printtopic.php?t=4457
https://www.caduser.ru/forum/topic26175.html
http://www.google.com/search?hl=ru& … %7Clang_ru

Re: Как в неактивном документе запустить функцию

> Alexander

> VVA
Т.е. функцию в которой не только vla-методы не пойдёт?
А если используется ssget?

Re: Как в неактивном документе запустить функцию

> PahRam
Через Vla. Можешь взять отсюда VxSsetSelect - ActiveX counterpart to 'ssget'

Re: Как в неактивном документе запустить функцию

Это не то. Функцию нельзя запустить. Если делаешь неактивный файл активным, то управление передаётся в неактивный документ, следовательно программа прерывается.
Можно из активного документа создать автоматическую загрузку моей функции. Её результат записать в переменную, которая видна во всех документах и закрыть этот документ. Но вот вопрос. Вернётся ли управление к моей управляющей программе?

Re: Как в неактивном документе запустить функцию

> VVA
За ссылку огромное спасибо

Re: Как в неактивном документе запустить функцию

> PahRam
На всякий случай
Если использовать метод ObjectDBX то функцию ssget
использовать нельзя, придется довольствоваться простым перебором
объектов в том или ином лэйауте
~'J'~

Re: Как в неактивном документе запустить функцию

> PahRam
Этого не надо делать (неактивный файл активным)
Исходные те же:
На диске D должен быть файл test.dwg и пару красных отрезков в модели. Введена глобальная переменная *CurrDoc* - указатель на текущий документ. И чуть подправленные ф-ции VxSsetSelect VxSsetMake. Новые с индексом *
VxSsetSelect* и VxSsetMake* Вызов их такой же, как и оригинала.

(defun C:TEST ( / from obj )
(vl-load-com)
(setq from "D:\\test.dwg")
(setq *CurrDoc* (vla-open (vla-get-documents(vlax-get-acad-object))  from))
;;;Делать все надо vla методами
(princ "\nИмя файла-")(princ (vlax-variant-value (vla-GetVariable *CurrDoc* "DWGNAME")))
(princ "\nТекущий слой-")(princ (vlax-variant-value (vla-GetVariable *CurrDoc* "CLAYER")))
(princ "\nКол-во объектов в модели-")(princ (vla-get-Count (vla-get-ModelSpace *CurrDoc*)))
(princ "\nРисуем линию от 0,0 до 100,100")
(setq obj (vla-AddLine (vla-get-ModelSpace *CurrDoc*) (vlax-3d-point '(0 0 0))(vlax-3d-point '(100 100 0))))
(vla-put-color obj  acRed)
;;;Выбираем красные линии
(setq ass (VxSsetSelect* "LINE" acSelectionSetAll nil nil '((0 . "LINE")(62 . 1))))
(vlax-for item ass
  (princ "\nLine startpoint ")(princ (vlax-curve-getStartPoint item))
  )
(vla-clear ass)
(vlax-release-object ass)
(vla-saveas *CurrDoc* from ac2004_dwg)
;(vla-put-ActiveDocument  (vlax-get-acad-object) File) ;_Можно сделать активным
(vla-close *CurrDoc*)
(vlax-release-object *CurrDoc*)
(setq *CurrDoc* nil)
(princ)
)
;;;Описания ф-ций брать
;;;http://www.menziengineering.ch/Downloads/Download.htm#31
(defun VxSsetSelect* (Nme Mde Pt1 Pt2 Flt / CurSet FltLst FstPnt NxtPnt)
 (setq CurSet (VxSsetMake* Nme)
       FstPnt (cond (Pt1 (vlax-3d-point Pt1)) (T nil))
       NxtPnt (cond (Pt2 (vlax-3d-point Pt2)) (T nil))
       FltLst (cond (Flt (VxSsetFilter Flt)) (T nil)))
 (if Mde
  (if FltLst
   (vla-select CurSet Mde FstPnt NxtPnt (car FltLst) (cadr FltLst))
   (vla-select CurSet Mde FstPnt NxtPnt))
  (if FltLst
   (vla-SelectOnScreen CurSet (car FltLst) (cadr FltLst))
   (vla-SelectOnScreen CurSet)))
 CurSet)
(defun VxSsetMake* (Nme / SetCol)
 (setq SetCol (vla-get-SelectionSets *CurrDoc*))
 (if (vl-catch-all-error-p
      (vl-catch-all-apply 'vla-add (list SetCol Nme)))
  (vla-clear (vla-Item SetCol Nme)))
 (vla-Item SetCol Nme))
(defun VxSsetFilter (Flt)
 (mapcar
 '(lambda (Typ Dat) (VxListToArray Dat Typ))
  (list vlax-vbInteger vlax-vbVariant)
  (list (mapcar 'car Flt) (mapcar 'cdr Flt))))
(defun VxListToArray (Lst Typ)
 (vlax-make-variant (vlax-safearray-fill
   (vlax-make-safearray Typ (cons 0 (1- (length Lst))))
   Lst)))

Re: Как в неактивном документе запустить функцию

Всем огромное спасибо. Разобрался

Re: Как в неактивном документе запустить функцию

Народ, помогите...
Как распечатать листы из неактивного документа?

До листов дойти могу, а дальше что делать-ТО?
Plot - отсутствует.
В отличии от ActiveDocument.