【连载】 .Net cad二次开发(四)
2015-05-20 20:30
162 查看
开始往cad数据库中添加实体了。一、添加实体到模型空间【图纸空间类似】
// 加入实体到模型空间 public static ObjectId Append(Entity ent, Database db) { ObjectId id; using(Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); BlockTableRecord modeSpce = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); id = modeSpce.AppendEntity(ent); tr.AddNewlyCreatedDBObject(ent, true); tr.Commit(); } return id; } // 为了避免重复打开数据库,这里就单独列出数组形式重载 public static ObjectIdCollection Append(DBObjectCollection ents, Database db) { ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); BlockTableRecord modeSpce = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); foreach (DBObject obj in ents) { Entity ent = obj as Entity; if (null != ent) { ids.Add(modeSpce.AppendEntity(ent)); tr.AddNewlyCreatedDBObject(ent, true); } } tr.Commit(); } return ids; }二、 块定义,插入模型空间
// 块定义,插入模型空间 public ObjectId BlkInDb(BlockTableRecord block, Point3d pt, Database db) { BlockReference blk = null; ObjectId id = new ObjectId(); using(Transaction tr = db.TransactionManager.StartTransaction()) { // 打开模型空间 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord modeSpce = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // // 新建一个块引用 blk = new BlockReference(pt, block.ObjectId); id = modeSpce.AppendEntity(blk); tr.AddNewlyCreatedDBObject(blk, true); // 遍历块记录中的所有实体,加入块引用中 foreach(ObjectId idTemp in block) { // 判断该实体是否是块定义 ,也可以以块定义方式打开,但是会产生事物嵌套 if (idTemp.ObjectClass.Equals(RXClass.GetClass(typeof(AttributeDefinition)))) { AttributeDefinition adDef = tr.GetObject(idTemp, OpenMode.ForRead) as AttributeDefinition; if (adDef != null) { AttributeReference ar = new AttributeReference(adDef.Position, adDef.TextString, adDef.Tag, new ObjectId()); blk.AttributeCollection.AppendAttribute(ar); } } } tr.Commit(); } return id; }三、图层基本操作
// 根据图层名获取图层 public static LayerTableRecord GetLayer(string strName, Database db) { LayerTableRecord layer = new LayerTableRecord(); using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTableRecord layerTemp = new LayerTableRecord(); LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; if (lt != null) { if (lt.Has(strName)) { layerTemp = tr.GetObject(lt[strName], OpenMode.ForRead) as LayerTableRecord; if (null != layerTemp) { if (!layerTemp.IsErased) layer = layerTemp; } } } tr.Commit(); } return layer; } // 获取当前图层 public static LayerTableRecord GetCurrentlayer(Database db) { LayerTableRecord layer = new LayerTableRecord(); using (Transaction tr = db.TransactionManager.StartTransaction()) { layer = tr.GetObject(db.Clayer, OpenMode.ForRead) as LayerTableRecord; tr.Commit(); } return layer; } // 设置为当前图层 public static void SetCurrentLayer(LayerTableRecord layer, Database db) { if (layer.ObjectId != ObjectId.Null) { db.Clayer = layer.ObjectId; } } // 新建一个图层 public static ObjectId CreatLayer(string strLayername, Database db, bool bSetCur = false) { ObjectId id = ObjectId.Null; using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; if (null != table) { if (!table.Has(strLayername)) // 存在就不再创建 { LayerTableRecord layer = new LayerTableRecord(); layer.Name = strLayername; id = table.Add(layer); tr.AddNewlyCreatedDBObject(layer, true); if (bSetCur) { SetCurrentLayer(layer, db); } } } tr.Commit(); } return id; } }
<pre name="code" class="csharp"> // 删除图层 public static void DeleteLayer(string strDelLayer, Database db) { db = NetCad.CCadDadabase.GetDb(db); ObjectId layerId = ObjectId.Null; using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; if (null != table) { LayerTableRecord curLayer = tr.GetObject(db.Clayer, OpenMode.ForRead) as LayerTableRecord; if (curLayer.Name.ToLower() != strDelLayer.ToLower()) // 当前图层不可删除 { if (table.Has(strDelLayer)) // 存在就不再创建 { LayerTableRecord layer = new LayerTableRecord(); layer = tr.GetObject(table[strDelLayer], OpenMode.ForWrite) as LayerTableRecord; if (layer != null) { if (!layer.IsErased) { ObjectIdCollection idArr = new ObjectIdCollection(); idArr.Add(layer.ObjectId); db.Purge(idArr); // 删除图层id if (idArr.Count != 0) // 判断是否删除失败 { layer.Erase(); } } } } } } tr.Commit(); } } // 删除图层上的所有实体 public static void DeleteAllLayerEnts(LayerTableRecord layer, Database db) { NetCad.CCadDadabase.GetDb(db); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable; if (bt != null) { foreach(ObjectId id in bt) { BlockTableRecord blk = tr.GetObject(id, OpenMode.ForWrite) as BlockTableRecord; if (null == blk) continue; foreach(ObjectId idEnt in blk) { Entity ent = tr.GetObject(idEnt, OpenMode.ForWrite) as Entity; if (null == ent) continue; if (ent.LayerId != layer.ObjectId) continue; ent.Erase(); } } } tr.Commit(); } }
相关文章推荐
- 【连载】 .Net cad二次开发(二)
- 【连载】 .Net cad二次开发(一)
- 【连载】 .Net cad二次开发(三)
- 【连载】 .Net cad二次开发(五)
- 每一个人都可以做Zencart的二次开发
- 基于Qt的海康威视网络摄像头SDK的二次开发——摄像头登录和预览
- Revit 2011 二次开发之“高亮显示错误提示”
- hadoop 2.X 二次开发 搭建环境
- ECSHOP二次开发教程__连接
- 《BREW进阶与精通――3G移动增值业务的运营、定制与开发》连载之38――BREW与手机操作系统的关系
- Sketchup二次开发之利用Ruby绘制直线
- ECSHOP二次开发指南
- AutoCAD二次开发之视图操作(3)指定视图大小和中心点来设置视图
- ERP二次开发因何让信息化软件“变了味”
- 微信二次开发接入,附带后台框架
- E8.Net 工作流二次开发架构平台
- 通达OA 需要二次开发的朋友看过来
- 富编译器汇总及二次开发Demo
- 第8章 C# .NET 开源可进行二次开发的即时通讯组件提供全部源码下载
- 基于SolidWorks 二次开发专用CAD系统