carrot1983 发表于 2009-12-22 13:00:00

[求助]利用Jig动态拖拽实现动态修改圆大小(C#版)

原贴:
http://www.mjtd.com/bbs/dispbbs.asp?BoardID=33&replyID=9692&id=75839&skin=1

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
/*http://www.mjtd.com/bbs/dispbbs.asp?BoardID=33&replyID=9692&id=75839&skin=1
* Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23 (VB)
* Jig小试牛刀----动态修改圆大小 by carrot1983 @2009.12.22 (C#)
* 利用Jig动态拖拽实现动态修改圆大小
*/
namespace CsMgd17
{
    public class Class1
    {
      
      public void Test()
      {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptEntityOptions cirOpts = new PromptEntityOptions("\n选择一个圆: ");
            cirOpts.SetRejectMessage("\n拜托,只能选择圆,请选择一个圆好吧!");
            cirOpts.AddAllowedClass(typeof(Circle), true);
            PromptEntityResult cirRes = ed.GetEntity(cirOpts);
            if (cirRes.Status == PromptStatus.Cancel) return;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Circle myCircle = tr.GetObject(cirRes.ObjectId, OpenMode.ForWrite) as Circle;
                CircleJig jig = new CircleJig(myCircle);
                myCircle.Highlight();
                PromptResult dragRes = ed.Drag(jig);
                tr.Commit();
            }
      }
      public class CircleJig : EntityJig
      {
            public Circle myCircle;
            private double cirRadius;
            private Point3d cirCenter;
            // 利用myCircle派生EntityJig基类
            public CircleJig(Circle myCircle): base(myCircle)
            {
                cirCenter = myCircle.Center;
                cirRadius = myCircle.Radius;
            }
            // 实现图形的更新
            protected override bool Update()
            {
                myCircle.Radius = cirRadius;
                return true;
            }
            // 用于与用户交互,输出提示信息并检测用户的输入
            protected override SamplerStatus Sampler(JigPrompts prompts)
            {
                JigPromptDistanceOptions jigDisOpts = new JigPromptDistanceOptions();
                jigDisOpts.BasePoint = cirCenter; ;
                jigDisOpts.UseBasePoint = true;
                jigDisOpts.Cursor = CursorType.RubberBand;
                PromptDoubleResult radRes = prompts.AcquireDistance(jigDisOpts);
                if (radRes.Status != PromptStatus.OK) return SamplerStatus.Cancel;
                double radTemp;
                radTemp = radRes.Value;
                if (radTemp != cirRadius)
                {
                  cirRadius = radTemp;
                }
                else
                  return SamplerStatus.NoChange;
                if (radRes.Status == PromptStatus.Cancel)
                  return SamplerStatus.Cancel;
                else
                  return SamplerStatus.OK;
            }
      }
    }
}


求助: 怎么解决问题出在这里:
            // 实现图形的更新
            protected override bool Update()
            {
                myCircle.Radius = cirRadius;
                return true;
            }

carrot1983 发表于 2009-12-22 13:03:00

<p></p><p>问题2: </p><p>看了一些例子,对于 “public CircleJig(Circle myCircle): base(myCircle)” 两对括号里面的参数,该使用哪些变量,不太清楚。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 利用myCircle派生EntityJig基类<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CircleJig(Circle myCircle): base(myCircle)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cirCenter = myCircle.Center;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cirRadius = myCircle.Radius;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>发现了EntityJig方法都会出现: base 派生基类??还是有另外的含义??</p><p>而DrawJig则不需要。</p><p></p>

carrot1983 发表于 2009-12-22 13:12:00

