-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathLayerTools.cs
More file actions
147 lines (141 loc) · 6.48 KB
/
Copy pathLayerTools.cs
File metadata and controls
147 lines (141 loc) · 6.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System.Collections.Generic;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
namespace DotNetARX
{
/// <summary>
/// 图层操作类
/// </summary>
public static class LayerTools
{
/// <summary>
/// 创建新图层
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="layerName">图层名</param>
/// <returns>返回新建图层的ObjectId</returns>
public static ObjectId AddLayer(this Database db, string layerName)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
if (!lt.Has(layerName))//如果不存在名为layerName的图层,则新建一个图层
{
//定义一个新的层表记录
LayerTableRecord ltr = new LayerTableRecord
{
Name = layerName//设置图层名
};
lt.UpgradeOpen();//切换层表的状态为写以添加新的图层
//将层表记录的信息添加到层表中
lt.Add(ltr);
//把层表记录添加到事务处理中
db.TransactionManager.AddNewlyCreatedDBObject(ltr, true);
lt.DowngradeOpen();//为了安全,将层表的状态切换为读
}
return lt[layerName];//返回新添加的层表记录的ObjectId
}
/// <summary>
/// 设置图层的颜色
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="layerName">图层名</param>
/// <param name="colorIndex">颜色索引</param>
/// <returns>如果成功设置图层颜色,则返回true,否则返回false</returns>
public static bool SetLayerColor(this Database db, string layerName, short colorIndex)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
//如果不存在名为layerName的图层,则返回
if (!lt.Has(layerName)) return false;
ObjectId layerId=lt[layerName];//获取名为layerName的层表记录的Id
//以写的方式打开名为layerName的层表记录
LayerTableRecord ltr=(LayerTableRecord)layerId.GetObject(OpenMode.ForWrite);
//设置图层的颜色
ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex);
ltr.DowngradeOpen();//为了安全,将图层的状态切换为读
return true;//设置图层颜色成功
}
/// <summary>
/// 将指定的图层设置为当前层
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="layerName">图层名</param>
/// <returns>如果设置成功,则返回ture</returns>
public static bool SetCurrentLayer(this Database db, string layerName)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
//如果不存在名为layerName的图层,则返回
if (!lt.Has(layerName)) return false;
//获取名为layerName的层表记录的Id
ObjectId layerId=lt[layerName];
//如果指定的图层为当前层,则返回
if (db.Clayer == layerId) return false;
db.Clayer = layerId;//指定当前层
return true;//指定当前图层成功
}
/// <summary>
/// 获取当前图形中所有的图层
/// </summary>
/// <param name="db">数据库对象</param>
/// <returns>返回所有的层表记录</returns>
public static List<LayerTableRecord> GetAllLayers(this Database db)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
//用于返回层表记录的列表
List<LayerTableRecord> ltrs=new List<LayerTableRecord>();
foreach (ObjectId id in lt)//遍历层表
{
//打开层表记录
LayerTableRecord ltr=(LayerTableRecord)id.GetObject(OpenMode.ForRead);
ltrs.Add(ltr);//添加到返回列表中
}
return ltrs;//返回所有的层表记录
}
/// <summary>
/// 删除指定名称的图层
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="layerName">图层名</param>
/// <returns>如果删除成功,则返回true,否则返回false</returns>
public static bool DeleteLayer(this Database db, string layerName)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
//如果层名为0或Defpoints,则返回(这两个图层不能删除)
if (layerName == "0" || layerName == "Defpoints") return false;
//如果不存在名为layerName的图层,则返回
if (!lt.Has(layerName)) return false;
ObjectId layerId=lt[layerName];//获取名为layerName的层表记录的Id
//如果要删除的图层为当前层,则返回(不能删除当前层)
if (layerId == db.Clayer) return false;
//打开名为layerName的层表记录
LayerTableRecord ltr=(LayerTableRecord)layerId.GetObject(OpenMode.ForRead);
//如果要删除的图层包含对象或依赖外部参照,则返回(不能删除这些层)
lt.GenerateUsageData();
if (ltr.IsUsed) return false;
ltr.UpgradeOpen();//切换层表记录为写的状态
ltr.Erase(true);//删除名为layerName的图层
return true;//删除图层成功
}
/// <summary>
/// 获取所有图层的ObjectId
/// </summary>
/// <param name="db">数据库对象</param>
/// <returns>返回所有图层的ObjectId</returns>
public static List<ObjectId> GetAllLayerObjectIds(this Database db)
{
//打开层表
LayerTable lt=(LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead);
//用于返回层表记录ObjectId的列表
List<ObjectId> ltrs=new List<ObjectId>();
//遍历层表
foreach (ObjectId id in lt)
{
ltrs.Add(id);//添加到返回列表中
}
return ltrs;//返回所有的层表记录的ObjectId
}
}
}