明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 504|回复: 3

C# 視口刷標註線型比例的刷子

  [复制链接]
发表于 2023-10-18 22:41 | 显示全部楼层 |阅读模式
本帖最后由 箭头_Row 于 2023-10-30 01:03 编辑

以下是一個CAD佈局中選擇視口,將視口比例附著給標註線形比例的程序:

大致編程思路:
  • 第一步:輸入調試命令:mydemo
  • 第二步:在佈局中選擇視口。
  • 第三步:框選過濾出標註,并將視口比例附給標註線形比例。

還有一些BUG需要修改,就是多加兩個判斷:
  • 判斷當前空間是否為圖紙空間。
  • 判斷是否在視口外。
以上兩個判斷目前還沒測試。

以上問題均已解決,源碼詳見三樓:有些無用代碼未作刪除,請自行整理。

  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.DatabaseServices;

  6. namespace ArrowTools
  7. {
  8.     public class Demo
  9.     {
  10.         public static double ar_ViewportCustomScale()
  11.         {
  12.             // Get the current document and database
  13.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  14.             Database acCurDb = acDoc.Database;

  15.             // Get the current document
  16.             Editor acDocEd = acDoc.Editor;

  17.             PromptEntityResult acSSPrompt = acDocEd.GetEntity("选择视口");

  18.             double acScale;  //用于存储提取的视口比例值
  19.             acScale = 0;
  20.             // If the prompt status is OK, objects were selected
  21.             if (acSSPrompt.Status == PromptStatus.OK)
  22.             {
  23.                 ObjectId acSSet = acSSPrompt.ObjectId;
  24.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  25.                 {
  26.                     Entity acEnt = acTrans.GetObject(acSSet,
  27.                                                            OpenMode.ForRead) as Entity;
  28.                     //Application.ShowAlertDialog("选择实体的类别: " + acEnt.GetType().Name + "\n"
  29.                     //                       //+ "选择实体的图层: " + acEnt.Layer.ToString() + "\n"
  30.                     //                       //+ "选择实体的颜色: " + acEnt.Color.ToString()
  31.                     //                       + "选择实体的ID: " + acEnt.ObjectId);

  32.                     if (acEnt.GetType().Name == "Viewport")
  33.                     {
  34.                         Viewport acVport;
  35.                         acVport = acTrans.GetObject(acEnt.ObjectId, OpenMode.ForRead) as Viewport;
  36.                         //double rounded = Math.Round(acVport.CustomScale, 9);
  37.                         double UnroundedacScale;
  38.                         UnroundedacScale = 1 / acVport.CustomScale;
  39.                         acScale = Math.Round(UnroundedacScale, 14);

  40.                         Application.ShowAlertDialog("视口比例: " + acScale + "\n"
  41.                                                       + "视口中心: " + acVport.CenterPoint + "\n"
  42.                                                       //+ "视口长度: " + acVport.Width + "\n"
  43.                                                       //+ "视口宽度: " + acVport.Height + "\n"
  44.                                                       + "是否锁定: " + acVport.Locked);
  45.                     }
  46.                     else
  47.                     {
  48.                         Application.ShowAlertDialog("必须选择视口,否则程序中止!!!!");
  49.                     }
  50.                     return acScale;
  51.                 }
  52.             }
  53.             else
  54.             {
  55.                 Application.ShowAlertDialog("须选择视口!");
  56.                 return acScale;
  57.             }
  58.         }

  59.         [CommandMethod("MyDemo", CommandFlags.UsePickSet)]
  60.         public static void at_dim()
  61.         {
  62.             double acScale = ar_ViewportCustomScale();
  63.             if (acScale == 0)
  64.             {
  65.                 Application.ShowAlertDialog("必须选择视口,程序已中止!!!!");
  66.             }
  67.             else if (acScale % 1 != 0)
  68.             {
  69.                 Application.ShowAlertDialog("视口比例错误,检查视口比例!!!!");
  70.             }
  71.             else
  72.             {
  73.                 // Get the current document and database
  74.                 Document acDoc = Application.DocumentManager.MdiActiveDocument;
  75.                 Database acCurDb = acDoc.Database;

  76.                 // Get the current document editor
  77.                 Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;

  78.                 // Create a TypedValue array to define the filter criteria
  79.                 TypedValue[] acTypValAr = new TypedValue[1];
  80.                 acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "DIMENSION"), 0);

  81.                 // Assign the filter criteria to a SelectionFilter object
  82.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);

  83.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  84.                 {
  85.                     // Request for objects to be selected in the drawing area
  86.                     PromptSelectionResult acSSPrompt;
  87.                     acSSPrompt = acDocEd.GetSelection(acSelFtr);

  88.                     // If the prompt status is OK, objects were selected
  89.                     if (acSSPrompt.Status == PromptStatus.OK)
  90.                     {
  91.                         SelectionSet acSSet = acSSPrompt.Value;

  92.                         Application.ShowAlertDialog("选中对象数量: " +
  93.                                                     acSSet.Count.ToString());

  94.                         // Step through the objects in the selection set
  95.                         foreach (SelectedObject acSSObj in acSSet)
  96.                         {
  97.                             // Check to make sure a valid SelectedObject object was returned
  98.                             if (acSSObj != null)
  99.                             {
  100.                                 // Open the selected object for write
  101.                                 Dimension acDim;
  102.                                 acDim = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite) as Dimension;
  103.                                 //Application.ShowAlertDialog("标注比例: " + acDim.Dimscale + "\n"
  104.                                 //                         + "标注线形比例: " + acDim.Dimlfac + "\n"
  105.                                 //                         + "标注样式: " + acDim.DimensionStyleName + "\n"  /* + "+" + acDim.Annotative + "+" + acDim.IsModified */
  106.                                 //                         + "标注图层和颜色: " + acDim.Layer.ToString() + "+" + acDim.ColorIndex.ToString()
  107.                                 //                        );

  108.                                 // Change the object's 属性
  109.                                 acDim.ColorIndex = 0;
  110.                                 acDim.Dimscale = 1;
  111.                                 acDim.Dimlfac = acScale;
  112.                             }
  113.                         }
  114.                         // Save the new object to the database
  115.                         acTrans.Commit();
  116.                     }
  117.                     else
  118.                     {
  119.                         Application.ShowAlertDialog("Number of objects selected: 0");
  120.                     }
  121.                 }
  122.             }
  123.         }
  124.     }
  125. }

