Dim
bt as BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim
btr as BlockTableRecord = trans.GetObject(bt(btr.ModelSpace),
OpenMode.ForWrite)
btr.AppendEntity(circle)
trans.AddNewlyCreatedDBObject(circle,
True)
trans.Commit()
Catch
MsgBox("Error Adding Entities")
Finally
trans.Dispose()
End Try
End
Function
运行你的代码来进行测试……
上面的catch块只显示一个错误信息。实际的清理工作是在finally块中进行的。这样做的理由是如果在事务处理被提交(Commit())之前,Dispose()被调用的话,事务处理会被 销毁。我们认为如果在trans.Commit()之前出现任何错误的话,你应该销毁事务处理(因为Commit将永远不会被调用)。如果在Dispose()之前调用了Commit(),也就是说没有任何错误发生,那么事务处理将会被提交给数据库。
所以基于上面的分析,Catch块其实并不是必须的,因为它只用来通知用户程序出现了一个错误。它将在下面的代码中被去掉。
6) 现在让我们在Employee加入剩下的部分:椭圆和多行文本的实例。
现在让我们在Employee加入剩下的部分:椭圆和多行文本的实例。
多行文本实体:
中心点应该与圆心的创建一样:
(建议:创建一个名为‘center’而值为10,10,0的Point3d变量来表示中心点)
多行文本的内容可以是你的名字。
椭圆(提示:你可以先看一下Ellipse的构造函数)
法向量应该沿着Z轴(请查看Vector3d类型)
主轴设为Vector3d(3,0,0)(提示:不要忘了用new)
半径比例设为0.5
椭圆还必须闭合(也就是说,开始和结束点必须相同)
运行你的代码来进行测试……应该可以生成一个圆、一个椭圆和一个中心点在10,10,0的多行文本。
注意:和事务处理对象有关的.NET API中的Try-Catch-Finally块结构,应该是异常观察者。实际上我们是在try块中实例化对象的,但没有显式地销毁它们。当产生异常的时候可能会产生问题,特别是当观察者注意到我们实际上用的是封装的非托管对象!记住,当资源不再使用的时候,垃圾收集机制就会回收内存。垃圾收集机制会不时的调用封装类的Dispose()方法,删除非托管对象。
这里还要注意的是Dispose()作用于封装的非托管类对象的方式取决于对象是否是数据库驻留对象。由非数据库驻留对象调用的Dispose()会删除非托管对象,而由数据库驻留对象调用的Dispose()只是关闭它们。
7) 接下来让我们来创建一个新的函数,它用来新建一个颜色为黄色,名字为“EmployeeLayer” 的AutoCAD层。
这个函数应该检查是否这个层已经存在,但不管这个层是否存在,函数都应该返回“EmployeeLayer”的ObjectId。下面是这个函数的代码:
Public Function CreateLayer() As ObjectId
Dim layerId As ObjectId ''''它返回函数的值
Dim db As Database =
HostApplicationServices.WorkingDatabase
Dim trans As Transaction =
db.TransactionManager.StartTransaction()
''''首先取得层表……
Dim lt As LayerTable =
trans.GetObject(db.LayerTableId, OpenMode.ForWrite)
''''检查EmployeeLayer层是否存在……
If lt.Has("EmployeeLayer")
Then
layerId =
lt.Item("EmployeeLayer")
Else
''''如果EmployeeLayer层不存在,就创建它
Dim ltr As LayerTableRecord = New
LayerTableRecord()
ltr.Name =
"EmployeeLayer"//设置层的名字
layerId = lt.Add(ltr)
trans.AddNewlyCreatedDBObject(ltr,
True)
End If
trans.Commit()
trans.Dispose()
Return layerId
End Function
是不是觉得这个函数的基本结构与在模型空间加入实体的代码比较类似?访问数据库的方法都是这样的:使用事务处理来获取数据库对象,在符号表(模型空间所在的块表也是符号表之一)中加入实体,然后让事务处理知道。
8) 在这个函数中加入异常处理,就像在CreateEmployee函数中的一样。
9) 接下来,改变新建层的颜色。下面是实现的代码片断,请把它加入到你的代码中:
ltr.Color
= Color.FromColorIndex(ColorMethod.ByAci, 2)
注意:ColorMethod.ByAci可以让我们使用AutoCAD ACI颜色索引……这里为2(表示黄色)。
10) 回到CreateEmployee(),加入把上面创建的几个实体设置到EmployeeLayer层的代码。声明一个类型为ObjectId的变量,用CreateLayer函数的返回值给它赋值。使用每个实体(文本、圆和椭圆)的LayerId属性设置它们所在的层。
例如:text.LayerId = empId
运行代码来查看“EmployeeLayer”层是否已被创建,所有已创建的实体是否都在这一层上(应该显示为黄色)
11) 现在为各个实体设置不同的颜色,可以使用ColorIndex属性(ColorIndex属性表示AutoCAD的颜色)
圆为红色-1
椭圆为绿色-3
文本为黄色-2
运行代码,看看实体的颜色是否为设置的值,即使这些实体是在“EmployeeLayer”层上。
上一页 [1] [2] [3] 下一页 [C语言系列]NET 中C#的switch语句的语法 [系统软件]托拽Explore中的文件到VB.net的窗口 [系统软件]Boost库在XP+Visual C++.net中的安装 [常用软件]新配色面板:Paint.Net3.0RC1官方下载 [常用软件]用内建的“Net Meeting”聊天 [VB.NET程序]Henry的VB.NET之旅(三)—共享成员 [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构 [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体 [VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET) [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
|