private List <int> Will_Do_GetTreeStructure(List <LINE> BEAMS, LINE TargetDATA, ref List <LINE> ResTmp, List <int> tmpcheckPicked, double SHIFTDIST) { for (int j = 0; j < BEAMS.Count; j++) { if (tmpcheckPicked.Contains(j)) { continue; } bool open = false; if (TargetDATA.IsPointInLine(BEAMS[j].GetStartPoint()) || CMPPoints(TargetDATA.GetEndPoint(), BEAMS[j].GetStartPoint(), SHIFTDIST)) { open = true; ResTmp.Add(BEAMS[j]); tmpcheckPicked.Add(j); } else if (TargetDATA.IsPointInLine(BEAMS[j].GetEndPoint()) || CMPPoints(TargetDATA.GetEndPoint(), BEAMS[j].GetEndPoint(), SHIFTDIST)) { open = true; ResTmp.Add(new LINE(BEAMS[j].GetEndPoint(), BEAMS[j].GetStartPoint(), BEAMS[j].Name)); tmpcheckPicked.Add(j); } } return(tmpcheckPicked); }
/// <summary> /// 判斷兩線段是否同向 /// </summary> /// <param name="line1"></param> /// <param name="line2"></param> /// <param name="distance"></param> /// <returns></returns> private bool IsSameDirection(LINE line1, LINE line2, ref double distance) { distance = -1; XYZ Dir_1 = line1.GetDirection(); XYZ Dir_2 = line2.GetDirection(); bool isSameDirection = IsSamePoint(Dir_1, Dir_2); if (!isSameDirection) { return(false); } /// 若端點重疊則回傳false if (IsSamePoint(line1.GetStartPoint(), line2.GetStartPoint()) || IsSamePoint(line1.GetEndPoint(), line2.GetEndPoint()) || IsSamePoint(line1.GetStartPoint(), line2.GetEndPoint()) || IsSamePoint(line1.GetEndPoint(), line2.GetStartPoint())) { return(false); } /// 判斷是否在同一直線上 if == 0 distance = Math.Round(line1.GetDistanceFromPoint(line2.GetStartPoint()), IG_POINT); return(true); }
/// <summary> /// 取得與目標梁最靠近的梁群 /// </summary> /// <param name="BEAMS"></param> /// <param name="target"></param> /// <param name="tmpcheckPicked"></param> /// <param name="picked"></param> /// <param name=""></param> /// <returns></returns> private List <LINE> GetClosedBeams(List <LINE> BEAMS, LINE target, ref List <int> tmpcheckPicked, List <int> picked, double SHIFTDIST) { List <LINE> ResTmp = new List <LINE>(); for (int j = 0; j < BEAMS.Count; j++) { if (picked.Contains(j)) { continue; } if (CMPPoints(target.GetEndPoint(), BEAMS[j].GetStartPoint(), SHIFTDIST)) { ResTmp.Add(BEAMS[j]); tmpcheckPicked.Add(j); } else if (CMPPoints(target.GetEndPoint(), BEAMS[j].GetEndPoint(), SHIFTDIST)) { ResTmp.Add(new LINE(BEAMS[j].GetEndPoint(), BEAMS[j].GetStartPoint(), BEAMS[j].Name, BEAMS[j].LevelName, BEAMS[j].Width)); tmpcheckPicked.Add(j); } } return(ResTmp); }
private bool IsConnected(LINE line1, LINE line2) { if (IsSamePoint(line1.GetStartPoint(), line2.GetStartPoint()) || IsSamePoint(line1.GetEndPoint(), line2.GetEndPoint()) || IsSamePoint(line1.GetStartPoint(), line2.GetEndPoint()) || IsSamePoint(line1.GetEndPoint(), line2.GetStartPoint())) { return(true); } return(false); }
private bool IsCloseEndsPoint(LINE line, XYZ crossPoint, double SHIFT) { double Len1 = Math.Sqrt((line.GetStartPoint().X - crossPoint.X) * (line.GetStartPoint().X - crossPoint.X) + (line.GetStartPoint().Y - crossPoint.Y) * (line.GetStartPoint().Y - crossPoint.Y)); double Len2 = Math.Sqrt((line.GetEndPoint().X - crossPoint.X) * (line.GetEndPoint().X - crossPoint.X) + (line.GetEndPoint().Y - crossPoint.Y) * (line.GetEndPoint().Y - crossPoint.Y)); if (Len1 < SHIFT || Len2 < SHIFT) { return(true); } return(false); }
/// <summary> /// 建立梁 /// </summary> /// <param name="Type"></param> /// <param name="baseLevel"></param> /// <param name="points"></param> public void CreateBeam(FamilySymbol Type, Level baseLevel, List <BEAM> points_, Document revitDoc) { using (Transaction trans = new Transaction(revitDoc)) { trans.Start("Create Beam"); foreach (BEAM item in points_) { LINE points = item.GetEdgeLine(3); FamilyInstance familyInstance = null; XYZ p1 = new XYZ(points.GetStartPoint().X, points.GetStartPoint().Y, baseLevel.Elevation); XYZ p2 = new XYZ(points.GetEndPoint().X, points.GetEndPoint().Y, baseLevel.Elevation); familyInstance = revitDoc.Create.NewFamilyInstance(Line.CreateBound(p1, p2), Type, baseLevel, StructuralType.Beam); } trans.Commit(); } }
/// <summary> /// Get Column centerpoint using to Create column /// </summary> /// <param name="Collect"></param> /// <param name="H_Direction_Lines"></param> /// <param name="V_Direction_Lines"></param> /// <param name="H_Beams"></param> /// <param name="V_Beams"></param> public static List <LINE> GetColumnDrawCenterPoints(List <List <LINE> > Collect) { List <LINE> RESULT = new List <LINE>(); foreach (List <LINE> Lines in Collect) { LINE LINE1 = Lines[0]; LINE LINE2 = Lines[1]; RESULT.Add(new LINE(LINE1.GetStartPoint(), LINE2.GetEndPoint())); } return(RESULT); }
/// <summary> /// Create Beam /// </summary> /// <param name="Type"></param> /// <param name="baseLevel"></param> /// <param name="points"></param> public void CreateBeam(FamilySymbol Type, Level baseLevel, LINE points) { if (!Type.IsActive) { using (Transaction trans = new Transaction(revitDoc)) { trans.Start("Activate Family instance"); Type.Activate(); trans.Commit(); } } using (Transaction trans = new Transaction(revitDoc)) { trans.Start("Create Beam"); FamilyInstance familyInstance = null; XYZ p1 = new XYZ(points.GetStartPoint().X, points.GetStartPoint().Y, baseLevel.Elevation); XYZ p2 = new XYZ(points.GetEndPoint().X, points.GetEndPoint().Y, baseLevel.Elevation); familyInstance = revitDoc.Create.NewFamilyInstance(Line.CreateBound(p1, p2), Type, baseLevel, StructuralType.Beam); trans.Commit(); } }
/// <summary> /// 取得所有的梁 /// </summary> /// <returns></returns> private List <LINE> GetAllBeams() { FilteredElementCollector collector = new FilteredElementCollector(revitDoc); collector.OfCategory(BuiltInCategory.OST_StructuralFraming); collector.OfClass(typeof(FamilyInstance)); IList <Element> beams = collector.ToElements(); List <LINE> Beams = new List <LINE>(); foreach (Element beam in beams) { try { LocationCurve Locurve = beam.Location as LocationCurve; Line line = Locurve.Curve as Line; LINE LINE = new LINE(line.Origin, new XYZ(line.Origin.X + line.Length * line.Direction.X, line.Origin.Y + line.Length * line.Direction.Y, line.Origin.Z + line.Length * line.Direction.Z)); ElementType type = revitDoc.GetElement(beam.GetTypeId()) as ElementType; Parameter mLevel = beam.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM); string levelName = mLevel.AsValueString(); LINE.Name = beam.Name; LINE.LevelName = levelName; //to get width of section Parameter b = type.LookupParameter("b"); LINE.Width = b.AsDouble(); ////to get height of section //Parameter h = type.LookupParameter("h"); //double height = h.AsDouble(); if (Math.Round(LINE.GetStartPoint().Z, 3) == Math.Round(LINE.GetEndPoint().Z, 3)) { if (LINE.GetDirection().X == 1 || LINE.GetDirection().Y == 1 || LINE.GetDirection().X == -1 || LINE.GetDirection().Y == -1) { Beams.Add(LINE); } } } catch (Exception) { } } return(Beams); }
/// <summary> /// /// </summary> /// <param name="NewBeamGroup"></param> /// <returns></returns> private List <List <LINE> > ConnectedEdgeFromMiddleColumns(List <List <LINE> > NewBeamGroup) { List <List <LINE> > newFloorGroup = new List <List <LINE> >(); foreach (List <LINE> Beams in NewBeamGroup) { //SaveTmp(Beams); Dictionary <int, LINE> tmpAddLines = new Dictionary <int, LINE>(); for (int i = 0; i < Beams.Count; i++) { LINE L1 = Beams[i]; LINE L2 = i + 1 == Beams.Count ? Beams[0] : Beams[i + 1]; if (L1.IsSameDirection(L2.GetDirection(), true) && !L1.IsPointInLine(L2.GetStartPoint())) { tmpAddLines[i] = new LINE(L1.GetEndPoint(), L2.GetStartPoint()); } } foreach (int ii in tmpAddLines.Keys) { Beams.Add(tmpAddLines[ii]); } SaveTmp(Beams); int kk = 0; List <LINE> newBeams = new List <LINE>(); int[] flag = new int[Beams.Count]; flag[kk] = -1; newBeams.Add(Beams[0]); while (kk < Beams.Count) { if (flag[kk] != -1 && newBeams[newBeams.Count - 1].IsPointInLine(Beams[kk].GetStartPoint())) { flag[kk] = -1; newBeams.Add(Beams[kk]); kk = 0; } kk = kk + 1; } newFloorGroup.Add(newBeams); //SaveTmp(newBeams); } return(newFloorGroup); }
/// <summary> /// Create Column /// </summary> /// <param name="Type"></param> /// <param name="baseLevel"></param> /// <param name="topLevel"></param> /// <param name="points"></param> public void CreateColumn(FamilySymbol Type, Level baseLevel, Level topLevel, LINE points) { if (!Type.IsActive) { using (Transaction trans = new Transaction(revitDoc)) { trans.Start("Activate Family instance"); Type.Activate(); trans.Commit(); } } using (Transaction trans = new Transaction(revitDoc)) { trans.Start("Create Column"); FamilyInstance familyInstance = null; XYZ point = new XYZ((points.GetStartPoint().X + points.GetEndPoint().X) / 2, (points.GetStartPoint().Y + points.GetEndPoint().Y) / 2, 0); XYZ botPoint = new XYZ(point.X, point.Y, baseLevel.Elevation); XYZ topPoint = new XYZ(point.X, point.Y, topLevel.Elevation); familyInstance = revitDoc.Create.NewFamilyInstance(Line.CreateBound(botPoint, topPoint), Type, baseLevel, StructuralType.Column); trans.Commit(); } }
public static bool Is_Horizontal(LINE line) { return(line.GetStartPoint().Y == line.GetEndPoint().Y ? true : false); }
/// <summary> /// 取得所有的梁(水平與垂直向) /// </summary> /// <returns></returns> private List <LINE> GetAllBeams(Level targetLevel_) { FilteredElementCollector collector = new FilteredElementCollector(revitDoc); collector.OfCategory(BuiltInCategory.OST_StructuralFraming); collector.OfClass(typeof(FamilyInstance)); IList <Element> beams = collector.ToElements(); List <LINE> Beams = new List <LINE>(); foreach (Element beam in beams) { try { ///// 取得梁的Level Parameter mLevel = beam.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM); string levelName = mLevel.AsValueString(); //// 取得梁的類型與其寬度 ElementType type = revitDoc.GetElement(beam.GetTypeId()) as ElementType; Parameter b = type.LookupParameter("b"); double width = b.AsDouble(); ///檢查梁中心線是否有偏移 BuiltInParameter paraIndex = BuiltInParameter.START_Y_JUSTIFICATION; Parameter p1 = beam.get_Parameter(paraIndex); string offset = p1.AsValueString(); // 取得梁偏移量 BuiltInParameter paraIndex1 = BuiltInParameter.STRUCTURAL_BEAM_END0_ELEVATION; Parameter of1 = beam.get_Parameter(paraIndex1); string offset1 = of1.AsValueString(); BuiltInParameter paraIndex2 = BuiltInParameter.STRUCTURAL_BEAM_END1_ELEVATION; Parameter of2 = beam.get_Parameter(paraIndex2); string offset2 = of2.AsValueString(); if (offset1 != offset2) { continue; } double shift = Convert.ToDouble(offset1) / 304.8; LocationCurve Locurve = beam.Location as LocationCurve; Line line = Locurve.Curve as Line; XYZ direction = line.Direction; XYZ VertiDir = offset == "左" ? new XYZ(line.Direction.Y, -line.Direction.X, line.Direction.Z) : offset == "右" ? new XYZ(-line.Direction.Y, line.Direction.X, line.Direction.Z) : line.Direction; XYZ pp1 = line.GetEndPoint(0); XYZ pp2 = line.GetEndPoint(1); ///Ori Points XYZ stPoint = new XYZ(pp1.X + width / 2 * VertiDir.X, pp1.Y + width / 2 * VertiDir.Y, pp1.Z + width / 2 * VertiDir.Z); XYZ enPoint = new XYZ(pp1.X + line.Length * line.Direction.X + width / 2 * VertiDir.X, pp1.Y + line.Length * line.Direction.Y + width / 2 * VertiDir.Y, pp1.Z + line.Length * line.Direction.Z + width / 2 * VertiDir.Z); LINE LINE = new LINE(stPoint, enPoint); LINE.Name = beam.Name; LINE.LevelName = levelName; LINE.Width = width; if (Math.Round(LINE.GetStartPoint().Z, 3) == Math.Round(LINE.GetEndPoint().Z, 3)) { Beams.Add(LINE); } } catch (Exception) { } } return(Beams); }
private List <LINE> TakeOffColumnEdge(Dictionary <string, List <LINE> > columns, List <LINE> floor) { foreach (KeyValuePair <string, List <LINE> > column in columns) { List <LINE> newFloor = new List <LINE>(); Dictionary <int, List <LINE> > tmpData = new Dictionary <int, List <LINE> >(); for (int ii = 0; ii < column.Value.Count; ii++) { LINE columnEdge = column.Value[ii]; for (int jj = 0; jj < floor.Count; jj++) { LINE floorEdge = floor[jj]; if (Math.Round(floorEdge.GetSlope(), 3) == Math.Round(columnEdge.GetSlope(), 3)) { continue; } if (Math.Abs(Math.Round(floorEdge.GetDirection().X, 3)) == Math.Abs(Math.Round(columnEdge.GetDirection().X, 3)) && Math.Abs(Math.Round(floorEdge.GetDirection().Y, 3)) == Math.Abs(Math.Round(columnEdge.GetDirection().Y, 3))) { continue; } XYZ crossPoint = floorEdge.GetCrossPoint(columnEdge); try { if (floorEdge.IsPointInLine(crossPoint) && columnEdge.IsPointInLine(crossPoint)) { XYZ innerPoint = IsInner(columnEdge.GetStartPoint(), floor) ? columnEdge.GetStartPoint() : columnEdge.GetEndPoint(); double dis1 = (crossPoint - floorEdge.GetStartPoint()).GetLength(); double dis2 = (crossPoint - floorEdge.GetEndPoint()).GetLength(); LINE newLine = null; List <LINE> newList = new List <LINE>(); if (dis1 > dis2) { floorEdge.ResetParameters(crossPoint, "EndPoint"); newLine = new LINE(crossPoint, innerPoint); newList.Add(floorEdge); if (dis2 != 0) { newList.Add(newLine); } } else { newLine = new LINE(innerPoint, crossPoint); floorEdge.ResetParameters(crossPoint, "StartPoint"); if (dis1 != 0) { newList.Add(newLine); } newList.Add(floorEdge); } tmpData[jj] = newList; } } catch (Exception) { } } } for (int kk = 0; kk < floor.Count; kk++) { if (tmpData.ContainsKey(kk)) { foreach (LINE item in tmpData[kk]) { newFloor.Add(item); } } else { newFloor.Add(floor[kk]); } } floor = new List <LINE>(); floor = newFloor; } return(floor); }
public static double Get_Length(LINE Line) { return(Math.Sqrt( (Line.GetStartPoint().X - Line.GetEndPoint().X) * (Line.GetStartPoint().X - Line.GetEndPoint().X) + (Line.GetStartPoint().Y - Line.GetEndPoint().Y) * (Line.GetStartPoint().Y - Line.GetEndPoint().Y))); }
public static bool Is_Vertical(LINE line) { return(line.GetStartPoint().X == line.GetEndPoint().X ? true : false); }
/// <summary> /// 梁群組處理 /// </summary> /// <param name="LINES"></param> /// <returns></returns> private List <BEAM> BeamCenterLineProcessing(List <LINE> LINES) { List <BEAM> Beams = new List <BEAM>(); List <int> flag = new List <int>(); for (int i = 0; i < LINES.Count; i++) { if (flag.Contains(i)) { continue; } List <int> tmpFlag = new List <int>() { }; List <LINE> tmpLine = new List <LINE>(); List <double> tmpDistance = new List <double>(); for (int j = 0; j < LINES.Count; j++) { double dist = 0; if (i == j || tmpFlag.Contains(j)) { continue; } bool IsSameDir = IsSameDirection(LINES[i], LINES[j], ref dist); if (IsSameDir && dist != 0) { LINE tmpLine1 = LINES[i]; LINE tmpLine2 = LINES[j]; bool IsReverse = IsReverseDirection(tmpLine1.GetDirection(), tmpLine2.GetDirection()); XYZ stPoint_1; XYZ stPoint_2; XYZ enPoint_1; XYZ enPoint_2; if (IsReverse) { stPoint_1 = tmpLine1.GetStartPoint(); stPoint_2 = tmpLine2.GetEndPoint(); enPoint_1 = tmpLine1.GetEndPoint(); enPoint_2 = tmpLine2.GetStartPoint(); } else { stPoint_1 = tmpLine1.GetStartPoint(); stPoint_2 = tmpLine2.GetStartPoint(); enPoint_1 = tmpLine1.GetEndPoint(); enPoint_2 = tmpLine2.GetEndPoint(); } double dist_1 = GetDistanceByTwoPoint(stPoint_1, stPoint_2); double dist_2 = GetDistanceByTwoPoint(enPoint_1, enPoint_2); if (dist == dist_1 && dist_1 == dist_2) { LINE newLINE = LINES[j]; if (IsReverse) { newLINE = new LINE(LINES[j].GetEndPoint(), LINES[j].GetStartPoint()); newLINE.Name = LINES[j].Name; newLINE.LevelName = LINES[j].LevelName; newLINE.Width = LINES[j].Width; } tmpFlag.Add(j); tmpLine.Add(newLINE); tmpDistance.Add(dist); } } } if (tmpFlag.Count > 0) { double minDist = tmpDistance.Min(); int po = FindAllIndexof(tmpDistance, minDist)[0]; flag.Add(i); flag.Add(tmpFlag[po]); Beams.Add(new BEAM(LINES[i], tmpLine[po])); } } return(Beams); }
/// <summary> /// Get Beam parameter Lines using to Create beam those lines is the center line of beam /// </summary> /// <param name="Collect"></param> /// <param name="H_Direction_Lines"></param> /// <param name="V_Direction_Lines"></param> /// <param name="H_Beams"></param> /// <param name="V_Beams"></param> public static List <LINE> GetBeamDrawLines(List <List <LINE> > Collect, List <LINE> H_Direction_Lines, List <LINE> V_Direction_Lines) { List <LINE> RESULT = new List <LINE>(); /// Collect Part foreach (List <LINE> co in Collect) { if (co.Count() <= 4) { LINE line1 = co[0]; LINE line2 = co[1]; XYZ p1 = null; XYZ p2 = null; double ll1 = GeometryResult.Get_Length(line1); double ll2 = GeometryResult.Get_Length(line2); if (ll1 > ll2) { if (line1.GetStartPoint().Y == line1.GetEndPoint().Y) { p1 = new XYZ(line1.GetStartPoint().X, (line1.GetStartPoint().Y + line2.GetEndPoint().Y) / 2, 0); p2 = new XYZ(line1.GetEndPoint().X, (line1.GetStartPoint().Y + line2.GetEndPoint().Y) / 2, 0); } else if (line1.GetStartPoint().X == line1.GetEndPoint().X) { p1 = new XYZ((line1.GetStartPoint().X + line2.GetEndPoint().X) / 2, line1.GetStartPoint().Y, 0); p2 = new XYZ((line1.GetStartPoint().X + line2.GetEndPoint().X) / 2, line1.GetEndPoint().Y, 0); } } else { if (line2.GetStartPoint().Y == line2.GetEndPoint().Y) { p1 = new XYZ(line2.GetStartPoint().X, (line1.GetStartPoint().Y + line2.GetEndPoint().Y) / 2, 0); p2 = new XYZ(line2.GetEndPoint().X, (line1.GetStartPoint().Y + line2.GetEndPoint().Y) / 2, 0); } else if (line2.GetStartPoint().X == line2.GetEndPoint().X) { p1 = new XYZ((line1.GetStartPoint().X + line1.GetEndPoint().X) / 2, line2.GetStartPoint().Y, 0); p2 = new XYZ((line1.GetStartPoint().X + line1.GetEndPoint().X) / 2, line2.GetEndPoint().Y, 0); } } if (p1 != null) { RESULT.Add(new LINE(p1, p2)); } } } /// H-Beam Part List <LINE> sorted_H = H_Direction_Lines.OrderBy(e => e.GetStartPoint().Y).ToList(); List <LINE> H_Beams = new List <LINE>(); int[] is_pickup = new int[sorted_H.Count()]; for (int i = 0; i < sorted_H.Count(); i++) { if (is_pickup[i] == 1) { continue; } LINE baseLine = sorted_H[i]; for (int j = 0; j < sorted_H.Count(); j++) { if (j == i || is_pickup[j] == 1) { continue; } LINE cmpLine = sorted_H[j]; if (baseLine.GetSlope() == -cmpLine.GetSlope()) { cmpLine = new LINE(cmpLine.GetEndPoint(), cmpLine.GetStartPoint()); } if (baseLine.GetStartPoint().X == cmpLine.GetStartPoint().X&& baseLine.GetEndPoint().X == cmpLine.GetEndPoint().X) { is_pickup[i] = 1; is_pickup[j] = 1; XYZ p1 = new XYZ((baseLine.GetStartPoint().X + cmpLine.GetStartPoint().X) / 2, (baseLine.GetStartPoint().Y + cmpLine.GetStartPoint().Y) / 2, 0); XYZ p2 = new XYZ((baseLine.GetEndPoint().X + cmpLine.GetEndPoint().X) / 2, (baseLine.GetEndPoint().Y + cmpLine.GetEndPoint().Y) / 2, 0); H_Beams.Add(new LINE(p1, p2)); RESULT.Add(new LINE(p1, p2)); break; } } } /// V-Beam Part List <LINE> V_Beams = new List <LINE>(); List <LINE> sorted_V = V_Direction_Lines.OrderBy(e => e.GetStartPoint().X).ToList(); is_pickup = new int[sorted_V.Count()]; for (int i = 0; i < sorted_V.Count(); i++) { if (is_pickup[i] == 1) { continue; } LINE baseLine = sorted_V[i]; for (int j = 0; j < sorted_V.Count(); j++) { if (j == i || is_pickup[j] == 1) { continue; } LINE cmpLine = sorted_V[j]; if (baseLine.GetSlope() == -cmpLine.GetSlope()) { cmpLine = new LINE(cmpLine.GetEndPoint(), cmpLine.GetStartPoint()); } if (baseLine.GetStartPoint().Y == cmpLine.GetStartPoint().Y&& baseLine.GetEndPoint().Y == cmpLine.GetEndPoint().Y) { is_pickup[i] = 1; is_pickup[j] = 1; XYZ p1 = new XYZ((baseLine.GetStartPoint().X + cmpLine.GetStartPoint().X) / 2, (baseLine.GetStartPoint().Y + cmpLine.GetStartPoint().Y) / 2, 0); XYZ p2 = new XYZ((baseLine.GetEndPoint().X + cmpLine.GetEndPoint().X) / 2, (baseLine.GetEndPoint().Y + cmpLine.GetEndPoint().Y) / 2, 0); V_Beams.Add(new LINE(p1, p2)); RESULT.Add(new LINE(p1, p2)); break; } } } return(RESULT); }
/// <summary> /// Classify Lines to "closed curve" or "H_dir_lines" or "V_dir_lines" or "else_dir_lines" /// </summary> /// <param name="LINES"></param> /// <param name="Collect"></param> /// <param name="H_Direction_Lines"></param> /// <param name="V_Direction_Lines"></param> /// <param name="Else_Direction_Lines"></param> public static void ClassifyLines(List <LINE> LINES, out List <List <LINE> > Collect, out List <LINE> H_Direction_Lines, out List <LINE> V_Direction_Lines, out List <LINE> Else_Direction_Lines) { Collect = new List <List <LINE> >(); int[] is_pickup = new int[LINES.Count]; for (int i = 0; i < LINES.Count; i++) { if (is_pickup[i] == 1) { continue; } LINE baseLine = LINES[i]; List <LINE> tmpData = new List <LINE>(); tmpData.Add(baseLine); int j = 0; while (j < LINES.Count) { LINE cmpLine = LINES[j]; if (is_pickup[j] == 1 || j == i) { j = j + 1; continue; } if (cmpLine.GetStartPoint().X == baseLine.GetEndPoint().X&& cmpLine.GetStartPoint().Y == baseLine.GetEndPoint().Y) { baseLine = cmpLine; tmpData.Add(baseLine); is_pickup[j] = 1; j = 0; } else if (cmpLine.GetEndPoint().X == baseLine.GetEndPoint().X&& cmpLine.GetEndPoint().Y == baseLine.GetEndPoint().Y) { baseLine = new LINE(cmpLine.GetEndPoint(), cmpLine.GetStartPoint()); tmpData.Add(baseLine); is_pickup[j] = 1; j = 0; } else if (tmpData[0].GetStartPoint().X == cmpLine.GetStartPoint().X&& tmpData[0].GetStartPoint().Y == cmpLine.GetStartPoint().Y) { tmpData.Insert(0, new LINE(cmpLine.GetEndPoint(), cmpLine.GetStartPoint())); is_pickup[j] = 1; j = 0; } else if (tmpData[0].GetStartPoint().X == cmpLine.GetEndPoint().X&& tmpData[0].GetStartPoint().Y == cmpLine.GetEndPoint().Y) { tmpData.Insert(0, cmpLine); is_pickup[j] = 1; j = 0; } else { j = j + 1; } } if (tmpData.Count != 1) { Collect.Add(tmpData); is_pickup[i] = 1; } } H_Direction_Lines = new List <LINE>(); V_Direction_Lines = new List <LINE>(); Else_Direction_Lines = new List <LINE>(); for (int ii = 0; ii < is_pickup.Count(); ii++) { if (is_pickup[ii] == 0) { LINE line = LINES[ii]; if (GeometryResult.Is_Horizontal(line)) { H_Direction_Lines.Add(line); } else if (GeometryResult.Is_Vertical(line)) { V_Direction_Lines.Add(line); } else { Else_Direction_Lines.Add(line); } } } }