箭头_Row 发表于 2024-2-18 05:08:13

命令:封閉空間等分

本帖最后由 箭头_Row 于 2024-2-18 05:36 编辑

命令描述:關於選擇封閉空間后等分命令。

命令步驟:
步驟一:選擇封閉。
步驟二:選擇分割分式。

備註:下述代碼使用了IFox庫。

源碼如下:
namespace ArrowTools;
public class DivisionEX : SettingsClass
{
    public enum FirstKeywords
    {
      
      选取 = 1,
      [Desic virtual string JsonFile() => Path.GetDirectoryName(GetAssemblyPath(true)) + "\\Settings\\";
    public virtual string JsonFile() => Path.GetDirectoryName(ArrowTool.GetAssemblyPath(true)) + $"\\Settings\\{this.GetType().Name}_Settings.json";
    public virtual string JsonString() => JsonConvert.SerializeObject(this, Formatting.Indented);
    public virtual void JsonSaveAs() => File.WriteAllText(JsonFile(), JsonString());
    pubcription("R")]
      两点 = 2,
    }
    public enum Keywords
    {
      
      垂直 = 1,
      
      水平 = 2,
      
      图层 = 4,
      
      数量 = 16,
      
      定距 = 8,
      
      定数,
      
      板厚 = 64,
      
      距离,
      
      中心 = 32,
      
      中有分点,
      
      双线,
      
      加,
      
      减,
      
      加1,
      
      减1,
      
      加一,
      
      减一
    }

    public override string ToString() => JsonString();
    public void PrintKeywordsSettings() =>
      Env.Print($"\n图层:{DivEXLayer}备注:定数模式下 “1”、“2”、“+”、“-”、“W”、“E” 可加减分段数!" +
                  $"\n分割:{DivStyle.GetEnumByDescription<Keywords>()}双线:{(isDoubleLine ? "是" : "否")}距离:{distension}数量:{number}" +
                  $"\n垂线:{(VerticalDivStyle ? "垂直" : "水平")}中心:{(isCenterDivision ? "是" : "否")}中心有线:{(centerHasLine ? "是" : "否")}板厚:{thickness}");
    private static string GetEntityOptionsMessage()
    {
      return "\n点取闭合空间或 [选取(S)/两点(R)] ";
    }
    private string GetOptionsMessage(Line line)
    {
      string msg;
      if (DivStyle == Keywords.定数.GetDesc() && isDoubleLine)
            msg = $"计算结果: \n{DivStyle.GetEnumByDescription<Keywords>()}({Keywords.定数.GetDesc()}) = {Math.Round((line.Length - thickness * (number - 1)) / number, 2)}\n数量({Keywords.数量.GetDesc()}) = {number}({Keywords.加一.GetDesc()}/{Keywords.减一.GetDesc()})\n双线({Keywords.双线.GetDesc()}) = {(isDoubleLine ? "是" : "否")}\n板厚({Keywords.板厚.GetDesc()}) = {thickness}";
      else if (DivStyle == Keywords.定数.GetDesc() && !isDoubleLine)
            msg = $"计算结果: \n{DivStyle.GetEnumByDescription<Keywords>()}({Keywords.定数.GetDesc()}) = {Math.Round(line.Length / number, 2)}\n数量({Keywords.数量.GetDesc()}) = {number}({Keywords.加一.GetDesc()}/{Keywords.减一.GetDesc()})\n双线({Keywords.双线.GetDesc()}) = {(isDoubleLine ? "是" : "否")}";
      else if (DivStyle == Keywords.定距.GetDesc() && isDoubleLine)
            msg = $"计算结果: \n{DivStyle.GetEnumByDescription<Keywords>()}({Keywords.定数.GetDesc()}) = {distension}{Keywords.距离}({Keywords.距离.GetDesc()})\n数量(!) = {Math.Floor(line.Length / (distension + thickness))}\n双线({Keywords.双线.GetDesc()}) = {(isDoubleLine ? "是" : "否")}板厚({Keywords.板厚.GetDesc()}) = {thickness}\n中心({Keywords.中心.GetDesc()}) = {(isCenterDivision ? "是" : "否")}\n中心有线({Keywords.中有分点.GetDesc()}) = {(centerHasLine ? "是" : "否")}";
      else
            msg = $"计算结果: \n{DivStyle.GetEnumByDescription<Keywords>()}({Keywords.定数.GetDesc()}) = {distension}{Keywords.距离}({Keywords.距离.GetDesc()})\n数量(!) = {Math.Floor(line.Length / distension)}\n双线({Keywords.双线.GetDesc()}) = {(isDoubleLine ? "是" : "否")}\n中心({Keywords.中心.GetDesc()}) = {(isCenterDivision ? "是" : "否")}\n中心有线({Keywords.中有分点.GetDesc()}) = {(centerHasLine ? "是" : "否")}";

      return msg;
    }
    public override void ResetLayer()
    {
      DivEXLayer = Layers.EL_30_Name;
      divEXLayerColor = Layers.EL_30_Color;
    }

    // 2024-2-7注意:未實例化的類中標識符 public 將序列化,pravite 不會序列化類;
    // 分割方式:定數 or 垂直
    public string DivStyle { get; set; } = Keywords.定数.GetDesc();
    public bool VerticalDivStyle = false;
    // 圖層默認設置
    public string? DivEXLayer { get; set; }
    public short divEXLayerColor;
    // 2024-2-8:"字段"是直接访问的变量,效率更高,只get无set。
    // 2024-2-8:直接賦值{ get; }=方式值是固定死的,必須使用委託方式寫才會每次都獲取新值。
    static string DivEXHsLayer => HsLayer(HesiStatusBridge.PboCAD.GetLayerStatus(), "18Norm");
    // 分割偏移 bool 設置
    public bool isDoubleLine = true;
    public bool isCenterDivision = true;
    public bool centerHasLine = true;
    // 分割偏移其它值設置
    public int number = 4;
    public double distension = 100;
    public double thickness = 10;

   
    public void CzE_Division_EX()
    {
      InitLayersSettings(this);
      if (this.DivEXLayer == null)
            return;

      bool selectMode = false;
      bool twoPointMode = false;
      Polyline pline = new();

      PromptPointOptions entOpts = new("");
      List<string> myFirstKeywords = CzEnumEx.GetDescriptionList(typeof(FirstKeywords));
      entOpts.AddKeywords(myFirstKeywords);
      entOpts.AppendKeywordsToMessage = false;//不将关键字列表添加到提示信息中
      entOpts.Message = GetEntityOptionsMessage();
      entOpts.AllowNone = true;

      PromptPointResult ppr = Env.Editor.GetPoint(entOpts);
      if (ppr.Status == PromptStatus.OK)
      {
            // 获取Boundary 注意TraceBoundary 中 deleteisland 的设置
            using DBObjectCollection dbo = Env.Editor.TraceBoundary(ppr.Value, false);
            if (dbo.Count != 1)
            {
                Env.Print("\n闭合空间错误,调整后重试!");
                return;
            }
            pline = (Polyline)dbo;
            if (pline.NumberOfVertices == 0)
            {
                Env.Print("\n闭合空间错误,调整后重试!");
                return;
            }
      }

      using DBTrans tr = new();
      if (ppr.Status == PromptStatus.Keyword)
      {
            switch (ppr.StringResult.ToUpper().GetEnumByDescription<FirstKeywords>())
            {
                case FirstKeywords.选取:
                  selectMode = true;
                  while (selectMode)
                  {
                        var templine = GetClosedPolyline(tr);
                        if (templine == null)
                            return;
                        if (templine.NumberOfVertices > 2)
                        {
                            pline = templine;
                            selectMode = false;
                        }
                  }
                  break;
                case FirstKeywords.两点:
                  var templine2 = tr.TwoPointDrawRectangle();
                  if (templine2 == null) return;

                  pline = templine2;
                  twoPointMode = true;
                  break;
            }
      }
      if (ppr.Status == PromptStatus.Cancel)
      {
            Env.Print("\n命令取消!");
            return;
      }

      // 记录正交状态,命令結束或取消時還原
      bool ortho = Env.OrthoMode;
      if (Env.OrthoMode)
            Env.OrthoMode = false;

      List<Line> lines = [];
      // 创建瞬态容器
      using JigExTransient jet = new();
      // 亮显模式加到瞬态容器,即在图纸上显示
      if (pline.NumberOfVertices > 0)
      {
            // 如果是选取模式,须打开实体可读模式,否则报可写错误
            var color = pline.Color;
            if (!pline.IsWriteEnabled)
                using (pline.ForWrite())
                  pline.ColorIndex = 1;
            else
                pline.ColorIndex = 1;
            jet.Add(pline, Acgi.TransientDrawingMode.Highlight);
            pline.Color = color;
            // 两点绘制模式时,瞬态显示后删除两点绘制的矩形,
            // 因为TwoPointDrawRectangle()内加了瞬态,不加入数据库会报可写错误。
            if (twoPointMode)
                pline.Erase();
      }

      PrintKeywordsSettings();

      JigPromptPointOptions? options = null;
      using var jig = new JigEx((mousePtWorld, drawEntitys) => {
            var tempVect = VerticalDivStyle ? Vector3d.YAxis.Ucs2Wcs() : Vector3d.XAxis.Ucs2Wcs();
            lines = mousePtWorld.GetIntersectLine(tempVect, pline);

            if (lines.Count != 1)
                return;
            using Line line = lines;
            lines = [];

            List<Point3d> listPoints = [];
            if (DivStyle == Keywords.定数.GetDesc())
            {
                for (int i = 1; i < number; i++)
                {
                  if (!isDoubleLine)
                  {
                        double myDis = line.Length / number;
                        AddDivisionPoints(line, listPoints, myDis * i);
                  }
                  else
                  {
                        if (thickness * (number - 1) > line.Length)
                        {
                            Env.Print("\n板厚设置错误!配置重置请联系 QQ:119 110 1855!");
                            return;
                        }
                        double myDis = (line.Length - thickness * (number - 1)) / number;

                        AddDivisionPoints(line, listPoints, (myDis * i + thickness * (i - 1)));
                        AddDivisionPoints(line, listPoints, (myDis * i + thickness * i));
                  }
                }
            }
            else
            {
                if (!isCenterDivision)
                {
                  // 判断线的方向,在定距情况下很重要
                  if (line.StartPoint.DistanceTo(mousePtWorld) > line.EndPoint.DistanceTo(mousePtWorld))
                        line.ReverseCurve();

                  if (!isDoubleLine)
                  {
                        if (distension > line.Length)
                        {
                            Env.Print("/n距离设置错误!");
                            return;
                        }

                        for (int i = 1; i < line.Length / distension; i++)
                            AddDivisionPoints(line, listPoints, (distension * i));
                  }
                  else
                  {
                        if (distension + thickness > line.Length)
                        {
                            Env.Print("/n距离设置错误!");
                            return;
                        }

                        for (int i = 1; i < line.Length / (distension + thickness); i++)
                        {
                            AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1)));
                            AddDivisionPoints(line, listPoints, (distension * i + thickness * i));
                        }
                        // 添加最后一段如果分割距离大于定距但小于定距+板厚的情况
                        if (line.Length % (distension + thickness) > distension)
                            AddDivisionPoints(line, listPoints, (line.Length - (line.Length % (distension + thickness) - distension)));
                  }
                }
                else
                {
                  if (!isDoubleLine)
                  {
                        //// 2024-2-6:因設置后後續無法切換奇偶數,故取消自動判斷如何合理等分,等分數奇數 or 偶數。
                        //if (line.Length % distension > distension / 2)
                        //    centerHasLine = true;
                        //else
                        //    centerHasLine = false;

                        if (distension > line.Length)
                        {
                            Env.Print("\n距离设置错误!配置重置请联系 QQ:119 110 1855!");
                            return;
                        }
                        if (centerHasLine)
                            for (int i = -(int)Math.Floor((line.Length / 2) / distension); i <= (int)Math.Floor((line.Length / 2) / distension); i++)
                              AddDivisionPoints(line, listPoints, (distension * i + line.Length / 2));
                        else
                            for (int i = -(int)Math.Floor((line.Length - distension) / 2 / distension); i <= (int)Math.Floor((line.Length - distension) / 2 / distension) + 1; i++)
                              AddDivisionPoints(line, listPoints, (distension * i + line.Length / 2 - distension / 2));
                  }
                  else
                  {
                        if (distension + thickness > line.Length)
                        {
                            Env.Print("\n距离设置错误!配置重置请联系 QQ:119 110 1855!");
                            return;
                        }
                        if (centerHasLine)
                        {
                            for (int i = -(int)Math.Floor((line.Length / 2) / (distension + thickness)); i <= (int)Math.Floor((line.Length / 2) / (distension + thickness)); i++)
                            {
                              AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1) + line.Length / 2 + thickness / 2));
                              AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + thickness / 2));
                            }
                        }
                        else
                        {
                            for (int i = -(int)Math.Floor(((line.Length - distension) / 2) / (distension + thickness)) - 1; i <= (int)Math.Floor(((line.Length - distension) / 2) / (distension + thickness)); i++)
                            {
                              AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + distension / 2));
                              AddDivisionPoints(line, listPoints, (distension * i + thickness * (i + 1) + line.Length / 2 + distension / 2));
                            }
                            ////添加最后一段如果分割距离大于定距但小于定距 + 板厚的情况
                            //if ((line.Length - distension) % (distension + thickness) > 0)
                            //{
                            //    AddDivisionPoints(line, listPoints, ((line.Length - distension) % (distension + thickness) / 2));
                            //    AddDivisionPoints(line, listPoints, (line.Length - ((line.Length - distension) % (distension + thickness) / 2)));
                            //}
                        }
                  }
                }
            }

            // 生成等分线
            var vector = VerticalDivStyle ? Vector3d.XAxis.Ucs2Wcs() : Vector3d.YAxis.Ucs2Wcs();
            foreach (var newPoint in listPoints)
                foreach (Line lineIst in newPoint.GetIntersectLine(vector, pline))
                  lines.Add(lineIst);

            if (lines.Count > 0)
                foreach (Line ent in lines)
                {
                  if (DivEXLayer == "当前")
                        ent.SetDatabaseDefaults();
                  else
                        ent.SetProperty(DivEXHsLayer, DivEXLayer, divEXLayerColor);

                  drawEntitys.Enqueue(ent);   // 加入刷新队列
                }

            options!.Message = GetOptionsMessage(line);
      });

      options = jig.SetOptions(ppr.Value, CursorType.EntitySelect, "\n选择点或 [竖直\\水平(V\\H)/图层(C)/定数\\定距(S\\J)/数量(N)/距离(D)/板厚(T)/中心(Z)/中心有线(A)/双线(X)] ");
      options.AppendKeywordsToMessage = false;//不将关键字列表添加到提示信息中
      List<string> myKeywords = CzEnumEx.GetDescriptionList(typeof(Keywords));
      options.AddKeywords(myKeywords);
      options.UseBasePoint = false;

      bool jigDragFlag = true;
      while (jigDragFlag)
      {
            var pr = jig.Drag();
            if (pr.Status == PromptStatus.Keyword)
            {
                switch (pr.StringResult.ToUpper().GetEnumByDescription<Keywords>())
                {
                  case Keywords.垂直 or Keywords.水平:
                        VerticalDivStyle = !VerticalDivStyle;
                        break;
                  case Keywords.定数 or Keywords.定距:
                        if (DivStyle == Keywords.定数.GetDesc())
                            DivStyle = Keywords.定距.GetDesc();
                        else
                            DivStyle = Keywords.定数.GetDesc();
                        break;
                  case Keywords.图层:
                        string? layerName = tr.GetEntityLayer();
                        if (layerName != null)
                            DivEXLayer = layerName;
                        if (layerName == "重置")
                            ResetLayer();//重置圖層
                        break;
                  case Keywords.数量:
                        PromptIntegerOptions pio = new("输入数量")
                        {
                            LowerLimit = 2,
                            UpperLimit = 100,
                            DefaultValue = number
                        };
                        PromptIntegerResult pir = Env.Editor.GetInteger(pio);
                        if (pir.Status == PromptStatus.OK)
                            number = pir.Value;
                        else
                            Env.Print("输入错误!");
                        break;
                  case Keywords.距离:
                        PromptDistanceOptions pdo = new("\n选择距离");
                        pdo.DefaultValue = distension;
                        PromptDoubleResult pdr = Env.Editor.GetDistance(pdo);
                        if (pdr.Status == PromptStatus.OK)
                            distension = Math.Round(pdr.Value, 2);
                        break;
                  case Keywords.板厚:
                        thickness = BoardOffset.GetBoardThickness("\n点选板厚(或手动输入):", thickness);
                        break;
                  case Keywords.中心:
                        isCenterDivision = !isCenterDivision;
                        break;
                  case Keywords.中有分点:
                        centerHasLine = !centerHasLine;
                        break;
                  case Keywords.双线:
                        isDoubleLine = !isDoubleLine;
                        break;
                  case Keywords.加 or Keywords.加1 or Keywords.加一:
                        number += 1;
                        break;
                  case Keywords.减 or Keywords.减1 or Keywords.减一:
                        if (number > 2)
                            number -= 1;
                        break;
                }
                //序列化*类转字符串
                JsonSaveAs();
                PrintKeywordsSettings();
            }
            else if (pr.Status == PromptStatus.OK || pr.Status == PromptStatus.None)
            {
                //剔除未生成Line,还是初始化状态的情况
                if (jig.Entitys.Length <= 0)
                  Env.Editor.WriteMessage("\n点超出边界,调整后重试!");
                else
                  foreach (var entity in jig.Entitys)
                        if (entity is Line)
                            tr.CurrentSpace.AddEntity(entity);

                // 還原正交状态 and 點樣式
                Env.OrthoMode = ortho;
                jigDragFlag = false;
            }
            else
            {   // 還原正交状态 and 點樣式
                Env.OrthoMode = ortho;
                Env.Print("\n命令取消!");
                return;
            }
      }
    }

    /// </summary>
    /// 给定的分割线(Line)在指定距离(double)上添加分割点(Point3d)
    /// </summary>
    /// <param name="divisionLine">要添加分割點的分割線</param>
    /// <param name="divisionPoints">用於保存分割點的列表</param>
    /// <param name="distension">分割點與起點之間的距離</param>
    private static void AddDivisionPoints(Line divisionLine, List<Point3d> divisionPoints, double distension)
    {
      //获取距离起点 mydis 的多段线上的一个点
      Point3d point = divisionLine.GetPointAtDist(distension);
      //一阶导数即切线向量
      Vector3d curVector = divisionLine.GetFirstDerivative(point);
      //获取切线方向的垂线向量的标准单位向量 (从切线得到法线)
      Vector3d curPervector = curVector.GetPerpendicularVector().GetNormal();
      //起始点+ 单位向量*距离 就是距离起始点 距离向量长度的 一个点
      Point3d newPoint = point + curPervector * distension;

      divisionPoints.Add(newPoint);
    }
}



