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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Зависание Автокада при работе команды vla-open

Зависание Автокада при работе команды vla-open

Ответ
Поиск в этой теме
Непрочитано 09.06.2020, 15:46 #1
Зависание Автокада при работе команды vla-open
alexmore
 
Регистрация: 24.03.2018
Сообщений: 4

Добрый день!
Используем программу на LISP, которая последовательно открывает список чертежей и из них выбирает необходимые данные (технические требования).
Подпрограмма для работы с чертежом приведена ниже.
Работает все правильно, но до определенного момента.
Пробовал выловить ошибку, построчно записывая в лог-файл.
Доходит до определенной точки и останавливается.
При вызове строки (setq otherDoc (vl-catch-all-apply 'vla-open (list docs dwg))) автокад зависает, не возвращая никаких ошибок, как бы "зависая между окнами".
Причем программа работает этапами, сначала забирает данные из части чертежей, затем выбирает данные из другой системы (PDM), затем снова следующая часть.
И вот первый этап проходит без проблем, а как только происходит переход в подпрограмму и обрабатывается первый чертеж второго этапа, Автокад зависает.
Подскажите, с чем это может быть связано и как решить подобную проблему?


Код:
[Выделить все]
 (defun EdDwg_1 (/)
  (vl-load-com)
  
  (setq dwg doc_saved)
  (VL-PROPAGATE 'numb_joint)
  (VL-PROPAGATE 'pr_bch)
  (setq App           (vlax-get-acad-object))			; Приложение - АКАД
  (setq name_app      (vla-get-name App))
  (setq Prefs         (vla-get-Preferences App))		; коллекции настроек
  (setq PrefFiles     (vla-get-Files Prefs))			; коллекция "Файлы" настроек
  (setq docs          (vla-get-documents App))			; коллекция чертежей

  (setq	otherDoc      (vl-catch-all-apply 'vla-open (list docs dwg)))	; Открываем новый документ  
  (if (vl-catch-all-error-p otherDoc)		; Если ошибка при попытке открыть документ

    (vl-catch-all-error-message otherDoc)
    (progn		; Документ открыли без ошибок
      (setq otherMS       (vla-get-modelspace otherDoc))	; Коллекция "Пространство МОДЕЛИ" нового чертежа
      (setq otherName     (vla-get-name otherDoc))			; название нового чертежа
      (setq otherFullName (vla-get-fullname otherDoc))		; полное название нового чертежа
      (setq otherPath     (strcat (vla-get-path otherDoc) "\\"))	; путь к новому чертежу
      (setq otherLayers   (vla-get-layers otherDoc))
      (setq otherBlocks   (vla-get-blocks otherDoc))			; коллекция "Блоки" нового документа
      (setq otherPrjName  (vla-GetVariable otherDoc "PROJECTNAME"))	; установленное значение имени проекта нового документа
      (setq otherPrjPath  PROJECTPATH)

...

необходимые действия

Просмотров: 1754
 
Непрочитано 09.06.2020, 15:59
#2
Кулик Алексей aka kpblc
Moderator

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


Работай через ObjectDBX, сначала пройдись по всем dwg, собери нужную инфу, и только потом уже в PDM. Я бы делал так.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.06.2020, 14:26
#3
alexmore


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


Алексей, касательно ObjectDBX.
Нашел вашу статью
https://autolisp.ru/2010/04/08/proce...tive-document/
Нет ли у вас под рукой примеров работы такого варианта?
alexmore вне форума  
 
Автор темы   Непрочитано 11.06.2020, 08:53
#4
alexmore


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


Спасибо за совет.
Нашел вашу статью с подобной схемой на автолисп ру "Работа с неактивным документом" (не дает ссылку добавить).
А нет ли под рукой примеров программы с таким вариантом работы?
alexmore вне форума  
 
Непрочитано 11.06.2020, 09:47
#5
Кулик Алексей aka kpblc
Moderator

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


Сильно упрощенный вариант:
Код:
[Выделить все]
 (defun _lispru-acad-version () (atof (getvar "acadver")))

(defun _lispru-odbx (/)
  ;; Simple for last versions
  (vla-getinterfaceobject (vlax-get-acad-object)
                          (strcat "ObjectDBX.AxDbDocument." (itoa (fix (_lispru-acad-version))))
  ) ;_ end of vla-getinterfaceobject
) ;_ end of defun

(defun test (filename / odbx doc model line err)
  ;; (setq filename (findfile "c:\\autodesk\\testdoc.dwg"))
  (setq odbx (_lispru-odbx))
  (if (vl-catch-all-error-p
        (setq err (vl-catch-all-apply
                    (function
                      (lambda ()
                        (vla-open odbx filename)
                        (setq model (vla-get-modelspace odbx))
                        (setq line (vla-addline model (vlax-3d-point '(0. 0. 0.)) (vlax-3d-point '(100. 100. 0.))))
                        (vla-put-color line 1)
                        (vla-saveas odbx filename)
                      ) ;_ end of lambda
                    ) ;_ end of function
                  ) ;_ end of vl-catch-all-apply
        ) ;_ end of setq
      ) ;_ end of vl-catch-all-error-p
    (alert (strcat "Error : " (vl-catch-all-error-message err)))
  ) ;_ end of if
  (vlax-release-object odbx)
) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.06.2020 в 09:47. Причина: Не то сначала скопировал :)
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.06.2020, 15:04
#6
alexmore


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


Спасибо, годный код, все работает.
Пробую применить к своему, выдает ошибку, видимо связано с типом объекта.
Не работают функции (vla-get-SelectionSets otherDoc) и (vla-get-pickfirstselectionset otherDoc).
Не подскажете, как корректно наборы получить?

В моем коде:

Код:
[Выделить все]
  (setq	otherDoc      (vl-catch-all-apply 'vla-open (list docs dwg)))	; Открываем новый документ

 ; Ищем блок F25 для того чтобы найти область текста про материал
  (setq pfset (vla-get-pickfirstselectionset otherDoc))
  (vla-clear pfset)
  (setq  ftype '(0 2); коды для типа и имени блока
	 fdata '("insert" "F25"));тип и имя блока
  (setq dxfcodes (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 1)) ftype))
  (setq dxfvalues (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 1)) fdata))
  (vla-select pfset  acSelectionSetall nil nil  dxfcodes dxfvalues)
  (if (> (vla-get-count pfset) 0)
     (progn
       (vlax-for stamp pfset
	 (setq stamp_dwg (vlax-vla-object->ename stamp))
	 (setq point_stamp_dwg (cdr(assoc 10 (entget stamp_dwg))))
;;;	 (setq my_dms (vlax-variant-value (vla-GetVariable otherDoc "dimscale")))
;;;         (setq dimscale (getvar "dimscale"))
	 (setq dimscale(vlax-variant-value(vla-GetVariable otherdoc "dimscale")))
	 (setq point_1 (list(-(car point_stamp_dwg)(* 120 dimscale))(cadr point_stamp_dwg)))
         (setq point_2 (list(-(car point_stamp_dwg)(* 50 dimscale))(+(cadr point_stamp_dwg)(* 15 dimscale))))
         (setq point_s (cons point_1 point_s))
	 (setq point_s (cons point_2 point_s)); (setq point_s nil)
	 )))
или

Код:
[Выделить все]
  ; создание SelectionSet
      (setq ssets (vla-get-SelectionSets otherDoc))
      (setq newsset (vla-add ssets "my333"))
      (vla-Select newsset acSelectionSetall nil nil (MakeVariantSafearray1dim vlax-vbinteger '(0))(MakeVariantSafearray1dim vlax-vbVariant '("IMTEXT")))
      (setq ctr 0)

      (if (/= (vla-get-count newsset) 0)
	(progn
	  (setq item (vla-item newsset ctr))
	  (setq text_TT (cdr (assoc 300 (entget (vlax-vla-object->ename item)))))
	  (if (= text_TT "")
	    (progn
	    (setq item (vla-item newsset (+ ctr 1)))
	    (setq text_TT (cdr (assoc 300 (entget (vlax-vla-object->ename item)))))))
;;;	  (save_data_tt_full)
;;;	  (if (= pr_bch 1)(find_text_bch)
	    (find_text_tt)
alexmore вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Зависание Автокада при работе команды vla-open

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Acaddoc.lsp - насколько вредный Alexander88 LISP 1 10.06.2014 09:29
зависание меню свойств єлементов в AutoCad 2010 rus x86 при работе в Windows 7 micropyhcher Баги и пожелания в Autodesk 3 21.11.2009 11:05
Ограничения в работе Автокада Mazai AutoCAD 16 19.04.2009 18:45
Выполнение acaddoc.lsp - частичное отображение опций команды Автокада Makswell LISP 18 26.03.2008 18:35
Убрать raster image при работе команды 3DORBIT в Акаде 2005 Torino AutoCAD 16 26.03.2004 18:53