Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Алексей Федоров от 31-10-2016, 13:21:22

Название: Работа со скриптами
Отправлено: Алексей Федоров от 31-10-2016, 13:21:22
Доброго времени суток!

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

Код - Auto/Visual Lisp [Выбрать]
  1. (setq fo (open (strcat path_ritm_sudno "\\tmp\\myscript.scr") "w"))  
  2. (while (< i le_spis_file)
  3. (write-line "_.OPEN" fo)
  4. (write-line (strcat ORDER_DIR "DWG\\" (nth i spis_file)) fo)
  5. (write-line "(np_l \"fa_stat_f_l.vlx\")" fo)  
  6. (write-line "(one_pos_stat)" fo)
  7. (write-line "_.SAVE" fo)
  8. (write-line (strcat ORDER_DIR "DWG\\" (nth i spis_file)) fo)
  9. (write-line "_.CLOSE" fo)
  10. (setq i (+ i 1))
  11. )  
  12. (write-line "(np_l \"fa_stat_f_l.vlx\")" fo)  
  13. (write-line "(fa_svod_f_l)" fo)
  14. (close fo)
  15.  
  16. (setvar "SDI" 0)
  17. (command "_.delay" 1000)
  18. (command "_.SCRIPT" (strcat path_ritm_sudno "\\tmp\\myscript.scr"))
  19. (vl-file-delete (strcat path_ritm_sudno "\\tmp\\myscript.scr"))
  20. (fa_svod_f_l)

Подскажите почему так происходит и что мне сделать, чтоб функция (fa_svod_f_l) выполнялась после скрипта?
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 13:52:40
Ничего не понял. Что ты собираешься делать с открытыми документами? Это самый главный вопрос.
Вопрос номер два: можно ли те же вещи сделать в консольном AutoCAD? Если да, то почему не делается в нем?
Скрипт, конечно, вещь хорошая - но я бы поискал альтернативные решения.
Название: Re: Работа со скриптами
Отправлено: Алексей Федоров от 31-10-2016, 14:25:58
Алексей, с каждого открытого документа я считываю уникальные значения атрибутов блока. Мне нужно перебрать все DWG-файлы папки и считать с каждого определенную информацию. Насколько я знаю в Лиспе открывать DWG-файлы можно только с помощью скриптов.
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 14:39:46
Ай-яй-яй, неправда ваша :) А ObjectDBX на что? Открываем файл, считываем содержимое блока пространства модели и анализируем его как угодно. Другой момент, если во вхождениях блоков используются поля - тогда ситуация становится значительно более печальной.
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 14:40:25
В крайнем случае есть другой вариант: вставить файл как внешнюю ссылку, пройтись по нему как по обычному блоку, выгрузить ссылку. И так далее, пока список файлов не кончится
Название: Re: Работа со скриптами
Отправлено: Алексей Федоров от 31-10-2016, 14:53:51
Понимаете, Алексей, программу я уже практически написал, и с использованием скриптов. Просто она с состоит из двух частей: первая часть - перебор файлов и запись нужных мне данных в блокнотовский файл;вторая - работа с получившимся блокнотовским файлом. Если запускать эти части программы последовательно порознь, то все получается как надо. Просто хотелось бы объединить эти две программы в одну.
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 15:35:19
Ну, меня один ))
Я бы все же через ObjectDBX, наверное, шел - проще и дешевле. И ошибки отловить можно запросто. И сообщений о ненайденных шрифтах / ссылках / типах линий не появляется (но все это будет зависеть от состава блоков). Сейчас из описания я понял только то, что я ничего не понял...
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 31-10-2016, 16:10:35
Алексей Федоров
Зачем SDI устанавливаешь в 0? Для такой обработки скорее SDI следовало устанавливать в 1. _CLOSE придётся убрать.
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 31-10-2016, 16:11:44
Алексей, с каждого открытого документа я считываю уникальные значения атрибутов блока. Мне нужно перебрать все DWG-файлы папки и считать с каждого определенную информацию.
Если только считываешь информацию, то зачем файл сохранять?
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 16:33:44
Я боюсь, что во вхождениях блоков (в атрибутах) участвуют поля, которые следует пересчитывать.
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 31-10-2016, 16:41:27
Я боюсь, что во вхождениях блоков (в атрибутах) участвуют поля, которые следует пересчитывать.
И? Для этого чертеж всё-равно не обязательно сохранять.
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 31-10-2016, 16:51:54
Логично :) С другой стороны, кто его знает - что там на событие сохранения "повешено" ;)
Название: Re: Работа со скриптами
Отправлено: Алексей Федоров от 02-11-2016, 10:39:04
Алексей Федоров
Зачем SDI устанавливаешь в 0? Для такой обработки скорее SDI следовало устанавливать в 1. _CLOSE придётся убрать.
Александр, если SDI равен 1, то задает вопрос "Really want to discard all changes to drawing?" и при любом ответе работа программы заканчивается.
Название: Re: Работа со скриптами
Отправлено: Алексей Кулик от 02-11-2016, 11:28:42
Алексей Федоров, приведи код своих функций. Я почему-то думаю, что можно обойтись и другими методами, без скриптов и проч. Ну или действительно задействовать консольный ACAD...
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 02-11-2016, 14:08:48
Александр, если SDI равен 1, то задает вопрос "Really want to discard all changes to drawing?" и при любом ответе работа программы заканчивается.
Если у тебя в коде _SAVE, то откуда этот запрос?
Название: Re: Работа со скриптами
Отправлено: Алексей Федоров от 02-11-2016, 14:09:36
Полностью функции приводить я думаю нет смысла, они достаточно громоздкие и там помимо прочего есть взаимодействие с FoxPro, приведу упрощенную версию функций. Суть от этого не меняется.

