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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Запуск нескольких функций.

Lisp. Запуск нескольких функций.

Ответ
Поиск в этой теме
Непрочитано 31.03.2015, 08:51 #1
Lisp. Запуск нескольких функций.
dpermyakov
 
Регистрация: 31.07.2014
Сообщений: 5

Занимаемся вопросом централизованной адаптацией рабочих мест. Программирование на Autolisp на нулевом уровне.
Через файл acad2014.lsp подгружаем, созданный нами, файл Test.lsp с различными настройками, переменными. Файл содержит одну функцию, например «Defun MAIN». Настал момент необходимости добавить вспомогательную функцию «defun SubMAIN» в этот файл, которая вызывается из основной. Однако, при загрузке Autocad-а обе функции выполняются последовательно.
Есть ли возможность запуска только основной функции или возможность прервать ее выполнение в коде программы?
Просмотров: 2414
 
Непрочитано 31.03.2015, 08:52
#2
Кулик Алексей aka kpblc
Moderator

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


А кто мешает снять вызов subMain?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2015, 09:15
#3
dpermyakov


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


Никто не мешает, но задача данной дополнительной функции копирование n-количества разных каталогов с файлами в разные пути назначения. Не хотелось бы повторять в теле основной функции данную операцию несколько раз. (собственно, в доп.функцию передаются исходный путь каталога и путь назначения).
dpermyakov вне форума  
 
Непрочитано 31.03.2015, 09:16
#4
Кулик Алексей aka kpblc
Moderator

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


Ну так перед запуском проверяй необходимость выполнения, в чем трудность?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2015, 09:24
#5
dpermyakov


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


Проверка существования каталогов естественно происходит по условию IF, если нет, то копируются, т.е. передаются параметры в функцию submain. Если все каталоги существуют, то выполнение программы в любом случае дойдет и начнет выполнять данную функцию, а ей не переданы параметры, начнет ругаться или есчо чего... Поэтому нужен принудительный выход из основной функции. Я сравниваю по аналогии с языками программирования Паксаль и Си, там есть основная функция, а доп процедуры и функции вызываются из нее, а в ЛИСПЕ все идет подряд как я вижу(может и я чего не понимаю, так я и не спорю, странный синтаксис языка).
dpermyakov вне форума  
 
Непрочитано 31.03.2015, 09:37
#6
Кулик Алексей aka kpblc
Moderator

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


dpermyakov, ты код покажи - иначе можно гадать до бесконечности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2015, 10:44
#7
dpermyakov


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


