-
- 'Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23
- '利用Jig动态拖拽实现动态修改圆大小
- Imports Autodesk..EditorInput
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.Geometry
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Public Class Class1
- Public Sub JigTest()
- '选择提示
- Dim SelectPrompt As New PromptEntityOptions(vbNewLine + "选择一个圆: ")
- '错误操作提示
- SelectPrompt.SetRejectMessage(vbNewLine + "拜托,只能选择圆,请选择一个圆好吧!")
- '限制只能选择circle类型,即只能选择圆
- SelectPrompt.AddAllowedClass(GetType(Circle), False)
- '命令行编辑器
- Dim Ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
- '选择结果
- Dim SelectResult As PromptEntityResult = Ed.GetEntity(SelectPrompt)
- '正确的选择
- If SelectResult.Status = PromptStatus.OK Then
- '当前工作CAD数据库
- Dim Db As Database = HostApplicationServices.WorkingDatabase
- '事务处理,在VB.Net中使用using能够在using结束后自动销毁using引用的对象,进行垃圾回收。否则需要另外进行Dispose处理
- Using Tr As Transaction = Db.TransactionManager.StartTransaction
- '提取选择的圆对象
- Dim CircleObj As Circle = Tr.GetObject(SelectResult.ObjectId, OpenMode.ForWrite)
- '实例化CircleJig类,即创建Jig对象
- Dim Jig As New CircleJig(CircleObj)
- '高亮显示圆对象
- CircleObj.Highlight()
- '拖拽Jig
- Dim DragResult As PromptResult = Ed.Drag(Jig)
- '提交事务处理
- Tr.Commit()
- End Using
- End If
- End Sub
- End Class
- Public Class CircleJig
- '继承EntityJig类
- Inherits EntityJig
- '半径
- Private dblRadius As Double
- '圆心
- Private ptCenter As Point3d
- Public Sub New(ByVal CircleObj As Circle)
- '利用circleobj派生EntityJig基类
- MyBase.New(CircleObj)
- '获取初始半径
- dblRadius = CircleObj.Radius
- '获取初始圆心坐标
- ptCenter = CircleObj.Center
- End Sub Protected Overrides Function Sampler(ByVal prompts As Autodesk.AutoCAD.EditorInput.JigPrompts) As Autodesk.AutoCAD.EditorInput.SamplerStatus
- '距离提示
- Dim RadiusPrompt As New JigPromptDistanceOptions()
- '以圆心为基点
- RadiusPrompt.BasePoint = ptCenter
- '使用基点模式
- RadiusPrompt.UseBasePoint = True
- '橡皮筋效果
- RadiusPrompt.Cursor = CursorType.RubberBand
- '获取用户输入的距离
- Dim RadiusResult As PromptDoubleResult = prompts.AcquireDistance(RadiusPrompt)
- '用户正确的输入
- If RadiusResult.Status = PromptStatus.OK Then
- '如果输入距离与原半径一致
- If dblRadius = RadiusResult.Value Then
- '返回NoChange(没有修改)提示
- Return SamplerStatus.NoChange
- '其他情况
- Else
- '如果输入值不为0
- If RadiusResult.Value 0 Then
- ' 将输入值赋与半径变量
- dblRadius = RadiusResult.Value
- '返回OK提示
- Return SamplerStatus.OK
- End If
- End If
- Else
- '用户取消操作,返回Cancel提示
- Return SamplerStatus.Cancel
- End If
- End Function
- Protected Overrides Function Update() As Boolean
- '获取圆对象
- Dim CircleObj As Circle = Entity
- '根据新的变量修改半径值
- CircleObj.Radius = dblRadius
- '返回True
- Return True
- End Function
- End Class
写这个程序的原因是看到kean写的那个拖拽程序太复杂了,不适合初学者。这是一个极其简单的Jig程序,拖拽的实现主要是在CircleJig自定义类中,CircleJig自定义类继承EntityJig类,通过重写EntityJig基类的两个过程来实现拖拽功能,其中Sampler用于与用户交互,输出提示信息并检测用户的输入,通过返回状态SamplerStatus来调用Update过程。返回SamplerStatus很重要,否则你看不到一个完美的拖动效果。而Update过程是实现图形的更新以达到动态拖拽的效果。拖拽的调用是通过编辑器的Drag函数来实现的。
|