明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: chpmould

[图元] 集合对象的相互转换

  [复制链接]
发表于 2010-12-6 19:53:30 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-6 19:54 编辑

哎,你不能把一个实体两次重复的加入数据库
这里加入一次
                ObjectId c1 = AddCircle(new Point3d(0, 0, 0), 10);
                ObjectId c2 = AddCircle(new Point3d(0, 0, 0), 15);

接着又加了一次
                CreateBlockDef("Test", objs);

上一个帖子的代码我不是直接贴了吗,汗
 楼主| 发表于 2010-12-6 19:56:55 | 显示全部楼层
你可以帮我调通吗?绘制圆的方式还是按以下方式...
ObjectId c1 = AddCircle(new Point3d(0, 0, 0), 10);
ObjectId c2 = AddCircle(new Point3d(0, 0, 0), 15);

发表于 2010-12-6 20:30:06 | 显示全部楼层
Linq是个好东西,还没来得及研究哪。不过,这个好像是Lambda表达式,和Linq没关系吧?
Ids.Cast(Of ObjectId).ToList().ForEach(Sub(id) objs.Add(id.GetObject(OpenMode.ForRead)))
发表于 2010-12-6 20:59:19 | 显示全部楼层
Cast、ToList就是System.Linq的扩展了
Linq和Lambda结合的还是挺多的

不过我的想法是
            ids
            .Cast<ObjectId>()
            .Select(id => id.GetObject(OpenMode.ForRead));
只返回一个查询,这个用到的更多些
发表于 2010-12-6 21:42:47 | 显示全部楼层
  1.         Dim lstObj As New List(Of T)
  2.         Dim objs As New DBObjectCollection
  3.         Using Trans As Transaction = db.TransactionManager.StartTransaction
  4.             Array.ForEach(Ids, Sub(Id) objs.Add(Id.GetObject(OpenMode.ForRead)))
  5.             lstObj = objs.OfType(Of T).ToList
  6.             Trans.Commit()
  7.         End Using
很好!前面函数又改了一下,果然简洁不少,看来用.NET真要有点新思维。
发表于 2010-12-6 22:02:30 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-6 22:08 编辑

你还是写复杂了,呵呵
建议的方式,在子函数里不要新建事务,如果处理的实体较多,每开一个事务就会占耗时
正确的做法是传入事务作为参数,

  1.         [CommandMethod("tttt")]
  2.         public void tttt()
  3.         {
  4.             var db = HostApplicationServices.WorkingDatabase;
  5.             var doc = Application.DocumentManager.GetDocument(db);
  6.             var ed = doc.Editor;

  7.             using (Transaction tr = doc.TransactionManager.StartTransaction())
  8.             {

  9.                 ObjectIdCollection ids = new ObjectIdCollection();
  10.                 var cirs = GetEntitys<Circle>(tr, ids.Cast<ObjectId>());

  11.             }
  12.             
  13.         }

  14.         public IEnumerable<T> GetEntitys<T>(Transaction tr, IEnumerable<ObjectId> ids) where T : DBObject
  15.         {
  16.             return
  17.                 ids
  18.                 .Select(id => tr.GetObject(id, OpenMode.ForRead))
  19.                 .OfType<T>();
  20.         }
发表于 2010-12-6 22:28:45 | 显示全部楼层
方法不错,可借鉴。其实以我的经验,代码的可读性比性能更重要,呵呵。
参数多了,代码长了,经常是隔段时间自己都看不懂了,不容易维护。
发表于 2010-12-6 22:37:29 | 显示全部楼层
你说的是一个方面
还有情况是不能把事务放到子函数的,
比如对内存数据库的操作
即Database = new Database()的情况,这时用你的函数会出错的
而且多事务操作不光耗时,有时会产生莫名其妙的错误
传入事务作为参数的方式在kean的代码里经常会看到的,
应该算是Autodesk推荐的方式吧
发表于 2010-12-6 23:11:27 | 显示全部楼层
事物耗时的问题,我已注意到。具体的实现里面,并没有嵌套事务。当需要多重操作,通过重载函数来完成的。
前面的子函数,都是不同类里面的成员,并无主次之分,如果把事物作为参数,反而容易搞乱逻辑。
当然,这些还只用.NET的初步感觉,未来有N多代码要迁移,随着研习的深入,希望找到一个好的设计模式。
发表于 2010-12-6 23:23:43 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-6 23:29 编辑

正确,这个只有做多了才会感觉到
我以前在论坛贴过的DBTransaction类算是这方面我自己的解决方案吧
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=76123&extra=%26page%3D1&page=1
这个类的调用代码可以看看这里:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75701
各人有个人的想法,不强求,你说的重载函数的方式我看就不错,呵呵



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

本版积分规则

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

GMT+8, 2024-11-26 01:56 , Processed in 0.163210 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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