明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4665|回复: 7

[JIG] Jig小试牛刀----动态修改圆大小

[复制链接]
发表于 2009-5-23 12:53:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-5-26 22:23:25 编辑
  1. 'Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23
  2. '利用Jig动态拖拽实现动态修改圆大小
  3. Imports Autodesk.AutoCAD.EditorInput
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Imports Autodesk.AutoCAD.Runtime
  7. Imports Autodesk.AutoCAD.ApplicationServices
  8. Public Class Class1
  9.     <CommandMethod("Jigtest")> Public Sub JigTest()
  10.         '选择提示
  11.         Dim SelectPrompt As New PromptEntityOptions(vbNewLine + "选择一个圆: ")
  12.         '错误操作提示
  13.         SelectPrompt.SetRejectMessage(vbNewLine + "拜托,只能选择圆,请选择一个圆好吧!")
  14.         '限制只能选择circle类型,即只能选择圆
  15.         SelectPrompt.AddAllowedClass(GetType(Circle), False)
  16.         '命令行编辑器
  17.         Dim Ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  18.         '选择结果
  19.         Dim SelectResult As PromptEntityResult = Ed.GetEntity(SelectPrompt)
  20.         '正确的选择
  21.         If SelectResult.Status = PromptStatus.OK Then
  22.             '当前工作CAD数据库
  23.             Dim Db As Database = HostApplicationServices.WorkingDatabase
  24.             '事务处理,在VB.Net中使用using能够在using结束后自动销毁using引用的对象,进行垃圾回收。否则需要另外进行Dispose处理
  25.             Using Tr As Transaction = Db.TransactionManager.StartTransaction
  26.                 '提取选择的圆对象
  27.                 Dim CircleObj As Circle = Tr.GetObject(SelectResult.ObjectId, OpenMode.ForWrite)
  28.                 '实例化CircleJig类,即创建Jig对象
  29.                 Dim Jig As New CircleJig(CircleObj)
  30.                 '高亮显示圆对象
  31.                 CircleObj.Highlight()
  32.                 '拖拽Jig
  33.                 Dim DragResult As PromptResult = Ed.Drag(Jig)
  34.                 '提交事务处理
  35.                 Tr.Commit()
  36.             End Using
  37.         End If
  38.     End Sub
  39. End Class
  40. Public Class CircleJig
  41.     '继承EntityJig类
  42.     Inherits EntityJig
  43.     '半径
  44.     Private dblRadius As Double
  45.     '圆心
  46.     Private ptCenter As Point3d
  47.     Public Sub New(ByVal CircleObj As Circle)
  48.         '利用circleobj派生EntityJig基类
  49.         MyBase.New(CircleObj)
  50.         '获取初始半径
  51.         dblRadius = CircleObj.Radius
  52.         '获取初始圆心坐标
  53.         ptCenter = CircleObj.Center
  54.     End Sub
  55.     Protected Overrides Function Sampler(ByVal prompts As Autodesk.AutoCAD.EditorInput.JigPrompts) As Autodesk.AutoCAD.EditorInput.SamplerStatus
  56.         '距离提示
  57.         Dim RadiusPrompt As New JigPromptDistanceOptions()
  58.         '以圆心为基点
  59.         RadiusPrompt.BasePoint = ptCenter
  60.         '使用基点模式
  61.         RadiusPrompt.UseBasePoint = True
  62.         '橡皮筋效果
  63.         RadiusPrompt.Cursor = CursorType.RubberBand
  64.         '获取用户输入的距离
  65.         Dim RadiusResult As PromptDoubleResult = prompts.AcquireDistance(RadiusPrompt)
  66.         '用户正确的输入
  67.         If RadiusResult.Status = PromptStatus.OK Then
  68.             '如果输入距离与原半径一致
  69.             If dblRadius = RadiusResult.Value Then
  70.                 '返回NoChange(没有修改)提示
  71.                 Return SamplerStatus.NoChange
  72.                 '其他情况
  73.             Else
  74.                 '如果输入值不为0
  75.                 If RadiusResult.Value <> 0 Then
  76.                     ' 将输入值赋与半径变量
  77.                     dblRadius = RadiusResult.Value
  78.                     '返回OK提示
  79.                     Return SamplerStatus.OK
  80.                 End If
  81.             End If
  82.         Else
  83.             '用户取消操作,返回Cancel提示
  84.             Return SamplerStatus.Cancel
  85.         End If
  86.     End Function
  87.     Protected Overrides Function Update() As Boolean
  88.         '获取圆对象
  89.         Dim CircleObj As Circle = Entity
  90.         '根据新的变量修改半径值
  91.         CircleObj.Radius = dblRadius
  92.         '返回True
  93.         Return True
  94.     End Function
  95. End Class
写这个程序的原因是看到kean写的那个拖拽程序太复杂了,不适合初学者。这是一个极其简单的Jig程序,拖拽的实现主要是在CircleJig自定义类中,CircleJig自定义类继承EntityJig类,通过重写EntityJig基类的两个过程来实现拖拽功能,其中Sampler用于与用户交互,输出提示信息并检测用户的输入,通过返回状态SamplerStatus来调用Update过程。返回SamplerStatus很重要,否则你看不到一个完美的拖动效果。而Update过程是实现图形的更新以达到动态拖拽的效果。拖拽的调用是通过编辑器的Drag函数来实现的。

评分

参与人数 1威望 +1 明经币 +5 金钱 +5 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 5 + 5 + 5 + 5 【好评】好文章

查看全部评分

发表于 2009-6-22 15:49:00 | 显示全部楼层

哪位能把这么好的贴子改成C#吗???

