返回介绍

查找文字

发布于 2023-08-09 23:10:33 字数 5517 浏览 0 评论 0 收藏 0

1.点击此处下载演示实例

视频如下:

2.主要用到函数说明:

(1)_DMxDrawX::NewSelectionSet

实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。

(2)_DMxDrawX::NewResbuf

新创建IMxDrawResbuf对象,构造一个过滤链表。

(3)IMxDrawResbuf::AddStringEx

向链表中增加一个string数据,比如:把文字对象,当着过滤条件。

spFilte.AddStringEx("TEXT,MTEXT",5020);

(4)IMxDrawSelectionSet::Select2

1)根据指定的选择方式在图上构造选择集,详细说明如下:

参数说明
[in] MCAD_McSelect Mode构造选择集方式
[in] VARIANT point1构造择择集时需要使用到的点对象
[in] VARIANT point2构造择择集时需要使用到的点对象
[in,optional] VARIANT filterType构造选择集的过滤数据的类型
[in,optional] VARIANT filterData构造选择集的过滤数据

2)实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。将文字对象当作过滤条件,得到文字对象(此处可以是文字或多行文字)。遍历每个文字对象,将文字放到视区中间并绘制一个标记圆。

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

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

c#findtext.png

查找结果如下图所示:

c#findtext1.png

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

c#findtext2.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文