梦想CAD控件COM接口搜索图面上的文字

    xiaoxiao2022-07-03  130

    主要用到函数说明:

     

    _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("没有找到文字");

            }

     

    用户可以通过点击查找图上文字按钮,在目标文字输入框输入用户需要查找的文字。如下图所示:

     

     

    查找结果如下图所示:

     

     

    如果输入目标文字不存在则提示没有找到文字对象,效果如下:

     

    最新回复(0)