Намерете единица на атрибута на AutoCAD в C#

Грабвам всички обекти в 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 е enum, който поддържа 20 типа единици, включително LightYear, Armstrong и т.н.

person kaps    schedule 19.02.2013