0

AutoCad と連携する C# アプリケーションがあります。その仕事は、モデルのすべてのエンティティを調べて、特定の XData タグの存在を探すことによって、私たちが行っていることに適用されるエンティティを見つけることです。

問題は、製図者がブロックを「非表示」としてマークされているレイヤーに移動した場合 (つまり、レイヤーをオフにした場合)、通常のループを介して xdata を検出できないことです。

foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace)
{
    ... get xData from the entity.
}

次のコードを使用して、レイヤーを再度オンにしようとしました。

ACAD.ActiveDocument.Layers.Item("HIDDENLAYER").LayerOn = true;
ACAD.Update();
foreach...

...しかし、xData は戻ってこないようです。それを非表示のレイヤーに移動すると、オブジェクトから XData が取り除かれたかのようになります。それは悪いでしょう。

非表示レイヤーのアイテムから XData を取得する「適切な」方法はありますか?

ありがとう。

4

3 に答える 3

1

AutoCAD (Map) 2012 でこれを再現できません。どのバージョンの AutoCAD を使用していますか?

内部で実際に何をしているの... get xData from the entity.ですか?これは私がしました:

    static AcadApplication ACAD
    {
        get
        {
            return
                Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as AcadApplication;
        }
    }

    [CommandMethod("tlo")]
    public static void TestLayerOff()
    {
        foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace)
        {
            //... get xData from the entity.
            object xdata, xdataType;
            ent.GetXData("MyRegisteredAppName", out xdataType, out xdata);
            //... read and spit out the xdata to the command line to see what we got
        }
    }

Xdata'edエンティティがあったレイヤーをオフにした後、機能しました。オフになっている別のレイヤーに移動した後も機能しました。私が行方不明であることを再現するステップはありますか? 「起案者」が「ブロックを移動」するとき、正確には何をしているのですか?

また、xdata が実際になくなることが心配な場合は、XDLIST コマンドを使用して、AutoCAD で直接表示します。

最後に、COM から離れてネイティブ C# API を使用するという一般的な推奨事項を捨てます。これにより、ここで実行しようとしていることがすべて実行されます。

于 2011-12-09T19:13:49.410 に答える
0

今のところ、答えは「このアイテムを非表示レイヤーに移動しないでください」になりました。代わりに、XData を配置する前にレイヤーをデフォルトで非表示としてマークしていますが、これはうまく機能しているようです。XData がどのように消えるかはわかりませんが、今のところ、これでうまくいっています。

XData がどのようになくなるかについて何か提案があるかどうか、私はまだ興味があります。

于 2010-10-06T16:10:45.907 に答える
0

Xdata は揮発性です。ブロックを ATTSYNC すると、ブロックは消えます。これは特定の問題に関連していない可能性がありますが、Xdata に依存しない確固たる理由です。

于 2010-10-13T20:39:29.753 に答える