Compare commits

..

12 Commits

Author SHA1 Message Date
e03720990d Исправление ошибок. Форматирование кода 2023-11-30 03:15:19 +04:00
9bbe889440 Добавление элементов на форму FormBulldozerCollection 2023-11-30 02:46:03 +04:00
a92d29b242 Создание класса TractorGenericStorage 2023-11-30 02:42:46 +04:00
e173941bbc Изменения в BulldozerGenericCollection 2023-11-30 02:33:36 +04:00
b97db5b022 Начало Lab04. Изменения класса SetGeneric. 2023-11-30 02:31:42 +04:00
7a993d4956 Доработка логик в классах и форматирование. 2023-11-30 02:23:07 +04:00
2a3a472f5c Создание второй формы FormBulldozerCollection 2023-11-30 02:11:18 +04:00
90ecee7735 Создание класса BulldozerGenericCollection, редактирование классов прорисовки 2023-11-30 02:09:48 +04:00
9e12aee1d5 Создание класса SetGeneric 2023-11-30 01:42:41 +04:00
87de7c65b3 Выполнение всех требований по второй лабораторной 2023-11-23 01:37:55 +04:00
e9c0b5160f Добавлен класс сущности базового и продвинутого объектов 2023-11-23 01:10:37 +04:00
9b84704e46 Выполнение первой работы 2023-11-22 23:04:45 +04:00
29 changed files with 2257 additions and 46 deletions

View File

@ -0,0 +1,10 @@
namespace ProjectBulldozer
{
public enum DirectionType
{
Up = 1,
Down = 2,
Left = 3,
Right = 4,
}
}

View File

@ -0,0 +1,60 @@
using ProjectBulldozer.Entities;
namespace ProjectBulldozer.Drawning
{
public class DrawingBulldozer : DrawingTractor
{
public DrawingBulldozer(int speed, double weight, Color bodyColor, Color additionalColor,
bool horns, bool seifBatteries, int width, int height) : base(speed, weight, bodyColor, width, height, 120, 110)
{
if (EntityTractor != null)
{
EntityTractor = new EntityBulldozer(speed, width, bodyColor, additionalColor, horns, seifBatteries);
}
}
public object Otval { get; private set; }
public override void DrawTransport(Graphics g)
{
if (EntityTractor is not EntityBulldozer Bulldozer)
{
return;
}
Pen pen = new(Color.Black);
Brush blackBrush = new SolidBrush(Color.Black);
Brush windows = new SolidBrush(Color.LightBlue);
Brush bodyColor = new SolidBrush(Bulldozer.BodyColor);
Brush additionalColor = new SolidBrush(Bulldozer.AdditionalColor);
Brush grayBrush = new SolidBrush(Color.Gray);
//otval
Point[] Otval =
{
new Point(_startPosX + 118, _startPosY + 50),
new Point(_startPosX + 148, _startPosY + 111),
new Point(_startPosX+ 118, _startPosY + 111),
};
g.FillPolygon(additionalColor, Otval);
g.DrawPolygon(pen, Otval);
//гусеницы
Brush gg = new SolidBrush(Color.LightGray);
g.FillEllipse(gg, _startPosX + 16, _startPosY + 65, 101, 63);
g.DrawEllipse(pen, _startPosX + 16, _startPosY + 65, 101, 63);
g.FillEllipse(grayBrush, _startPosX + 65, _startPosY + 100, 13, 13);
g.DrawEllipse(pen, _startPosX + 65, _startPosY + 100, 13, 13);
Point[] Ttt =
{
new Point(_startPosX + 16, _startPosY + 79),
new Point(_startPosX + 16, _startPosY + 120),
new Point(_startPosX, _startPosY + 48),
};
g.FillPolygon(blackBrush, Ttt);
g.DrawPolygon(pen, Ttt);
if (Bulldozer.SeifBatteries)
{
g.FillRectangle(blackBrush, _startPosX + 110, _startPosY + 60, 5, 10);
}
base.DrawTransport(g);
}
}
}

View File

@ -0,0 +1,137 @@
using ProjectBulldozer.Entities;
using ProjectBulldozer.MovementStrategy;
namespace ProjectBulldozer.Drawning
{
public class DrawingTractor
{
public EntityTractor? EntityTractor { get; protected set; }
protected int _pictureWidth;
protected int _pictureHeight;
protected int _startPosX;
protected int _startPosY;
protected readonly int _tractWidth = 120;
protected readonly int _tractHeight = 110;
public int GetPosX => _startPosX;
public int GetPosY => _startPosY;
public int GetWidth => _tractWidth;
public int GetHeight => _tractHeight;
public IMoveableObject GetMoveableObject => new DrawingObjectTractor(this);
public DrawingTractor(int speed, double weight, Color bodyColor, int width, int heigth)
{
if (width < _tractWidth || heigth < _tractHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = heigth;
EntityTractor = new EntityTractor(speed, weight, bodyColor);
}
protected DrawingTractor(int speed, double weight, Color bodyColor, int width,
int height, int tractWidth, int tractHeight)
{
if (width < _tractWidth || height < _tractHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
_tractWidth = tractWidth;
_tractHeight = tractHeight;
EntityTractor = new EntityTractor(speed, weight, bodyColor);
}
//Установка позиции
public void SetPosition(int x, int y)
{
if (x < 0 || x + _tractWidth > _pictureWidth)
{
x = _pictureWidth - _tractWidth;
}
if (y < 0 || y + _tractHeight > _pictureHeight)
{
y = _pictureHeight - _tractHeight;
}
_startPosX = x;
_startPosY = y;
}
public void MoveTransport(DirectionType direction)
{
if (EntityTractor == null)
{
return;
}
switch (direction)
{
case DirectionType.Left:
if (_startPosX - EntityTractor.Step > 0)
{
_startPosX -= (int)EntityTractor.Step;
}
break;
case DirectionType.Up:
if (_startPosY - EntityTractor.Step > 0)
{
_startPosY -= (int)EntityTractor.Step;
}
break;
case DirectionType.Right:
if (_startPosX + EntityTractor.Step + _tractWidth < _pictureWidth)
{
_startPosX += (int)EntityTractor.Step;
}
break;
case DirectionType.Down:
if (_startPosY + EntityTractor.Step + _tractHeight < _pictureHeight)
{
_startPosY += (int)EntityTractor.Step;
}
break;
}
}
public virtual void DrawTransport(Graphics g)
{
{
if (EntityTractor == null) return;
}
Pen pen = new(Color.Black);
Brush brownBrush = new SolidBrush(Color.Brown);
Brush windows = new SolidBrush(Color.LightYellow);
Brush bodyColor = new SolidBrush(EntityTractor.BodyColor);
Brush grayBrush = new SolidBrush(Color.Gray);
//основное тело
g.FillRectangle(bodyColor, _startPosX + 18, _startPosY + 42, 99, 56);
g.DrawRectangle(pen, _startPosX + 18, _startPosY + 42, 99, 56);
//кабина водителя
g.FillRectangle(windows, _startPosX + 18, _startPosY + 4 , 37, 37);
g.DrawRectangle(pen, _startPosX + 18, _startPosY +4 , 37, 37);
//колеса
g.FillEllipse(grayBrush, _startPosX + 19, _startPosY + 76, 45, 45);
g.DrawEllipse(pen, _startPosX + 19, _startPosY + 76, 45, 45);
g.FillEllipse(grayBrush, _startPosX + 80, _startPosY + 87, 33, 33);
g.DrawEllipse(pen, _startPosX + 80, _startPosY + 87, 33, 33);
//выхлопная труба
g.FillRectangle(brownBrush, _startPosX + 88, _startPosY+ 6, 14, 35);
g.DrawRectangle(pen, _startPosX + 88, _startPosY + 6, 14, 35);
}
public bool CanMove(DirectionType direction)
{
if (EntityTractor == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityTractor.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityTractor.Step > 0,
// вправо
DirectionType.Right => _startPosX + EntityTractor.Step < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + EntityTractor.Step < _pictureHeight,
};
}
}
}

View File

@ -0,0 +1,16 @@
namespace ProjectBulldozer.Entities
{
public class EntityBulldozer : EntityTractor
{
public Color AdditionalColor { get; private set; }
public bool Horns { get; private set; }
public bool SeifBatteries { get; private set; }
public EntityBulldozer(int speed, double weight, Color bodyColor, Color additionalColor, bool horns,
bool seifBatteries) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Horns = horns;
SeifBatteries = seifBatteries;
}
}
}

View File

@ -0,0 +1,16 @@
namespace ProjectBulldozer.Entities
{
public class EntityTractor
{
public int Speed { get; private set; }
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public double Step => (double)Speed * 100 / Weight;
public EntityTractor(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -1,10 +1,8 @@
namespace ProjectBulldozer

namespace Bulldozer
{
partial class FormBulldozer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
@ -19,21 +17,185 @@
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBulldozer));
pictureBoxBulldozer = new PictureBox();
buttonCreateBulldozer = new Button();
buttonLeft = new Button();
buttonUp = new Button();
buttonRight = new Button();
buttonDown = new Button();
comboBoxStrategy = new ComboBox();
buttonCreateTractor = new Button();
buttonStep = new Button();
ButtonSelect_Tractor = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxBulldozer).BeginInit();
SuspendLayout();
//
// pictureBoxBulldozer
//
pictureBoxBulldozer.Dock = DockStyle.Fill;
pictureBoxBulldozer.Location = new Point(0, 0);
pictureBoxBulldozer.Margin = new Padding(2);
pictureBoxBulldozer.Name = "pictureBoxBulldozer";
pictureBoxBulldozer.Size = new Size(870, 572);
pictureBoxBulldozer.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBoxBulldozer.TabIndex = 0;
pictureBoxBulldozer.TabStop = false;
//
// buttonCreateBulldozer
//
buttonCreateBulldozer.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateBulldozer.Location = new Point(20, 514);
buttonCreateBulldozer.Margin = new Padding(2);
buttonCreateBulldozer.Name = "buttonCreateBulldozer";
buttonCreateBulldozer.Size = new Size(88, 48);
buttonCreateBulldozer.TabIndex = 1;
buttonCreateBulldozer.Text = "Создать бульдозер";
buttonCreateBulldozer.UseVisualStyleBackColor = true;
buttonCreateBulldozer.Click += buttonCreateBulldozer_Click;
//
// buttonLeft
//
buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage");
buttonLeft.BackgroundImageLayout = ImageLayout.Zoom;
buttonLeft.Location = new Point(732, 522);
buttonLeft.Margin = new Padding(2);
buttonLeft.Name = "buttonLeft";
buttonLeft.Size = new Size(40, 33);
buttonLeft.TabIndex = 2;
buttonLeft.UseVisualStyleBackColor = true;
buttonLeft.Click += buttonMove_Click;
//
// buttonUp
//
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage");
buttonUp.BackgroundImageLayout = ImageLayout.Zoom;
buttonUp.Location = new Point(776, 485);
buttonUp.Margin = new Padding(2);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(40, 33);
buttonUp.TabIndex = 3;
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += buttonMove_Click;
//
// buttonRight
//
buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage");
buttonRight.BackgroundImageLayout = ImageLayout.Zoom;
buttonRight.Location = new Point(819, 522);
buttonRight.Margin = new Padding(2);
buttonRight.Name = "buttonRight";
buttonRight.Size = new Size(40, 33);
buttonRight.TabIndex = 4;
buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += buttonMove_Click;
//
// buttonDown
//
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage");
buttonDown.BackgroundImageLayout = ImageLayout.Zoom;
buttonDown.Location = new Point(776, 522);
buttonDown.Margin = new Padding(2);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(40, 33);
buttonDown.TabIndex = 5;
buttonDown.UseVisualStyleBackColor = true;
buttonDown.Click += buttonMove_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right;
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "В центр", "В угол" });
comboBoxStrategy.Location = new Point(740, 8);
comboBoxStrategy.Margin = new Padding(2);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(113, 23);
comboBoxStrategy.TabIndex = 6;
comboBoxStrategy.SelectedIndexChanged += comboBoxStrategy_SelectedIndexChanged;
//
// buttonCreateTractor
//
buttonCreateTractor.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateTractor.Location = new Point(122, 514);
buttonCreateTractor.Margin = new Padding(2);
buttonCreateTractor.Name = "buttonCreateTractor";
buttonCreateTractor.Size = new Size(88, 48);
buttonCreateTractor.TabIndex = 7;
buttonCreateTractor.Text = "Создать трактор";
buttonCreateTractor.UseVisualStyleBackColor = true;
buttonCreateTractor.Click += buttonCreateTractor_Click;
//
// buttonStep
//
buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonStep.Location = new Point(755, 39);
buttonStep.Margin = new Padding(2);
buttonStep.Name = "buttonStep";
buttonStep.Size = new Size(88, 28);
buttonStep.TabIndex = 8;
buttonStep.Text = "Шаг";
buttonStep.UseVisualStyleBackColor = true;
buttonStep.Click += buttonStep_Click;
//
// ButtonSelect_Tractor
//
ButtonSelect_Tractor.Anchor = AnchorStyles.Top | AnchorStyles.Right;
ButtonSelect_Tractor.Location = new Point(755, 71);
ButtonSelect_Tractor.Margin = new Padding(2);
ButtonSelect_Tractor.Name = "ButtonSelect_Tractor";
ButtonSelect_Tractor.Size = new Size(88, 28);
ButtonSelect_Tractor.TabIndex = 9;
ButtonSelect_Tractor.Text = "Выбрать";
ButtonSelect_Tractor.UseVisualStyleBackColor = true;
ButtonSelect_Tractor.Click += ButtonSelect_Tractor_Click;
//
// FormBulldozer
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(870, 572);
Controls.Add(ButtonSelect_Tractor);
Controls.Add(buttonStep);
Controls.Add(buttonCreateTractor);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonDown);
Controls.Add(buttonRight);
Controls.Add(buttonUp);
Controls.Add(buttonLeft);
Controls.Add(buttonCreateBulldozer);
Controls.Add(pictureBoxBulldozer);
Margin = new Padding(2);
Name = "FormBulldozer";
StartPosition = FormStartPosition.CenterScreen;
Text = "Bulldozer";
((System.ComponentModel.ISupportInitialize)pictureBoxBulldozer).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private PictureBox pictureBoxBulldozer;
private Button buttonCreateBulldozer;
private Button buttonLeft;
private Button buttonUp;
private Button buttonRight;
private Button buttonDown;
private ComboBox comboBoxStrategy;
private Button buttonCreateTractor;
private Button buttonStep;
private Button ButtonSelect_Tractor;
private EventHandler comboBoxStrategy_SelectedIndexChanged;
}
}