另一個C#文件名:SettingsClass.cs
關於初始化設置!!!!
namespace ArrowTools;
public interface IInitSettins
{
    /// <summary>
    /// json文件:带文件名及后缀。
    /// </summary>
    /// <returns>完整文件名路徑 + 名稱</returns>
    public string JsonFile();
    /// <summary>
    /// 序列化類
    /// </summary>
    /// <returns>序列化string</returns>
    public string JsonString();
    /// <summary>
    /// 保存序列化類至配置文件。
    /// </summary>
    public void JsonSaveAs();
    /// <summary>
    /// 反序列化類
    /// </summary>
    /// <typeparam name="T">類名</typeparam>
    /// <returns>配置轉類</returns>
    public T JsonToType<T>();
    /// <summary>
    /// 圖層重置
    /// </summary>
    public void ResetLayer();
}
public class SettingsClass : IInitSettins
{
    public virtual void ResetLayer()
    {
    }
    //public virtual string JsonFile() => Path.GetDirectoryName(GetAssemblyPath(true)) + "\\Settings\\";
    public virtual string JsonFile() => Path.GetDirectoryName(ArrowTool.GetAssemblyPath(true)) + $"\\Settings\\{this.GetType().Name}_Settings.json";
    public virtual string JsonString() => JsonConvert.SerializeObject(this, Formatting.Indented);
    public virtual void JsonSaveAs() => File.WriteAllText(JsonFile(), JsonString());
    public T JsonToType<T>() => JsonConvert.DeserializeObject<T>(File.ReadAllText(JsonFile()))!;
}

