活不多说,直接上代码!!!
1、获取所有对象
csharp
public class EntityGetter
{
public static void GetAllEntities()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
// 获取模型空间
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace],
OpenMode.ForRead) as BlockTableRecord;
// 遍历所有实体
foreach (ObjectId objId in btr)
{
Entity ent = trans.GetObject(objId, OpenMode.ForRead) as Entity;
if (ent is Circle)
{
Circle circle = ent as Circle;
ed.WriteMessage($"\n找到圆: 半径 = {circle.Radius}");
}
else if (ent is Line)
{
Line line = ent as Line;
ed.WriteMessage($"\n找到直线: 长度 = {line.Length}");
}
}
}
catch (Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}");
}
trans.Commit();
}
}
}
2、获取特定类型的对象
csharp
public class EntitySelector
{
// 获取圆形对象
public static List<Circle> GetCircles()
{
List<Circle> circles = new List<Circle>();
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
// 创建类型过滤器
TypedValue[] filterList = new TypedValue[]
{
new TypedValue((int)DxfCode.Start, "CIRCLE")
};
SelectionFilter filter = new SelectionFilter(filterList);
PromptSelectionResult selRes = ed.SelectAll(filter);
if (selRes.Status == PromptStatus.OK)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
SelectionSet ss = selRes.Value;
foreach (SelectedObject selObj in ss)
{
Circle circle = trans.GetObject(selObj.ObjectId,
OpenMode.ForRead) as Circle;
if (circle != null)
{
circles.Add(circle);
}
}
trans.Commit();
}
}
return circles;
}
// 获取直线对象
public static List<Line> GetLines()
{
List<Line> lines = new List<Line>();
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
TypedValue[] filterList = new TypedValue[]
{
new TypedValue((int)DxfCode.Start, "LINE")
};
SelectionFilter filter = new SelectionFilter(filterList);
PromptSelectionResult selRes = ed.SelectAll(filter);
if (selRes.Status == PromptStatus.OK)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
SelectionSet ss = selRes.Value;
foreach (SelectedObject selObj in ss)
{
Line line = trans.GetObject(selObj.ObjectId,
OpenMode.ForRead) as Line;
if (line != null)
{
lines.Add(line);
}
}
trans.Commit();
}
}
return lines;
}
}
3、获取对象属性
csharp
public class EntityProperties
{
public static void GetCircleProperties(Circle circle)
{
// 基本属性
Point3d center = circle.Center;
double radius = circle.Radius;
double area = circle.Area;
double circumference = circle.Circumference;
// 图层信息
string layer = circle.Layer;
// 颜色信息
Color color = circle.Color;
// 线型信息
string lineType = circle.Linetype;
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
ed.WriteMessage($"\n圆的属性:");
ed.WriteMessage($"\n中心点: X={center.X}, Y={center.Y}, Z={center.Z}");
ed.WriteMessage($"\n半径: {radius}");
ed.WriteMessage($"\n面积: {area}");
ed.WriteMessage($"\n周长: {circumference}");
ed.WriteMessage($"\n图层: {layer}");
ed.WriteMessage($"\n颜色: {color.ToString()}");
ed.WriteMessage($"\n线型: {lineType}");
}
public static void GetLineProperties(Line line)
{
// 基本属性
Point3d startPoint = line.StartPoint;
Point3d endPoint = line.EndPoint;
double length = line.Length;
Vector3d direction = line.Delta;
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
ed.WriteMessage($"\n直线的属性:");
ed.WriteMessage($"\n起点: X={startPoint.X}, Y={startPoint.Y}, Z={startPoint.Z}");
ed.WriteMessage($"\n终点: X={endPoint.X}, Y={endPoint.Y}, Z={endPoint.Z}");
ed.WriteMessage($"\n长度: {length}");
ed.WriteMessage($"\n方向: X={direction.X}, Y={direction.Y}, Z={direction.Z}");
}
}
4、修改对象属性
csharp
public class EntityModifier
{
public static void ModifyCircle(Circle circle)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
// 打开对象进行写操作
Circle circleToModify = trans.GetObject(circle.ObjectId,
OpenMode.ForWrite) as Circle;
// 修改属性
circleToModify.Radius *= 2; // 双倍半径
circleToModify.ColorIndex = 1; // 改变颜色
trans.Commit();
}
catch (Exception ex)
{
doc.Editor.WriteMessage($"\n错误: {ex.Message}");
trans.Abort();
}
}
}
public static void ModifyLine(Line line)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
Line lineToModify = trans.GetObject(line.ObjectId,
OpenMode.ForWrite) as Line;
// 延长直线
lineToModify.EndPoint = new Point3d(
lineToModify.EndPoint.X * 2,
lineToModify.EndPoint.Y * 2,
lineToModify.EndPoint.Z
);
trans.Commit();
}
catch (Exception ex)
{
doc.Editor.WriteMessage($"\n错误: {ex.Message}");
trans.Abort();
}
}
}
}
5、CAD基本对象
csharp
public class BasicEntities
{
// 2D基本图形
public static readonly string[] Basic2D = {
"Line", // 直线
"Circle", // 圆
"Arc", // 圆弧
"Polyline", // 多段线
"Ellipse", // 椭圆
"Spline", // 样条曲线
"Point", // 点
"Ray", // 射线
"XLine", // 构造线
"Text", // 文字
"MText", // 多行文字
"Rectangle", // 矩形
"Hatch", // 填充
"Region" // 面域
};
// 3D基本图形
public static readonly string[] Basic3D = {
"Solid", // 3D实体
"Surface", // 曲面
"Mesh", // 网格
"Body", // 体
"Face", // 3D面
"PolyFaceMesh", // 多面网格
"SubDMesh" // 细分网格
};
}
6、CAD标注类对象
csharp
public class DimensionEntities
{
public static readonly string[] Dimensions = {
"AlignedDimension", // 对齐标注
"RotatedDimension", // 旋转标注
"DiametricDimension", // 直径标注
"RadialDimension", // 半径标注
"Angular2LineDimension",// 角度标注
"Angular3PointDimension",// 三点角度标注
"OrdinateDimension", // 坐标标注
"ArcDimension", // 弧长标注
"Leader", // 引线
"MLeader", // 多重引线
"Tolerance" // 公差
};
}
7、块和参照
csharp
public class ReferenceEntities
{
public static readonly string[] References = {
"BlockReference", // 块参照
"MInsertBlock", // 阵列块
"ExternalReference", // 外部参照
"RasterImage", // 光栅图像
"OLE2Frame", // OLE对象
"Viewport", // 视口
"UnderlayReference" // 底图参照
};
}
8、表格和布局对象
csharp
public class TableEntities
{
public static readonly string[] Tables = {
"Table", // 表格
"Layout", // 布局
"PlotSettings", // 打印设置
"Group", // 组
"Dictionary", // 字典
"Layer", // 图层
"LayerFilter", // 图层过滤器
"LayerGroup", // 图层组
"PlotStyleName", // 打印样式
"View", // 视图
"UCS", // 用户坐标系
"Section" // 剖面
};
}
9、注释对象
csharp
public class AnnotationEntities
{
public static readonly string[] Annotations = {
"MText", // 多行文字
"Text", // 单行文字
"AttributeDefinition",// 属性定义
"Attribute", // 属性
"DBPoint", // 数据库点
"Wipeout", // 遮罩
"Shape", // 形状
"Mline", // 多线
"Trace", // 痕迹线
"Arc_Dimension", // 弧度标注
"Leader", // 引线
"Tolerance" // 公差
};
}
10、特殊对象
csharp
public class SpecialEntities
{
public static readonly string[] Special = {
"Light", // 灯光
"Camera", // 相机
"Material", // 材质
"Sun", // 太阳
"GeoMap", // 地理位置
"Section", // 剖面
"SectionSettings", // 剖面设置
"DetailViewStyle", // 详图视图样式
"SectionViewStyle", // 剖面视图样式
"TableStyle", // 表格样式
"MLeaderStyle", // 多重引线样式
"DimStyle", // 标注样式
"TextStyle", // 文字样式
"UCSTableRecord", // UCS表记录
"ViewportTableRecord" // 视口表记录
};
}
11、获取对象示例
csharp
public class EntityHelper
{
public static Entity GetEntity(ObjectId id)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(id, OpenMode.ForRead) as Entity;
if (ent != null)
{
// 根据对象类型进行处理
if (ent is Line)
{
Line line = ent as Line;
// 处理直线
}
else if (ent is Circle)
{
Circle circle = ent as Circle;
// 处理圆
}
else if (ent is Polyline)
{
Polyline pline = ent as Polyline;
// 处理多段线
}
// ... 其他类型的处理
}
trans.Commit();
return ent;
}
}
}