View File

@ -1,10 +1,131 @@
namespace ProjectBulldozer
using ProjectBulldozer;
using ProjectBulldozer.Drawning;
using ProjectBulldozer.MovementStrategy;
using System;
using System.Windows.Forms;
namespace Bulldozer
{
public partial class FormBulldozer : Form
{
private DrawingTractor? _drawingTractor;
private AbstractStrategy? _abstractStrategy;
public DrawingTractor? SelectedTractor { get; private set; }
public FormBulldozer()
{
InitializeComponent();
_abstractStrategy = null;
SelectedTractor = null;
}
private void Draw()
{
if (_drawingTractor == null)
{
return;
}
Bitmap bmp = new(pictureBoxBulldozer.Width, pictureBoxBulldozer.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawingTractor.DrawTransport(gr);
pictureBoxBulldozer.Image = bmp;
}
private void buttonCreateBulldozer_Click(object sender, EventArgs e)
{
Random random = new Random();
Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
color = colorDialog.Color;
}
Color dopColor = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
if (colorDialog.ShowDialog() == DialogResult.OK)
{
dopColor = colorDialog.Color;
}
_drawingTractor = new DrawingBulldozer(random.Next(100, 300), random.Next(1000, 3000), color, dopColor,
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
pictureBoxBulldozer.Width, pictureBoxBulldozer.Height);
_drawingTractor.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
private void buttonCreateTractor_Click(object sender, EventArgs e)
{
Random rnd = new Random();
Color color = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256));
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
color = colorDialog.Color;
}
_drawingTractor = new DrawingTractor(rnd.Next(100, 300), rnd.Next(1000, 3000), color,
pictureBoxBulldozer.Width, pictureBoxBulldozer.Height);
_drawingTractor.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100));
Draw();
}
private void buttonMove_Click(object sender, EventArgs e)
{
if (_drawingTractor == null)
{
return;
}
string name = ((Button)sender)?.Name ?? string.Empty;
switch (name)
{
case "buttonUp":
_drawingTractor.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawingTractor.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawingTractor.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawingTractor.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
private void buttonStep_Click(object sender, EventArgs e)
{
if (_drawingTractor == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_abstractStrategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToRightCorner(),
_ => null,
};
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(_drawingTractor.GetMoveableObject, pictureBoxBulldozer.Width,
pictureBoxBulldozer.Height);
}
if (_abstractStrategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
private void ButtonSelect_Tractor_Click(object sender, EventArgs e)
{
SelectedTractor = _drawingTractor;
DialogResult = DialogResult.OK;
}
}
}

View File

@ -117,4 +117,584 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
xJ70NFUfliRJkqTZ4jNOriRJkqT5RjQnV/9K1QckSZIkqb0mrzm5epaqD0eSJElSu03aqfQxVR+MJEmS
pPabpI3pVqo+EEmSJEnza3L2JidXkiRJ0mKalNPJyZUkSZK0uCbByZUkSZLUj0ZvX3qeql9ekiRJUreN
2pnk5EqSJEnqT6O0Kd1O1S8sSZIkaXGNzv70IlW/rCRJkqTFNipnk5MrSZIkqb+NwuZ0J1W/oCRJkqT+
NHjNydXLVP1ykiRJkvrVoP2YPqXqF5MkSZLUvwbJyZUkSZI0zAbnQHJyJUmSJA2zQTmXnFxJkiRJw20Q
tqS7qfoFJEmSJA2n3mtOrl6l6oeXJEmSNKx67XxyciVJkiSNp176Njm5kiRJksZX7zQnV69T9cNKkiRJ
Gna9ciFVP6QkSZKkcdQLW9O9VP2AkiRJksbTwh1MTq4kSZKkabRQF1P1Q0mSJEkaZwuxLd1P1Q8kSZIk
abx17lB6k6ofRpIkSdK469T/puqHkCRJkjSNOrE9PUjVDyBJkiRpOs3d4eTkSpIkSVLTXF1K1V8qSZIk
aZrNRXNy9TBVf6EkSZKk6da6I+ltqv4ySZIkSdOuVZdT9ZdIkiRJUlMrdiQnV5IkSZJWambNydW7VP3h
kiRJkvR5M7mSqj9UkiRJkqrWZWd6lKo/UJIkSZKWa82Opvep+sMkSZIk6WutydVU/SGSJEmStJpW5bv0
c6r+AEmSJElabSv6ITm5kiRJktRGX+XkSpIkSVKblZxcSZIkSZpHf3MsObmSJEmSNI++cC1V/yFJkiRJ
aqPf7EqPU/UfkCRJkqS2+uZ4cnIlSZIkqYsMEEmSJEmd9RsnWJIkSZK66Av+l9AlSZIkzbO/8X+GV5Ik
SdK8Kvl/RChJkiRpHn3V1VT9D0mSJEnSelrRD8lJliRJkqQ2WhUnWZIkSZLaaE2cZEmSJEmapTU7mpxk
SZIkSVpP67IzPUrVHyhJkiRJyzWTK6n6QyVJkiSpamZH0rtU/eGSJEmS9Hmt2JEepuovkCRJkqQ/atXl
VP0lkiRJktTUuuYk622q/jJJkiRJ024uticnWZIkSZKWNleXUvWXSpIkSZpmc3c4vUnVXy5JkiRpWnWi
Ocl6kKofQJIkSdJ06tT/puqHkCRJkjSNOncoOcmSJEmSptlCbEv3U/UDSZIkSRpvC3UxVT+UJEmSpHG2
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
</value>
</data>
<data name="buttonUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaX
pAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAkAgGVpdEmaAABYlkaXpAngCjz33P8Hi7z/syCq
kBsAAAAASUVORK5CYII=
</value>
</data>
<data name="buttonRight.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
qv3RSJIkSfN2O21K8I3aH4skSZLURC/T/gT/UftDkSRJkpqqnGSdTfBF7Y9EkiRJaro7aXNi4mp/HJIk
SVIbvUpOsiau9ochSZIktdXn9Gtiomp/FJIkSVLbOcmaqNofgyRJktRF5STrQGJCan8IkiRJUleVk6xz
iYmo/RFIkiRJXXc3bUmMXO3lS5IkSYvodXKSNXK1Fy9JkiQtqnKSdT4xUrWXLkmSJC26cpL1Y2Jkai9b
kiRJ6kNvkpOskam9aEmSJKlPXUiMRO0FS5IkSX3rXtqaGLjay5UkSZL6WDnJOpgYsNqLlSRJkvrcxcRA
1V6oJEmS1Pfup22Jgam9TEmSJGkIvU2HEgNSe5GSJEnSkHKSNSC1FyhJkiQNrQdpe6Lnai9PkiRJGmLl
JOtwosdqL06SJEkacpcSPVV7YZIkSdLQe5icZPVQ7WVJkiRJY+hdOpLokdqLkiRJksbU5URP1F6QJEmS
NLbKSdaOxILVXo4kSZI0xt4nJ1kLVnsxkiRJ0pi7kliQ2guRJEmSxt6jtDPRsdrLkCRJkqbQh3Q00aHa
i5AkSZKm1NVER2ovQJIkSZpaj9NPiZbVHr4kSZI0xcpJ1i+JFtUevCRJkjTlnGS1qPbAJUmSpKnnJKsl
tYctSZIk6c+TrGOJBtUetCRJkqT/di3RkNoDliRJkvRtT9KuxJxqD1eSJEnSXysnWccTc6g9WEmSJEnf
73piRrUHKkmSJGnlfk+7E+tUe5iSJEmSVq+cZJ1IrEPtQUqSJElaezcSa1R7gJIkSZLW19PkJGsNag9P
kiRJ0vr7mE4mVlB7cJIkSZJm72bakKioPTBJkiRJ8/Us7UksU3tYkiRJkubPSVZF7UFJkiRJaq5/JCdZ
/1Z7QJIkSZKa7XlykhW1hyNJkiSp+T6lU2nSag9GkiRJUnvdShvTJNUeiCRJkqR2KydZe9Pk1B6GJEmS
pPYrJ1mn06TUHoQkSZKk7prUSVbtAUiSJEnqthdpXxq92peXJEmS1H3lJOtMGrXaF5ckSZK0uG6nTWmU
al9YkiRJ0mJ7mfan0al9WUmSJEmLr5xknU2jUvuikiRJkvrTnbQ5jULtC0qSJEnqV6/SKE6yal9OkiRJ
Uv/6nH5Ng1b7YpIkSZL626BPsmpfSJIkSVK/KydZB9Lg1L6MJEmSpP5XTrLOpUGpfRFJkiRJw+lu2pIG
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
</value>
</data>
<data name="buttonDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAYAAADbcAZoAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAIg1JREFUeF7t28+r/vvY93F/gSRJkiRJkiR/gmQgSUb+BBnIQLoyke6B7mRgoCsZ
SLqTgXQP/AUykIF2upIk6UqSgfZAMrjv47iO7cfe+7W/P9Y61rnOz+d8POpZV/edvb97rXW+369vrffr
AA7k/0l6zQAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
AIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJAIBlaXRJmgAAWJZGl6QJ
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
</value>
</data>
</root>

View File

@ -0,0 +1,210 @@

namespace ProjectBulldozer
{
partial class FormTractorCollections
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
maskedTextBoxNumber = new MaskedTextBox();
ButtonRefreshCollection = new Button();
ButtonRemoveTractor = new Button();
ButtonAddTractor = new Button();
pictureBoxCollections = new PictureBox();
textBoxStorageName = new TextBox();
bindingSource1 = new BindingSource(components);
bindingSource2 = new BindingSource(components);
groupBox1 = new GroupBox();
listBoxStorage = new ListBox();
ButtonAddObject = new Button();
ButtonRemoveObject = new Button();
Instruments = new GroupBox();
((System.ComponentModel.ISupportInitialize)pictureBoxCollections).BeginInit();
((System.ComponentModel.ISupportInitialize)bindingSource1).BeginInit();
((System.ComponentModel.ISupportInitialize)bindingSource2).BeginInit();
groupBox1.SuspendLayout();
Instruments.SuspendLayout();
SuspendLayout();
//
// maskedTextBoxNumber
//
maskedTextBoxNumber.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
maskedTextBoxNumber.Location = new Point(33, 399);
maskedTextBoxNumber.Margin = new Padding(3, 2, 3, 2);
maskedTextBoxNumber.Mask = "0";
maskedTextBoxNumber.Name = "maskedTextBoxNumber";
maskedTextBoxNumber.Size = new Size(131, 23);
maskedTextBoxNumber.TabIndex = 4;
//
// ButtonRefreshCollection
//
ButtonRefreshCollection.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
ButtonRefreshCollection.Location = new Point(33, 499);
ButtonRefreshCollection.Margin = new Padding(3, 2, 3, 2);
ButtonRefreshCollection.Name = "ButtonRefreshCollection";
ButtonRefreshCollection.Size = new Size(131, 31);
ButtonRefreshCollection.TabIndex = 2;
ButtonRefreshCollection.Text = "Обновить все";
ButtonRefreshCollection.UseVisualStyleBackColor = true;
//
// ButtonRemoveTractor
//
ButtonRemoveTractor.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
ButtonRemoveTractor.Location = new Point(33, 444);
ButtonRemoveTractor.Margin = new Padding(3, 2, 3, 2);
ButtonRemoveTractor.Name = "ButtonRemoveTractor";
ButtonRemoveTractor.Size = new Size(131, 33);
ButtonRemoveTractor.TabIndex = 1;
ButtonRemoveTractor.Text = "Удалить объект";
ButtonRemoveTractor.UseVisualStyleBackColor = true;
ButtonRemoveTractor.Click += ButtonRemoveTractor_Click;
//
// ButtonAddTractor
//
ButtonAddTractor.Anchor = AnchorStyles.Top;
ButtonAddTractor.Location = new Point(33, 346);
ButtonAddTractor.Margin = new Padding(3, 2, 3, 2);
ButtonAddTractor.Name = "ButtonAddTractor";
ButtonAddTractor.Size = new Size(131, 29);
ButtonAddTractor.TabIndex = 0;
ButtonAddTractor.Text = "Добавить объект";
ButtonAddTractor.UseVisualStyleBackColor = true;
ButtonAddTractor.Click += ButtonAddTractor_Click;
//
// pictureBoxCollections
//
pictureBoxCollections.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
pictureBoxCollections.Location = new Point(4, 4);
pictureBoxCollections.Margin = new Padding(3, 2, 3, 2);
pictureBoxCollections.Name = "pictureBoxCollections";
pictureBoxCollections.Size = new Size(693, 541);
pictureBoxCollections.TabIndex = 1;
pictureBoxCollections.TabStop = false;
//
// textBoxStorageName
//
textBoxStorageName.Location = new Point(27, 32);
textBoxStorageName.Name = "textBoxStorageName";
textBoxStorageName.Size = new Size(131, 23);
textBoxStorageName.TabIndex = 5;
textBoxStorageName.TextChanged += textBoxStorageName_TextChanged;
//
// groupBox1
//
groupBox1.Controls.Add(listBoxStorage);
groupBox1.Controls.Add(ButtonAddObject);
groupBox1.Controls.Add(ButtonRemoveObject);
groupBox1.Controls.Add(textBoxStorageName);
groupBox1.Location = new Point(6, 22);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(189, 296);
groupBox1.TabIndex = 5;
groupBox1.TabStop = false;
groupBox1.Text = "Наборы";
//
// listBoxStorage
//
listBoxStorage.FormattingEnabled = true;
listBoxStorage.ItemHeight = 15;
listBoxStorage.Location = new Point(27, 122);
listBoxStorage.Name = "listBoxStorage";
listBoxStorage.Size = new Size(131, 94);
listBoxStorage.TabIndex = 9;
listBoxStorage.SelectedIndexChanged += listBoxStorage_SelectedIndexChanged;
//
// ButtonAddObject
//
ButtonAddObject.Anchor = AnchorStyles.Top;
ButtonAddObject.Location = new Point(27, 72);
ButtonAddObject.Margin = new Padding(3, 2, 3, 2);
ButtonAddObject.Name = "ButtonAddObject";
ButtonAddObject.Size = new Size(131, 29);
ButtonAddObject.TabIndex = 7;
ButtonAddObject.Text = "Добавить набор";
ButtonAddObject.UseVisualStyleBackColor = true;
ButtonAddObject.Click += ButtonAddObject_Click;
//
// ButtonRemoveObject
//
ButtonRemoveObject.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
ButtonRemoveObject.Location = new Point(27, 244);
ButtonRemoveObject.Margin = new Padding(3, 2, 3, 2);
ButtonRemoveObject.Name = "ButtonRemoveObject";
ButtonRemoveObject.Size = new Size(131, 33);
ButtonRemoveObject.TabIndex = 8;
ButtonRemoveObject.Text = "Удалить набор";
ButtonRemoveObject.UseVisualStyleBackColor = true;
ButtonRemoveObject.Click += ButtonRemoveObject_Click;
//
// Instruments
//
Instruments.Controls.Add(ButtonRefreshCollection);
Instruments.Controls.Add(groupBox1);
Instruments.Controls.Add(maskedTextBoxNumber);
Instruments.Controls.Add(ButtonAddTractor);
Instruments.Controls.Add(ButtonRemoveTractor);
Instruments.Location = new Point(697, 4);
Instruments.Name = "Instruments";
Instruments.Size = new Size(200, 541);
Instruments.TabIndex = 6;
Instruments.TabStop = false;
Instruments.Text = "Инструменты";
//
// FormTractorCollections
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(904, 543);
Controls.Add(Instruments);
Controls.Add(pictureBoxCollections);
Margin = new Padding(3, 2, 3, 2);
Name = "FormTractorCollections";
Text = "Набор локомотивов";
((System.ComponentModel.ISupportInitialize)pictureBoxCollections).EndInit();
((System.ComponentModel.ISupportInitialize)bindingSource1).EndInit();
((System.ComponentModel.ISupportInitialize)bindingSource2).EndInit();
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
Instruments.ResumeLayout(false);
Instruments.PerformLayout();
ResumeLayout(false);
}
#endregion
private Button ButtonRefreshCollection;
private Button ButtonRemoveTractor;
private Button ButtonAddTractor;
private PictureBox pictureBoxCollections;
private MaskedTextBox maskedTextBoxNumber;
private GroupBox groupBox1;
private TextBox textBoxStorageName;
private BindingSource bindingSource1;
private BindingSource bindingSource2;
private ListBox listBoxStorage;
private Button ButtonAddObject;
private Button ButtonRemoveObject;
private GroupBox Instruments;
private EventHandler textBoxStorageName_TextChanged;
}
}

