说一下acad的bug

这是一个kean在博客的dbx例子,也就是后台打开dwg,这个例子有个问题,利用他插入图元之后,"新宋体"插入单行文字会出现基点不在文字图形的中间,这情况会保存到dwg内。
arx的情况不清楚,所以请用发送命令或lisp实现... 

        [CommandMethod("IB")]
        public void ImportBlocks()
        {
            DocumentCollection dm = Application.DocumentManager;
            Editor ed = dm.MdiActiveDocument.Editor;
            Database destDb = dm.MdiActiveDocument.Database;
            Database sourceDb = new Database(false, true);
            PromptResult sourceFileName;
            try
            {
                //从命令行要求用户输入以得到要导入的块所在的源 DWG 文件的名字 
                sourceFileName = ed.GetString("\n输入来源DWG的完整路径: "); //把源 DWG 读入辅助数据库 
                sourceDb.ReadDwgFile(sourceFileName.StringResult, System.IO.FileShare.Read, true, "");
                //用集合变量来存储块 ID 的列表 
                ObjectIdCollection blockIds = new ObjectIdCollection();
                Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager;
                using (Transaction myT = tm.StartTransaction())
                {
                    //打开块表 
                    BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false);
                    //在块表中检查每个块 
                    foreach (ObjectId btrId in bt)
                    {

                        BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false);
                        //只添加有名块和非 layout 块(layout 块是非 MS 和非 PS 的块)
                        if (!btr.IsAnonymous && !btr.IsLayout)
                            blockIds.Add(btrId);
                        btr.Dispose(); //释放块表记录引用变量所占用的资源 
                    }
                    bt.Dispose();//释放块表引用变量所占用的资源 //没有作改变,不需要提交事务 
                    myT.Dispose();
                }
                //用 WblockCloneObjects 把所有的块从源库拷贝块到目的库的块表中 
                //这只能实现导入块到指定的数据库中,但不是深度克隆,
                //若对块参照实行深度克隆的话,其所引用的块也会被克隆到指定的数据库中 
                IdMapping mapping = new IdMapping();
                sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
                ed.WriteMessage
                    ("\n复制 "
                    + blockIds.Count.ToString()
                    + " 块的定义"
                    + sourceFileName.StringResult
                    + " 到当前绘图的块表记录."
                    );
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage("\n复制过程中的错误: " + ex.Message);
            }
            sourceDb.Dispose();
        }

通过写入块表记录的词典实现裁剪,在高版本中会丢失了翻转裁剪的小三角,据e大说这在arx同样如此,所以只能发送命令或lisp实现.

2008netapi如果你建一个块,再删除他,再添加一个同名块,用名称获取块定义会得到删除了的那个,然后爆了,

这在2008所有符号表上均存在,所以要容错处理或者检测id时候删除.

而高版本已经修复了这个问题.

猜你喜欢

转载自www.cnblogs.com/JJBox/p/10226119.html
今日推荐