關於接口文件:SettingsTools.cs
namespace ArrowTools;
public static class SettingsTools
{
    /// <summary>
    /// 初始化圖層配置:檢查配置路徑。
    /// </summary>
    public static void InitLayersSettings<T>(T thisType) where T : class, IInitSettins
    {
      var path = thisType.JsonFile();
      string dirName = Path.GetDirectoryName(path)!; // 获取指定路径文件所在的文件夹的名称
      if (!Directory.Exists(dirName))
            Directory.CreateDirectory(dirName);// 在指定的路径下创建一个新的文件夹。
      if (!File.Exists(path))
      {
            thisType.ResetLayer();
            thisType.JsonSaveAs();
            //File.WriteAllText(path, thisType.JsonString());
      }
      // 反序列化后映射類
      T jsonType = thisType.JsonToType<T>();
      ReflectSlef(jsonType, thisType);
    }

    public static void ReflectSlef<T>(T jsonType, T thisType) where T : class
    {
      Dictionary<string, object> dic = [];

      // 获取 jsonType 的所有属性和字段:注意!!!!要加上(BindingFlags.Instance)這個形參!
      Type temptype = jsonType.GetType();
      Type thistype = thisType.GetType();
      PropertyInfo[] tempPpt = temptype.GetProperties(BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
      PropertyInfo[] thisPpt = thistype.GetProperties(BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
      FieldInfo[] tempFI = temptype.GetFields(BindingFlags.Public | BindingFlags.SetField | BindingFlags.Instance);
      FieldInfo[] thisFI = thistype.GetFields(BindingFlags.Public | BindingFlags.SetField | BindingFlags.Instance);

      // 遍历属性、字段并输出属性名和值,2024-2-10:注意過濾條件應為可寫、非私有變量。
      for (int i = 0; i < tempPpt.Length; i++)
            if (tempPpt.PropertyType.IsPublic && thisPpt.CanWrite)
                dic.Add(tempPpt.Name, tempPpt.GetValue(jsonType));
      for (int i = 0; i < tempFI.Length; i++)
            if (thisFI.IsPublic)
                dic.Add(tempFI.Name, tempFI.GetValue(jsonType));

      for (int i = 0; i < thisPpt.Length; i++)
            if (tempPpt.PropertyType.IsPublic && thisPpt.CanWrite)
                thisPpt.SetValue(thisType, dic.Name]); // 设置属性值
      for (int i = 0; i < thisFI.Length; i++)
            if (thisFI.IsPublic)
                thisFI.SetValue(thisType, dic.Name]); // 设置字段值
    }

   
    public static void ReflectSlefFuntion<T>(T thisType) where T : class
    {
      Dictionary<string, object> dic = [];

      // 获取 jsonType 的所有属性和字段:注意!!!!要加上(BindingFlags.Instance)這個形參!
      Type thistype = thisType.GetType();
      MethodInfo[] thisFun = thistype.GetMethods(BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);

      for (int i = 0; i < thisFun.Length; i++)
            thisFun.Equals(dic.Name]); // 设置功能
    }


}