View File

@ -0,0 +1,119 @@
using Bulldozer;
using ProjectBulldozer.Generics;
namespace ProjectBulldozer
{
public partial class FormTractorCollections : Form
{
private readonly TractorGenericStorage _storage;
//private readonly TractorGenericCollection<DrawingTractor, DrawingObjectTractor> _Tractors;
public FormTractorCollections()
{
InitializeComponent();
_storage = new TractorGenericStorage(pictureBoxCollections.Width, pictureBoxCollections.Height);
}
private void ReloadObjects()
{
int index = listBoxStorage.SelectedIndex;
listBoxStorage.Items.Clear();
for (int i = 0; i < _storage.Keys.Count; i++)
{
listBoxStorage.Items.Add(_storage.Keys[i]);
}
if (listBoxStorage.Items.Count > 0 && (index == -1 || index >= listBoxStorage.Items.Count))
{
listBoxStorage.SelectedIndex = 0;
}
else if (listBoxStorage.Items.Count > 0 && index > -1 && index < listBoxStorage.Items.Count)
{
listBoxStorage.SelectedIndex = index;
}
}
private void ButtonAddObject_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxStorageName.Text))
{
MessageBox.Show("Не всё заполнено", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_storage.AddSet(textBoxStorageName.Text);
ReloadObjects();
}
private void listBoxStorage_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBoxCollections.Image = _storage[listBoxStorage.SelectedItem?.ToString() ?? string.Empty]?.ShowTractors();
}
private void ButtonRemoveObject_Click(object sender, EventArgs e)
{
if (listBoxStorage.SelectedIndex == -1)
{
return;
}
if (MessageBox.Show($"Удалить объект {listBoxStorage.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
_storage.DelSet(listBoxStorage.SelectedItem.ToString() ?? string.Empty);
ReloadObjects();
}
}
private void ButtonAddTractor_Click(object sender, EventArgs e)
{
if (listBoxStorage.SelectedIndex == -1) return;
var obj = _storage[listBoxStorage.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
FormBulldozer form = new();
if (form.ShowDialog() == DialogResult.OK)
{
//проверяем, удалось ли нам загрузить объект
if (obj + form.SelectedTractor > -1)
{
MessageBox.Show("Объект добавлен");
pictureBoxCollections.Image = obj.ShowTractors();
}
else
{
MessageBox.Show("Не удалось добавить объект");
}
}
}
private void ButtonRemoveTractor_Click(object sender, EventArgs e)
{
if (listBoxStorage.SelectedIndex == -1) return;
var obj = _storage[listBoxStorage.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
if (obj - pos != null)
{
MessageBox.Show("Объект удален");
pictureBoxCollections.Image = obj.ShowTractors();
}
else
{
MessageBox.Show("Не удалось удалить объект");
}
}
private void ButtonRefreshCollection_Click(object sender, EventArgs e)
{
if (listBoxStorage.SelectedIndex == -1) return;
var obj = _storage[listBoxStorage.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
pictureBoxCollections.Image = obj.ShowTractors();
}
}
}

View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="
1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,97 @@
using ProjectBulldozer.Drawning;
using ProjectBulldozer.MovementStrategy;
namespace ProjectBulldozer.Generics
{
internal class TractorGenericCollection<T, U> where T : DrawingTractor where U : IMoveableObject
{
//ширина/высота окна
private readonly int _pictureWidth;
private readonly int _pictureHeight;
//ширина/высота занимаемого места
private readonly int _placeSizeWidth = 150;
private readonly int _placeSizeHeight = 130;
/// Набор объектов
private readonly SetGeneric<T> _collection;
public TractorGenericCollection(int picWidth, int picHeight)
{
// высчитываем размер массива для setgeneric
int width = picWidth / _placeSizeWidth;
int height = picHeight / _placeSizeHeight;
_pictureWidth = picWidth;
_pictureHeight = picHeight;
_collection = new SetGeneric<T>(width * height);
}
/// Перегрузка оператора сложения
public static int operator +(TractorGenericCollection<T, U> collect, T? tract)
{
if (tract == null)
{
return -1;
}
return collect._collection.Insert(tract);
}
/// Перегрузка оператора вычитания
public static T? operator -(TractorGenericCollection<T, U> collect, int pos)
{
T? obj = collect._collection[pos];
if (obj != null)
{
collect._collection.Remove(pos);
}
return obj;
}
// получение объекта imoveableObj
public U? GetU(int pos)
{
return (U?)_collection[pos]?.GetMoveableObject;
}
/// Вывод всего набора объектов
public Bitmap ShowTractors()
{
Bitmap bmp = new(_pictureWidth, _pictureHeight);
Graphics gr = Graphics.FromImage(bmp);
DrawBackground(gr);
DrawObjects(gr);
return bmp;
}
private void DrawBackground(Graphics g)
{
Pen pen = new(Color.Black, 3);
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
{
for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j)
{
//линия рамзетки места
g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 3, j * _placeSizeHeight);
}
g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
}
}
private void DrawObjects(Graphics g)
{
int width = _pictureWidth / _placeSizeWidth;
int height = _pictureHeight / _placeSizeHeight;
for (int i = 0; i < _collection.Count; i++)
{
// Получение объекта
var obj = _collection[i];
// Установка позиции
obj?.SetPosition(
(int)((width - 1) * _placeSizeWidth - (i % width * _placeSizeWidth)),
(int)((height - 1) * _placeSizeHeight - (i / width * _placeSizeHeight))
);
// Прорисовка объекта
obj?.DrawTransport(g);
}
}
}
}

