找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 683|回复: 2

[每日一码] C# 拷贝对象的扩展词典到另外一个对象

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2017-12-27 19:35:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
下面的命令显示了将扩展字典条目从一个实体复制到另一个实体的过程。 最后放置一个特殊的逻辑,将与源对象相同的字典名称设置为“DeepCloneObjects”,将具有不同名称的对象复制到目标实体中。

[C#] 纯文本查看 复制代码
[CommandMethod("copyExtDic")]
public void copyExtDic()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;

    PromptEntityResult surRes =
                ed.GetEntity("Select source entity");

    if (surRes.Status != PromptStatus.OK)
        return;

    PromptEntityResult tarRes =
                ed.GetEntity("Select target entity");

    if (tarRes.Status != PromptStatus.OK)
        return;

    ObjectIdCollection ids = new ObjectIdCollection();
    ObjectId tarId = ObjectId.Null;
    ObjectId surId = ObjectId.Null;

    using (Transaction tr =
            db.TransactionManager.StartTransaction())
    {
        DBObject dbObj = tr.GetObject(surRes.ObjectId,
                                       OpenMode.ForRead);

        surId = dbObj.ExtensionDictionary;

        if (surId != ObjectId.Null)
        {
            DBDictionary dbExt =
                      (DBDictionary)tr.GetObject(surId,  
                                    OpenMode.ForRead);

            foreach (DBDictionaryEntry entry in dbExt)
            {
                ids.Add(entry.Value);
            }
        }
        else
        {
            ed.WriteMessage("No dictionary to copy");
            return;
        }
        //find if entiy has
        DBObject target = tr.GetObject(tarRes.ObjectId,
                                          OpenMode.ForRead);
        tarId = target.ExtensionDictionary;

        if (tarId == ObjectId.Null)
        {
            target.UpgradeOpen();
            target.CreateExtensionDictionary();
            tarId = target.ExtensionDictionary;
        }

        tr.Commit();
    }

    IdMapping mapping = new IdMapping();
    db.DeepCloneObjects(ids, tarId, mapping, false);

    //
    using (Transaction tr =
            db.TransactionManager.StartTransaction())
    {
        DBDictionary dbExt =
         (DBDictionary)tr.GetObject(surId, OpenMode.ForRead);

        DBDictionary dbTarg =
            (DBDictionary)tr.GetObject(tarId, OpenMode.ForWrite);

        foreach (IdPair pair in mapping)
        {
            DBObject target = tr.GetObject(pair.Value,
                                              OpenMode.ForRead);
            dbTarg.SetName(
                dbTarg.NameAt(pair.Value),
                dbExt.NameAt(pair.Key));
        }
        tr.Commit();
    }
} 
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 50个

财富等级: 招财进宝

发表于 2017-12-27 20:13:53 | 显示全部楼层
支持,难得此专栏还默默分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-1-3 11:10:54 | 显示全部楼层
请问大神DBDictionaryEntry缺少引用怎么解决
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 20:24 , Processed in 0.165097 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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