Exemple #1
0
        /// <summary>
        /// Рисует все пути на карте этажа
        /// </summary>
        /// <param name="dataOfBot"></param>
        /// <param name="FloorNumber"></param>
        /// <returns></returns>
        public BitmapSettings DrawAllWaysAndAllShops(CachedDataModel dataOfBot, int FloorNumber)
        {
            var bitmap = new BitmapSettings(new Bitmap(Image.FromFile(ConfigurationManager.AppSettings["ContentPath"] + $"Floors\\{dataOfBot.Floors.FirstOrDefault(x => x.Number == FloorNumber).FloorID}.{dataOfBot.Floors.FirstOrDefault(x => x.Number == FloorNumber).FileExtension}")));

            var mbMapHelper = new BotMapHelper();
            var graph       = mbMapHelper.GetOneLayer(dataOfBot, dataOfBot.Floors.FirstOrDefault(x => x.Number == FloorNumber));

            DrawAllShops(graph, dataOfBot);
            var layer = graph.Layers[0];

            using (var gr = Graphics.FromImage(bitmap.Bmp))
            {
                gr.SmoothingMode      = SmoothingMode.HighQuality;
                gr.CompositingQuality = CompositingQuality.HighQuality;
                gr.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode    = PixelOffsetMode.HighQuality;

                foreach (var item in layer.Segments)
                {
                    gr.DrawLine(bitmap.MyPen,
                                (float)(item.Vertex0.Point.X) / ZoomOfPicture + bitmap.I,
                                (float)(item.Vertex0.Point.Y) / ZoomOfPicture + bitmap.J,
                                (float)(item.Vertex1.Point.X) / ZoomOfPicture + bitmap.I,
                                (float)(item.Vertex1.Point.Y) / ZoomOfPicture + bitmap.J);
                }
            }
            DrawLandMarksExtra(dataOfBot, FloorNumber);

            var tmp = $"Этаж {FloorNumber.ToString()}   {dataOfBot.Customers[0].Name} {dataOfBot.Customers[0].LocaleCity}";

            DrawText(tmp, BotTextHelper.LengthOfString(tmp, bitmap), 5F, 23, Color.DarkSlateGray, true);

            return(bitmap);
        }
Exemple #2
0
        /// <summary>
        /// Отображение якорных либо имющих высокий MapSize организаций
        /// </summary>
        /// <param name="organisations"></param>
        /// <param name="FloorID"></param>
        public void DrawLandMarksOrganizations(CachedDataModel dataOfBot, int FloorID)
        {
            var vyborka = dataOfBot.Organizations.Where(x => x.IsAnchor == true && x?.OrganizationMapObject.Where(y => y?.MapObject?.Params != null && y.MapObject.Params.Contains("SignPointRadius")).Count() == 0).ToList();
            var mObjs   = dataOfBot.GetMapObjects(vyborka).Where(x => x.FloorID == FloorID && x.Params == null || (x.Params != null && !x.Params.Contains("SignPointRadius"))).ToList();

            DrawSpecialOrgs(mObjs, vyborka);
        }
Exemple #3
0
        /// <summary>
        /// Отображение служебных организаций на Bmp
        /// </summary>
        /// <param name="DataOfBot"></param>
        /// <param name="FloorID"></param>
        public void DrawLandMarksExtra(CachedDataModel DataOfBot, int FloorID)
        {
            var AllOrgsOnThisFloor     = DataOfBot.GetOrganizations(DataOfBot.MapObjects.Where(x => x.FloorID == FloorID).ToList());
            var ServiceOrgsOnThisFloor = AllOrgsOnThisFloor.Where(x => DataOfBot.IsServiceOrganizaion(x)).ToList();
            var MapObjectsOnThisFloor  = DataOfBot.GetMapObjects(ServiceOrgsOnThisFloor);

            foreach (var mapObj in MapObjectsOnThisFloor.Where(x => x.FloorID == FloorID))
            {
                var cat = ServiceOrgsOnThisFloor.FirstOrDefault(x => x.OrganizationMapObject.Select(y => y.MapObject).Contains(mapObj))?.
                          CategoryOrganization?.FirstOrDefault(x => x.Category?.ServiceCategoryType == ServiceCategoryType.Service || x.Category?.ServiceCategoryType == ServiceCategoryType.Link)?.Category;

                if (cat != null && cat?.CategoryID != null && cat?.LogoExtension != null)
                {
                    Image img = Image.FromFile(ConfigurationManager.AppSettings["ContentPath"] + $"Categories\\{cat.CategoryID}.{cat.LogoExtension}");
                    using (Bitmap newBitmap = new Bitmap(img))
                    {
                        newBitmap.SetResolution(96, 96);
                        img.Dispose();
                        img = ImagingHelper.ResizeImage(newBitmap, 90, 90);
                        DrawLocation(mapObj.LongitudeFixed, mapObj.LatitudeFixed, "default", img);
                    }
                    img.Dispose();
                }
            }
        }
Exemple #4
0
        /// <summary>
        /// Поиск пути между двумя организациями
        /// </summary>
        /// <param name="answer"></param>
        /// <param name="custumerID"></param>
        /// <returns></returns>
        public List <MapHelper.Vertex> GetWay(MapObject First, MapObject Second, CachedDataModel DataOfBot)
        {
            var graph = GetGraph(DataOfBot);

            graph.Init(new System.Windows.Point(First.LongitudeFixed, First.LatitudeFixed), DataOfBot.Floors.FirstOrDefault(x => x.FloorID == First.FloorID).Number);
            return(MapHelper.FindPathVertex(new System.Windows.Point(Second.LongitudeFixed, Second.LatitudeFixed), DataOfBot.Floors.FirstOrDefault(x => x.FloorID == Second.FloorID).Number, graph));
        }
Exemple #5
0
 public AnswerWithPhotoHelper(SocialNetworkType _type, FindedInformation _answer, ApiRouter _sender, BotUser _botUser, BotTextHelper _texter, CachedDataModel _dataOfBot)
 {
     answer    = _answer;
     sender    = _sender;
     botUser   = _botUser;
     texter    = _texter;
     type      = _type;
     dataOfBot = _dataOfBot;
 }
Exemple #6
0
        //штуки для разрабов
        /// <summary>
        /// Рисует все магазины на карте этажа
        /// </summary>
        /// <param name="graph"></param>
        /// <param name="DataOfBot"></param>
        /// <param name="bitmap"></param>
        public void DrawAllShops(MapHelper.Graph graph, CachedDataModel DataOfBot)
        {
            //TODO Что это! Почему vyborka = null
            //var vyborka = DataOfBot.Organizations.Where(x => x.Floor != null && x.Floor.Number == graph.Layers[0].LayerID).ToList();

            //Закоментил потому что Null
//            List<Organization> vyborka = null;
//            using (var gr = Graphics.FromImage(Bmp))
//            {
//                gr.SmoothingMode = SmoothingMode.HighQuality;
//                gr.CompositingQuality = CompositingQuality.HighQuality;
//                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
//                gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
//                int i = 0;
//                foreach (var org in vyborka)
//                {
//                    if (org.Longitude != null && org.Latitude != null)
//                    {
//                        var temp = new System.Windows.Point((double)org.Longitude, (double)org.Latitude);
//
//                        var vertex = graph.Layers[0].GetVertex(temp);
//                        if (vertex == null)
//                        {
//                            int numofsegments = graph.Layers[0].Segments.Count;
//                            graph.Layers[0].AddVertexWithShortestSegment(temp);
//                            if (numofsegments + 1 == graph.Layers[0].Segments.Count)
//                            {
//                                var Addedsegment = graph.Layers[0].Segments[graph.Layers[0].Segments.Count - 1];
//                                gr.DrawLine(new Pen(Color.Green, 10 / ZoomOfPicture),
//                                    (float)(Addedsegment.Vertex0.Point.X) / ZoomOfPicture + I,
//                                    (float)(Addedsegment.Vertex0.Point.Y) / ZoomOfPicture + J,
//                                    (float)(Addedsegment.Vertex1.Point.X) / ZoomOfPicture + I,
//                                    (float)(Addedsegment.Vertex1.Point.Y) / ZoomOfPicture + J);
//
//                                graph.Layers[0].Segments.RemoveAt(graph.Layers[0].Segments.Count - 1);
//                            }
//                            else
//                            {
//                                var Addedsegment = graph.Layers[0].Segments[graph.Layers[0].Segments.Count - 3];
//
//                                gr.DrawLine(new Pen(Color.Green, 10 / ZoomOfPicture),
//                                    (float)(Addedsegment.Vertex0.Point.X) / ZoomOfPicture + I,
//                                    (float)(Addedsegment.Vertex0.Point.Y) / ZoomOfPicture + J,
//                                    (float)(Addedsegment.Vertex1.Point.X) / ZoomOfPicture + I,
//                                    (float)(Addedsegment.Vertex1.Point.Y) / ZoomOfPicture + J);
//
//                                graph.Layers[0].Segments.RemoveAt(graph.Layers[0].Segments.Count - 3);
//                            }
//                            i++;
//                        }
//                        DrawLocation((float)org.Longitude, (float)org.Latitude, "", Properties.Resources.Shop);
//                    }
//                }
//            }
        }
Exemple #7
0
        /// <summary>
        /// Поиск ориентиров для текстового описания. Алгоритм:
        /// 1. просматриваем все сегменты в пути - результате.
        /// 2. каждые "const deadline" единиц ишем организацию в радусе "const vicinity".
        /// </summary>
        /// <param name="points"></param>
        /// <param name="FloorID"></param>
        /// <param name="collection"></param>
        /// <param name="bitmap"></param>
        /// <returns></returns>
        public List <MapObject> FindOrientirs(List <Point> points, int FloorID, CachedDataModel dataOfBot, BitmapSettings bitmap, MapObject First, MapObject Second)
        {
            double sum = 0;
            int    i;
            var    result = new List <MapObject>();

            for (i = 0; i < points.Count - 1; i++)
            {
                var    p1       = new System.Windows.Point(points[i].X, points[i].Y);
                var    p2       = new System.Windows.Point(points[i + 1].X, points[i + 1].Y);
                double distance = MapHelper.Distance(p1, p2);

                if (distance > (deadLine - sum))
                {
                    Point p = GetPoint(deadLine - sum, distance - (deadLine - sum), points[i], points[i + 1]);
                    points.Insert(i + 1, p);
                    result.Add(FindClosestPopularOrganization(points[i + 1], dataOfBot, FloorID, bitmap));
                    sum = 0;
                }
                else
                {
                    sum += distance;
                    if (sum >= deadLine)
                    {
                        result.Add(FindClosestPopularOrganization(points[i], dataOfBot, FloorID, bitmap));
                        sum = 0;
                    }
                }
            }
            result.RemoveAll(x => x == null);
            result = result.DistinctBy(x => x.MapObjectID).ToList();
            result = RemoveClosestPopularOrganizations(result);
            result.RemoveAll(x => x.MapObjectID == First.MapObjectID || x.MapObjectID == Second.MapObjectID);

            var last = dataOfBot.MapObjects.FirstOrDefault(x =>
                                                           Math.Abs(Math.Round(x.LongitudeFixed) - Math.Round((points.Last().X - bitmap.I) * bitmap.ZoomOfPicture)) <= 10 &&
                                                           Math.Abs(Math.Round(x.LatitudeFixed) - Math.Round((points.Last().Y - bitmap.J) * bitmap.ZoomOfPicture)) <= 10);

            var temp = new MapObject
            {
                FloorID = FloorID,
                Params  = "Перейдите на следующий этаж"
                          //Name = "Перейдите на следующий этаж",
                          //KeyWords = last.Name,
                          //Floor = new Floor { Number = layerID }
            };

            result.Add(temp);

            return(result);
        }
Exemple #8
0
        public CachedDataModel GetDataForOneCustomer(int customerID, string CustomerCompositeID)
        {
            CachedDataModel DataOfBot = null;
            char            dbID      = 'A';

            for (int i = 0; i < int.Parse(ConfigurationManager.AppSettings["dbCount"]); i++)
            {
                if (dbID == CustomerCompositeID[0])
                {
                    DataOfBot       = SelectData(datasOfBot[i], customerID);
                    DataOfBot.Texts = datasOfBot[0].Texts;
                }
                dbID++;
            }
            return(DataOfBot);
        }
Exemple #9
0
        /// <summary>
        /// Парсер команды /testfunc_route_=номер этажа=
        /// </summary>
        /// <param name="command"></param>
        /// <param name="dataOfBot"></param>
        /// <param name="floorNumber"></param>
        /// <returns></returns>
        public byte RouteAnalise(string command, CachedDataModel dataOfBot, out int floorNumber)
        {
            var parse = command.Split('_');

            if (parse[0] == "testfunc" && parse[1] == "route" && int.TryParse(parse[2], out floorNumber))
            {
                int temp = floorNumber;
                if (dataOfBot.Floors.FirstOrDefault(x => x.Number == temp) != null)
                {
                    return(1);
                }
                return(2); // этажа с таким номером нет
            }
            floorNumber = -1;
            return(3); // синтаксическая ошибка
        }
Exemple #10
0
        /// <summary>
        /// подпись названия для крупных магазинова (большие белые)
        /// </summary>
        /// <param name="collection"></param>
        /// <param name="FloorID"></param>
        public void DrawSignPoint(CachedDataModel dataOfBot, int FloorID, string CustomerName = null) // специально для любимой радуги :3
        {
            var mapObjectsWithSignPoints = dataOfBot.MapObjects.Where(x => x.FloorID == FloorID && x.Params != null && x.Params.Contains("SignPointRadius") && x.Params.Contains("SignText")).ToList();
            var f = dataOfBot.Floors.FirstOrDefault(x => x.FloorID == FloorID);

            foreach (var item in mapObjectsWithSignPoints)
            {
                var sp = JsonConvert.DeserializeObject <SignPoint>(item.Params);
                sp.FixSignPointRadius(item, f);
                GetKegelResult res = ImagingHelper.GetKegel(Bmp, sp.SignText, item.LongitudeFixed, item.LatitudeFixed, sp.SignPointRadiusFixed * 2 / ZoomOfPicture);
                if (!string.IsNullOrWhiteSpace(CustomerName) && CustomerName == "ТРК Радуга")
                {
                    DrawText(sp.SignText, (item.LongitudeFixed / ZoomOfPicture + I) + res.LongitudeDist, (item.LatitudeFixed / ZoomOfPicture + J) - res.LatitudeDist, res.Kegel, Color.Orange);
                }
                DrawText(sp.SignText, (item.LongitudeFixed / ZoomOfPicture + I) + res.LongitudeDist, (item.LatitudeFixed / ZoomOfPicture + J) - res.LatitudeDist, res.Kegel, Color.White);
            }
        }
