/// <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); }
/// <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); }
/// <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(); } } }
/// <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)); }
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; }
//штуки для разрабов /// <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); // } // } // } }
/// <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); }
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); }
/// <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); // синтаксическая ошибка }
/// <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); } }
/// <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); }
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); }
/// <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); }
/// <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] }); }
/// <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)); }
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); }
/// <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); }
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); }
/// <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); }
public DrawHelper(CachedDataModel _dataOfBot, FindedInformation _answer, string _title) { dataOfBot = _dataOfBot; answer = _answer; title = _title; }
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)); }