几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(VB.NET/C#)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-20, 02:37 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 [arx]objectarx managed wrapper classes参考中文档(3)

[arx]objectarx managed wrapper classes参考中文档(3)
www.dimcax.com
[arx]objectarx managed wrapper classes参考中文档(3)
在托管程序中使用事务处理
和objectarx程序一样,托管程序总是在数据库事务处理环境下对dwg数据库执行操作。你应当使用下述的异常处理技巧:
使用带异常处理的事务处理
1. 通过调用transaction.starttransaction()方法,在try块之前启动一个事务处理
2. 在try块内,使用事务处理对象来进行和数据库有关的操作。
3. 通过调用transaction.commit()方法,在try块的末尾提交事务处理。
4. 通过调用transaction.dispose()方法在finally块中销毁事务处理。
上述步骤保证事务处理对象被销毁, 而不管在try块中可能出现的任何异常。下面的例子描述了这一技巧:
//c#
public static void hypercommand(){
database db = application.documentmanager.mdiactivedocument.database;
dbtransman tm = db.transactionmanager;
//开始一个事务处理
transaction myt = tm.starttransaction();
try{
//创建一条直线
line line=new line(new point3d(0, 0, 0), new point3d(1, 1, 0));
blocktable bt = ctype(tm.getobject(_
db.blocktableid, openmode.forread, false), blocktable);
blocktablerecord btr =
ctype(tm.getobject(bt(blocktablerecord.modelspace),
openmode.forwrite, false), blocktablerecord);
'把直线加入到model space block table record
btr.appendentity(line);
'确定事务处理知道这个新加入的对象
tm.addnewlycreateddbobject(line, true);
'添加一些超链接
hyperlink hyper=new hyperlink();
hyper.name = "";
line.hyperlinks.add(hyper);
if(line.hyperlinks.contains(hyper))
hyper.name = "";
line.hyperlinks.add(hyper)
int i;
for(i =0; i < line.hyperlinks.count; i ++)
debug.writeline(line.hyperlinks(i).tostring());
//提交事务处理
myt.commit();
}
finally
{
myt.dispose();
}
}

'vb.net
public shared sub hypercommand()
dim db as database =
application.documentmanager.mdiactivedocument.database
dim tm as dbtransman = db.transactionmanager
'start a transaction
dim myt as transaction = tm.starttransaction()
try
'create a line
dim line as new line(new point3d(0, 0, 0), new point3d(_
1, 1, 0))
dim bt as blocktable = ctype(tm.getobject(_
db.blocktableid, openmode.forread, false), blocktable)
dim btr as blocktablerecord =
ctype(tm.getobject(bt(blocktablerecord.modelspace),
openmode.forwrite, false), blocktablerecord)
'add it to the model space block table record
btr.appendentity(line)
'make sure that the transaction knows about this new object
tm.addnewlycreateddbobject(line, true)
'add some hyperlinks
dim hyper as new hyperlink()
hyper.name = ""
line.hyperlinks.add(hyper)
if line.hyperlinks.contains(hyper) then
hyper.name = ""
end if
line.hyperlinks.add(hyper)
dim i as integer
for i = 0 to line.hyperlinks.count - 1
debug.writeline(line.hyperlinks(i).tostring())
next i 'commit transaction
myt.commit()
finally
myt.dispose()
end try
end sub 'hypercommand
使用resultbuffer类
在objectarx中,resbuf结构给autocad专门数据提供了一个灵活的存储器。在托管api中,这个结构被映射在autodesk.autocad.databaseservices.resultbuffer类中。
一个resultbuffer类对象使用的方法与resbuf数据链相同。你要定义一个resultbuffer并使它产生一系列的数据对。每一对数据由一个数据类型描述和一个值组成。在托管api中,这些数据对是autodesk.autocad.databaseservices.typedvalue类的实例。这个类实现的功能与resbuf结构的restype和resval成员一样。
typedvalue.typecode属性是一个16位的整数值,它表示typedvalue.value属性的数据类型。可以使用的typecode值取决于resultbuffer实例的具体使用情况。例如,适合于xrecord定义的typecode的值就不一定适用于xdata。autodesk.autocad.databaseservices.dxfcode枚举定义的代码精确地描述了所有可能的resultbuffer数据类型的范围。
因为typedvalue.value属性与system.object的一个实例相对应,所以它可以包含任何数据类型。但是,value数据必须与typecode所表示的类一致,以保证结果的可用性。
你可以通过给resultbuffer的构造函数传递一个typedvalue对象数组来提前产生一个resultbuffer,或者可以先构造一个空的resultbuffer,然后通过调用resultbuffer::add()方法来加入新的typedvalue对象。一个典型的resultbuffer构造函数的用法如下例所示:
//c#
xrecord rec=new xrecord();
rec.data = new resultbuffer( _
new typedvalue(cint(dxfcode.text), "this is a test"), _
new typedvalue(cint(dxfcode.int8), 0), _
new typedvalue(cint(dxfcode.int16), 1), _
new typedvalue(cint(dxfcode.int32), 2), _
new typedvalue(cint(dxfcode.hardpointerid),
db.blocktableid), _
new typedvalue(cint(dxfcode.binarychunk),
new byte(){0, 1, 2, 3, 4}), _
new typedvalue(cint(dxfcode.arbitraryhandle), db.blocktableid.handle), _
new typedvalue(cint(dxfcode.ucsorg), new point3d(0, 0, 0)));
'vb.net
dim rec as new xrecord()
rec.data = new resultbuffer( _
new typedvalue(cint(dxfcode.text), "this is a test"), _
new typedvalue(cint(dxfcode.int8), 0), _
new typedvalue(cint(dxfcode.int16), 1), _
new typedvalue(cint(dxfcode.int32), 2), _
new typedvalue(cint(dxfcode.hardpointerid),
db.blocktableid), _
new typedvalue(cint(dxfcode.binarychunk),
new byte(){0, 1, 2, 3, 4}), _
new typedvalue(cint(dxfcode.arbitraryhandle), db.blocktableid.handle), _
new typedvalue(cint(dxfcode.ucsorg), new point3d(0, 0, 0)))

托管程序的初始化和运行时优化
托管程序如果要执行初始化或结束任务,那么可以通过实现可选的autodesk.autocad.runtime.iextensionapplication接口来进行。这个接口提供initialize()和terminate()方法。因为托管程序不能手动卸载,terminate()方法只有当autocad运行的时候才能调用。
如果程序中定义了大量的类,那么你可以通过实现iextensionapplication接口和使用两个可选的通用属性来优化程序。这两个属性是:extensionapplication和commandclass,它们可以帮助autocad找到程序的初始化路径和命令处理器。
任何托管程序都可以使用这两个属性。但是,只有在大型程序中才能体现它们的优化效果。



c#最适合开发autocad,因为它拥有vb容易的特点,却具有vc++的强大功能。
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭

相似的主题
主题 主题发起者 论坛 回复 最后发表
【转帖】[arx]objectarx managed wrapper classes参考中文档(2) yang686526 ObjectARX(VB.NET/C#) 0 2009-04-20 02:36 PM
【转帖】[arx]objectarx managed wrapper classes参考中文档(1) yang686526 ObjectARX(VB.NET/C#) 0 2009-04-20 02:36 PM
【转帖】zhf7878,请问哪里找到objectarx managed wrapper classes的资料 yang686526 ObjectARX(VB.NET/C#) 0 2009-04-20 02:27 PM
从c++到c++/cli yogy vc编程 1 2007-07-23 02:10 PM


所有的时间均为北京时间。 现在的时间是 01:01 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多