Найти единицу атрибута AutoCAD в С#

Я беру все объекты в ModelSpace для чертежа AutoCAD. Эти объекты бывают разных типов, таких как Pipe, Duct, DuctFitting, Line, Mesh, Solid3D и т. д., поэтому я пишу логику для определения их свойств, отражая их с помощью TypeDescriptor. Мне интересно, есть ли более разумный способ получить все атрибуты объекта и есть ли способ определить единицы измерения для данного элемента. Я знаю, как посмотреть, какие единицы измерения используются на чертеже, но как я могу узнать, что свойство под названием «Длина» на самом деле является длиной, используя единицы из чертежа, такие как футы или метры?

Вот код, который я должен перечислить по всем элементам, которые я хочу:

using (var transaction = database.TransactionManager.StartTransaction())
{
    BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
    BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForRead);

    foreach (DBObject dbObject in blockTableRecord
        .Cast<ObjectId>()
        .Where(id => id.IsValid && !id.IsNull && !id.IsEffectivelyErased && !id.IsErased)
        .Select(id => transaction.GetObject(id, OpenMode.ForRead))
    {
        //DISCOVER PROPERTIES AND THEIR UNITS HERE
    }
}

person Jason Jackson    schedule 24.10.2012    source источник


Ответы (2)


Рефлексия кажется мне разумным подходом.

Чтобы найти свойства, с которыми связаны единицы, вы можете проверить каждое свойство на Autodesk.AutoCAD.DatabaseServices.UnitTypeAttribute. Например, если вы используете TypeDescriptor и ищете свойства, которые являются расстояниями, это может выглядеть так:

var distanceAttribute = new UnitTypeAttribute(UnitType.Distance);
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(dbObject))
{
    if (property.Attributes.Matches(distanceAttribute))
    {
        // Here's a property that is a distance.
    }
}

Это зависит от API, фактически применяющего UnitTypeAttribute там, где вы этого ожидаете.

person Mike Sandberg    schedule 24.10.2012
comment
Это именно то, что мне было нужно. Спасибо! - person Jason Jackson; 24.10.2012

Это поможет вам.

UnitsValue unitValue=Application.DocumentManager.MdiActiveDocument.Database.Insunits;

UnitValue — это перечисление, которое поддерживает 20 типов юнитов, включая LightYear, Armstrong и т. д.

person kaps    schedule 19.02.2013