1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using ZwSoft.ZwCAD.ApplicationServices;
    5. using ZwSoft.ZwCAD.DatabaseServices;
    6. using ZwSoft.ZwCAD.EditorInput;
    7. using ZwSoft.ZwCAD.Geometry;
    8. using ZwSoft.ZwCAD.Runtime;
    9. using ZWApp = ZwSoft.ZwCAD.ApplicationServices.Application;
    10. //最后结果为{{k,b,p1,p2},{k,b,p1,p2}}
    11. namespace CADToExcel
    12. {
    13. public static class Class1
    14. {
    15. public static Document doc = ZWApp.DocumentManager.MdiActiveDocument;
    16. public static Database db = HostApplicationServices.WorkingDatabase;
    17. public static Editor ed = doc.Editor;
    18. [CommandMethod("CTE", CommandFlags.Session | CommandFlags.UsePickSet)]
    19. public static void CTE()
    20. {
    21. List<Entity> linelst = new List<Entity>();
    22. List<LInfo> linfo = new List<LInfo>();
    23. using (DocumentLock dloc = doc.LockDocument())
    24. {
    25. TypedValue[] value = new TypedValue[] { new TypedValue((int)DxfCode.Start, "LWPOLYLINE,LINE") };
    26. SelectionFilter filter = new SelectionFilter(value);
    27. PromptSelectionResult psr = ed.GetSelection(filter);
    28. ObjectId[] ids = psr.Value.GetObjectIds();
    29. using (Transaction tr = db.TransactionManager.StartTransaction())
    30. {
    31. //打开块表记录
    32. BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
    33. linelst = ids.Cast<ObjectId>().Select(id => (Entity)id.GetObject(OpenMode.ForWrite)).ToList();
    34. }
    35. foreach (Entity lent in linelst)
    36. {
    37. if ("Line".Equals(lent.GetType().Name, StringComparison.CurrentCultureIgnoreCase))
    38. {
    39. Line l = (Line)lent;
    40. linfo.Add(Line_Data(l.StartPoint, l.EndPoint));
    41. }
    42. else
    43. {
    44. Polyline pl = (Polyline)lent;
    45. int ptn = pl.NumberOfVertices - 1;
    46. for (int i = 0; i < ptn; i++)
    47. {
    48. linfo.Add(Line_Data(pl.GetPoint3dAt(i), pl.GetPoint3dAt(i + 1)));
    49. }
    50. if (pl.Closed) linfo.Add(Line_Data(pl.GetPoint3dAt(ptn), pl.GetPoint3dAt(0)));
    51. }
    52. }
    53. //rowLine = rowLine.OrderByDescending(linept => linept.Value).ToList();
    54. //colLine = colLine.OrderBy(linept => linept.Value).ToList();
    55. linfo.Sort((e1, e2) =>
    56. {
    57. if (e1.K.EqOfDis(e2.K))
    58. {
    59. if (e1.B.EqOfDis(e2.B))
    60. {
    61. if (e1.P1.X.EqOfDis(e2.P2.X)) return e1.P1.Y.CompareTo(e1.P2.Y);
    62. else return e1.P1.X.CompareTo(e1.P2.X);
    63. }
    64. else return e1.B.CompareTo(e2.B);
    65. }
    66. else return e1.K.CompareTo(e2.K);
    67. });
    68. linfo = linfo.HB_Line();
    69. }
    70. }
    71. #region MyRegion 合并使用函数
    72. public struct LInfo
    73. {
    74. public LInfo(double value, double k, double b, Point3d p1, Point3d p2)
    75. {
    76. Value = value;
    77. K = k;
    78. B = b;
    79. P1 = p1;
    80. P2 = p2;
    81. }
    82. public double Value { set; get; }
    83. public double K { set; get; }
    84. public double B { set; get; }
    85. public Point3d P1 { set; get; }
    86. public Point3d P2 { set; get; }
    87. }
    88. //容差比较两个数
    89. public static bool EqOfDis(this double value1, double value2, double dis = 1e-06) => Math.Abs(value1 - value2) <= dis;
    90. //容差比较两个点的距离
    91. public static bool EqOfDis(this Point3d pt1, Point3d pt2, double dis = 1e-06) => Math.Abs(pt1.X - pt2.X) < dis && Math.Abs(pt1.Y - pt2.Y) < dis && Math.Abs(pt1.Z - pt2.Z) < dis;
    92. public static LInfo Line_Data(Point3d pt1, Point3d pt2)
    93. {
    94. double k, b;
    95. if (pt1.X.EqOfDis(pt2.X))
    96. {
    97. k = double.NaN;
    98. b = pt1.X;
    99. }
    100. else
    101. {
    102. k = (pt2.Y - pt1.Y) / (pt2.X - pt1.X);
    103. b = pt1.Y - (pt1.X * k);
    104. }
    105. return pt1.X.EqOfDis(pt2.X)
    106. ? pt1.Y > pt2.Y ? new LInfo(k, b, pt2, pt1) : new LInfo(k, b, pt1, pt2)
    107. : pt1.X > pt2.X ? new LInfo(k, b, pt2, pt1) : new LInfo(k, b, pt1, pt2);
    108. }
    109. public static List<LInfo> HB_Line(this List<LInfo> linelst)
    110. {
    111. List<LInfo> newlst = new List<LInfo>();
    112. int count = linelst.Count, i = 0, index = 0;
    113. double k, b;
    114. Point3d p1, p2, p3, p4;
    115. while (linelst.Count > 0)
    116. {
    117. index++;
    118. LInfo lia = linelst[0];
    119. linelst.Remove(lia);
    120. bool mark = true;
    121. k = lia.K;
    122. b = lia.B;
    123. p1 = lia.P1;
    124. p2 = lia.P2;
    125. while (mark && linelst.Count > 0)
    126. {
    127. LInfo lib = linelst[0];
    128. if (k.EqOfDis(lib.K) && b.EqOfDis(lib.B))
    129. {
    130. p3 = lib.P1;
    131. p4 = lib.P2;
    132. List<Point3d> plst = new List<Point3d> { p1, p2, p3, p4 };
    133. plst.Sort((pa, pb) =>
    134. {
    135. return pa.X.EqOfDis(pb.X) ? pa.Y.CompareTo(pb.Y) : pa.X.CompareTo(pb.X);
    136. });
    137. p4 = plst[1];
    138. if (p1.EqOfDis(p4) || p3.EqOfDis(p4))
    139. {
    140. p1 = plst.First();
    141. p2 = plst.Last();
    142. linelst.Remove(lib);
    143. index++;
    144. i++;
    145. }
    146. else mark = false;
    147. }
    148. else mark = false;
    149. }
    150. newlst.Add(new LInfo(lia.Value, lia.K, lia.B, p1, p2));
    151. }
    152. return newlst;
    153. }
    154. #endregion
    155. }
    156. }