Window(窗口选择)实现
调用 Editor.SelectWindow() 方法,传入矩形的两个对角点(如起点和终点),仅选中完全位于矩形内的对象。
csharp
/// <summary>
/// 窗口选择(Window):选中完全位于矩形内的对象
/// </summary>
public void WindowSelection()
{
// 提示用户输入矩形的两个对角点
PromptPointResult p1Res = ed.GetPoint("\n指定窗口选择第一角点: ");
if (p1Res.Status != PromptStatus.OK) return;
Point3d p1 = p1Res.Value;
PromptPointResult p2Res = ed.GetPoint(p1, "\n指定窗口选择对角点: ");
if (p2Res.Status != PromptStatus.OK) return;
Point3d p2 = p2Res.Value;
// 执行窗口选择(完全包含在矩形内的对象)
PromptSelectionResult selRes = ed.SelectWindow(p1, p2);
if (selRes.Status == PromptStatus.OK)
{
ed.WriteMessage($"\n窗口选择成功,共选中 {selRes.Value.Count} 个对象");
}
else
{
ed.WriteMessage("\n未选中任何对象");
}
}
3. Crossing(交叉选择)实现
调用 Editor.SelectCrossingWindow() 方法,传入同样的对角点,选中部分位于矩形内或与矩形边界相交的对象。
csharp
/// <summary>
/// 交叉选择(Crossing):选中部分位于矩形内或与矩形相交的对象
/// </summary>
public void CrossingSelection()
{
// 提示用户输入矩形的两个对角点(与窗口选择操作相同)
PromptPointResult p1Res = ed.GetPoint("\n指定交叉选择第一角点: ");
if (p1Res.Status != PromptStatus.OK) return;
Point3d p1 = p1Res.Value;
PromptPointResult p2Res = ed.GetPoint(p1, "\n指定交叉选择对角点: ");
if (p2Res.Status != PromptStatus.OK) return;
Point3d p2 = p2Res.Value;
// 执行交叉选择(部分在矩形内或相交的对象)
PromptSelectionResult selRes = ed.SelectCrossingWindow(p1, p2);
if (selRes.Status == PromptStatus.OK)
{
ed.WriteMessage($"\n交叉选择成功,共选中 {selRes.Value.Count} 个对象");
}
else
{
ed.WriteMessage("\n未选中任何对象");
}
}
关键说明
1. 选择模式的核心区别:
- SelectWindow(p1, p2) :内部自动按“完全包含”规则筛选对象(对应 Window 模式)。
- SelectCrossingWindow(p1, p2) :内部按“部分包含或相交”规则筛选(对应 Crossing 模式)。
2. 坐标与区域:
传入的 p1 和 p2 是矩形的任意两个对角点(无需区分左右/上下),CAD 会自动计算矩形范围。
3. 扩展:结合选择过滤
可通过 SelectionFilter 进一步限制选择对象类型(如只选直线、圆),例如:
csharp
// 只选择直线(过滤其他对象)
SelectionFilter filter = new SelectionFilter(new TypedValue[] {
new TypedValue((int)DxfCode.Start, "LINE")
});
// 在选择时传入过滤器
PromptSelectionResult selRes = ed.SelectWindow(p1, p2, filter);
通过以上代码,即可在程序中主动触发 Window 或 Crossing 选择,实现与手动框选相同的效果