Exemple #11
0
        /// <summary>
        /// Возвращает граф с одним уровнем
        /// </summary>
        /// <param name="DataOfBot"></param>
        /// <param name="f"></param>
        /// <returns></returns>
        public MapHelper.Graph GetOneLayer(CachedDataModel DataOfBot, Floor f)
        {
            //var graph = new MapHelper.Graph();

            //PathPoint[][] Lines = null;
            //if (f.Paths[0] == '<') // xml быть не должно, поэтому я решил сильно не запариваться по этому поводу
            //{
            //    var pathHelper = new PathParserHelper();
            //    Lines = pathHelper.Do(f.Paths);
            //}
            //else
            //{
            //    Lines = JsonConvert.DeserializeObject<PathPoint[][]>(f.Paths);
            //}

            //var layer = new MapHelper.Layer(f.Number);
            //for (int i = 0; i < Lines.Length; i++)
            //{
            //    var v1 = layer.AddVertex(new System.Windows.Point(Lines[i][0].X, Lines[i][0].Y));
            //    var v2 = layer.AddVertex(new System.Windows.Point(Lines[i][1].X, Lines[i][1].Y));
            //    layer.AddSegment(v1, v2);
            //}
            //graph.AddLayer(layer);

            //var vyborka = DataOfBot.Organizations;

            //foreach (var link in DataOfBot.OrganizationLinks)
            //{
            //    var org = vyborka.FirstOrDefault(e => e.OrganizationID == link.OrganizationToID);
            //    if (org != null && org.Longitude != null && org.Latitude != null)
            //    {
            //        var temp = new System.Windows.Point((double)org.Longitude, (double)org.Latitude);
            //        var vertexFrom = graph.Layers[0].GetVertex(temp) ?? graph.Layers[0].AddVertexWithShortestSegment(temp);
            //    }

            //    org = vyborka.FirstOrDefault(e => e.OrganizationID == link.OrganizationFromID);
            //    if (org != null && org.Longitude != null && org.Latitude != null)
            //    {
            //        var temp = new System.Windows.Point((double)org.Longitude, (double)org.Latitude);
            //        var vertexFrom = graph.Layers[0].GetVertex(temp) ?? graph.Layers[0].AddVertexWithShortestSegment(temp);
            //    }
            //}
            //return graph;
            return(null);
        }
Exemple #12
0
        private CachedDataModel SelectData(CachedDataModel MainDataOfBot, int customerID)
        {
            CachedDataModel DataOfBot = null;

            DataOfBot                        = new CachedDataModel();
            DataOfBot.Customers              = MainDataOfBot.Customers.Where(x => x.CustomerID == customerID).ToList();
            DataOfBot.Organizations          = MainDataOfBot.Organizations.Where(x => x.CustomerID == customerID).ToList();
            DataOfBot.Floors                 = MainDataOfBot.Floors.Where(x => x.CustomerID == customerID).ToList();
            DataOfBot.Categories             = MainDataOfBot.Categories.Where(x => x.CustomerID == customerID).ToList();
            DataOfBot.Synonyms               = MainDataOfBot.Synonyms;
            DataOfBot.OrganizationMapObjects = MainDataOfBot.OrganizationMapObjects;
            DataOfBot.MapObjects             = MainDataOfBot.MapObjects;
            DataOfBot.MapObjectLinks         = MainDataOfBot.MapObjectLinks;
            DataOfBot.MTerminals             = MainDataOfBot.MTerminals;
            DataOfBot.TerminalMapObjects     = MainDataOfBot.TerminalMapObjects;

            return(DataOfBot);
        }
Exemple #13
0
        /// <summary>
        /// Поиск организации с заданными параметрами
        /// </summary>
        /// <param name="p"></param>
        /// <param name="collection"></param>
        /// <param name="FloorID"></param>
        /// <param name="bitmap"></param>
        /// <returns></returns>
        public MapObject FindClosestPopularOrganization(Point p, CachedDataModel dataOfBot, int FloorID, BitmapSettings bitmap)
        {
            //var popular = collection.Where(x => (x.IsAnchor == true || x.Rating > 0.5 || x.SignText != null) && layerID == x.Floor.Number && x.Longitude != null && x.Latitude != null).ToList();
            var popularOrgs    = dataOfBot.Organizations.Where(x => x.IsAnchor == true || x.Rating > 0.5).ToList();
            var popularMapObjs = dataOfBot.GetMapObjects(popularOrgs).Where(x => x.FloorID == FloorID).ToList();

            var       localPoint = new System.Windows.Point((p.X - bitmap.I) * bitmap.ZoomOfPicture, (p.Y - bitmap.J) * bitmap.ZoomOfPicture);
            double    minDest    = double.MaxValue;
            MapObject Result     = null;

            foreach (var mobj in popularMapObjs)
            {
                var shop = new System.Windows.Point(mobj.LongitudeFixed, mobj.LatitudeFixed);

                double temp = MapHelper.Distance(localPoint, shop);
                if (temp < minDest && temp < vicinity)
                {
                    minDest = temp;
                    Result  = mobj;
                }
            }
            return(Result);
        }