评分

参与人数 1明经币 +1 收起 理由
d1742647821 + 1 赞一个!

查看全部评分

发表于 2023-10-19 08:50 | 显示全部楼层
厉害了我的哥
 楼主| 发表于 2023-10-30 00:59 | 显示全部楼层
本帖最后由 箭头_Row 于 2023-12-12 03:11 编辑

文件一名稱:Viewport.cs

  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;

  5. namespace ArrowTools
  6. {
  7.     public static partial class Viewport
  8.     {
  9.         /// <summary>
  10.         ///功能一:布局中选择视口将比例附着给标注。
  11.         ///功能二:设置标注比例:(DIMSCALE:DIMLFAC=1:{acScale}。
  12.         /// </summary>
  13.         [CommandMethod("acViewportScaleToDim")]
  14.         public static void acViewportScaleToDim()
  15.         {
  16.             // Get the current document and database
  17.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  18.             Database acCurDb = acDoc.Database;

  19.             // Get the current document editor
  20.             Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;

  21.             ////定义当前活动Space
  22.             //string acSpace;
  23.             //acSpace = Tools.acSpaceName();

  24.             //if (acSpace == "*Model_Space")
  25.             //{
  26.             //    Tools.SetFirstLayoutAsCurrent();
  27.             //}
  28.             //else
  29.             //{
  30.             //}

  31.             //定义当前活动acLayout
  32.             string acLayout = Tools.acLayoutName();

  33.             //判断活动空间是否为模型空间
  34.             if (acLayout == "Model")
  35.             {
  36.                 Tools.SetFirstLayoutAsCurrent();
  37.             }
  38.             else
  39.             {
  40.                 //执行命令ps,将鼠标切换至视口外
  41.                 //acDocEd.Command("SPACE");
  42.                 acDocEd.SwitchToPaperSpace();//执行命令SwitchToPaperSpace(),将鼠标切换至视口外
  43.             }

  44.             //定义当前视绘图比例
  45.             double acScale;
  46.             acScale = Tools.acViewportCustomScale();

  47.             //判断当前绘图比例的值
  48.             if (acScale == 0)
  49.             {
  50.                 //Application.ShowAlertDialog("必须选择视口,程序已中止!!!!");
  51.             }
  52.             else if (acScale % 5 == 0 || acScale == 1 || acScale == 2 || acScale == 3 || acScale == 5 || acScale == 6 || acScale == 8)
  53.             {
  54.                 Tools.acScaleToDim(acScale);

  55.                 // Set system variable to new value
  56.                 Application.SetSystemVariable("DIMLFAC", acScale);
  57.                 Application.SetSystemVariable("DIMSCALE", 1);

  58.                 // 命令行提示
  59.                 Application.ShowAlertDialog($"标注比例已修改DIMSCALE:DIMLFAC = 1:{acScale})");

  60.             }
  61.             else
  62.             {
  63.                 Application.ShowAlertDialog("视口比例错误(非整数),检查视口比例!!!!");
  64.             }
  65.         }
  66.     }
  67. }


