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

Вернуться   Форум 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: панель невидима. сделайте её видимой!").
Просмотров: 10359
 
Непрочитано 12.08.2013, 14:15
#2
Дима_

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


Цитата:
Сообщение от 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,839


Цитата:
Сообщение от 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,626


Присмотрись к сообщению #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,839


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,450


Насколько я помню, должно сработать (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,616


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,450


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 вне форума  
 
Автор темы   Непрочитано 14.08.2013, 15:18
#21
Twenty


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Можешь программно добавить в файл acad.cui очередной xml элемент PartialMenuFile и будет тебе счастье.
Возможно, это не совсем правильно, но попробую - думаю, так хотя бы не будет проблем с поиском файла и загрузкой. Главное - удалить эти строки после деинсталляции. Спасибо.
P.S. А что насчёт изображений кнопок? Для cuix, как я понимаю, надо будет в архив acad.cuix запаковать эти новые изображения, а для cui - будет ли достаточно того, что картинки будут лежать по одному из путей AutoCAD'а?
P.P.S. В архиве acad.cuix 17 файлов CUI =) Какой из них править?

Мне это видится так: в InnoSetup прописываем код: если это автокад 2009 и ниже, находим его acad.cui и добавляем некие нужные строки, а путь к картинкам кнопок прописываем. Если это автокад от 2010, то находим acad.cuix, добавляем в этот архив в какие-то файлы некие строки и изображения, затем снова запаковываем (при деинсталляции проводится обратная процедура). Нелёгкое дело, конечно. Особенно без наглядных примеров.

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

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


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

Имхо, сначала должно загрузиться само приложение и оно само себе должно подгружать ресурсы и кнопки. Первая ссылка именно про такой инсталлятор и загрузчик, вторая и третья ссылка о том как сделать пакет, который автокад загрузит сам, включая CUIX файл, НО если разбираться лень, то ВСЕ ЭТО не при чем.

PS.
Вы хоть для приличия напишите на каком языке Вы хотите реализовать свои замыслы и под какую платформу.
Boxa вне форума  
 
Непрочитано 14.08.2013, 15:21
#23
hwd

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


Цитата:
Сообщение от Twenty Посмотреть сообщение
Возможно, это не совсем правильно
И чем же это неправильно?
Цитата:
Сообщение от Twenty Посмотреть сообщение
Главное - удалить эти строки после деинсталляции.
Какие строки?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 14.08.2013, 15:31
#24
Twenty


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы где-то писали версию ПО с которым работаете?
Первое сообщение этой темы: AutoCAD 2009(мин)-2014
Цитата:
Сообщение от Boxa Посмотреть сообщение
НО если разбираться лень, то ВСЕ ЭТО не при чем
Нет, ну если на лиспе с ActiveX и инсталлятором InnoSetup невозможно сделать нормальный загрузчик, и выход только в приложении на NET, то, конечно, и эту технологию можно изучить.
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы хоть для приличия напишите на каком языке Вы хотите реализовать свои замыслы и под какую платформу.
Lisp, желательно с vla-vlax (без cmdf), инсталлятор на InnoSetup (паскаль).
Цитата:
Сообщение от hwd Посмотреть сообщение
И чем же это неправильно?
Опять же предположение: тем, что трогаем сокровенные файлы AutoCAD, и в случае неправильного их изменения сама система станет нестабильной (например, если деинсталлятор не удалит списанные туда строки).
Цитата:
Сообщение от hwd Посмотреть сообщение
Какие строки?
"добавить в файл acad.cui очередной xml элемент PartialMenuFile" - это же строки в файле. Кстати, посмотрите, пожалуйста, на отредактированное выше сообщение - там я описал некоторые вопросы касаемо этого метода.
Twenty вне форума  
 
Непрочитано 14.08.2013, 15:41
#25
hwd

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


У меня под рукой только AutoCAD 2009, в котором используется CUI (CUIX тогда ещё не было). CUIX - это архив, но внести правку программно можно и в него, выбрав в нём нужный CUI.
Цитата:
Опять же предположение: тем, что трогаем сокровенные файлы AutoCAD, и в случае неправильного их изменения сама система станет нестабильной (например, если деинсталлятор не удалит списанные туда строки).
Не имеет значение, каким образом ты добавляешь очередной элемент PartialMenuFile: посредством GUI AutoCAD, посредством любого программного API или же через обычный Notepad++. Главное - в нужном месте прописать элемент (сложного ничего нет) и кодировку использовать ту, что прописана в заголовке XML файла. Удаление выполняется аналогично.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

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


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


