主要用到函数说明:
_DMxDrawX::NewSelectionSet
实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。
_DMxDrawX::NewResbuf
新创建IMxDrawResbuf对象,构造一个过滤链表。
IMxDrawResbuf::AddStringEx
向链表中增加一个string数据,比如:把文字对象,当着过滤条件。
1
spFilte.AddStringEx("TEXT,MTEXT",5020);
IMxDrawSelectionSet::Select2
根据指定的选择方式在图上构造选择集,详细说明如下:
参数说明
[in] MCAD_McSelect Mode
构造选择集方式
[in] VARIANT point1
构造择择集时需要使用到的点对象
[in] VARIANT point2
构造择择集时需要使用到的点对象
[in,optional] VARIANT filterType
构造选择集的过滤数据的类型
[in,optional] VARIANT filterData
构造选择集的过滤数据
实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。将文字对象当作过滤条件,得到文字对象(此处可以是文字或多行文字)。遍历每个文字对象,将文字放到视区中间并绘制一个标记圆。
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
private void FineText()
{
// 创建选择集对象
MxDrawSelectionSet ss = new MxDrawSelectionSet();
// 创建过滤对象.
MxDrawResbuf spFilte = new MxDrawResbuf();
// 把文字对象,当着过滤条件.
spFilte.AddStringEx("TEXT,MTEXT", 5020);
// 得到图上,所有文字对象.
ss.Select2(MCAD_McSelect.mcSelectionSetAll, null, null, null, spFilte);
// 遍历每个文字.
bool bFind = false;
// 获得输入的文字
string str = textBox1.Text;
for (int i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
if (ent == null)
continue;
if (ent.ObjectName == "McDbText")
{
// 是一个文字
MxDrawText text = (MxDrawText)ent;
string sTxt = text.TextString;
if (sTxt == str)
{
// 找到把文字放到视区中间.
axMxDrawX1.PutEntityInView(ent.ObjectID, 300);
var dLen = axMxDrawX1.ViewLongToDocCoord(80);
// 绘制一个标记圆.
axMxDrawX1.DrawVectorCircle(text.Position.x,
text.Position.y,
dLen, 65280);
bFind = true;
}
}
else if (ent.ObjectName == "McDbMText")
{
// 找到一个多行文字
MxDrawResbuf param = new MxDrawResbuf();
param.AddObjectId(ent.ObjectID);
MxDrawMText mtext = (MxDrawMText)ent;
// 得到多行文字中的,文字内容.
MxDrawResbuf ret = (MxDrawResbuf)axMxDrawX1.CallEx("Mx_GetMTextContent", param);
if (ret.AtString(0) == "Ok")
{
if (ret.AtString(1) == str)
{
// 把文字放到视区.
axMxDrawX1.PutEntityInView(ent.ObjectID, 300);
var dLen = axMxDrawX1.ViewLongToDocCoord(80);
// 绘制一个标记圆.
axMxDrawX1.DrawVectorCircle(mtext.Location.x,
mtext.Location.y,
dLen, 65280);
bFind = true;
break;
}
}
}
}
if (bFind)
MessageBox.Show("找到文字");
else
MessageBox.Show("没有找到文字");
}
用户可以通过点击查找图上文字按钮,在目标文字输入框输入用户需要查找的文字。如下图所示:
查找结果如下图所示:
如果输入目标文字不存在则提示没有找到文字对象,效果如下: