2 - 2012

САПёР на полях САПР

Андрей Грачевский (Независимый эксперт)

Мы уже говорили о том, что приложение, написанное для nanoCAD, можно запустить в AutoCAD. Но гораздо интереснее наоборот: использовать в nanoCAD код, который был разработан для AutoCAD. Как всегда, я решил сделать это играючи.

Оказывается, мысль о том, что можно создать игру под САПР, приходит в голову не нам одним. Думаю, всем, кто разрабатывает приложения на .NET под AutoCAD, знаком блог Through the Interface Кина Волмсли (Kean Walmsley). В одном из постов автор пишет об игре «Сапер» (“Minesweeper”), сделанной для AutoCAD.

Волмсли не предлагает файлов для скачивания, поэтому придется «скопипастить» код двух VB­файлов и сформировать проект самостоятельно. Комментарии к статье позволяют в подробностях разобраться с тем, как работает игра, но для нас это сейчас не главное. Наша цель — запустить «Сапера» под nanoCAD (рис.1).

Рис. 1.

Рис. 1

Рис. 2

Рис. 2

Для этого нам нужно сделать три вещи:

  1. добавить в References библиотеки .NET nanoCAD: hostdbmgd.dll и hostmgd.dll;
  2. заменить в блоке Imports Autodesk.AutoCAD на Teigha или HostMgd (см. ниже);
  3. заменить полные имена классов AutoCAD (там, где они встречаются) на полные имена классов nanoCAD.

Рассмотрим каждый из пунктов более подробно.

Первое. Добавление библиотек hostdbmgd.dll и hostmgd.dll необходимо, так как в них содержатся все классы для работы с .NET API nanoCAD. Без них мы ничего не сможем. Это понятно.

Второе. В AutoCAD все классы содержатся в пространстве имен Autodesk.AutoCAD. В nanoCAD пространств имен два: классы базы данных (то есть чертежа и его содержимого) находятся в пространстве Teigha, а классы, связанные с приложением, с описанием документа, с командной строкой, — в пространстве имен HostMgd. У меня получилось так:

Imports Teigha.Runtime

Imports Teigha.Geometry

Imports Teigha.DatabaseServices

 

Imports HostMgd.ApplicationServices

Imports HostMgd.EditorInput

И, наконец, третье. В коде иногда встречаются явные указания имен классов. Например, на Autodesk.AutoCAD.DatabaseServices.TransactionManager. В данном случае следует сделать ту же замену, что в пункте два.

В результате мы получим скомпилированную .NET­сборку. Ее можно загрузить в nanoCAD и запустить игру командой MINESWEEPER (рис. 2).

Когда я адаптировал код «Сапера» под nanoCAD, оказалось крайне удобным и почти необходимым компилировать мой проект под обе платформы сразу.

Я сделал две конфигурации: конфигурацию AutoCAD и конфигурацию nanoCAD (рис. 3).

Настраиваем обе конфигурации: указываем пути к acad.exe и ncad.exe, задаем директории, куда должны собираться библиотеки. В конфигурации nanoCAD задаем константу NCAD (рис. 4).

Рис. 3

Рис. 3

Рис. 4

Рис. 4

Подключения пространств имен обрамляются препроцессорными директивами #IF THEN … #END IF. Для связывания полных имен классов используем алиасы:

Imports Platform = HostMgd

Imports PlatformDb = Teigha

В результате получается следующее:

#If NCAD Then

Imports Teigha.Runtime

Imports HostMgd.ApplicationServices

Imports Teigha.DatabaseServices

Imports Teigha.Geometry

Imports HostMgd.EditorInput

Imports System

Imports Platform = HostMgd

Imports PlatformDb = Teigha

#Else

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AutoCAD.DatabaseServices

Imports Autodesk.AutoCAD.Geometry

Imports Autodesk.AutoCAD.EditorInput

Imports System

Imports Platform = Autodesk.AutoCAD

Imports PlatformDb = Autodesk.AutoCAD

#End If

Теперь можно собирать один и тот же код под обе конфигурации. Готово!  

САПР и графика 2`2012