AutoCAD .Net二次开发之JIG动态绘制详解

AutoCAD .Net二次开发之JIG动态绘制详解

AutoCAD平台动态绘制分两种,单实体绘制EntityJig和多实体绘制DrawJig,需要自己自定义类去继承。(本人的理解全放在了代码注释中,请详看注释)

EntityJig(单实体绘制)

class MyLineJig : EntityJig//使用此基类来实现动态绘制只可以绘制一个实体
    {
        //基类EntityJig中有一个关键的成员变量Entity,也就是要绘制到模型空间的临时图形,在绘制完成后将其添加到模型空间以及数据库,既完成了动态绘制
        public MyLineJig(Point3d _basePt) : base(new Line(_basePt, _basePt))//在构造之前调用基类构造为基类成员Entity初始化
        {
            m_AcquirePoint = _basePt;
        }

        public static bool StartDrag()//调用此方法开始绘制
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;

            Point3d startPt = Point3d.Origin;
            PromptStatus promptStatus = GetPoint("", ref startPt);//需自己实现(获取用户输入点)
            if (promptStatus != PromptStatus.OK)
                return false;

            MyLineJig lineJig = new MyLineJig(startPt);
            
            PromptResult PR = doc.Editor.Drag(lineJig);//开始绘制
            if (PR.Status != PromptStatus.OK)
                return false;

            AppendEntityToModalSpace(doc, lineJig.Entity);//需自己实现(将实体添加进模型空间)
            return true;
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)//提取输入数据并处理(鼠标移动时一定频率调用)
        {
            JigPromptPointOptions JPPO = new JigPromptPointOptions();//定义点绘制的配置类
            JPPO.Message = "\n选择点";

            PromptPointResult PR = prompts.AcquirePoint(JPPO);//当鼠标未移动时,程序会在这里阻塞,直到鼠标移动,提取出当前鼠标位置,继续往下运行
            if (PR.Status != PromptStatus.OK)
            {
                return SamplerStatus.Cancel;
            }
                

            if (PR.Value.DistanceTo(((Line)Entity).EndPoint) < 0.000001f)//若当前鼠标位置离上一次绘制的位置很近,返回NoChange,不让系统去调用Update去刷新
                //此举是为了减少刷新频率,避免绘制时的闪烁
                //(需要注意的是Jig绘制刚开始和结束的瞬间, 即便Sampler返回的是NoChange,也会调用Update)
                return SamplerStatus.NoChange;

            m_AcquirePoint = PR.Value;//更新数据,返回OK,告诉系统,数据已整理好,需要刷新
            return SamplerStatus.OK;
        }

        protected override bool Update()//刷新(方法中应写对Base.Entity的更改,Sampler返回OK时调用),(在开始绘制时即便Sampler返回NoChange也会调用,绘制的是圆时应避免给圆的半径赋值零,圆实体会退化成点)
        {
            ((Line)Entity).EndPoint = m_AcquirePoint;//利用绘制好的点去改变实体属性(EntityJig内部实现会把Entity成员绘制到模型空间)
            return true;
        }

        private Point3d m_AcquirePoint;//保存提取出来的鼠标位置
    }

DrawJig(多实体绘制)

    //DrawJig没有了Entity成员,需要自己定义绘制的实体的成员变量
    class MyDoubleLineJig : DrawJig
    {
        public MyDoubleLineJig(Point3d _basePt)
        {
            line_1 = new Line();
            line_2 = new Line();

            m_BasePt = _basePt;
            m_gap = 10.0f;
        }
        public static bool StartDraw()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;

            Point3d startPt = Point3d.Origin;
            PromptStatus promptStatus = GetPoint("\n输入起点", ref startPt);//需自己实现(获取用户的点输入)
            if (promptStatus != PromptStatus.OK)
                return false;

            MyDoubleLineJig lineJig = new MyDoubleLineJig(startPt);
            PromptResult PR = doc.Editor.Drag(lineJig);
            if (PR.Status != PromptStatus.OK)
                return false;

            AppendEntityToModalSpace(doc, lineJig.line_1);//需自己实现(将实体添加进模型空间)
            AppendEntityToModalSpace(doc, lineJig.line_2);

            return true;
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            JigPromptPointOptions m_JPPO = new JigPromptPointOptions();
            m_JPPO.Message = "\ninput end point";
            m_JPPO.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted | UserInputControls.AnyBlankTerminatesInput);
            
            PromptPointResult PR = prompts.AcquirePoint(m_JPPO);

            if (PR.Status != PromptStatus.OK)
                return SamplerStatus.Cancel;

            Point3d pt = PR.Value;
            if (PR.Value == m_AcquirePt)
                return SamplerStatus.NoChange;

            m_AcquirePt = PR.Value;
            return SamplerStatus.OK;
        }

        //与Entity最大不同的在这里(Update->WorldDraw)
        protected override bool WorldDraw(WorldDraw draw)
        {
            Vector3d lineV = m_AcquirePt - m_BasePt;
            Vector3d perpV = lineV.RotateBy(Math.PI / 2.0f, Vector3d.ZAxis);
            perpV = perpV.GetNormal() * m_gap;

            line_1.StartPoint = m_BasePt + perpV;
            line_2.StartPoint = m_BasePt - perpV;
            line_1.EndPoint = m_AcquirePt + perpV;
            line_2.EndPoint = m_AcquirePt - perpV;

            line_1.WorldDraw(draw);//需要调用WorldDraw将想要绘制的实体绘制到模型空间
            line_2.WorldDraw(draw);

            return true;
        }

        Line line_1;
        Line line_2;
        Point3d m_BasePt;
        Point3d m_AcquirePt;
        
        double m_gap;
    }
