明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9133|回复: 16

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

  [复制链接]
发表于 2009-12-22 13:00:00 | 显示全部楼层 |阅读模式
原贴:
http://www.mjtd.com/bbs/dispbbs.asp?BoardID=33&replyID=9692&id=75839&skin=1
  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.Runtime;
  7. /*http://www.mjtd.com/bbs/dispbbs.asp?BoardID=33&replyID=9692&id=75839&skin=1
  8. * Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23 (VB)
  9. * Jig小试牛刀----动态修改圆大小 by carrot1983 @2009.12.22 (C#)
  10. * 利用Jig动态拖拽实现动态修改圆大小
  11. */
  12. namespace CsMgd17
  13. {
  14.     public class Class1
  15.     {
  16.         [CommandMethod("Test")]
  17.         public void Test()
  18.         {
  19.             Database db = HostApplicationServices.WorkingDatabase;
  20.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  21.             PromptEntityOptions cirOpts = new PromptEntityOptions("\n选择一个圆: ");
  22.             cirOpts.SetRejectMessage("\n拜托,只能选择圆,请选择一个圆好吧!");
  23.             cirOpts.AddAllowedClass(typeof(Circle), true);
  24.             PromptEntityResult cirRes = ed.GetEntity(cirOpts);
  25.             if (cirRes.Status == PromptStatus.Cancel) return;
  26.             using (Transaction tr = db.TransactionManager.StartTransaction())
  27.             {
  28.                 Circle myCircle = tr.GetObject(cirRes.ObjectId, OpenMode.ForWrite) as Circle;
  29.                 CircleJig jig = new CircleJig(myCircle);
  30.                 myCircle.Highlight();
  31.                 PromptResult dragRes = ed.Drag(jig);
  32.                 tr.Commit();
  33.             }
  34.         }
  35.         public class CircleJig : EntityJig
  36.         {
  37.             public Circle myCircle;
  38.             private double cirRadius;
  39.             private Point3d cirCenter;
  40.             // 利用myCircle派生EntityJig基类
  41.             public CircleJig(Circle myCircle): base(myCircle)
  42.             {
  43.                 cirCenter = myCircle.Center;
  44.                 cirRadius = myCircle.Radius;
  45.             }
  46.             // 实现图形的更新
  47.             protected override bool Update()
  48.             {
  49.                 myCircle.Radius = cirRadius;
  50.                 return true;
  51.             }
  52.             // 用于与用户交互,输出提示信息并检测用户的输入
  53.             protected override SamplerStatus Sampler(JigPrompts prompts)
  54.             {
  55.                 JigPromptDistanceOptions jigDisOpts = new JigPromptDistanceOptions();
  56.                 jigDisOpts.BasePoint = cirCenter; ;
  57.                 jigDisOpts.UseBasePoint = true;
  58.                 jigDisOpts.Cursor = CursorType.RubberBand;
  59.                 PromptDoubleResult radRes = prompts.AcquireDistance(jigDisOpts);
  60.                 if (radRes.Status != PromptStatus.OK) return SamplerStatus.Cancel;
  61.                 double radTemp;
  62.                 radTemp = radRes.Value;
  63.                 if (radTemp != cirRadius)
  64.                 {
  65.                     cirRadius = radTemp;
  66.                 }
  67.                 else
  68.                     return SamplerStatus.NoChange;
  69.                 if (radRes.Status == PromptStatus.Cancel)  
  70.                     return SamplerStatus.Cancel;
  71.                 else
  72.                     return SamplerStatus.OK;
  73.             }
  74.         }
  75.     }
  76. }
求助: 怎么解决问题出在这里:
            // 实现图形的更新
            protected override bool Update()
            {
                myCircle.Radius = cirRadius;
                return true;
            }
 楼主| 发表于 2009-12-22 13:03:00 | 显示全部楼层

问题2:

看了一些例子,对于 “public CircleJig(Circle myCircle): base(myCircle)” 两对括号里面的参数,该使用哪些变量,不太清楚。

            // 利用myCircle派生EntityJig基类
            public CircleJig(Circle myCircle): base(myCircle)
            {
                cirCenter = myCircle.Center;
                cirRadius = myCircle.Radius;
            }

发现了EntityJig方法都会出现: base 派生基类??还是有另外的含义??

而DrawJig则不需要。

 楼主| 发表于 2009-12-22 13:12:00 | 显示全部楼层

问题3:(运行环境 Visual Studio 2008)

Jig 的用法,看过一些例子之后,

发现有两种: EntityJig和DrawJig

敢问,何时用EntityJig,何时用DrawJig ?????

1. public class Class1 后面加上 “:EntityJig”之后点提示“实现抽象类(EntityJig)”,便出现:

        protected override bool Update()
        {
            throw new NotImplementedException();
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            throw new NotImplementedException();
        }

这两个抽象类的具体的用途,也请知情的朋友谈谈。

2. public class Class1 后面加上 “:DrawJig”之后点提示“实现抽象类(DrawJig)”,便出现:

        protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
        {
            throw new NotImplementedException();
        }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            throw new NotImplementedException();
        }

 楼主| 发表于 2009-12-22 13:21:00 | 显示全部楼层

问题问不清不楚的。。。

看的懂的朋友请回答一二,

看不懂的问题就不了了之。

我再去找找其它资料。 

谢谢

发表于 2009-12-22 19:07:00 | 显示全部楼层

