示例#1
0
        private Rectangle GetBuildingRectangle(MapBuilding building)
        {
#if TEST
            //EntityHelper.AddEntityToCurrentSpace(building.ExtentsInModel.GetPolyline());
#endif
            return(new Rectangle(building.ExtentsInModel));
        }
示例#2
0
 private void Map_BuildingAdded(object sender, MapBuilding e)
 {
     // Флаг что расчет требуется обновить - т.к.изменились здания на чертеже
     IsUpdateRequired = true;
     UpdateInfo       = "Требуется обновление - добавлено здание.";
     //Update();
 }
示例#3
0
        /// <summary>
        /// Определение дома для здания
        /// </summary>
        /// <param name="building">Здание без дома</param>
        private void DefineHouseForBuilding(MapBuilding building)
        {
            var allIntersectBuildings = new HashSet <MapBuilding>();

            GetIntersectBuildings(building, ref allIntersectBuildings);
            // Найти все связанные здания для нового дома
            var allNewHouseBuildings = GetAllReferencedBuildings(allIntersectBuildings);

            NewHouse(allNewHouseBuildings);
        }
示例#4
0
 private static void CheckIntersect(MapBuilding build1, MapBuilding build2)
 {
     using (var r1 = (Region)build1.Region.Clone())
         using (var r2 = (Region)build2.Region.Clone())
         {
             r1.BooleanOperation(BooleanOperationType.BoolIntersect, r2);
             if (r1.NumChanges > 1 && r1.Area > 13.5)
             {
                 Inspector.AddError($"Наложение зданий. Площадь наложения {NetLib.DoubleExt.Round(r1.Area,1)}. '{build1.GetInfo().Replace("\r\n", " ")}' и '{build2.GetInfo().Replace("\r\n", " ")}'. Проверка наложения зданий.",
                                    r1.GeometricExtents, Matrix3d.Identity, System.Drawing.SystemIcons.Error);
             }
         }
 }
示例#5
0
        /// <summary>
        /// Изменение
        /// </summary>
        /// <param name="building"></param>
        public void ChangeBuildingType(MapBuilding building)
        {
            if (building == null)
            {
                return;
            }
            var pointsInBuilding = Tree.GetPointsInBuilding(building);

            foreach (var item in pointsInBuilding)
            {
                item.Update();
            }
        }
示例#6
0
        private Point3d PromptSelectPointOnScreen(out MapBuilding building)
        {
            var pt = ed.GetPointWCS("\nВыбор расчетной точки (на внешней стене здания):");

            // Проверка точки
            building = InsPointBase.DefineBuilding(ref pt, model);
            // Нет ли уже точки в этом месте
            if (model.Tree.HasPoint(pt))
            {
                ed.WriteMessage($"\nУже есть расчетная точка в этом месте. Укажите другую точку.");
                pt = PromptSelectPointOnScreen(out building);
            }
            return(pt);
        }
示例#7
0
        public MapBuilding GetBuildingInPoint(Point2d pt)
        {
            MapBuilding building      = null;
            var         buildingsInPt = GetBuildingsInPoint(pt);

            if (buildingsInPt.Count == 1)
            {
                building = buildingsInPt[0];
            }
            else if (buildingsInPt.Count > 1)
            {
                // Выбрать ближайшую полилинию
                double minLen = -1;
                var    pt3d   = pt.Convert3d();
                foreach (var buildItem in buildingsInPt)
                {
                    bool initContour = false;
                    if (buildItem.Contour == null || buildItem.Contour.IsDisposed)
                    {
                        buildItem.InitContour();
                        initContour = true;
                    }

                    try
                    {
                        var ptContour = buildItem.Contour.GetClosestPointTo(pt3d, false);
                        var l         = (pt3d - ptContour).Length;
                        if (l < minLen || minLen == -1)
                        {
                            minLen   = l;
                            building = buildItem;
                        }
                    }
                    catch { }

                    if (initContour)
                    {
                        buildItem.Contour.Dispose();
                    }
                }
            }
            return(building);
        }
示例#8
0
        public static bool CorrectCalcPoint(ref Point3d pt, MapBuilding building, Document doc)
        {
            bool res;
            // Корректировка точки
            Point3d correctPt;

            building.InitContour();
            using (building.Contour)
            {
                correctPt = building.Contour.GetClosestPointTo(pt, true);
            }

            if ((pt - correctPt).Length < 0.3)
            {
                // Точка достаточно близко к контуру - поправка точки и ОК.
                pt  = correctPt;
                res = true;
            }
            else
            {
                // Точка далеко от контура - не пойдет.
                res = false;
#if TEST
                //building.InitContour();
                //using (building.Contour)
                //{
                //    EntityHelper.AddEntityToCurrentSpace((Autodesk.AutoCAD.DatabaseServices.Polyline)building.Contour.Clone());
                //}
                //var dbPt = new DBPoint(correctPt);
                //dbPt.Color = Color.FromColor(System.Drawing.Color.AliceBlue);
                //EntityHelper.AddEntityToCurrentSpace(dbPt);
                //dbPt = new DBPoint(pt);
                //dbPt.Color = Color.FromColor(System.Drawing.Color.Gold);
                //EntityHelper.AddEntityToCurrentSpace(dbPt);
#endif
            }
            return(res);
        }
示例#9
0
 /// <summary>
 /// Пересекающиеся дома
 /// </summary>
 private void GetIntersectBuildings(MapBuilding building, ref HashSet <MapBuilding> intersectBuildings)
 {
     using (var offset = building.Contour.Offset(1, OffsetSide.Out).First())
     {
         // Ближайшие дома без уже найденных зданий
         intersectBuildings.Add(building);
         var nearestBuildings = map.GetBuildingsInExtents(offset.GeometricExtents).Except(intersectBuildings).
                                Where(w => w.Building.IsProjectedBuilding == building.Building.IsProjectedBuilding).ToList();
         var curIntersectBuildings = new List <MapBuilding>();
         foreach (var nearBuilding in nearestBuildings)
         {
             var ptsIntersect = new Point3dCollection();
             offset.IntersectWith(nearBuilding.Contour, Intersect.OnBothOperands, ptsIntersect, IntPtr.Zero, IntPtr.Zero);
             if (ptsIntersect.Count > 0)
             {
                 if (intersectBuildings.Add(nearBuilding) && nearBuilding.House == null)
                 {
                     curIntersectBuildings.Add(nearBuilding);
                     // Усреднение вершин двух секций
                     var contourItem = nearBuilding.Contour;
                     try
                     {
                         building.Contour.AverageVertexes(ref contourItem, toleranceVertex, true);
                     }
                     catch
                     {
                     }
                 }
             }
         }
         foreach (var intersectBuild in curIntersectBuildings)
         {
             GetIntersectBuildings(intersectBuild, ref intersectBuildings);
         }
     }
 }
示例#10
0
        private void DefineEnt(Entity ent)
        {
            var building = ElementFactory.Create <IBuilding>(ent);

            if (building != null)
            {
                // Если это не полилиния или блок - такие объекты пока не поддерживаются
                if (!(ent is Polyline) && !(ent is BlockReference))
                {
                    Inspector.AddError($"Тип здания не подходит для инсоляции - '{ent.GetRXClass().Name}', слой '{ent.Layer}'", ent, System.Drawing.SystemIcons.Error);
                    return;
                }

                var insBuild = new MapBuilding(building);
                Buildings.Add(insBuild);
                var r = GetBuildingRectangle(insBuild);
                treeBuildings.Add(r, insBuild);

                // Подписывание на изменения объекта
                ent.Modified += Building_Modified;
                ent.Erased   += Building_Erased;

                // Оповещение расчета о изменении здания
                if (IsEventsOn)
                {
                    BuildingAdded?.Invoke(this, insBuild);
                }
                return;
            }
            // Сбор точек инсоляции
            var dbPt = ent as DBPoint;

            if (dbPt != null)
            {
                if (InsPointHelper.IsInsPoint(dbPt))
                {
                    InsPoints.Add(dbPt.Id);

                    // Оповещение о создании точки
                    if (IsEventsOn)
                    {
                        InsPointAdded?.Invoke(this, dbPt.Id);
                    }
                }
                return;
            }
            var pl = ent as Polyline;

            if (pl != null)
            {
                var entExtDicExt = new EntDictExt(pl, InsService.PluginName);
                var dic          = entExtDicExt.Load();
                if (dic != null)
                {
                    var dicPlace = dic.GetInner(Place.PlaceDicName);
                    if (dicPlace != null)
                    {
                        Places.Add(new KeyValuePair <ObjectId, DicED>(pl.Id, dicPlace));
                    }
                }
                //// Если она на  слое sapr_ins_visuals - удаление
                //if (VisualDatabase.IsVisualElement(ent))
                //{
                //    ent.UpgradeOpen();
                //    ent.Erase();
                //}
            }
        }
示例#11
0
 /// <summary>
 /// Точки принадлежащие зданию
 /// </summary>
 public List <InsPoint> GetPointsInBuilding(MapBuilding building)
 {
     return(Points.Where(p => p.Building == building).ToList());
 }