void FindPoints() { for (int i = 0; i < lines_first_ent.Count; i++) { List <Point3d> lineintersections = new List <Point3d>(); for (int j = 0; j < lines_second_ent.Count; j++) { var pts = UT.IntersectWith(lines_first_ent[i], lines_second_ent[j], extend); foreach (Point3d pt in pts) { lineintersections.Add(pt); } } if (lines_first_ent[i] is Curve) { var crv = lines_first_ent[i] as Curve; try { lineintersections.Sort((x, y) => crv.GetParameterAtPoint(x).CompareTo(crv.GetParameterAtPoint(y))); } catch (Exception) { Tweet("Не удалась сортировка исходя из параметров"); try { lineintersections.Sort((x, y) => crv.StartPoint.DistanceTo(x).CompareTo(crv.StartPoint.DistanceTo(y))); } catch (Exception) { Tweet("Сортировка по дистанции от начала кривой не удалась"); } } } for (int j = 0; j < lineintersections.Count; j++) { if (copy_chess) { if (ChessOrder(i, j)) { points.Add(lineintersections[j]); } else { points_alternative.Add(lineintersections[j]); } } else { points.Add(lineintersections[j]); } } } }
public RebarDrawing() { Tweet("Начинаем распознавать слои"); if (!InitLayers()) { Tweet("Не хватает слоев! Программа не будет продолжена. Для корректной работы необходим полный шаблон ПК"); return; } if (!InitLinetype()) { return; } Tweet("Пробуем нарисовать плиту"); using (var th = new TransactionHelper()) { var sset_line1 = Input.Objects("Выберите линию сечения нижней арматуры", new string[] { "SEttings", "ПАраметры", "LAyers", "cЛОи" }, SetParams ); if (Input.StatusBad) { return; } var sset_lines1 = Input.Objects("Выберите нижние арматурные стержни"); if (Input.StatusBad) { return; } var sset_line2 = Input.Objects("Выберите линию сечения верхней арматуры"); if (Input.StatusBad) { return; } var sset_lines2 = Input.Objects("Выберите верхние арматурные стержни"); if (Input.StatusBad) { return; } var ln1 = th.ReadObject(sset_line1[0].ObjectId) as Line; var ln2 = th.ReadObject(sset_line2[0].ObjectId) as Line; var lines1 = th.ReadObjects(sset_lines1); var lines2 = th.ReadObjects(sset_lines2); var colors1 = lines1.Select((ln) => ln.Color).ToList(); var colors2 = lines2.Select((ln) => ln.Color).ToList(); dot_data1 = lines1.Select((ln) => { return(new Tuple <double, Color>(UT.IntersectWith(ln, ln1)[0].X, ln.Color)); } ).ToList(); dot_data2 = lines2.Select((ln) => { return(new Tuple <double, Color>(UT.IntersectWith(ln, ln2)[0].X, ln.Color)); } ).ToList(); th.WriteObjects(Slab(thickness, ln1.StartPoint.X, ln1.EndPoint.X, offset_up, offset_down, dots_up, dots_down)); } }
/// <summary> /// Сравнение двух кривых исходя из направления сортировки /// </summary> /// <param name="x">первая кривая</param> /// <param name="y">вторая кривая</param> /// <param name="sorting_direction">кривая, по которой определяется направление сортировки</param> /// <returns></returns> /// <param name = "extend">Удлиннение</param> public static int CurveCompare(this Curve x, Curve y, Curve sorting_direction, bool extend) { //берем первые точки пересечения. Не забыть проверить есть ли они try { Point3d ptx = Utilities.IntersectWith(x, sorting_direction, extend)[0]; Point3d pty = Utilities.IntersectWith(y, sorting_direction, extend)[0]; return(sorting_direction.GetParameterAtPoint(ptx).CompareTo(sorting_direction.GetParameterAtPoint(pty))); } catch (Exception) { Messaging.Tweet("Не можем сравнить линии"); return(0); } }
/// <summary> /// Мультивыноска из объектов со стрелками на одной линии /// </summary> public void MakeArrowsInline() { base.Execute(); asc = UT.GetAnnoScale("CANNOSCALE"); var objects = new List <Entity>(); var points = new List <Point3d>(); Point3d p1, p2; Line p1p2; Vector3d offset = new Vector3d(2, 3.6, 0); var sset = Input.Objects("Выберите объекты"); if (Input.StatusBad) { return; } p1 = Input.Point("Выберите точку мультивыноски"); if (Input.StatusBad) { return; } p2 = Input.Point("Выберите точку для задания направления"); if (Input.StatusBad) { return; } p1p2 = new Line(p1, p2); Tweet("\nНачинаем транзакцию"); using (var th = new TransactionHelper()) { objects = th.ReadObjects(sset); Tweet("\nНачинаем поиск точек"); foreach (Entity ent in objects) { var pt_arr = UT.IntersectWith(p1p2, ent); if (pt_arr.Count > 0) { points.Add(pt_arr[0]); } } Tweet("\nНачинаем подготовку текста"); mtp = p1; text = "хх"; PrepareMtext(0); Tweet("\nНачинаем подготовку выноски"); MLeader mleader = new MLeader(); mleader.SetDatabaseDefaults(); mleader.ContentType = ContentType.MTextContent; mt.TransformBy(Matrix3d.Displacement(offset.DivideBy(asc.Scale))); mleader.MText = mt; Tweet("\nДобавляем линии"); foreach (Point3d ptt in points) { int idx = mleader.AddLeaderLine(p1); mleader.SetFirstVertex(idx, ptt); } Tweet("\nЗаписываем объекты"); th.WriteObject(mleader); } }