Понадобилась мне для охвата большей аудитории поддержка нескольких платформ для моего приложения. Из 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
Теперь точно все. Переключаясь между разными конфигурациями, собираем проект под разные платформы без лишних телодвижений.
Комментариев нет:
Отправить комментарий