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

28/08/2015

Это экземпляр приложения Civil 3D?

Это .NET версия кода, размещенная моим коллегой (оригинал тут), переработанная под Civil 3D.

Когда мы получаем экземпляр запущенного приложения AutoCAD, мы не знаем, что это за вертикальный продукт, так как все они базируются на одной платформе. Чтобы определить, с чем мы имеем дело, мы должны как-то это проверить. И это как раз то, что делает этот код:

Код - VB.NET: [Выделить]
  1.  
  2.     ' получение запущенного экземпляра AutoCAD (или вертикального решения)
  3.     Dim acadApp As Object = GetObject(, "Autocad.Application")
  4.     
  5.     ' это Civil 3D? Попробуем!
  6.     Dim civilLandApp As Object
  7.     Try
  8.       ' 10.4 обозначает 2015 версию
  9.       civilLandApp = acadApp.GetInterfaceObject
  10.                      ("AeccXUiLand.AeccApplication.10.4")
  11.     Catch ex As Exception
  12.       Return ' не Civil 3D
  13.     End Try
  14.     
  15.     ' теперь мы знаем – это Civil 3D
  16.     ' что-то делаем

 

И в C# будет в основном то же самое, за исключением того, что необходимо определиться:  когда использовать var, а когда dynamic. Приведенный выше код использует Object который позволяет позднее связывание. Если это ваш вариант, тогда используйте C#-эквивалент: dynamic.

 

От переводчика (и в результате обсуждения на форуме), версия для C#:

Код - C#: [Выделить]
  1.     dynamic acadApp;
  2.     try
  3.     {
  4.         // /Получение запущенного экземпляра AutoCAD (или вертикального решения)
  5.         acadApp = Marshal.GetActiveObject("AutoCAD.Application");
  6.     }
  7.     catch
  8.     {
  9.         // Нет запущенного AutoCAD
  10.         return;
  11.     }
  12.     
  13.     // Получение номера версии AutoCAD
  14.     string acVer = acadApp.Version.Substring(0, 4);
  15.     
  16.     // Получение номера версии Aecc библиотек
  17.     string aeccVer;
  18.     
  19.     if (acVer == "19.0")
  20.         aeccVer = "10.0";
  21.     else if (acVer == "19.1")
  22.         aeccVer = "10.3";
  23.     else if (acVer == "20.0")
  24.         aeccVer = "10.4";
  25.     else if (acVer == "20.1")
  26.         aeccVer = "10.5";
  27.     else aeccVer = null;
  28.     
  29.     if (string.IsNullOrEmpty(aeccVer))
  30.     {
  31.         // Неизвестная версия AutoCAD
  32.         return;
  33.     }
  34.     
  35.     // это Civil 3D? Попробуем!
  36.     dynamic civilLandApp;
  37.     try
  38.     {               
  39.         civilLandApp = acadApp.GetInterfaceObject
  40.             ("AeccXUiLand.AeccApplication." + aeccVer);
  41.     }
  42.     catch
  43.     {
  44.         // не Civil 3D
  45.         return;
  46.     }
  47.     
  48.     // теперь мы знаем – это Civil 3D
  49.     // что-то делаем, например, выведем сообщение:
  50.     System.Windows.Forms.MessageBox.Show
  51.         (string.Format("Это {0}!", civilLandApp.Name));
  52.     

Источник: http://adndevblog.typepad.com/infrastructure/2015/03/is-a-civil-3d-instance.html

Автор: Дмитрий Загорулькин
Автор перевода: Дмитрий Загорулькин

Обсуждение: http://adn-cis.org/forum/index.php?topic=2953

Опубликовано 28.08.2015