文件二名稱:Tools.cs

  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using System;

  5. namespace ArrowTools
  6. {
  7.     public static partial class Tools
  8.     {
  9.         /// <summary>
  10.         /// 执行:拾起视口 "acScale"
  11.         /// </summary>
  12.         /// <returns></returns>
  13.         public static double acViewportCustomScale()
  14.         {
  15.             double acScale;  //定义当前视口比例
  16.             acScale = 0;
  17.             // Get the current document and database
  18.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  19.             Database acCurDb = acDoc.Database;

  20.             // Get the current document
  21.             Editor acDocEd = acDoc.Editor;

  22.             PromptEntityResult acSSPrompt = acDocEd.GetEntity("选择视口");

  23.             //判断是否选择了图元
  24.             if (acSSPrompt.Status == PromptStatus.OK)
  25.             {
  26.                 ObjectId acSSet = acSSPrompt.ObjectId;
  27.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  28.                 {
  29.                     Entity acEnt = acTrans.GetObject(acSSet, OpenMode.ForRead) as Entity;
  30.                     //判断选择的对象是否为视口
  31.                     if (acEnt.GetType().Name == "Viewport")
  32.                     {
  33.                         Autodesk.AutoCAD.DatabaseServices.Viewport acVport;
  34.                         acVport = acTrans.GetObject(acEnt.ObjectId, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Viewport;

  35.                         //定义当前视口比例
  36.                         double UnroundedacScale;
  37.                         UnroundedacScale = 1 / acVport.CustomScale;

  38.                         //取整当前视口比例,因为取倒数后计算存在偏差。
  39.                         acScale = Math.Round(UnroundedacScale, 10);
  40.                         Application.ShowAlertDialog("视口比例: " + acScale + "    "
  41.                                                     + "是否锁定: " + acVport.Locked);
  42.                     }
  43.                     else
  44.                     {
  45.                         Application.ShowAlertDialog("必须选择视口,程序已经中止!!!!");
  46.                     }
  47.                     return acScale;
  48.                 }
  49.             }
  50.             else
  51.             {
  52.                 Application.ShowAlertDialog("必须选择视口!");
  53.                 return acScale;
  54.             }
  55.         }

  56.         /// <summary>
  57.         /// 输入:视口比例
  58.         /// 执行:框选对象,将"acScale"附加给标注
  59.         /// </summary>
  60.         /// <param name="acScale"></param>
  61.         public static void acScaleToDim(double acScale)
  62.         {
  63.             // Get the current document and database
  64.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  65.             Database acCurDb = acDoc.Database;

  66.             // Get the current document
  67.             Editor acDocEd = acDoc.Editor;

  68.             // Create a TypedValue array to define the filter criteria
  69.             TypedValue[] acTypValAr = new TypedValue[1];
  70.             acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "DIMENSION"), 0);

  71.             // Assign the filter criteria to a SelectionFilter object
  72.             SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);

  73.             // 创建一个选择选项对象
  74.             PromptSelectionOptions acPSOptions = new PromptSelectionOptions();
  75.             acPSOptions.MessageForAdding = "选择对象(过滤条件:标注):";

  76.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  77.             {
  78.                 // 调用GetSelection方法,并传递选择选项参数
  79.                 PromptSelectionResult acSSPrompt;
  80.                 //acSSPrompt = acDocEd.GetSelection(acSelFtr);
  81.                 acSSPrompt = acDocEd.GetSelection(acPSOptions, acSelFtr);

  82.                 // If the prompt status is OK, objects were selected
  83.                 if (acSSPrompt.Status == PromptStatus.OK)
  84.                 {
  85.                     SelectionSet acSSet = acSSPrompt.Value;

  86.                     Application.ShowAlertDialog("已修改标注属性数量: " +
  87.                                                                 acSSet.Count.ToString());

  88.                     // Step through the objects in the selection set
  89.                     foreach (SelectedObject acSSObj in acSSet)
  90.                     {
  91.                         // Check to make sure a valid SelectedObject object was returned
  92.                         if (acSSObj != null)
  93.                         {
  94.                             // Open the selected object for write
  95.                             Dimension acDim;
  96.                             acDim = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite) as Dimension;
  97.                             //Application.ShowAlertDialog("标注比例: " + acDim.Dimscale + "\n"
  98.                             //                         + "标注线形比例: " + acDim.Dimlfac + "\n"
  99.                             //                         + "标注样式: " + acDim.DimensionStyleName + "\n"  /* + "+" + acDim.Annotative + "+" + acDim.IsModified */
  100.                             //                         + "标注图层和颜色: " + acDim.Layer.ToString() + "+" + acDim.ColorIndex.ToString()
  101.                             //                        );

  102.                             // 修改选择对象的属性:颜色、标注比例、线形比例
  103.                             acDim.ColorIndex = 0;
  104.                             acDim.Dimscale = 1;
  105.                             acDim.Dimlfac = acScale;
  106.                         }
  107.                     }
  108.                     // Save the new object to the database
  109.                     acTrans.Commit();
  110.                 }
  111.                 else
  112.                 {
  113.                     Application.ShowAlertDialog("已修改标注属性数量: 0");
  114.                 }
  115.             }
  116.         }

  117.         /// <summary>
  118.         /// 功能:活动空间切换至图纸的第一个布局空间
  119.         /// </summary>
  120.         public static void SetFirstLayoutAsCurrent()
  121.         {
  122.             // 获取当前文档和数据库
  123.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  124.             Database acCurDb = acDoc.Database;

  125.             // Get the current document
  126.             Editor acDocEd = acDoc.Editor;

  127.             // 启动事务
  128.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  129.             {
  130.                 // 获取布局字典
  131.                 DBDictionary layoutDic = acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;

  132.                 // 定义要切换的布局空间的名称
  133.                 string firstLayout = "";

  134.                 // 遍历布局字典,找到第一个非模型空间的布局
  135.                 foreach (DBDictionaryEntry entry in layoutDic)
  136.                 {
  137.                     if (entry.Key != "Model")
  138.                     {
  139.                         // 记录该布局的名称
  140.                         firstLayout = entry.Key;
  141.                         break;
  142.                     }
  143.                 }

  144.                 // 如果找到了第一个非模型空间的布局,则切换至该布局空间
  145.                 if (firstLayout != "")
  146.                 {
  147.                     // 获取布局管理器
  148.                     LayoutManager acSpace = LayoutManager.Current;

  149.                     // 切换至该布局空间
  150.                     acSpace.CurrentLayout = firstLayout;
  151.                     acDocEd.WriteMessage($"\n已切换至布局:{firstLayout}。");
  152.                 }
  153.                 else
  154.                 {
  155.                     // 提示用户不存在非模型空间的布局
  156.                     acDocEd.WriteMessage("\n当前图纸不存在非模型空间的布局,请先创建至少一个布局。");
  157.                 }

  158.                 //提交事务
  159.                 acTrans.Commit();
  160.             }
  161.         }

  162.         /// <summary>
  163.         /// 功能:读取当前空间名称
  164.         /// </summary>
  165.         /// <returns></returns>返回spaceName變量的值
  166.         public static string acSpaceName() // 修改返回類型為string
  167.         {
  168.             // Get the current document and database
  169.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  170.             Database acCurDb = acDoc.Database;

  171.             // 獲取當前space的對象ID
  172.             ObjectId acSpaceId = acCurDb.CurrentSpaceId;

  173.             // 定義一個string變量,用於存儲space名稱
  174.             string acSpaceName = "";

  175.             // 開始一個事務
  176.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  177.             {
  178.                 // Open the Block table record Model space for write
  179.                 BlockTableRecord acBlkTblRec;
  180.                 acBlkTblRec = acTrans.GetObject(acSpaceId,
  181.                                        OpenMode.ForWrite) as BlockTableRecord;

  182.                 acSpaceName = acBlkTblRec.Name;

  183.             }
  184.             // 返回spaceName變量的值
  185.             return acSpaceName;
  186.         }

  187.         /// <summary>
  188.         /// 获取活动空间名称:布局或“Model”
  189.         /// </summary>
  190.         /// <returns></returns>活动空间名称
  191.         public static string acLayoutName()
  192.         {
  193.             // 獲取佈局管理器實例
  194.             LayoutManager acLM = LayoutManager.Current;
  195.             //当前布局名称
  196.             string acLayoutName = acLM.CurrentLayout;

  197.             return acLayoutName;
  198.         }

  199.         /// <summary>
  200.         /// 功能:先选择对象、再合并为多段线。
  201.         /// </summary>
  202.         /// <returns></returns>选择集
  203.         public static SelectionSet SelectedJoinToPolylines()
  204.         {
  205.             Document doc = Application.DocumentManager.MdiActiveDocument;
  206.             Database db = doc.Database;
  207.             Editor ed = doc.Editor;

  208.             // Prompt user to select polylines
  209.             PromptSelectionResult selectionResult = ed.GetSelection();

  210.             // Create a selection set from the user's selection
  211.             SelectionSet ss = selectionResult.Value;

  212.             if (selectionResult.Status != PromptStatus.OK || ss.Count == 1)
  213.             {
  214.                 return null;
  215.             }
  216.             else
  217.             {
  218.                 // Execute the JOIN command on the selected polylines
  219.                 ed.Command("_JOIN", ss, "");

  220.                 ed.WriteMessage($"{ss.Count} 个对象已转换为多段线.");
  221.                 return ss;
  222.             }
  223.         }
  224.     }
  225. }

发表于 2023-12-11 15:46 | 显示全部楼层
写的不错给你点赞!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 23:59 , Processed in 0.549892 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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