明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 323|回复: 9

[【IFoxCAD】] C# 更新圖框日期工具

[复制链接]
发表于 2024-4-15 01:17 | 显示全部楼层 |阅读模式
本帖最后由 箭头_Row 于 2024-4-15 01:59 编辑

功能介紹:更新圖框日期

三種不同圖框繪製方式:
一、以外部參照方式插入到dwg中;
二、以塊方式插入到dwg中;
三、以屬性塊方式插入到dwg中。

下述代碼中命令
大致書寫邏輯:
第一個命令適用于固定名稱的以外部參照插入到dwg中的方式,大型工裝項目的常規繪製方式;

第二個命令適配上述描述的三種不同繪製方式,且未有具體塊名的繪製方式,通用性更優。


具體詳見如下代碼:
如何優化下述代碼?感覺行數有點多,另未封裝及業務邏輯與具體的功能邏輯未完全區分開;


另:Env.Printl("\n图中无图框块,结束命令。");中可取消\n,因以往書寫習慣了,實際測試后對打印無影響,故未替換去除\n

  1. namespace ArrowTools;
  2. public class UpdateTime
  3. {
  4.     public static string DateFormat => DateTime.Today.ToString("yyyy.MM.dd");
  5.     [CommandMethod(nameof(CzV_Update_BlockRef_Time))]
  6.     public void CzV_Update_BlockRef_Time()
  7.     {
  8.         OpFilter filter = OpFilter.Build(e => e.Dxf(0) == "INSERT" & e.Dxf(2) == Layers.TK_Block);
  9.         PromptSelectionResult psr = Env.Editor.SelectAll(filter);
  10.         if (psr.Status != PromptStatus.OK)
  11.         {
  12.             Env.Printl("\n图中无图框块,结束命令。");
  13.             return;
  14.         }

  15.         bool UnhaveDate = true;
  16.         using DBTrans tr = new();
  17.         foreach (var id in psr.Value.GetObjectIds())
  18.         {
  19.             var br = (BlockReference)tr.GetObject(id);
  20.             var btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord);
  21.             if (btr.IsFromExternalReference)
  22.             {
  23.                 using DBTrans trRef = new(btr.GetXrefDatabase(true).Filename);
  24.                 foreach (var idref in trRef.ModelSpace)
  25.                 {
  26.                     var ent = trRef.GetObject(idref);

  27.                     if (ent is DBText dBText)
  28.                     {
  29.                         bool isDateFormat = DateTime.TryParse(dBText.TextString, out _);
  30.                         if (isDateFormat)
  31.                         {
  32.                             UnhaveDate = false;
  33.                             if (dBText.TextString != DateFormat)
  34.                             {
  35.                                 dBText.UpgradeOpen();
  36.                                 dBText.TextString = DateFormat;
  37.                                 dBText.DowngradeOpen();
  38.                                 trRef.Database.SaveAs(btr.GetXrefDatabase(true).Filename, DwgVersion.Current);

  39.                                 tr.XrefFactory(XrefModes.Reload); // 直接更新外部参照块
  40.                                 Env.Printl("\n日期已更新,且已重载外部参照!");
  41.                                 return;
  42.                             }
  43.                             else
  44.                             {
  45.                                 Env.Printl("\n日期已为最新日期,不需更新!");
  46.                                 return;
  47.                             }
  48.                         }
  49.                     }
  50.                 }
  51.             }
  52.         }

  53.         // 如果上面没有返回结束,证明图框中日期格式错误!
  54.         if (UnhaveDate)
  55.             Env.Printl("\n图框中不包含日期,调整后重试!");
  56.     }

  57.     [CommandMethod(nameof(CzV_Update_SelectBlock_Time))]
  58.     public void CzV_Update_SelectBlock_Time()
  59.     {
  60.         PromptEntityOptions entOpts = new("\n选择外部参照块或块(包含日期格式)");
  61.         entOpts.SetRejectMessage("\n必须选择外部参照块或块。");
  62.         entOpts.AddAllowedClass(typeof(BlockReference), false);

  63.         PromptEntityResult per = Env.Editor.GetEntity(entOpts);
  64.         if (per.Status != PromptStatus.OK)
  65.         {
  66.             Env.Printl("\n未选择图框块(包含日期格式),结束命令。");
  67.             return;
  68.         }

  69.         bool UnhaveDate = true;
  70.         using DBTrans tr = new();

  71.         var br = (BlockReference)tr.GetObject(per.ObjectId);
  72.         var btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord);
  73.         if (btr.IsFromExternalReference)
  74.         {
  75.             using DBTrans trRef = new(btr.GetXrefDatabase(true).Filename);
  76.             foreach (var idref in trRef.ModelSpace)
  77.             {
  78.                 var ent = trRef.GetObject(idref);

  79.                 if (ent is DBText dBText)
  80.                 {
  81.                     bool isDateFormat = DateTime.TryParse(dBText.TextString, out _);
  82.                     if (isDateFormat)
  83.                     {
  84.                         UnhaveDate = false;
  85.                         if (dBText.TextString != DateFormat)
  86.                         {
  87.                             dBText.UpgradeOpen();
  88.                             dBText.TextString = DateFormat;
  89.                             dBText.DowngradeOpen();
  90.                             trRef.Database.SaveAs(btr.GetXrefDatabase(true).Filename, DwgVersion.Current);

  91.                             tr.XrefFactory(XrefModes.Reload); // 直接更新外部参照块
  92.                             Env.Printl("\n日期已更新,且已重载外部参照!");
  93.                             return;
  94.                         }
  95.                         else
  96.                         {
  97.                             Env.Printl("\n日期已为最新日期,不需更新!");
  98.                             return;
  99.                         }
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.         else
  105.         {
  106.             foreach (var id in btr)
  107.             {
  108.                 var ent = (Entity)tr.GetObject(id);

  109.                 if (ent is DBText dBText)
  110.                 {
  111.                     bool isDateFormat = DateTime.TryParse(dBText.TextString, out _);
  112.                     if (isDateFormat)
  113.                     {
  114.                         UnhaveDate = false;
  115.                         if (dBText.TextString != DateFormat)
  116.                         {
  117.                             dBText.UpgradeOpen();
  118.                             dBText.TextString = DateFormat;
  119.                             dBText.DowngradeOpen();

  120.                             tr.Editor?.Regen();
  121.                             Env.Printl("\n日期已更新!");
  122.                             return;
  123.                         }
  124.                         else
  125.                         {
  126.                             Env.Printl("\n日期已为最新日期,不需更新!");
  127.                             return;
  128.                         }
  129.                     }
  130.                 }
  131.             }
  132.             if (br.AttributeCollection.Count > 0)
  133.             {
  134.                 foreach (var attObj in br.GetAttributes())
  135.                 {
  136.                     bool isDateFormat = DateTime.TryParse(attObj.TextString, out _);
  137.                     if (isDateFormat)
  138.                     {
  139.                         OpFilter filter = OpFilter.Build(e => e.Dxf(0) == "INSERT" & e.Dxf(2) == br.Name);
  140.                         PromptSelectionResult psr = Env.Editor.SelectAll(filter);

  141.                         tr.UpdateBlockDate(psr.Value, attObj.Tag, out int dateEdeited, out int unEdeited);
  142.                         if (dateEdeited > 0)
  143.                         {
  144.                             Env.Printl($"\n全图日期已更新数量:{dateEdeited}!");
  145.                         }
  146.                         else
  147.                             Env.Printl("\n日期已为最新日期,不需更新!");
  148.                         return;
  149.                     }
  150.                 }
  151.             }
  152.         }

  153.         // 如果上面没有返回结束,证明图框中日期格式错误!
  154.         if (UnhaveDate)
  155.             Env.Printl("\n图框中不包含日期,调整后重试!");
  156.     }
  157. }

  158. public static class UpdateBlockTimes
  159. {
  160.     /// <summary>
  161.     /// 更新圖框日期
  162.     /// </summary>
  163.     /// <param name="tr"></param>
  164.     /// <param name="ss">選擇集結果</param>
  165.     /// <param name="attTag">日期标签</param>
  166.     /// <param name="dateEdeited">日期被修改數量</param>
  167.     /// <param name="unEdeited">日期未被修改數量</param>
  168.     public static void UpdateBlockDate(this DBTrans tr, SelectionSet ss, string attTag, out int dateEdeited, out int unEdeited)
  169.     {
  170.         dateEdeited = 0;
  171.         unEdeited = 0;

  172.         foreach (var id in ss.GetObjectIds())
  173.         {
  174.             var blkatt = (BlockReference)tr.GetObject(id, openMode: OpenMode.ForRead);

  175.             if (blkatt.AttributeCollection.Count > 0)
  176.                 foreach (var attObj in blkatt.GetAttributes())
  177.                 {
  178.                     if (attObj.Tag == attTag)
  179.                     {
  180.                         if (attObj.TextString != UpdateTime.DateFormat)
  181.                         {
  182.                             attObj.UpgradeOpen();
  183.                             attObj.TextString = UpdateTime.DateFormat;
  184.                             dateEdeited++;
  185.                             attObj.DowngradeOpen();
  186.                         }
  187.                         else
  188.                             unEdeited++;
  189.                     }
  190.                 }
  191.         }
  192.     }
  193. }




发表于 2024-4-18 15:51 | 显示全部楼层
属性块,属性文字。字段自动更新你值得拥有
回复 支持 1 反对 0

使用道具 举报

发表于 2024-4-15 08:16 | 显示全部楼层
感谢分享,点赞有了
发表于 2024-4-15 10:24 | 显示全部楼层
感谢分享,点赞
发表于 2024-4-15 21:27 | 显示全部楼层
建议作者来个图示意一下那样会更直观
发表于 2024-4-17 21:30 | 显示全部楼层
不要写过滤器了啊,难道你都不看我文章,直接多线程构造索引.
 楼主| 发表于 2024-4-18 21:09 | 显示全部楼层
你有种再说一遍 发表于 2024-4-17 21:30
不要写过滤器了啊,难道你都不看我文章,直接多线程构造索引.

多線程構造索引在哪個帖子里?
 楼主| 发表于 2024-4-18 21:12 | 显示全部楼层
qq1254582201 发表于 2024-4-18 15:51
属性块,属性文字。字段自动更新你值得拥有

問題是字段很多人不知道怎麼用,重新保存一次日期就會變,發給甲方或第三方老是投訴很煩。這個所見即所得。
发表于 2024-4-18 22:08 | 显示全部楼层
箭头_Row 发表于 2024-4-18 21:09
多線程構造索引在哪個帖子里?

就是打开图纸事件上面写一个并行遍历句柄,获取全图的图元类型add到词典
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-30 20:58 , Processed in 0.738436 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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