フォローする

.NET - 一時的なグラフィックを作成する

更新 : 2017-02-02 07:28:46 UTC

.NET API を使用して、一時的に表示されるグラフィックを作成できます。

このオブジェクトは REGEN コマンドやズーム、パンを行うと消えてしまいますが、
IntersectWith メソッド等を使用して計算を行った結果などを、
描画画面上に確認の為に示したい時などに役に立つと思われます。

現在 IJCAD の .NET API では DrawVector または DrawVectors を使用する事で、
一時的な線分を描画することが可能となっています。

  • VB.NET
    '一時的なグラフィックを作成(線分)
    <CommandMethod("TMPOBJ1")>
    Public Sub CreateTempLine()
        Dim ed = Application.DocumentManager.MdiActiveDocument.Editor
        ed.DrawVector(Point3d.Origin, New Point3d(50, 50, 0), 1, False)
    End Sub
    
  • C#
    //一時的なグラフィックを作成(線分)
    [CommandMethod("TMPOBJ1")]
    public void CreateTempLine()
    {
        var ed = Application.DocumentManager.MdiActiveDocument.Editor;    
        ed.DrawVector(Point3d.Origin, new Point3d(50,50,0), 1, false);
    }
    

このサンプルでは、(0,0) から (50,50) まで、赤い線分を書いています。

また次のサンプルでは DrawVectors を使用して、疑似的な円と線分を作成しています。

  • VB.NET
    '一時的なグラフィックを作成(疑似円と線分)
    <CommandMethod("TMPOBJ2")>
    Public Sub CreateTempObject()
    
        Dim db = Application.DocumentManager.MdiActiveDocument.Database
        Dim ed = Application.DocumentManager.MdiActiveDocument.Editor
    
        While True
            Dim opt = New PromptPointOptions(vbCrLf + "挿入点を指定(EnterまたはESCキーで終了)")
            opt.AllowNone = True
            Dim Res = ed.GetPoint(opt)
            If Res.Status <> PromptStatus.OK Then Return
            Dim pt = Res.Value
            ed.WriteMessage(String.Format("{0:F4}", pt))
            Using view = ed.GetCurrentView()
                Dim ucs = ed.CurrentUserCoordinateSystem
                Dim rad = (view.Width + view.Height) / 100.0
                Using resBuf = New ResultBuffer()
                    Dim startPt1 = Point3d.Origin, startPt2 = Point3d.Origin
                    Dim endPt1 = Point3d.Origin, endPt2 = Point3d.Origin
                    resBuf.Add(New TypedValue(5003, 1))
                    Using cir = New Circle(pt, view.ViewDirection.GetNormal(), rad)
                        For idx = 0 To 31
                            Dim value = Math.PI * 0.0625 * idx
                            If idx = 4 Then
                                startPt1 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414)
                            ElseIf idx = 12 Then
                                startPt2 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414)
                            ElseIf idx = 20 Then
                                endPt1 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414)
                            ElseIf idx = 28 Then
                                endPt2 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414)
                            End If
                            resBuf.Add(New TypedValue(5009, cir.GetPointAtParameter(value)))
                            value = Math.PI * 0.0625 * (idx + 1)
                            resBuf.Add(New TypedValue(5009, cir.GetPointAtParameter(value)))
                        Next
                    End Using
                    ed.DrawVectors(resBuf, Matrix3d.Identity)
                    ed.DrawVector(startPt1, endPt1, 1, False)
                    ed.DrawVector(startPt2, endPt2, 1, False)
                End Using
            End Using
        End While
    End Sub
    
  • C#
    //一時的なグラフィックを作成(疑似円と線分)
    [CommandMethod("TMPOBJ2")]
    public void CreateTempObject()
    {
        var db = Application.DocumentManager.MdiActiveDocument.Database;
        var ed = Application.DocumentManager.MdiActiveDocument.Editor;
    
        while (true)
        {
            var opt = new PromptPointOptions("\n挿入点を指定(EnterまたはESCキーで終了)");
            opt.AllowNone = true;
            var res = ed.GetPoint(opt);
            if (res.Status != PromptStatus.OK) return;
            var pt = res.Value;
            ed.WriteMessage(string.Format("{0:F4}",pt));                
    
            using (var view = ed.GetCurrentView())
            {
                var ucs = ed.CurrentUserCoordinateSystem;
                var rad = (view.Width + view.Height) / 100.0;
                using (var resBuf = new ResultBuffer())
                using (var cir = new Circle(pt, view.ViewDirection.GetNormal(), rad))
                {
                    Point3d startPt1 = Point3d.Origin, startPt2 = Point3d.Origin;
                    Point3d endPt1 = Point3d.Origin, endPt2 = Point3d.Origin;
                    resBuf.Add(new TypedValue(5003, 1));
                    for (var idx = 0; idx < 32; idx++)
                    {
                        double value = Math.PI * 0.0625 * idx;
                        if (idx == 4)
                            startPt1 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414);
                        else if(idx == 12)
                            startPt2 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414);
                        else if(idx == 20)
                            endPt1 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414);
                        else if(idx == 28)
                            endPt2 = pt.Subtract(pt.GetVectorTo(cir.GetPointAtParameter(value)) * 1.414);
    
                        resBuf.Add(new TypedValue(5009, cir.GetPointAtParameter(value)));
                        value = Math.PI * 0.0625 * (idx + 1);
                        resBuf.Add(new TypedValue(5009, cir.GetPointAtParameter(value)));
                    }
                    ed.DrawVectors(resBuf, Matrix3d.Identity);
                    ed.DrawVector(startPt1, endPt1,1, false);
                    ed.DrawVector(startPt2, endPt2, 1, false);
                }
            }
        }
    }
    
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
他にご質問がございましたら、リクエストを送信してください

コメント