在一些书上看见的方法,自己编译尝试了一下,全部有效,希望对大家有所帮助:
public class CadLayerBasicOp
{
/// <summary>
/// 取得图层下的所有对象id
/// </summary>
/// <param name="name">图层名称</param>
/// <returns>id集合</returns>
public static ObjectIdCollection GetObjectIdsAtLayer(string name)
{
ObjectIdCollection ids = new ObjectIdCollection();
PromptSelectionResult ProSset = null;
TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.LayerName, name) };
SelectionFilter sfilter = new SelectionFilter(filList);
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
ProSset = ed.SelectAll(sfilter);
if (ProSset.Status == PromptStatus.OK)
{
SelectionSet sst = ProSset.Value;
ObjectId[] oids = sst.GetObjectIds();
for (int i = 0; i < oids.Length; i++)
{
ids.Add(oids[i]);
}
}
return ids;
}
/// <summary>
/// 获取图层
/// </summary>
/// <param name="name"></param>
/// <param name="db"></param>
/// <returns></returns>
public LayerTableRecord GetLayer(string name,Database db)
{
LayerTableRecord layer = new LayerTableRecord();
using (Transaction trans = db.TransactionManager.StartTransaction())
{
LayerTableRecord layer0 = new LayerTableRecord();
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
if (lt.Has(name))
{
layer0 = trans.GetObject(lt[name], OpenMode.ForRead) as LayerTableRecord;
if (!layer0.IsErased)
{
layer = layer0;
}
}
trans.Commit();
}
return null;
}
/// <summary>
/// 获取当前图层
/// </summary>
/// <param name="db"></param>
/// <returns></returns>
public LayerTableRecord GetCurLayer(Database db)
{
LayerTableRecord layer = new LayerTableRecord();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
layer = tr.GetObject(db.Clayer, OpenMode.ForRead) as LayerTableRecord;
}
return layer;
}
/// <summary>
/// 增加图层并设置,当前图层
/// </summary>
/// <param name="strLayerName"></param>
/// <param name="nColIndex"></param>
public void AddLayer(string strLayerName,short nColIndex)
{
short colIndex = (short)(nColIndex % 256);
Document acDoc = Application.DocumentManager.MdiActiveDocument;
using (Transaction tr = acDoc.TransactionManager.StartTransaction())
{
//指定点图层
LayerTable lt = (LayerTable)tr.GetObject(acDoc.Database.LayerTableId, OpenMode.ForRead);
if (!lt.Has(strLayerName))//判断是否存在
{
var LayerID = ObjectId.Null;
LayerTableRecord ltr = new LayerTableRecord();
ltr.Name = strLayerName;
ltr.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(
Autodesk.AutoCAD.Colors.ColorMethod.ByColor, colIndex);
lt.UpgradeOpen();
LayerID = lt.Add(ltr);
tr.AddNewlyCreatedDBObject(ltr, true);
acDoc.Database.Clayer = ltr.ObjectId;
}
else
{
WriteLine("\n此图层已经曾在");
}
tr.Commit();
}
}
/// <summary>
/// 删除图层
/// </summary>
/// <param name="strName"></param>
/// <param name="db"></param>
public void RemoveLayer(string strName,Database db)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
LayerTableRecord curLayer = (LayerTableRecord)trans.GetObject(db.Clayer,OpenMode.ForRead);
if(curLayer.Name.ToLower() == strName.ToLower())
{
WriteLine("\n不能删除当前图层");
}
else
{
LayerTableRecord ltr = new LayerTableRecord();
if(lt.Has(strName))
{
ltr = trans.GetObject(lt[strName], OpenMode.ForWrite) as LayerTableRecord;
if(ltr.IsErased)
{
WriteLine("\n此图层已经被删除");
}
else
{
ObjectIdCollection idCol = new ObjectIdCollection();
idCol.Add(ltr.ObjectId);
db.Purge(idCol);
if(idCol.Count==0)
{
WriteLine("\n不能删除有对象的图层");
}
else
{
ltr.Erase();
}
}
}
else
{
WriteLine("\n没有此图层");
}
}
trans.Commit();
}
}
/// <summary>
/// 删除图层的所有实体
/// </summary>
/// <param name="layer"></param>
/// <param name="db"></param>
public void RemoveAllEntOfLayer(LayerTableRecord layer,Database db)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
foreach(ObjectId btrid in bt)
{
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrid, OpenMode.ForWrite);
foreach(ObjectId eid in btr)
{
Entity ent = trans.GetObject(eid, OpenMode.ForWrite) as Entity;
if(ent != null)
{
if (ent.LayerId == layer.ObjectId)
{
ent.Erase();
}
}
}
}
trans.Commit();
}
}
public static void LayerOff(string strLayerName)
{
var doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trs = db.TransactionManager.StartTransaction())
{
LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
layer.IsOff = true;
trs.Commit();
}
}
public static void LayerOn(string strLayerName)
{
var doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trs = db.TransactionManager.StartTransaction())
{
LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
layer.IsOff = false;
trs.Commit();
}
}
public void LayerEnable(string strLayerName)
{
var doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trs = db.TransactionManager.StartTransaction())
{
LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
layer.IsOff = layer.IsOff ? false : true;
trs.Commit();
}
}
private void WriteLine(string strCon)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(strCon);//输出字符串
}
}