Exemple #14
0
        /// <summary>
        /// Возвращает кратчайший путь
        /// </summary>
        /// <param name="First"></param>
        /// <param name="Second"></param>
        /// <param name="DataOfBot"></param>
        /// <returns></returns>
        public WayModel GetClosestWay(Organization First, List <Organization> Second, CachedDataModel DataOfBot)
        {
            List <List <MapHelper.Vertex> > ways = new List <List <MapHelper.Vertex> >();
            double mindist  = double.MaxValue;
            var    resultID = 0;
            var    first    = First.OrganizationMapObject.Select(x => x.MapObject).FirstOrDefault(x => x.Params == null); //точка - начало пути
            var    seconds  = DataOfBot.GetMapObjects(Second);                                                            // точки - возможные окончания пути

            for (int i = 0; i < seconds.Count; i++)
            {
                ways.Add(GetWay(first, seconds[i], DataOfBot));
                var tmp = LengthOfWay(ways[i]);
                if (mindist > tmp)
                {
                    mindist  = tmp;
                    resultID = i;
                }
            }
            return(new WayModel {
                From = first, To = seconds[resultID], Way = ways[resultID]
            });
        }
Exemple #15
0
        /// <summary>
        /// группирует найденные организации.
        /// </summary>
        /// <param name="result"></param>
        /// <param name="dataOfbot"></param>
        /// <returns></returns>
        public static List <GroupedOrganization> GroupFuzzySearchResult(List <FuzzySearchResult> result, CachedDataModel dataOfbot)
        {
            var orgs = GetDataHelper.GetOrganizationFromFuzzySearchResult(result, dataOfbot); // получаем список найденных организаций

            return(GroupFuzzySearchResult(orgs, dataOfbot));
        }
Exemple #16
0
        public static List <Organization> GetOrganizationFromFuzzySearchResult(List <FuzzySearchResult> result, CachedDataModel dataOfbot)
        {
            var findedOrganizations = new List <Organization>();

            foreach (var item in result)
            {
                findedOrganizations.Add(dataOfbot.Organizations.FirstOrDefault(x => item.ID == x.OrganizationID));
            }
            return(findedOrganizations);
        }
Exemple #17
0
        /// <summary>
        /// Выполение команд, предназначенных разработчикам
        /// </summary>
        /// <param name="thisQuery"></param>
        /// <param name="type"></param>
        /// <param name="Bot"></param>
        /// <param name="botUser"></param>
        /// <param name="trimmedLoweredQuery"></param>
        /// <param name="DataOfBot"></param>
        /// <param name="Requests"></param>
        /// <returns></returns>
        public async Task <int> doDevelopersCommands(/*logging*/ BotUserQuery thisQuery /*where*/, SocialNetworkType type, object Bot, /*data*/ string trimmedLoweredQuery, CachedDataModel DataOfBot, /*other*/ List <VKApiRequestModel> Requests = null)
        {
            var sendHelper = new ApiRouter(type, Bot, botUser, Requests);

            try
            {
                var  cmndHelper            = new CommandAnswerHelper();
                bool ThisCommandIsNotExist = true;

                if (trimmedLoweredQuery.Contains("route"))
                {
                    ThisCommandIsNotExist = false;
                    int floornumder = 0;
                    switch (cmndHelper.RouteAnalise(trimmedLoweredQuery, DataOfBot, out floornumder))
                    {
                    case 1:
                        var dh = new DrawHelper(new MallHelpers.Models.CachedDataModel(), null, null);
                        //var result = dh.DrawAllWaysAndAllShops(DataOfBot, floornumder);
                        //await sendHelper.BotSendPhoto(result.Bmp);
                        break;

                    case 2:
                        await sendHelper.SendText("Этажа с таким номером нет в выбранном вами торговом центре. /place");

                        break;

                    case 3:
                        await sendHelper.SendText("Синтаксическая ошибка. Используйте /testfunc_route_=номер этажа=");

                        break;
                    }
                }

                if (ThisCommandIsNotExist)
                {
                    await sendHelper.SendText("Такой команды нет. Доступные команды: \\r\\n\\r\\n/testfunc_route_1 - где 1 - любой номер этажа");
                }
            }
            catch
            {
                await sendHelper.SendText("testfunc_функция_параметр  !!!");
            }
            return(1);
        }
