ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#/AutoCAD] Polyline Jig 사용법
    C#/AutoCAD API 2023. 9. 8. 06:06

    일반 Command인 'poyline'을 입력하면 Picking 지점에 선이 생기면서 각 지점을 확인하며 작업을 이어갈 수 있다.

    .Net API에서도 동일하게 하려면 EntityJig를 사용해야 하며, Polyline은 아래와 같이 작성한다.

    public class Commands
        {
            [CommandMethod("TEST")]
            public static void Test()
            {
                var doc = Application.DocumentManager.MdiActiveDocument;
                var db = doc.Database;
                var ed = doc.Editor;
                var ppr = ed.GetPoint("\nFirst point: ");
                if (ppr.Status != PromptStatus.OK)
                    return;
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    using (var pline = new Polyline())
                    {
                        pline.AddVertexAt(0, ppr.Value.Convert2d(new Plane()), 0.0, 0.0, 0.0);
                        pline.AddVertexAt(1, Point2d.Origin, 0.0, 0.0, 0.0);
                        pline.TransformBy(ed.CurrentUserCoordinateSystem);
                        var jig = new PlineJig(pline);
                        var cSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                        while (true)
                        {
                            var pr = ed.Drag(jig);
                            if (pr.Status == PromptStatus.Cancel)
                                return;
                            if (pr.Status == PromptStatus.OK)
                            {
                                pline.AddVertexAt(pline.NumberOfVertices, Point2d.Origin, 0.0, 0.0, 0.0);
                                db.TransactionManager.QueueForGraphicsFlush();
                            }
                            else
                            {
                                pline.RemoveVertexAt(pline.NumberOfVertices - 1);
                                if (pr.Status == PromptStatus.Keyword)
                                {
                                    pline.Closed = true;
                                }
                                else if ( pline.NumberOfVertices < 2)
                                {
                                    return;
                                }
                                cSpace.AppendEntity(pline);
                                tr.AddNewlyCreatedDBObject(pline, true);
                                break;
                            }
                        }
                    }
                    tr.Commit();
                }
            }
        }
    
        class PlineJig : EntityJig
        {
            Polyline pline;
            Point3d dragPt;
            Plane plane;
    
            public PlineJig(Polyline pline) : base(pline)
            {
                this.pline = pline;
                plane = new Plane(Point3d.Origin, pline.Normal);
            }
            protected override SamplerStatus Sampler(JigPrompts prompts)
            {
                var options = new JigPromptPointOptions("\nNext point: ");
                options.BasePoint = pline.GetPoint3dAt(pline.NumberOfVertices - 2);
                options.UseBasePoint = true;
                if (3 < pline.NumberOfVertices)
                {
                    options.Keywords.Add("Close");
                    options.AppendKeywordsToMessage = true;
                }
                options.UserInputControls =
                    UserInputControls.Accept3dCoordinates |
                    UserInputControls.GovernedByOrthoMode |
                    UserInputControls.GovernedByUCSDetect |
                    UserInputControls.NullResponseAccepted;
                var result = prompts.AcquirePoint(options);
                if (result.Value.IsEqualTo(dragPt))
                    return SamplerStatus.NoChange;
                dragPt = result.Value;
                return SamplerStatus.OK;
            }
            protected override bool Update()
            {
                pline.SetPointAt(pline.NumberOfVertices - 1, dragPt.Convert2d(plane));
                return true;
            }
        }

    출처 : https://forums.autodesk.com/t5/net/polyline-jig-displaying-drawn-segments-of-polyline/m-p/9950238

    'C# > AutoCAD API' 카테고리의 다른 글

    [C#/AutoCAD] AutoCAD .NET 호환성  (0) 2023.09.10
    [C#/AutoCAD] Rectangle Jig  (0) 2023.09.08
    [C#/AutoCAD] Ribbon Tab/Menu/Button 설정  (0) 2023.09.08
    [C#/AutoCAD] Form 숨기고 띄우기  (0) 2023.09.08
    [C#/AutoCAD] Color 입력 방법  (0) 2023.09.08
Designed by Tistory.