Как передать команде строку для обработки?

Автор Тема: Как передать команде строку для обработки?  (Прочитано 7947 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ddsАвтор темы

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Александр, если я инициирую вызов данного метода из стороннего приложения. Как передать имя входящего файла для обработки?

Код - C# [Выбрать]
  1.        
  2. strId = "AutoCAD.Application.19";
  3. appType = System.Type.GetTypeFromProgID(strId);
  4.  
  5.                 // Инициализируем объект приложения AutoCAD
  6.                 // (создаём новый процесс acad.exe)
  7. app = System.Activator.CreateInstance(appType);
  8.  
  9. ..........
  10.        
  11. String inst = "(command \"_netload\" \"C:\\\\Project\\\\AutoCadRunDll\\\\AcadMyPlugin\\\\bin\\\\Debug\\\\AcadMyPlugin.dll\" \"DeleteBadXref\")(command)\n";
  12.                    
  13. docType.InvokeMember("SendCommand", System.Reflection.BindingFlags
  14.                     .InvokeMethod, null, activeDoc, new Object[] {inst});
  15.  
« Последнее редактирование: 22-10-2014, 16:07:59 от dds »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос интересный. На вскидку я вижу два способа:
1) В команде запросить у пользователя строку при помощи Editor.GetString с PromptStringOptions.AllowSpaces == true (т.к. в имени файла могут быть пробелы). Желательно заменить в имени файла "\\" на "/" - обычно это уменьшает количество проблем.
Код - C# [Выбрать]
  1. String dwgFile = "C:/TestDir/001.dwg";
  2. String inst = "(progn (command \"_netload\" \"C:/Project/AutoCadRunDll/AcadMyPlugin/bin/Debug/AcadMyPlugin.dll\")" +
  3.               "(command \"DeleteBadXref \"" + dwgFile + "\"))\n";
2) Организовать не команду, а lisp-функцию, которая может принимать параметры и передавать в качестве параметра путь к файлу: http://docs.autodesk.com/ACD/2013/ENU/files/GUID-3B2760FE-A0DC-4229-AEBE-5CC83290BA95.htm (если версия AutoCAD более свежая чем 2006)
Функция будет выглядеть приблизительно так:
Код - C# [Выбрать]
  1. [LispFunction("DeleteBadXref")]
  2. public void DeleteBadXref(ResultBuffer args)
  3. {
  4. // Здесь то что ты реализовывал в команде DeleteBadXref, но
  5. // args содержит (если ты передал) путь к dwg-файлу
  6. }
И соотвественно вызов её будет выглядеть приблизительно так:
Код - C# [Выбрать]
  1. String dwgFile = "C:/TestDir/001.dwg";
  2. String inst = "(progn (command \"_netload\" \"C:/Project/AutoCadRunDll/AcadMyPlugin/bin/Debug/AcadMyPlugin.dll\")" +
  3.               "(DeleteBadXref \"" + dwgFile + "\"))\n";

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я бы предпочел использовать автозапуск dll через IExtensionApplication с предварительной подготовкой параметров в условленном месте.

Оффлайн ddsАвтор темы

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Спасибо.
Не будет ли нести за собой проблем следующий метод:

На стороне внешнего приложения:
Код - C# [Выбрать]
  1.             String instruction =
  2.                 "(command \"_netload\" \"C:\\\\Project\\\\AutoCadRunDll\\\\AcadMyPlugin\\\\bin\\\\Debug\\\\AcadMyPlugin.dll\" \"DeleteBadXref\")(command)\n";
  3.  
  4.             String setvar = "(setq MyVar \"" + path.Replace("\\", "\\\\") + "\")\n";
  5.            
  6.             docType.InvokeMember("SendCommand", System.Reflection.BindingFlags
  7.                 .InvokeMethod, null, activeDoc, new Object[] {setvar});
  8.             docType.InvokeMember("SendCommand", System.Reflection.BindingFlags
  9.                 .InvokeMethod, null, activeDoc, new Object[] {instruction});
  10.  

А на стороне AutoCAD модуля:
Код - C# [Выбрать]
  1.          string path = doc.GetLispSymbol("MyVar").ToString();
  2.  

Отмечено как Решение dds 23-10-2014, 10:29:47

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А не проще ли использовать одну из системных переменных с именами USERS1...USERS5: http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/files/WS1a9193826455f5ffa23ce210c4a30acaf-4e0d.htm  ?
Во внешнем приложении используешь:
Код - C# [Выбрать]
  1. activeDoc.SetVariable("USERS1","путь к dwg-файлу");
а в dll-сборке:
Код - C# [Выбрать]
  1. string dwgFile = Application.GetSystemVariable("USERS1") as string;
Тем более что эти переменные нигде не хранятся и специально предназначены для передачи данных.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, вариант с lisp-функцией, который я предлагал раньше, мне нравится больше. В нем ведь можно передать имена нескольких файлов и сразу выполнить "очистку от Xref" их всех.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ddsАвтор темы

  • ADN
  • *
  • Сообщений: 11
  • Карма: 0
Спасибо.