Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API:サーフェス エッジの延長

Issue

AutoCAD .NET API で SURFEXTEND[延長サーフェス] コマンド と同じような処理は出来ますか?

 

Solution
サーフェス エッジの延長は、Surface.ExtendEdges メソッド で実装することが出来ます。

 

次の C# コードは、選択した1つのサーフェス エッジを 100 ポイント延長するものです。 SURFEXTEND[延長サーフェス] コマンド と同様に、エッジの延長でサーフェスに自己交差すると延長に失敗する場合があります。

 

var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;

try
{
    PromptSelectionOptions pso = new PromptSelectionOptions();
    pso.MessageForAdding = "\n延長するサーフェス エッジを選択:";
    pso.SingleOnly = true;
    pso.SinglePickInSpace = true;
    pso.ForceSubSelections = true;
    PromptSelectionResult psr = ed.GetSelection(pso);
    if (psr.Status != PromptStatus.OK)
        return;

    SelectionSet ss = psr.Value;
    SelectedObject surfedge = ss[0];

    ObjectId surfId = ss.GetObjectIds()[0];
    if (!surfId.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Surface))))
    {
        ed.WriteMessage("\nサーフェス エッジを選択を選択してください ...");
        return;
    }

    using (var tr = db.TransactionManager.StartTransaction())
    {
        var surf = tr.GetObject(surfId, OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.Surface;
        if (surf != null)
        {
            if (surfedge.GetSubentities()[0].FullSubentityPath.SubentId.Type != SubentityType.Edge)
            {
                ed.WriteMessage("\n{0} が選択されました ...\nサーフェス エッジを選択を選択してください ...",
                                surfedge.GetSubentities()[0].FullSubentityPath.SubentId.Type);
                tr.Abort();
                return;
            }
            FullSubentityPath[] edges = { surfedge.GetSubentities()[0].FullSubentityPath };
            surf.ExtendEdges(edges, 100.0, Autodesk.AutoCAD.DatabaseServices.Surface.EdgeExtensionType.ExtendEdge, true);
        }
        tr.Commit();
    }
}
catch (Autodesk.AutoCAD.BoundaryRepresentation.Exception ex)
{
    ed.WriteMessage("\nエラー: {0}\r\n at {1}", ex.Message, ex.StackTrace);
}

 

なお、SURFEXTEND[延長サーフェス] コマンド によるサーフェス延長とは異なり、Surface.ExtendEdges メソッド  による延長では、延長されたサーフェス部分は、無条件に元のサーフェスに結合された状態になります。 SURFEXTEND[延長サーフェス] コマンド では、延長されたサーフェスを元のサーフェスと結合(合成)するか、別のサーフェスとして追加するか(既定値)をコマンド プションで指定することが出来ます。

 

extend_surface.jpg