<p>问题3:(运行环境 Visual Studio 2008)</p><p>Jig 的用法,看过一些例子之后,</p><p>发现有两种: EntityJig和DrawJig</p><p>敢问,何时用EntityJig,何时用DrawJig ?????</p><p>1. public class Class1 后面加上 “:EntityJig”之后点提示“实现抽象类(EntityJig)”,便出现:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override bool Update()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override SamplerStatus Sampler(JigPrompts prompts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>这两个抽象类的具体的用途,也请知情的朋友谈谈。</p><p>2. public class Class1 后面加上 “:DrawJig”之后点提示“实现抽象类(DrawJig)”,便出现:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override SamplerStatus Sampler(JigPrompts prompts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>

carrot1983 发表于 2009-12-22 13:21:00

<p>问题问不清不楚的。。。</p><p>看的懂的朋友请回答一二,</p><p>看不懂的问题就不了了之。</p><p>我再去找找其它资料。&nbsp;</p><p>谢谢</p>

雪山飞狐_lzh 发表于 2009-12-22 19:07:00

<p>Jig的流程(转帖<a href="http://www.objectarx.net/bbs/viewthread.php?tid=1741&amp;extra=page%3D2">http://www.objectarx.net/bbs/viewthread.php?tid=1741&amp;extra=page%3D2</a>)</p><p>构造函数()-&gt;startJig()-&gt;entity()-&gt;dimData()-&gt;sampler()-&gt;getStartPoint()-&gt;getNextPoint()-&gt;update()-&gt;updateDimdata-&gt;<br/>setDimvalue()-&gt;entity()-&gt;startJig();<br/>sampler,采样取点.<br/>Update对采样的点进行更新.<br/>Sampler,update,entity,这几个是不能更改名称和参数的。<br/>dimData,updataDimdata,setDimvalue跟动态标注有关。</p><p>EntityJig一般用于图元实体的拖动,一般要求先生成Entity</p><p>DrawJig一般用于复杂图形的拖动,WorldDraw重载函数可实现更灵活的控制</p><p>public CircleJig(Circle myCircle): base(myCircle)</p><p>子类构造函数调用基类的构造函数做初始化</p><p></p>

carrot1983 发表于 2009-12-23 08:25:00

lzh741206发表于2009-12-22 19:07:00static/image/common/back.gifJig的流程(转帖http://www.objectarx.net/bbs/viewthread.php?tid=1741&amp;extra=page%3D2)构造函数()-&gt;startJig()-&gt;entity()-&gt;dimData()-&gt;sampler()-&gt;getStartPoint()-&gt;

<p>非常感谢版主热心的答复,我消化一下。</p>

carrot1983 发表于 2009-12-24 09:28:00

以下是引用lzh741206在2009-12-22 19:07:00的发言:EntityJig一般用于图元实体的拖动,一般要求先生成Entity
DrawJig一般用于复杂图形的拖动,WorldDraw重载函数可实现更灵活的控制

DrawJig 才是一般要求先生成Entity。好像。
看了才鸟书上的例子。里面有一句话:
相对于EntityJig类,使用DrawJig类,其代码更加简洁。

carrot1983 发表于 2009-12-24 09:34:00

<p>目前似乎还没有发现两者之间结果差别。</p><p>一楼的问题还是不知道怎么解决。。。</p>

雪山飞狐_lzh 发表于 2009-12-24 09:38:00

<p>DrawJig的WorldDraw重载函数可以直接调用图形接口(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)</p><p>按参数绘制图形而不须预先生成Entity</p><p>EntityJig要求先生成Entity的</p><p>你可以试下</p>

carrot1983 发表于 2009-12-24 10:31:00

本帖最后由 作者 于 2009-12-24 10:54:24 编辑

使用 DrawJig 类编写似乎容易多了。。。以下代码为使用DrawJig动态画圆成功。一楼的使用EntityJig类动态画圆的问题依然未解决
再请教:如何实现点鼠标左键和空格确定(按默认值画圆),点ESC和鼠标右键退出(不画圆)

using System;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace CsMgd19
{
    public class CircleJig : DrawJig
    {
      // 声明圆对象。
      private Circle cirEnt;
      // 声明圆心。
      private Point3d centerPt;
      // 声明圆的半径。
      private double pickRadius;
      Database db = HostApplicationServices.WorkingDatabase;
      Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
      
      public void Test()
      {
            // 点输入交互操作。
            PromptPointOptions ptOpts = new PromptPointOptions("\n指定圆心: ");
            PromptPointResult ptRes = ed.GetPoint(ptOpts);
            if (ptRes.Status != PromptStatus.OK) return;
            centerPt = ptRes.Value;
            // 在内存中创建一个圆对象。
            cirEnt = (Circle)new Circle();
            cirEnt.Center = centerPt;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                // 开始拖动。
                PromptResult jigRes = ed.Drag(this);
                if (jigRes.Status == PromptStatus.OK)
                {
                  // 将圆对象加入到图形数据库中。
                  btr.AppendEntity(cirEnt);
                  trans.AddNewlyCreatedDBObject(cirEnt, true);
                  trans.Commit();
                }
            }
      }
      // 自动重载WorldDraw,更新要创建的图形对象,从而产生动态的拖动效果。
      protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
      {
            // 刷新图形画面.
            draw.Geometry.Draw(cirEnt);
            return true;
      }
      //自动重载Sampler,检测用户的输入,同时建立提示字符。
      protected override SamplerStatus Sampler(JigPrompts prompts)
      {
            // 定义一个距离拖动交互类.
            JigPromptDistanceOptions jigDisOpts = new JigPromptDistanceOptions("\n指定圆的半径: ");
            // 设置拖动光标类型.
            jigDisOpts.Cursor = CursorType.RubberBand;
            // 默认值
            jigDisOpts.DefaultValue = 100;
            // 可以接受返回空值
            jigDisOpts.UserInputControls = UserInputControls.NullResponseAccepted;
            // 设置拖动光标基点.
            jigDisOpts.BasePoint = centerPt;
            jigDisOpts.UseBasePoint = true;
            // 用AcquireDistance函数得到用户输入的点.
            PromptDoubleResult radRes = prompts.AcquireDistance(jigDisOpts);
            if (radRes.Status != PromptStatus.Cancel)
            {
                // 动态半径返回值
                double curRad = radRes.Value;
                if (curRad == pickRadius)
                {
                  return SamplerStatus.NoChange;
                }
                else
                {
                  if (curRad != 0)
                  {
                        // 重新设置圆的参数
                        cirEnt.Radius = curRad;
                        pickRadius = curRad;
                        return SamplerStatus.OK;
                  }
                  else
                  {
                        return SamplerStatus.Cancel;
                  }
                }
            }
            else
            {
                return SamplerStatus.Cancel;
            }
      }
    }
}

页: [1] 2
查看完整版本: [求助]利用Jig动态拖拽实现动态修改圆大小(C#版)