Код - Auto/Visual Lisp [Выбрать]
  1. (defun fa_razb (  /  )
  2.  
  3. (setq path_ritm_sudno (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\ЦНИИТС\\РИТМ-СУДНО" "path"))
  4. (setq fo (open (strcat path_ritm_sudno "\\Project.txt" ) "R"))
  5. (read-line fo)
  6. (read-line fo)
  7. (read-line fo)
  8. (read-line fo)
  9. (read-line fo)
  10. (read-line fo)
  11. (setq VSPOM_ORDER_DIR (read-line fo))  
  12. (close fo)  
  13.  
  14. (setq ORDER_DIR (substr VSPOM_ORDER_DIR 6))
  15.  
  16. (setq spis_file (vl-directory-files (strcat ORDER_DIR "DWG") "*.DWG" 1))
  17. (setq le_spis_file (length spis_file))
  18. (setq i 0)
  19.  
  20.  
  21. (vl-file-delete (strcat path_ritm_sudno "\\tmp\\FasLasStat.txt"))  
  22. (setq fo (open (strcat path_ritm_sudno "\\tmp\\myscript.scr") "w"))  
  23. (while (< i le_spis_file)
  24. (write-line "_.OPEN" fo)
  25. (write-line (strcat ORDER_DIR "DWG\\" (nth i spis_file)) fo)
  26. (write-line "(np_l \"fa_stat_f_l.vlx\")" fo)  
  27. (write-line "(one_pos_stat2)" fo)
  28. (write-line "_.SAVE" fo)
  29. (write-line (strcat ORDER_DIR "DWG\\" (nth i spis_file)) fo)
  30. (write-line "_.CLOSE" fo)
  31. (setq i (+ i 1))
  32. )  
  33. ;(write-line "(np_l \"fa_stat_f_l.vlx\")" fo)  
  34. ;(write-line "(fa_svod_f_l)" fo)
  35. (close fo)
  36.  
  37.  (setvar "SDI" 0)
  38.  (command "_.delay" 0)
  39.  (command "_.SCRIPT" (strcat path_ritm_sudno "\\tmp\\myscript.scr"))
  40.  ;(vl-file-delete (strcat path_ritm_sudno "\\tmp\\myscript.scr"))
  41.  (fa_svod_f_l2)
  42.  
  43.  
  44. )
  45.  
  46. (defun one_pos_stat2 ( / )
  47. (alert "1")
  48. )
  49.  
  50. (defun fa_svod_f_l2 ( / )
  51. (alert "2")
  52. )

Все равно сначала выводится сообщение "2", а уж потом сообщения "1" столько раз, сколько DWG-файлов в папке.
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 02-11-2016, 14:15:27
Я вообще перестал что-то понимать. Ты в скрипт записываешь
Код - Auto/Visual Lisp [Выбрать]
  1. (write-line "(fa_svod_f_l)" fo)
После этого запускаешь скрипт, а потом снова запускаешь
Код - Auto/Visual Lisp [Выбрать]
  1. (fa_svod_f_l)
Так и что ты хочешь?
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 02-11-2016, 14:18:24
И прочитай уже наконец-то у меня в подписи как следует форматировать код на форуме.
Название: Re: Работа со скриптами
Отправлено: Алексей Федоров от 02-11-2016, 17:04:09
Александр Ривилис, извините, вы видимо не туда посмотрели. я не записываю в скрипт

Код - Auto/Visual Lisp [Выбрать]
  1. (write-line "(fa_svod_f_l)" fo)

Эта строчка в скрипте у меня закомментирована.
Название: Re: Работа со скриптами
Отправлено: Александр Ривилис от 02-11-2016, 17:25:17
Александр Ривилис, извините, вы видимо не туда посмотрели. я не записываю в скрипт
Я смотрел исходный скрипт в первом сообщении темы.
P.S.: Запиши в конец скрипта
Код - Auto/Visual Lisp [Выбрать]
  1. (fa_svod_f_l2)
а из основного кода его убери.
Иначе вряд ли у тебя что-то хорошее получится.
И вообще такой код будет зависеть от версии AutoCAD и состояния переменной FIBERWORLD