明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: 介之推

[运行时] 如何编写代码实现从外部输入块,并插入到当前文件中?

  [复制链接]
发表于 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
09.                using (Transaction trans = db.TransactionManager.StartTransaction())
10.         ...

奇怪,如果采用
  1. string blockName = ""; InsertDwg("c:\\TestTwo.dwg", ref blockName);
复制代码
就把TestTwo.dwg中的所有块都拷贝到当前CAD中了。
但是如果采用
  1. string blockName = "sample"; InsertDwg("c:\\TestTwo.dwg", ref blockName);
复制代码
就出现了我上面说的错误了。但我在TestTwo.dwg中专门生成了一个名为“sample”的块,我就想要这个块,其他的块不要。
发表于 2013-4-2 00:00:18 | 显示全部楼层
两个函数的作用是不同的,否则我给两个函数干嘛呢?
 楼主| 发表于 2013-4-2 10:58:17 | 显示全部楼层
本帖最后由 介之推 于 2013-4-2 13:55 编辑
sieben 发表于 2013-4-2 00:00
两个函数的作用是不同的,否则我给两个函数干嘛呢?


不是两个函数,都是你给我的第二个函数,只是第一次传入的是个空白字符串,第二次传入的是"sample",是个有内容的字符串。
发表于 2013-4-2 11:19:24 | 显示全部楼层
  1. /// <summary>
  2.         /// 在当前图形中导入外部图形中的块,返回块名称
  3.         /// </summary>
  4.         /// <param name="fileName">外部DWG图形文件(绝对路径)</param>
  5.         /// <param name="blockName">待插入的外部图形中的块名称</param>
  6.         /// <param name="bReplace">是否覆盖当前图形中的同名块</param>
  7.         /// <returns>返回插入到当前文档中的块Id</returns>
  8.         public static ObjectId m_ImportBlock(string fileName, string blockName, bool bReplace)
  9.         {
  10.             ObjectId destId = mFun.m_GetBlockId(blockName);
  11.             if (destId.IsNull)
  12.             {
  13.                 using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())//记住一定要先锁定文档
  14.                 {
  15.                     using (Database sourceDb = new Database(false, false))
  16.                     {
  17.                         sourceDb.ReadDwgFile(fileName.Trim(), FileShare.Read, true, null);

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

  20.                         sourceDb.CloseInput(true);
  21.                     }
  22.                 }
  23.             }

  24.             return destId;
  25.         }

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

  41.                     if (sourceBt.Has(blockName))
  42.                     {
  43.                         ObjectId sourceId = sourceBt[blockName];
  44.                         IdMapping idMap = new IdMapping();
  45.                         sourceDb.WblockCloneObjects(
  46.                             new ObjectIdCollection(new ObjectId[] { sourceId }),
  47.                             HostApplicationServices.WorkingDatabase.BlockTableId,
  48.                             idMap,
  49.                             bReplace == true ? DuplicateRecordCloning.Replace : DuplicateRecordCloning.MangleName,
  50.                             false);

  51.                         destId = idMap[sourceId].Value;
  52.                     }

  53.                     sourceTr.Commit();
  54.                 }
  55.             }

  56.             return destId;
  57.         }
 楼主| 发表于 2013-4-2 13:44:42 | 显示全部楼层
mkhsj928 发表于 2013-4-2 11:19

你好,mkhsj928
你的第一个函数m_ImportBlock(string, sting,bool)中的第一行代码:
  1. ObjectId destId = mFun.m_GetBlockId(blockName);
复制代码
中的函数mFun.m_GetBlockId(string)是如何定义的?
发表于 2013-4-3 09:56:52 | 显示全部楼层
这个可以去掉的!
定义如下
  1. /// <summary>
  2.         /// 由指定块名称获得块Id
  3.         /// </summary>
  4.         /// <param name="BlockName"></param>
  5.         /// <returns></returns>
  6.         public static ObjectId m_GetBlockId(string BlockName)
  7.         {
  8.             ObjectId blockId = ObjectId.Null;
  9.             using (Transaction m_tr = mCommands.m_db.TransactionManager.StartTransaction())
  10.             {
  11.                 BlockTable m_bt = (BlockTable)m_tr.GetObject(mCommands.m_db.BlockTableId, OpenMode.ForRead);

  12.                 if (m_bt.Has(BlockName)) blockId = m_bt[BlockName];
  13.                 //else
  14.                 //{
  15.                 //    MessageBox.Show(string.Format("指定块名"{0}"不存在!", BlockName));
  16.                 //}
  17.                 m_tr.Commit();
  18.             }
  19.             return blockId;
  20.         }
发表于 2014-6-4 09:50:32 | 显示全部楼层
mkhsj928 发表于 2013-4-3 09:56
这个可以去掉的!
定义如下

mCommands     mfun    FileShare指的的是什么类,好像没定义
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:49 , Processed in 0.170052 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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