Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками

Автор Тема: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками  (Прочитано 10930 раз)

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

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

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Здравствуйте!

Для того, чтобы программно создавать и изменять подшивки в AutoCAD нужно использовать COM-библиотеки AcSmComponentsXXLib. Для каждой версии AutoCAD своя версия библиотеки. Подробнее об этом по ссылке: http://adndevblog.typepad.com/autocad/2013/09/using-sheetset-manager-api-in-vbnet.html.
Отсюда проблема - для каждой версии AutoCAD нужно делать отдельную .NET библиотеку, которая будет обращаться к нужной COM-библиотеке.

Я знаю, что в некоторых случаях можно сделать позднее связывание, чтобы программа уже в процессе выполнения определила нужную библиотеку. Например по ссылке http://www.c-sharpcorner.com/article/calling-a-com-component-from-C-Sharp-late-binding/ можно посмотреть пример позднего связывания с Excel.

Я попытался написать что-то похожее (код для создания новой подшивки):
Код - C# [Выбрать]
  1. string str = "Interop.ACSMCOMPONENTS" + Application.Version.Major + "Lib.AcSmSheetSetMgr";
  2. Type t = Type.GetTypeFromProgID(str);
  3. dynamic mgr = Activator.CreateInstance(t);
  4. dynamic ssdb = mgr.CreateDatabase(@"C:\Test.dst",
  5. @"C:\Образец.dst", false);
  6.  
но это не работает.

Прошу подсказать, есть ли какое-нибудь решение этой проблемы.

Для примера, вот работающий код (при загруженной COM библиотеке)
Код - C# [Выбрать]
  1. AcSmSheetSetMgr mgr = new AcSmSheetSetMgr();
  2. AcSmDatabase ssdb = mgr.CreateDatabase(@"C:\Test.dst",
  3. @"C:\Образец.dst", false);
  4.  



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я знаю, что в некоторых случаях можно сделать позднее связывание, чтобы программа уже в процессе выполнения определила нужную библиотеку.
Насколько мне известно это не тот случай.
Впрочем можешь попробовать с:
Код - C# [Выбрать]
  1. string str = "AcSmComponents.AcSmSheetSetMgr." + Application.Version.Major;
  2. Type t = Type.GetTypeFromProgID(str);
  3. dynamic mgr = Activator.CreateInstance(t);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Спасибо! :D
Я вроде получил какой-то COM-объект, но у него нет метода CreateDatabase. Буду дальше думать



Отмечено как Решение Кирилл Захаров 26-08-2017, 14:44:04

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я вроде получил какой-то COM-объект, но у него нет метода CreateDatabase. Буду дальше думать
Вот это как раз из-за того, что в этой библиотеке не всё есть для позднего связывания. И это причина того, что её нельзя использовать в VisualLisp. Думаю, что лучше не тратить на это время.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Да, понял. Спасибо большое еще раз.

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Скажите пожалуйста, можно ли где-нибудь скачать эти библиотеки для различных версий автокада?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Скажите пожалуйста, можно ли где-нибудь скачать эти библиотеки для различных версий автокада?
Соответствующие acsmcomponentsNN.tlb входят в состав ObjectARX SDK соответствующих версий (в зависимости от разрядности в каталоге inc-win32 или inc-x64):

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

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Отлично! Спасибо за ссылку!

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Я подгружу в проект библиотеки различных версий. Сделаю отдельные методы для получения объекта AcSmSheetSetMgr. И один из них будет вызываться в зависимости от версии AutoCAD.
Не нужно делать отдельные проекты.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я подгружу в проект библиотеки различных версий. Сделаю отдельные методы для получения объекта AcSmSheetSetMgr. И один из них будет вызываться в зависимости от версии AutoCAD.
Не нужно делать отдельные проекты.
Честно говоря не уверен, что это получится. Во-первых, есть зависимость от разрядности (x32/x64). Во-вторых, имена библиотек совпадают. Хотя при помощи tlbimp.exe можно (IMHO) задать разные имена.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Цифры отличаются же в именах библиотек.
Или я чего-то не понимаю.
Программа будет использоваться на уровне одной организации. Я уверен, что у нас у всех, кто работает в автокаде, Windows 7 x64

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

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

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
В пределах одного проекта получается только так:
Код - C# [Выбрать]
  1. public partial class CommandClass
  2.     {
  3.         [CommandMethod("PS-tools", "SheetsetCreating", CommandFlags.Modal | CommandFlags.Session)]
  4.         public void SheetsetCreating()
  5.         {
  6.             int major = Application.Version.Major;
  7.             switch (major)
  8.             {
  9.                 case 19 :
  10.                     Mgr19();
  11.                     break;
  12.                 case 20:
  13.                     Mgr20();
  14.                     break;
  15.                 case 21:
  16.                     Mgr21();
  17.                     break;
  18.             }
  19.         }
  20.  
  21.         private void Mgr19()
  22.         {
  23.             ACSMCOMPONENTS19Lib.AcSmSheetSetMgr mgr = new ACSMCOMPONENTS19Lib.AcSmSheetSetMgr();
  24.             ACSMCOMPONENTS19Lib.AcSmDatabase ssdb = mgr.CreateDatabase(@"C:\Test.dst",
  25.             @"C:\Образец.dst", false);
  26.         }
  27.         private void Mgr20()
  28.         {
  29.             ACSMCOMPONENTS20Lib.AcSmSheetSetMgr mgr = new ACSMCOMPONENTS20Lib.AcSmSheetSetMgr();
  30.             ACSMCOMPONENTS20Lib.AcSmDatabase ssdb = mgr.CreateDatabase(@"C:\Test.dst",
  31.             @"C:\Образец.dst", false);
  32.         }
  33.         private void Mgr21()
  34.         {
  35.             ACSMCOMPONENTS21Lib.AcSmSheetSetMgr mgr = new ACSMCOMPONENTS21Lib.AcSmSheetSetMgr();
  36.             ACSMCOMPONENTS21Lib.AcSmDatabase ssdb = mgr.CreateDatabase(@"C:\Test.dst",
  37.             @"C:\Образец.dst", false);
  38.         }
  39.  
  40.     }
  41.  

dynamic не работает. Даже не знаю.
Наверно попробую еще сделать через отдельные проекты.

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

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