Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Кирилл Захаров от 23-08-2017, 14:15:45

Название: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 14:15:45
Здравствуйте!

Для того, чтобы программно создавать и изменять подшивки в 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.  


Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 14:58:01
Я знаю, что в некоторых случаях можно сделать позднее связывание, чтобы программа уже в процессе выполнения определила нужную библиотеку.
Насколько мне известно это не тот случай.
Впрочем можешь попробовать с:
Код - C# [Выбрать]
  1. string str = "AcSmComponents.AcSmSheetSetMgr." + Application.Version.Major;
  2. Type t = Type.GetTypeFromProgID(str);
  3. dynamic mgr = Activator.CreateInstance(t);
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 15:07:17
Спасибо! :D
Я вроде получил какой-то COM-объект, но у него нет метода CreateDatabase. Буду дальше думать

(https://s3.postimg.org/3yt9zcttb/image.png) (https://postimg.org/image/3yt9zcttb/)
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 15:13:24
Я вроде получил какой-то COM-объект, но у него нет метода CreateDatabase. Буду дальше думать
Вот это как раз из-за того, что в этой библиотеке не всё есть для позднего связывания. И это причина того, что её нельзя использовать в VisualLisp. Думаю, что лучше не тратить на это время.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 15:41:13
Да, понял. Спасибо большое еще раз.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 17:30:31
Скажите пожалуйста, можно ли где-нибудь скачать эти библиотеки для различных версий автокада?
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 17:34:12
Скажите пожалуйста, можно ли где-нибудь скачать эти библиотеки для различных версий автокада?
Соответствующие acsmcomponentsNN.tlb входят в состав ObjectARX SDK соответствующих версий (в зависимости от разрядности в каталоге inc-win32 или inc-x64):

ObjectARX SDK: старые и новые версии (http://adn-cis.org/forum/index.php?topic=61.0)
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 17:35:28
Отлично! Спасибо за ссылку!
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 18:00:09
Я подгружу в проект библиотеки различных версий. Сделаю отдельные методы для получения объекта AcSmSheetSetMgr. И один из них будет вызываться в зависимости от версии AutoCAD.
Не нужно делать отдельные проекты.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 18:03:32
Я подгружу в проект библиотеки различных версий. Сделаю отдельные методы для получения объекта AcSmSheetSetMgr. И один из них будет вызываться в зависимости от версии AutoCAD.
Не нужно делать отдельные проекты.
Честно говоря не уверен, что это получится. Во-первых, есть зависимость от разрядности (x32/x64). Во-вторых, имена библиотек совпадают. Хотя при помощи tlbimp.exe можно (IMHO) задать разные имена.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 18:06:26
Цифры отличаются же в именах библиотек.
Или я чего-то не понимаю.
Программа будет использоваться на уровне одной организации. Я уверен, что у нас у всех, кто работает в автокаде, Windows 7 x64
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 18:07:53
Пробуй. Расскажешь потом о результатах.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 18:08:10
Хорошо
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 23-08-2017, 18:47:23
В пределах одного проекта получается только так:
Код - 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 не работает. Даже не знаю.
Наверно попробую еще сделать через отдельные проекты.
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Александр Ривилис от 23-08-2017, 19:32:56
В пределах одного проекта получается только так:
Я предупреждал...
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: trir от 24-08-2017, 07:07:09
делов то, просто работай с .dst напрямую - это же просто xml (https://github.com/triroakenshield/SheetSetManager)
Название: Re: Поздний доступ к COM библиотеке AcSmComponents для работы с подшивками
Отправлено: Кирилл Захаров от 24-08-2017, 14:55:03
Ого! Спасибо, trir!
Попробую разобраться.