View File

@ -0,0 +1,59 @@
namespace ProjectBulldozer.Generics
{
internal class SetGeneric<T> where T : class
{
private readonly List<T?> _places;
public int Count => _places.Count;
/// Максимальное количество объектов в списке
private readonly int _maxCount;
public SetGeneric(int count)
{
_maxCount = count;
_places = new List<T?>(count);
}
/// Добавление объекта в набор
public int Insert(T tract)
{
return Insert(tract, 0);
}
public int Insert(T tract, int position)
{
if (position < 0 || position >= _maxCount) return -1;
_places.Insert(position, tract);
return position;
}
public T? Remove(int position)
{
if (position >= Count || position < 0)
return null;
T? tmp = _places[position];
_places[position] = null;
return tmp;
}
public T? this[int position]
{
get
{
if (position < 0 || position >= Count) return null;
return _places[position];
}
set
{
if (position < 0 || position >= Count || Count == _maxCount) return;
_places.Insert(position, value);
}
}
public IEnumerable<T?> GetTractors(int? maxTracts = null)
{
for (int i = 0; i < _places.Count; ++i)
{
yield return _places[i];
if (maxTracts.HasValue && i == maxTracts.Value)
{
yield break;
}
}
}
}
}

View File

@ -0,0 +1,9 @@
namespace ProjectBulldozer.MovementStrategy
{
public enum Status
{
NotInit,
InProgress,
Finish
}
}

