Многие из вас, возможно, программируют не только для AutoCAD Civil 3D, но и для "чистого" AutoCAD. Также возможно, что ваши пользователи используют ярлык "AutoCAD Civil 3D как AutoCAD" для запуска программы. Именно о таком случае сообщил нам один из партнеров Autodesk Developer Network (ADN), столкнувшись с проблемой в работе созданного им модуля.
Корень проблемы кроется в том, что если Вы запускаете Civil 3D как AutoCAD и если Вы создаете новый чертеж или открываете чертеж, созданный в "чистом" AutoCAD, то в чертеже не создаются и не инициализируются некоторые объекты, специфичные для Civil 3D. Соответственно, у Вашей программы возникнут сложности при использовании Civil 3D API, в частности, при обращении к объекту ‘CivilDocument’.
Таким образом, вопрос разработчика звучит так: "Можно ли определить, содержит ли чертеж эти объекты, специфические для Civil 3D, чтобы включить/отключить некоторые возможности в моей программе?"
Оказалось, чтобы это выяснить, достаточно API AutoCAD – нужно проверить, что в так называемом "Named Object Dictionary" (NOD) присутствует объект под названием "Root". Civil 3D создает этот объект, когда инициализирует чертеж. Пожалуйста, не пытайтесь самостоятельно модифицировать содержащиеся в нем данные, это, скорее всего, разрушит модель Civil 3D.
Код ниже выполняет данную проверку:
C#
public bool isCivilDatabase(Database db)
{
DBDictionary namedObjectDict = db.NamedObjectsDictionaryId
.GetObject(OpenMode.ForRead) as DBDictionary;
return namedObjectDict.Contains("Root");
}
VB.NET
Public Function isCivilDatabase(db As Database) As Boolean
Dim namedObjectDict As DBDictionary = TryCast( _
db.NamedObjectsDictionaryId.GetObject(OpenMode.ForRead), _
DBDictionary)
Return namedObjectDict.Contains("Root")
End Function
Проверив значение, которое вернет данная функция, Вы можете отключить некоторые функции Вашей программы и избежать исключений при обращении к несуществующим объектам. Не лишне будет напомнить, что для открытия NOD требуется транзакция.
Оригинал данной статьи на английском Вы можете найти в блоге Айзека Родригеса (Isaac Rodriguez) "Civilized Development" (http://civilizeddevelopment.typepad.com/civilized-development)