找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1140|回复: 1

[分享] sCur.cs

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-7 12:49:04 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[ 本帖最后由 csharp 于 2014-5-7 18:09 编辑 ]\n\n[url]http://read.pudn.com/downloads173/sourcecode/windows/csharp/802272/sCur.cs__.htm[/url]
  1. using System;
  2. using System.Diagnostics;
  3. using System.Windows.Forms;
  4. using System.Reflection;
  5. using System.IO;
  6. using System.Runtime.InteropServices;
  7. using Yekai.CsArx.Geometry;
  8. using Yekai.CsArx.Enum;
  9. using Yekai.CsArx.Function;
  10. using Yekai.CsArx.AcadCom;

  11. using Autodesk.AutoCAD.Runtime;
  12. using Autodesk.AutoCAD.DatabaseServices;
  13. using Autodesk.AutoCAD.Geometry;
  14. using Autodesk.AutoCAD.Colors;
  15. using Autodesk.AutoCAD.EditorInput;
  16. using Autodesk.AutoCAD.ApplicationServices;
  17. using Autodesk.AutoCAD.Windows;
  18. using Autodesk.AutoCAD.GraphicsInterface;
  19. using Autodesk.AutoCAD.Interop.Common;
  20. using app = Autodesk.AutoCAD.ApplicationServices.Application;
  21. using AColor = Autodesk.AutoCAD.Colors.Color;

  22. namespace Yekai.CsArx
  23. {
  24.   /// <summary>
  25.   /// 曲线操作类
  26.   /// Version : 2009.06.11
  27.   /// 备注:上传[url]www.pudn.com[/url]
  28.   /// </summary>
  29.   public class sCur
  30.   {
  31.     #region Join Break Union Trim Loop Simulate Curve
  32.     #region dealwith curve
  33.     /// <summary>
  34.     /// 获取封闭多义线外偏移线
  35.     /// Version : 2007.11.05
  36.     /// 本函数应被adb.OffsetLoop替代
  37.     /// </summary>
  38.     /// <param name="closeCur">封闭多义线</param>
  39.     /// <param name="offsetDist">偏移距离</param>
  40.     /// <param name="useSimulate">若直接偏移不成功是否使用模拟线</param>
  41.     /// <param name="stepDist">使用模拟线时的节点距离</param>
  42.     /// <returns>成功返回Polyline,否则返回null</returns>
  43.     public static Polyline OffsetssOutLoop(Polyline closeCur, double offsetDist, bool useSimulate, double stepDist)
  44.     {
  45.       try
  46.       {
  47.         //smc.ed.WriteMessage("\nadb.OffsetOutLoop start ");
  48.         if (closeCur == null || !closeCur.Closed) return null;
  49.         Polyline pLine = null;

  50.         DBObjectCollection objClt = closeCur.GetOffsetCurves(offsetDist);
  51.         if (objClt != null && objClt.Count == 1)
  52.         {
  53.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 1 ");
  54.           pLine = (Polyline)objClt[0];
  55.           if (pLine.Area > closeCur.Area)
  56.             return pLine;
  57.         }
  58.         else if (objClt != null && objClt.Count > 1)
  59.         {
  60.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 2 ");
  61.           pLine = sCur.LoopCurve(objClt);
  62.           if (pLine != null && pLine.Area > closeCur.Area)
  63.             return pLine;

  64.         }
  65.         objClt = closeCur.GetOffsetCurves(-offsetDist);
  66.         if (objClt != null && objClt.Count == 1)
  67.         {
  68.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 3 ");
  69.           pLine = (Polyline)objClt[0];
  70.           if (pLine.Area > closeCur.Area)
  71.             return pLine;

  72.         }
  73.         else if (objClt != null && objClt.Count > 1)
  74.         {
  75.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 4 ");
  76.           pLine = sCur.LoopCurve(objClt);
  77.           if (pLine != null && pLine.Area > closeCur.Area)
  78.             return pLine;
  79.         }
  80.         Int16 OffsetGapType_old = (Int16)app.GetSystemVariable("OffsetGapType");
  81.         //OffsetGapType_old = (int)tVar;
  82.         if (OffsetGapType_old != 1)
  83.         {
  84.           app.SetSystemVariable("OffsetGapType", 1);
  85.           pLine = sCur.OffsetLoop(closeCur, offsetDist, useSimulate, stepDist);
  86.           app.SetSystemVariable("OffsetGapType", OffsetGapType_old);
  87.           if (pLine != null && pLine.Area > closeCur.Area)
  88.             return pLine;
  89.         }
  90.         if (useSimulate)
  91.         {
  92.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 5 ");
  93.           pLine = sCur.SimulatePolyline(closeCur, stepDist);
  94.           return sCur.OffsetLoop(pLine, offsetDist, false, 0);
  95.         }
  96.         return null;
  97.       }
  98.       catch (System.Exception ex)
  99.       {
  100.         smc.WriteLine(ex);
  101.         return null;
  102.       }
  103.     }
  104.     /// <summary>
  105.     /// 获取封闭多义线外偏移线
  106.     /// Version: 2008.02.19
  107.     /// </summary>
  108.     /// <param name="closeCur">封闭多义线</param>
  109.     /// <param name="offsetDist">偏移距离,负数向内偏移,正数向外偏移,等于0返回曲线拷贝</param>
  110.     /// <param name="useSimulate">若直接偏移不成功是否使用模拟线</param>
  111.     /// <param name="stepDist">使用模拟线时的节点距离</param>
  112.     /// <returns>成功返回Polyline,否则返回null</returns>
  113.     public static Polyline OffsetLoop(Polyline closeCur, double offsetDist, bool useSimulate, double stepDist)
  114.     {
  115.       try
  116.       {
  117.         //smc.ed.WriteMessage("\nadb.OffsetOutLoop start ");
  118.         if (closeCur == null || !closeCur.Closed) return null;
  119.         if (offsetDist == 0.0) return (Polyline)closeCur.Clone();
  120.         Polyline pLine = null;

  121.         DBObjectCollection objClt = closeCur.GetOffsetCurves(offsetDist);
  122.         if (objClt != null && objClt.Count == 1)
  123.         {
  124.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 1 ");
  125.           pLine = (Polyline)objClt[0];
  126.           if (offsetDist > 0)
  127.           {
  128.             if (pLine.Area > closeCur.Area)
  129.               return pLine;
  130.           }
  131.           else
  132.           {
  133.             if (pLine.Area < closeCur.Area)
  134.               return pLine;
  135.           }
  136.         }
  137.         else if (objClt != null && objClt.Count > 1)
  138.         {
  139.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 2 ");
  140.           pLine = sCur.LoopCurve(objClt);
  141.           if (offsetDist > 0)
  142.           {
  143.             if (pLine != null && pLine.Area > closeCur.Area)
  144.               return pLine;
  145.           }
  146.           else
  147.           {
  148.             if (pLine != null && pLine.Area < closeCur.Area)
  149.               return pLine;
  150.           }
  151.         }
  152.         objClt = closeCur.GetOffsetCurves(-offsetDist);
  153.         if (objClt != null && objClt.Count == 1)
  154.         {
  155.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 3 ");
  156.           pLine = (Polyline)objClt[0];
  157.           if (offsetDist > 0)
  158.           {
  159.             if (pLine.Area > closeCur.Area)
  160.               return pLine;
  161.           }
  162.           else
  163.           {
  164.             if (pLine.Area < closeCur.Area)
  165.               return pLine;
  166.           }
  167.         }
  168.         else if (objClt != null && objClt.Count > 1)
  169.         {
  170.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 4 ");
  171.           pLine = sCur.LoopCurve(objClt);
  172.           if (offsetDist > 0)
  173.           {
  174.             if (pLine != null && pLine.Area > closeCur.Area)
  175.               return pLine;
  176.           }
  177.           else
  178.           {
  179.             if (pLine != null && pLine.Area < closeCur.Area)
  180.               return pLine;
  181.           }
  182.         }
  183.         Int16 OffsetGapType_old = (Int16)app.GetSystemVariable("OffsetGapType");
  184.         //OffsetGapType_old = (int)tVar;
  185.         if (OffsetGapType_old != 1)
  186.         {
  187.           app.SetSystemVariable("OffsetGapType", 1);
  188.           pLine = sCur.OffsetLoop(closeCur, offsetDist, useSimulate, stepDist);
  189.           app.SetSystemVariable("OffsetGapType", OffsetGapType_old);
  190.           if (offsetDist > 0)
  191.           {
  192.             if (pLine != null && pLine.Area > closeCur.Area)
  193.               return pLine;
  194.           }
  195.           else
  196.           {
  197.             if (pLine != null && pLine.Area < closeCur.Area)
  198.               return pLine;
  199.           }
  200.         }
  201.         if (useSimulate)
  202.         {
  203.           //smc.ed.WriteMessage("\nadb.OffsetOutLoop step 5 ");
  204.           pLine = sCur.SimulatePolyline(closeCur, stepDist);
  205.           return sCur.OffsetLoop(pLine, offsetDist, false, 0);
  206.         }
  207.         return null;
  208.       }
  209.       catch (System.Exception ex)
  210.       {
  211.         smc.WriteLine(ex);
  212.         return null;
  213.       }
  214.     }
  215.     /// <summary>
  216.     /// 从一个点获取点的AutoCAD实体包络线
  217.     /// Version : 2009.03.011
  218.     /// </summary>
  219.     /// <param name="interP">点</param>
  220.     /// <returns>成功返回一个封闭的Polyline曲线,否则返回null</returns>
  221.     public static Curve GetLoop(Point3d interP)
  222.     {
  223.       try
  224.       {
  225.         PromptSelectionResult psRes1 = smc.ed.SelectLast();
  226.         Curve reValue = null;
  227.         if (psRes1.Status == PromptStatus.OK)
  228.         {
  229.           ObjectId lastId_Old = psRes1.Value.GetObjectIds()[0];
  230.           //注意Boundary命令返回的轮廓实体有可能是Region或封闭的Polyline,此由AutoCAD系统变量HPBound来控制
  231.           //HPBound == 1 是Polyline,HPBound == 0 是Region
  232.           //也可以在Boundary命令中使用选项设定轮廓返回实体类型,
  233.           //smc.doc.SendStringToExecute("._-Boundary A O P  " + interP.X.ToString() + "," + interP.Y.ToString() + "  ", true, false, false);
  234.           CommandLine.Command("._-Boundary", interP, "");
  235.           PromptSelectionResult psRes2 = smc.ed.SelectLast();
  236.           ObjectId lastId_New = psRes2.Value.GetObjectIds()[0];
  237.           if (lastId_New != lastId_Old)
  238.           {
  239.             using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  240.             {
  241.               DBObject dbObj = ctrans.GetObject(lastId_New, OpenMode.ForWrite);
  242.               if (dbObj is Curve)
  243.               {
  244.                 Curve cur = (Curve)dbObj.Clone();
  245.                 if (cur.Closed)
  246.                 {
  247.                   reValue = cur;
  248.                 }
  249.               }
  250.               dbObj.Erase();
  251.               ctrans.Commit();
  252.             }
  253.           }
  254.         }
  255.         return reValue;
  256.       }
  257.       catch (System.Exception ex)
  258.       {
  259.         smc.WriteLine(ex);
  260.         return null;
  261.       }
  262.     }
  263.     #endregion dealwith curve
  264.     /// <summary>
  265.     /// 将Line Arc LWPolyline 编辑成LWPolyline,能连接在一起的连接起来
  266.     /// 要求端点相接
  267.     /// Version : 2007.09.19  
  268.     /// 2007.11.01有改动,未做详细测试
  269.     /// 2008.02.14 修改封闭曲线时导致出现零节点的问题
  270.     /// </summary>
  271.     /// <param name="cur1">第一曲线,若两条曲线连接成一条,则新曲线使用第一曲线一般属性(有例外),不应该为null</param>
  272.     /// <param name="cur2">第二曲线,可以为null,这时是编辑单个实体</param>
  273.     /// <param name="dTol">一个距离数值,用于作为判断两点重合的标准</param>
  274.     /// <returns>成功返回Polyline,否则返回null</returns>
  275.     public static Polyline JoinPolyline(Curve cur1, Curve cur2, double dTol)
  276.     {
  277.       try
  278.       {
  279.         //smc.ed.WriteMessage("\nadb.JoinPolyline start ");
  280.         Polyline pline = null;
  281.         if (cur1 == null || cur1.Closed) return null;
  282.         if (!cur1.GetType().Equals(typeof(Polyline)))
  283.         {
  284.           #region !Polyline:Line Arc Polyline
  285.           if (cur2 != null && cur2.GetType().Equals(typeof(Polyline)))
  286.           {//第一曲线为非Polyline,而第二曲线为Polyline,这时以第二曲线作为第一曲线重新调用函数,此举只为减少代码
  287.             return sCur.JoinPolyline(cur2, cur1, dTol);
  288.           }
  289.           pline = new Polyline();
  290.           if (cur1.GetType().Equals(typeof(Line)))//Line:?
  291.           {//曲线为  Line,使用其数据生成一个Polyline
  292.             Line line = (Line)cur1;
  293.             pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
  294.             pline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
  295.             pline.SetPropertiesFrom(line);//使用原来实体属性
  296.             if (cur2 != null)//若第二曲线不为空,则试图连接两者
  297.               pline = sCur.JoinPolyline(pline, cur2, dTol);
  298.             return pline;//将新生成的多义线提交到数据库
  299.           }
  300.           else if (cur1.GetType().Equals(typeof(Arc)))//Arc:?
  301.           {//曲线为  Line,使用其数据生成一个Polyline     
  302.             Arc arc = (Arc)cur1;
  303.             Point3d p1 = arc.GetPointAtParameter(arc.EndParam * 0.5 + arc.StartParam * 0.5);
  304.             double dltAng = arc.EndAngle - arc.StartAngle;
  305.             if (dltAng < 0.0) dltAng += smc.pi * 2;//圆弧的结束角比开始角大时
  306.             double bulge = Math.Tan(dltAng / 4.0);
  307.             if (fun.Clockwise(arc.StartPoint, p1, arc.EndPoint) == -1)//根据圆弧的时钟走向确定凸度正负
  308.               bulge = -bulge;
  309.             pline.AddVertexAt(0, new Point2d(arc.StartPoint.X, arc.StartPoint.Y), bulge, 0, 0);
  310.             pline.AddVertexAt(1, new Point2d(arc.EndPoint.X, arc.EndPoint.Y), 0, 0, 0);
  311.             pline.SetPropertiesFrom(arc);//使用原来实体属性
  312.             if (cur2 != null)//若第二曲线不为空,则试图连接两者
  313.               pline = sCur.JoinPolyline(pline, cur2, dTol);
  314.             return pline;//将新生成的多义线提交到数据库
  315.           }
  316.           else
  317.           {//本函数只处理Line Arc Polyline 三种类型曲线         
  318.             return null;
  319.           }
  320.           #endregion !Polyline:Line Arc Polyline
  321.         }
  322.         else if (cur1.GetType().Equals(typeof(Polyline)))
  323.         {
  324.           #region Polyline:Line Arc Polyline

  325.           pline = (Polyline)cur1;
  326.           if (pline.StartPoint.DistanceTo(pline.EndPoint) < dTol)
  327.           {//曲线的起点和终点重合,将其封闭属性设置为true
  328.             if (!pline.Closed)
  329.               pline.Closed = true;
  330.             return pline;
  331.           }
  332.           if (cur2 != null && cur2.GetType().Equals(typeof(Line)))
  333.           {//第二曲线为Line,将其加入到多义线里,需注意是加入直线的远点
  334.             #region Polyline:Line
  335.             Line line = (Line)cur2;
  336.             if (pline.EndPoint.DistanceTo(line.StartPoint) < dTol)
  337.             {
  338.               pline.AddVertexAt(pline.NumberOfVertices, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
  339.             }
  340.             else if (pline.EndPoint.DistanceTo(line.EndPoint) < dTol)
  341.             {
  342.               pline.AddVertexAt(pline.NumberOfVertices, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
  343.             }
  344.             else if (pline.StartPoint.DistanceTo(line.StartPoint) < dTol)
  345.             {
  346.               pline.AddVertexAt(0, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
  347.             }
  348.             else if (pline.StartPoint.DistanceTo(line.EndPoint) < dTol)
  349.             {
  350.               pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
  351.             }
  352.             #endregion Polyline:Line
  353.           }
  354.           else if (cur2 != null && cur2.GetType().Equals(typeof(Arc)))
  355.           {
  356.             #region Polyline:Arc
  357.             //第二曲线为Arc,将其加入到多义线里,需注意凸度的计算及正负
  358.             //凸度的大小由圆弧的圆周角计算可得,
  359.             //凸度的正负先根据圆弧的时钟走向得到一个值,然后在根据圆弧的近点,中点,远点三点的时钟走向
  360.             //还有在Polyline里是后加入还是前插入来最终确定正负
  361.             Arc arc = (Arc)cur2;
  362.             Point3d p1 = arc.GetPointAtParameter(arc.EndParam * 0.5 + arc.StartParam * 0.5);
  363.             double dltAng = arc.EndAngle - arc.StartAngle;
  364.             if (dltAng < 0.0) dltAng += smc.pi * 2;
  365.             double bulge = Math.Tan(dltAng / 4.0);
  366.             if (pline.EndPoint.DistanceTo(arc.StartPoint) < dTol)
  367.             {//末端接入,根据圆弧近点,中点,远点确定凸度正负
  368.               if (fun.Clockwise(arc.StartPoint, p1, arc.EndPoint) == -1)
  369.                 bulge = -bulge;
  370.               pline.AddVertexAt(pline.NumberOfVertices, new Point2d(arc.EndPoint.X, arc.EndPoint.Y), 0, 0, 0);
  371.               pline.SetBulgeAt(pline.NumberOfVertices - 2, bulge);//注意凸度段序号
  372.             }
  373.             else if (pline.EndPoint.DistanceTo(arc.EndPoint) < dTol)
  374.             {//末端接入,根据圆弧近点,中点,远点确定凸度正负
  375.               if (fun.Clockwise(arc.EndPoint, p1, arc.StartPoint) == -1)
  376.                 bulge = -bulge;
  377.               pline.AddVertexAt(pline.NumberOfVertices, new Point2d(arc.StartPoint.X, arc.StartPoint.Y), 0, 0, 0);
  378.               pline.SetBulgeAt(pline.NumberOfVertices - 2, bulge);
  379.             }
  380.             else if (pline.StartPoint.DistanceTo(arc.StartPoint) < dTol)
  381.             {//开始端接入,根据圆弧远点,中点,近点确定凸度正负
  382.               if (fun.Clockwise(arc.EndPoint, p1, arc.StartPoint) == -1)
  383.                 bulge = -bulge;
  384.               pline.AddVertexAt(0, new Point2d(arc.EndPoint.X, arc.EndPoint.Y), bulge, 0, 0);
  385.             }
  386.             else if (pline.StartPoint.DistanceTo(arc.EndPoint) < dTol)
  387.             {//开始端接入,根据圆弧远点,中点,近点确定凸度正负
  388.               if (fun.Clockwise(arc.StartPoint, p1, arc.EndPoint) == -1)
  389.                 bulge = -bulge;
  390.               pline.AddVertexAt(0, new Point2d(arc.StartPoint.X, arc.StartPoint.Y), bulge, 0, 0);
  391.             }
  392.             #endregion Polyline:Arc
  393.           }
  394.           else if (cur2 != null && cur2.GetType().Equals(typeof(Polyline)))
  395.           {
  396.             #region Polyline:Polyline
  397.             Polyline pline2 = (Polyline)cur2;
  398.             if (pline.EndPoint.DistanceTo(pline2.StartPoint) < dTol)
  399.             { //第一曲线末端接入,第二曲线正向加入
  400.               for (int i = 1; i < pline2.NumberOfVertices; i++)//一段段的读出,加入另外曲线
  401.               {
  402.                 pline.AddVertexAt(pline.NumberOfVertices, pline2.GetPoint2dAt(i), 0, 0, 0);
  403.                 pline.SetBulgeAt(pline.NumberOfVertices - 2, pline2.GetBulgeAt(i - 1));//注意凸度段序号
  404.               }
  405.             }
  406.             else if (pline.EndPoint.DistanceTo(pline2.EndPoint) < dTol)
  407.             {//末端接入,第二曲线逆向加入,第二曲线原有凸度需反向
  408.               for (int i = pline2.NumberOfVertices - 2; i >= 0; i--)
  409.               {
  410.                 pline.AddVertexAt(pline.NumberOfVertices, pline2.GetPoint2dAt(i), 0, 0, 0);
  411.                 pline.SetBulgeAt(pline.NumberOfVertices - 2, -pline2.GetBulgeAt(i));
  412.               }
  413.             }
  414.             else if (pline.StartPoint.DistanceTo(pline2.StartPoint) < dTol)
  415.             {
  416.               //第一曲线开始端入,第二曲线逆向加入,第二曲线原有凸度需反向
  417.               for (int i = 1; i < pline2.NumberOfVertices; i++)
  418.               {
  419.                 pline.AddVertexAt(0, pline2.GetPoint2dAt(i), 0, 0, 0);
  420.                 pline.SetBulgeAt(0, -pline2.GetBulgeAt(i - 1));
  421.               }
  422.             }
  423.             else if (pline.StartPoint.DistanceTo(pline2.EndPoint) < dTol)
  424.             {
  425.               //第一曲线开始端入,第二曲线正向加入
  426.               for (int i = pline2.NumberOfVertices - 2; i >= 0; i--)
  427.               {
  428.                 pline.AddVertexAt(0, pline2.GetPoint2dAt(i), 0, 0, 0);
  429.                 pline.SetBulgeAt(0, pline2.GetBulgeAt(i));
  430.               }
  431.             }
  432.             #endregion Polyline:Polyline
  433.           }
  434.           else
  435.           {
  436.             return null;
  437.           }
  438.           if (pline.StartPoint.DistanceTo(pline.EndPoint) < dTol) //如果曲线起点和终点重合,将Closed = true
  439.           {
  440.             pline.Closed = true;
  441.             //2008.02.14注意:即使起点和终点已重合,pline.Closed = true还是会增加一个节点,导致多义线出现零节点
  442.             pline.RemoveVertexAt(pline.NumberOfVertices - 1);
  443.           }
  444.           return pline;
  445.           #endregion Polyline:Line Arc Polyline
  446.         }
  447.         return pline;
  448.       }
  449.       catch (System.Exception ex)
  450.       {
  451.         smc.WriteLine(ex);
  452.         return null;
  453.       }
  454.     }
  455.     /// <summary>
  456.     /// 连接多义线
  457.     /// 对需要删除的实体调用erase函数,但没有提交
  458.     /// 只能处理三种曲线类型Line Arc LWPolyline(Polyline)
  459.     /// Version : 2008.01.23
  460.     /// </summary>
  461.     /// <param name="dbClt">实体集合,可以包含非多义线实体</param>
  462.     /// <param name="dTol">连接的间隔</param>
  463.     /// <returns>成功返回连接后的实体集合,可能包含非多义线实体,否则返回null</returns>
  464.     public static DBObjectCollection JoinPolyline(DBObjectCollection dbClt, double dTol)
  465.     {
  466.       try
  467.       {
  468.         if (dbClt == null) return null;
  469.         Point3dCollection stPs = new Point3dCollection();//起点集合
  470.         Point3dCollection enPs = new Point3dCollection();//终点集合     
  471.         DBObjectCollection dbClt1 = new DBObjectCollection();
  472.         DBObjectCollection dbClt2 = new DBObjectCollection();
  473.         foreach (DBObject dbObj in dbClt)
  474.         {
  475.           if (dbObj.GetType().IsSubclassOf(typeof(Curve)))
  476.           {
  477.             Curve cur = (Curve)dbObj;
  478.             if (cur.Closed)
  479.             {
  480.               dbClt1.Add(dbObj);
  481.             }
  482.             else
  483.             {
  484.               stPs.Add(fun.RoundPoint3d(cur.StartPoint));
  485.               enPs.Add(fun.RoundPoint3d(cur.EndPoint));
  486.               dbClt2.Add(dbObj);
  487.             }
  488.           }
  489.           else
  490.           {
  491.             dbClt1.Add(dbObj);
  492.           }
  493.         }
  494.         #region join Polyline
  495.         DBObject[] arrObj = new DBObject[dbClt2.Count];
  496.         //DBObject[] arrObj = (DBObject[])System.Array.CreateInstance(typeof(DBObject), dbClt2.Count);
  497.         dbClt2.CopyTo(arrObj, 0);//将曲线id集合复制到数组,使用一个新集合应该耶可以,但担心会引用传递,没测试            
  498.         DBObjectCollection idClt = new DBObjectCollection();
  499.         for (int i = 0; i < arrObj.Length; i++)
  500.         {
  501.           if (idClt.IndexOf(arrObj[i]) == -1)
  502.           {//剔除已经处理过的曲线id,后面对ObjectId的检查应该是多余的,为保险而用
  503.             Curve pline3 = (Curve)arrObj[i];
  504.             Curve pline1 = pline3;
  505.             if (!pline1.GetType().Equals(typeof(Polyline)))
  506.             {
  507.               pline1 = sCur.JoinPolyline(pline3, null, dTol);
  508.               if (!pline3.IsNewObject)
  509.                 pline3.Erase();
  510.               dbClt1.Add(pline1);
  511.             }
  512.             int pIndex2 = dbClt2.IndexOf(arrObj[i]);
  513.             if (pIndex2 != -1)
  514.             {
  515.               stPs.RemoveAt(pIndex2);//从集合移除当前项,以免自己和自己连接
  516.               enPs.RemoveAt(pIndex2);
  517.               dbClt2.RemoveAt(pIndex2);
  518.             }
  519.             bool cont1 = true;
  520.             while (cont1 && !pline1.Closed)
  521.             {
  522.               cont1 = false;
  523.               int pIndex = stPs.IndexOf(fun.RoundPoint3d(pline1.StartPoint));
  524.               if (pIndex == -1)
  525.                 pIndex = enPs.IndexOf(fun.RoundPoint3d(pline1.StartPoint));
  526.               if (pIndex != -1)
  527.               {//在起点或终点集合中找到当前曲线StartPoint重合点,下面对两条曲线连接
  528.                 Curve pline2 = (Curve)dbClt2[pIndex];
  529.                 Polyline pLine = sCur.JoinPolyline(pline1, pline2, dTol);
  530.                 if (!pline2.IsNewObject)
  531.                   pline2.Erase();

  532.                 cont1 = true;
  533.                 idClt.Add(dbClt2[pIndex]);//将处理过的项从集合移除
  534.                 stPs.RemoveAt(pIndex);
  535.                 enPs.RemoveAt(pIndex);
  536.                 dbClt2.RemoveAt(pIndex);
  537.                 pline1 = pLine;
  538.               }
  539.               if (!pline1.Closed)//曲线封闭,这个曲线的编辑结束
  540.               {
  541.                 pIndex = enPs.IndexOf(fun.RoundPoint3d(pline1.EndPoint));
  542.                 if (pIndex == -1)
  543.                   pIndex = stPs.IndexOf(fun.RoundPoint3d(pline1.EndPoint));
  544.                 if (pIndex != -1)
  545.                 {//在起点或终点集合中找到当前曲线EndPoint重合点,下面对两条曲线连接
  546.                   Curve pline2 = (Curve)dbClt2[pIndex];
  547.                   Polyline pLine = sCur.JoinPolyline(pline1, pline2, dTol);
  548.                   if (!pline2.IsNewObject)
  549.                     pline2.Erase();
  550.                   cont1 = true;
  551.                   idClt.Add(dbClt2[pIndex]);//将处理过的项从集合移除
  552.                   stPs.RemoveAt(pIndex);
  553.                   enPs.RemoveAt(pIndex);
  554.                   dbClt2.RemoveAt(pIndex);
  555.                   pline1 = pLine;
  556.                 }
  557.               }
  558.             }
  559.           }
  560.         }
  561.         return dbClt1;
  562.         #endregion join Polyline
  563.       }
  564.       catch (System.Exception ex)
  565.       {
  566.         smc.WriteLine(ex);
  567.         return null;
  568.       }
  569.     }
  570.     /// <summary>
  571.     /// 将多个组成环型的曲线连接起来
  572.     /// Version : 2008.01.29
  573.     /// </summary>
  574.     /// <param name="curves">多个组成环型的曲线</param>
  575.     /// <returns>成功返回Polyline,否则返回null</returns>
  576.     public static Polyline LoopCurve(DBObjectCollection curves)
  577.     {
  578.       try
  579.       {
  580.         if (curves == null) return null;
  581.         DBObjectCollection dbClt1 = new DBObjectCollection();
  582.         foreach (DBObject dbObj in curves)
  583.         {
  584.           if (dbObj.GetType().IsSubclassOf(typeof(Curve)))
  585.           {
  586.             Curve cur = (Curve)dbObj;
  587.             //曲线不封闭且头尾端点不相接的曲线
  588.             if (!cur.Closed && cur.GetDistanceAtParameter(cur.EndParam) > 0.0001)
  589.             {
  590.               dbClt1.Add(cur);
  591.             }
  592.           }
  593.         }
  594.         if (dbClt1.Count == 0) return null;
  595.         DBObjectCollection dbClt2 = new DBObjectCollection();
  596.         Curve curCurve = (Curve)dbClt1[0];
  597.         dbClt2.Add(curCurve);
  598.         Point3d curEnd = curCurve.EndPoint;
  599.         Point3dCollection prePClt = new Point3dCollection();
  600.         Point3dCollection pstPClt = new Point3dCollection();
  601.         prePClt.Add(curCurve.StartPoint);
  602.         pstPClt.Add(curCurve.EndPoint);
  603.         while (dbClt2.Count < dbClt1.Count)
  604.         {
  605.           bool firstValue = true;
  606.           double curDist = 0;
  607.           int nearIndex = 0;
  608.           bool endStartType = true;
  609.           for (int i = 0; i < dbClt1.Count; i++)
  610.           {
  611.             if (dbClt2.IndexOf(dbClt1[i]) < 0)
  612.             {
  613.               Curve cur2 = (Curve)dbClt1[i];
  614.               double dist1 = curEnd.DistanceTo(cur2.StartPoint);
  615.               double dist2 = curEnd.DistanceTo(cur2.EndPoint);
  616.               if (firstValue)
  617.               {
  618.                 if (dist1 < dist2)
  619.                 {
  620.                   curDist = dist1;
  621.                   endStartType = true;
  622.                 }
  623.                 else
  624.                 {
  625.                   curDist = dist2;
  626.                   endStartType = false;
  627.                 }
  628.                 firstValue = false;
  629.                 nearIndex = i;
  630.               }
  631.               else if (curDist > Math.Min(dist1, dist2))
  632.               {
  633.                 if (dist1 < dist2)
  634.                 {
  635.                   curDist = dist1;
  636.                   endStartType = true;
  637.                 }
  638.                 else
  639.                 {
  640.                   curDist = dist2;
  641.                   endStartType = false;
  642.                 }
  643.                 nearIndex = i;
  644.               }
  645.             }
  646.           }
  647.           curCurve = (Curve)dbClt1[nearIndex];
  648.           if (endStartType)
  649.           {
  650.             curEnd = curCurve.StartPoint;
  651.             prePClt.Add(curCurve.StartPoint);
  652.             pstPClt.Add(curCurve.EndPoint);
  653.           }
  654.           else
  655.           {
  656.             curEnd = curCurve.EndPoint;
  657.             prePClt.Add(curCurve.EndPoint);
  658.             pstPClt.Add(curCurve.StartPoint);
  659.           }
  660.           dbClt2.Add(curCurve);
  661.         }
  662.         DBObjectCollection dbClt3 = new DBObjectCollection();
  663.         dbClt3.Add(dbClt2[0]);
  664.         for (int i = 1; i < dbClt2.Count; i++)
  665.         {
  666.           if (pstPClt[i - 1].DistanceTo(prePClt[i]) > 0.0001)
  667.           {
  668.             Line tLine = new Line(pstPClt[i - 1], prePClt[i]);
  669.             dbClt3.Add(tLine);
  670.           }
  671.           dbClt3.Add(dbClt2[i]);
  672.         }
  673.         if (pstPClt[dbClt2.Count - 1].DistanceTo(prePClt[0]) > 0.0001)
  674.         {
  675.           Line tLine = new Line(pstPClt[dbClt2.Count - 1], prePClt[0]);
  676.           dbClt3.Add(tLine);
  677.         }
  678.         //Tolerance dTol = new Tolerance(0.0001, 0.0001);
  679.         Polyline pLine = sCur.JoinPolyline((Curve)dbClt3[0], null, 0.0001);
  680.         for (int i = 1; i < dbClt3.Count; i++)
  681.         {
  682.           //Curve  cur = (Curve)dbClt3[i];
  683.           //ent.ColorIndex = 50 + i;
  684.           pLine = sCur.JoinPolyline(pLine, (Curve)dbClt3[i], 0.0001);
  685.         }
  686.         // adb.DrawEntity(dbClt3, sEntclls.Null, false);         

  687.         return pLine;
  688.       }
  689.       catch (System.Exception ex)
  690.       {
  691.         smc.WriteLine(ex);
  692.         return null;
  693.       }
  694.     }
  695.     /// <summary>
  696.     /// 剪切曲线,被剪切线的与切割线交点到trimPoint部分被切除
  697.     /// Note :  
  698.     /// 1,trimPoint不要求在被剪切线上,
  699.     /// 2,实体不提交到数据库,但对被删除实体使用了Erase()方法
  700.     /// Version : 2008.01.08
  701.     /// </summary>
  702.     /// <param name="trimLine">切割线</param>
  703.     /// <param name="curveBeTrim">被剪切曲线线</param>
  704.     /// <param name="trimPoint">切除位置点,用于确认去除曲线的部分</param>
  705.     /// <returns>成功返回剪切后剩下的实体集合,否则返回null</returns>
  706.     public static DBObjectCollection TrimCurve(Curve trimLine, Curve curveBeTrim, Point3d trimPoint, bool extendTrimLine)
  707.     {
  708.       try
  709.       {
  710.         //smc.ed.WriteMessage("\nsCur.TrimCurve B1");
  711.         if (trimLine == null || curveBeTrim == null) return null;
  712.         Point3dCollection points = new Point3dCollection();
  713.         if (extendTrimLine)
  714.         {
  715.           points = sEnt.IntersectWith(trimLine, curveBeTrim, Intersect.ExtendThis);
  716.         }
  717.         else
  718.         {
  719.           points = sEnt.IntersectWith(trimLine, curveBeTrim, Intersect.OnBothOperands);
  720.         }
  721.         if (points == null || points.Count == 0)
  722.         {         
  723.           return null;
  724.         }
  725.         DoubleCollection dc1 = new DoubleCollection();
  726.         for (int i = 0; i < points.Count; i++)
  727.         {
  728.           double param1 = curveBeTrim.GetParameterAtPoint(points[i]);
  729.           if (dc1.Count == 0)
  730.           {
  731.             dc1.Add(param1);
  732.           }
  733.           else
  734.           {
  735.             if (param1 <= dc1[0])
  736.               dc1.Insert(0, param1);
  737.             else if (param1 > dc1[dc1.Count - 1])
  738.               dc1.Add(param1);
  739.             else
  740.             {
  741.               for (int j = 1; j < dc1.Count; j++)
  742.               {
  743.                 if (param1 <= dc1[j])
  744.                 {
  745.                   dc1.Insert(j, param1);
  746.                   break;
  747.                 }
  748.               }
  749.             }
  750.           }
  751.         }
  752.         DBObjectCollection reClt = new DBObjectCollection();
  753.         DBObjectCollection dbClt1 = curveBeTrim.GetSplitCurves(dc1);
  754.         if (dbClt1 != null)
  755.         {           
  756.           foreach (DBObject dbObj in dbClt1)
  757.           {
  758.             Curve cur3 = (Curve)dbObj;         
  759.             Point3d p1 = cur3.GetPointAtParameter((cur3.EndParam + cur3.StartParam) / 2.0);
  760.             Point3dCollection ps2 = new Point3dCollection();
  761.             Line l1 = new Line(p1, trimPoint);
  762.             if (extendTrimLine)
  763.             {
  764.               ps2 = sEnt.IntersectWith(trimLine, l1, Intersect.ExtendThis);
  765.             }
  766.             else
  767.             {
  768.               ps2 = sEnt.IntersectWith(trimLine, l1, Intersect.OnBothOperands);
  769.             }            
  770.             if (ps2.Count % 2 == 1)//根据交点数判断曲线的位置,奇数为保留侧,偶数为去处侧
  771.             {              
  772.               reClt.Add(cur3);
  773.             }
  774.           }
  775.         }
  776.         if (!curveBeTrim.IsNewObject)
  777.         {
  778.           curveBeTrim.Erase();
  779.         }
  780.         return reClt;
  781.       }
  782.       catch (System.Exception ex)
  783.       {  
  784.         smc.WriteLine(ex);
  785.         return null;
  786.       }
  787.     }
  788.     /// <summary>
  789.     /// 取曲线内部一点有待改进
  790.     /// 切除曲线里面或外面部分
  791.     /// Version : 2008.03.12
  792.     /// </summary>
  793.     /// <param name="trimLine">切割线:封闭曲线或为null,为null时使用dbClt第一曲线为切割线</param>
  794.     /// <param name="dbClt">被切割的曲线</param>
  795.     /// <param name="trimOut">true切除切割线外面部分,false切除切割线里面部分</param>
  796.     /// <returns>成功返回剪切后剩下的实体集合,否则返回null</returns>
  797.     public static DBObjectCollection TrimCurve(Curve trimLine, DBObjectCollection dbClt, bool trimOut)
  798.     {
  799.       try
  800.       {
  801.         //smc.ed.WriteMessage("\nsCur.TrimCurve 1");
  802.         if (dbClt == null || dbClt.Count == 0) return null;
  803.         bool trimType = true;
  804.         if (trimLine == null)
  805.         {
  806.           if (dbClt[0].GetType().IsSubclassOf(typeof(Curve)))
  807.           {
  808.             trimLine = (Curve)dbClt[0];
  809.             trimType = false;
  810.           }
  811.           else
  812.           {
  813.             return null;
  814.           }
  815.         }
  816.         if (!trimLine.Closed)
  817.         {
  818.           return null;
  819.         }
  820.         Point3d trimPoint = trimLine.GeomExtents.MaxPoint + new Vector3d(1, 1, 0);
  821.         if (!trimOut)
  822.           trimPoint = fun.MidPoint(trimLine.GeomExtents.MaxPoint, trimLine.GeomExtents.MinPoint);

  823.         DBObjectCollection reValue = new DBObjectCollection();
  824.         for (int i = (trimType ? 0 : 1); i < dbClt.Count; i++)
  825.         {
  826.           if (dbClt[i].GetType().IsSubclassOf(typeof(Curve)))
  827.           {
  828.             Curve cur = (Curve)dbClt[i];

  829.             Point3dCollection points1 = sEnt.IntersectWith(trimLine, cur, Intersect.OnBothOperands);
  830.             if (points1 == null || points1.Count == 0)
  831.             {
  832.               Line l1 = new Line(cur.StartPoint, trimPoint);
  833.               Point3dCollection points2 = sEnt.IntersectWith(trimLine, l1, Intersect.OnBothOperands);
  834.               if (points2.Count % 2 == 1)
  835.               {
  836.                 reValue.Add(cur);
  837.               }
  838.             }
  839.             else
  840.             {
  841.               fun.CollectionAdd(reValue, sCur.TrimCurve(trimLine, cur, trimPoint, false));
  842.             }
  843.           }
  844.         }
  845.         return reValue;
  846.       }
  847.       catch (System.Exception ex)
  848.       {
  849.         smc.WriteLine(ex);
  850.         return null;
  851.       }
  852.     }
  853.     /// <summary>
  854.     /// 方向性切除或内外切除,或视图式切除
  855.     /// 切割线内外侧或一侧的实体被切除
  856.     /// 切割线会在返回集合里面,并刚好封闭切口  
  857.     /// Version : 2008.12.02
  858.     /// Note : 只测试了直线Line类型切割线
  859.     /// </summary>
  860.     /// <param name="trimLine">切割线</param>
  861.     /// <param name="dbClt">被切割集合</param>
  862.     /// <param name="trimPoint">切割点,决定切除侧</param>
  863.     /// <returns>成功返回集合,否则返回null</returns>
  864.     public static DBObjectCollection TrimSide(Curve trimLine, DBObjectCollection dbClt, Point3d trimPoint)
  865.     {
  866.       try
  867.       {
  868.         if (trimLine == null || dbClt == null || dbClt.Count == 0) return null;
  869.         DBObjectCollection reValue = new DBObjectCollection();
  870.         Point3dCollection pClt = new Point3dCollection();
  871.         if (trimLine.Closed)
  872.         {
  873.           #region 切割线是封闭曲线
  874.           Extents3d tExt = sEnt.GetExtend3d(dbClt);
  875.           if (trimPoint.X > tExt.MinPoint.X && trimPoint.X < tExt.MaxPoint.X &&
  876.             trimPoint.Y > tExt.MinPoint.Y && trimPoint.Y < tExt.MaxPoint.Y)
  877.             reValue = sCur.TrimCurve(trimLine, dbClt, false);
  878.           else
  879.             reValue = sCur.TrimCurve(trimLine, dbClt, true);
  880.           fun.CollectionAdd(reValue, trimLine);
  881.           return reValue;
  882.           #endregion 切割线是封闭曲线
  883.         }
  884.         else if (trimLine is Line)
  885.         {
  886.           #region 切割线是直线Line,方向性切割
  887.           Line l1 = (Line)trimLine;
  888.           Vector3d trimVec = fun.VerticalVector(trimPoint, l1);
  889.           foreach (Entity ent in dbClt)
  890.           {
  891.             if (ent is Curve)
  892.             {
  893.               Curve cur = (Curve)ent;
  894.               Point3dCollection points = sEnt.IntersectWith(l1, cur, Intersect.OnBothOperands);
  895.               if (points == null || points.Count == 0)
  896.               {
  897.                 if (fun.VerticalVector(cur.StartPoint, l1).Negate().IsCodirectionalTo(trimVec))
  898.                 {
  899.                   fun.CollectionAdd(reValue, cur);
  900.                 }
  901.               }
  902.               else
  903.               {
  904.                 fun.CollectionAdd(reValue, sCur.TrimCurve(l1, cur, trimPoint, false));
  905.                 foreach (Point3d tp in points)
  906.                 {
  907.                   pClt.Add(tp);
  908.                 }
  909.               }
  910.             }
  911.             else
  912.             {
  913.               if (fun.VerticalVector(fun.MidPoint(ent.GeomExtents), l1).Negate().IsCodirectionalTo(trimVec))
  914.               {
  915.                 fun.CollectionAdd(reValue, ent);
  916.               }
  917.             }
  918.           }
  919.           if (pClt.Count > 0)
  920.           {
  921.             Point3d p21 = pClt[0];
  922.             Point3d p22 = pClt[0];
  923.             foreach (Point3d tp in pClt)
  924.             {
  925.               if (tp.DistanceTo(l1.StartPoint) < p21.DistanceTo(l1.StartPoint))
  926.                 p21 = tp;
  927.               if (tp.DistanceTo(l1.EndPoint) < p22.DistanceTo(l1.EndPoint))
  928.                 p22 = tp;
  929.             }
  930.             l1.StartPoint = p21;
  931.             l1.EndPoint = p22;
  932.             fun.CollectionAdd(reValue, l1);
  933.           }
  934.           else
  935.             fun.CollectionAdd(reValue, l1);
  936.           #endregion 切割线是直线Line,方向性切割
  937.         }
  938.         else
  939.         {
  940.           #region 切割线是不封闭的曲线,方向性切割

  941.           //smc.ed.WriteMessage("\nsCur.TrimSide dbClt.Count = {0}", dbClt.Count);
  942.           int clockSize1 = fun.Clockwise(trimLine.StartPoint, trimPoint, trimLine.EndPoint);
  943.           //Vector3d trimVec = fun.VerticalVector(trimPoint, trimLine);
  944.           foreach (Entity ent in dbClt)
  945.           {
  946.             Point3dCollection points = sEnt.IntersectWith(trimLine, ent, Intersect.OnBothOperands);
  947.             if (points == null || points.Count == 0)
  948.             {            
  949.               Point3d p2 = trimLine.GetClosestPointTo(fun.MidPoint(ent.GeomExtents), false);
  950.               double dist2 = trimLine.GetDistAtPoint(p2);
  951.               double dist21 = dist2 - 0.001 < 0 ? 0 : dist2 - 0.001;
  952.               double dist22 = dist2 + 0.001 > trimLine.GetDistanceAtParameter(trimLine.EndParam) ? trimLine.GetDistanceAtParameter(trimLine.EndParam) : dist2 + 0.001;
  953.               Point3d p21 = trimLine.GetPointAtDist(dist21);
  954.               Point3d p22 = trimLine.GetPointAtDist(dist22);
  955.               int clockSize2 = fun.Clockwise(p21, fun.MidPoint(ent.GeomExtents), p22);
  956.               if (clockSize1 != clockSize2)
  957.                 fun.CollectionAdd(reValue, ent);
  958.             }
  959.             else
  960.             {
  961.               if (ent is Curve)
  962.               {
  963.                 DBObjectCollection dbClt1 = sCur.TrimCurve(trimLine, (Curve)ent, trimPoint, false);
  964.                 if (dbClt1 != null && dbClt1.Count > 0)
  965.                 {                  
  966.                   fun.CollectionAdd(reValue, dbClt1);
  967.                   foreach (Point3d tp in points)
  968.                   {
  969.                     pClt.Add(tp);
  970.                   }
  971.                 }
  972.               }
  973.               else
  974.               {
  975.                 fun.CollectionAdd(reValue, ent);
  976.               }
  977.             }
  978.           }
  979.           smc.ed.WriteMessage("\nsCur.TrimSide ");
  980.           //return null;
  981.           if (pClt.Count > 0)
  982.           {

  983.             Point3d p21 = pClt[0];
  984.             Point3d p22 = pClt[0];
  985.             foreach (Point3d tp in pClt)
  986.             {
  987.               if (trimLine.GetParameterAtPoint(tp) < trimLine.GetParameterAtPoint(p21))
  988.                 p21 = tp;
  989.               if (trimLine.GetParameterAtPoint(tp) > trimLine.GetParameterAtPoint(p22))
  990.                 p22 = tp;
  991.             }
  992.             if (trimLine.StartPoint.DistanceTo(p21) > 0.01 && trimLine.EndPoint.DistanceTo(p22) > 0.01)
  993.             {
  994.               smc.ed.WriteMessage(" A1 ");
  995.               DoubleCollection dClt = new DoubleCollection();
  996.               dClt.Add(trimLine.GetParameterAtPoint(p21));
  997.               dClt.Add(trimLine.GetParameterAtPoint(p22));
  998.               DBObjectCollection dbClt1 = trimLine.GetSplitCurves(dClt);
  999.               if (dbClt1 != null && dbClt1.Count > 1)
  1000.               {
  1001.                 foreach (DBObject dbObj in dbClt1)
  1002.                 {
  1003.                   if (dbObj == null)
  1004.                   {
  1005.                   }
  1006.                 }
  1007.                 fun.CollectionAdd(reValue, dbClt1[1]);
  1008.               }
  1009.             }
  1010.             else if (trimLine.StartPoint.DistanceTo(p21) > 0.01)
  1011.             {
  1012.               smc.ed.WriteMessage(" A2 ");
  1013.               DoubleCollection dClt = new DoubleCollection();
  1014.               dClt.Add(trimLine.GetParameterAtPoint(p21));
  1015.               DBObjectCollection dbClt1 = trimLine.GetSplitCurves(dClt);
  1016.               if (dbClt1 != null && dbClt1.Count > 1)
  1017.               {
  1018.                 foreach (DBObject dbObj in dbClt1)
  1019.                 {
  1020.                   if (dbObj == null)
  1021.                   {
  1022.                   }
  1023.                 }
  1024.                 fun.CollectionAdd(reValue, dbClt1[1]);
  1025.               }
  1026.             }
  1027.             else if (trimLine.EndPoint.DistanceTo(p22) > 0.01)
  1028.             {
  1029.               smc.ed.WriteMessage(" A3 ");
  1030.               DoubleCollection dClt = new DoubleCollection();
  1031.               dClt.Add(trimLine.GetParameterAtPoint(p22));
  1032.               DBObjectCollection dbClt1 = trimLine.GetSplitCurves(dClt);
  1033.               if (dbClt1 != null && dbClt1.Count > 0)
  1034.               {
  1035.                 foreach (DBObject dbObj in dbClt1)
  1036.                 {
  1037.                   if (dbObj == null)
  1038.                   {
  1039.                   }
  1040.                 }
  1041.                 fun.CollectionAdd(reValue, dbClt1[0]);
  1042.               }
  1043.             }
  1044.             else
  1045.             {
  1046.               smc.ed.WriteMessage(" A4 ");
  1047.             }
  1048.           }
  1049.           else
  1050.           {
  1051.             smc.ed.WriteMessage(" A5 ");
  1052.             fun.CollectionAdd(reValue, trimLine);
  1053.           }
  1054.           #endregion 切割线是不封闭的曲线,方向性切割
  1055.         }
  1056.         return reValue;
  1057.       }
  1058.       catch (System.Exception ex)
  1059.       {
  1060.         smc.WriteLine(ex);
  1061.         return null;
  1062.       }
  1063.     }
  1064.     /// <summary>
  1065.     /// 视图弦切
  1066.     /// Version : 2009.01.16
  1067.     /// </summary>
  1068.     /// <param name="dbClt"></param>
  1069.     /// <param name="center"></param>
  1070.     /// <param name="chordVec"></param>
  1071.     /// <param name="direction"></param>
  1072.     /// <returns></returns>
  1073.     public static DBObjectCollection ChordTrim(DBObjectCollection dbClt, Point3d center, Vector3d chordVec, Directions direction)
  1074.     {
  1075.       try
  1076.       {
  1077.         if (dbClt == null || dbClt.Count == 0) return null;
  1078.         if (chordVec.IsZeroLength()) return dbClt;
  1079.         Extents3d ext = sEnt.GetExtend3d(dbClt);
  1080.         switch (direction)
  1081.         {
  1082.           case Directions.RIGHT:
  1083.           case Directions.FRONT:
  1084.             {
  1085.               int iDrec = chordVec.X > 0 ? 1 : -1;
  1086.               Point3d p1 = new Point3d(center.X + chordVec.Length*iDrec, ext.MaxPoint.Y, 0);
  1087.               Point3d p2 = new Point3d(center.X + chordVec.Length * iDrec, ext.MinPoint.Y, 0);
  1088.               Point3d p3 = p1 + new Vector3d(10 * iDrec, 0, 0);
  1089.               Line l1 = new Line(p1, p2);
  1090.               return sCur.TrimSide(l1, dbClt, p3);
  1091.             }
  1092.           case Directions.UP:
  1093.           default:
  1094.             {
  1095.               Vector3d tVec1 = chordVec.RotateBy(smc.pi2, Vector3d.ZAxis).GetNormal();
  1096.               Point3d p1 = center + chordVec + tVec1 * ext.MaxPoint.DistanceTo(ext.MinPoint);
  1097.               Point3d p2 = center + chordVec - tVec1 * ext.MaxPoint.DistanceTo(ext.MinPoint);
  1098.               Point3d p3 = p1 + chordVec;
  1099.               Line l1 = new Line(p1, p2);
  1100.               return sCur.TrimSide(l1, dbClt, p3);
  1101.             }
  1102.         }
  1103.       }
  1104.       catch (System.Exception ex)
  1105.       {
  1106.         smc.WriteLine(ex);
  1107.         return null;
  1108.       }
  1109.     }
  1110.     /// <summary>
  1111.     /// 打断曲线
  1112.     /// </summary>
  1113.     /// <param name="curve">曲线对象</param>
  1114.     /// <param name="p1">第一个打断点</param>
  1115.     /// <param name="p2">第二个打断点</param>
  1116.     /// <returns>正常结束返回true,否则返回false</returns>
  1117.     public static bool BreakCurve(Curve curve, Point3d p1, Point3d p2)
  1118.     {
  1119.       try
  1120.       {
  1121.         if (curve == null) return false;
  1122.         Point3d p11 = curve.GetClosestPointTo(p1, false);
  1123.         double param1 = curve.GetParameterAtPoint(p11);
  1124.         Point3d p21 = curve.GetClosestPointTo(p2, false);
  1125.         double param2 = curve.GetParameterAtPoint(p21);
  1126.         DoubleCollection dColl = new DoubleCollection(2);
  1127.         if (param1 < param2)
  1128.         {
  1129.           dColl.Add(param1);
  1130.           dColl.Add(param2);
  1131.         }
  1132.         else
  1133.         {
  1134.           dColl.Add(param2);
  1135.           dColl.Add(param1);
  1136.         }
  1137.         DBObjectCollection objColl = curve.GetSplitCurves(dColl);
  1138.         foreach (DBObject obj in objColl)
  1139.         {//完成对DBObjectCollection 的初始化,这是因为DBObjectCollection bug而采取的动作
  1140.           if (obj == null)
  1141.             throw new InvalidOperationException();
  1142.         }
  1143.         Entity ent;
  1144.         if (objColl.Count == 2)
  1145.         {
  1146.           ent = (Entity)objColl[1];
  1147.           adb.DrawEntity(ent);
  1148.         }
  1149.         else if (objColl.Count == 3)
  1150.         {
  1151.           ent = (Entity)objColl[0];
  1152.           adb.DrawEntity(ent);
  1153.           // ent = (Entity)objColl[1];//注意:若没有这一句,系统会捕捉到错误,如下:
  1154.           //here catch System.Exception ex
  1155.           //ex.Message = Insertion index was out of range. Must be non-negative and  
  1156.           //less than or equal to size.
  1157.           //Parameter name: index
  1158.           //错误应该是不能访问objColl[2]
  1159.           //adb.DrawEntity(ent);
  1160.           ent = (Entity)objColl[2];//注意:若没有前面一句,系统会在这里捕捉到错误,如上:
  1161.           adb.DrawEntity(ent);
  1162.         }
  1163.         curve.Erase();
  1164.         return true;
  1165.       }

  1166.       catch (System.Exception ex)
  1167.       {
  1168.         smc.WriteLine(ex);
  1169.         return false;
  1170.       }
  1171.     }
  1172.     /// <summary>
  1173.     /// 延伸或缩短extendCur到frameCur曲线轮廓,使得extendCur的端点在frameCur曲线上
  1174.     /// Version : 2008.03.018
  1175.     /// 对多义线Polyline没有考虑周详
  1176.     /// </summary>
  1177.     /// <param name="extendCur"></param>
  1178.     /// <param name="frameCur"></param>
  1179.     /// <returns></returns>
  1180.     public static bool ExtendToCurve(Curve extendCur, Curve frameCur)
  1181.     {
  1182.       try
  1183.       {
  1184.         if (extendCur == null || frameCur == null) return false;
  1185.         if (!frameCur.Closed) return false;
  1186.         Point3dCollection inters = sEnt.IntersectWith(extendCur, frameCur, Intersect.ExtendThis);
  1187.         if (inters.Count != 2) return false;
  1188.         if (extendCur.Closed)
  1189.         {
  1190.           DBObjectCollection dbClt1 = new DBObjectCollection();
  1191.           dbClt1.Add(extendCur);
  1192.           DBObjectCollection dbClt2 = sCur.TrimCurve(frameCur, dbClt1, true);
  1193.           if (dbClt2 != null && dbClt2.Count > 0)
  1194.           {
  1195.             extendCur = (Curve)dbClt2[0];
  1196.             return true;
  1197.           }
  1198.           else
  1199.           {
  1200.             return false;
  1201.           }
  1202.         }
  1203.         else
  1204.         {
  1205.           if (extendCur.StartPoint.DistanceTo(inters[0]) < extendCur.EndPoint.DistanceTo(inters[1]))
  1206.           {
  1207.             extendCur.Extend(true, inters[0]);
  1208.             extendCur.Extend(false, inters[1]);
  1209.           }
  1210.           else
  1211.           {
  1212.             extendCur.Extend(false, inters[0]);
  1213.             extendCur.Extend(true, inters[1]);
  1214.           }
  1215.           return true;
  1216.         }
  1217.       }
  1218.       catch (System.Exception ex)
  1219.       {
  1220.         smc.WriteLine(ex);
  1221.         return false;
  1222.       }
  1223.     }
  1224.     /// <summary>
  1225.     /// 从一个封闭曲线切除一部分
  1226.     /// </summary>
  1227.     /// <param name="beSubtractCur">被切除的封闭曲线</param>
  1228.     /// <param name="subtractCur">作为切除线的封闭曲线</param>
  1229.     /// <returns>成功返回一个封闭的多义线,否则返回null</returns>
  1230.     static public Polyline SubtractCurve(Curve beSubtractCur, Curve subtractCur)
  1231.     {
  1232.       try
  1233.       {
  1234.         //smc.ed.WriteMessage("\nadb.UnionCurve(Curve cur1, Curve cur2)");
  1235.         if (subtractCur == null || beSubtractCur == null) return null;
  1236.         if (!subtractCur.Closed || !beSubtractCur.Closed) return null;
  1237.         Point3dCollection inters = sEnt.IntersectWith(subtractCur, beSubtractCur, Intersect.OnBothOperands);
  1238.         if (inters.Count < 2) return null;

  1239.         //若能使用在交点处打断曲线在连接的方式速度方面应该会快一些
  1240.         //但因曲线的形状和相交关系太复杂不能掌控,主要是没法判断去除打断后的哪一段曲线
  1241.         #region use Region union way

  1242.         DBObjectCollection dbClt1 = new DBObjectCollection();
  1243.         dbClt1.Add(beSubtractCur);
  1244.         DBObjectCollection dbClt2 = new DBObjectCollection();
  1245.         dbClt2.Add(subtractCur);
  1246.         DBObjectCollection dbClt3 = Region.CreateFromCurves(dbClt1);
  1247.         DBObjectCollection dbClt4 = Region.CreateFromCurves(dbClt2);
  1248.         if (dbClt3 == null || dbClt3.Count == 0)
  1249.           return null;
  1250.         if (dbClt4 == null || dbClt4.Count == 0)
  1251.           return null;
  1252.         Region reg1 = (Region)dbClt3[0];
  1253.         Region reg2 = (Region)dbClt4[0];
  1254.         reg1.BooleanOperation(BooleanOperationType.BoolSubtract, reg2);
  1255.         if (reg1.IsNull || reg1.Area == 0.0)
  1256.         {
  1257.           return null;
  1258.         }
  1259.         DBObjectCollection dbClt5 = new DBObjectCollection();
  1260.         reg1.Explode(dbClt5);
  1261.         DBObjectCollection dbClt6 = sCur.JoinPolyline(dbClt5, 0.001);
  1262.         if (dbClt6 == null || dbClt6.Count == 0)
  1263.           return null;
  1264.         //adb.DrawEntity(dbClt6,sEntclls.Null,false);
  1265.         if (dbClt6[0] is Polyline)
  1266.         {
  1267.           Polyline pline = (Polyline)dbClt6[0];
  1268.           if (pline.Closed)
  1269.           {
  1270.             return pline;
  1271.           }
  1272.           else
  1273.           {
  1274.             return null;
  1275.           }
  1276.         }
  1277.         else
  1278.         {
  1279.           return null;
  1280.         }
  1281.         #endregion use Region union way
  1282.       }
  1283.       catch (System.Exception ex)
  1284.       {
  1285.         smc.WriteLine(ex);
  1286.         return null;
  1287.       }
  1288.     }
  1289.     /// <summary>
  1290.     /// 连接两个封闭曲线的轮廓
  1291.     /// 需注意两个曲线必须在同一个平面,函数内有IntersectWith函数要求是Z轴0平面,即XY平面
  1292.     /// Version : 2008.02.13
  1293.     /// Note :  
  1294.     /// 1,零长度和自封闭曲线会被过滤掉Tolerance(0.0001, 0.0001)
  1295.     /// </summary>
  1296.     /// <param name="cur1">曲线</param>
  1297.     /// <param name="cur2">曲线</param>
  1298.     /// <returns>成功返回封闭多义线,否则返回null,相离的两个曲线返回null</returns>
  1299.     static public Polyline UnionCurve(Curve cur1, Curve cur2)
  1300.     {
  1301.       try
  1302.       {
  1303.         //smc.ed.WriteMessage("\nadb.UnionCurve(Curve cur1, Curve cur2)");
  1304.         if (cur1 == null || cur2 == null) return null;
  1305.         if (!cur1.Closed || !cur2.Closed) return null;
  1306.         Point3dCollection inters = sEnt.IntersectWith(cur1, cur2, Intersect.OnBothOperands);
  1307.         if (inters.Count < 2) return null;

  1308.         //若能使用在交点处打断曲线在连接的方式速度方面应该会快一些
  1309.         //但因曲线的形状和相交关系太复杂不能掌控,主要是没法判断去除打断后的哪一段曲线
  1310.         #region use Region union way

  1311.         DBObjectCollection dbClt1 = new DBObjectCollection();
  1312.         dbClt1.Add(cur1);
  1313.         DBObjectCollection dbClt2 = new DBObjectCollection();
  1314.         dbClt2.Add(cur2);
  1315.         DBObjectCollection dbClt3 = Region.CreateFromCurves(dbClt1);
  1316.         DBObjectCollection dbClt4 = Region.CreateFromCurves(dbClt2);
  1317.         if (dbClt3 == null || dbClt3.Count == 0)
  1318.           return null;
  1319.         if (dbClt4 == null || dbClt4.Count == 0)
  1320.           return null;
  1321.         Region reg1 = (Region)dbClt3[0];
  1322.         Region reg2 = (Region)dbClt4[0];
  1323.         reg1.BooleanOperation(BooleanOperationType.BoolUnite, reg2);
  1324.         DBObjectCollection dbClt5 = new DBObjectCollection();
  1325.         reg1.Explode(dbClt5);
  1326.         DBObjectCollection dbClt6 = sCur.JoinPolyline(dbClt5, 0.001);
  1327.         if (dbClt6 == null || dbClt6.Count == 0)
  1328.           return null;
  1329.         //adb.DrawEntity(dbClt6,sEntclls.Null,false);
  1330.         if (dbClt6[0].GetType().Equals(typeof(Polyline)))
  1331.         {
  1332.           Polyline pline = (Polyline)dbClt6[0];
  1333.           if (pline.Closed)
  1334.           {
  1335.             return pline;
  1336.           }
  1337.           else
  1338.           {
  1339.             return null;
  1340.           }

  1341.         }
  1342.         else
  1343.         {
  1344.           return null;
  1345.         }
  1346.         #endregion use Region union way
  1347.       }
  1348.       catch (System.Exception ex)
  1349.       {
  1350.         smc.WriteLine(ex);
  1351.         return null;
  1352.       }
  1353.     }
  1354.     /// <summary>
  1355.     /// 连接多个封闭的轮廓,不要求是封闭曲线,但应能封闭连接
  1356.     /// 函数不检查封闭的轮廓是否相交,若有多个封闭轮廓将以第一个轮廓为主执行与操作
  1357.     /// Version : 2008.02.14
  1358.     /// Note: 零长度(小于 0.00000001)曲线会被过滤掉
  1359.     /// </summary>
  1360.     /// <param name="dbClt">实体集合</param>
  1361.     /// <returns>成功返回多义线,否则返回null</returns>
  1362.     static public Polyline UnionCurve(DBObjectCollection dbClt)
  1363.     {
  1364.       try
  1365.       {
  1366.         //smc.ed.WriteMessage("\nadb.UnionCurve(DBObjectCollection dbClt)");
  1367.         #region use Region union way
  1368.         if (dbClt == null) return null;
  1369.         DBObjectCollection dbClt3 = Region.CreateFromCurves(dbClt);

  1370.         if (dbClt3 == null || dbClt3.Count == 0)
  1371.           return null;
  1372.         Region reg1 = (Region)dbClt3[0];
  1373.         for (int i = 1; i < dbClt3.Count; i++)
  1374.         {
  1375.           Region reg2 = (Region)dbClt3[i];
  1376.           reg1.BooleanOperation(BooleanOperationType.BoolUnite, reg2);
  1377.         }
  1378.         DBObjectCollection dbClt5 = new DBObjectCollection();
  1379.         reg1.Explode(dbClt5);
  1380.         DBObjectCollection dbClt6 = sCur.JoinPolyline(dbClt5, 0.001);

  1381.         if (dbClt6 == null || dbClt6.Count == 0)
  1382.           return null;
  1383.         Polyline pline = (Polyline)dbClt6[0];
  1384.         return (Polyline)dbClt6[0];
  1385.         #endregion use Region union way
  1386.       }
  1387.       catch (System.Exception ex)
  1388.       {
  1389.         smc.WriteLine(ex);
  1390.         return null;
  1391.       }
  1392.     }
  1393.     /// <summary>
  1394.     /// 用直线段模拟曲线(Line Arc Circle Polyline)
  1395.     /// Version : 2007.11.01
  1396.     /// </summary>
  1397.     /// <param name="cur1">输入曲线</param>
  1398.     /// <param name="stepDist">模拟点距</param>
  1399.     /// <returns>成功返回一个Polyline对象,否则返回null</returns>
  1400.     public static Polyline SimulatePolyline(Curve cur1, double stepDist)
  1401.     {
  1402.       try
  1403.       {
  1404.         if (cur1 == null) return null;
  1405.         //smc.ed.WriteMessage("\nadb.SimulatePolyline start ");
  1406.         Polyline pline = new Polyline();
  1407.         if (cur1.GetType().Equals(typeof(Line)))//Line:?
  1408.         {//曲线为  Line,使用其数据生成一个Polyline
  1409.           //smc.ed.WriteMessage("\nadb.SimulatePolyline 1 ");
  1410.           Line line = (Line)cur1;
  1411.           pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
  1412.           pline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
  1413.           pline.SetPropertiesFrom(line);//使用原来实体属性
  1414.           return pline;
  1415.         }
  1416.         else if (cur1.GetType().Equals(typeof(Arc)))//Arc:?
  1417.         {//曲线为  Line,使用其数据生成一个Polyline   
  1418.           //smc.ed.WriteMessage("\nadb.SimulatePolyline 2 ");
  1419.           Arc arc = (Arc)cur1;
  1420.           double curLen = arc.GetDistanceAtParameter(arc.EndParam);
  1421.           int stepNum = (int)(curLen / stepDist);
  1422.           Point3d pt1;

  1423.           for (int i = 0; i <= stepNum; i++)
  1424.           {
  1425.             pt1 = arc.GetPointAtDist(i * stepDist);
  1426.             pline.AddVertexAt(i, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1427.           }
  1428.           if (curLen > stepDist * stepNum)
  1429.           {
  1430.             pt1 = arc.GetPointAtDist(curLen);
  1431.             pline.AddVertexAt(stepNum + 1, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1432.           }
  1433.           pline.SetPropertiesFrom(arc);//使用原来实体属性
  1434.           return pline;//将新生成的多义线提交到数据库
  1435.         }
  1436.         else if (cur1.GetType().Equals(typeof(Circle)))//Arc:?
  1437.         {//曲线为  Line,使用其数据生成一个Polyline     
  1438.           //smc.ed.WriteMessage("\nadb.SimulatePolyline 3 ");
  1439.           Circle cir = (Circle)cur1;
  1440.           double curLen = cir.GetDistanceAtParameter(cir.EndParam);
  1441.           int stepNum = (int)(curLen / stepDist);
  1442.           Point3d pt1;

  1443.           for (int i = 0; i <= stepNum; i++)
  1444.           {
  1445.             pt1 = cir.GetPointAtDist(i * stepDist);
  1446.             pline.AddVertexAt(i, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1447.           }
  1448.           if (curLen > stepDist * stepNum)
  1449.           {
  1450.             pt1 = cir.GetPointAtDist(curLen);
  1451.             pline.AddVertexAt(stepNum + 1, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1452.           }
  1453.           pline.SetPropertiesFrom(cir);//使用原来实体属性
  1454.           pline.Closed = true;
  1455.           return pline;//将新生成的多义线提交到数据库
  1456.         }
  1457.         else if (cur1.GetType().Equals(typeof(Polyline)))//Arc:?
  1458.         {//曲线为  Line,使用其数据生成一个Polyline     
  1459.           //smc.ed.WriteMessage("\nadb.SimulatePolyline 4 ");
  1460.           Polyline pline2 = (Polyline)cur1;
  1461.           if (pline2.IsOnlyLines)
  1462.             return (Polyline)pline2.Clone();
  1463.           int endParam = (int)pline2.EndParam;
  1464.           Point3d pt1;
  1465.           int curIndex = 0;
  1466.           Point3d startP = pline2.GetPointAtDist(0);
  1467.           pline.AddVertexAt(curIndex++, new Point2d(startP.X, startP.Y), 0, 0, 0);
  1468.           for (int j = 0; j < endParam; j++)
  1469.           {
  1470.             if (pline2.GetBulgeAt(j) == 0.0)
  1471.             {
  1472.               pt1 = pline2.GetPointAtParameter(j + 1);
  1473.               if (startP.DistanceTo(pt1) > 0.00001)
  1474.                 pline.AddVertexAt(curIndex++, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1475.             }
  1476.             else
  1477.             {
  1478.               double curDist = pline2.GetDistanceAtParameter(j);
  1479.               double curLen = pline2.GetDistanceAtParameter(j + 1) - curDist;
  1480.               int stepNum = (int)(curLen / stepDist);
  1481.               for (int i = 1; i <= stepNum; i++)
  1482.               {
  1483.                 pt1 = pline2.GetPointAtDist(curDist + i * stepDist);
  1484.                 if (startP.DistanceTo(pt1) > 0.00001)
  1485.                   pline.AddVertexAt(curIndex++, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1486.               }
  1487.               if (curLen > stepDist * stepNum)
  1488.               {
  1489.                 pt1 = pline2.GetPointAtDist(curDist + curLen);
  1490.                 if (startP.DistanceTo(pt1) > 0.00001)
  1491.                   pline.AddVertexAt(curIndex++, new Point2d(pt1.X, pt1.Y), 0, 0, 0);
  1492.               }
  1493.             }
  1494.           }
  1495.           pline.SetPropertiesFrom(pline2);//使用原来实体属性
  1496.           if (pline2.Closed)
  1497.             pline.Closed = true;
  1498.           return pline;//将新生成的多义线提交到数据库
  1499.         }
  1500.         else
  1501.         {//本函数只处理Line Arc Polyline 三种类型曲线         
  1502.           //smc.ed.WriteMessage("\nadb.SimulatePolyline 5 ");
  1503.           return null;
  1504.         }
  1505.       }
  1506.       catch (System.Exception ex)
  1507.       {
  1508.         smc.WriteLine(ex);
  1509.         //smc.ed.WriteMessage("\nadb.SimulatePolyline 6 ");
  1510.         return null;
  1511.       }
  1512.     }
  1513.     /// <summary>
  1514.     /// 合并两个同线的直线段,合并后的直线反映在l1
  1515.     /// </summary>
  1516.     /// <param name="l1">直线1</param>
  1517.     /// <param name="l2">直线2</param>
  1518.     /// <param name="permitSpace">是否合并相离的同线直线</param>
  1519.     /// <returns>有合并动作就返回true,否则返回false</returns>
  1520.     static public bool UnionLine_old(Line l1, Line l2, bool permitSpace)
  1521.     {
  1522.       try
  1523.       {
  1524.         //smc.ed.WriteMessage("\nadb.UnionLine(Line ,Line ,bool)");
  1525.         if (l1 == null || l2 == null) return false;
  1526.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  1527.         if (!fun.IsInLine(l1, l2, eTol)) return false;
  1528.         Vector3d vec1 = l1.EndPoint - l1.StartPoint;
  1529.         Vector3d vec2 = l2.EndPoint - l2.StartPoint;
  1530.         Point3d startP = l2.StartPoint;
  1531.         Point3d endP = l2.EndPoint;
  1532.         if (vec1.IsZeroLength(eTol) && vec2.IsZeroLength(eTol))
  1533.         {
  1534.           Vector3d vec4 = l2.StartPoint - l1.StartPoint;
  1535.           if (vec4.IsZeroLength(eTol))
  1536.             return true;
  1537.           else
  1538.           {
  1539.             if (permitSpace)
  1540.             {
  1541.               l1.EndPoint = l2.EndPoint;
  1542.               return true;
  1543.             }
  1544.             else
  1545.               return false;
  1546.           }
  1547.         }
  1548.         else if (vec1.IsZeroLength(eTol))
  1549.         {
  1550.           vec1 = vec2;
  1551.         }
  1552.         else if (vec2.IsZeroLength(eTol))
  1553.         {
  1554.           vec2 = vec1;
  1555.         }
  1556.         else
  1557.         {
  1558.           if (vec1.IsCodirectionalTo(vec2.Negate(), eTol))
  1559.           {
  1560.             startP = l2.EndPoint;
  1561.             endP = l2.StartPoint;
  1562.           }
  1563.         }
  1564.         Vector3d vec3 = startP - l1.StartPoint;
  1565.         if (vec3.IsZeroLength(eTol))
  1566.         {
  1567.           Vector3d vec4 = endP - l1.EndPoint;
  1568.           if (vec4.IsZeroLength(eTol))
  1569.             return true;
  1570.           else if (vec4.IsCodirectionalTo(vec1, eTol))
  1571.           {
  1572.             l1.EndPoint = endP;
  1573.             return true;
  1574.           }
  1575.           else
  1576.             return true;
  1577.         }
  1578.         else if (vec3.IsCodirectionalTo(vec1, eTol))
  1579.         {
  1580.           Vector3d vec4 = startP - l1.EndPoint;
  1581.           if (vec4.IsZeroLength(eTol))
  1582.           {
  1583.             l1.EndPoint = endP;
  1584.             return true;
  1585.           }
  1586.           else if (vec4.IsCodirectionalTo(vec1, eTol))
  1587.           {
  1588.             if (permitSpace)
  1589.             {
  1590.               l1.EndPoint = endP;
  1591.               return true;
  1592.             }
  1593.             else
  1594.               return false;
  1595.           }
  1596.           else
  1597.           {
  1598.             Vector3d vec5 = endP - l1.EndPoint;
  1599.             if (vec5.IsZeroLength(eTol))
  1600.               return true;
  1601.             else if (vec5.IsCodirectionalTo(vec1, eTol))
  1602.             {
  1603.               l1.EndPoint = endP;
  1604.               return true;
  1605.             }
  1606.             else
  1607.               return true;
  1608.           }
  1609.         }
  1610.         else
  1611.         {
  1612.           Vector3d vec4 = endP - l1.StartPoint;
  1613.           if (vec4.IsZeroLength(eTol))
  1614.           {
  1615.             l1.StartPoint = startP;
  1616.             return true;
  1617.           }
  1618.           else if (vec4.IsCodirectionalTo(vec1, eTol))
  1619.           {
  1620.             l1.StartPoint = startP;
  1621.             Vector3d vec5 = endP - l1.EndPoint;
  1622.             if (vec5.IsZeroLength(eTol))
  1623.               return true;
  1624.             else if (vec5.IsCodirectionalTo(vec1, eTol))
  1625.             {
  1626.               l1.EndPoint = endP;
  1627.               return true;
  1628.             }
  1629.             else
  1630.               return true;
  1631.           }
  1632.           else
  1633.           {
  1634.             if (permitSpace)
  1635.             {
  1636.               l1.StartPoint = startP;
  1637.               return true;
  1638.             }
  1639.             else
  1640.               return false;
  1641.           }
  1642.         }
  1643.       }
  1644.       catch (System.Exception ex)
  1645.       {
  1646.         smc.WriteLine(ex);
  1647.         return false;
  1648.       }
  1649.     }
  1650.     static public bool UnionLine(Line l1, Line l2, double permitSpace)
  1651.     {
  1652.       try
  1653.       {
  1654.         //smc.ed.WriteMessage("\nadb.UnionLine(Line ,Line ,bool)");
  1655.         if (l1 == null || l2 == null) return false;
  1656.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  1657.         if (!fun.IsInLine(l1, l2, eTol)) return false;
  1658.         Point3dCollection p3dClt1 = new Point3dCollection();
  1659.         p3dClt1.Add(l1.StartPoint);
  1660.         p3dClt1.Add(l1.EndPoint);
  1661.         p3dClt1.Add(l2.StartPoint);
  1662.         p3dClt1.Add(l2.EndPoint);

  1663.         Point3d p21 = l1.StartPoint;
  1664.         Point3d p22 = l1.EndPoint;
  1665.         double maxDist = p21.DistanceTo(p22);
  1666.         foreach (Point3d p11 in p3dClt1)
  1667.         {
  1668.           foreach (Point3d p12 in p3dClt1)
  1669.           {
  1670.             if (p11.DistanceTo(p12) > maxDist)
  1671.             {
  1672.               maxDist = p11.DistanceTo(p12);
  1673.               p21 = p11;
  1674.               p22 = p12;
  1675.             }
  1676.           }
  1677.         }

  1678.         Vector3d vec1 = p21 - p22;
  1679.         if (vec1.IsZeroLength(eTol))
  1680.         {
  1681.           return true;
  1682.         }
  1683.         else
  1684.         {
  1685.           if (permitSpace < 0)
  1686.           {
  1687.             l1.StartPoint = p21;
  1688.             l1.EndPoint = p22;
  1689.             return true;
  1690.           }
  1691.           else
  1692.           {
  1693.             if (maxDist < l1.EndParam + l2.EndParam + permitSpace)
  1694.             {
  1695.               l1.StartPoint = p21;
  1696.               l1.EndPoint = p22;
  1697.               return true;
  1698.             }
  1699.             else
  1700.               return false;
  1701.           }
  1702.         }
  1703.       }
  1704.       catch (System.Exception ex)
  1705.       {
  1706.         smc.WriteLine(ex);
  1707.         return false;
  1708.       }
  1709.     }
  1710.     /// <summary>
  1711.     /// 合并同线直线
  1712.     /// 对因合并而需要删除的直线调用erase(),但没有提交
  1713.     /// </summary>
  1714.     /// <param name="dbClt">DBObject对象集合</param>
  1715.     /// <param name="permitSpace">是否合并相离的同线直线</param>
  1716.     /// <returns>返回合并后的DBObject对象集合</returns>
  1717.     static public DBObjectCollection UnionLine_old(DBObjectCollection dbClt, bool permitSpace)
  1718.     {
  1719.       try
  1720.       {
  1721.         //smc.ed.WriteMessage("\nadb.UnionLine(DBObjectCollection) dbClt.Count = {0}", dbClt.Count);
  1722.         if (dbClt == null) return null;
  1723.         DBObjectCollection dbClt1 = new DBObjectCollection();
  1724.         DBObjectCollection reClt = new DBObjectCollection();
  1725.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  1726.         foreach (DBObject dbObj in dbClt)
  1727.         {
  1728.           if (dbObj.GetType().Equals(typeof(Line)))
  1729.           {
  1730.             dbClt1.Add(dbObj);
  1731.           }
  1732.           else
  1733.           {
  1734.             reClt.Add(dbObj);
  1735.           }
  1736.         }
  1737.         IntegerCollection intClt = new IntegerCollection();
  1738.         for (int i = 0; i < dbClt1.Count; i++)
  1739.         {
  1740.           if (intClt.IndexOf(i) == -1)
  1741.           {
  1742.             Line l1 = (Line)dbClt1[i];
  1743.             bool cont2 = true;
  1744.             intClt.Add(i);
  1745.             reClt.Add(dbClt1[i]);
  1746.             while (cont2)
  1747.             {
  1748.               cont2 = false;
  1749.               for (int j = 0; j < dbClt1.Count; j++)
  1750.               {
  1751.                 if (intClt.IndexOf(j) == -1)
  1752.                 {
  1753.                   Line l2 = (Line)dbClt1[j];
  1754.                   if (sCur.UnionLine_old(l1, l2, permitSpace))
  1755.                   {
  1756.                     l2.Erase();
  1757.                     intClt.Add(j);
  1758.                     cont2 = true;
  1759.                   }
  1760.                 }
  1761.               }
  1762.             }
  1763.           }
  1764.         }
  1765.         return reClt;
  1766.       }
  1767.       catch (System.Exception ex)
  1768.       {
  1769.         smc.WriteLine(ex);
  1770.         return null;
  1771.       }
  1772.     }
  1773.     static public DBObjectCollection UnionLine(DBObjectCollection dbClt, double permitSpace)
  1774.     {
  1775.       try
  1776.       {
  1777.         //smc.ed.WriteMessage("\nadb.UnionLine(DBObjectCollection) dbClt.Count = {0}", dbClt.Count);
  1778.         if (dbClt == null) return null;
  1779.         DBObjectCollection dbClt1 = new DBObjectCollection();
  1780.         DBObjectCollection reClt = new DBObjectCollection();
  1781.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  1782.         foreach (DBObject dbObj in dbClt)
  1783.         {
  1784.           if (dbObj.GetType().Equals(typeof(Line)))
  1785.           {
  1786.             dbClt1.Add(dbObj);
  1787.           }
  1788.           else
  1789.           {
  1790.             reClt.Add(dbObj);
  1791.           }
  1792.         }
  1793.         IntegerCollection intClt = new IntegerCollection();
  1794.         for (int i = 0; i < dbClt1.Count; i++)
  1795.         {
  1796.           if (intClt.IndexOf(i) == -1)
  1797.           {
  1798.             Line l1 = (Line)dbClt1[i];
  1799.             bool cont2 = true;
  1800.             intClt.Add(i);
  1801.             reClt.Add(dbClt1[i]);
  1802.             while (cont2)
  1803.             {
  1804.               cont2 = false;
  1805.               for (int j = 0; j < dbClt1.Count; j++)
  1806.               {
  1807.                 if (intClt.IndexOf(j) == -1)
  1808.                 {
  1809.                   Line l2 = (Line)dbClt1[j];
  1810.                   if (sCur.UnionLine(l1, l2, permitSpace))
  1811.                   {
  1812.                     l2.Erase();
  1813.                     intClt.Add(j);
  1814.                     cont2 = true;
  1815.                   }
  1816.                 }
  1817.               }
  1818.             }
  1819.           }
  1820.         }
  1821.         return reClt;
  1822.       }
  1823.       catch (System.Exception ex)
  1824.       {
  1825.         smc.WriteLine(ex);
  1826.         return null;
  1827.       }
  1828.     }
  1829.     /// <summary>
  1830.     /// 合并同心等半径圆弧
  1831.     /// </summary>
  1832.     /// <param name="a1">第一圆弧</param>
  1833.     /// <param name="a2">第二圆弧</param>
  1834.     /// <param name="permitSpace">圆弧的合并间隔</param>
  1835.     /// <returns>成功返回true,否则返回false</returns>
  1836.     static public bool UnionArc(Arc a1, Arc a2, double permitSpace)
  1837.     {
  1838.       try
  1839.       {
  1840.         //smc.ed.WriteMessage("\nadb.UnionArc(a1 a2) 1");
  1841.         if (a1 == null || a2 == null) return false;
  1842.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  1843.         if (a1.Center.DistanceTo(a2.Center) > 0.001) return false;
  1844.         if (!a1.Normal.IsCodirectionalTo(a2.Normal, eTol)) return false;
  1845.         if (Math.Abs(a1.Radius - a2.Radius) > 0.001) return false;
  1846.         //smc.ed.WriteMessage("\nadb.UnionArc(a1 a2) 2");
  1847.         if (a1.StartAngle < a2.StartAngle)
  1848.         {
  1849.           //smc.ed.WriteMessage(" 21 ");
  1850.           if (a1.EndAngle >= a2.StartAngle)//交错
  1851.           {
  1852.             //smc.ed.WriteMessage(" 22 ");
  1853.             a1.EndAngle = Math.Max(a1.EndAngle, a2.EndAngle);
  1854.           }
  1855.           else
  1856.           {
  1857.             //smc.ed.WriteMessage(" 23 ");
  1858.             if (a2.EndAngle > smc.pi * 2)
  1859.             {
  1860.               //smc.ed.WriteMessage(" 24 ");
  1861.               if (a1.StartAngle <= a2.EndAngle - smc.pi * 2)//交错
  1862.               {
  1863.                 //smc.ed.WriteMessage(" 25 ");
  1864.                 a1.EndAngle += smc.pi * 2;
  1865.                 a1.StartAngle = a2.StartAngle;
  1866.               }
  1867.               else if (permitSpace < 0 || a1.StartPoint.DistanceTo(a2.EndPoint) <= permitSpace) //相离
  1868.               {
  1869.                 //smc.ed.WriteMessage(" 26 ");
  1870.                 double dltAng1 = a2.StartAngle - a1.EndAngle;
  1871.                 double dltAng2 = a1.StartAngle - (a2.EndAngle - smc.pi * 2);
  1872.                 if (dltAng1 < dltAng2)
  1873.                 {
  1874.                   //smc.ed.WriteMessage(" 27 ");
  1875.                   a1.EndAngle = a2.EndAngle;
  1876.                 }
  1877.                 else
  1878.                 {
  1879.                   //smc.ed.WriteMessage(" 28 ");
  1880.                   a1.EndAngle += smc.pi * 2;
  1881.                   a1.StartAngle = a2.StartAngle;
  1882.                 }
  1883.               }
  1884.             }
  1885.             else if (permitSpace < 0 || a1.EndPoint.DistanceTo(a2.StartPoint) <= permitSpace) //相离
  1886.             {
  1887.               //smc.ed.WriteMessage(" 29 ");
  1888.               double dltAng1 = a2.StartAngle - a1.EndAngle;
  1889.               double dltAng2 = a1.StartAngle + (smc.pi * 2 - a2.EndAngle);
  1890.               if (dltAng1 < dltAng2)
  1891.               {
  1892.                 //smc.ed.WriteMessage(" 2a");
  1893.                 a1.EndAngle = a2.EndAngle;
  1894.               }
  1895.               else
  1896.               {
  1897.                 //smc.ed.WriteMessage(" 2b ");
  1898.                 a1.EndAngle += smc.pi * 2;
  1899.                 a1.StartAngle = a2.StartAngle;
  1900.               }
  1901.             }
  1902.           }
  1903.         }
  1904.         else
  1905.         {
  1906.           double startAng = a2.StartAngle;
  1907.           double endAng = a2.EndAngle;
  1908.           //smc.ed.WriteMessage(" 31 ");
  1909.           if (a2.EndAngle >= a1.StartAngle)//交错
  1910.           {
  1911.             //smc.ed.WriteMessage(" 32 ");
  1912.             endAng = Math.Max(a1.EndAngle, a2.EndAngle);
  1913.           }
  1914.           else
  1915.           {
  1916.             //smc.ed.WriteMessage(" 33 ");
  1917.             if (a1.EndAngle > smc.pi * 2)
  1918.             {
  1919.               //smc.ed.WriteMessage(" 34 ");
  1920.               if (a2.StartAngle <= a1.EndAngle - smc.pi * 2)//交错
  1921.               {
  1922.                 //smc.ed.WriteMessage(" 35 ");
  1923.                 endAng = a2.EndAngle + smc.pi * 2;
  1924.                 startAng = a1.StartAngle;
  1925.               }
  1926.               else if (permitSpace < 0 || a2.StartPoint.DistanceTo(a1.EndPoint) <= permitSpace) //相离
  1927.               {
  1928.                 //smc.ed.WriteMessage(" 36 ");
  1929.                 double dltAng1 = a1.StartAngle - a2.EndAngle;
  1930.                 double dltAng2 = a2.StartAngle - (a1.EndAngle - smc.pi * 2);
  1931.                 if (dltAng1 < dltAng2)
  1932.                 {
  1933.                   //smc.ed.WriteMessage(" 37 ");
  1934.                   endAng = a1.EndAngle;
  1935.                 }
  1936.                 else
  1937.                 {
  1938.                   //smc.ed.WriteMessage(" 38 ");
  1939.                   endAng = a2.EndAngle + smc.pi * 2;
  1940.                   startAng = a1.StartAngle;
  1941.                 }
  1942.               }
  1943.             }
  1944.             else if (permitSpace < 0 || a2.EndPoint.DistanceTo(a1.StartPoint) <= permitSpace) //相离
  1945.             {
  1946.               //smc.ed.WriteMessage(" 39 ");
  1947.               double dltAng1 = a1.StartAngle - a2.EndAngle;
  1948.               double dltAng2 = a2.StartAngle + (smc.pi * 2 - a1.EndAngle);
  1949.               if (dltAng1 < dltAng2)
  1950.               {
  1951.                 //smc.ed.WriteMessage(" 3a");
  1952.                 endAng = a1.EndAngle;
  1953.               }
  1954.               else
  1955.               {
  1956.                 //smc.ed.WriteMessage(" 3b ");
  1957.                 endAng = a2.EndAngle + smc.pi * 2;
  1958.                 startAng = a1.StartAngle;
  1959.               }
  1960.             }
  1961.           }
  1962.           a1.StartAngle = startAng;
  1963.           a1.EndAngle = endAng;
  1964.         }
  1965.         return true;
  1966.       }
  1967.       catch (System.Exception ex)
  1968.       {
  1969.         smc.WriteLine(ex);
  1970.         return false;
  1971.       }
  1972.     }

  1973.    
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-7 18:10:34 | 显示全部楼层
帖子长度限制,分成两部分
  1. /// <summary>
  2.     /// 合并同心等半径圆弧
  3.     /// 对因合并而需要删除的圆弧调用erase(),但没有提交
  4.     /// </summary>
  5.     /// <param name="dbClt">实体集合</param>
  6.     /// <param name="permitSpace">圆弧的合并间隔</param>
  7.     /// <returns>返回合并后的DBObject对象集合</returns>
  8.     static public DBObjectCollection UnionArc(DBObjectCollection dbClt, double permitSpace)
  9.     {
  10.       try
  11.       {
  12.         // smc.ed.WriteMessage("\nadb.UnionArc(DBObjectCollection) dbClt.Count = {0}", dbClt.Count);
  13.         if (dbClt == null) return null;
  14.         DBObjectCollection dbClt1 = new DBObjectCollection();
  15.         DBObjectCollection reClt = new DBObjectCollection();
  16.         Tolerance eTol = new Tolerance(0.0001, 0.0001);
  17.         foreach (DBObject dbObj in dbClt)
  18.         {
  19.           if (dbObj.GetType().Equals(typeof(Arc)))
  20.           {
  21.             dbClt1.Add(dbObj);
  22.           }
  23.           else
  24.           {
  25.             reClt.Add(dbObj);
  26.           }
  27.         }
  28.         IntegerCollection intClt = new IntegerCollection();
  29.         for (int i = 0; i < dbClt1.Count; i++)
  30.         {
  31.           if (intClt.IndexOf(i) == -1)
  32.           {
  33.             Arc a1 = (Arc)dbClt1[i];
  34.             bool cont2 = true;
  35.             intClt.Add(i);
  36.             reClt.Add(dbClt1[i]);
  37.             while (cont2)
  38.             {
  39.               cont2 = false;
  40.               for (int j = 0; j < dbClt1.Count; j++)
  41.               {
  42.                 if (intClt.IndexOf(j) == -1)
  43.                 {
  44.                   Arc a2 = (Arc)dbClt1[j];
  45.                   if (sCur.UnionArc(a1, a2, permitSpace))
  46.                   {
  47.                     a2.Erase();
  48.                     intClt.Add(j);
  49.                     cont2 = true;
  50.                   }
  51.                 }
  52.               }
  53.             }
  54.           }
  55.         }
  56.         return reClt;
  57.       }
  58.       catch (System.Exception ex)
  59.       {
  60.         smc.WriteLine(ex);
  61.         return null;
  62.       }
  63.     }
  64.     /// <summary>
  65.     /// 将输入的两个曲线倒角并返回倒角后的实体
  66.     /// 目前只能处理Line曲线
  67.     /// Version : 2009.01.15
  68.     /// </summary>
  69.     /// <param name="cur1"></param>
  70.     /// <param name="cur2"></param>
  71.     /// <param name="d1"></param>
  72.     /// <param name="d2"></param>
  73.     /// <returns>正常应该返回三个实体的集合</returns>
  74.     public static DBObjectCollection ChamferCurve(Curve cur1, Curve cur2, double d1, double d2)
  75.     {
  76.       try
  77.       {
  78.         if (cur1 == null || cur2 == null) return null;
  79.         DBObjectCollection reValue = new DBObjectCollection();
  80.         if (cur1 is Line && cur2 is Line)
  81.         {
  82.           Line l1 = (Line)cur1;
  83.           Line l2 = (Line)cur2;
  84.           Vector3d tVec1 = l1.StartPoint.GetVectorTo(l1.EndPoint);
  85.           Vector3d tVec2 = l2.StartPoint.GetVectorTo(l2.EndPoint);
  86.           if (tVec1.IsParallelTo(tVec2, new Tolerance(0.001, 0.001)))
  87.           {
  88.             return null;
  89.           }
  90.           else
  91.           {
  92.             Point3d tP1 = fun.PLL(l1, l2);
  93.             Line l3 = new Line(l1.StartPoint, l2.StartPoint);
  94.             if (tP1.DistanceTo(l1.StartPoint) > tP1.DistanceTo(l1.EndPoint))
  95.             {
  96.               l1.EndPoint = tP1 + tVec1.GetNormal() * d1;
  97.               l3.StartPoint = l1.EndPoint;
  98.             }
  99.             else
  100.             {
  101.               l1.StartPoint = tP1 + tVec1.GetNormal().Negate() * d1;
  102.               l3.StartPoint = l1.StartPoint;
  103.             }
  104.             if (tP1.DistanceTo(l2.StartPoint) > tP1.DistanceTo(l2.EndPoint))
  105.             {
  106.               l2.EndPoint = tP1 + tVec2.GetNormal() * d2;
  107.               l3.EndPoint = l2.EndPoint;
  108.             }
  109.             else
  110.             {
  111.               l2.StartPoint = tP1 + tVec2.GetNormal().Negate() * d2;
  112.               l3.EndPoint = l2.StartPoint;
  113.             }
  114.             reValue.Add(l1);
  115.             reValue.Add(l3);
  116.             reValue.Add(l2);
  117.             return reValue;
  118.           }
  119.         }
  120.         else
  121.           return null;
  122.       }
  123.       catch (System.Exception ex)
  124.       {
  125.         smc.WriteLine(ex);
  126.         return null;
  127.       }
  128.     }
  129.     /// <summary>
  130.     /// 检查两条曲线的形状是否相同
  131.     /// 不相同返回-1,完全相同返回0,形状相同旋转角度不同返回转角度(大于0的值)
  132.     /// Version : 2009.01.16
  133.     /// </summary>
  134.     /// <param name="cur1"></param>
  135.     /// <param name="cur2"></param>
  136.     /// <returns>不相同返回999,完全相同返回0,形状相同旋转角度不同返回转角度(大于0的值)</returns>
  137.     public static double ShapeEqual(Curve cur1, Curve cur2)
  138.     {
  139.       try
  140.       {
  141.         if (cur1 == null || cur2 == null) return 999;
  142.         if (cur1 is Line && cur2 is Line)
  143.         {
  144.           Line l1 = (Line)cur1;
  145.           Line l2 = (Line)cur2;
  146.           if (l1.EndParam != l2.EndParam)
  147.           {
  148.             return 999;
  149.           }
  150.           else
  151.           {
  152.             Vector3d tVec1 = l1.StartPoint.GetVectorTo(l1.EndPoint);
  153.             Vector3d tVec2 = l2.StartPoint.GetVectorTo(l2.EndPoint);
  154.             if (tVec1.IsParallelTo(tVec2, new Tolerance(0.00001, 0.00001)))
  155.             {
  156.               return 0;
  157.             }
  158.             else
  159.             {
  160.               if (Math.Abs(tVec2.GetAngleTo(tVec1)) > 0.00000001)
  161.                 return tVec2.GetAngleTo(tVec1);
  162.               else
  163.                 return 0;
  164.             }
  165.           }
  166.         }
  167.         else if (cur1 is Circle && cur2 is Circle)
  168.         {
  169.           Circle cir1 = (Circle)cur1;
  170.           Circle cir2 = (Circle)cur2;
  171.           return (cir1.Radius == cir2.Radius) ? 0 : 999;
  172.         }
  173.         else if (cur1 is Arc && cur2 is Arc)
  174.         {
  175.           Arc arc1 = (Arc)cur1;
  176.           Arc arc2 = (Arc)cur2;
  177.           if (Math.Abs(arc1.Radius - arc2.Radius) < 0.00000001)
  178.           {
  179.             if (Math.Abs(arc1.StartAngle - arc2.StartAngle) < 0.00000001 &&
  180.               Math.Abs(arc1.EndAngle - arc2.EndAngle) < 0.00000001)
  181.             {
  182.               return 0;
  183.             }
  184.             else if ((arc1.EndAngle - arc1.StartAngle) - (arc2.EndAngle - arc2.StartAngle) < 0.0000001)
  185.             {
  186.               if (arc2.StartAngle - arc1.StartAngle > 0.00000001)
  187.               {
  188.                 return arc2.StartAngle - arc1.StartAngle;
  189.               }
  190.               else
  191.               {
  192.                 return 0;
  193.               }
  194.             }
  195.             else
  196.             {
  197.               return 999;
  198.             }
  199.           }
  200.           else
  201.             return 999;
  202.         }
  203.         else if (cur1 is Polyline && cur2 is Polyline)
  204.         {
  205.           Polyline pline1 = (Polyline)cur1;
  206.           Polyline pline2 = (Polyline)cur2;
  207.           //smc.ed.WriteMessage("\n 1 ");
  208.           if (pline1.Closed != pline2.Closed)
  209.           {
  210.             //smc.ed.WriteMessage(" 2 ");
  211.             return 999;
  212.           }
  213.           if (pline1.NumberOfVertices != pline2.NumberOfVertices)
  214.           {
  215.             //smc.ed.WriteMessage(" 3 ");
  216.             return 999;
  217.           }
  218.           Vector3dCollection vClt1 = new Vector3dCollection();
  219.           Vector3dCollection vClt2 = new Vector3dCollection();
  220.           for (int i = 1; i < pline1.NumberOfVertices; i++)
  221.           {
  222.             Vector3d tVec1 = pline1.GetPoint3dAt(i) - pline1.GetPoint3dAt(i - 1);
  223.             Vector3d tVec2 = pline2.GetPoint3dAt(i) - pline2.GetPoint3dAt(i - 1);
  224.             if (Math.Abs(tVec1.Length - tVec2.Length) > 0.00000001)
  225.             {
  226.               //smc.ed.WriteMessage(" 5 ");
  227.               return 999;
  228.             }
  229.             if (Math.Abs(pline1.GetBulgeAt(i - 1) - pline2.GetBulgeAt(i - 1)) > 0.00000001)
  230.             {
  231.               //smc.ed.WriteMessage(" 6 ");
  232.               return 999;
  233.             }
  234.             vClt1.Add(tVec1);
  235.             vClt2.Add(tVec2);
  236.           }
  237.           if (pline1.Closed)
  238.           {
  239.             Vector3d tVec1 = pline1.GetPoint3dAt(0) - pline1.GetPoint3dAt(pline1.NumberOfVertices - 1);
  240.             Vector3d tVec2 = pline2.GetPoint3dAt(0) - pline2.GetPoint3dAt(pline1.NumberOfVertices - 1);
  241.             if (Math.Abs(tVec1.Length - tVec2.Length) > 0.00000001)
  242.             { //smc.ed.WriteMessage(" 8 ");  
  243.               return 999;
  244.             }
  245.             if (Math.Abs(pline1.GetBulgeAt(pline1.NumberOfVertices - 1) - pline2.GetBulgeAt(pline1.NumberOfVertices - 1)) > 0.00000001)
  246.             {
  247.               //smc.ed.WriteMessage(" 9 ");
  248.               return 999;
  249.             }
  250.             vClt1.Add(tVec1);
  251.             vClt2.Add(tVec2);
  252.           }
  253.           for (int i = 1; i < vClt1.Count; i++)
  254.           {
  255.             if (Math.Abs(vClt1[i].GetAngleTo(vClt1[i - 1]) - vClt2[i].GetAngleTo(vClt2[i - 1])) > 0.00000001)
  256.             {
  257.               //smc.ed.WriteMessage(" 10 ");
  258.               return 999;
  259.             }
  260.           }
  261.           if (Math.Abs(vClt1[0].GetAngleTo(vClt2[0])) > 0.00000001)
  262.           {
  263.             //smc.ed.WriteMessage(" 11 ");
  264.             return vClt1[0].GetAngleTo(vClt2[0]);
  265.           }
  266.           else
  267.           {
  268.             //smc.ed.WriteMessage(" 12 ");
  269.             return 0;
  270.           }
  271.         }
  272.         else
  273.           return 999;
  274.       }
  275.       catch (System.Exception ex)
  276.       {
  277.         smc.WriteLine(ex);
  278.         return 999;
  279.       }
  280.     }
  281.     /// <summary>
  282.     /// 对输入两条曲线进行圆角,并返回圆角实体
  283.     /// 目前只能处理Line曲线
  284.     /// Version : 2009.01.15
  285.     /// </summary>
  286.     /// <param name="cur1"></param>
  287.     /// <param name="cur2"></param>
  288.     /// <param name="radius"></param>
  289.     /// <returns></returns>
  290.     public static DBObjectCollection FilletCurve(Curve cur1, Curve cur2, double radius)
  291.     {
  292.       try
  293.       {
  294.         if (cur1 == null || cur2 == null) return null;
  295.         DBObjectCollection reValue = new DBObjectCollection();
  296.         if (cur1 is Line && cur2 is Line)
  297.         {
  298.           Line l1 = (Line)cur1;
  299.           Line l2 = (Line)cur2;
  300.           Vector3d tVec11 = l1.StartPoint.GetVectorTo(l1.EndPoint);
  301.           Vector3d tVec12 = l2.StartPoint.GetVectorTo(l2.EndPoint);
  302.           if (tVec11.IsParallelTo(tVec12, new Tolerance(0.001, 0.001)))
  303.           {
  304.             return null;
  305.           }
  306.           else
  307.           {
  308.             Vector3d tVec21 = tVec11;
  309.             Vector3d tVec22 = tVec12;
  310.             Point3d tP1 = fun.PLL(l1, l2);
  311.             if (tP1.DistanceTo(l1.StartPoint) > tP1.DistanceTo(l1.EndPoint))
  312.             {
  313.               tVec22 = fun.VerticalVector(l1.StartPoint, l2).GetNormal() * radius;
  314.             }
  315.             else
  316.             {
  317.               tVec22 = fun.VerticalVector(l1.EndPoint, l2).GetNormal() * radius;
  318.             }
  319.             if (tP1.DistanceTo(l2.StartPoint) > tP1.DistanceTo(l2.EndPoint))
  320.             {
  321.               tVec21 = fun.VerticalVector(l2.StartPoint, l1).GetNormal() * radius;
  322.             }
  323.             else
  324.             {
  325.               tVec21 = fun.VerticalVector(l2.EndPoint, l1).GetNormal() * radius;
  326.             }
  327.             Point3d tP2 = fun.PLL(l1.StartPoint + tVec21, l1.EndPoint + tVec21, l2.StartPoint + tVec22, l2.EndPoint + tVec22);
  328.             
  329.             Point3dCollection pClt1 = fun.PLC(tP2, radius, l1.StartPoint, l1.EndPoint);
  330.             Point3dCollection pClt2 = fun.PLC(tP2, radius, l2.StartPoint, l2.EndPoint);

  331.             if (tP1.DistanceTo(l1.StartPoint) > tP1.DistanceTo(l1.EndPoint))
  332.             {
  333.               l1.EndPoint = pClt1[0];
  334.             }
  335.             else
  336.             {
  337.               l1.StartPoint = pClt1[0];
  338.             }
  339.             if (tP1.DistanceTo(l2.StartPoint) > tP1.DistanceTo(l2.EndPoint))
  340.             {
  341.               l2.EndPoint = pClt2[0];
  342.             }
  343.             else
  344.             {
  345.               l2.StartPoint = pClt2[0];
  346.             }           
  347.             Vector3d tVec31 = pClt1[0].GetVectorTo(tP2);
  348.             Vector3d tVec32 = pClt2[0].GetVectorTo(tP2);
  349.             Vector3d tVec33 = tP1.GetVectorTo(tP2);
  350.             double ang1 = fun.Angle(tVec31);
  351.             double ang2 = fun.Angle(tVec32);
  352.             double ang3 = fun.Angle(tVec33);
  353.             double startAngle = ang1;
  354.             double endAngle = ang2;
  355.             if (ang3 > ang1 && ang3 < ang2)
  356.             {
  357.               startAngle = ang1;
  358.               endAngle = ang2;
  359.             }
  360.             else if (ang3 > ang2 && ang3 < ang1)
  361.             {
  362.               startAngle = ang2;
  363.               endAngle = ang1;
  364.             }
  365.             else
  366.             {
  367.               startAngle = Math.Max(ang2, ang1);
  368.               endAngle = Math.Min(ang2, ang1);
  369.             }
  370.             Arc arc = new Arc(tP2, radius, startAngle, endAngle);
  371.             reValue.Add(l1);
  372.             reValue.Add(arc);
  373.             reValue.Add(l2);      
  374.             return reValue;
  375.           }
  376.         }
  377.         else
  378.           return null;
  379.       }
  380.       catch (System.Exception ex)
  381.       {
  382.         smc.WriteLine(ex);
  383.         return null;
  384.       }
  385.     }
  386.     #endregion Join Break Union Trim Simulate Curve
  387.   }
  388. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 22:34 , Processed in 0.238763 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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