Exemple #18
0
        public static List <GroupedOrganization> GroupFuzzySearchResult(List <Organization> orgs, CachedDataModel dataOfbot)
        {
            var resGroups = new List <HashSet <MapObject> >();
            var mapObject = dataOfbot.GetMapObjects(orgs);

            foreach (Floor f in dataOfbot.Floors)
            {
                var groups          = new List <HashSet <MapObject> >();                                         // мини-группы. органиия + другие организации, находящиея на заданном расстоянии от нее
                var thisFloorMapObj = mapObject.Where(x => x.FloorID == f.FloorID && x.Params == null).ToList(); // типа если парамс нул, то это вход организации

                for (int i = 0; i < thisFloorMapObj.Count; i++)
                {
                    var close = new HashSet <MapObject>(); // мини-группа
                    close.Add(thisFloorMapObj[i]);
                    for (int j = 0; j < thisFloorMapObj.Count; j++)
                    {
                        if (i != j)
                        {
                            var res = Math.Sqrt(
                                (thisFloorMapObj[j].LongitudeFixed - thisFloorMapObj[i].LongitudeFixed) *
                                (thisFloorMapObj[j].LongitudeFixed - thisFloorMapObj[i].LongitudeFixed)
                                +
                                (thisFloorMapObj[j].LatitudeFixed - thisFloorMapObj[i].LatitudeFixed) *
                                (thisFloorMapObj[j].LatitudeFixed - thisFloorMapObj[i].LatitudeFixed));

                            if (res < 1100)
                            {
                                close.Add(thisFloorMapObj[j]);
                            }
                        }
                    }
                    groups.Add(close);
                }

                for (int i = 0; i < groups.Count; i++)
                {
                    var tempres = new HashSet <MapObject>();
                    tempres = groups[i];
                    for (int j = 0; j < groups.Count; j++)
                    {
                        if (i != j)
                        {
                            if (groups[i].Intersect(groups[j]).Count() != 0) // если двух мини-группах есть одинаковые элементы,
                            {
                                tempres.UnionWith(groups[j]);                //то такие мини-группы должны быть в одной большой группе,
                                groups.RemoveAt(j);                          // а объединенные мини-группы больше не нужны
                                j--;
                            }
                        }
                    }
                    resGroups.Add(tempres); // добавление группы
                }
            }

            var groupedResult = new List <GroupedOrganization>();

            foreach (var item in resGroups)
            {
                groupedResult.Add(new GroupedOrganization {
                    MapObjects = item.ToList(), Orgs = dataOfbot.GetOrganizations(item.ToList())
                });                                                                                                                          // формирование результата
            }
            return(groupedResult);
        }
