sieben 发表于 2013-4-1 23:10:16

09.                using (Transaction trans = db.TransactionManager.StartTransaction())
10.                {
12.                  string blockName = "sample"; InsertDwg("test.dwg", ref blockName);
14.                  trans.Commit();
15.                }
将上面代码改为如下试试
string blockName = "";
InsertDwg("D:\\test.dwg", ref blockName);//注意这里要输入文件全名

介之推 发表于 2013-4-1 23:21:08

sieben 发表于 2013-4-1 23:10 static/image/common/back.gif
09.                using (Transaction trans = db.TransactionManager.StartTransaction())
10.         ...

奇怪,如果采用string blockName = ""; InsertDwg("c:\\TestTwo.dwg", ref blockName);就把TestTwo.dwg中的所有块都拷贝到当前CAD中了。
但是如果采用string blockName = "sample"; InsertDwg("c:\\TestTwo.dwg", ref blockName);就出现了我上面说的错误了。但我在TestTwo.dwg中专门生成了一个名为“sample”的块,我就想要这个块,其他的块不要。

sieben 发表于 2013-4-2 00:00:18

两个函数的作用是不同的,否则我给两个函数干嘛呢?

介之推 发表于 2013-4-2 10:58:17

本帖最后由 介之推 于 2013-4-2 13:55 编辑

sieben 发表于 2013-4-2 00:00 http://bbs.mjtd.com/static/image/common/back.gif
两个函数的作用是不同的,否则我给两个函数干嘛呢?

不是两个函数,都是你给我的第二个函数,只是第一次传入的是个空白字符串,第二次传入的是"sample",是个有内容的字符串。

mkhsj928 发表于 2013-4-2 11:19:24

/// <summary>
      /// 在当前图形中导入外部图形中的块,返回块名称
      /// </summary>
      /// <param name="fileName">外部DWG图形文件(绝对路径)</param>
      /// <param name="blockName">待插入的外部图形中的块名称</param>
      /// <param name="bReplace">是否覆盖当前图形中的同名块</param>
      /// <returns>返回插入到当前文档中的块Id</returns>
      public static ObjectId m_ImportBlock(string fileName, string blockName, bool bReplace)
      {
            ObjectId destId = mFun.m_GetBlockId(blockName);
            if (destId.IsNull)
            {
                using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())//记住一定要先锁定文档
                {
                  using (Database sourceDb = new Database(false, false))
                  {
                        sourceDb.ReadDwgFile(fileName.Trim(), FileShare.Read, true, null);

                        //destId = mCommands.m_db.Insert(blockName, sourceDb, false);//错误?!?!块自参照???!!!
                        destId = m_ImportBlock(sourceDb, blockName, bReplace);

                        sourceDb.CloseInput(true);
                  }
                }
            }

            return destId;
      }

      /// <summary>
      /// 从原数据库中导入具有指定块名称的块
      /// </summary>
      /// <param name="sourceDb">原数据库</param>
      /// <param name="blockName">要导入的块的名称</param>
      /// <param name="bReplace">是否覆盖同名块</param>
      /// <returns></returns>
      public static ObjectId m_ImportBlock(Database sourceDb, string blockName, bool bReplace)
      {
            ObjectId destId = ObjectId.Null;
            using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                using (Transaction sourceTr = sourceDb.TransactionManager.StartTransaction())
                {
                  BlockTable sourceBt = sourceTr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                  if (sourceBt.Has(blockName))
                  {
                        ObjectId sourceId = sourceBt;
                        IdMapping idMap = new IdMapping();
                        sourceDb.WblockCloneObjects(
                            new ObjectIdCollection(new ObjectId[] { sourceId }),
                            HostApplicationServices.WorkingDatabase.BlockTableId,
                            idMap,
                            bReplace == true ? DuplicateRecordCloning.Replace : DuplicateRecordCloning.MangleName,
                            false);

                        destId = idMap.Value;
                  }

                  sourceTr.Commit();
                }
            }

            return destId;
      }

介之推 发表于 2013-4-2 13:44:42

mkhsj928 发表于 2013-4-2 11:19 static/image/common/back.gif


你好,mkhsj928
你的第一个函数m_ImportBlock(string, sting,bool)中的第一行代码:ObjectId destId = mFun.m_GetBlockId(blockName);中的函数mFun.m_GetBlockId(string)是如何定义的?

mkhsj928 发表于 2013-4-3 09:56:52

这个可以去掉的!
定义如下/// <summary>
      /// 由指定块名称获得块Id
      /// </summary>
      /// <param name="BlockName"></param>
      /// <returns></returns>
      public static ObjectId m_GetBlockId(string BlockName)
      {
            ObjectId blockId = ObjectId.Null;
            using (Transaction m_tr = mCommands.m_db.TransactionManager.StartTransaction())
            {
                BlockTable m_bt = (BlockTable)m_tr.GetObject(mCommands.m_db.BlockTableId, OpenMode.ForRead);

                if (m_bt.Has(BlockName)) blockId = m_bt;
                //else
                //{
                //    MessageBox.Show(string.Format("指定块名\"{0}\"不存在!", BlockName));
                //}
                m_tr.Commit();
            }
            return blockId;
      }

j15tty 发表于 2014-6-4 09:50:32

mkhsj928 发表于 2013-4-3 09:56 static/image/common/back.gif
这个可以去掉的!
定义如下

mCommands   mfun    FileShare指的的是什么类,好像没定义
页: 1 2 [3]
查看完整版本: 如何编写代码实现从外部输入块,并插入到当前文件中?