(изменено: shprot, 25 марта 2013г. 00:03:46)

Тема: Повторный запуск макроса по нажатию Enter

Здравствуйте.
Скажите пожалуйста как осуществить возможность повторного запуска макроса по нажатию Enter. Сейчас AutoCAD просто повторят команду -VBARUN и просит ввод имени макроса.
Заранее спасибо.

(изменено: Anatoly, 26 марта 2013г. 08:50:38)

Re: Повторный запуск макроса по нажатию Enter

Например оформить запуск макроса через Lisp

(defun c:mymacro ()
  (vl-load-com)
  (vla-runmacro (vlax-get-acad-object) "D:/myproject/abc.dvb!mainsub")
  (while (/= (logand (getvar "cmdactive") 31) 0)
  (command pause))
  (princ)
)

После загрузки Lisp файла и первого запуска (надо набрать в командной строке mymacro), повторное нажатие Enter будет снова запускать процедуру mainsub, находящуюся в файле D:/myproject/abc.dvb

Но это работает, если в макросе не используется ThisDrawing.SendCommand

Re: Повторный запуск макроса по нажатию Enter

Спасибо. А методом одного лишь VBA это можно сделать, есть варианты?

Re: Повторный запуск макроса по нажатию Enter

shprot пишет:

А методом одного лишь VBA это можно сделать, есть варианты?

Нет. Т.к. средствами VBA нельзя создать команду.

Re: Повторный запуск макроса по нажатию Enter

Ок, буду использовать Lisp, всем спасибо.

(изменено: shprot, 30 марта 2013г. 22:13:16)

Re: Повторный запуск макроса по нажатию Enter

Сделал как рекомендовал Anatoly (В Lisp делаю впервые) но не чего не вышло.
Последовательность моя была такая:
-создал файл HeatBalance.lsp c нижеприведенным кодом.
-добавил его в автозагрузку (_appload)
-запускаю команду mymacro, получаю ошибку "Ошибка Automation. Не удалось запустить макрос VBA"

(defun c:mymacro () 
  (vl-load-com) 
  (vla-runmacro (vlax-get-acad-object) "d:\Google Диск\Программы Excel\Heat balance\Heat_Balance_2.dvb!test") 
  (while (/= (logand (getvar "cmdactive") 31) 0) 
  (command pause)) 
  (princ) 
) 

Эта функция для конкретного макроса (test) а как сделать для всех макросов проекта Heat_Balance_2.dvb или несколько макросов?
Выходит что при каждом открытии AutoCAD нужно будет запускать mymacro?
Заранее спасибо, извините за наверно простые вопросы.

(изменено: Anatoly, 31 марта 2013г. 13:40:37)

Re: Повторный запуск макроса по нажатию Enter

Насчет ошибки, возможно кириллица в пути,
попробуй
- короткий путь типа d:/Heat/Heat_Balance_2.dvb!test
- вручную загрузить проект .dvb, а потом запустить .lsp
- положить .lsp и .dvb в одну папку

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

Re: Повторный запуск макроса по нажатию Enter

shprot пишет:

-запускаю команду mymacro, получаю ошибку "Ошибка Automation. Не удалось запустить макрос VBA"

Замени в пути доступа все "\" на "\\" (или "\" на "/").

Re: Повторный запуск макроса по нажатию Enter

Замени в пути доступа все "\" на "\\" (или "\" на "/").

Это помогло, большое спасибо!

-сделать свою панель инструментов, каждая кнопка - свой макрос
-в программе сначала выводить главную форму с кнопками, каждая кнопка - свой макрос

Спасибо. Извините но не дополнял, как надо доработать макрос ранее Вами приложенный. Сейчас у меня так и есть грубо говоря 6 макросов каждый на своей кнопке. Вы предлагаете сделать одну кнопку которая открывала бы форму на которой располагались 6 кнопок?

(изменено: Anatoly, 31 марта 2013г. 22:29:14)

Re: Повторный запуск макроса по нажатию Enter

Я предложил, как вариант, при запуске проекта VBA выводить начальную форму с несколькими кнопками.
1-я кнопка - Sub A(), вторая - Sub B() и т.д.

или
создать в автокаде панель инструментов с несколькими кнопками, каждая запускает свой макрос.

(изменено: shprot, 31 марта 2013г. 21:07:23)

Re: Повторный запуск макроса по нажатию Enter

Ок. Вот сейчас есть панель ленты на которой 6 кнопок, каждая выполняет свой макрос. Как изменить:

(defun c:mymacro () 
  (vl-load-com) 
  (vla-runmacro (vlax-get-acad-object) "D:/myproject/abc.dvb!mainsub") 
  (while (/= (logand (getvar "cmdactive") 31) 0) 
  (command pause)) 
  (princ) 
) 

Что-бы при нажатии Enter, происходил повтор макроса одной из этих 6 кнопок? Спасибо.

(изменено: Anatoly, 2 апреля 2013г. 09:46:42)

Re: Повторный запуск макроса по нажатию Enter

Вообще-то лучше про Lisp спрашивать в лисповском разделе форума (я не знаток Lisp'a).

Сам использую нечто вроде этого:

На первой/второй/... кнопке:

^C^C^P(if (= startvar nil) (load "D:/...startfl"))(abc "1")
........................................................(abc "2")

Файл startfl.lsp

(defun startvar () t)

(defun abc( par / )
 (setq prmode par)
 (if (= xyz nil) (load "D:/...run-vba-proj.lsp"))) 
 (xyz) 
 (princ)
)

Файл run-vba-proj.lsp

(defun xyz( / ....)
 (vl-load-com)

 (if (= (atoi prmode) 1)(vl-vbarun  "D:/...myproj.dvb!sub1"))) 
 (if (= (atoi prmode) 2)(vl-vbarun  "D:/...myproj.dvb!sub2")))
  ............
  ............
 (princ)
)