明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3168|回复: 14

写扩展数据的问题

  [复制链接]
发表于 2010-11-24 16:30:00 | 显示全部楼层 |阅读模式

 AddXData(lwPolyLine, i + 1, "polyId");
 //写扩展数据
        public Entity AddXData(Entity ent, Object obj, string regapptablename)
        {
            ObjectId objId = ent.ObjectId;
            Database db = HostApplicationServices.WorkingDatabase;
            Entity retEntity;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                retEntity = (Entity)trans.GetObject(ent.ObjectId, OpenMode.ForWrite);
                RegAppTable apptbl = (RegAppTable)trans.GetObject(db.RegAppTableId, OpenMode.ForWrite);
                if (!apptbl.Has(regapptablename))
                {
                    RegAppTableRecord appTblRcd = new RegAppTableRecord();
                    appTblRcd.Name = regapptablename;
                    apptbl.Add(appTblRcd);
                    trans.AddNewlyCreatedDBObject(appTblRcd, true);
                }
                ResultBuffer resBuf = new ResultBuffer();
                resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, regapptablename));
                resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, obj));
                ent.XData = resBuf;
                trans.Commit();
            }
            return retEntity;
        }
保存之后关闭再打开,为什么扩展数据里就没有了呢??

发表于 2010-11-24 22:51:00 | 显示全部楼层

子函数里没找到错,这里改下试试 

AddXData(lwPolyLine, (i + 1).ToString, "polyId");

 楼主| 发表于 2010-11-25 11:33:00 | 显示全部楼层
TypedValue[] fillist = new TypedValue[] { (new TypedValue((int)DxfCode.Start, "LWPolyline"))};//,new TypedValue(8,"外围轮廓线") };
                SelectionFilter filter = new SelectionFilter(fillist);
                PromptSelectionResult lwPolyRes = ed.SelectAll(filter);
                TypedValue[] fillist1 = new TypedValue[] { (new TypedValue((int)DxfCode.Start, "olyline"))};//, new TypedValue(8, "外围轮廓线") };
                SelectionFilter filter1 = new SelectionFilter(fillist1);
                PromptSelectionResult polyRes = ed.SelectAll(filter1);
                if (lwPolyRes.Status == PromptStatus.OK&&polyRes.Status==PromptStatus.OK)
                {
                    SelectionSet lwPolySet = lwPolyRes.Value;
                    int lwPolyCount = lwPolySet.Count;
                    Polyline lwPolyLine = new Polyline();
                    SelectionSet polySet = polyRes.Value;
                    int polyCount = polySet.Count;
                }
本来想设置断点在第一行的,可是它不执行,直接跑到下面去了,跑就跑呗,执行过的代码还看不到执行结果。是不是vs2005的问题啊???
发表于 2010-11-25 11:39:00 | 显示全部楼层

retEntity = (Entity)trans.GetObject(ent.ObjectId, OpenMode.ForWrite);

------------------

这个函数好搞笑

 楼主| 发表于 2010-11-25 14:38:00 | 显示全部楼层

搞不懂,不对吗?

发表于 2010-11-25 16:15:00 | 显示全部楼层

哈哈

retEntity == ent;

发表于 2010-11-25 16:22:00 | 显示全部楼层

Entity ent,

retEntity = (Entity)trans.GetObject(ent.ObjectId, OpenMode.ForWrite);

你的ent类型是Entity,说明若是已存在的实体,已经打开了,你在这里又再打开,你这一行若没有问题也是多余了,你直接使用ent即可,可能前面是只读打开,那么你升级为可写打开即可,若Entity ent是个新建实体(还没提交到数据库),你这一行应该会报错.
发表于 2010-11-25 16:31:00 | 显示全部楼层

OK,贴个相关的扩展函数,调用方式:

1/简单的例子

    ent.UpgradeOpen(() => ent.ColorIndex = 3) ;

2/较为复杂的例子

                BlockTable.UpgradeOpen
                (
                    () =>
                    {
                        BlockTableRecord btr = new BlockTableRecord();
                        btr.Name = name;
                        id = BlockTable.Add(btr);
                        Transaction.AddNewlyCreatedDBObject(btr, true);
                    }
                );

 

 

        public static void UpgradeOpen<T>(this T obj, Action action) where T : DBObject
        {
            if (obj.IsNotifyEnabled)
            {
                bool b = obj.IsWriteEnabled;
                obj.UpgradeFromNotify();
                action();
                obj.DowngradeToNotify(b);
            }
            else if (obj.IsWriteEnabled)
            {
                action();
            }
            else
            {
                obj.UpgradeOpen();
                action();
                obj.DowngradeOpen();
            }
        }

 楼主| 发表于 2010-11-25 17:02:00 | 显示全部楼层
哦,这样啊.我一直以为

retEntity == ent;

retEntity = (Entity)trans.GetObject(ent.ObjectId, OpenMode.ForWrite);

一样呢?我习惯这样写了,现在才知道。谢谢谢谢...我再试试
 楼主| 发表于 2010-11-26 09:36:00 | 显示全部楼层

飞狐,我如果把写过扩展数据的dwg文件,复制一份,再进行操作,那是不是原版和复制版都有扩展数据啊???怎么才能看到它的扩展数据捏

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

本版积分规则

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

GMT+8, 2024-11-26 00:28 , Processed in 0.191425 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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