读取DWG文件将全部实体变为一个块
将DWG文件中所有DBObject组成一个块, 如果DWG文件中有属性参照, 则属性变为块属性.
我刚开始学习不久.Net AutoCAD的二次开发, 所以记录在这里我自己写的或者参照的一个些方法
/// <summary>
/// 将DWG文件所有DBObject组成一个块, 如果DWG文件中有属性, 则属性变为块属性
/// </summary>
/// <param name="insertPoint">插入点</param>
/// <param name="scale">插入比例</param>
/// <param name="blockName">块表记录名</param>
/// <param name="filePash">DWG文件路径</param>
/// <returns>块参照</returns>
public BlockReference InsertBlockReference(Point3d insertPoint, double scale, string blockName, string filePash)
{
BlockReference blockReference = null;
Document curDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; //获取当前文档
using (DocumentLock docLock = curDoc.LockDocument()) //锁定文档
{
using (Transaction trans = curDoc.TransactionManager.StartTransaction()) //事务
{
try
{
BlockTable curBlockTb = trans.GetObject(curDoc.Database.BlockTableId, OpenMode.ForRead) as BlockTable; //当前文档块表
ObjectId blockObjId = new ObjectId(); //用于块表记录的编号
if (curBlockTb.Has(blockName) && !curBlockTb[blockName].IsErased) //块表中存在该块表记录, 并且没有被删除
blockObjId = curBlockTb[blockName];
else
{
if (!System.IO.File.Exists(filePash)) //不存在该文件
{
trans.Abort(); //事务终止
return blockReference;
}
Database sourceDB = new Database(false, true);
sourceDB.ReadDwgFile(filePash, FileShare.Read, true, null); //后台读取DWG文件信息; 参数: 文件名, 打开方式, 是否允许转换版本, 密码
blockObjId = curDoc.Database.Insert(blockName, sourceDB, false); //将一个数据库插入到当前数据库的一个块中; 参数: 新创建的块表记录名, 资源数据库, 资源数据库是否保存原样
sourceDB.CloseInput(true); //是否关闭ReadDwgFile()方法之后打开的文件
sourceDB.Dispose();
}
if (blockObjId != null)
{
string layoutName = LayoutManager.Current.CurrentLayout; //获得当前布局空间
BlockTableRecord block = trans.GetObject(blockObjId, OpenMode.ForWrite) as BlockTableRecord; //根据块表记录编号获取的块表记录, 用于取得它的属性定义
block.Explodable = true; //块参照是否能被炸开
blockReference = new BlockReference(insertPoint, blockObjId); //新建块参照
BlockTableRecord layout = null;
if (layoutName.Equals("Model"))
layout = trans.GetObject(curBlockTb[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //根据当前布局空间获取的表块记录, 用于将块插入布局空间中
else
layout = trans.GetObject(curBlockTb[BlockTableRecord.PaperSpace], OpenMode.ForWrite) as BlockTableRecord;
layout.AppendEntity(blockReference); //在当前空间中追加此块参照
trans.AddNewlyCreatedDBObject(blockReference, true);
if (!block.HasAttributeDefinitions) //如果该块表记录中不包含任何属性定义
goto No_AttributeDefinitions; //直接去往No_AttributeDefinitions
AttributeDefinition attriDef = null;
AttributeReference attriRefe = null;
Matrix3d mtr = Matrix3d.Displacement(block.Origin.GetVectorTo(insertPoint)); //Displacement 取代
foreach (ObjectId entityObjId in block) //遍历块表记录中的实体编号
{
attriDef = trans.GetObject(entityObjId, OpenMode.ForRead) as AttributeDefinition; //打开实体通过实体编号
if (attriDef == null) //若还是为null
continue;
attriRefe = new AttributeReference(); //每次循环new一次新的对象, 确保上次属性不会残留
attriRefe.SetPropertiesFrom(attriDef); //SetPropertiesFrom 设置属性来自
attriRefe.SetAttributeFromBlock(attriDef, mtr); //通过块设置属性 参数: 属性定义, 变形矩阵
attriRefe.TextString = ""; //设置属性值为""
blockReference.AttributeCollection.AppendAttribute(attriRefe); //块参照中添加此属性参照
trans.AddNewlyCreatedDBObject(attriRefe, true);
attriRefe = null;
}
}
No_AttributeDefinitions:
blockReference.TransformBy(Matrix3d.Scaling(scale, insertPoint)); //缩放块; 修改块比例
trans.Commit(); //提交事务
}
catch (System.Exception ex)
{
if (blockReference != null)
{
blockReference = null;
}
return blockReference;
}
}
}
return blockReference;
}
今天的文章C# AutoCAD二次开发: 读取DWG文件将全部实体变为一个块。分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9765.html