Какая-то совсем сложная задача - работа с архивом и XML-файлом через код в инсталляторе InnoSetup... что-то мне кажется, примеров кода не будет, потому что никто этого не делает =)
Twenty вне форума  
 
Непрочитано 14.08.2013, 17:01
#27
hwd

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


а я нигде и не писал про InnoSetup. Ты не умеешь программно с текстовыми файлами работать?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 14.08.2013, 17:19
#28
Twenty


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


Через лисп? Ну, с архиваторами не работал (к тому же, у пользователя его может не быть, а значит нужно этот архиватор ещё и поставлять!) и XML не парсил. К тому же, если не сделать это в инсталляторе (InnoSetup), то при запуске AutoCAD (когда сможет выполниться lisp) будет уже поздно, да и невозможно (acad.cuix занят). Или под "программно" понимаете тот же NET?
P.S. Что-то сейчас этот путь кажется настолько сложным, что огромное количество затраченного на его изучение время (без примера кодов особенно) вряд ли выглядит целесообразней того же динамического создания панелей (и, может, меню). Вот ещё бы ошибка неизвестная не возникала...
Twenty вне форума  
 
Непрочитано 14.08.2013, 17:25
#29
hwd

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


я тебе указал, каким образом можно подгрузить твой CUI\CUIX - подсунув его "родному" механизму автозагрузки файлов меню в AutoCAD. На каком языке ты добавишь запись в текстовый файл - это уже дело твоё (на вкус и цвет все фломастеры разные). Я почти не пишу на лиспе. В 99% случаев пишу на .NET и мне его возможностей хватает почти всегда (чего не хватает - можно достать через C++). В .NET можно легко работать как с XML, так и с архивами (занимает несколько строчек кода). Как это делают автолиспописатели - это уже не ко мне вопрос.
Цитата:
P.S. Что-то сейчас этот путь кажется настолько сложным, что огромное количество затраченного на его изучение время (без примера кодов особенно) вряд ли выглядит целесообразней того же динамического создания панелей (и, может, меню).
Сложного в этом ничего нет, при условии, что умеешь работать с XML.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 14.08.2013 в 17:58.
hwd вне форума  
 
Непрочитано 14.08.2013, 17:58
#30
Дима_

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


Если хочешь без лишних заморочек (правда заморочек там особых-то нет, но если изучать что-то еще лень то можно и так):
Инсталятором создай загрузку загрузчика на автолиспе, который при первом старте:
1. Загрузит подготовленную CUI панель (архивом CUIX можешь не заморочиваться - автокад его сам автоматом преобразует).
2. Для записи нужных путей в CUI из автолиспа - можешь поступить по колхозному (чтоб не парсить XML) - в созданном в рукопашную CUI (для этого нужен 2009 или ниже акад) замени необходимые пути/параметры на "****1 заменяемое значение****", "****2 ..." и.т.д. - просто как в текстовом файле (чтение->замена нужного->запись).
3. Лисп вариант AcadApplication.MunuGroups.Load твой cui.
4. И после этого можно удалять свой "чудо" загрузчик вместе с шаблоном CUI.
+ Можно еще и деинсталятор подобным образом подготовить.
Метод скажу сразу колхозней некуда, но кроме лиспа ничего не требует - я бы так делать не стал, а написал-бы "установщик" на любом компилируемом языке программирования, но в принципе вполне рабочий.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.08.2013, 18:07
#31
Twenty


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
написал-бы "установщик" на любом компилируемом языке программирования, но в принципе вполне рабочий
У меня как раз компилируемый инсталлятор InnoSetup всё везде прописывает и отвечает за деинсталляцию. А вообще, если всё так сложно, предпочту остаться на динамическом создании панелей в acaddoc.lsp. Решить бы проблему только.

P.S. Вообще я предполагал, что Autodesk предусматривает следующий порядок загрузки CUI: сделать всё визуально, сохранить cui-файл, а затем программно подгружать его через тот же acaddoc.lsp. Разве это невозможно и неправильно?
________________________
По динамическим панелям:
удаление строк
Код:
[Выделить все]
       (vla-put-Left tb_test_prog (atoi (nth 1 t_reg)))
      (vla-put-Top tb_test_prog (atoi (nth 2 t_reg)))
а точнее, выравнивание в процессе создания панели, а не после этого, больше не приводит к ошибке.

