private List <IIlluminationArea> CalcIllumsByHeight(List <MapBuilding> buildings, double height) { List <IIlluminationArea> illumShadows = new List <IIlluminationArea>(); using (Line lineShadow = GetLineShadow(height)) { // перебор домов одной высоты foreach (var build in buildings) { // Если дом полностью выше линии тени (сечения), то он полностью затеняет точку if (build.YMin >= (lineShadow.StartPoint.Y - 0.1)) { // Найти точку начала тени и конца (с минимальным и макс углом к точке расчета) var ilumShadow = GetBuildingZeroLineShadows(build); //var ilumShadow = GetIllumShadow(build.Contour.GetPoints().Where(p=>p.Y<ptCalc.Y).ToList()); if (ilumShadow != null) { illumShadows.Add(ilumShadow); } } else if (build.YMax >= (lineShadow.StartPoint.Y - 0.1)) { var ilumsBoundary = GetBuildingLineShadowBoundary(build, lineShadow, Intersect.ExtendThis); illumShadows.AddRange(ilumsBoundary); } } #if TEST EntityHelper.AddEntityToCurrentSpace(lineShadow); #endif } // Объединение совпадающих зон теней illumShadows = IllumAreaBase.Merge(illumShadows); return(illumShadows); }
/// <summary> /// Тестовая отрисовка ячейки /// </summary> public void TestDraw() { var ext = PtCenter.GetRectangleFromCenter(ModuleSize); var pl = ext.GetPolyline(); EntityHelper.AddEntityToCurrentSpace(pl); EntityHelper.AddEntityToCurrentSpace(new DBPoint(PtCenter.Convert3d())); var text = new DBText(); text.TextString = $"[{Row};{Column}]"; text.Height = 1; text.Justify = AttachmentPoint.MiddleCenter; text.AlignmentPoint = PtCenter.Convert3d(); text.AdjustAlignment(HostApplicationServices.WorkingDatabase); EntityHelper.AddEntityToCurrentSpace(text); var textIndex = new DBText(); textIndex.TextString = Index.ToString(); textIndex.Height = 0.25; textIndex.Justify = AttachmentPoint.MiddleCenter; textIndex.AlignmentPoint = new Point3d(PtCenter.X, PtCenter.Y - 1.5, 0); textIndex.AdjustAlignment(HostApplicationServices.WorkingDatabase); EntityHelper.AddEntityToCurrentSpace(textIndex); }
private void TestDrawContourVertexText() { if (Contour == null || Contour.IsDisposed) { return; } for (int i = 0; i < Contour.NumberOfVertices; i++) { var vertex = Contour.GetPoint2dAt(i); var text = new DBText(); text.TextString = i.ToString(); text.Position = vertex.Convert3d(); text.Height = 2; EntityHelper.AddEntityToCurrentSpace(text); } }
public void TestAverageVertexes() { var doc = Application.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var selPl1 = ed.GetEntity("Pl1"); if (selPl1.Status != PromptStatus.OK) { return; } var selPl2 = ed.GetEntity("Pl2"); if (selPl2.Status != PromptStatus.OK) { return; } using (var t = db.TransactionManager.StartTransaction()) { var pl1 = selPl1.ObjectId.GetObject(OpenMode.ForWrite) as Polyline; var pl2 = selPl2.ObjectId.GetObject(OpenMode.ForWrite) as Polyline; pl1.AverageVertexes(ref pl2, new Autodesk.AutoCAD.Geometry.Tolerance(1, 1), true); var pls = new List <Polyline> { pl1, pl2 }; var plUnion = pls.Union(null); EntityHelper.AddEntityToCurrentSpace(plUnion); t.Commit(); } }
/// <summary> /// Определение полилинии контура дома (объединением полилиний от блок-секций) /// </summary> public virtual void DefineContour() { Contour?.Dispose(); if (Sections.Count == 0) { return; } var pls = Sections.Select(s => s.Contour).ToList(); // Предварительное соединение полилиний (близкие точки вершин разных полилиний - в среднюю вершину) // Сделал при определении домов if (pls.Count == 1) { Contour = (Polyline)pls.First().Clone(); } else { foreach (var item in pls) { item.Wedding(TreeModel.TolerancePoints); #if DEBUG //EntityHelper.AddEntityToCurrentSpace((Entity)item?.Clone()); #endif } using (var reg = pls.Union(null)) { #if DEBUG //EntityHelper.AddEntityToCurrentSpace((Region)reg?.Clone()); #endif var ptsRegByLoopType = reg.GetPoints2dByLoopType(); if (ptsRegByLoopType.Count == 1) { Contour = ptsRegByLoopType[0].Key.Cast <Point2d>().ToList().CreatePolyline(); } else { // Если это "кольцевой" дом (замкнутый контур из блок-секций) if (ptsRegByLoopType.Count == 2 && ptsRegByLoopType.Any(p => p.Value == BrepLoopType.LoopInterior)) { // Будет один дом состоящий из двух полилиний - внешней и внутренней // Внешний контур Contour = ptsRegByLoopType.First(p => p.Value == BrepLoopType.LoopExterior).Key.Cast <Point2d>().ToList().CreatePolyline(); // Внутренний контур //ContourInner = ptsRegByLoopType.First(p => p.Value == BrepLoopType.LoopInterior).Key.Cast<Point2d>().ToList().CreatePolyline(); } else { // Объединение полилиний var plsLoop = ptsRegByLoopType.Select(s => s.Key.Cast <Point2d>().ToList().CreatePolyline()).ToList(); try { #if DEBUG //EntityHelper.AddEntityToCurrentSpace(plsLoop); #endif var plMerged = plsLoop.Merge(2); Contour = plMerged; } catch (Exception ex) { AddError(ex.Message); } } } } } // Прополка полилилинии Contour?.Wedding(TreeModel.TolerancePoints); #if TEST EntityHelper.AddEntityToCurrentSpace((Polyline)Contour?.Clone()); TestDrawContourVertexText(); //EntityHelper.AddEntityToCurrentSpace((Polyline)ContourInner?.Clone()); #endif }