AutoCAD .Net EntityJig – Dynamic Dimension and Line Jig

本实例展示使用 EntityJig 技术,动态交互模式创建直线并同时显示动态尺寸。
如下图所示:
AutoCAD .Net EntityJig – Dynamic Dimension and Line Jig_第1张图片
翻译自: AutoCAD .NET: EntityJig – Dynamic Dimension and Line Jig

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

[CommandMethod("JigLineWithDynDim")]
public static void JigLineWithDynDim()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    if (DynDimLineJigger.Jig())
    {
        doc.Editor.WriteMessage("\nSuccess\n");
    }
    else
    {
        doc.Editor.WriteMessage("\nFailure\n");
    }
}

public class DynDimLineJigger : EntityJig
{
    public int step = 1;
    public Point3d _startPnt;
    public Point3d _endPnt;
    private DynamicDimensionDataCollection dddCollection
        = new DynamicDimensionDataCollection();

    public DynDimLineJigger(Line line)
        : base(line)
    {
        Entity.SetDatabaseDefaults();

        Dimension dim1 = new AlignedDimension();
        dim1.SetDatabaseDefaults();
        dddCollection.Add(new DynamicDimensionData(dim1, true, true));
        dddCollection[0].Focal = false;
        dddCollection[0].Editable = false;
    }

    private Editor Editor
    {
        get
        {
            return Application.DocumentManager.MdiActiveDocument.Editor;
        }
    }

    public Line line
    {
        get
        {
            return base.Entity as Line;
        }
    }

    protected override bool Update()
    {
        switch (step)
        {
            case 1:
                line.StartPoint = line.EndPoint = _startPnt;
                break;

            case 2:
                line.EndPoint = _endPnt;

                AlignedDimension dim1 = (AlignedDimension)dddCollection[0].Dimension;
                dim1.XLine1Point = _startPnt;
                dim1.XLine2Point = _endPnt;
                dim1.DimLinePoint = _endPnt.RotateBy(Math.PI / 10, Vector3d.ZAxis, _startPnt);
                break;

            default:
                return false;
        }

        return true;
    }

    protected override SamplerStatus Sampler(JigPrompts prompts)
    {
        switch (step)
        {
            case 1:
                JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nStart point:");
                prOptions1.UseBasePoint = false;
                PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
                if (prResult1.Status != PromptStatus.OK)
                    return SamplerStatus.Cancel;

                if (prResult1.Value.Equals(_startPnt))
                {
                    return SamplerStatus.NoChange;
                }
                else
                {
                    _startPnt = prResult1.Value;
                    return SamplerStatus.OK;
                }

            case 2:
                JigPromptPointOptions prOptions2 = new JigPromptPointOptions("\nEnd point:");
                prOptions2.BasePoint = line.StartPoint;
                prOptions2.UseBasePoint = true;
                PromptPointResult prResult2 = prompts.AcquirePoint(prOptions2);
                if (prResult2.Status != PromptStatus.OK)
                    return SamplerStatus.Cancel;

                if (prResult2.Value.Equals(_endPnt))
                {
                    return SamplerStatus.NoChange;
                }
                else
                {
                    _endPnt = prResult2.Value;
                    return SamplerStatus.OK;
                }
            default:
                break;
        }

        return SamplerStatus.OK;
    }

    protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
    {
        base.GetDynamicDimensionData(dimScale);
        return dddCollection;
    }

    public static bool Jig()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        DynDimLineJigger jigger = null;

        try
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            jigger = new DynDimLineJigger(new Line());
            PromptResult pr;
            do
            {
                pr = ed.Drag(jigger);
                if (pr.Status == PromptStatus.Keyword)
                {
                    // Add keyword handling code below
                }
                else
                {
                    jigger.step++;
                }
            }
            while (pr.Status == PromptStatus.OK
                && jigger.step <= 2);

            if (pr.Status == PromptStatus.OK)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    BlockTable bt = tr.GetObject(db.BlockTableId,
                        OpenMode.ForRead) as BlockTable;
                    BlockTableRecord btr = tr.GetObject(
                        bt[BlockTableRecord.ModelSpace],
                        OpenMode.ForWrite) as BlockTableRecord;

                    btr.AppendEntity(jigger.Entity);
                    tr.AddNewlyCreatedDBObject(jigger.Entity, true);
                    tr.Commit();
                }
            }
            else
            {
                return false;
            }

            return true;
        }
        catch
        {
            if (jigger != null && jigger.Entity != null)
                jigger.Entity.Dispose();

            return false;
        }
    }
}

你可能感兴趣的:(AutoCAD二次开发,AutoCAD,.Net,AutoCAD,C#)