НО! Хоть и пишу сделать панель принудительно видимой, она не отображается, пока её вручную не выберешь. И ошибок при этом нет никаких. Непонятно. Если вручную загружать код - всё отлично.

Последний раз редактировалось Twenty, 14.08.2013 в 19:09.
Twenty вне форума  
 
Непрочитано 14.08.2013, 20:22
#32
Boxa

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


http://through-the-interface.typepad...ng_a_part.html
http://through-the-interface.typepad...g_a_parti.html
Boxa вне форума  
 
Автор темы   Непрочитано 14.08.2013, 21:52
#33
Twenty


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


Спасибо, тоже интересный вариант - что-то между динамическим и обычным. Интересно.
Twenty вне форума  
 
Непрочитано 14.08.2013, 23:18
#34
Дима_

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


Цитата:
Сообщение от Twenty Посмотреть сообщение
Разве это невозможно и неправильно?
Так я ж про это и пишу - только есть у автокада 1 косяк - относительные пути и системные имена (типа %appdata%) не поддерживает - поэтому приходиться перед загрузкой править CUI(x) - а лиспом это проще всего делать не "парсируя" XML - а просто обрабатывая как текстовой файл.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.08.2013, 02:13
#35
Twenty


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
относительные пути и системные имена (типа %appdata%) не поддерживает
А для чего они там нужны?
Twenty вне форума  
 
Непрочитано 15.08.2013, 12:33
#36
Дима_

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


Чтоб не делать "c:\superproga for acad\superlisp.lsp", а прописывать свои программы в специально созданные для этого папки (program files и пр.) в не зависомости от конфигурации компьютера.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.08.2013, 12:58
#37
Twenty


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


Но ведь в макросы записываются не пути, а вызов программ - например, "^C^CMyProg
А сама MyProg подгружается заранее при загрузке AutoCAD. Так ведь?
Twenty вне форума  
 
Непрочитано 15.08.2013, 13:07
#38
Дима_

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


в CUI прописываеться не только макросы, но и куча чего еще - в том числе и загружаемые лисп файлы - и это самый правильный способ задать их загрузку.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.08.2013, 13:22
#39
Twenty


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


Если не поддерживается загрузка VLX, то точно не самый лучший способ

Boxa, вы пробовали пример из ссылки №2 про создание cui через NET? Я хотел использовать [LispFunction("test")] вместо [CommandMethod("test")], но что-то не работает (потому что я в этом мало понимаю).

Последний раз редактировалось Twenty, 15.08.2013 в 16:45.
Twenty вне форума  
 
Автор темы   Непрочитано 19.08.2013, 20:01
#40
Twenty


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


А тема с созданием cui через NET интересна и, наверно, после реализации вызывает меньше проблем, да и проще. Вот только в реализации вопрос. У меня пример не работает, хотелось бы с привычным LispFunction попробовать, но недостаточно опыта.
Twenty вне форума  
 
Непрочитано 19.08.2013, 20:17
#41
Boxa

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


Цитата:
Сообщение от Twenty Посмотреть сообщение
Boxa, вы пробовали пример из ссылки №2 про создание cui через NET? Я хотел использовать [LispFunction("test")] вместо [CommandMethod("test")], но что-то не работает (потому что я в этом мало понимаю).
Да, пробовал.
Только у мена задача была обратная, я этот код для 2006 автокада переписывал. Повеселился.
Boxa вне форума  
 
Автор темы   Непрочитано 19.08.2013, 20:21
#42
Twenty


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


А в чём разница для 2006, кроме версии NET, которая, должно быть, что-то около 1.0?
И использовали ли Вы CommandMethod, как тут описано, или LispFunction?
Если не сложно, выложите, пожалуйста, Ваш вариант этого кода.
Twenty вне форума  
 
Непрочитано 19.08.2013, 20:29
#43
Boxa

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


=о)))
Тем что AcCui.dll появился только в 2007 автокаде =о)))
А для 2012 года этот код работает из коробки.
Boxa вне форума  
 
Автор темы   Непрочитано 19.08.2013, 21:03
#44
Twenty


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


Странно: я в тот же 2012 загружаю, но команда "bm" не найдена. Поэтому и хотел попробовать с LispFunction - может, заработало бы.
P.S. А, понятно: там ищется файл acad.cui, а в 2012 AutoCAD его, конечно, нет, т.к. там cuix.

Последний раз редактировалось Twenty, 19.08.2013 в 21:54.
Twenty вне форума  
Ответ
Вернуться   Форум 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