понедельник, 25 июня 2012 г.

Три продукта, один проект. Пишем под AutoCAD, BricsCAD и NanoCAD.

Понадобилась мне для охвата большей аудитории поддержка нескольких платформ для моего приложения. Из CAD платформ на данный момент это: AutoCAD, BricsCAD и NanoCAD. Если отличия .NET API Revit и Inventor от API AutoCAD очевидны, то разница в API вышеуказанных CAD платформ практически незаметна и выражается лишь в отстутствии поддержки некоторого функционала, который уже есть у Autodesk.
Но если нет разницы, то зачем писать 3 разных приложения, когда можно написать одно...

Стандартный helloworld AutoCAD + .NET выглядит следующим образом:
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Windows;

public class CADTest
{
    [CommandMethod("TEST-ME")]
    public void TestME()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;

        ed.WriteMessage("Where's my coffee, dude?");
    }
}
Но что, если мы хотим, чтобы это приложение работало на 3-х платформах? Естественно, при этом мы не хотим писать 3 разных проекта и уж тем более копипастить код между ними. Выход как обычно есть. Используя директивы препроцессора, немного перепишем блок using:
#if NCAD
    using Teigha.DatabaseServices;
    using Teigha.Runtime;
    using Teigha.Geometry;
    using HostMgd.ApplicationServices;
    using HostMgd.EditorInput;
    using HostMgd.Windows;

    using Platform = HostMgd;
    using PlatformDB = Teigha;
#elif BCAD
    using Teigha.DatabaseServices;
    using Teigha.Runtime;
    using Teigha.Geometry;

    using Bricscad.ApplicationServices;
    using Bricscad.Runtime;
    using Bricscad.EditorInput;

    using Platform = Bricscad;
    using PlatformDB = Teigha;
#else
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Windows;

    using Platform = Autodesk.AutoCAD;
    using PlatformDB = Autodesk.AutoCAD;
#endif
Теперь необходимо добавить в файл проекта (csproj) наши константы:

...
  
    bin\NCAD\
    NCAD
  
  
    bin\ACAD\
    ACAD
  
  
    bin\BCAD\
    BCAD
  
...
Вот собственно и все. Правда на этом момент студия будет громко матерится, что библиотеки NanoCAD и BricsCAD содержат одни и те же пространства имен. Придется сделать выборочное подключение библиотек:

    
      C:\ObjectARX 2011\inc\AcDbMgd.dll
      False
    
    
      C:\ObjectARX 2011\inc\AcMgd.dll
      False
    
    
      $(ProgramFiles)\Nanosoft\nanoCAD 3.65\bin\hostdbmgd.dll
    
    
      $(ProgramFiles)\Nanosoft\nanoCAD 3.65\bin\hostmgd.dll
    
    
      $(ProgramFiles)\Bricsys\Bricscad V12\BrxMgd.dll
      False
    
    
      $(ProgramFiles)\Bricsys\Bricscad V12\TD_Mgd.dll
      False
      global
    
...
Теперь точно все. Переключаясь между разными конфигурациями, собираем проект под разные платформы без лишних телодвижений.

Комментариев нет:

Отправить комментарий