關於獲取:获取dll运行路径 and添加關鍵字函數 /// <summary>
/// 获取dll运行路径,并添加入注册表供lisp调用
/// </summary>
/// <param name="full">true是含有文件名</param>
/// <returns>当前dll路径</returns>
public static string GetAssemblyPath(bool full)
{
   // 获取程序集的位置 "file:/// G:/K01.惊惊连盒/NET35/JoinBox.dll"
   string path = Assembly.GetExecutingAssembly().CodeBase;
   /*
      * 似乎直接切割比较快
      * path = path.Replace("file:/// ", string.Empty).Replace("/", "\\");
      */
   var url = new UriBuilder(path);
   path = Uri.UnescapeDataString(url.Path);// 这里路径是/

   if (full)
         return Path.GetFullPath(path); // 这里是\\
   path = Path.GetDirectoryName(path);// 这里是\\
   var it = path.LastIndexOf('\\');
   if (it != -1)
         path = path[..it] + "\\";// 返回上一级目录
   return path;
}
/// <summary>
/// 添加关键字至设置中
/// </summary>
/// <param name="options">PromptOptions设置</param>
/// <param name="keywords">关键字</param>
public static void AddKeywords(this PromptPointOptions options, List<string> Keywords)
{
   foreach (var key in Keywords)
   {
         if (!options.Keywords.Contains(key))
             options.Keywords.Add(key);
   }
}
/// <summary>
/// 添加关键字至设置中
/// </summary>
/// <param name="options">PromptOptions设置</param>
/// <param name="keywords">关键字</param>
public static void AddKeywords(this PromptEntityOptions options, List<string> Keywords)
{
   foreach (var key in Keywords)
   {
         if (!options.Keywords.Contains(key))
             options.Keywords.Add(key);
   }
}
/// <summary>
/// 添加关键字至设置中
/// </summary>
/// <param name="options">jig设置</param>
/// <param name="keywords">关键字</param>
public static void AddKeywords(this JigPromptPointOptions? options, IEnumerable<string> keywords)
{
   foreach (var key in keywords)
   {
         if (!options!.Keywords.Contains(key))
             options.Keywords.Add(key);
   }
}
/// <summary>
   /// 获取枚举类型的所有描述项。
   /// </summary>
   /// <param name="enumType">枚举类型</param>
   /// <returns>返回描述项</returns>
   public static List<string> GetDescriptionList(Type enumType)
   {
       List<string> nameList = [];
       foreach (var e in Enum.GetValues(enumType))
       {
         // 转换成Description后添加至List
         object objArr = e.GetType().GetField(e.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), true);
         nameList.Add(((DescriptionAttribute)objArr).Description);
       }
       return nameList;
   }

