970 lines
44 KiB
C#
970 lines
44 KiB
C#
|
using FLCompanionByDvurechensky.Data;
|
|||
|
using FLCompanionByDvurechensky.Services;
|
|||
|
using GraphX.Common.Enums;
|
|||
|
using GraphX.Controls.Models;
|
|||
|
using GraphX.Controls;
|
|||
|
using GraphX.Logic.Algorithms.OverlapRemoval;
|
|||
|
using GraphX.Logic.Models;
|
|||
|
using QuickGraph;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Drawing;
|
|||
|
using System.Linq;
|
|||
|
using System.Windows.Forms;
|
|||
|
using WindowsFormsProject;
|
|||
|
using System.Reflection;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace FLCompanionByDvurechensky
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Главный класс
|
|||
|
/// </summary>
|
|||
|
public partial class FreelancerCompanionDvurechensky : Form
|
|||
|
{
|
|||
|
public LogService LogService { get; set; }
|
|||
|
private DrawService DrawService { get; set; }
|
|||
|
private SystemService SystemService { get; set; }
|
|||
|
private List<ObjectSystem> ObjectPoints { get; set; }
|
|||
|
private Bitmap ImageMap { get; set; }
|
|||
|
private double KeyResize { get; set; }
|
|||
|
private double KeyOverSize { get; set; }
|
|||
|
private string CurrentSystem { get; set; }
|
|||
|
private ZoomControl Zoomctrl { get; set; }
|
|||
|
private GraphAreaExample GArea { get; set; }
|
|||
|
private GXLogicCore<DataVertex, DataEdge, BidirectionalGraph<DataVertex, DataEdge>> gXLogic { get; set; }
|
|||
|
private string[] VerticleRoad { get; set; }
|
|||
|
private string[] GererateRoads { get; set; }
|
|||
|
|
|||
|
public FreelancerCompanionDvurechensky()
|
|||
|
{
|
|||
|
//строительство формы
|
|||
|
InitializeComponent();
|
|||
|
|
|||
|
//старт сервиса логирования системы
|
|||
|
LogService = new LogService(LoggerRichTextBox);
|
|||
|
|
|||
|
//инициализация приближения и отдаления карты колесом мыши
|
|||
|
Map.MouseWheel += Map_MouseWheel;
|
|||
|
|
|||
|
//ожидание открытия
|
|||
|
this.Shown += FreelancerCompanionDvurechensky_Show;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Событие после первого отображения формы
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void FreelancerCompanionDvurechensky_Show(object sender, EventArgs e)
|
|||
|
{
|
|||
|
//загрузка данных
|
|||
|
InitializeSystems();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Доп. операции над картой колёсиком мыши (приближение/отдаление)
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender">#</param>
|
|||
|
/// <param name="e">Мышь</param>
|
|||
|
private void Map_MouseWheel(object sender, MouseEventArgs e)
|
|||
|
{
|
|||
|
if(e.Delta > 0)
|
|||
|
{
|
|||
|
Map.Location = new Point(Map.Location.X - 10, Map.Location.Y - 10);
|
|||
|
Map.Width += 10;
|
|||
|
Map.Height += 10;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Map.Location = new Point(Map.Location.X + 10, Map.Location.Y + 10);
|
|||
|
Map.Width -= 10;
|
|||
|
Map.Height -= 10;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Загрузка данных систем
|
|||
|
/// </summary>
|
|||
|
private void InitializeSystems()
|
|||
|
{
|
|||
|
checkBoxRusNames.Checked = true;
|
|||
|
SystemService = new SystemService(isRussian: checkBoxRusNames.Checked, logService: LogService);
|
|||
|
DrawService = new DrawService(5, 3);
|
|||
|
SystemService.GetInfo(comboBoxSystems, comboBoxRoadFirst, comboBoxRoadLast, comboBoxSearch, LogService);
|
|||
|
labelSystemss.Text = comboBoxSystems.Items.Count.ToString();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Отрисовка первоначального вида карты
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
private void Map_Paint(object sender, PaintEventArgs e)
|
|||
|
{
|
|||
|
int w = Map.ClientSize.Width / 2;
|
|||
|
int h = Map.ClientSize.Height / 2;
|
|||
|
//Смещение начала координат в центр PictureBox
|
|||
|
e.Graphics.TranslateTransform(w, h);
|
|||
|
}
|
|||
|
|
|||
|
//первая координата это X отрицательно влево - положительно вправо
|
|||
|
//вторая коордианат это Y отрицательно вверх - положительно вниз
|
|||
|
//третья координата это Z отрицательно вниз - положительно вверх
|
|||
|
private void comboBoxSystems_SelectedIndexChanged(object sender, System.EventArgs e)
|
|||
|
{
|
|||
|
var comboBox = (ComboBox)sender;
|
|||
|
Map.Location = new Point(0, 0);
|
|||
|
Map.Width = 800;
|
|||
|
Map.Height = 800;
|
|||
|
flowLayoutPanelNames.Controls.Clear();
|
|||
|
ObjectPoints = new List<ObjectSystem>();
|
|||
|
CurrentSystem = SystemService.SystemsID[comboBox.SelectedIndex];
|
|||
|
KeyResize = (double)400 / SystemService.UniverseSystemsData[CurrentSystem].Radius;
|
|||
|
ImageMap = new Bitmap(Map.Width, Map.Height);
|
|||
|
Map.Image = ImageMap;
|
|||
|
checkBoxContainers.Checked = false;
|
|||
|
checkBoxBases.Checked = false;
|
|||
|
|
|||
|
var listMaxTmp = new List<int>();
|
|||
|
var radius = SystemService.UniverseSystemsData[CurrentSystem].Radius;
|
|||
|
|
|||
|
foreach (var bases in SystemService.UniverseSystemsData[CurrentSystem].Objects.FindAll((objectEl) => !objectEl.ID.ToLower().Contains("zone_") && !objectEl.ID.ToLower().Contains("_sun")))
|
|||
|
{
|
|||
|
listMaxTmp.Add(Math.Abs(bases.Pos[0]));
|
|||
|
listMaxTmp.Add(Math.Abs(bases.Pos[1]));
|
|||
|
listMaxTmp.Add(Math.Abs(bases.Pos[2]));
|
|||
|
}
|
|||
|
|
|||
|
var maxCoordSystem = listMaxTmp.Max();
|
|||
|
if (maxCoordSystem > radius)
|
|||
|
{
|
|||
|
KeyOverSize = Math.Round((double)maxCoordSystem / radius, 5);
|
|||
|
KeyResize /= KeyOverSize;
|
|||
|
KeyResize = Math.Round(KeyResize, 5);
|
|||
|
}
|
|||
|
else KeyOverSize = 0;
|
|||
|
|
|||
|
RepaintAxis();
|
|||
|
LogService.LogEvent($"Open [{comboBox.SelectedIndex + 1}] {comboBox.Text}");
|
|||
|
}
|
|||
|
|
|||
|
private void RepaintAxis()
|
|||
|
{
|
|||
|
var gr = Graphics.FromImage(Map.Image);
|
|||
|
ClearMap(gr);
|
|||
|
//отрисовка осей
|
|||
|
int w = Map.ClientSize.Width / 2;
|
|||
|
int h = Map.ClientSize.Height / 2;
|
|||
|
//Смещение начала координат в центр PictureBox
|
|||
|
gr.TranslateTransform(w, h);
|
|||
|
int newSizeW = 0;
|
|||
|
int newSizeH = 0;
|
|||
|
if (KeyOverSize > 0) newSizeW = (int)Math.Round((double)(w / KeyOverSize), MidpointRounding.AwayFromZero);
|
|||
|
else newSizeW = w;
|
|||
|
if (KeyOverSize > 0) newSizeH = (int)Math.Round((double)(double)(h / KeyOverSize), MidpointRounding.AwayFromZero);
|
|||
|
else newSizeH = h;
|
|||
|
//X
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, newSizeW), new Point(newSizeW, newSizeW), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, 0), new Point(newSizeW, 0), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, newSizeW - newSizeW / 2), new Point(newSizeW, newSizeW - newSizeW / 2), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, newSizeW - (newSizeW / 2 + newSizeW / 4)), new Point(newSizeW, newSizeW - (newSizeW / 2 + newSizeW / 4)), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, newSizeW - newSizeW / 4), new Point(newSizeW, newSizeW - newSizeW / 4), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, -newSizeW), new Point(newSizeW, -newSizeW), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, -(newSizeW - newSizeW / 2)), new Point(newSizeW, -(newSizeW - newSizeW / 2)), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, -(newSizeW - (newSizeW / 2 + newSizeW / 4))), new Point(newSizeW, -(newSizeW - (newSizeW / 2 + newSizeW / 4))), gr, false);
|
|||
|
DrawService.DrawXAxis(new Point(-newSizeW, -(newSizeW - newSizeW / 4)), new Point(newSizeW, -(newSizeW - newSizeW / 4)), gr, false);
|
|||
|
//Y
|
|||
|
DrawService.DrawYAxis(new Point(-newSizeH, newSizeH), new Point(-newSizeH, -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(0, newSizeH), new Point(0, -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(newSizeW - newSizeW / 2, newSizeH), new Point(newSizeW - newSizeW / 2, -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(newSizeW - (newSizeW / 2 + newSizeW / 4), newSizeH), new Point(newSizeW - (newSizeW / 2 + newSizeW / 4), -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(newSizeW - newSizeW / 4, newSizeH), new Point(newSizeW - newSizeW / 4, -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(newSizeH, newSizeH), new Point(newSizeH, -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(-(newSizeW - newSizeW / 2), newSizeH), new Point(-(newSizeW - newSizeW / 2), -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(-(newSizeW - (newSizeW / 2 + newSizeW / 4)), newSizeH), new Point(-(newSizeW - (newSizeW / 2 + newSizeW / 4)), -newSizeH), gr, false);
|
|||
|
DrawService.DrawYAxis(new Point(-(newSizeW - newSizeW / 4), newSizeH), new Point(-(newSizeW - newSizeW / 4), -newSizeH), gr, false);
|
|||
|
|
|||
|
checkBoxAll.Checked = false;
|
|||
|
checkBoxBases.Checked = false;
|
|||
|
checkBoxContainers.Checked = false;
|
|||
|
checkBoxHoll.Checked = false;
|
|||
|
}
|
|||
|
|
|||
|
private void ClearMap(Graphics graphics)
|
|||
|
{
|
|||
|
DrawService.DrawPoint(-Map.Width, -Map.Height, Map.Width, Map.Height, graphics, Color.White, Map.Width * 2, Map.Height * 2);
|
|||
|
}
|
|||
|
|
|||
|
private void checkBoxBases_CheckedChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var checkBoxBases = (CheckBox)sender;
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
var counter = 0;
|
|||
|
foreach (var baseID in SystemService.UniverseSystemsData[CurrentSystem].Objects.FindAll((baseId) => baseId.BaseID != null).ToArray())
|
|||
|
{
|
|||
|
int x = (int)Math.Round(KeyResize * baseID.Pos[0], MidpointRounding.AwayFromZero);
|
|||
|
int y = (int)Math.Round(KeyResize * baseID.Pos[2], MidpointRounding.AwayFromZero);
|
|||
|
int[] mapPos = new int[3];
|
|||
|
mapPos[0] = x;
|
|||
|
mapPos[1] = y;
|
|||
|
mapPos[2] = baseID.Pos[1];
|
|||
|
baseID.MapPos = mapPos;
|
|||
|
if (!ObjectPoints.Contains(baseID))
|
|||
|
ObjectPoints.Add(baseID);
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxBases.Checked == true)
|
|||
|
{
|
|||
|
counter++;
|
|||
|
//Формирую вывод UI
|
|||
|
var button = new Button();
|
|||
|
button.Width = 231;
|
|||
|
button.Height = 30;
|
|||
|
var tooltip = new ToolTip();
|
|||
|
tooltip.SetToolTip(button, $"Z: [{baseID.Pos[1]}] X: [{baseID.Pos[0]}] Y: [{baseID.Pos[2]}]\n" + ((baseID.Archetype != null) ? baseID.Archetype : string.Empty));
|
|||
|
button.MouseEnter += Base_MouseEnter;
|
|||
|
button.MouseLeave += Base_MouseLeave;
|
|||
|
button.Click += OpenPos_Click;
|
|||
|
button.Name = baseID.BaseID;
|
|||
|
var nameTmp = baseID.BaseID.ToLower();
|
|||
|
button.Text = (!string.IsNullOrEmpty(SystemService.UniverseBasesData[nameTmp].Name)) ? "[" + counter + "]" + SystemService.UniverseBasesData[nameTmp].Name : "[" + counter + "]" + baseID.ID;
|
|||
|
flowLayoutPanelNames.Controls.Add(button);
|
|||
|
}
|
|||
|
else flowLayoutPanelNames.Controls.Clear();
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxBases.Checked == true) DrawService.DrawPoint(x, y, Map.Width, Map.Height, gr, Color.Blue, 6, 6);
|
|||
|
else RepaintAxis();
|
|||
|
}
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void OpenPos_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var btn = (Button)sender;
|
|||
|
textBoxX.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[0].ToString();
|
|||
|
textBoxY.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[1].ToString();
|
|||
|
textBoxZ.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[2].ToString();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void Holl_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var btn = (Button)sender;
|
|||
|
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
|
|||
|
{
|
|||
|
var obj = ObjectPoints.Find((t) => t.ID.Contains(btn.Name));
|
|||
|
var index = Array.IndexOf(SystemService.ArraySystemsCombobox, obj.GotoID);
|
|||
|
comboBoxSystems.SelectedIndex = index;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
textBoxX.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[0].ToString();
|
|||
|
textBoxY.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[1].ToString();
|
|||
|
textBoxZ.Text = ObjectPoints.Find((obj) => obj.ID.Contains(btn.Name) || (obj.BaseID != null && obj.BaseID.Contains(btn.Name))).Pos[2].ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void checkBoxContainers_CheckedChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var checkBoxContainers = (CheckBox)sender;
|
|||
|
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
var counter = 0;
|
|||
|
foreach (var objectElement in SystemService.UniverseSystemsData[CurrentSystem].Objects)
|
|||
|
{
|
|||
|
var id = objectElement.ID.ToLower();
|
|||
|
bool ok = false;
|
|||
|
if (objectElement.Loadout != null && SystemService.Loadouts.Find((l) => l.Name.Contains(objectElement.Loadout.ToLower())) != null) ok = true;
|
|||
|
|
|||
|
if (!ok) continue;
|
|||
|
|
|||
|
int x = (int)Math.Round(KeyResize * objectElement.Pos[0], MidpointRounding.AwayFromZero);
|
|||
|
int y = (int)Math.Round(KeyResize * objectElement.Pos[2], MidpointRounding.AwayFromZero);
|
|||
|
int[] mapPos = new int[3];
|
|||
|
mapPos[0] = x;
|
|||
|
mapPos[1] = y;
|
|||
|
mapPos[2] = objectElement.Pos[1];
|
|||
|
objectElement.MapPos = mapPos;
|
|||
|
if (!ObjectPoints.Contains(objectElement))
|
|||
|
ObjectPoints.Add(objectElement);
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxContainers.Checked == true)
|
|||
|
{
|
|||
|
counter++;
|
|||
|
//Формирую вывод UI
|
|||
|
var button = new Button();
|
|||
|
button.Width = 231;
|
|||
|
button.Height = 30;
|
|||
|
var tooltip = new ToolTip();
|
|||
|
tooltip.SetToolTip(button, $"Z: [{objectElement.Pos[1]}] X: [{objectElement.Pos[0]}] Y: [{objectElement.Pos[2]}]\n" + ((objectElement.Archetype != null) ? objectElement.Archetype : string.Empty));
|
|||
|
button.MouseEnter += Container_MouseEnter;
|
|||
|
button.MouseLeave += Container_MouseLeave;
|
|||
|
button.Click += OpenPos_Click;
|
|||
|
button.Name = objectElement.ID;
|
|||
|
var nameTmp = objectElement.ID.ToLower();
|
|||
|
button.Text = "[" + counter + "]" + objectElement.ID;
|
|||
|
flowLayoutPanelNames.Controls.Add(button);
|
|||
|
}
|
|||
|
else flowLayoutPanelNames.Controls.Clear();
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxContainers.Checked == true) DrawService.DrawPoint(x, y, Map.Width, Map.Height, gr, Color.DarkCyan);
|
|||
|
else RepaintAxis();
|
|||
|
}
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void checkBoxHoll_CheckedChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var checkBoxHoll = (CheckBox)sender;
|
|||
|
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
var counter = 0;
|
|||
|
foreach (var objectElement in SystemService.UniverseSystemsData[CurrentSystem].Objects.FindAll((objectEl) => (objectEl.GotoID != null)))//objectEl.ID.Contains("_hole") || objectEl.ID.ToLower().Contains(CurrentSystem.ToLower()+"_to")) && !objectEl.ID.Contains("Zone_"))
|
|||
|
{
|
|||
|
int x = (int)Math.Round(KeyResize * objectElement.Pos[0], MidpointRounding.AwayFromZero);
|
|||
|
int y = (int)Math.Round(KeyResize * objectElement.Pos[2], MidpointRounding.AwayFromZero);
|
|||
|
int[] mapPos = new int[3];
|
|||
|
mapPos[0] = x;
|
|||
|
mapPos[1] = y;
|
|||
|
mapPos[2] = objectElement.Pos[1];
|
|||
|
objectElement.MapPos = mapPos;
|
|||
|
if (!ObjectPoints.Contains(objectElement))
|
|||
|
ObjectPoints.Add(objectElement);
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxHoll.Checked == true)
|
|||
|
{
|
|||
|
counter++;
|
|||
|
//Формирую вывод UI
|
|||
|
var button = new Button();
|
|||
|
button.Width = 231;
|
|||
|
button.Height = 30;
|
|||
|
var tooltip = new ToolTip();
|
|||
|
tooltip.SetToolTip(button, $"Z: [{objectElement.Pos[1]}] X: [{objectElement.Pos[0]}] Y: [{objectElement.Pos[2]}]\n" + ((objectElement.Archetype != null) ? objectElement.Archetype : string.Empty));
|
|||
|
button.MouseEnter += All_MouseEnter;
|
|||
|
button.MouseLeave += All_MouseLeave;
|
|||
|
button.Click += Holl_Click;
|
|||
|
button.Name = objectElement.ID;
|
|||
|
var nameTmp = objectElement.ID.ToLower();
|
|||
|
button.Text = "[" + counter + "]" + (!string.IsNullOrEmpty(objectElement.Goto) ? objectElement.Goto : objectElement.ID);
|
|||
|
flowLayoutPanelNames.Controls.Add(button);
|
|||
|
}
|
|||
|
else flowLayoutPanelNames.Controls.Clear();
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxHoll.Checked == true) DrawService.DrawPoint(x, y, Map.Width, Map.Height, gr, Color.DarkOrchid);
|
|||
|
else RepaintAxis();
|
|||
|
}
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var checkBoxAll = (CheckBox)sender;
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
var counter = 0;
|
|||
|
foreach (var objectEl in SystemService.UniverseSystemsData[CurrentSystem].Objects)
|
|||
|
{
|
|||
|
int x = (int)Math.Round(KeyResize * objectEl.Pos[0], MidpointRounding.AwayFromZero);
|
|||
|
int y = (int)Math.Round(KeyResize * objectEl.Pos[2], MidpointRounding.AwayFromZero);
|
|||
|
int[] mapPos = new int[3];
|
|||
|
mapPos[0] = x;
|
|||
|
mapPos[1] = y;
|
|||
|
mapPos[2] = objectEl.Pos[1];
|
|||
|
objectEl.MapPos = mapPos;
|
|||
|
if (!ObjectPoints.Contains(objectEl))
|
|||
|
ObjectPoints.Add(objectEl);
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxAll.Checked == true)
|
|||
|
{
|
|||
|
//Формирую вывод UI
|
|||
|
var button = new Button();
|
|||
|
button.Width = 231;
|
|||
|
button.Height = 30;
|
|||
|
var tooltip = new ToolTip();
|
|||
|
tooltip.SetToolTip(button, $"Z: [{objectEl.Pos[1]}] X: [{objectEl.Pos[0]}] Y: [{objectEl.Pos[2]}]\n" + ((objectEl.Archetype != null) ? objectEl.Archetype : string.Empty));
|
|||
|
button.MouseEnter += All_MouseEnter;
|
|||
|
button.MouseLeave += All_MouseLeave;
|
|||
|
button.Click += OpenPos_Click;
|
|||
|
button.Name = objectEl.ID;
|
|||
|
var nameTmp = objectEl.ID.ToLower();
|
|||
|
button.Text = "[" + counter + "]" + objectEl.ID;
|
|||
|
flowLayoutPanelNames.Controls.Add(button);
|
|||
|
}
|
|||
|
else flowLayoutPanelNames.Controls.Clear();
|
|||
|
|
|||
|
//рисую или стираю точки на карте
|
|||
|
if (checkBoxAll.Checked == true) DrawService.DrawPoint(x, y, Map.Width, Map.Height, gr, Color.DarkOrange);
|
|||
|
else RepaintAxis();
|
|||
|
}
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void ComboBoxSystems_KeyPress(object sender, KeyPressEventArgs e)
|
|||
|
{
|
|||
|
if (e.KeyChar == (char)Keys.Enter)
|
|||
|
{
|
|||
|
int index = comboBoxSystems.FindStringExact(comboBoxSystems.Text);
|
|||
|
comboBoxSystems.SelectedIndex = index;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private async void ComboBoxSearch_KeyPress(object sender, KeyPressEventArgs e)
|
|||
|
{
|
|||
|
if (e.KeyChar == (char)13)
|
|||
|
{
|
|||
|
await SearchEquipments();
|
|||
|
}
|
|||
|
}
|
|||
|
private async void ButtonSearchEquipment_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
await SearchEquipments();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Поиск совпадений в списке оборудования
|
|||
|
/// </summary>
|
|||
|
private async Task SearchEquipments()
|
|||
|
{
|
|||
|
comboBoxSearch.Items.Clear();
|
|||
|
var searchListEq = new List<Equipment>();
|
|||
|
searchListEq.AddRange(SystemService.Equipments.FindAll((eq) => (string.IsNullOrEmpty(eq.Name) ? eq.Id.Contains(comboBoxSearch.Text): eq.Name.Contains(comboBoxSearch.Text))));
|
|||
|
if (searchListEq.Count <= 0) return;
|
|||
|
var count = (searchListEq.Count <= 1000) ? searchListEq.Count : 1000;
|
|||
|
for (int i = 0; i < count; i++)
|
|||
|
{
|
|||
|
var eq = searchListEq[i];
|
|||
|
var equipmentsData = new ComboBoxItem
|
|||
|
{
|
|||
|
Text = (string.IsNullOrEmpty(eq.Name) ? eq.Id : eq.Name),
|
|||
|
ID = eq.Id
|
|||
|
};
|
|||
|
comboBoxSearch.Items.Add(equipmentsData);
|
|||
|
}
|
|||
|
comboBoxSearch.DroppedDown = true;
|
|||
|
}
|
|||
|
|
|||
|
private void Base_MouseLeave(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((baseEl) => baseEl.BaseID == button.Name);
|
|||
|
var name = (string.IsNullOrEmpty(obj.NameBase)) ? button.Name : obj.NameBase;
|
|||
|
//сделать точку обычной
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.White, 15);
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.Black, 10, 10);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void Base_MouseEnter(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((baseEl) => baseEl.BaseID == button.Name);
|
|||
|
var name = (string.IsNullOrEmpty(obj.NameBase)) ? button.Name : obj.NameBase;
|
|||
|
//сделать точку крупнее
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.Red, 10, 10);
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.Black, 15);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void Container_MouseLeave(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((baseEl) => baseEl.ID == button.Name);
|
|||
|
var name = button.Name;
|
|||
|
//сделать точку обычной
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.White, 15);
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.Red);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void Container_MouseEnter(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((objectEl) => objectEl.ID == button.Name);
|
|||
|
var name = button.Name;
|
|||
|
//сделать точку крупнее
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.LightGreen);
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.Black, 15);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void All_MouseLeave(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((baseEl) => baseEl.ID == button.Name);
|
|||
|
var name = button.Name;
|
|||
|
if (obj == null) return;
|
|||
|
//сделать точку обычной
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.White, 15);
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.Brown);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void All_MouseEnter(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var button = (Button)sender;
|
|||
|
var obj = ObjectPoints.Find((objectEl) => objectEl.ID == button.Name);
|
|||
|
var name = button.Name;
|
|||
|
//сделать точку крупнее
|
|||
|
using (Graphics gr = Graphics.FromImage(ImageMap))
|
|||
|
{
|
|||
|
DrawService.DrawPoint(obj.MapPos[0], obj.MapPos[1], Map.Width, Map.Height, gr, Color.LightGreen);
|
|||
|
DrawService.DrawText(new Point(obj.MapPos[0] + 15, obj.MapPos[1] + 15), Map.Width, Map.Height, name, gr, Brushes.Black, 15);
|
|||
|
Map.Image = ImageMap;
|
|||
|
}
|
|||
|
}
|
|||
|
private void comboBoxSearch_SelectedIndexChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var combo = (ComboBox)sender;
|
|||
|
|
|||
|
LogService.LogEvent("Ищем элемент " + comboBoxSearch.Text + "(" + (combo.SelectedItem as ComboBoxItem).ID + ")" + "...");
|
|||
|
LogService.LogEvent("------------------");
|
|||
|
LogService.LogEvent("----Астероиды----");
|
|||
|
|
|||
|
//Ищу совпадения в астероидах
|
|||
|
foreach (var ast in SystemService.SysAsteroids)
|
|||
|
{
|
|||
|
var val = ast.Value.FindAll((zone) => zone.LootId.Contains((combo.SelectedItem as ComboBoxItem).ID));
|
|||
|
bool ok = false;
|
|||
|
string zoneName = string.Empty;
|
|||
|
foreach (var v in val)
|
|||
|
{
|
|||
|
if (v.ZoneName != null && v.ZoneName.Length > 0)
|
|||
|
{
|
|||
|
zoneName = zoneName.ToLower();
|
|||
|
ok = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (val != null && val.Count > 0 && ok)
|
|||
|
{
|
|||
|
foreach (var sys in SystemService.UniverseSystemsData)
|
|||
|
{
|
|||
|
var obj = sys.Value.Zones?.FindAll((el) => el.ID.ToLower().Contains(zoneName));
|
|||
|
if (obj != null && obj.Count > 0)
|
|||
|
{
|
|||
|
LogService.LogEvent(SystemService.SystemNamesID[ast.Key.ToLower()] + " - " +
|
|||
|
" POS: X: " + obj[0].Pos[0] + " Y: " + obj[0].Pos[1] + " Z: " + obj[0].Pos[2]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (val != null && val.Count > 0 && !ok) //EXCLUSION ZONE в ASTEROIDS
|
|||
|
{
|
|||
|
LogService.LogEvent(SystemService.SystemNamesID[ast.Key.ToLower()] + " - " + val[0].LootId);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent("------------------");
|
|||
|
LogService.LogEvent("----контейнеры----");
|
|||
|
|
|||
|
//Ищу совпадения в контейнерах
|
|||
|
foreach (var ast in SystemService.Loadouts)
|
|||
|
{
|
|||
|
var val = ast.Cargo.Find((zone) => zone.Name.Contains((combo.SelectedItem as ComboBoxItem).ID.ToLower()));
|
|||
|
if (val != null)
|
|||
|
{
|
|||
|
foreach (var sys in SystemService.UniverseSystemsData)
|
|||
|
{
|
|||
|
var obj = sys.Value.Objects?.FindAll((el) => el.Loadout != null && el.Loadout.ToLower().Contains(ast.Name));
|
|||
|
if (obj != null && obj.Count > 0)
|
|||
|
{
|
|||
|
LogService.LogEvent("SYSTEM: " + SystemService.SystemNamesID[sys.Key.ToLower()] + " L: " + ast.Name + " - " + val.Name + " / " + val.Count);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent("------------------");
|
|||
|
}
|
|||
|
|
|||
|
#region GraphMap
|
|||
|
private System.Windows.UIElement GenerateWpfVisuals(bool Custom = false)
|
|||
|
{
|
|||
|
Zoomctrl = new ZoomControl();
|
|||
|
ZoomControl.SetViewFinderVisibility(Zoomctrl, System.Windows.Visibility.Visible);
|
|||
|
gXLogic = new GXLogicCore<DataVertex, DataEdge, BidirectionalGraph<DataVertex, DataEdge>>();
|
|||
|
GArea = new GraphAreaExample
|
|||
|
{
|
|||
|
LogicCore = gXLogic,
|
|||
|
EdgeLabelFactory = new DefaultEdgelabelFactory()
|
|||
|
};
|
|||
|
GArea.ShowAllEdgesLabels(true);
|
|||
|
gXLogic.Graph = (!Custom) ? GenerateGraph() : GenerateRoad();
|
|||
|
gXLogic.DefaultLayoutAlgorithm = LayoutAlgorithmTypeEnum.LinLog;//KK - неплохо
|
|||
|
gXLogic.DefaultLayoutAlgorithmParams = gXLogic.AlgorithmFactory.CreateLayoutParameters(LayoutAlgorithmTypeEnum.LinLog);
|
|||
|
gXLogic.DefaultOverlapRemovalAlgorithm = OverlapRemovalAlgorithmTypeEnum.FSA;
|
|||
|
gXLogic.DefaultOverlapRemovalAlgorithmParams = gXLogic.AlgorithmFactory.CreateOverlapRemovalParameters(OverlapRemovalAlgorithmTypeEnum.OneWayFSA);
|
|||
|
((OverlapRemovalParameters)gXLogic.DefaultOverlapRemovalAlgorithmParams).HorizontalGap = 100;
|
|||
|
((OverlapRemovalParameters)gXLogic.DefaultOverlapRemovalAlgorithmParams).VerticalGap = 100;
|
|||
|
gXLogic.DefaultEdgeRoutingAlgorithm = EdgeRoutingAlgorithmTypeEnum.None;
|
|||
|
gXLogic.AsyncAlgorithmCompute = false;
|
|||
|
Zoomctrl.Content = GArea;
|
|||
|
GArea.RelayoutFinished += gArea_RelayoutFinished;
|
|||
|
var myResourceDictionary = new System.Windows.ResourceDictionary { Source = new Uri("Templates\\template.xaml", UriKind.Relative) };
|
|||
|
Zoomctrl.Resources.MergedDictionaries.Add(myResourceDictionary);
|
|||
|
return Zoomctrl;
|
|||
|
}
|
|||
|
|
|||
|
private void gArea_RelayoutFinished(object sender, EventArgs e)
|
|||
|
{
|
|||
|
Zoomctrl.ZoomToFill();
|
|||
|
}
|
|||
|
|
|||
|
private GraphExample GenerateGraph()
|
|||
|
{
|
|||
|
//загрузка систем
|
|||
|
var dataGraph = new GraphExample();
|
|||
|
for(int i = 0; i < SystemService.ArraySystemsCombobox.Length; i++)
|
|||
|
{
|
|||
|
var dataVertex = new DataVertex();
|
|||
|
if (checkBoxRusNames.Checked == true)
|
|||
|
{
|
|||
|
var rusName = SystemService.UniverseSystemsData[SystemService.ArraySystemsCombobox[i]].Name;
|
|||
|
//dataVertex = new DataVertex("[" + i + "] " + rusName);
|
|||
|
dataVertex = new DataVertex(rusName);
|
|||
|
}
|
|||
|
else dataVertex = new DataVertex("[" + i + "] " + SystemService.ArraySystemsCombobox[i]);
|
|||
|
dataGraph.AddVertex(dataVertex);
|
|||
|
}
|
|||
|
var vlist = dataGraph.Vertices.ToList();
|
|||
|
|
|||
|
//создание связей
|
|||
|
if(SystemService.HollRoads != null)
|
|||
|
{
|
|||
|
foreach(var road in SystemService.HollRoads)
|
|||
|
{
|
|||
|
var roadFirstSys = road.Substring(0, road.IndexOf('='));
|
|||
|
var roadLastSys = road.Substring((road.IndexOf('=') + 1));
|
|||
|
var index_1 = Array.IndexOf(SystemService.ArraySystemsCombobox, roadFirstSys);
|
|||
|
var index_2 = Array.IndexOf(SystemService.ArraySystemsCombobox, roadLastSys);
|
|||
|
if (index_1 == -1 || index_2 == -1) continue;
|
|||
|
var dataEdge = new DataEdge(vlist[index_1], vlist[index_2]) { Text = string.Format("{0} -> {1}", vlist[index_1], vlist[index_2]) };
|
|||
|
dataGraph.AddEdge(dataEdge);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return dataGraph;
|
|||
|
}
|
|||
|
|
|||
|
private GraphExample GenerateRoad()
|
|||
|
{
|
|||
|
//загрузка систем
|
|||
|
var dataGraph = new GraphExample();
|
|||
|
LogService.LogEvent($"Создаю путь от {comboBoxRoadFirst.Text} до {comboBoxRoadLast.Text}");
|
|||
|
|
|||
|
|
|||
|
for (int i = 0; i < VerticleRoad.Length; i++)
|
|||
|
{
|
|||
|
var dataVertex = new DataVertex();
|
|||
|
dataVertex = new DataVertex(VerticleRoad[i]);
|
|||
|
dataGraph.AddVertex(dataVertex);
|
|||
|
if(i > 0)
|
|||
|
{
|
|||
|
var dataEdge = new DataEdge(dataGraph.Vertices.ToList()[i-1], dataGraph.Vertices.ToList()[i]) { Text = string.Format("{0} -> {1}", dataGraph.Vertices.ToList()[i-1], dataGraph.Vertices.ToList()[i]) };
|
|||
|
dataGraph.AddEdge(dataEdge);
|
|||
|
}
|
|||
|
}
|
|||
|
var vlist = dataGraph.Vertices.ToList();
|
|||
|
return dataGraph;
|
|||
|
}
|
|||
|
|
|||
|
private void but_generate_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
wpfHost.Visible = true;
|
|||
|
wpfHost.Child = GenerateWpfVisuals(Custom: false);
|
|||
|
GArea.GenerateGraph(true);
|
|||
|
GArea.SetVerticesDrag(true, true);
|
|||
|
Zoomctrl.ZoomToFill();
|
|||
|
buttonSetRoad.Enabled = true;
|
|||
|
}
|
|||
|
|
|||
|
private void but_reload_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
wpfHost.Visible = true;
|
|||
|
GArea.RelayoutGraph();
|
|||
|
}
|
|||
|
|
|||
|
private void ButtonSetRoad_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
var id1 = string.Empty;
|
|||
|
var id2 = string.Empty;
|
|||
|
if (!checkBoxRusNames.Checked)
|
|||
|
{ // определяю английское с русского наименования
|
|||
|
id1 = SystemService.SystemsNameId[comboBoxRoadFirst.Text];
|
|||
|
id2 = SystemService.SystemsNameId[comboBoxRoadLast.Text];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
id1 = comboBoxRoadFirst.Text;
|
|||
|
id2 = comboBoxRoadLast.Text;
|
|||
|
}
|
|||
|
|
|||
|
var pth = string.Empty;
|
|||
|
|
|||
|
if (checkBoxSearchState.Checked)
|
|||
|
{
|
|||
|
//чистим от однонаправленных связей
|
|||
|
var edges = SystemService.HollRoads.FindAll((road) =>
|
|||
|
{
|
|||
|
var road_1 = road.Substring(0, road.IndexOf('=')); //[Оптимум] какой-то Оптимум=Неизвестный сектор
|
|||
|
var road_2 = road.Substring(road.IndexOf('=') + 1); //[Неизвестный сектор] какой-то Оптимум=Неизвестный сектор
|
|||
|
if (SystemService.HollRoads.Contains(road_2 + '=' + road_1)) return true; //Неизвестный сектор=Оптимум
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
var g = new Graph();
|
|||
|
gXLogic.Graph = GenerateGraph();
|
|||
|
foreach (var vertice in gXLogic.Graph.Vertices)
|
|||
|
g.AddVertex(vertice.Text);
|
|||
|
foreach (var edge in edges)
|
|||
|
{
|
|||
|
var roadFirstSys = SystemService.SystemNamesID[edge.Substring(0, edge.IndexOf('='))];
|
|||
|
var roadLastSys = SystemService.SystemNamesID[edge.Substring(edge.IndexOf('=') + 1)];
|
|||
|
|
|||
|
g.AddEdge(roadFirstSys, roadLastSys, 1);
|
|||
|
}
|
|||
|
|
|||
|
var dijkstra = new Dijkstra(g);
|
|||
|
pth = dijkstra.FindShortestPath(id1, id2);
|
|||
|
LogService.LogEvent(pth);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
GraphC g = new GraphC();
|
|||
|
for (int i = 0; i < comboBoxSystems.Items.Count; i++)
|
|||
|
{
|
|||
|
Keyss.Add(i);
|
|||
|
g.AddKey(i);
|
|||
|
}
|
|||
|
|
|||
|
SystemService.HollRoads.Distinct();
|
|||
|
|
|||
|
foreach(var road in SystemService.HollRoads)
|
|||
|
{
|
|||
|
var roadFirstSys = road.Substring(0, road.IndexOf('='));
|
|||
|
var roadLastSys = road.Substring((road.IndexOf('=') + 1));
|
|||
|
var index_1 = Array.IndexOf(SystemService.ArraySystemsCombobox, roadFirstSys);
|
|||
|
var index_2 = Array.IndexOf(SystemService.ArraySystemsCombobox, roadLastSys);
|
|||
|
string rs = index_1 + "-" + index_2;
|
|||
|
Edge.Add(rs);
|
|||
|
g.AddEdge(rs);
|
|||
|
}
|
|||
|
Paths.Clear();
|
|||
|
FindPath(g, Array.IndexOf(SystemService.ArraySystemsCombobox, (comboBoxRoadLast.SelectedItem as ComboBoxItem).ID));
|
|||
|
|
|||
|
var pathsResult = Paths.FindAll((res) =>
|
|||
|
{
|
|||
|
res = res.Trim();
|
|||
|
if (res.IndexOf(' ') == -1) return false;
|
|||
|
if (res.LastIndexOf(' ') == -1) return false;
|
|||
|
|
|||
|
var start = res.Substring(0, res.IndexOf(' '));
|
|||
|
int INDEXStop = res.LastIndexOf(' ');
|
|||
|
var stop = res.Substring(INDEXStop);
|
|||
|
if (!string.IsNullOrEmpty(start) && !string.IsNullOrEmpty(stop) && int.Parse(start.Trim()) == Array.IndexOf(SystemService.ArraySystemsCombobox, (comboBoxRoadFirst.SelectedItem as ComboBoxItem).ID)
|
|||
|
&& int.Parse(stop.Trim()) == Array.IndexOf(SystemService.ArraySystemsCombobox, (comboBoxRoadLast.SelectedItem as ComboBoxItem).ID))
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
else return false;
|
|||
|
});
|
|||
|
foreach(var path in pathsResult)
|
|||
|
{
|
|||
|
var str = path.Trim();
|
|||
|
string[] resM = str.Split(' ');
|
|||
|
foreach(string s in resM)
|
|||
|
{
|
|||
|
LogService.LogEvent(SystemService.SystemsID[int.Parse(s)]);
|
|||
|
pth += SystemService.SystemNamesID[SystemService.SystemsID[int.Parse(s.Trim())]] + "=";
|
|||
|
}
|
|||
|
LogService.LogEvent(str);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
VerticleRoad = pth.Split('=');
|
|||
|
|
|||
|
bool startNameState = false;
|
|||
|
string startName = string.Empty;
|
|||
|
string stopName = string.Empty;
|
|||
|
GererateRoads = new string[VerticleRoad.Length - 1];
|
|||
|
int counter = 0;
|
|||
|
for (int i = 0; i < VerticleRoad.Length; i++)
|
|||
|
{
|
|||
|
VerticleRoad[i] = VerticleRoad[i].Trim();
|
|||
|
if (startNameState)
|
|||
|
{
|
|||
|
stopName = VerticleRoad[i].Trim();
|
|||
|
startNameState = false;
|
|||
|
var road = startName + "=" + stopName;
|
|||
|
GererateRoads[counter] = road;
|
|||
|
counter++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(stopName))
|
|||
|
{
|
|||
|
startName = VerticleRoad[i];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
startName = stopName;
|
|||
|
stopName = VerticleRoad[i];
|
|||
|
var road = startName + "=" + stopName;
|
|||
|
GererateRoads[counter] = road;
|
|||
|
counter++;
|
|||
|
startName = VerticleRoad[i];
|
|||
|
}
|
|||
|
|
|||
|
startNameState = true;
|
|||
|
}
|
|||
|
}
|
|||
|
wpfHost.Visible = true;
|
|||
|
wpfHost.Child = GenerateWpfVisuals(Custom: true);
|
|||
|
GArea.GenerateGraph(true);
|
|||
|
GArea.SetVerticesDrag(true, true);
|
|||
|
Zoomctrl.ZoomToFill();
|
|||
|
}
|
|||
|
|
|||
|
private void buttonCloseMap_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
wpfHost.Visible = false;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
public void FindPath(GraphC gr, int start) //gr - граф, start - номер вершины, от которой нужно найти пути до остальных
|
|||
|
{
|
|||
|
marks = new Dictionary<int, bool>();
|
|||
|
path = new Stack<int>();
|
|||
|
source = gr;
|
|||
|
foreach (int i in gr.Keys)
|
|||
|
marks.Add(i, false);
|
|||
|
|
|||
|
DFS(start);
|
|||
|
}
|
|||
|
|
|||
|
public List<int> Keyss = new List<int>();
|
|||
|
public List<string> Edge = new List<string>();
|
|||
|
Dictionary<int, bool> marks;
|
|||
|
Stack<int> path; //<-- это стек
|
|||
|
GraphC source; //<-- это моя реализация графа, что там внутри - не важно
|
|||
|
public List<string> Paths = new List<string>();
|
|||
|
|
|||
|
//функция поиска
|
|||
|
public void DFS(int v)
|
|||
|
{
|
|||
|
marks[v] = true;
|
|||
|
path.Push(v); // сохраняем в стек текущую вершину
|
|||
|
foreach (int i in path) // выводим путь до текущей
|
|||
|
{
|
|||
|
Console.Write(i.ToString() + " ");
|
|||
|
}
|
|||
|
|
|||
|
Console.WriteLine();
|
|||
|
|
|||
|
foreach (int i in source[v, Keyss, Edge].NodeLinks)
|
|||
|
if (marks[i] == false)
|
|||
|
{
|
|||
|
DFS(i);
|
|||
|
path.Pop(); // не забываем извлекать уже проверенные вершины
|
|||
|
}
|
|||
|
|
|||
|
string paths = string.Empty;
|
|||
|
foreach (int i in path) // выводим путь до текущей
|
|||
|
{
|
|||
|
paths += i.ToString() + " ";
|
|||
|
}
|
|||
|
Paths.Add(paths);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class GraphC
|
|||
|
{
|
|||
|
public List<int> Keys = new List<int>();
|
|||
|
|
|||
|
public List<string> Edge = new List<string>();
|
|||
|
|
|||
|
public List<int> NodeLinks { get; set; }
|
|||
|
|
|||
|
public GraphC()
|
|||
|
{
|
|||
|
NodeLinks = new List<int>();
|
|||
|
}
|
|||
|
|
|||
|
public GraphC(int index, List<int> keys, List<string> edge)
|
|||
|
{
|
|||
|
Keys.AddRange(keys);
|
|||
|
Edge.AddRange(edge);
|
|||
|
|
|||
|
NodeLinks = new List<int>();
|
|||
|
|
|||
|
var Edges = Edge.FindAll((ed) =>
|
|||
|
{
|
|||
|
var start = ed.Substring(0, ed.IndexOf('-'));
|
|||
|
int startVal = int.Parse(start);
|
|||
|
if (startVal == index)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
else return false;
|
|||
|
});
|
|||
|
|
|||
|
foreach (var Edge in Edges)
|
|||
|
{
|
|||
|
var stop = int.Parse(Edge.Substring(Edge.IndexOf('-') + 1, Edge.Length - (Edge.IndexOf('-') + 1)));
|
|||
|
NodeLinks.Add(stop);
|
|||
|
}
|
|||
|
|
|||
|
//Console.WriteLine($"Y verchini {index} svyazey {NodeLinks.Count}");
|
|||
|
}
|
|||
|
|
|||
|
public GraphC this[int index, List<int> keys, List<string> edges]
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return new GraphC(index, keys, edges);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void AddKey(int key)
|
|||
|
{
|
|||
|
Keys.Add(key);
|
|||
|
}
|
|||
|
|
|||
|
public void AddEdge(string edge)
|
|||
|
{
|
|||
|
Edge.Add(edge);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|