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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Пользовательская панель: динамическая или нет?

Пользовательская панель: динамическая или нет?

Ответ
Поиск в этой теме
Непрочитано 12.08.2013, 14:04 #1
Пользовательская панель: динамическая или нет?
Twenty
 
Регистрация: 12.08.2013
Сообщений: 22

Добрый день!
Хотел бы попросить совета у программистов по поводу того, каким путём лучше идти при загрузке своих программ в AutoCAD. Имеется несколько программок, и нужно, чтобы они работали на AutoCAD от 2009 до 2014.
1. Создавать динамическую панель инструментов с кнопками для вызова этих программ, прописав (load "abc.lsp") (ABC) в acaddoc.lsp. Плюсы - работает в любых версиях AutoCAD, минусы - зачастую при загрузке AutoCAD код не срабатывает из-за того, что не успевает загрузиться служебная часть программ AutoCAD. Дурацкий выход вроде добавления первой строкой в acaddoc.lsp команды (alert "Привет!") помогает, но сделать загрузку минуя это я не знаю, как.
2. Делать CUI, в которых я не разобрался и не уверен, что один CUI будет читаться всеми версиями AutoCAD. Это, кстати, тоже вопрос.

Вариант с динамической панелью вполне нравится, если бы не ситуация с обрывом загрузки ("ошибка Automation: панель невидима. сделайте её видимой!").
Просмотров: 10023
 
Непрочитано 12.08.2013, 14:15
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Twenty Посмотреть сообщение
зачастую при загрузке AutoCAD код не срабатывает из-за того, что не успевает загрузиться служебная часть программ AutoCAD
Вы уверенны что причина в этом...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 12.08.2013, 14:27
#3
Twenty


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Вы уверенны что причина в этом...
Дело, скорее всего, в том, что код из acaddoc.lsp загружается одновременно с какими-то внутренними процессами AutoCAD, потому как если добавить (alert "") первой строкой в acaddoc.lsp, то после того, как всплывёт окошко, все последующие сроки кода загружаются успешно, и панель появляется. Раньше (в более старых AutoCAD) такой проблемы вообще не было.
Twenty вне форума  
 
Непрочитано 12.08.2013, 14:36
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


а если грузите через автозагрузку "чемоданчиком", вместо того, чтобы писать непосредственно в acaddoc.lsp, проблема так же наблюдается?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 12.08.2013, 15:50
#5
Twenty


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


Не совсем понял, что Вы имеете в виду под "чемоданчиком". Это как?
Twenty вне форума  
 
Непрочитано 12.08.2013, 16:02
#6
Petrov-Vodkin


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


Чемоданчик - это команда _appload (сервис - приложения...).

Цитата:
Сообщение от Twenty Посмотреть сообщение
2. Делать CUI, в которых я не разобрался и не уверен, что один CUI будет читаться всеми версиями AutoCAD. Это, кстати, тоже вопрос.
Если так, то для 2009 надо будет создать файл частичной адаптации mySuperMenu.cui (текстовый),
для 2010 - 2014 - mySuperMenu.cuix (это на самом деле архив, примечателен тем, что картинки к кнопкам можно запихнуть внутрь него)

Создайте рядом с mySuperMenu.cui/cuix текстовый файл mySuperMenu.mnl и пропишите в него свои load "abc.lsp", а не в acaddoc.lsp

Последний раз редактировалось Petrov-Vodkin, 12.08.2013 в 16:11.
Petrov-Vodkin вне форума  
 