Exemple #19
0
        /// <summary>
        /// Возвражает граф со всеми вершинами на карте этажа
        /// </summary>
        /// <param name="DestOfFirstSector"></param>
        /// <param name="DestOfSecondSector"></param>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <returns></returns>
        public MapHelper.Graph GetGraph(CachedDataModel DataOfBot)
        {
            var graph = new MapHelper.Graph();

            #region Строит Layers
            foreach (Floor f in DataOfBot.Floors.OrderBy(x => x.Number))
            {
                PathPoint[][] Lines = null;
                if (f.Paths[0] == '<') // xml быть не должно, поэтому я решил сильно не запариваться по этому поводу
                {
                    if (f.Number != 2)
                    {
                        var pathHelper = new PathParserHelper();
                        Lines = pathHelper.Do(f.Paths);
                    }
                    else
                    {
                        break;
                        // супер костыль. Дело в том, что в базе Mall_new у Уфы 2 этажа с разными xml-ками. (причем 2ой этаж пуст)
                        //Я понимаю, что мне не надо писать лишний парсер, тем более, что 1 лишний я уже написал)) А удалить этаж из базы я не рискнул, мало ли он кому нужен
                        //поэтому этот код работает только для Уфы. Надо будет обсудить этот момент и возможно убрать 2ой этаж из базы. А пока ((((временно)))) так
                    }
                }
                else
                {
                    Lines = f.PathsFixed;
                }

                var layer = new MapHelper.Layer(f.Number);
                for (int i = 0; i < Lines.Length; i++)
                {
                    var v1 = layer.AddVertex(new System.Windows.Point(Lines[i][0].X, Lines[i][0].Y));
                    var v2 = layer.AddVertex(new System.Windows.Point(Lines[i][1].X, Lines[i][1].Y));
                    layer.AddSegment(v1, v2);
                }
                graph.AddLayer(layer);
            }
            #endregion
            // Поиск переходов между этажами и добавление их в граф
            var FloorIDs = DataOfBot.Floors.Select(x => x.FloorID).ToList();
            foreach (var link in DataOfBot.MapObjectLinks)
            {
                if (link.MapObjectFrom != null &&
                    link.MapObjectTo != null &&
                    link.MapObjectFrom.FloorID != null &&
                    link.MapObjectTo.FloorID != null &&
                    FloorIDs.Contains(link.MapObjectFrom.FloorID) &&
                    FloorIDs.Contains(link.MapObjectTo.FloorID))
                {
                    var layerTo   = graph.Layers.FirstOrDefault(e => e.LayerID == DataOfBot.Floors.FirstOrDefault(y => y.FloorID == link.MapObjectTo.FloorID).Number);
                    var layerFrom = graph.Layers.FirstOrDefault(e => e.LayerID == DataOfBot.Floors.FirstOrDefault(y => y.FloorID == link.MapObjectFrom.FloorID).Number);

                    var temp       = new System.Windows.Point(link.MapObjectFrom.LongitudeFixed, link.MapObjectFrom.LatitudeFixed);
                    var vertexFrom = layerFrom.GetVertex(temp) ?? layerFrom.AddVertexWithShortestSegment(temp);

                    temp = new System.Windows.Point(link.MapObjectTo.LongitudeFixed, link.MapObjectTo.LatitudeFixed);
                    var vertexTo = layerTo.GetVertex(temp) ?? layerTo.AddVertexWithShortestSegment(temp);

                    if (vertexFrom == null || vertexTo == null)
                    {
                        Logging.Logger.Warn("Change Floor Vertex has no beed added!");
                    }
                    else
                    {
                        if (DataOfBot.GetOrganization(link.MapObjectFrom)?.Name == "Лифт" && DataOfBot.GetOrganization(link.MapObjectTo)?.Name == "Лифт")
                        {
                            vertexTo.IsLift   = true;
                            vertexFrom.IsLift = true;
                        }
                        layerFrom.AddSegment(vertexFrom, vertexTo);
                    }
                }
            }
            return(graph);
        }
Exemple #20
0
 public DrawHelper(CachedDataModel _dataOfBot, FindedInformation _answer, string _title)
 {
     dataOfBot = _dataOfBot;
     answer    = _answer;
     title     = _title;
 }
Exemple #21
0
        public WayModel GetClosestWay(FuzzySearchResult First, List <FuzzySearchResult> Second, CachedDataModel DataOfBot)
        {
            Organization        _First  = DataOfBot.Organizations.FirstOrDefault(x => x.OrganizationID == First.ID);
            List <Organization> _Second = new List <Organization>();

            foreach (var item in Second)
            {
                _Second.Add(DataOfBot.Organizations.FirstOrDefault(x => x.OrganizationID == item.ID));
            }
            return(GetClosestWay(_First, _Second, DataOfBot));
        }