### 回答1: CAD .NET二次开发手册中文是一本针对使用CAD软件进行二次开发的开发者和程序员所编写的指南。该手册采用中文撰写,内容涵盖了使用CAD .NET进行二次开发所需的基础知识、开发技巧和实例案例等方面,旨在帮助读者更高效地进行CAD软件的二次开发。 该手册中提供了丰富的CAD .NET开发知识,包括CAD应用程序框架、对象模型、事件、命令、属性、图形处理等等。这些知识可以帮助读者理解CAD软件的底层架构、功能和设计原理,从而更好地进行二次开发。 同时,手册中还重点介绍了使用CAD .NET进行二次开发的过程和技巧。比如,如何创建CAD应用程序,如何添加菜单、工具栏等界面元素,如何使用数据库和文件系统等常用资源,如何进行图形操作等等。这些内容对于刚刚开始CAD .NET二次开发的开发者非常有帮助。 此外,手册中还提供了大量的实例案例,包括基础的图形对象绘制、编辑、选择、移动等案例,还有一些高级案例,如CAD数据导入、导出、查询、转化等案例。这些案例不仅可以帮助读者更好地理解CAD .NET的编程特点,还可以作为实践的参考和借鉴。 总之,CAD .NET二次开发手册中文是一本权威而实用的开发指南,涵盖了丰富的知识和内容,对于任何有意向进行CAD软件二次开发的开发者来说都是一本不可多得的参考资料。 ### 回答2: CAD .NET二次开发手册的中文版是一本基于CAD .NET开发平台的详细指南。它包括了许多用于CAD应用程序开发的内容,比如如何使用CAD .NET API来实现CAD二次开发,如何设计CAD插件程序以及如何使用CAD .NET中的各种类和方法。 本书内容精细,图文并茂,对不同的开发需求作出了详细说明。其中涉及到的主题有CAD系统框架、编程环境准备、CAD对象处理、CAD图形显示与编辑、命令交互与外部应用程序交互等,不仅充分讲解了CAD .NET开发平台的基础,还深入介绍了CAD二次开发的实战技巧。 本书作者系统性地介绍了CAD .NET的开发流程,并深入讲解了各种CAD二次开发的注意事项和技巧。此外,本书中还提供了丰富的示例代码,可供读者参考学习。结合实例代码和详细解释,这本书能够更好地帮助读者理解CAD .NET API,快速地开发出符合实际需求的应用程序。 总之,CAD .NET二次开发手册中文版是一本极具实用性的开发指南,对于在CAD二次开发领域工作的开发人员和CAD爱好者都具有很高的参考价值。 ### 回答3: CAD .NET二次开发手册是一本介绍如何利用CAD .NET API进行开发的指南。该手册主要包含三个部分: 第一部分介绍了CAD .NET的基础知识,包括CAD .NET的架构、常用类和对象、CAD .NET的扩展性等内容。 第二部分介绍了CAD .NET的应用开发,包括如何创建和修改CAD图形、如何添加和删除实体、如何进行基础编辑等内容。 第三部分介绍了CAD .NET的高级开发技术,包括如何创建用户界面、如何进行数据交互、如何进行自定义命令等内容。此外,该手册还提供了实用的开发案例,帮助开发者更好地理解和应用CAD .NET API进行二次开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值