明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2893|回复: 5

[事件] 点与坐标文字关联

[复制链接]
发表于 2015-9-11 14:09:08 | 显示全部楼层 |阅读模式
该程序为根据扩展信息来判断关联。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Autodesk.AutoCAD.Geometry;
  9. using DotNetARX;
  10. using System.Text.RegularExpressions;
  11. using Autodesk.AutoCAD.Windows;
  12. using System.Windows.Forms;
  13. namespace MoveCircleEvent
  14. {
  15.     public class MovePoint
  16.     {
  17.         Database db = HostApplicationServices.WorkingDatabase;
  18.         Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  19.         Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  20.         bool bMove;
  21.         Point3d startPoint;

  22.         void commandWillStart(object sender, CommandEventArgs e)
  23.         {
  24.             //设置全局变量bMove为True,表示移动命令开始
  25.             bMove = true;
  26.         }

  27.         void objectOpenedForModify(object sender, ObjectEventArgs e)
  28.         {
  29.             //判断AutoCAD命令是否为移动
  30.             if (bMove == false)
  31.                 //如果AutoCAD命令为非移动,则返回
  32.                 return;
  33.             DBPoint pt = e.DBObject as DBPoint;
  34.             //判断将要移动的对象是否为
  35.             if (pt != null)
  36.             {
  37.                 //获取文字的中心,就是同心文字的文字心
  38.                 startPoint = pt.Position;
  39.             }
  40.         }
  41.         /// <summary>
  42.         /// 去掉字符串中的数字及小数点
  43.         /// </summary>
  44.         /// <param name="key"></param>
  45.         /// <returns></returns>
  46.         public static string RemoveNumber(string key)
  47.         {
  48.             return System.Text.RegularExpressions.Regex.Replace(key, @"[\d \.]", "");
  49.         }


  50.         /// <summary>
  51.         /// 去掉字符串中的字母及等号
  52.         /// </summary>
  53.         /// <param name="key"></param>
  54.         /// <returns></returns>
  55.         public static string RemoveNotNumber(string key)
  56.         {

  57.             return System.Text.RegularExpressions.Regex.Replace(key, @"[A-Z a-z \=]*", "");
  58.         }

  59.         void objectModified(object sender, ObjectEventArgs e)
  60.         {
  61.             //判断AutoCAD命令是否为移动
  62.             if (bMove == false)
  63.                 //如果AutoCAD命令为非移动,则返回
  64.                 return;
  65.             //断开所有的事件处理函数
  66.             removeEvents();
  67.             //判断移动过的对象是否为点
  68.             DBPoint startPoint = e.DBObject as DBPoint;
  69.             if (startPoint == null)
  70.                 return;
  71.             //设置选择集过滤器,只选择图形中的文字
  72.             TypedValueList values = new TypedValueList();
  73.             values.Add(typeof(DBText));
  74.             SelectionFilter filter = new SelectionFilter(values);
  75.             PromptSelectionResult resSel = ed.SelectAll(filter);
  76.             //如果选择的是文字
  77.             if (resSel.Status == PromptStatus.OK)
  78.             {
  79.                 //获取选择集中的文字对象
  80.                 SelectionSet sSet = resSel.Value;
  81.                 ObjectId[] ids = sSet.GetObjectIds();
  82.                 //开始事务处理
  83.                 try
  84.                 {
  85.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  86.                     {

  87.                         TypedValueList list1 = startPoint.ObjectId.GetXData("测点");
  88.                         if (list1 == null)
  89.                         {
  90.                             MessageBox.Show("点无扩展信息");
  91.                         }
  92.                         //循环遍历选择集中的文字
  93.                         foreach (ObjectId id in ids)
  94.                         {
  95.                             //以读的方式打开文字对象
  96.                             DBText followText = trans.GetObject(id, OpenMode.ForRead) as DBText;
  97.                             double fText = Convert.ToDouble(RemoveNotNumber(followText.TextString.ToString()));
  98.                             string qText = RemoveNumber(followText.TextString.ToString());
  99.                             TypedValueList list2 = id.GetXData("测点");
  100.                             string mc1 = "a", mc2 = "b", dh1 = "c", dh2 = "d";
  101.                             if (list2 != null)
  102.                             {
  103.                                 mc1 = Convert.ToString(list1[0].Value.ToString());
  104.                                 mc2 = Convert.ToString(list2[0].Value.ToString());
  105.                                 dh1 = Convert.ToString(list1[2].Value.ToString());
  106.                                 dh2 = Convert.ToString(list2[2].Value.ToString());
  107.                             }
  108.                             else
  109.                             {
  110.                                 continue;
  111.                             }
  112.                             //通过判断点与文字的扩展信息是否相同
  113.                             if (qText == "Y=" && mc1 == mc2 && dh1 == dh2)
  114.                             {
  115.                                 //因为上面以读的方式打开了文字,所以必须改变为写
  116.                                 followText.UpgradeOpen();
  117.                                 //改变文字的内容保持和点位置Y坐标相同
  118.                                 followText.TextString = "Y=" + startPoint.Position.X.ToString("0.000");

  119.                             }
  120.                             else if (qText == "Z=" && mc1 == mc2 && dh1 == dh2)
  121.                             {
  122.                                 //因为上面以读的方式打开了文字,所以为了改变文字的文字心必须改变为写
  123.                                 followText.UpgradeOpen();
  124.                                 //改变文字的内容保持和点位置Z坐标相同
  125.                                 followText.TextString = "Z=" + startPoint.Position.Z.ToString("0.000");
  126.                             }
  127.                             else if (qText == "X=" && mc1 == mc2 && dh1 == dh2)
  128.                             {
  129.                                 //因为上面以读的方式打开了文字,所以为了改变文字的文字心必须改变为写
  130.                                 followText.UpgradeOpen();
  131.                                 //改变文字的内容保持和点位置X坐标相同
  132.                                 followText.TextString = "X=" + startPoint.Position.Y.ToString("0.000");

  133.                             }
  134.                         }
  135.                         //提交事务处理
  136.                         trans.Commit();
  137.                     }
  138.                 }
  139.                 catch
  140.                 {
  141.                     ed.WriteMessage("\n错误");
  142.                 }
  143.             }
  144.             //连接所有的事件处理函数
  145.             AddEvents();
  146.         }


  147.         void commandEnded(object sender, CommandEventArgs e)
  148.         {
  149.             if (bMove == true)//判断AutoCAD命令是否为移动
  150.                 bMove = false;//设置全局变量bMove为False,表示移动命令结束
  151.         }

  152.         [CommandMethod("Add")]
  153.         public void AddEvents()
  154.         {
  155.             //把事件处理函数与相应的事件进行连接
  156.             db.ObjectOpenedForModify += objectOpenedForModify;
  157.             db.ObjectModified += objectModified;
  158.             doc.CommandWillStart += commandWillStart;
  159.             doc.CommandEnded += commandEnded;
  160.         }

  161.         [CommandMethod("Remove")]
  162.         public void removeEvents()
  163.         {
  164.             //断开所有的事件处理函数
  165.             db.ObjectOpenedForModify -= objectOpenedForModify;
  166.             db.ObjectModified -= objectModified;
  167.             doc.CommandWillStart -= commandWillStart;
  168.             doc.CommandEnded -= commandEnded;
  169.         }
  170.     }
  171. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2020-2-19 21:58:28 | 显示全部楼层
using DotNetARX这个应用的文件呢,建议可以上传到论坛,谢谢了!
发表于 2020-3-31 09:26:27 | 显示全部楼层
就是这么精彩。。
发表于 2020-7-10 18:15:35 | 显示全部楼层
点与坐标文字关联就是这么精彩。。
发表于 2020-8-21 21:33:40 | 显示全部楼层
这个看起来不多的样子
发表于 2020-8-22 09:27:21 | 显示全部楼层
using DotNetARX这个应用的文件呢,建议可以上传到论坛,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-24 01:17 , Processed in 0.203985 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表