明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3109|回复: 2

[讨论]trans的两种用法

[复制链接]
发表于 2009-10-10 16:50:00 | 显示全部楼层 |阅读模式
在Kean的blog里,他喜欢采用
  1. using(trans)
  2. {
  3. ...........
  4. }
我在CAD的DTV里,发现负责讲解的工程师,多采用
  1. dim trans as  ......=
  2. try
  3.     'if success then commit trans
  4.     trans.commit()
  5. catch
  6.     'add some code
  7. finally
  8.     'if get error then dispose trans
  9.     trans.dispose()
  10. end try
复制代码
谈一下我对两者的看法,using的好处是可以省掉一个trans.dispose(),但用try.....end try 则可以对错误进行判断
在我对ARX函数的学习过程中,发现对图元操作的函数,往住是带一个状态返回值。在.Net Api写进行arx托管程序时,我们一般采用对objectid的操作,需要大量使用trans,一般创建图元需要返回图元对象或objectid,操作对象则不需要返回值。
例如对图元移动,则可以用
sub MoveEnt(EntID as Objectid,StartPnt as Point3d,EndPnt as Point3d)
但是,有的这个函数会出错,例如需要对图形中的一些定义过的图元进行操作。
比如:你创建了一些曲线,把曲线的handler存在字典里,在以后用的时候把handler转换成objectid进行使用。有时候用户在操作图形的时候把这些曲线的图层锁定了,当你操作这一系列图元时,会导致一个eonlockedlayer的错误,如果用using trans,会直接出错然后退出。但是,很可能这些曲线是你经过检查后认为不需要操作或不能操作才锁定的,同时即使出现错误也可以进行对其它图元操作,你的程序将无法达到你想要的目的。
而如果你用了try的话,完全可以将过程(C#里的void Function)写成一个函数:
Function MoveEnt(EntID as Objectid,StartPnt as Point3d,EndPnt as Point3d) As Boolean
在转换时可以在这样写
  1. try
  2.     ent=trans.GetObject
  3.     ''Add MoveEntCode
  4.      trans.Commit()
  5.     Return True '成功变换返回真
  6. Catch
  7.     Return False '变换失败返回假
  8. Finally
  9.     trans.Dispose()
  10. End Try
复制代码
我觉得在逻辑上,用try要严密些
同时在调用上,也可以采用无返回值的调用,也可以采用有返回值的调用。
发表于 2009-10-10 18:48:00 | 显示全部楼层
using语句内部一样可以用try的
  1.         [CommandMethod("mm")]
  2.         static public void MMove()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptSelectionResult res = ed.GetSelection();
  8.             if (res.Status == PromptStatus.OK)
  9.             {
  10.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  11.                 {
  12.                     foreach (ObjectId id in res.Value.GetObjectIds())
  13.                     {
  14.                         Move(
  15.                             (Entity)id.GetObject(OpenMode.ForRead),
  16.                             Point3d.Origin,
  17.                             new Point3d(10,10,0)
  18.                             );
  19.                     }
  20.                     tr.Commit();
  21.                 }
  22.             }
  23.         }
  24.         static public bool Move(Entity ent, Point3d startPoint, Point3d endPoint)
  25.         {
  26.             try
  27.             {
  28.                 ent.UpgradeOpen();
  29.                 ent.TransformBy(Matrix3d.Displacement(endPoint - startPoint));
  30.             }
  31.             catch
  32.             {
  33.                 return false;
  34.             }
  35.             return true;
  36.         }
 楼主| 发表于 2009-10-10 20:44:00 | 显示全部楼层
那是,我只是觉得,当封装在函数里的时候,用using就会重复了,用我的想法,是
  1.         [CommandMethod("mm")]
  2.         static public void MMove()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptSelectionResult res = ed.GetSelection();
  8.             if (res.Status == PromptStatus.OK)
  9.             {
  10.                 foreach (ObjectId id in res.Value.GetObjectIds())
  11.                 {
  12.                     Move(id,
  13.                         Point3d.Origin,
  14.                         new Point3d(10, 10, 0)
  15.                         );
  16.                 }
  17.              }
  18.         }
  19.         static public bool Move(ObjectId entid, Point3d startPoint, Point3d endPoint)
  20.         {
  21.             Transaction tr = entid.Database.TransactionManager.StartTransaction();
  22.             try
  23.             {
  24.                 Entity ent = (Entity)tr.GetObject(entid, OpenMode.ForWrite);
  25.                 ent.TransformBy(Matrix3d.Displacement(endPoint - startPoint));
  26.                 tr.Commit();
  27.                 return true;
  28.             }
  29.             catch
  30.             {
  31.                 return false;
  32.             }
  33.             finally
  34.             {
  35.                 tr.Dispose();
  36.             }
  37.         }
复制代码
上面的的缺点是trans重新用了n次,效率较差,但是封装性较高
学到了一点,我用Objectid.GetObject总是出错,原来是要放在trans里面
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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