View File

@ -0,0 +1,44 @@
using ProjectBulldozer.Drawning;
using ProjectBulldozer.MovementStrategy;
namespace ProjectBulldozer.Generics
{
internal class TractorGenericStorage
{
readonly Dictionary<string, TractorGenericCollection<DrawingTractor, DrawingObjectTractor>> _TractorsStorage;
public List<string> Keys => _TractorsStorage.Keys.ToList();
private readonly int _pictureWidth;
private readonly int _pictureHeight;
public TractorGenericStorage(int pictureWidth, int pictureHeight)
{
_TractorsStorage = new Dictionary<string, TractorGenericCollection<DrawingTractor, DrawingObjectTractor>>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
public void AddSet(string name)
{
if (!_TractorsStorage.ContainsKey(name))
{
_TractorsStorage.Add(name, new TractorGenericCollection<DrawingTractor, DrawingObjectTractor>(_pictureWidth, _pictureHeight));
}
}
public void DelSet(string name)
{
if (_TractorsStorage.ContainsKey(name))
{
_TractorsStorage.Remove(name);
}
}
public TractorGenericCollection<DrawingTractor, DrawingObjectTractor>?
this[string ind]
{
get
{
if (_TractorsStorage.ContainsKey(ind))
{
return _TractorsStorage[ind];
}
return null;
}
}
}
}

View File

@ -0,0 +1,67 @@
namespace ProjectBulldozer.MovementStrategy
{
public abstract class AbstractStrategy
{
private IMoveableObject? _moveableObject;
private Status _state = Status.NotInit;
protected int FieldWidth { get; private set; }
protected int FieldHeight { get; private set; }
public Status GetStatus() { return _state; }
public void SetData(IMoveableObject moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = Status.NotInit;
return;
}
_state = Status.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
public void MakeStep()
{
if (_state != Status.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = Status.Finish;
return;
}
MoveToTarget();
}
protected bool MoveLeft() => MoveTo(DirectionType.Left);
protected bool MoveRight() => MoveTo(DirectionType.Right);
protected bool MoveUp() => MoveTo(DirectionType.Up);
protected bool MoveDown() => MoveTo(DirectionType.Down);
/// Параметры объекта
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
protected int? GetStep()
{
if (_state != Status.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
protected abstract void MoveToTarget();
protected abstract bool IsTargetDestinaion();
private bool MoveTo(DirectionType directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(directionType) ?? false)
{
_moveableObject.MoveObject(directionType);
return true;
}
return false;
}
}
}

View File

@ -0,0 +1,29 @@
using Bulldozer;
using ProjectBulldozer.MovementStrategy;
namespace ProjectBulldozer.Drawning
{
public class DrawingObjectTractor : IMoveableObject
{
private readonly DrawingTractor? _drawningTractor = null;
public DrawingObjectTractor(DrawingTractor drawningTractor)
{
_drawningTractor = drawningTractor;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_drawningTractor == null || _drawningTractor.EntityTractor == null)
{
return null;
}
return new ObjectParameters(_drawningTractor.GetPosX,
_drawningTractor.GetPosY, _drawningTractor.GetWidth, _drawningTractor.GetHeight);
}
}
public int GetStep => (int)(_drawningTractor?.EntityTractor?.Step ?? 0);
public bool CheckCanMove(DirectionType direction) => _drawningTractor?.CanMove(direction) ?? false;
public void MoveObject(DirectionType direction) => _drawningTractor?.MoveTransport(direction);
}
}

