乐筑天下

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

[讨论]trans的两种用法

[复制链接]

4

主题

8

帖子

2

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-10-10 16:50:00 | 显示全部楼层 |阅读模式
在Kean的blog里,他喜欢采用
  1. using(trans)
  2. {
  3. ...........
  4. }
我在CAD的DTV里,发现负责讲解的工程师,多采用复制代码谈一下我对两者的看法,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
在转换时可以在这样写复制代码我觉得在逻辑上,用try要严密些
同时在调用上,也可以采用无返回值的调用,也可以采用有返回值的调用。
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 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.         }        static public bool Move(Entity ent, Point3d startPoint, Point3d endPoint)
  24.         {
  25.             try
  26.             {
  27.                 ent.UpgradeOpen();
  28.                 ent.TransformBy(Matrix3d.Displacement(endPoint - startPoint));
  29.             }
  30.             catch
  31.             {
  32.                 return false;
  33.             }
  34.             return true;
  35.         }
回复

使用道具 举报

4

主题

8

帖子

2

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-10-10 20:44:00 | 显示全部楼层
那是,我只是觉得,当封装在函数里的时候,用using就会重复了,用我的想法,是复制代码上面的的缺点是trans重新用了n次,效率较差,但是封装性较高
学到了一点,我用Objectid.GetObject总是出错,原来是要放在trans里面
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:19 , Processed in 0.452480 second(s), 58 queries .

© 2020-2025 乐筑天下

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