[求助]利用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;
}
<p></p><p>问题2: </p><p>看了一些例子,对于 “public CircleJig(Circle myCircle): base(myCircle)” 两对括号里面的参数,该使用哪些变量,不太清楚。</p><p> // 利用myCircle派生EntityJig基类<br/> public CircleJig(Circle myCircle): base(myCircle)<br/> {<br/> cirCenter = myCircle.Center;<br/> cirRadius = myCircle.Radius;<br/> }</p><p>发现了EntityJig方法都会出现: base 派生基类??还是有另外的含义??</p><p>而DrawJig则不需要。</p><p></p> <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> protected override bool Update()<br/> {<br/> throw new NotImplementedException();<br/> }</p><p> protected override SamplerStatus Sampler(JigPrompts prompts)<br/> {<br/> throw new NotImplementedException();<br/> }</p><p>这两个抽象类的具体的用途,也请知情的朋友谈谈。</p><p>2. public class Class1 后面加上 “:DrawJig”之后点提示“实现抽象类(DrawJig)”,便出现:</p><p> protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)<br/> {<br/> throw new NotImplementedException();<br/> }</p><p> protected override SamplerStatus Sampler(JigPrompts prompts)<br/> {<br/> throw new NotImplementedException();<br/> }</p> <p>问题问不清不楚的。。。</p><p>看的懂的朋友请回答一二,</p><p>看不懂的问题就不了了之。</p><p>我再去找找其它资料。 </p><p>谢谢</p> <p>Jig的流程(转帖<a href="http://www.objectarx.net/bbs/viewthread.php?tid=1741&extra=page%3D2">http://www.objectarx.net/bbs/viewthread.php?tid=1741&extra=page%3D2</a>)</p><p>构造函数()->startJig()->entity()->dimData()->sampler()->getStartPoint()->getNextPoint()->update()->updateDimdata-><br/>setDimvalue()->entity()->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> lzh741206发表于2009-12-22 19:07:00static/image/common/back.gifJig的流程(转帖http://www.objectarx.net/bbs/viewthread.php?tid=1741&extra=page%3D2)构造函数()->startJig()->entity()->dimData()->sampler()->getStartPoint()->
<p>非常感谢版主热心的答复,我消化一下。</p> 以下是引用lzh741206在2009-12-22 19:07:00的发言:EntityJig一般用于图元实体的拖动,一般要求先生成Entity
DrawJig一般用于复杂图形的拖动,WorldDraw重载函数可实现更灵活的控制
DrawJig 才是一般要求先生成Entity。好像。
看了才鸟书上的例子。里面有一句话:
相对于EntityJig类,使用DrawJig类,其代码更加简洁。
<p>目前似乎还没有发现两者之间结果差别。</p><p>一楼的问题还是不知道怎么解决。。。</p> <p>DrawJig的WorldDraw重载函数可以直接调用图形接口(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)</p><p>按参数绘制图形而不须预先生成Entity</p><p>EntityJig要求先生成Entity的</p><p>你可以试下</p> 本帖最后由 作者 于 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