1、需求
插入外部文件中指定的块。

2、思路
将外部dwg文件加载到临时数据库中,把外部dwg文件中自定义的命名块复制到当前文档的数据库中;新建指定块的块参照加入到当前块表记录。

3、环境
AutoCAD 2018/vs2015

4、步骤:
(1) 新建一个临时图形数据库

Database tempDB = new Database(false, true);

(2) 调用Database类的 WblockCloneObjects()方法复制块

(3) 新建一个块参照:BlockReference

public BlockReference(Point3d position, ObjectId blockTableRecord);

(4) 把块参照添加到块表记录中

BlockTableRecord.AppendEntity()

Transaction.AddNewlyCreatedDBObject();

关键代码:

    /// <summary>/// 复制块文件/// </summary>/// <param name="TargetDB"></param>/// <param name="FileName">动态块文件路径</param>/// <param name="BlockName">动态块名称</param>/// <param name="Method"></param>public static void CopyBlockFromFile(this Database TargetDB, string FileName, string BlockName, DuplicateRecordCloning Method = DuplicateRecordCloning.Replace){using (Database db = new Database(false, true)){db.ReadDwgFile(FileName, FileShare.ReadWrite, true, "");ObjectIdCollection ids = new ObjectIdCollection();ObjectIdCollection newoids = new ObjectIdCollection();IdMapping im = new IdMapping();using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, true, true);ids.Add(bt[BlockName]);tr.Commit();}try{//db.WblockCloneObjects(ids, TargetDB.BlockTableId, im, DuplicateRecordCloning.Ignore, true);db.WblockCloneObjects(ids, TargetDB.BlockTableId, im, DuplicateRecordCloning.Replace, false);}catch (Exception ex){}}}/// <summary>/// 插入带属性的参照快(插入动态块)/// </summary>/// <param name="spaceId">空间的ID</param>/// <param name="layer">块要加入的图层名</param>/// <param name="blockName">快参照所属的快名</param>/// <param name="postion">插入点</param>/// <param name="scale">缩放比例</param>/// <param name="rotateAngle">旋转角度</param>/// <param name="attNameValues">属性名称与取值</param>/// <returns></returns>public static ObjectId InsertBlockrefenceModelSpace(this ObjectId spaceId, string blockName, Point3d postion, Scale3d scale, double rotateAngle, Dictionary<string, Dictionary<string, string>> attNameValues, Dictionary<string, Dictionary<string, string>> attDNameValues, bool isRoate = false){// 获取数据库对象Database db = spaceId.Database;//以读的方式打开块表BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;//如果没有blockName d的块,则程序返回if (!bt.Has(blockName))return ObjectId.Null;//如果没有blockName的块,程序返回//以写的模式打开空间BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);//获取块表的记录IDObjectId btrId = bt[blockName];//打开块表记录BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;//创建一个快参照并设置插入点BlockReference br = new BlockReference(postion, bt[blockName]);//DynamicBlockReferencePropertyCollection properties= br.DynamicBlockReferencePropertyCollection;            br.ScaleFactors = scale;br.Rotation = rotateAngle;space.AppendEntity(br);//判断块表记录是否包含属性定义if (record.HasAttributeDefinitions){//若包含,则遍历属性定义foreach (ObjectId id in record){//检查是否是属性定义AttributeDefinition attDef = id.GetObject(OpenMode.ForRead) as AttributeDefinition;if (attDef != null){//创建一个新的属性对象AttributeReference attribute = new AttributeReference();//从属性定义获取属性对象的对象特性attribute.SetAttributeFromBlock(attDef, br.BlockTransform);attribute.Rotation = attDef.Rotation;attribute.Position = attDef.Position.TransformBy(br.BlockTransform);attribute.AdjustAlignment(db);//判断是否包含指定的属性名称if (attNameValues.ContainsKey(attDef.Tag.ToUpper())){//设置属性值attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();}// 向块参照添加属性对象br.AttributeCollection.AppendAttribute(attribute);db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);}}}if (isRoate ){br.TransformBy(Matrix3d.Rotation(GeTools.DegreeToRadian(180), Vector3d.YAxis, postion));}ChangeDynamicValue(br, attDNameValues);db.TransactionManager.AddNewlyCreatedDBObject(br, true);return br.ObjectId;//返回添加的快参照的ID}

说明:
Dictionary<string, Dictionary<string, string>> : Dictionary<属性设置值, Dictionary<属性名称, 类型(string\double)>>

   /// <summary>///设置自定义属性值/// </summary>/// <param name="br"></param>/// <param name="attDNameValues"></param>
public static void ChangeDynamicValue(BlockReference br, Dictionary<string, Dictionary<string,string>> attDNameValues){if (br != null && br.IsDynamicBlock){DynamicBlockReferencePropertyCollection pc = br.DynamicBlockReferencePropertyCollection;AttributeCollection ar = br.AttributeCollection;foreach (DynamicBlockReferenceProperty prop in pc){if (attDNameValues.Keys.Contains(prop.PropertyName) && !prop.ReadOnly){try{Dictionary<string, string> dic = attDNameValues[prop.PropertyName];List<string> values = dic.Keys.ToList();List<string> types = dic.Values.ToList();switch(types[0].ToLower()) {case "double":string[] sp = prop.PropertyName.Split('_');if (sp != null){//if(sp[sp.Length-1]=="mm")//    prop.Value = double.Parse(values[0])/1000;//elseprop.Value = double.Parse(values[0]);}break;case "string":prop.Value = values[0];break;}//prop.Value = attDNameValues[prop.PropertyName];}catch (System.Exception ex){}}                   else{continue;}}}}

C#之CAD插入外部块文件相关推荐

  1. 插入外部dwg文件,避免外部参照

    之前用插入外部参照快的方法,拷贝给别人的时候还需要绑定外部参照快,或者将外部参照dwg拷贝过去,很麻烦,后经过以下方法避免了外部参照的麻烦,插入的块直接就是块参照,非常好用. 转载自:http://b ...

  2. CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时有些文字消失了?

    下面是本公众号文章分类目录,点击可打开分类文章列表: 安装卸载 文件格式.输入输出  异常.退出  基本操作技巧 设置及相关问题 界面和显示相关问题 CAD快捷键  视图设置和调整选择.组  坐标系. ...

  3. CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时会提示错误无效?

    本公众号文章分类索引,点击可打开分类文章列表: 安装 文件 异常.退出 复制粘贴 基本操作 快捷键 设置 界面 捕捉 视图 坐标定位 选择.组 图层 颜色 表格 线型 二维绘图 多段线 填充 图块 标 ...

  4. CAD中插入外部参照字体会变繁体_为什么CAD插入相同图框但尺寸却相差很多?

    下面是本公众号文章分类目录,点击标题文字可打开分类文章列表: CAD安装卸载  异常.退出  文件及输入输出  基本操作技巧  各种设置及相关问题  界面和显示相关问题  快捷键  视图设置和调整   ...

  5. CAD中插入外部参照字体会变繁体_CAD外部参照的附加型和覆盖型有什么区别?

    CAD插入外部参照时可选择两种方式:附加型和覆盖型,可能不少人并没有关注到参照类型,有些网友关注到了,但在看过公众号之前发布的介绍外部参照文章后还是没太弄明白.这两个类型确实不太好理解,有必要在通过一 ...

  6. CAD外部参照与外部块使用方法与区…

    我们知道,一个dwg图形文件可以当作块插入到另一个图形文件中,如果把图形作为块插入时,块定义和所有相关联的几何图形都将存储在当前图形数据库中,并且修改原图形后,块不会随之更新. 与这种方式相比,外部参 ...

  7. 在word文档中插入外部对象(例如插入另一个外部word文档或excel文档)

    一.插入外部文件 例如插入外部word文档: 插入--对象--对象--由文件创建--选择文件,勾选链接到文件.显示为图标. 确定即可. 二.插入外部flv文件 第1步 首先打开一个WORD文件,点击& ...

  8. CAD中插入外部参照字体会变繁体_CAD外部参照怎么用,什么是外部参照,和块有什么区别?...

    好课推荐: 1.CAD2014:点击查看 2.室内&全屋:点击查看 3.CAD2019:点击查看4.CAD2018:点击查看5.Bim教程:点击查看 6.室内手绘:点击查看7.CAD三维:点击 ...

  9. CAD中插入外部参照字体会变繁体_为什么CAD中将图纸作为图块插入时不成功?

    下面是本公众号文章分类目录,点击标题文字可打开分类文章列表: 安装卸载  异常.退出  文件及输入输出  基本操作技巧  设置及相关问题  界面和显示  快捷键  视图设置 选择及组 坐标输入.定位  ...

最新文章

  1. 计算比尔盖茨財富的方法
  2. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
  3. Centos 用户组管理
  4. Socket编程之简单介绍
  5. Android监听程序自身被卸载
  6. 关闭页面那点事儿...
  7. 基础数据类型操作(一)——整型、字符串
  8. Eclipse的maven插件最新地址
  9. 《深度学习:Java语言实现》一一1.3人工智能与深度学习
  10. 无线通信定位一体化进展及其在煤矿井下应用分析
  11. 酒店和餐饮企业Foodprint Group使用西门子低代码重设工作流程以缓解食物浪费问题
  12. QT自定义控件-经纬度输入框
  13. 基于安卓平台,客户端视频监控的实现(三)
  14. win10 wmware 花屏_用了N年浑不知!原来Win10竟有这么多隐藏功能
  15. 神经网络模型的基本原理,如何建立神经网络模型
  16. 从南丁格尔图到医学发展史
  17. 五年,你敢说自己是高级开发么?
  18. 计算图像数据集的均值和方差(mean, std)用于transforms.Normalize()标准化
  19. docker--volumes,bind mounts和tmpfs mount
  20. Lucene Query Parser Syntax

热门文章

  1. 靠谱助手 BlueStacks
  2. Delphi 修改文本框中内容
  3. 怀旧服服务器维护后断牙刷新吗,魔兽世界怀旧服:猎人抓断牙方法介绍,时间和位面技术缺一不可...
  4. 一个基于运气的数据结构,发明它的人是火男?
  5. 比较全面的freemarker语法总结
  6. IT女神节(致敬中国IT界永远的女神严蔚敏-数据结构)
  7. 全景图 相框 载入图案 局部上色
  8. 树莓派python手势识别控制_OpenCV——手势识别
  9. ansible-tower(awx)容器化安装流程(终极简版)
  10. Borland C++ Builder 6集成开发环境