Непрочитано 12.08.2013, 16:31
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Twenty Посмотреть сообщение
Дело, скорее всего, в том, что код из acaddoc.lsp загружается одновременно с какими-то внутренними процессами AutoCAD
На загрузку (того что внутри defun'ов) алерты повлиять никак не могут, там у Вас явно что-то запускаеться еще не инициализированное - например реактор срабатывает (на который еще функция не загруженна) или (vl-load-com) поздно идет, или панель какую пытается сформировать. Выкладывайте, что там у Вас в acaddoc.lsp - без него только на кофейной гуще.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 12.08.2013, 17:26
#8
Twenty


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


Цитата:
Сообщение от Petrov-Vodkin Посмотреть сообщение
2010 - 2014 - mySuperMenu.cuix
Без отличий для каждой из этих версий?

Для того, чтобы было понятно и наглядно, я подготовил немного упрощённый код, который воспроизводит мою проблему.
Итак, следующий код можно вставить в acaddoc.lsp (ну или вызвать этот код из lsp там же):
Код:
[Выделить все]
 (defun MainProg (/ wbOK mgs mg tbs_test_prog i tbitem g_name t_name l_names l_helps l_macros cx cy nrows t_reg)

  (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq actdoc (vla-get-ActiveDocument acad_application))
  (setq model_space (vla-get-ModelSpace actdoc))

  (setq g_name "ACAD"
	t_name "Тестовая панель"
	l_names '("Кнопка1" "Кнопка2")
	l_helps '("Описание1" "Описание2")
	l_macros '("prog1 " "prog2 ")
	cx 100
	cy 100
	nrows 1
  );end setq
  
  (setq mgs (vla-get-MenuGroups (vlax-get-acad-object)))
  
  (if (= (type g_name) 'STR)
    (setq wbOK (if mgs T nil)))
  
  (if wbOK
    (progn
      (setq mg (vl-catch-all-apply 'vla-Item (list mgs g_name)))
      (if (/= (type mg) 'VLA-OBJECT) (setq mg (vl-catch-all-apply 'vla-Item (list mgs 1))))
      (if (/= (type mg) 'VLA-OBJECT)
	(progn
	  (setq wbOK nil)
	  (princ "\n Неверное имя группы адаптации. ")
	);end progn
      );end if
    ); end progn
  );end if
  ;Имя группы правильное
  ;Проверяем, нет ли уже одноимённой панели

  (if wbOK
    (progn
      (setq tbs_test_prog (vla-get-Toolbars mg))
      ;При отсутствии панели: Automation Error
      (setq tb_test_prog (vl-catch-all-apply 'vla-Item (list tbs_test_prog t_name)))
      (if (not (vl-catch-all-error-p tb_test_prog))
	(progn
	  (setq wbOK nil); повтор имени
	  (setq pr "\n Повтор имени панели. ")
	); end progn
      );end if
    );end progn
  );end if

  ;Имя новой панели верно. Создаём новую панель.
  (if wbOK
    (progn
      (setq tb_test_prog (vla-Add tbs_test_prog t_name))
      (if tb_test_prog
	(progn
	  ;Добавление кнопок и установка пиктограмм
	  ;Нужны проверки типов данных аргументов-списков
	  (setq i -1)
	  (repeat (length l_names)
	    (setq i (1+ i))
	    (setq tbitem (vla-AddToolbarButton tb_test_prog i (nth i l_names) (nth i l_helps) (nth i l_macros))); кнопка i
	  );end repeat

	  ;Координаты панели на экране и количество рядов
	  (vla-Float tb_test_prog cx cy nrows)


	  ;Включение идимости панели:
	  (setq mCol (vla-get-MenuGroups (vlax-get-acad-object)))
	  (if (not (vl-catch-all-error-p (setq mObj (vl-catch-all-apply 'vla-Item (list mCol "ACAD")))))
	    (if (not (vl-catch-all-error-p (setq tObj (vl-catch-all-apply 'vla-Item (list(vla-get-Toolbars mObj) "Тестовая панель")))))
	      (if (/= :vlax-true (vla-get-Visible tObj))
		(vla-put-Visible tObj :vlax-true)
	      ); end if
            ); end if
          ); end if
	  ;конец кода помощи


	  
	  ;Выравнивание панели инструментов, если найдено значение в реестре:
	  (setq t_reg '("4" "195" "153")); здесь код поиска предыдущего положения панели заменён на уже сформированный список	      
	  (vla-put-Left tb_test_prog (atoi (nth 1 t_reg)))
	  (vla-put-Top tb_test_prog (atoi (nth 2 t_reg)))



	  (princ (strcat "\nПанель " t_name " создана в группе " g_name ". "))
	  (setq g_tb tb_test_prog); сохранение в глобальной переменной для дальнейшего использования
	);end progn
	(princ (strcat "\n Панель с именем " t_name " уже существует в группе " g_name ". "))
      );end if
    );end progn
  );end if
 ;Освобождение памяти от ненужных VLA-объектов
  (mapcar (function (lambda (x)
		      (if (and x (not (vlax-object-released-p x)))
			(vlax-release-object x)))) (list mgs mg tbs_test_prog tbitem))

  (princ)
);end defun
После этого в acaddoc.lsp добавить вызов: (mainprog)

И можно открывать AutoCAD: появится ошибка, описанная выше, и панель не загрузится.
Теперь убираем следующий код из предыдущей программы, вынося его в отдельную подпрограмму:
Код:
[Выделить все]
 (defun test123 ()
	  ;Включение идимости панели:
	  (setq mCol (vla-get-MenuGroups (vlax-get-acad-object)))
	  (if (not (vl-catch-all-error-p (setq mObj (vl-catch-all-apply 'vla-Item (list mCol "ACAD")))))
	    (if (not (vl-catch-all-error-p (setq tObj (vl-catch-all-apply 'vla-Item (list(vla-get-Toolbars mObj) "Тестовая панель")))))
	      (if (/= :vlax-true (vla-get-Visible tObj))
		(vla-put-Visible tObj :vlax-true)
	      ); end if
            ); end if
          ); end if
	  ;конец кода помощи

	  
	  ;Выравнивание панели инструментов, если найдено значение в реестре:
	  (setq t_reg '("4" "195" "153")); здесь код поиска предыдущего положения панели заменён на уже сформированный список	      
	  (vla-put-Left tb_test_prog (atoi (nth 1 t_reg)))
	  (vla-put-Top tb_test_prog (atoi (nth 2 t_reg)))
); defun
Открываем AutoCAD - всё отлично, панель создана, но невидима. Теперь выполняем (test123), и она появляется без ошибок.

Я не могу понять, в чём тут хитрость, и почему один и тот же код не работает при загрузке, но работает после неё.

Последний раз редактировалось Twenty, 12.08.2013 в 19:18.
Twenty вне форума  
 
Непрочитано 12.08.2013, 19:45
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Присмотрись к сообщению #6. Почитай про файл *.mnl (например, у Полещука Н.Н.)
Profan вне форума  
 
Автор темы   Непрочитано 12.08.2013, 20:00
#10
Twenty


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


MNL&CUIX всё же лучше? Я присмотрелся к сообщению, и уточняю: если этот способ лучше динамических панелей (хоть уже есть минус - 2009 и 2010-2014 - это уже как минимум две версии файлов), то я о нём почитаю у того же Полещука (правда, у него уже староват материал для cuix). Но и с этой непонятной проблемой хотелось бы разобраться.
Twenty вне форума  
 
Непрочитано 12.08.2013, 20:27
#11
gomer

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


Цитата:
Сообщение от Twenty Посмотреть сообщение
MNL&CUIX всё же лучше? Я присмотрелся к сообщению, и уточняю: если этот способ лучше динамических панелей (хоть уже есть минус - 2009 и 2010-2014 - это уже как минимум две версии файлов)
Нет, вы можете даже использовать устаревший вариант меню (mnu/mns), все равно автокад "скомпилирует" cui/cuix-файл. Причем в таком случае вам понадобится гораздо меньше времени на создание меню
gomer вне форума  
 
Непрочитано 12.08.2013, 23:03
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Twenty Посмотреть сообщение
...
И можно открывать AutoCAD: появится ошибка, описанная выше, и панель не загрузится.
Ну я раз 10 запустил - ошибок нет, панель в 100% случаев загрузилась (2010, пустой чертеж, грузится секунды 3-4). Попробуй убрать "Освобождение памяти от ненужных VLA-объектов", скорее всего с ними "в фоне" еще работа идет, а ты их уже освобождаешь - не к чему это их коллектор сам освободит если переменные локальные.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 12.08.2013 в 23:28.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.08.2013, 00:14
#13
Twenty


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Ну я раз 10 запустил - ошибок нет, панель в 100% случаев загрузилась
Интересно... тестирую на 2012 и 2014.
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Попробуй убрать "Освобождение памяти
Не помогло. Затык происходит именно в строке
Код:
[Выделить все]
 (vla-put-Left tb_test_prog (atoi (nth 1 t_reg)))
Причина - панель невидима, и AutoCAD не может её подвинуть. Но почему она невидима, когда я её парой строк выше на всякий случай намеренно сделал видимой - непонятно.
____________________________________________________
Что касается варианта с CUI(X). Думаю, что при текущей версии AutoCAD 2014 использовать такие старые средства, как MNU, нерационально. Но и с CUI проблема: ради поддержки 2009 версии придётся делать не cuix с вложенными изображениями кнопок, а cui, а это, как я понял, проблема с местом хранения изображений кнопок (или они всё же автоматически находятся по любому из прописанных путей?).

Последний раз редактировалось Twenty, 14.08.2013 в 01:26.
Twenty вне форума  
 
Автор темы   Непрочитано 14.08.2013, 13:53
#14
Twenty


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


Был бы очень признателен, если бы кто-то выложил простенький пример lisp-кода (желательно vla-vlax) для загрузки CUI(x), содержащего панель инструментов и меню. У меня в половине случаев не работает часть кода или панель не появляется. Нужен просто современный (не от 2005 Автокада) рабочий кусочек кода.
P.S. Возникшие проблемы, похоже, заставят вернуться к динамическим панелям, хоть и это тоже содержит проблемы, которые озвучены в этой теме и пока не решены.
Twenty вне форума  
 
Непрочитано 14.08.2013, 14:10
#15
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню, должно сработать (vla-load (vla-get-menugroups (vlax-get-acad-object)) <Полное имя файла меню>)
Пишу с компьютера, на котором нет AutoCAD, так что могу ошибаться.
P.S. Не факт, что сработает отображение ленты, но эту проблему в свое время обсуждали, кажется, на theswamp.org
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.08.2013, 14:21
#16
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Twenty Посмотреть сообщение
Хороший актуальный вопрос. По поиску здесь и на caduser если что-то и находится, так это рассуждения вокруг этой темы (а именно mnu-mns) пятилетней давности. И практически никакой конкретики.
Вы плохо искали, очень плохо. как пример http://forum.dwg.ru/showthread.php?t=62138
Там проскакивали вот такие ссылки:
http://forum.dwg.ru/showthread.php?t=90983
http://docs.autodesk.com/ACD/2013/RU...ber=d30e494119
http://through-the-interface.typepad...r-posting.html

Конкретней некуда, с примерами кода и прочими плюшками.
Boxa вне форума  
 
Автор темы   Непрочитано 14.08.2013, 14:32
#17
Twenty


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Абсолютно не о том. Тема о некоем .NET-приложении одного форумца для некоторых версий AutoCAD. Ничего про правильную загрузку CUI.
По второй ссылке опять же другой пользователь выкладывает для тестирования сборку для автозагрузки. Причём на NET.
Третья ссылка - о PackageContents. Разве это актуально не только для последних нескольких версий AutoCAD и не относится к более старым?
Четвёртая ссылка - очередное пособие в картинках. Хорошо, но при чём тут правильная загрузка CUI(x) через инсталлятор?
Цитата:
Сообщение от Boxa Посмотреть сообщение
Конкретней некуда, с примерами кода и прочими плюшками.
Twenty вне форума  
 
Непрочитано 14.08.2013, 14:58
#18
Кулик Алексей aka kpblc
Moderator

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


Twenty, тебе одной темы что, мало? Посты перенесены.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.08.2013, 15:08
#19
Twenty


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
тебе одной темы что, мало? Посты перенесены.
Вообще-то та тема была не моей, и была посвящена инсталлятору и правильному прописыванию CUI, а эта тема - моя, и посвящена проблеме загрузки динамической панели инструментов и проблемам с нединамическими адаптациями. Не надо в эту тему сваливать материал из другой.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
должно сработать (vla-load (vla-get-menugroups (vlax-get-acad-object)) <Полное имя файла меню>)
В приведённом мной коде для динамических панелей тоже должно было сработать, но почему-то не срабатывает. Что касается обычных CUI(x), то зачастую работает вот такой код:
Код:
[Выделить все]
 (defun tg_cui_detect ( / cui_list Mgroups tmp i)
 (vl-load-com)
 (setq Mgroups (vla-get-MenuGroups (vlax-get-acad-object)))

 (setq i 0)
 (while
   (not (vl-catch-all-error-p (vl-catch-all-apply (function (lambda (x) (setq tmp (vla-item Mgroups x)))) (list i))))
   (setq cui_list (append cui_list (list (vla-get-Name tmp))) i (1+ i))
 );_while
 cui_list

);end degun


(defun tg_load_cui (/ cui_list cui_list_to_load Mgroups)

 (setq cui_list_to_load '("test"))
 (setq cui_list (tg_cui_detect))
 (setq cui_list_to_load (vl-remove-if (function (lambda (x) (member x cui_list))) cui_list_to_load))
 (setq Mgroups (vla-get-MenuGroups (vlax-get-acad-object)))

 (mapcar
   (function
     (lambda (cui_file)
      (if (vl-catch-all-error-p (vl-catch-all-apply (function (lambda (y) (vla-load Mgroups y))) (list (findfile (strcat cui_file ".cuix")))))
        (prompt "\n...")
     )
    )
   )
 cui_list_to_load)


  (setq CNT 1)
  (while (< CNT 24)
    (if (menucmd (strcat "P" (itoa CNT) ".1=?"))
      (setq CNT (1+ CNT))
      (progn
	(if (> CNT 2)
	  (setq CNT (- CNT 2))
	  (setq CNT 2)
	)
        (menucmd (strcat "p" (itoa CNT) "=+Test.pop1"))
	(setq CNT 25)
      )
    )
  )

  (setq CNT nil)

      ;Включение видимости панели:
      (if (not (vl-catch-all-error-p (setq mObj (vl-catch-all-apply 'vla-Item (list Mgroups "Test")))))
        (if (not (vl-catch-all-error-p (setq tObj (vl-catch-all-apply 'vla-Item (list(vla-get-Toolbars mObj) "test")))))
          (if (/= :vlax-true (vla-get-Visible tObj))
        (vla-put-Visible tObj :vlax-true)
          ); end if
            ); end if
          ); end if

);end defun
иногда работает, а иногда - ошибка Automation

Последний раз редактировалось Twenty, 14.08.2013 в 15:15.
Twenty вне форума  
 
Непрочитано 14.08.2013, 15:16
#20
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@Twenty,
Можешь программно добавить в файл acad.cui очередной xml элемент PartialMenuFile и будет тебе счастье.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Пользовательская панель: динамическая или нет?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропала панель редактирования таблицы Ust AutoCAD 6 05.06.2013 16:15
приложение не грузиться в Акад2012-х64 BriAri AutoCAD 7 28.06.2012 10:53
Не могу убрать панель с Главной вкладки ленты AutoCAD 2011 Albino AutoCAD 8 03.10.2010 13:13
СПДС панель масштаба (запуск из меню) dextron3 Прочее. Программное обеспечение 27 08.01.2009 14:42
Как в Автокад вставить свою собственную панель инструментов? АлександрМихайлович AutoCAD 10 05.03.2007 14:28