Jig的流程(转帖http://www.objectarx.net/bbs/viewthread.php?tid=1741&extra=page%3D2

构造函数()->startJig()->entity()->dimData()->sampler()->getStartPoint()->getNextPoint()->update()->updateDimdata->
setDimvalue()->entity()->startJig();
sampler,采样取点.
Update对采样的点进行更新.
Sampler,update,entity,这几个是不能更改名称和参数的。
dimData,updataDimdata,setDimvalue跟动态标注有关。

EntityJig一般用于图元实体的拖动,一般要求先生成Entity

DrawJig一般用于复杂图形的拖动,WorldDraw重载函数可实现更灵活的控制

public CircleJig(Circle myCircle): base(myCircle)

子类构造函数调用基类的构造函数做初始化

 楼主| 发表于 2009-12-23 08:25:00 | 显示全部楼层
lzh741206发表于2009-12-22 19:07:00Jig的流程(转帖http://www.objectarx.net/bbs/viewthread.php?tid=1741&extra=page%3D2)构造函数()->startJig()->entity()->dimData()->sampler()->getStartPoint()->

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

 楼主| 发表于 2009-12-24 09:28:00 | 显示全部楼层
  1. 以下是引用lzh741206在2009-12-22 19:07:00的发言:EntityJig一般用于图元实体的拖动,一般要求先生成Entity
  2. DrawJig一般用于复杂图形的拖动,WorldDraw重载函数可实现更灵活的控制
复制代码
DrawJig 才是一般要求先生成Entity。好像。
看了才鸟书上的例子。里面有一句话:
相对于EntityJig类,使用DrawJig类,其代码更加简洁。
 楼主| 发表于 2009-12-24 09:34:00 | 显示全部楼层

目前似乎还没有发现两者之间结果差别。

一楼的问题还是不知道怎么解决。。。

发表于 2009-12-24 09:38:00 | 显示全部楼层

DrawJig的WorldDraw重载函数可以直接调用图形接口(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)

按参数绘制图形而不须预先生成Entity

EntityJig要求先生成Entity的

你可以试下

 楼主| 发表于 2009-12-24 10:31:00 | 显示全部楼层
本帖最后由 作者 于 2009-12-24 10:54:24 编辑

使用 DrawJig 类编写似乎容易多了。。。以下代码为使用DrawJig动态画圆成功。一楼的使用EntityJig类动态画圆的问题依然未解决
再请教:如何实现点鼠标左键和空格确定(按默认值画圆),点ESC和鼠标右键退出(不画圆)
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.Runtime;
  9. namespace CsMgd19
  10. {
  11.     public class CircleJig : DrawJig
  12.     {
  13.         // 声明圆对象。
  14.         private Circle cirEnt;
  15.         // 声明圆心。
  16.         private Point3d centerPt;
  17.         // 声明圆的半径。
  18.         private double pickRadius;
  19.         Database db = HostApplicationServices.WorkingDatabase;
  20.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  21.         [CommandMethod("Test")]
  22.         public void Test()
  23.         {
  24.             // 点输入交互操作。
  25.             PromptPointOptions ptOpts = new PromptPointOptions("\n指定圆心: ");
  26.             PromptPointResult ptRes = ed.GetPoint(ptOpts);
  27.             if (ptRes.Status != PromptStatus.OK) return;
  28.             centerPt = ptRes.Value;
  29.             // 在内存中创建一个圆对象。
  30.             cirEnt = (Circle)new Circle();
  31.             cirEnt.Center = centerPt;
  32.             using (Transaction trans = db.TransactionManager.StartTransaction())
  33.             {
  34.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  35.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  36.                 // 开始拖动。
  37.                 PromptResult jigRes = ed.Drag(this);
  38.                 if (jigRes.Status == PromptStatus.OK)
  39.                 {
  40.                     // 将圆对象加入到图形数据库中。
  41.                     btr.AppendEntity(cirEnt);
  42.                     trans.AddNewlyCreatedDBObject(cirEnt, true);
  43.                     trans.Commit();
  44.                 }
  45.             }
  46.         }
  47.         // 自动重载WorldDraw,更新要创建的图形对象,从而产生动态的拖动效果。
  48.         protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  49.         {
  50.             // 刷新图形画面.
  51.             draw.Geometry.Draw(cirEnt);
  52.             return true;
  53.         }
  54.         //  自动重载Sampler,检测用户的输入,同时建立提示字符。
  55.         protected override SamplerStatus Sampler(JigPrompts prompts)
  56.         {
  57.             // 定义一个距离拖动交互类.
  58.             JigPromptDistanceOptions jigDisOpts = new JigPromptDistanceOptions("\n指定圆的半径: ");
  59.             // 设置拖动光标类型.
  60.             jigDisOpts.Cursor = CursorType.RubberBand;
  61.             // 默认值
  62.             jigDisOpts.DefaultValue = 100;
  63.             // 可以接受返回空值
  64.             jigDisOpts.UserInputControls = UserInputControls.NullResponseAccepted;
  65.             // 设置拖动光标基点.
  66.             jigDisOpts.BasePoint = centerPt;
  67.             jigDisOpts.UseBasePoint = true;
  68.             // 用AcquireDistance函数得到用户输入的点.
  69.             PromptDoubleResult radRes = prompts.AcquireDistance(jigDisOpts);
  70.             if (radRes.Status != PromptStatus.Cancel)
  71.             {
  72.                 // 动态半径返回值
  73.                 double curRad = radRes.Value;
  74.                 if (curRad == pickRadius)
  75.                 {
  76.                     return SamplerStatus.NoChange;
  77.                 }
  78.                 else
  79.                 {
  80.                     if (curRad != 0)
  81.                     {
  82.                         // 重新设置圆的参数
  83.                         cirEnt.Radius = curRad;
  84.                         pickRadius = curRad;
  85.                         return SamplerStatus.OK;
  86.                     }
  87.                     else
  88.                     {
  89.                         return SamplerStatus.Cancel;
  90.                     }
  91.                 }
  92.             }
  93.             else
  94.             {
  95.                 return SamplerStatus.Cancel;
  96.             }
  97.         }
  98.     }
  99. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 10:49 , Processed in 0.187378 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表