得到图上的对象,使用控件提供的构造选择集功能,构造选择集类: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); } }