非常感谢

发表于 2009-7-30 00:13:00 | 显示全部楼层

收到。要的就是这么简单。

发表于 2011-12-7 08:25:09 | 显示全部楼层
谢谢楼主  
发表于 2011-12-7 12:22:04 | 显示全部楼层
学习了,谢谢楼主分享
发表于 2011-12-8 23:47:18 | 显示全部楼层
本帖最后由 mkhsj928 于 2011-12-8 23:50 编辑

好帖!
最烦的就是每个Jig都要自己实现个类,感觉好麻烦!还不如监视鼠标移动,实时生成和删除来得简单明了!通过实时生成与删除这种方法,对任何类型、任意多数量实体都是适用,个人感觉更灵活,唯一缺点可能就是显示慢点吧?对现在的主流机子配置来说,基本不是问题。
发表于 2012-3-3 02:10:47 | 显示全部楼层
本帖最后由 david.xw 于 2012-3-3 02:12 编辑

受用了,为了学习,我改成C#,我贴出来方便大家.


  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;

  6. [assembly: CommandClass(typeof(CCad.Class1))]
  7. namespace CCad
  8. {
  9.    
  10.     public class Class1
  11.     {
  12.         [CommandMethod("jigtest")]
  13.         public void JigTest()
  14.         {
  15.             //选择提示
  16.             PromptEntityOptions SelectPrompt = new PromptEntityOptions("\n选择一个圆: ");
  17.             SelectPrompt.SetRejectMessage("\n拜托,只能选择圆,请选择一个圆好吧!");
  18.             //限制只能选择circle类型,即只能选择圆            
  19.             SelectPrompt.AddAllowedClass(typeof(Circle), false);
  20.             //命令行编辑器
  21.             Editor Ed = Application.DocumentManager.MdiActiveDocument.Editor;
  22.             //选择结果
  23.             PromptEntityResult SelectResult = Ed.GetEntity(SelectPrompt);
  24.             //正确的选择
  25.             if (SelectResult.Status == PromptStatus.OK)
  26.             {
  27.                 //当前工作CAD数据库
  28.                 Database Db = HostApplicationServices.WorkingDatabase;
  29.                 //事务处理,在C#使用using能够在using结束后自动销毁using引用的对象,进行垃圾回收。否则需要另外进行Dispose处理
  30.                 using (Transaction Tr = Db.TransactionManager.StartTransaction())
  31.                 {
  32.                     //提取选择的圆对象
  33.                     Circle CircleObj = (Circle)Tr.GetObject(SelectResult.ObjectId, OpenMode.ForWrite);
  34.                     //实例化CircleJig类,即创建Jig对象
  35.                     CircleJig Jig = new CircleJig(CircleObj);
  36.                     //高亮显示圆对象
  37.                     CircleObj.Highlight();
  38.                     //拖拽Jig
  39.                     PromptResult DragResult = Ed.Drag(Jig);
  40.                     //提交事务处理
  41.                     Tr.Commit();
  42.                 }
  43.             }
  44.         }
  45.     }
  46.     public class CircleJig : EntityJig  //继承EntityJig类
  47.     {
  48.         //半径
  49.         private double dblRadius;
  50.         //圆心
  51.         private Point3d ptCenter;
  52.         public CircleJig(Circle CircleObj)
  53.             : base(CircleObj)//利用circleobj派生EntityJig基类
  54.         {
  55.             //获取初始半径
  56.             dblRadius = CircleObj.Radius;
  57.             //获取初始圆心坐标
  58.             ptCenter = CircleObj.Center;
  59.         }
  60.         protected override SamplerStatus Sampler(JigPrompts prompts)
  61.         {
  62.             //距离提示
  63.             JigPromptDistanceOptions RadiusPrompt = new JigPromptDistanceOptions();
  64.             //以圆心为基点
  65.             RadiusPrompt.BasePoint = ptCenter;
  66.             //使用基点模式
  67.             RadiusPrompt.UseBasePoint = true;
  68.             //橡皮筋效果
  69.             RadiusPrompt.Cursor = CursorType.RubberBand;
  70.             //获取用户输入的距离
  71.             PromptDoubleResult RadiusResult = prompts.AcquireDistance(RadiusPrompt);
  72.             //用户正确的输入
  73.             if (RadiusResult.Status == PromptStatus.OK)
  74.             {
  75.                 //如果输入距离与原半径一致
  76.                 if (dblRadius == RadiusResult.Value)
  77.                 {
  78.                     //返回NoChange(没有修改)提示
  79.                     return SamplerStatus.NoChange;
  80.                 }
  81.                 //其他情况
  82.                 else
  83.                 {
  84.                     //如果输入值不为0
  85.                     if (RadiusResult.Value != 0)
  86.                     {
  87.                         //将输入值赋与半径变量
  88.                         dblRadius = RadiusResult.Value;
  89.                     }
  90.                     //返回OK提示      
  91.                     return SamplerStatus.OK;
  92.                 }
  93.             }
  94.             else
  95.             {
  96.                 //用户取消操作,返回Cancel提示
  97.                 return SamplerStatus.Cancel;
  98.             }
  99.         }
  100.         protected override bool Update()
  101.         {//获取圆对象
  102.             Circle CircleObj = (Circle)Entity;
  103.             //根据新的变量修改半径值
  104.             CircleObj.Radius = dblRadius;
  105.             //返回True
  106.             return true;
  107.         }
  108.     }
  109. }


发表于 2012-4-13 19:29:36 | 显示全部楼层
很好用啊
顶一下!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 18:32 , Processed in 0.183529 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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