1

AutoCAD図面のModelSpace内のすべてのオブジェクトを取得しています。これらのオブジェクトは、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
    }
}
4

2 に答える 2

4

これはあなたを助けます。

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

UnitValueLightYearArmstrongなどを含む20のユニットタイプをサポートする列挙型です。

于 2013-02-19T19:21:16.940 に答える
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.
    }
}

UnitTypeAttributeこれは、APIが実際に期待どおりに適用されていることに依存しています。

于 2012-10-24T17:38:30.700 に答える