AutoCAD .Net EntityJig – Dynamic Dimension and Line Jig

来源:互联网 发布:淘宝店铺客服如何联系 编辑:程序博客网 时间:2024/06/03 15:14

本实例展示使用 EntityJig 技术,动态交互模式创建直线并同时显示动态尺寸。
如下图所示:
这里写图片描述
翻译自: 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;        }    }}
阅读全文
0 0