solidworks 自动标折弯尺寸 c#

  public static void 标折弯尺寸(ISldWorks SwApp)
  {

      ModelDoc2 swModel = (ModelDoc2)SwApp.ActiveDoc;
      DrawingDoc swDrawing = (DrawingDoc)swModel;
      Sheet sheet = (Sheet)swDrawing.GetCurrentSheet();
      double 板厚 = 0;
      var swMathUtils = SwApp.IGetMathUtility();

      string partname = Path.GetFileNameWithoutExtension(swModel.GetPathName());
      var Views = (object[])sheet.GetViews();

      foreach (var view2 in Views)
      {
          View view = (View)view2;

          double Offset = 0.05;
          if ((view.GetName2().Contains("图") || view.GetName2().Contains("Drawing View"))
             )
          {

              string viewname = view.GetName2();
              Debug.WriteLine("视图名称为:" + viewname + ",  视图方向" + view.GetOrientationName());
              var swViewXform = (MathTransform)view.ModelToViewTransform;
              var ViewTransformDATA = (double[])swViewXform.ArrayData;

              Debug.WriteLine($":{Math.Round(ViewTransformDATA[0], 2)},{Math.Round(ViewTransformDATA[1], 2)},{Math.Round(ViewTransformDATA[2], 2)},{Math.Round(ViewTransformDATA[13], 2)}");
              Debug.WriteLine($":{Math.Round(ViewTransformDATA[3], 2)},{Math.Round(ViewTransformDATA[4], 2)},{Math.Round(ViewTransformDATA[5], 2)},{Math.Round(ViewTransformDATA[14], 2)}");
              Debug.WriteLine($":{Math.Round(ViewTransformDATA[6], 2)},{Math.Round(ViewTransformDATA[7], 2)},{Math.Round(ViewTransformDATA[8], 2)},{Math.Round(ViewTransformDATA[15], 2)}");
              Debug.WriteLine($":{Math.Round(ViewTransformDATA[9], 2)},{Math.Round(ViewTransformDATA[10], 2)},{Math.Round(ViewTransformDATA[11], 2)},{Math.Round(ViewTransformDATA[12], 2)}");


              var vBounds = (double[])view.GetOutline();
              view.SetDisplayMode3(false, (int)swDisplayMode_e.swFACETED_HIDDEN_GREYED, false, true);
              Console.WriteLine("view.GetDisplayMode()=" + view.GetDisplayMode());
              swModel.EditRebuild3();
              PartDoc partDoc = (PartDoc)view.ReferencedDocument;
              object[] vBodies = (object[])partDoc.GetBodies2((int)swBodyType_e.swSolidBody, false);
              Body2 body = (Body2)vBodies[0];
              object[] vAffectedFaces = (object[])body.GetFaces();



              Dictionary<(double, double, string), (double, Face)> 外面集 = new Dictionary<(double, double, string), (double, Face)>();
              foreach (Face face in vAffectedFaces)
              {
                  double 面面积 = Math.Round(face.GetArea() * 1000000, 1);
                  var surface = face.IGetSurface();
                  if (surface.IsCylinder())
                  {
                      double[] CylinderParams = (double[])surface.CylinderParams;
                      double 折弯半径 = Math.Round(CylinderParams[6] * 1000, 1);
                      Debug.WriteLine($"面面积:{面面积},折弯半径 {折弯半径}");
                      Debug.WriteLine($"向量:{CylinderParams[3]},{CylinderParams[4]},{CylinderParams[5]}");
                      var edges = (object[])face.GetEdges();
                      var 圆心坐标 = 得到圆心坐标();
                      Debug.WriteLine($"圆心坐标:{圆心坐标.Item1.Item1},{圆心坐标.Item1.Item2}");
                      Debug.WriteLine($"方向:{圆心坐标.Item1.Item3},半径:{圆心坐标.Item2}");
                      ((double, double, string), double) 得到圆心坐标()//x,y,方向,半径
                      {
                          double x, y;
                          string 圆弧轴线方向;
                          foreach (var edgeobj in edges)
                          {
                              Edge edge = (Edge)edgeobj;
                              Curve ccurve = (Curve)edge.GetCurve();

                              if (ccurve.IsCircle())
                              {
                                  double[] CircleParams = (double[])ccurve.CircleParams;

                                  if (Math.Round(CircleParams[3], 1) != 0)
                                  {
                                      圆弧轴线方向 = "x";
                                      x = Math.Round(CircleParams[1] * 1000, 1);
                                      y = Math.Round(CircleParams[2] * 1000, 1);
                                      return ((x, y, 圆弧轴线方向), 折弯半径);
                                  }
                                  else if (Math.Round(CircleParams[4], 1) != 0)
                                  {
                                      圆弧轴线方向 = "y";
                                      x = Math.Round(CircleParams[0] * 1000, 1);
                                      y = Math.Round(CircleParams[2] * 1000, 1);
                                      return ((x, y, 圆弧轴线方向), 折弯半径);
                                  }
                                  else if (Math.Round(CircleParams[5], 1) != 0)
                                  {
                                      圆弧轴线方向 = "z";
                                      x = Math.Round(CircleParams[0] * 1000, 1);
                                      y = Math.Round(CircleParams[1] * 1000, 1);
                                      return ((x, y, 圆弧轴线方向), 折弯半径);
                                  }
                              }
                          }
                          return ((0, 0, ""), 0);
                      }
                      (double, Face) 原直径和面;
                      if (外面集.TryGetValue(圆心坐标.Item1, out 原直径和面))
                      {
                          外面集[圆心坐标.Item1] = 原直径和面.Item1 > 折弯半径 ? 原直径和面 : (折弯半径, face);
                      }
                      else { 外面集[圆心坐标.Item1] = (折弯半径, face); }
                  }
              }
              var 外面面集 = 外面集.Select(item => ((item.Key.Item1, item.Key.Item2), item.Key.Item3, item.Value.Item2)).ToList();
              Debug.WriteLine($"抓到折弯数={外面面集.Count}");
              //特征face,子face
              double round10002(double x) { return Math.Round(x * 1000, 2); }
              double round10000002(double x) { return Math.Round(x * 1000000, 2); }
              double[] tround2(double[] x) {
                  double[] outp= new double[] {
                      Math.Round(x.ElementAt(0)*1000,2),
                        Math.Round(x.ElementAt(1)*1000,2),
                          Math.Round(x.ElementAt(2)*1000,2)
                      };
                  foreach(double o in outp){
                  Debug.WriteLine(o);
                  }
                  return outp;
              }
              bool doublesame(double[] x, double[] y) {
              bool outp= Math.Abs( x.First()-y.First())<0.1
                      && Math.Abs(x.Skip(1).First()- y.Skip(1).First()) < 0.1
                      && Math.Abs(x.Skip(2).First() - y.Skip(2).First()) < 0.1;
             return outp;
              }
             
              Dictionary<Face, Face> 断面字典 = new Dictionary<Face, Face>();
              var 外面接面集 = new List<(Face, (double x, double y), string 圆弧轴线方向, double[])>();//面,接线
              foreach (((double, double) 折弯中心, string 圆弧轴线方向, Face 外面) in 外面面集)
              {
                  //折弯中心,折弯外平面
                  var 外面edges = (object[])外面.GetEdges();

                  foreach (var edgeobj in 外面edges)
                  {
                      Edge edge = (Edge)edgeobj;
                      Curve Lcurve = (Curve)edge.GetCurve();
                     
                      if (Lcurve.IsLine())
                      {
                          var start = (Vertex)edge.GetStartVertex();
                          var startpoint = tround2((double[])start.GetPoint());
                         
                          var end = (Vertex)edge.GetEndVertex();
                          var endpoint = tround2((double[])end.GetPoint());
                       
                          var lpara = (double[])Lcurve.LineParams;
                       
                          var 两直线界面 = (object[])edge.GetTwoAdjacentFaces();
                          foreach (var faceobj in 两直线界面)
                          {
                              var face = (Face)faceobj;
                              if (((Surface)face.GetSurface()).IsPlane())
                              {
                                  外面接面集.Add((face, 折弯中心, 圆弧轴线方向, lpara));
                                  var 接面edges = (object[])face.GetEdges();
                                  Debug.WriteLine("接面edges.count"+ 接面edges.Length);
                                  foreach (var 接面edgeobj in 接面edges)
                                  {
                                      Edge 接面edge = (Edge)接面edgeobj;
                                      Curve Lcurve2 = (Curve)接面edge.GetCurve();
                                      if (Lcurve2.IsLine()) { 
                                      var lpara2 = (double[])Lcurve2.LineParams;
                                      var 接面start = (Vertex)接面edge.GetStartVertex();
                                      var 接面startpoint = tround2((double[])接面start.GetPoint());
                                   
                                      var 接面end = (Vertex)接面edge.GetEndVertex();
                                      var 接面endpoint = tround2((double[])接面end.GetPoint());
                                   
                                      if (!doublesame(接面startpoint,startpoint)
                                          && !doublesame(接面startpoint ,endpoint)
                                        && !doublesame(接面endpoint , startpoint)
                                         &&!doublesame( 接面endpoint , endpoint)
                                          )
                                      {

                                          var 接面两直线界面 = (object[])接面edge.GetTwoAdjacentFaces();
                                          foreach (var faceobj接面 in 接面两直线界面)
                                          {
                                              var face接面 = (Face)faceobj接面;
                                              if (face接面 != face && ((Surface)face接面.GetSurface()).IsPlane())
                                              {
                                                  Debug.WriteLine("检查2");
                                                  断面字典.Add(face, face接面);
                                                  外面接面集.Add((face接面, 折弯中心, 圆弧轴线方向, lpara2));
                                              }
                                              else
                                              {
                                                  Debug.WriteLine(" 接面面积=" + face接面.GetArea() * 1000000);
                                                  Debug.WriteLine("=face?" + (face接面 == face));
                                                  Debug.WriteLine("isplane?" + ((Surface)face接面.GetSurface()).IsPlane());
                                              }
                                          }
                                      }
                                      }

                                  }
                              }
                          }
                      }
                  }


              }
              Debug.WriteLine($"外面接面集={外面接面集.Count}");
              Debug.WriteLine($"断面字典={断面字典.Count}");
              List<(Face, string, bool, double)> 子faces = new List<(Face, string, bool, double)>();
              foreach ((Face 外面接面, (double, double) 折弯中心, string 圆弧轴线方向, double[] lpara) in 外面接面集)
              {
                  var 外面接面surface = (Surface)外面接面.GetSurface();
                  var planepara = (double[])外面接面surface.PlaneParams;
                  (double, double, double) 平面法向 = (Math.Round(planepara[0], 1), Math.Round(planepara[1], 1), Math.Round(planepara[2], 1));
                  Debug.WriteLine($"平面朝向:{平面法向.Item1},{平面法向.Item2},{平面法向.Item3}");

                  bool 正方向 = false;
                  string 方向 = "";
                  double 面位置值 = 0;
                  if (平面法向.Item1 != 0)
                  {
                      正方向 = lpara[0] * 1000 < 折弯中心.Item1;//x,y或者 x,z
                      if (板厚 == 0) 板厚 = Math.Round(Math.Abs(lpara[0] * 1000 - 折弯中心.Item1), 1);
                      方向 = "x";
                      面位置值 = Math.Round(lpara[0] * 1000, 1);

                  }
                  else if (平面法向.Item2 != 0)//x,y或者y,z
                  {
                      double 圆心位置值 = 圆弧轴线方向 == "z" ? 折弯中心.Item2 : 折弯中心.Item1;
                      正方向 = lpara[1] * 1000 < 圆心位置值;
                      if (板厚 == 0) 板厚 = Math.Round(Math.Abs(lpara[1] * 1000 - 圆心位置值), 1);
                      方向 = "y";
                      面位置值 = Math.Round(lpara[1] * 1000, 1);
                  }
                  else if (平面法向.Item3 != 0)//x,z或者y,z
                  {
                      正方向 = lpara[2] * 1000 < 折弯中心.Item2;
                      if (板厚 == 0) 板厚 = Math.Round(Math.Abs(lpara[2] * 1000 - 折弯中心.Item2), 1);

                      方向 = "z";
                      面位置值 = Math.Round(lpara[2] * 1000, 1);
                  }
                  子faces.Add((外面接面, 方向, 正方向, 面位置值));
                  Debug.WriteLine("面积=" + Math.Round(外面接面.GetArea() * 1000000, 1) + $"    ,正方向?  {正方向}");



              }
              var 过滤子faces = new HashSet<(Face, string, bool, double)>(子faces);
              Debug.WriteLine($"过滤子faces前后:{子faces.Count}=>{过滤子faces.Count}");

              #region //全部面集
              //List<(Face, string, double, Edge)> 面集 = vAffectedFaces
              //    .Where(item =>
              //    {
              //        Surface plansurface = (Surface)((Face)item).GetSurface();
              //        object[] edges = (object[])((Face)item).GetEdges();
              //        return plansurface.IsPlane() && ((Face)item).GetArea() * 1000000 > 10 && edges.Length > 3;
              //    })
              //    .Select(item =>
              //    {
              //        Surface plansurface = (Surface)((Face)item).GetSurface();

              //        double[] Params = (double[])plansurface.PlaneParams;
              //        (double, double, double) 平面朝向 = (Math.Round(Params[0]), Math.Round(Params[1]), Math.Round(Params[2]));
              //        string 方向 = "";
              //        double 位置值 = 0;
              //        object[] edges = (object[])((Face)item).GetEdges();
              //        Debug.WriteLine("edges.count=" + edges.Length + ",面积为=" + ((Face)item).GetArea() * 1000000 + $"平面朝向={平面朝向.Item1},{平面朝向.Item2},{平面朝向.Item3}");

              //        Edge eedge = (Edge)edges[0];

              //        for (int i = 0; i < edges.Length; i++)
              //        {
              //            eedge = (Edge)edges[i];
              //            Curve curve = (Curve)eedge.GetCurve();
              //            if (curve.IsLine())
              //            {
              //                Vertex StartVertex = (Vertex)eedge.GetStartVertex();

              //                double[] pParams = (double[])StartVertex.GetPoint();


              //                if (平面朝向.Item1 != 0)
              //                {
              //                    位置值 = Math.Round((double)pParams[0] * 1000, 1);
              //                    方向 = "x";
              //                }
              //                else if (平面朝向.Item2 != 0)
              //                {
              //                    位置值 = Math.Round((double)pParams[1] * 1000, 1);
              //                    方向 = "y";
              //                }
              //                else if (平面朝向.Item3 != 0)
              //                {
              //                    位置值 = Math.Round((double)pParams[2] * 1000, 1);
              //                    方向 = "z";
              //                }
              //                break;
              //            }
              //        }

              //        Debug.WriteLine("面位置为:" + 位置值 + ",方向:" + 方向);
              //        return ((Face)item, 方向, 位置值, eedge);
              //    }).ToList();
              //Debug.WriteLine("面集.count=" + 面集.Count);

              //放置尺寸
              #endregion
              
              Dictionary<Face, Face> 标过的面 = new Dictionary<Face, Face>();
              foreach (var face实例 in 过滤子faces)
              {
                  //           List<Face> 同向量集 = 面集.Where(item => item.Item2 == face实例.Item2).OrderByDescending(item => item.Item3)
                  //.Select(item =>
                  //{

                  //    return item.Item1;
                  //}).ToList();
                  string 放置方式 = "无";
                  if (face实例.Item2 == "x")
                  {
                      if (Math.Round(ViewTransformDATA[0]) != 0) { 放置方式 = "水平"; }
                      else if (Math.Round(ViewTransformDATA[1]) != 0) { 放置方式 = "竖直"; }
                  }
                  else if (face实例.Item2 == "y")
                  {
                      if (Math.Round(ViewTransformDATA[3]) != 0) { 放置方式 = "水平"; }
                      else if (Math.Round(ViewTransformDATA[4]) != 0) { 放置方式 = "竖直"; }
                  }
                  else if (face实例.Item2 == "z")
                  {
                      if (Math.Round(ViewTransformDATA[6]) != 0) { 放置方式 = "水平"; }
                      else if (Math.Round(ViewTransformDATA[7]) != 0) { 放置方式 = "竖直"; }
                  }
                  Debug.WriteLine("面朝向:" + face实例.Item2 + ",放置方式为:" + 放置方式 + ",data1值" + Math.Round(ViewTransformDATA[0]));
                  if (放置方式 == "无") continue;

                  (Face, double) 折弯匹配面 = default;
                  foreach (var 子face in 过滤子faces)
                  {
                      if (子face.Item2 == face实例.Item2
                          && 子face.Item3 != face实例.Item3)
                      {

                          if (face实例.Item3 && 子face.Item4 > face实例.Item4
                          && 子face.Item4 - face实例.Item4 - 0.5 > 板厚)
                          {
                              if (折弯匹配面 == default) 折弯匹配面 = (子face.Item1, 子face.Item4);
                              else 折弯匹配面 = 折弯匹配面.Item2 < 子face.Item4 ? 折弯匹配面 : (子face.Item1, 子face.Item4);
                          }
                          else if (!face实例.Item3 && 子face.Item4 < face实例.Item4
                                && face实例.Item4 - 子face.Item4 - 0.5 > 板厚)
                          {

                              if (折弯匹配面 == default) 折弯匹配面 = (子face.Item1, 子face.Item4);
                              else 折弯匹配面 = 折弯匹配面.Item2 > 子face.Item4 ? 折弯匹配面 : (子face.Item1, 子face.Item4);
                          }

                      }

                  }
                  Debug.WriteLine("折弯匹配面.count=default?" + 折弯匹配面 == default);
                  Face 匹配面;

                  if (折弯匹配面 != default)
                  {
                      匹配面 = 折弯匹配面.Item1;

                      Face 标过此面;
                      if (标过的面.TryGetValue(匹配面, out 标过此面) && 标过此面 == face实例.Item1)
                      {
                          Debug.WriteLine("标过此面");
                      }
                      else
                      {
                          标过的面.Add(face实例.Item1, 匹配面);
                          Debug.WriteLine("没标过此面");
                          标尺寸(face实例.Item1, 匹配面);
                      }
                  }


                  void 标尺寸(Face 面1, Face 面2)
                  {
                      object[] edges1 = (object[])面1.GetEdges();
                      object[] edges2 = (object[])面2.GetEdges();


                      激活线段(edges1);
                      激活线段(edges2);
                      void 激活线段(object[] edges)
                      {
                          double 相差 = 0; int i = 0;
                          while (true)
                          {
                              Curve linecurve = (Curve)((Edge)edges[i]).GetCurve();
                              if (!linecurve.IsLine()) { i++; continue; }
                              Vertex vertex = (Vertex)((Edge)edges[i]).GetStartVertex();
                              Vertex endvertex = (Vertex)((Edge)edges[i]).GetEndVertex();
                              SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;
                              SelectData swSelData = swSelMgr.CreateSelectData();

                              //((Entity)vertex).Select4(false, swSelData);
                              //((Entity)face实例.Item5).Select4(true, swSelData);

                              var vPt = (double[])vertex.GetPoint();
                              var swMathPt = (MathPoint)swMathUtils.CreatePoint(vPt);
                              swMathPt = (MathPoint)swMathPt.MultiplyTransform(swViewXform);
                              var MathPtData = (double[])swMathPt.ArrayData;

                              var endvPt = (double[])endvertex.GetPoint();
                              var endswMathPt = (MathPoint)swMathUtils.CreatePoint(endvPt);
                              endswMathPt = (MathPoint)endswMathPt.MultiplyTransform(swViewXform);
                              var endMathPtData = (double[])endswMathPt.ArrayData;
                              Console.WriteLine($"swMathPt1:{Math.Round((MathPtData[0] + endMathPtData[0]) / 2, 3)},{Math.Round((MathPtData[1] + endMathPtData[1]) / 2, 3)},{Math.Round((MathPtData[2] + endMathPtData[2]) / 2, 3)}");
                              if (放置方式 == "水平")
                              {
                                  相差 = Math.Round(MathPtData[1] * 1000 - endMathPtData[1] * 1000, 1);
                              }
                              else if (放置方式 == "竖直")
                              {
                                  相差 = Math.Round(MathPtData[0] * 1000 - endMathPtData[0] * 1000, 1);
                              }

                              if (相差 != 0) { swModel.Extension.SelectByRay((MathPtData[0] + endMathPtData[0]) / 2, (MathPtData[1] + endMathPtData[1]) / 2, 0, 0, 0, -1, 0.0001, 1, false, 0, 0); break; }
                              i++;

                          }

                      }



                      double Xpos, Ypos;

                      if (放置方式 == "水平")
                      {
                          Xpos = (vBounds[0] + vBounds[2]) / 2;
                          Ypos = (vBounds[3] - Offset);
                          var myDisplayDim = swModel.AddDimension2(Xpos, Ypos, 0);
                      }
                      else if (放置方式 == "竖直")
                      {
                          Ypos = (vBounds[1] + vBounds[3]) / 2;
                          Xpos = (vBounds[0] + Offset);
                          var myDisplayDim = swModel.AddDimension2(Xpos, Ypos, 0);
                      }
                      Offset = Offset + 0.005;

                      swModel.ClearSelection2(true);
                  }
              }
              Debug.WriteLine("标过的面个数=" + 标过的面.Count);


          }
      }

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值