| 
 | 
 
发表于 2021-1-29 14:30:00
|
显示全部楼层
 
 
 
///  
    /// 将Line Arc LWPolyline 编辑成LWPolyline,能连接在一起的连接起来 
    /// 要求端点相接 
    /// Version : 2007.09.19 Sieben 
    /// 2007.11.01有改动,未做详细测试 
    /// 2008.02.14 修改封闭曲线时导致出现零节点的问题 
    ///  
    /// 第一曲线,若两条曲线连接成一条,则新曲线使用第一曲线一般属性(有例外),不应该为null 
    /// 第二曲线,可以为null,这时是编辑单个实体 
    /// 一个距离数值,用于作为判断两点重合的标准 
    /// 成功返回aPolyline,否则返回null 
    public static aPolyline JoinPolyline(Curve cur1, Curve cur2, double dTol) 
    { 
      try 
      { 
        //ae.WriteMessage("\nadb.JoinPolyline start "); 
        aPolyline pline = null; 
        if (cur1 == null || cur1.Closed) return null; 
        if (!cur1.GetType().Equals(typeof(aPolyline))) 
        { 
          #region !aPolylineine Arc aPolyline 
          if (cur2 != null && cur2.GetType().Equals(typeof(aPolyline))) 
          {//第一曲线为非aPolyline,而第二曲线为aPolyline,这时以第二曲线作为第一曲线重新调用函数,此举只为减少代码 
            return aCur.JoinPolyline(cur2, cur1, dTol); 
          } 
          pline = new aPolyline(); 
          if (cur1.GetType().Equals(typeof(Line)))//Line:? 
          {//曲线为  Line,使用其数据生成一个aPolyline 
            Line line = (Line)cur1; 
            pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0); 
            pline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0); 
            pline.SetPropertiesFrom(line);//使用原来实体属性 
            if (cur2 != null)//若第二曲线不为空,则试图连接两者 
              pline = aCur.JoinPolyline(pline, cur2, dTol); 
            return pline;//将新生成的多段线提交到数据库 
          } 
          else if (cur1.GetType().Equals(typeof(Arc)))//Arc:? 
          {//曲线为  Line,使用其数据生成一个aPolyline     
            Arc arc = (Arc)cur1; 
            Point3d p1 = arc.GetPointAtParameter(arc.EndParam * 0.5 + arc.StartParam * 0.5); 
            double dltAng = arc.EndAngle - arc.StartAngle; 
            if (dltAng = 0; i--) 
              { 
                pline.AddVertexAt(pline.NumberOfVertices, pline2.GetPoint2dAt(i), 0, 0, 0); 
                pline.SetBulgeAt(pline.NumberOfVertices - 2, -pline2.GetBulgeAt(i)); 
              } 
            } 
            else if (pline.StartPoint.DistanceTo(pline2.StartPoint) = 0; i--) 
              { 
                pline.AddVertexAt(0, pline2.GetPoint2dAt(i), 0, 0, 0); 
                pline.SetBulgeAt(0, pline2.GetBulgeAt(i)); 
              } 
            } 
            #endregion aPolyline:aPolyline 
          } 
          else 
          { 
            return null; 
          } 
          if (pline.StartPoint.DistanceTo(pline.EndPoint) < dTol) //如果曲线起点和终点重合,将Closed = true 
          { 
            pline.Closed = true; 
            //2008.02.14注意:即使起点和终点已重合,pline.Closed = true还是会增加一个节点,导致多段线出现零节点 
            pline.RemoveVertexAt(pline.NumberOfVertices - 1); 
          } 
          return pline; 
          #endregion aPolylineine Arc aPolyline 
        } 
        return pline; 
      } 
      catch (System.Exception ex) 
      { 
        ae.WriteMessage(ex); 
        return null; 
      } 
    } 
非不想分享全部,但涉及的代码太多了,没有时间。 |   
 
 
 
 |