(vla-put-activedocument each) ??? не работает
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (vla-put-activedocument each) ??? не работает

(vla-put-activedocument each) ??? не работает

Ответ
Поиск в этой теме
Непрочитано 27.10.2007, 21:39 #1
(vla-put-activedocument each) ??? не работает
nikе
 
конструктор Лего
 
Краснодар
Регистрация: 21.10.2005
Сообщений: 204

В электронной книге Дэвида М. Штейна на стр.160
нашел такой пример, как его заставить работать?
(defun C:ZOOMALL (/ $acad docs dnum this)
(vl-load-com)
(setq $acad (vlax-get-acad-object)
docs (vla-get-documents $acad)
this (vla-get-activedocument $acad)
dnum (vla-get-count docs)
)
(vlax-for each docs
(vla-put-activedocument each )
(vla-ZoomExtents $acad)
(vla-save each)
)
(vla-put-activedocument this)
(vlax-release-object docs)
(vlax-release-object this)
(vlax-release-object $acad)
(princ (strcat "\nProcessed " (itoa dnum) "drawings."))
)
Просмотров: 4554
 
Непрочитано 27.10.2007, 23:48
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от nikе Посмотреть сообщение
нашел такой пример, как его заставить работать?
Никак. Изменение свойства activedocument прерывает контекст выполнения AutoLISP, что приводит к его остановке. Теоретически, если бы этот пример когда-нибудь мог работать, то это свойство надо было бы менять так:
Код:
[Выделить все]
(vla-put-activedocument $acad each)
Но, к сожалению, этот пример никогда не работал.
Alaspher вне форума  
 
Автор темы   Непрочитано 28.10.2007, 01:45
#3
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


А как тогда можно переписать эту программу, чтобы обойти этот vla-put-ActiveDocument?
nikе вне форума  
 
Непрочитано 28.10.2007, 01:52
#4
Кулик Алексей aka kpblc
Moderator

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


Попробовать нарисовать скрипт *.scr и запустить его. Либо рисовать командный реактор на открытие документа (ИМХО, как всегда).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.10.2007, 08:58
#5
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Как вариант - на VBA её написать, у которого контекстом выполнения явялется приложение, так что переключение между документами должно быть возможно. Не пробовал.
Alaspher вне форума  
 
Непрочитано 28.10.2007, 11:00
#6
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Скриптом иху мать:

Код:
[Выделить все]
;; BASED ON BCONVERT.LSP

;; MAIN ROUTINE
;; Batch zoom extents

