您的位置:首页 > 其它

【连载】 .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();
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: