乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 103|回复: 7

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

[复制链接]

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2009-5-23 12:53:00 | 显示全部楼层 |阅读模式
  1. 'Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23
  2. '利用Jig动态拖拽实现动态修改圆大小
  3. Imports Autodesk..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.      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    Protected Overrides Function Sampler(ByVal prompts As Autodesk.AutoCAD.EditorInput.JigPrompts) As Autodesk.AutoCAD.EditorInput.SamplerStatus
  55.         '距离提示
  56.         Dim RadiusPrompt As New JigPromptDistanceOptions()
  57.         '以圆心为基点
  58.         RadiusPrompt.BasePoint = ptCenter
  59.         '使用基点模式
  60.         RadiusPrompt.UseBasePoint = True
  61.         '橡皮筋效果
  62.         RadiusPrompt.Cursor = CursorType.RubberBand
  63.         '获取用户输入的距离
  64.         Dim RadiusResult As PromptDoubleResult = prompts.AcquireDistance(RadiusPrompt)
  65.         '用户正确的输入
  66.         If RadiusResult.Status = PromptStatus.OK Then
  67.             '如果输入距离与原半径一致
  68.             If dblRadius = RadiusResult.Value Then
  69.                 '返回NoChange(没有修改)提示
  70.                 Return SamplerStatus.NoChange
  71.                 '其他情况
  72.             Else
  73.                 '如果输入值不为0
  74.                 If RadiusResult.Value  0 Then
  75.                     ' 将输入值赋与半径变量
  76.                     dblRadius = RadiusResult.Value
  77.                     '返回OK提示
  78.                     Return SamplerStatus.OK
  79.                 End If
  80.             End If
  81.         Else
  82.             '用户取消操作,返回Cancel提示
  83.             Return SamplerStatus.Cancel
  84.         End If
  85.     End Function
  86.     Protected Overrides Function Update() As Boolean
  87.         '获取圆对象
  88.         Dim CircleObj As Circle = Entity
  89.         '根据新的变量修改半径值
  90.         CircleObj.Radius = dblRadius
  91.         '返回True
  92.         Return True
  93.     End Function
  94. End Class
写这个程序的原因是看到kean写的那个拖拽程序太复杂了,不适合初学者。这是一个极其简单的Jig程序,拖拽的实现主要是在CircleJig自定义类中,CircleJig自定义类继承EntityJig类,通过重写EntityJig基类的两个过程来实现拖拽功能,其中Sampler用于与用户交互,输出提示信息并检测用户的输入,通过返回状态SamplerStatus来调用Update过程。返回SamplerStatus很重要,否则你看不到一个完美的拖动效果。而Update过程是实现图形的更新以达到动态拖拽的效果。拖拽的调用是通过编辑器的Drag函数来实现的。
回复

使用道具 举报

52

主题

380

帖子

11

银币

中流砥柱

Rank: 25

铜币
588
发表于 2009-6-22 15:49:00 | 显示全部楼层
哪位能把这么好的贴子改成C#吗???
非常感谢
回复

使用道具 举报

7

主题

55

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2009-7-30 00:13:00 | 显示全部楼层
收到。要的就是这么简单。
回复

使用道具 举报

2

主题

39

帖子

7

银币

初来乍到

Rank: 1

铜币
47
发表于 2011-12-7 08:25:00 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

2

主题

91

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2011-12-7 12:22:00 | 显示全部楼层
学习了,谢谢楼主分享
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-12-8 23:47:00 | 显示全部楼层

好帖!
最烦的就是每个Jig都要自己实现个类,感觉好麻烦!还不如监视鼠标移动,实时生成和删除来得简单明了!通过实时生成与删除这种方法,对任何类型、任意多数量实体都是适用,个人感觉更灵活,唯一缺点可能就是显示慢点吧?对现在的主流机子配置来说,基本不是问题。
回复

使用道具 举报

5

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
40
发表于 2012-3-3 02:10:00 | 显示全部楼层

受用了,为了学习,我改成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. }
回复

使用道具 举报

0

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
2
发表于 2012-4-13 19:29:00 | 显示全部楼层
很好用啊
顶一下!!!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 21:21 , Processed in 0.418966 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表