(defun C:BZ (/ afile file_list strp_path)
  (alert "This routine does a zoom extents on an entire directory. Click OK to continue.") 
  (setq afile (getfiled (strcat "Select the first DWG file in folder "
             "to be processed") "" "DWG" 0))
  (setvar "filedia" 0)
  (setvar "cmdecho" 0)
  (if afile 
    (bprocess afile )
      (alert "You must select any dwg file of the directory \n
      to be processed. Conversion halted.")
  )
      (setvar "filedia" 1)
    (setvar "cmdecho" 1)
  (princ)
)
;; Local defun
;; Core processing
  (defun bprocess (afile / file_list scrfile fp file)
  (setq curr_name (vla-get-fullname
		    (vla-get-activedocument
		      (vlax-get-acad-object))))
  (setq strp_path (strcat (vl-filename-directory afile) "\\"))

  (setq file_list (vl-directory-files strp_path "*.dwg"))
  (setq file_list (mapcar (function (lambda (x) (strcat strp_path x))) file_list))
    (setq scrfile (strcat strp_path "batchzoom.scr"))  ; Begin building processing script
    (setq fp (open scrfile "w"))
    (princ (strcat "CMDECHO" " " "0" "\n") fp)
    (princ (strcat "CMDDIA" " " "0" "\n") fp)
    (foreach file file_list     ; Add each drawing to script
      (if (not (eq (strcase curr_name) (strcase file)))
	(progn
      (write-line (strcat "_OPEN " "\"" file "\"") fp) ; OPEN
      (write-line (strcat "_ZOOM" " " "_E" " " "_ZOOM" " " ".9x") fp)   ; ZOOM...E 
      (write-line (strcat "_QSAVE\n" " " "_CLOSE") fp)  ; SAVE&CLOSE
)
)
  )
(princ (strcat "CMDECHO" " " "1" "\n") fp)
(princ (strcat "CMDDIA" " " "1" "\n") fp)

    (close fp)
    (alert "Be patience...now is load script")
    (command "_DELAY" 1000); 1 second delay
    (command "_SCRIPT" scrfile)   ; Run the script
    ;(vl-file-delete scrfile); by suit
    (princ)
  )
(prompt "\n\t***\tType BZ to run batch file operation.\t***\n")
(vl-load-com)
~'J'~

Последний раз редактировалось fixo, 28.10.2007 в 11:01. Причина: потерялась одна скобка
fixo вне форума  
 
Автор темы   Непрочитано 29.10.2007, 18:12
#7
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


Мне нужно выполнить операции над всеми открытыми рисунками, а не указывать файлы или директорию. Значит, возможно придется писать такое на С++? VBA есть не на всех машинах, а сие нужно для Брикса.
nikе вне форума  
 
Непрочитано 29.10.2007, 19:39
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от nikе Посмотреть сообщение
Мне нужно выполнить операции над всеми открытыми рисунками, а не указывать файлы или директорию.
Очень советую, для начала описать задачу...
Елпанов Евгений вне форума  
 
Непрочитано 29.10.2007, 20:24
#9
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от nikе Посмотреть сообщение
Мне нужно выполнить операции над всеми открытыми рисунками, а не указывать файлы или директорию. Значит, возможно придется писать такое на С++? VBA есть не на всех машинах, а сие нужно для Брикса.
У меня Брикса нема, только Акад

~'J'~
fixo вне форума  
 
Непрочитано 29.10.2007, 21:09
#10
Кулик Алексей aka kpblc
Moderator

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


Тем более надо рассказать всю задачу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.10.2007, 22:23
#11
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


Задача до банальности проста. Над всеми открытыми рисунками проделать ZoomExtents и Save.
nikе вне форума  
 
Непрочитано 29.10.2007, 22:39
#12
Кулик Алексей aka kpblc
Moderator

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


Используя лисп или VBA, это сделать невозможно (ИМХО). Может, проще будет два раза на колесе жамкнуть? И сделать это пользователю?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.10.2007, 08:19
#13
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Используя лисп или VBA, это сделать невозможно (ИМХО).
Почему же невозможно? Простые действия можно сделать скриптом. Для сложных - LISP.

В "САПР на базе AutoCAD..." есть функция ru-batch-file-operations, которая позволяет выполнять любые действия со списком файлов.

Вот она:
Код:
[Выделить все]
 
(defun ru-batch-file-operations  (first_message files_list test_func quoted_func / do_it)
  (if (not first_message)
    (setq do_it t)
    (setq do_it ((eval test_func) first_message))
  ) 
  (if do_it  (mapcar quoted_func    files_list))
  (princ)
)
Весь секрет в подготовке аргументов и в написании quoted_func, которая может делать все, что угодно с файлом.

Алгоритм основан на том, что в текущий файл (изначально пустой), вставляются другие файлы из списка, с ними что-то делается, содержимое после операций сохраняется в файл-блок с тем же именем, производится очистка и дальше уродуется следующий файл.

Все действия производятся в контексте одного документа.
ShaggyDoc вне форума  
 
Непрочитано 30.10.2007, 08:38
#14
Кулик Алексей aka kpblc
Moderator

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


Я охотно верю (вспылил, был неправ), но дело в том, что файлы-то открыты, а не просто так "болтаются где-то там". В момент сохранения ошибку не получим?
И потом, какой смысл выполнять ZoomExtends - лично для меня тайна, покрытая мраком. В пакетном режиме можно (и нужно) выполнять задачи другого плана: очистить dwg-файлы каталога от мусора, выполнить перекодировку, назначить текстовый и (или) размерный стили и т.п... Но играться с отображением?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.10.2007, 08:45
#15
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Алгоритм основан на том, что в текущий файл (изначально пустой), вставляются другие файлы из списка...
Уточню - содержимое пространства модели... Содержимое листов, настройки одноимённых стилей и ещё некоторые "мелочи" при этом, всё-ж теряются.
Alaspher вне форума  
 
Непрочитано 30.10.2007, 11:32
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я охотно верю (вспылил, был неправ), но дело в том, что файлы-то открыты, а не просто так "болтаются где-то там". В момент сохранения ошибку не получим?
И потом, какой смысл выполнять ZoomExtends - лично для меня тайна, покрытая мраком. В пакетном режиме можно (и нужно) выполнять задачи другого плана: очистить dwg-файлы каталога от мусора, выполнить перекодировку, назначить текстовый и (или) размерный стили и т.п... Но играться с отображением?
Полностью с этим согласен. Ни к чему это баловство с зуммированием "в автомате", раз файлы уже открыты. Возможно, превьювы надо обновить?Да и открыто их будет немного. Но файлы можно предварительно закрыть, в том числе автоматически. .

Поправка Alaspher более серьезная, сам я забыл об этом упомянуть. Конечно, так работать можно только с моделью. Но учитывая большое количество "толькомоделистов", метод пригоден.

Со SCR-файлами тоже могут быть большие проблемы - как гарантирвать, что в момент выполнения команды из скрипта или загрузки файла не возникнет нештатная ситуация, например, запрос о каком-нибудь SHX или еще что-нибудь.

В общем, тщательнЕе надо. Но уж точно не "писать такое на С++" ради Zoom. Точнее, именно на C++.

Можно и внешнюю программу сделать, которая будет обращаться к Автокаду как к приложению, грузить документ из списка и что-то делать.
ShaggyDoc вне форума  
 
Непрочитано 01.11.2007, 01:59
#17
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от nikе Посмотреть сообщение
Мне нужно выполнить операции над всеми открытыми рисунками, а не указывать файлы или директорию. Значит, возможно придется писать такое на С++? VBA есть не на всех машинах, а сие нужно для Брикса.
А так будет работать?

Код:
[Выделить все]
(defun C:BC  (/)
  
  (or (vl-load-com))
  (setvar "filedia" 1)
  (setvar "qaflags" 0)
  (setvar "cmddia" 1)
  (setvar "cmdecho" 1)
  (setvar "sdi" 0)
  (setvar "lispinit" 1)
  (setvar "xloadctl" 1)
  (setvar "demandload" 3)
  (vlax-for a  (vla-get-documents (vlax-get-acad-object))
    (setq lst (cons (vla-get-fullname a) lst)))
  (setq cnt 0)
  (while (< cnt
	    (vla-get-count (vla-get-documents (vlax-get-acad-object))))
    (setq dwg (vla-item (vla-get-documents (vlax-get-acad-object)) cnt))
    (vla-zoomextents (vla-get-application dwg))
    (vla-save dwg)
    (setq cnt (1+ cnt)))
  (vlax-for a  (vla-get-documents (vlax-get-acad-object))
    (not
      (vl-catch-all-error-p
	(vl-catch-all-apply (function (lambda () (vla-close a)))))))
  (princ)
  )

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 01.11.2007, 13:18
#18
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


->Fatty
Так тоже не работает, результат работы - ZoomExtents для активного документа, а все остальные открытые - просто закрываются. Пробовал на ACAD 2006 RUS.
nikе вне форума  
 
Непрочитано 01.11.2007, 13:41
#19
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


И не должно работать...
Евгений А. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (vla-put-activedocument each) ??? не работает



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает кнопка delete Askerovich AutoCAD 56 14.07.2014 16:22
MText не работает Krieger AutoCAD 9 10.08.2005 02:47
Помогите!!! Raster Design не работает Галина Прочее. Программное обеспечение 2 30.07.2004 14:58
Мое меню не работает. Где ошибка? Pilot Программирование 3 25.12.2003 15:05
свойства объекта в 2004 не всегда работает ingener AutoCAD 3 03.12.2003 12:37