dpec1982 发表于 2014-12-2 12:09:16

跪求哪里出错了????

class Test
    {      
      
      public void createBlkRef()
      {
            //获取块的插入点
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptPointOptions ptOps = new PromptPointOptions("选择块的插入点");
            PromptPointResult ptRes;
            ptRes = ed.GetPoint(ptOps);
            Point3d ptInsert;
            if (ptRes.Status == PromptStatus.OK)
            {
                ptInsert = ptRes.Value;
            }
            else
            {
                ptInsert = new Point3d(0, 0, 0);
            }
            Database db = HostApplicationServices.WorkingDatabase;
            // 使用 "using"关键字指定事务的边界
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //获取块表和模型空间
                BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForWrite));
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt, OpenMode.ForWrite);

                //创建块引用
                BlockReference blkRef = new BlockReference(ptInsert, createBlkDef());// 指定插入点和所引用的块表记录
               // blkRef.Rotation = 1.57;//指定旋转角,按弧度
                //保存新创建的块引用到模型空间   
                btr.AppendEntity(blkRef);
                trans.AddNewlyCreatedDBObject(blkRef, true);    // 通知事务新创建了对象
                trans.Commit(); //提交事务
            }
      }
            


      public static ObjectId createBlkDef()
      {
            Document doc = openDoc("C:\\图例列表.dwg");
         // DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
         // docLock.Dispose();
            Database db = doc.Database;
            //Database db = HostApplicationServices.WorkingDatabase;
            //定义函数的返回值ObjectId
            ObjectId blkObjId = new ObjectId();
            // 使用 "using"关键字指定事务的边界
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //获取块表
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                //通过块名myBlkName判断块表中是否包含块表记录
                if ((bt.Has("DET_001")))
                  blkObjId = bt["DET_001"];//如果已经存在,通过块名获取块对应的ObjectId
                trans.Commit(); //提交事务
            }
            return blkObjId;
      }




   //打开“图例列表.dwg”文件,但我做的是在cad中看到了,如果不看到,怎么做呢???
      public static Document openDoc(string fileName)
      {
            Document doc = null;
            DocumentCollection docMar = Application.DocumentManager;
            if (System.IO.File.Exists(fileName))
            {
                doc = docMar.Open(fileName, false);
                //docMar.MdiActiveDocument = doc;
            }
            else
                docMar.MdiActiveDocument.Editor.WriteMessage("\n 文件" + fileName + "不存在");
            return doc;
      }


    }

我是想把“图例列表.dwg”文件中块名为“DET_001”的块加入到一个.dwg的文件中,各位大神,我哪里出错了,整个cad崩溃了,还有就是我打开“图例列表.dwg”文件不在cad中显示怎么实现,我这里是在当前的cad中打开了,但不是当前Document。




guohq 发表于 2014-12-2 15:57:08

   BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                //通过块名myBlkName判断块表中是否包含块表记录
                if ((bt.Has("DET_001")))
                  blkObjId = bt["DET_001"];//如果已经存在,通过块名获取块对应的ObjectId
                trans.Commit(); //提交事务


如果不存在呢?

guohq 发表于 2014-12-2 16:01:32

以后不用跪了

dpec1982 发表于 2014-12-3 14:52:43

我保证是存在的而且是唯一的。

sieben 发表于 2014-12-3 15:45:00

你是拿明朝的尚方宝剑砍清朝的官,搜一搜吧,论坛内有多吃讨论过这个内容

dpec1982 发表于 2014-12-3 16:00:22

恩,谢谢大家,我这个问题解决了。谢谢
页: [1]
查看完整版本: 跪求哪里出错了????