備註: 感謝驚驚大佬的關於如何序列化的指教!!!!
          感謝IFOX源碼共享,另此命令參照源泉設計的DF命令設計製作,感謝源泉作者無私分享插件!!!!

上圖中若缺失函數可反饋后修改,上圖中函數可能會有部份源碼在項目的其它文件夾中,未作具體驗證,可回帖后上傳源碼!



wangsr 发表于 2024-2-18 07:58:39

谢谢分享。

箭头_Row 发表于 2024-2-20 03:04:39

本帖最后由 箭头_Row 于 2024-2-20 03:26 编辑

備註:
// 分割在首尾時萬一超過邊界不能生成直線時的情況
// 2024-2-20:BUG修復:修復 定距、雙線、中心有線模型式下生成錯誤情況,添加try{}example: 生成的分割線長為440 定距:100 板厚:10 中心有線:是   

if (centerHasLine)
{
      for (int i = -(int)Math.Floor((line.Length / 2-thickness/2) / (distension + thickness)); i <= (int)Math.Floor((line.Length / 2 - thickness / 2) / (distension + thickness)); i++)
      {
          //// 分割在首尾時萬一超過邊界不能生成直線時的情況
          //// 2024-2-20:BUG修復:修復 定距、雙線、中心有線模型式下生成錯誤情況,添加try{}example: 生成的分割線長為440 定距:100 板厚:10 中心有線:是   
          //if (i == -(int)Math.Floor((line.Length / 2) / (distension + thickness)) || i == (int)Math.Floor((line.Length / 2) / (distension + thickness)))
          //{
          //    try
          //    {
          //      AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1) + line.Length / 2 + thickness / 2));

          //    }
          //    catch { }
          //    try
          //    {
          //      AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + thickness / 2));
          //    }
          //    catch { }
          //}
          //else
          //{
            AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1) + line.Length / 2 + thickness / 2));
            AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + thickness / 2));
          //}
      }
}

下方try模式修復BUG的方式捨弃,不是很合理:
if (centerHasLine)
{
      for (int i = -(int)Math.Floor((line.Length / 2) / (distension + thickness)); i <= (int)Math.Floor((line.Length / 2) / (distension + thickness)); i++)
      {
          // 分割在首尾時萬一超過邊界不能生成直線時的情況
          // 2024-2-20:BUG修復:修復 定距、雙線、中心有線模型式下生成錯誤情況,添加try{}example: 生成的分割線長為440 定距:100 板厚:10 中心有線:是   
          if (i == -(int)Math.Floor((line.Length / 2) / (distension + thickness)) || i == (int)Math.Floor((line.Length / 2) / (distension + thickness)))
          {
            try
            {
                  AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1) + line.Length / 2 + thickness / 2));

            }
            catch { }
            try
            {
                  AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + thickness / 2));
            }
            catch { }
          }
          else
          {
            AddDivisionPoints(line, listPoints, (distension * i + thickness * (i - 1) + line.Length / 2 + thickness / 2));
            AddDivisionPoints(line, listPoints, (distension * i + thickness * i + line.Length / 2 + thickness / 2));
          }
      }
}
页: [1]
查看完整版本: 命令:封閉空間等分