View File

@ -0,0 +1,11 @@
using Bulldozer;
namespace ProjectBulldozer.MovementStrategy
{
public interface IMoveableObject
{
ObjectParameters? GetObjectPosition { get; }
int GetStep { get; }
bool CheckCanMove(DirectionType direction);
void MoveObject(DirectionType direction);
}
}

View File

@ -0,0 +1,44 @@
namespace ProjectBulldozer.MovementStrategy
{
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null) return false;
return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal
+ GetStep() >= FieldWidth / 2 && objParams.ObjectMiddleVertical <= FieldHeight / 2 &&
objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null) return;
var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

@ -0,0 +1,21 @@
namespace ProjectBulldozer.MovementStrategy
{
public class MoveToRightCorner : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null) return false;
return objParams.RightBorder >= FieldWidth - GetStep() && objParams.DownBorder >= FieldHeight - GetStep();
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null) return;
if (objParams.RightBorder < FieldWidth - GetStep()) MoveRight();
if (objParams.DownBorder < FieldHeight - GetStep()) MoveDown();
}
}
}

View File

@ -0,0 +1,29 @@
namespace ProjectBulldozer.MovementStrategy
{
public class ObjectParameters
{
private readonly int _x;
private readonly int _y;
private readonly int _width;
private readonly int _height;
/// Левая граница
public int LeftBorder => _x;
/// Верхняя граница
public int TopBorder => _y;
/// Правая граница
public int RightBorder => _x + _width;
/// Нижняя граница
public int DownBorder => _y + _height;
/// Середина объекта по горизонтали
public int ObjectMiddleHorizontal => _x + _width / 2;
/// Середина объекта по вертикали
public int ObjectMiddleVertical => _y + _height / 2;
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}
}

View File

@ -1,17 +1,14 @@
namespace ProjectBulldozer
using ProjectBulldozer;
namespace Bulldozer
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new FormBulldozer());
Application.Run(new FormTractorCollections());
}
}
}

View File

@ -8,4 +8,19 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@ -0,0 +1,103 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ProjectBulldozer.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectBulldozer.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap down1 {
get {
object obj = ResourceManager.GetObject("down1", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap left1 {
get {
object obj = ResourceManager.GetObject("left1", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap right1 {
get {
object obj = ResourceManager.GetObject("right1", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap up1 {
get {
object obj = ResourceManager.GetObject("up1", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="down1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\down1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="left1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\left1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="right1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\right1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="up1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\up1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB