/// <summary>
        /// Initializes the view model.
        /// </summary>
        private void InitializeViewModel()
        {
            MainContext mainContext = new MainContext(_graphic.Building);

            _mainView.DataContext = mainContext;

            FloorContext floorContext = new FloorContext(_graphic.Building.Floors, _graphic.Sources, _floorView);

            floorContext.Parent    = mainContext;
            mainContext.Child      = floorContext;
            _floorView.DataContext = floorContext;

            ZoneContext zoneContext = new ZoneContext(_graphic.Building.Floors[0].Zones, _graphic.Sources);

            zoneContext.Parent    = floorContext;
            floorContext.Child    = zoneContext;
            _zoneView.DataContext = zoneContext;

            _navigator       = new Navigator(mainContext);
            this.DataContext = _navigator;

            _mainView.Focus();
            _floorView.Focus();
            _zoneView.Focus();
        }
 public BuildingController(
     FloorContext argFloorContext,
     UserManager <ApplicationUser> argUserManager)
 {
     _floorContext = argFloorContext;
     _userManager  = argUserManager;
 }
        /// <summary>
        /// Get floor by id
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Floor Get(int id)
        {
            using (var context = new FloorContext())
            {
                var floor = context.Floors.Find(id);


                return(floor);
            }
        }
        /// <summary>
        /// Get All Floors as List
        /// </summary>
        /// <returns></returns>
        public List <Floor> AllList()
        {
            using (var context = new FloorContext())
            {
                var floors = context.Floors.ToList();


                return(floors);
            }
        }
        /// <summary>
        /// Get All Floors as IQueryable
        /// </summary>
        /// <returns></returns>
        public IQueryable <Floor> All()
        {
            using (var context = new FloorContext())
            {
                var floors = context.Floors;


                return(floors);
            }
        }
        /// <summary>
        /// Get floor by id
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Floor Get(int id)
        {
            using (var context = new FloorContext())
            {
                var floor = context.Floors.Find(id);

                //log call
                _loggingService.Info("Elevator.Infrastructure.Data.Repositories: FloorRepository.Get");

                return(floor);
            }
        }
        /// <summary>
        /// Get All Floors as List
        /// </summary>
        /// <returns></returns>
        public List <Floor> AllList()
        {
            using (var context = new FloorContext())
            {
                var floors = context.Floors.ToList();

                // Log call
                _loggingService.Info("Elevator.Infrastructure.Data.Repositories: FloorRepository.AllList");

                return(floors);
            }
        }
        /// <summary>
        /// Get All Floors as IQueryable
        /// </summary>
        /// <returns></returns>
        public IQueryable <Floor> All()
        {
            using (var context = new FloorContext())
            {
                var floors = context.Floors;

                // Log call
                _loggingService.Info("Elevator.Infrastructure.Data.Repositories: FloorRepository.All");

                return(floors);
            }
        }
        /// <summary>
        /// Update Floor to db
        /// </summary>
        /// <param name="floor"></param>
        /// <returns></returns>
        public bool Update(Floor floor)
        {
            using (var context = new FloorContext())
            {
                context.Floors.Attach(floor);

                var entry = context.Entry(floor);
                entry.State = EntityState.Modified;
                context.SaveChanges();


                return(true);
            }
        }
        /// <summary>
        /// Update Floor to db
        /// </summary>
        /// <param name="floor"></param>
        /// <returns></returns>
        public bool Update(Floor floor)
        {
            using (var context = new FloorContext())
            {
                context.Floors.Attach(floor);

                var entry = context.Entry(floor);
                entry.State = EntityState.Modified;
                context.SaveChanges();

                //log call
                _loggingService.Info("Elevator.Infrastructure.Data.Repositories: FloorRepository.Update");

                return(true);
            }
        }
Exemple #11
0
        private static void AddTransitWalls(InDoorGeneratorSettings settings, Floor floor, FloorContext context,
                                            Apartment apartment, List <Wall> extrudedWalls, Vector2d transitWallSplitPoint, int lastTransitIndex)
        {
            // this is last apartment
            if (transitWallSplitPoint == Vector2d.Empty)
            {
                context.TransitWallIndex = context.FirstTransitWallIndex;
                transitWallSplitPoint    = extrudedWalls[context.FirstTransitWallIndex].Start;
            }

            // this is first apartment
            if (!floor.TransitWalls.Any())
            {
                // copy all next walls without splitting
                if (context.TransitWallIndex != context.LastTransitWallIndex)
                {
                    for (var i = context.LastTransitWallIndex; i > context.TransitWallIndex;
                         i = --i < 0 ? extrudedWalls.Count + i : i)
                    {
                        var wall = extrudedWalls[i];
                        AddTransitWall(floor, apartment, wall.End, wall.Start);
                    }
                }
                AddTransitWall(floor, apartment, extrudedWalls[context.TransitWallIndex].End, transitWallSplitPoint);
            }
            // this is intermediate or last apartment
            else
            {
                if (context.TransitWallIndex != lastTransitIndex)
                {
                    var index = lastTransitIndex;
                    while (index != context.TransitWallIndex)
                    {
                        var wall = extrudedWalls[index];
                        AddTransitWall(floor, apartment, floor.TransitWalls.Last().End, wall.Start);

                        index = --index < 0 ? extrudedWalls.Count + index : index;
                        if (index == context.LastOuterWallIndex)
                        {
                            index = context.LastTransitWallIndex;
                        }
                    }
                }
                AddTransitWall(floor, apartment, floor.TransitWalls.Last().End, transitWallSplitPoint);
            }
        }
Exemple #12
0
        private static void AddOuterWalls(InDoorGeneratorSettings settings, Floor floor, FloorContext context,
                                          Apartment apartment, List <Wall> extrudedWalls, Vector2d outerWallSplitPoint, int lastOuterIndex)
        {
            // this is last apartment
            if (outerWallSplitPoint == Vector2d.Empty)
            {
                context.OuterWallIndex = context.LastOuterWallIndex;
                outerWallSplitPoint    = extrudedWalls[context.LastOuterWallIndex].End;
            }

            // this is first apartment
            if (!floor.OuterWalls.Any())
            {
                // copy all previous walls without splitting
                if (context.OuterWallIndex != context.FirstOuterWallIndex)
                {
                    for (var i = context.FirstOuterWallIndex; i < context.OuterWallIndex;
                         i = (i + 1) % extrudedWalls.Count)
                    {
                        var wall = extrudedWalls[i];
                        AddOuterWall(floor, apartment, wall.Start, wall.End);
                    }
                }
                // add part of current wall
                AddOuterWall(floor, apartment, extrudedWalls[context.OuterWallIndex].Start, outerWallSplitPoint);
            }
            // this is intermediate or last apartment
            else
            {
                if (context.OuterWallIndex != lastOuterIndex)
                {
                    var index = lastOuterIndex;
                    while (index != context.OuterWallIndex)
                    {
                        var wall = extrudedWalls[index];

                        var startPoint = index == lastOuterIndex
                            ? floor.OuterWalls.Last().End
                            : wall.Start;

                        AddOuterWall(floor, apartment, startPoint, wall.End);
                        index = (index + 1) % extrudedWalls.Count;
                    }
                }
                AddOuterWall(floor, apartment, floor.OuterWalls.Last().End, outerWallSplitPoint);
            }
        }
Exemple #13
0
        private static void InsertAparment(InDoorGeneratorSettings settings, Floor floor, FloorContext context,
                                           List <Wall> extrudedWalls, Vector2d outerWallSplitPoint, Vector2d transitWallSplitPoint,
                                           ref int lastOuterIndex, ref int lastTransitIntex)
        {
            var apartment = new Apartment(settings.ObjectPool);

            AddOuterWalls(settings, floor, context, apartment, extrudedWalls,
                          outerWallSplitPoint, lastOuterIndex);

            AddTransitWalls(settings, floor, context, apartment, extrudedWalls,
                            transitWallSplitPoint, lastTransitIntex);

            if (outerWallSplitPoint != Vector2d.Empty)
            {
                floor.PartitionWalls.Add(new LineSegment2d(outerWallSplitPoint, transitWallSplitPoint));
            }

            floor.Apartments.Add(apartment);

            lastOuterIndex   = context.OuterWallIndex;
            lastTransitIntex = context.TransitWallIndex;
        }
Exemple #14
0
        private static void CreateAparments(InDoorGeneratorSettings settings, Floor floor,
                                            FloorContext context, List <Wall> extrudedWalls, List <Wall> connectedSkeletonWalls,
                                            double outerWallLength)
        {
            var currentWidthStep         = settings.PreferedWidthStep;
            var remainingOuterWallLength = outerWallLength;
            var lastUsedOuterIndex       = InvalidIndex;
            var usedTransitIndex         = InvalidIndex;

            var stopIterationIndex = context.FirstOuterWallIndex + context.OuterWallCount;

            for (var i = context.FirstOuterWallIndex; i < stopIterationIndex; i++)
            {
                var index = i == extrudedWalls.Count ? 0 : i % extrudedWalls.Count;

                var wall  = extrudedWalls[index];
                var start = wall.Start;
                var end   = wall.End;

                var distance = start.DistanceTo(end);

                remainingOuterWallLength -= distance;

                // last apartment
                if (remainingOuterWallLength < currentWidthStep)
                {
                    InsertAparment(settings, floor, context, extrudedWalls, Vector2d.Empty,
                                   Vector2d.Empty, ref lastUsedOuterIndex, ref usedTransitIndex);
                    break;
                }

                var remainingCurrentWallLength = distance;
                do
                {
                    if (remainingCurrentWallLength < currentWidthStep)
                    {
                        currentWidthStep = settings.MinimalWidthStep;
                        break;
                    }
                    remainingCurrentWallLength -= currentWidthStep;

                    // get intermediate point
                    var vec = (end - start).Normalized();
                    var outerWallSplitPoint = start + vec * currentWidthStep;

                    var ortogonalRight          = new Vector2d(-vec.Y, vec.X);
                    var someFarPointOnOuterWall = outerWallSplitPoint + ortogonalRight * 1000;

                    Vector2d transitWallSplitPoint;
                    int      transitWallIndex;
                    if (HasIntersectPoint(extrudedWalls, connectedSkeletonWalls, outerWallSplitPoint,
                                          someFarPointOnOuterWall, out transitWallSplitPoint, out transitWallIndex))
                    {
                        context.OuterWallIndex   = index;
                        context.TransitWallIndex = transitWallIndex;

                        InsertAparment(settings, floor, context, extrudedWalls, outerWallSplitPoint,
                                       transitWallSplitPoint, ref lastUsedOuterIndex, ref usedTransitIndex);
                        currentWidthStep = settings.PreferedWidthStep;
                    }
                    start = outerWallSplitPoint;
                } while (true);
            }
        }
Exemple #15
0
        private static void CreateApartments(InDoorGeneratorSettings settings, Floor floor,
                                             List <IntPoint> footprint, List <List <IntPoint> > transitArea, List <Wall> connected)
        {
            var extrudedPolygons = new List <List <IntPoint> >(4);

            settings.Clipper.AddPaths(transitArea, PolyType.ptClip, true);
            settings.Clipper.AddPath(footprint, PolyType.ptSubject, true);
            settings.Clipper.Execute(ClipType.ctDifference, extrudedPolygons);
            settings.Clipper.Clear();

            //SVGBuilder.SaveToFile(extrudedPolygons, "regions_ex.svg", 0.01, 100);

            foreach (var extrudedPolygon in extrudedPolygons)
            {
                // Clipper may produce small polygons on building offsets
                if (Clipper.Area(extrudedPolygon) / DoubleScale < settings.MinimalArea)
                {
                    continue;
                }

                var    firstOuterWallIndex   = InvalidIndex;
                var    firstTransitWallIndex = InvalidIndex;
                var    outerWallCount        = 0;
                double outerWallLength       = 0;
                var    extrudedWalls         = new List <Wall>();
                var    lastItemIndex         = extrudedPolygon.Count - 1;

                var    mergePoint      = Vector2d.Empty;
                double skippedDistance = 0;
                for (var i = 0; i <= lastItemIndex; i++)
                {
                    var start = extrudedPolygon[i];
                    var end   = extrudedPolygon[i == lastItemIndex ? 0 : i + 1];

                    var isOuterWall = ClipperUtils.CalcMinDistance(start, footprint) < IntPrecisionError &&
                                      ClipperUtils.CalcMinDistance(end, footprint) < IntPrecisionError;
                    var p1 = new Vector2d(start.X / Scale, start.Y / Scale);
                    var p2 = new Vector2d(end.X / Scale, end.Y / Scale);

                    // NOTE this allows to skip artifacts of clipper offset library
                    // which I don't know to avoid by clipper API.
                    var distance = p1.DistanceTo(p2);
                    if (distance < settings.HalfTransitAreaWidth &&
                        skippedDistance < settings.TransitAreaWidth)
                    {
                        skippedDistance += distance;
                        if (mergePoint != Vector2d.Empty)
                        {
                            continue;
                        }
                        mergePoint = p1;
                        continue;
                    }
                    if (mergePoint != Vector2d.Empty)
                    {
                        p1              = mergePoint;
                        mergePoint      = Vector2d.Empty;
                        skippedDistance = 0;
                    }

                    if (isOuterWall)
                    {
                        outerWallCount++;
                        outerWallLength += ClipperUtils.Distance(start, end) / Scale;
                        if (firstOuterWallIndex == InvalidIndex)
                        {
                            firstOuterWallIndex = extrudedWalls.Count;
                        }
                    }

                    if (!isOuterWall && firstTransitWallIndex == InvalidIndex)
                    {
                        firstTransitWallIndex = extrudedWalls.Count;
                    }

                    extrudedWalls.Add(new Wall(p1, p2, isOuterWall));
                }

                firstOuterWallIndex = firstOuterWallIndex != 0
                    ? firstOuterWallIndex
                    : firstTransitWallIndex + extrudedWalls.Count - outerWallCount;

                var context = new FloorContext(outerWallCount, extrudedWalls.Count - outerWallCount,
                                               firstOuterWallIndex, firstTransitWallIndex);
                CreateAparments(settings, floor, context, extrudedWalls, connected, outerWallLength);
            }
        }