得到图上的对象,使用控件提供的构造选择集功能,构造选择集类:MxDrawSelectionSet,详细帮助参考:http://www.mxdraw.com/help/IMxDrawSelectionSet.htm, 选择集类提供了得到图上所有对象,得到当前选择对象,得到指定范围内的对象函数,在得到对象的时还可以设置过滤条件,比如得到某类,某个图层上的对象。
构造选择集使用例子:点击此处下载演示实例。
支持如下过滤条件
| 参数类型 | 类型 | |
|---|---|---|
| 5020 | TEXT | 文字 |
| MTEXT | 多行文字 | |
| CIRCLE | 圆 | |
| ARC | 圆弧 | |
| LINE | 线 | |
| LWPOLYLINE | 多段线 | |
| INSERT | 图块 | |
| ELLIPSE | 椭圆 | |
| SPLINE | 样条线 | |
| LinkLine | 超链接 | |
| 8 | 图层 | |
| 2 | 图块 | |
| -4 | 通配符 | |
| 62 | 颜色索引 | |
| -3 | 扩展数据 | |
视频如下:
如下c#代码,得到0层上面,颜色索引值是1,的所有直线和圆弧如下:
private void SelectAssign()
{
//创建选择集
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
// "0",是图层名,8是DXF码,代表"0"是个图层字符串。
// 选择 0层上的实体。
spFilte.AddStringEx("0", 8);
// 选择直线或圆弧实体。5020是DXF码,代表"LINE"是类型字符串。
spFilte.AddStringEx("LINE,ARC", 5020);
// 选择红色的实体。1为颜色索引值,代表红色。 62是DXF码,但1是个颜色类型。
spFilte.AddLongEx(1, 62);
ss.Select2(MCAD_McSelect.mcSelectionSetAll, null, null, null, spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}如下c#代码,得到0层上面,颜色索引值是1,的所有直线和圆弧如下:
例如: C# 扩展数据值过滤选择, 下面,代码得到图上所有直线,并且有扩展数据,扩展数据名为TestApp,Long组码为1071,值为:77678 的直线。
MxDrawResbuf filter = new MxDrawResbuf();
filter.AddStringEx("LINE", 5020);
filter.AddAppName("TestApp");
filter.AddLongEx(77678, 1071);
MxDrawSelectionSet ss = new MxDrawSelectionSet();
ss.AllSelect(filter);
MessageBox.Show(ss.Count.ToString() );主要用到函数说明:
IMxDrawSelectionSet::Select2
构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] MCAD_McSelect Mode | 构造选择集方式 |
[in] VARIANT point1 | 构造择择集时需要使用到的点对象 |
[in] VARIANT point2 | 构造择择集时需要使用到的点对象 |
[in,optional] VARIANT filterType | 构造选择集的过滤数据的类型 |
[in,optional] VARIANT filterData | 构造选择集的过滤数据 |
可以取如下值 | mcSelectionSetWindow = 0, mcSelectionSetCrossing = 1, mcSelectionSetFence = 2, mcSelectionSetPrevious = 3, mcSelectionSetLast = 4, mcSelectionSetAll = 5, 选择图面上的所有实体 mcSelectionSetWindowPolygon = 6, mcSelectionSetCrossingPolygon = 7, mcSelectionSetUserSelect = 8 mcSelectionImpliedSelectSelect = 9,_I 返回当前图上已经选择的实体 |
c#中使用如下:
private void SelectSetAll()
{
// 创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//用户选择对象 得到用户选取的实体
ss.Select2(MCAD_McSelect.mcSelectionSetAll, null, null, null, null);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::AllSelect
得到当前空间的所有实体。详细说明如下:
| 参数 | 说明 |
|---|---|
[in,defaultvalue(NULL)] IMxDrawResbuf* filterData | 过滤条件 |
c#中使用如下:
private void AllSelect()
{
// 创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
// 创建过滤对象.
MxDrawResbuf spFilte = new MxDrawResbuf();
//得到当前空间的所有实体
ss.AllSelect(spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}mcSelectionSetWindow方式:实体对象完全在范围才能得到
主要用到函数说明:
IMxDrawSelectionSet::Select
构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] MCAD_McSelect Mode | 构造选择集方式 |
[in] VARIANT point1 | 构造择择集时需要使用到的点对象 |
[in] VARIANT point2 | 构造择择集时需要使用到的点对象 |
[in,optional] VARIANT filterData | 构造选择集的过滤数据 |
可以取如下值 | mcSelectionSetWindow = 0, mcSelectionSetCrossing = 1, mcSelectionSetFence = 2, mcSelectionSetPrevious = 3, mcSelectionSetLast = 4, mcSelectionSetAll = 5, 选择图面上的所有实体 mcSelectionSetWindowPolygon = 6, mcSelectionSetCrossingPolygon = 7, mcSelectionSetUserSelect = 8 mcSelectionImpliedSelectSelect = 9,_I 返回当前图上已经选择的实体 |
c#中使用如下:
private void SelectWindow()
{
//创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
MxDrawUtility mxUtility = new MxDrawUtility();
//点取范围左上角位置
MxDrawPoint point = (MxDrawPoint)(mxUtility.GetPoint(null, "点取范围左上角位置..."));
//点取范围左下角位置
MxDrawPoint point1 = (MxDrawPoint)(mxUtility.GetPoint(null, "点取范围右下角位置..."));
ss.Select(MCAD_McSelect.mcSelectionSetWindow, point, point1, spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}mcSelectionSetCrossing方式:只要实体对象与给的范围相交,并不需要完全在范围也能得到。
c#中使用如下:
private void SelectCross()
{
//创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
MxDrawUtility mxUtility = new MxDrawUtility();
//点取范围左上角位置
MxDrawPoint point = (MxDrawPoint)(mxUtility.GetPoint(null, "点取范围左上角位置..."));
//点取范围左下角位置
MxDrawPoint point1 = (MxDrawPoint)(mxUtility.GetPoint(null, "点取范围右下角位置..."));
//选取跨范围的实体
ss.Select(MCAD_McSelect.mcSelectionSetCrossing, point, point1, spFilte);
for (var i = 0; i < ss.Count; i++)
{
var ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}c#中使用如下:
private void SelectUserSelect()
{
//创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
//用户选择对象,得到用户选取的实体
ss.Select2(MCAD_McSelect.mcSelectionSetUserSelect, null, null, spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}c#中使用如下:
private void SelectImpliedSelectSelect()
{
//创建选择集
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
ss.Select2(MCAD_McSelect.mcSelectionImpliedSelectSelect, null, null, spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}主要用到函数说明:
IMxDrawSelectionSet::CurrentSelect
得到当前已经选择的实体。详细说明如下:
| 参数 | 说明 |
|---|---|
filterData | 过滤条件 |
c#中使用如下:
private void CurrentSelect()
{
//创建选择集
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
ss.CurrentSelect(spFilte);
int i = 0;
for (; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
if (ent.ObjectName == "McDbLine")
{
MxDrawLine line = (MxDrawLine)ent;
// 是个直线。
MxDrawPoint spt = (MxDrawPoint)line.StartPoint;
MxDrawPoint ept = (MxDrawPoint)line.EndPoint;
MessageBox.Show(spt.x.ToString());
}
else if (ent.ObjectName == "McDbPolyline")
{
MxDrawPolyline polyline = (MxDrawPolyline)ent;
// 是个多义线.
int j = 0;
// 循环,得到端点坐标
for (j = 0; j < polyline.NumVerts; j++)
{
MxDrawPoint pt = polyline.GetPointAt(j);
MessageBox.Show(pt.x.ToString());
}
}
}
}主要用到函数说明:
IMxDrawSelectionSet::SelectAtPoint
在一个点构造选择集。详细说明如下:
| 参数 | 说明 |
|---|---|
[in] IMxDrawPoint* point | 点坐标 |
[in,defaultvalue(NULL)] IMxDrawResbuf* filterData | 过滤条件 |
c#中使用如下:
private void SelectAtPoint()
{
//创建选择集
MxDrawSelectionSet ss = new MxDrawSelectionSet();
//创建过滤对象
MxDrawResbuf spFilte = new MxDrawResbuf();
//在一个点构造选择集
MxDrawPoint vPt = (MxDrawPoint)axMxDrawX1.Call("Mx_NewPoint", "");
axMxDrawX1.NewPoint();
vPt.x = -20;
vPt.y = -20;
ss.SelectAtPoint(vPt, spFilte);
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
MessageBox.Show(ent.ObjectName);
}
}