Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        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();
            }
        }
Ejemplo n.º 5
0
        /// <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
        }