Код:
[Выделить все]
 (defun MAIN ( / acadObj preferences )
  (vl-load-com)
  (setq mydir  (vl-registry-read (strcat "HKEY_LOCAL_MACHINE\\" (vlax-product-key)) "ACADLOCATION"))
  (setq mydir (strcat mydir "\\Net")) 

  (if nil (file-directory-p mydir)
   (progn 
      (vl-mkdir mydir)
      (vl-file-copy "\\\\192.168.0.17\\ACAD$\\Utility\\Copyfile\\USPBlock.ini" (strcat mydir "\\USPBlock.ini"))
      (vl-file-copy "\\\\192.168.0.17\\ACAD$\\Utility\\Copyfile\\AutoCADUtility.dll" (strcat mydir "\\AutoCADUtility.dll"))
      (vl-file-copy "\\\\192.168.0.17\\ACAD$\\Utility\\Copyfile\\TruboprovodBase2.dll" (strcat mydir "\\TruboprovodBase2.dll"))
   ))

;;;---- Вот тут вызываем доп.функцию  и копируем папки в разные места ----(пока закоментил от греха подальше)
;;;------ Проверку существования каталога тут не описана, но она обязательно будет, и будем считать что она есть!
;;;---    Копировать по одному файлу как в блоке када выше - не есть гуд....
  
;;;(LM:copyfolder "C:\\sourcefolder1" "C:\\destinationfolder1")
;;;(LM:copyfolder "C:\\sourcefolder2" "C:\\destinationfolder2")
;;;(LM:copyfolder "C:\\sourcefolder3" "C:\\destinationfolder3")
 
(setq WshShell (vlax-create-object "WScript.Shell"))
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Utility\\LOADCTRLS" 2 "REG_DWORD")
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Utility\\MANAGED" 1 "REG_DWORD")
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Utility\\LOADER" "C:\\Program Files\\Autodesk\\AutoCAD 2014\\Net\\AutoCADUtility.dll" "REG_SZ")  
(vlax-invoke-method wshshell 'RegRead "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Utility\\LOADCTRLS")
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Net\\LOADCTRLS" 2 "REG_DWORD")
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Net\\MANAGED" 1 "REG_DWORD")
(vlax-invoke-method wshshell 'RegWrite "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Net\\LOADER" "C:\\Program Files\\Autodesk\\AutoCAD 2014\\Net\\TruboprovodBase2.dll" "REG_SZ")  
(vlax-invoke-method wshshell 'RegRead "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R19.1\\ACAD-D001:419\\Applications\\Net\\LOADCTRLS")  
  
 
  (setq acadObj (vlax-get-acad-object))
  (setq preferences (vla-get-Preferences acadObj))
  (vla-put-TemplateDwgPath (vla-get-Files preferences) "\\\\192.168.0.17\\ACAD$\\Template")
  (vla-put-AutoSavePath (vla-get-Files preferences) "D:\\автосохранение autocad 2014")
  (vla-put-TempFilePath (vla-get-Files preferences) "D:\\автосохранение autocad 2014")
  (vla-put-TempXrefPath (vla-get-Files preferences) "D:\\автосохранение autocad 2014")
  (vla-put-qnewtemplatefile (vla-get-files preferences) "\\\\192.168.0.17\\ACAD$\\Template\\УСП_Основной.dwt")

  (setq plotters "")
  (setq plotters (getenv "PrinterConfigDir"))
  (if (vl-string-search "ACAD$" plotters)
   (Princ plotters)
   (progn
      (setq plotters (strcat plotters ";\\\\192.168.0.17\\ACAD$\\Plotters"))
      (setenv "PrinterConfigDir" plotters)
   ))


(vla-put-supportpath  (vla-get-files (vla-get-preferences (vlax-get-acad-object)))
   (strcat
      "\\\\192.168.0.17\\ACAD$\\Geo_hatch;"
      "\\\\192.168.0.17\\ACAD$\\Fonts;"
      "\\\\192.168.0.17\\ACAD$\\Lisp;"
      "C:\\Users\\DPermyakov\\appdata\\roaming\\autodesk\\autocad 2014\\r19.1\\rus\\support;"
      "C:\\program files\\autodesk\\autocad 2014\\support\\ru-ru;"
      "C:\\program files\\autodesk\\autocad 2014\\help;"
      "C:\\program files\\autodesk\\autocad 2014\\express;"
      "C:\\program files\\autodesk\\autocad 2014\\support\\color;"
      "C:\\program files\\autodesk\\autocad 2014\\support"
	  
   ))
  (setvar "filedia" 1)
  (setvar "isavebak" 1)
  (setvar "isavepercent" 0)
  (setvar "savetime" 10)
  (setvar "attipe" 1)
  (setvar "GRIPOBJLIMIT" 1000)
  (setvar "LAYOUTREGENCTL" 1000)
  (command "wsautosave" 0)
  (command "newtabmode" 0)
  (setvar "fontalt" "spds.shx")
  (command "gridmode" "0")
  (command "wsautosave" 0)
  (command "_cuiload" "\\\\192.168.0.17\\ACAD$\\Utility\\TO\\USP_TO.cuix")
  (command "_cuiload" "\\\\192.168.0.17\\ACAD$\\Utility\\OII\\topoplan.mnu")
  (princ))
  (MAIN)


;;---- Функция не моя, это и есть доп.функция -----

;; Copy Folder  -  Lee Mac
;; Uses the CopyFolder method of the FileSystemObject (FSO) to recursively
;; copy a folder from one location to another.
;; src - [str] Directory to be copied
;; des - [str] Destination directory
;; ovr - [bol] T=overwrite existing files, nil=do not overwrite
;; Returns T if copy was successful, else nil

(defun LM:copyfolder ( src des ovr / fso rtn )
    (if (setq fso (vlax-create-object "scripting.filesystemobject"))
        (progn
            (setq rtn
                (not
                    (or (zerop (vlax-invoke fso 'folderexists src))
                        (vl-catch-all-error-p
                            (vl-catch-all-apply 'vlax-invoke
                                (list fso 'copyfolder src des (if ovr :vlax-true :vlax-false))
                            )
                        )
                    )
                )
            )
            (vlax-release-object fso)
            rtn
        )
    )
)
dpermyakov вне форума  
 
Непрочитано 31.03.2015, 11:31
#8
Кулик Алексей aka kpblc
Moderator

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


Код, мягко говоря, не совсем рабочий и далеко не оптимальный. Но вопрос не в этом.
Если DestinationFolder существует, то получай список файлов оттуда, и сравнивай со списком файлов из SourceFolder. По идее надо сравнивать MD5-суммы, но их вычисление в LISP занимает весьма приличное время. Поэтому я сравниваю даты файлов: если на сервере файл более новый, то удалить локальную копию и скопировать с сервера.
Ну или тупо выполняй копирование, получая в результате полную кашу на локальных машинах.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2015, 11:50
#9
dpermyakov


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


Все ясно, спасибо.
dpermyakov вне форума  
 
Непрочитано 31.03.2015, 13:58
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от dpermyakov Посмотреть сообщение
Занимаемся вопросом централизованной адаптацией рабочих мест. Программирование на Autolisp на нулевом уровне.
Через файл acad2014.lsp подгружаем, созданный нами, файл Test.lsp с различными настройками, переменными. Файл содержит одну функцию, например «Defun MAIN». Настал момент необходимости добавить вспомогательную функцию «defun SubMAIN» в этот файл, которая вызывается из основной. Однако, при загрузке Autocad-а обе функции выполняются последовательно.
Есть ли возможность запуска только основной функции или возможность прервать ее выполнение в коде программы?
Будете рвать зубы, обращайтесь, стоматолог из меня нулевой, но лично вам я помогу...
gomer вне форума  
 
Непрочитано 31.03.2015, 15:20
#11
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,991


Offtop:
Цитата:
Сообщение от gomer Посмотреть сообщение
стоматолог из меня нулевой, но лично вам я помогу...
Злоехидна из тебя - 100%-ная.
Nike вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Запуск нескольких функций.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нежелательный запуск нескольких копий Solid Works DonVik SolidWorks 13 21.02.2012 14:23
Lisp запуск VBA и ожидание завершения gizmo_zx LISP 6 21.02.2011 14:24
Запуск Lisp с помощью "Параметра выбора" (Lookup) Eddicordo LISP 6 08.12.2010 21:56
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06