diff --git a/Excavator.sln b/Excavator.sln index 9a0de63..694cfc2 100644 --- a/Excavator.sln +++ b/Excavator.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.7.34024.191 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Excavator", "Excavator/Excavator.csproj", "{2AA7FB83-8FC3-451D-B277-158CCA4DAE44}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Excavator", "Excavator\Excavator.csproj", "{2AA7FB83-8FC3-451D-B277-158CCA4DAE44}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Excavator/Drawing/DrawingExcavator.cs b/Excavator/Drawing/DrawingExcavator.cs new file mode 100644 index 0000000..a20ef6f --- /dev/null +++ b/Excavator/Drawing/DrawingExcavator.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Excavator.Entities; + +namespace Excavator.Drawing +{ + public class DrawingExcavator : DrawingMash + { + public DrawingExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports, int width, int height) : base(speed, weight, bodyColor, width, height, 180, 110) + { + if (EntityMash != null) + { + EntityMash = new EntityExcavator(speed, weight, bodyColor, additionalColor, bucket, supports); + } + } + public override void DrawTransport(Graphics g) + { + if (EntityMash is not EntityExcavator Excavator) + { + return; + } + Pen pen = new(Color.Black); + Pen additionalPen = new(Excavator.AddColor); + Brush additionalBrush = new SolidBrush(Excavator.AddColor); + base.DrawTransport(g); + + if (Excavator.Bucket) + { + Brush additionalBrush2 = new + SolidBrush(EntityMash.BodyColor); + + g.FillRectangle(additionalBrush, _startPosX + 10, _startPosY + 42, 20, 5); + g.FillRectangle(additionalBrush, _startPosX+ 5, _startPosY + 37, 10, 50); + } + + if (Excavator.Supports) + { + g.FillRectangle(additionalBrush, _startPosX + 170, _startPosY + 47, 25, 5); + g.FillRectangle(additionalBrush, _startPosX + 180, _startPosY + 27, 15, 45); + g.FillRectangle(additionalBrush, _startPosX + 175, _startPosY + 72, 25, 5); + } + } + } +} \ No newline at end of file diff --git a/Excavator/Drawing/DrawingMash.cs b/Excavator/Drawing/DrawingMash.cs new file mode 100644 index 0000000..ab9b7bc --- /dev/null +++ b/Excavator/Drawing/DrawingMash.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Excavator.Entities; +using Excavator.Move_Strategy; + +namespace Excavator.Drawing +{ + public class DrawingMash + { + public IMoveableObject GetMoveableObject => new DrawingObjectmash(this); + public EntityMash? EntityMash { get; protected set; } + public int _pictureWidth; + public int _pictureHeight; + protected int _startPosX; + protected int _startPosY; + protected readonly int _mashWidth = 175; + protected readonly int _mashHeight = 115; + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _mashWidth; + public int GetHeight => _mashHeight; + public DrawingMash(int speed, double weight, Color bodyColor, int width, int height) + { + if (width < _mashWidth || height < _mashHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + EntityMash = new EntityMash(speed, weight, bodyColor); + } + protected DrawingMash(int speed, double weight, Color bodyColor, int width, int height, int mashWidth, int mashHeight) + { + if (width < _mashWidth || height < _mashHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + _mashWidth = mashWidth; + _mashHeight = mashHeight; + EntityMash = new EntityMash(speed, weight, bodyColor); + } + public void SetPosition(int x, int y) + { + if (x > _pictureWidth || y > _pictureHeight) + { + return; + } + _startPosX = x; + _startPosY = y; + } + public void MoveTransport(DirectionType direction) + { + if (!CanMove(direction) || EntityMash == null) + { + return; + } + switch (direction) + { + case DirectionType.Left: + if (_startPosX - EntityMash.Step > 0) + { + _startPosX -= (int)EntityMash.Step; + } + break; + case DirectionType.Up: + if (_startPosY - EntityMash.Step > 0) + { + _startPosY -= (int)EntityMash.Step; + } + break; + case DirectionType.Right: + if (_startPosX + _mashWidth + EntityMash.Step < _pictureWidth) + { + _startPosX += (int)EntityMash.Step; + } + break; + case DirectionType.Down: + if (_startPosY + _mashHeight + EntityMash.Step < _pictureHeight) + { + _startPosY += (int)EntityMash.Step; + } + break; + } + } + public virtual void DrawTransport(Graphics g) + { + Pen pen = new(Color.Black); + Brush additionalBrush = new + SolidBrush(EntityMash.BodyColor); + + g.FillRectangle(additionalBrush, _startPosX + 30, _startPosY + 31, 140, 35); + g.FillRectangle(additionalBrush, _startPosX + 60, _startPosY + 2, 15, 35); + g.FillRectangle(additionalBrush, _startPosX + 125, _startPosY + 2, 40, 40); + + Brush additionalBrush1 = new + SolidBrush(EntityMash.BodyColor); + + Brush gr = new SolidBrush(Color.Gray); + + g.FillEllipse(additionalBrush1, _startPosX + 20, _startPosY + 72, 25, 25); + g.FillEllipse(additionalBrush1, _startPosX + 145, _startPosY + 72, 25, 25); + + g.FillEllipse(gr, _startPosX + 55, _startPosY + 81, 17, 17); + g.FillEllipse(gr, _startPosX + 85, _startPosY + 81, 17, 17); + g.FillEllipse(gr, _startPosX + 110, _startPosY + 81, 17, 17); + + g.FillEllipse(gr, _startPosX + 68, _startPosY + 72, 8, 8); + g.FillEllipse(gr, _startPosX + 95, _startPosY + 72, 8, 8); + + Pen blackPen = new Pen(Color.Black, 3); + Rectangle rect1 = new Rectangle(_startPosX + 15, _startPosY + 69, 30, 30); + g.DrawArc(blackPen, rect1, 90, 180); + Rectangle rect2 = new Rectangle(_startPosX + 145, _startPosY + 69, 30, 30); + g.DrawArc(blackPen, rect2, -90, 180); + g.DrawLine(blackPen, _startPosX + 27, _startPosY + 69, _startPosX + 165, _startPosY + 69); + g.DrawLine(blackPen, _startPosX + 27, _startPosY + 99, _startPosX + 165, _startPosY + 99); + } + public bool CanMove(DirectionType direction) + { + if (EntityMash == null) + { + return false; + } + return direction switch + { + DirectionType.Left => _startPosX - EntityMash.Step > 0, + DirectionType.Up => _startPosY - EntityMash.Step > 0, + DirectionType.Right => _startPosX + _mashWidth + EntityMash.Step < _pictureWidth, + DirectionType.Down => _startPosY + _mashHeight + EntityMash.Step < _pictureHeight, + _ => false, + }; + } + } +} \ No newline at end of file diff --git a/Excavator/Entities/DirectionType.cs b/Excavator/Entities/DirectionType.cs new file mode 100644 index 0000000..d392619 --- /dev/null +++ b/Excavator/Entities/DirectionType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Entities +{ + public enum DirectionType + { + Up = 1, + Down = 2, + Left = 3, + Right = 4 + } +} \ No newline at end of file diff --git a/Excavator/Entities/EntityExcavator.cs b/Excavator/Entities/EntityExcavator.cs new file mode 100644 index 0000000..ec2f63e --- /dev/null +++ b/Excavator/Entities/EntityExcavator.cs @@ -0,0 +1,22 @@ +using Excavator.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Entities +{ + public class EntityExcavator : EntityMash + { + public Color AddColor { get; private set; } + public bool Bucket { get; private set; } + public bool Supports { get; private set; } + public EntityExcavator(int speed, double weight, Color bodyColor, Color additionalColor, bool bucket, bool supports) : base(speed, weight, bodyColor) + { + AddColor = additionalColor; + Bucket = bucket; + Supports = supports; + } + } +} \ No newline at end of file diff --git a/Excavator/Entities/EntityMash.cs b/Excavator/Entities/EntityMash.cs new file mode 100644 index 0000000..ff750f1 --- /dev/null +++ b/Excavator/Entities/EntityMash.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Entities +{ + public class EntityMash + { + 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 EntityMash(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} \ No newline at end of file diff --git a/Excavator/FormExcavator.Designer.cs b/Excavator/FormExcavator.Designer.cs index b89cd92..f6717a2 100644 --- a/Excavator/FormExcavator.Designer.cs +++ b/Excavator/FormExcavator.Designer.cs @@ -57,7 +57,6 @@ // buttonUp // this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - //this.buttonUp.BackgroundImage = global::Excavator.Properties.Resources.ArrowUp; this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.buttonUp.Location = new System.Drawing.Point(811, 377); this.buttonUp.Name = "buttonUp"; @@ -68,9 +67,8 @@ // buttonLeft // this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - //this.buttonLeft.BackgroundImage = global::Excavator.Properties.Resources.ArrowLeft; this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonLeft.Location = new System.Drawing.Point(775, 413); + this.buttonLeft.Location = new System.Drawing.Point(776, 413); this.buttonLeft.Name = "buttonLeft"; this.buttonLeft.Size = new System.Drawing.Size(30, 29); this.buttonLeft.TabIndex = 8; @@ -79,7 +77,6 @@ // buttonDown // this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - //this.buttonDown.BackgroundImage = global::Excavator.Properties.Resources.ArrowDown; this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.buttonDown.Location = new System.Drawing.Point(811, 413); this.buttonDown.Name = "buttonDown"; @@ -90,7 +87,6 @@ // buttonRight // this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - //this.buttonRight.BackgroundImage = global::Excavator.Properties.Resources.ArrowRight; this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.buttonRight.Location = new System.Drawing.Point(848, 413); this.buttonRight.Name = "buttonRight"; @@ -128,7 +124,7 @@ this.buttonCreateMash.Name = "buttonCreateMash"; this.buttonCreateMash.Size = new System.Drawing.Size(120, 74); this.buttonCreateMash.TabIndex = 13; - this.buttonCreateMash.Text = "Создать Гусеничную машину"; + this.buttonCreateMash.Text = "Создать Гусеничную Машину"; this.buttonCreateMash.UseVisualStyleBackColor = true; this.buttonCreateMash.Click += new System.EventHandler(this.buttonCreateMash_Click); // diff --git a/Excavator/FormExcavator.cs b/Excavator/FormExcavator.cs index 92bc37f..741d801 100644 --- a/Excavator/FormExcavator.cs +++ b/Excavator/FormExcavator.cs @@ -1,29 +1,33 @@ -using Excavator.DrawingObjects; -using Excavator.MovementStrategy; +using Excavator.Drawing; +using Excavator.Entities; +using Excavator.Move_Strategy; namespace Excavator { + public partial class FormExcavator : Form { - private DrawingMash? _drawingMash; + private DrawingMash? _DrawingMash; private AbstractStrategy? _abstractStrategy; - public DrawingMash? SelectedMash { get; private set; } + public DrawingMash? Selectedmash { get; private set; } + public FormExcavator() { InitializeComponent(); _abstractStrategy = null; - SelectedMash = null; + Selectedmash = null; } private void Draw() { - if (_drawingMash == null) + if (_DrawingMash == null) { return; } Bitmap bmp = new(pictureBoxExcavator.Width, pictureBoxExcavator.Height); Graphics gr = Graphics.FromImage(bmp); - _drawingMash.DrawTransport(gr); + _DrawingMash.DrawTransport(gr); pictureBoxExcavator.Image = bmp; + } private void buttonCreateExcavator_Click(object sender, EventArgs e) { @@ -33,16 +37,19 @@ namespace Excavator Color color1 = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)); ColorDialog dialog = new(); - ColorDialog dialog1 = new(); - if (dialog.ShowDialog() == DialogResult.OK && dialog1.ShowDialog() == DialogResult.OK) + if (dialog.ShowDialog() == DialogResult.OK) { color = dialog.Color; + } + ColorDialog dialog1 = new(); + if (dialog1.ShowDialog() == DialogResult.OK) + { color1 = dialog1.Color; } - _drawingMash = new DrawingExcavator(random.Next(100, 300), + _DrawingMash = new DrawingExcavator(random.Next(100, 300), random.Next(1000, 3000), color, color1, true, true, pictureBoxExcavator.Width, pictureBoxExcavator.Height); - _drawingMash.SetPosition(random.Next(10, 100), random.Next(10, + _DrawingMash.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } @@ -56,15 +63,15 @@ namespace Excavator { color = dialog.Color; } - _drawingMash = new DrawingMash(random.Next(100, 300), + _DrawingMash = new DrawingMash(random.Next(100, 300), random.Next(1000, 3000), color, pictureBoxExcavator.Width, pictureBoxExcavator.Height); - _drawingMash.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _DrawingMash.SetPosition(random.Next(10, 100), random.Next(10,100)); Draw(); } private void buttonMove_Click(object sender, EventArgs e) { - if (_drawingMash == null) + if (_DrawingMash == null) { return; } @@ -72,23 +79,23 @@ namespace Excavator switch (name) { case "buttonUp": - _drawingMash.MoveTransport(DirectionType.Up); + _DrawingMash.MoveTransport(DirectionType.Up); break; case "buttonDown": - _drawingMash.MoveTransport(DirectionType.Down); + _DrawingMash.MoveTransport(DirectionType.Down); break; case "buttonLeft": - _drawingMash.MoveTransport(DirectionType.Left); + _DrawingMash.MoveTransport(DirectionType.Left); break; case "buttonRight": - _drawingMash.MoveTransport(DirectionType.Right); + _DrawingMash.MoveTransport(DirectionType.Right); break; } Draw(); } private void buttonStep_Click(object sender, EventArgs e) { - if (_drawingMash == null) + if (_DrawingMash == null) { return; } @@ -105,7 +112,7 @@ namespace Excavator { return; } - _abstractStrategy.SetData(new DrawingObjectMash(_drawingMash), pictureBoxExcavator.Width, pictureBoxExcavator.Height); + _abstractStrategy.SetData(new DrawingObjectmash(_DrawingMash), pictureBoxExcavator.Width, pictureBoxExcavator.Height); comboBoxStrategy.Enabled = false; } if (_abstractStrategy == null) @@ -120,9 +127,10 @@ namespace Excavator _abstractStrategy = null; } } + private void buttonSelect_Click(object sender, EventArgs e) { - SelectedMash = _drawingMash; + Selectedmash = _DrawingMash; DialogResult = DialogResult.OK; } } diff --git a/Excavator/FormExcavatorCollection.Designer.cs b/Excavator/FormExcavatorCollection.Designer.cs new file mode 100644 index 0000000..73627b9 --- /dev/null +++ b/Excavator/FormExcavatorCollection.Designer.cs @@ -0,0 +1,192 @@ +namespace Excavator +{ + partial class FormExcavatorCollection + { + private System.ComponentModel.IContainer components = null; + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonAddmash = new System.Windows.Forms.Button(); + this.pictureBoxCollection = new System.Windows.Forms.PictureBox(); + this.labelInstruments = new System.Windows.Forms.Label(); + this.buttonUpdate = new System.Windows.Forms.Button(); + this.buttonDeletemash = new System.Windows.Forms.Button(); + this.colorDialog = new System.Windows.Forms.ColorDialog(); + this.maskedTextBoxNumber = new System.Windows.Forms.MaskedTextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.listBoxStorages = new System.Windows.Forms.ListBox(); + this.buttonAddStorage = new System.Windows.Forms.Button(); + this.buttonDeleteStorage = new System.Windows.Forms.Button(); + this.textBoxStorageName = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).BeginInit(); + this.SuspendLayout(); + // + // buttonAddmash + // + this.buttonAddmash.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAddmash.Location = new System.Drawing.Point(761, 441); + this.buttonAddmash.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.buttonAddmash.Name = "buttonAddmash"; + this.buttonAddmash.Size = new System.Drawing.Size(135, 37); + this.buttonAddmash.TabIndex = 0; + this.buttonAddmash.Text = "Добавить автобус"; + this.buttonAddmash.UseVisualStyleBackColor = true; + this.buttonAddmash.Click += new System.EventHandler(this.buttonAddmash_Click); + // + // pictureBoxCollection + // + this.pictureBoxCollection.Location = new System.Drawing.Point(3, 0); + this.pictureBoxCollection.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.pictureBoxCollection.Name = "pictureBoxCollection"; + this.pictureBoxCollection.Size = new System.Drawing.Size(730, 581); + this.pictureBoxCollection.TabIndex = 1; + this.pictureBoxCollection.TabStop = false; + // + // labelInstruments + // + this.labelInstruments.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelInstruments.AutoSize = true; + this.labelInstruments.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.labelInstruments.Location = new System.Drawing.Point(761, 0); + this.labelInstruments.Name = "labelInstruments"; + this.labelInstruments.Size = new System.Drawing.Size(136, 28); + this.labelInstruments.TabIndex = 2; + this.labelInstruments.Text = "Инструменты"; + // + // buttonUpdate + // + this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUpdate.Location = new System.Drawing.Point(752, 173); + this.buttonUpdate.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.buttonUpdate.Name = "buttonUpdate"; + this.buttonUpdate.Size = new System.Drawing.Size(150, 33); + this.buttonUpdate.TabIndex = 3; + this.buttonUpdate.Text = "Обновить набор"; + this.buttonUpdate.UseVisualStyleBackColor = true; + this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click); + // + // buttonDeletemash + // + this.buttonDeletemash.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDeletemash.Location = new System.Drawing.Point(761, 525); + this.buttonDeletemash.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.buttonDeletemash.Name = "buttonDeletemash"; + this.buttonDeletemash.Size = new System.Drawing.Size(135, 37); + this.buttonDeletemash.TabIndex = 4; + this.buttonDeletemash.Text = "Удалить объект"; + this.buttonDeletemash.UseVisualStyleBackColor = true; + this.buttonDeletemash.Click += new System.EventHandler(this.buttonDeletemash_Click); + // + // maskedTextBoxNumber + // + this.maskedTextBoxNumber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.maskedTextBoxNumber.Location = new System.Drawing.Point(752, 487); + this.maskedTextBoxNumber.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.maskedTextBoxNumber.Mask = "00"; + this.maskedTextBoxNumber.Name = "maskedTextBoxNumber"; + this.maskedTextBoxNumber.Size = new System.Drawing.Size(157, 27); + this.maskedTextBoxNumber.TabIndex = 5; + this.maskedTextBoxNumber.ValidatingType = typeof(int); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(752, 51); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(66, 20); + this.label1.TabIndex = 7; + this.label1.Text = "Наборы"; + // + // listBoxStorages + // + this.listBoxStorages.FormattingEnabled = true; + this.listBoxStorages.ItemHeight = 20; + this.listBoxStorages.Location = new System.Drawing.Point(751, 212); + this.listBoxStorages.Name = "listBoxStorages"; + this.listBoxStorages.Size = new System.Drawing.Size(150, 144); + this.listBoxStorages.TabIndex = 8; + this.listBoxStorages.SelectedIndexChanged += new System.EventHandler(this.listBoxObjects_SelectedIndexChanged); + // + // buttonAddStorage + // + this.buttonAddStorage.Location = new System.Drawing.Point(751, 135); + this.buttonAddStorage.Name = "buttonAddStorage"; + this.buttonAddStorage.Size = new System.Drawing.Size(150, 33); + this.buttonAddStorage.TabIndex = 9; + this.buttonAddStorage.Text = "Добавить набор"; + this.buttonAddStorage.UseVisualStyleBackColor = true; + this.buttonAddStorage.Click += new System.EventHandler(this.buttonAddStorage_Click); + // + // buttonDeleteStorage + // + this.buttonDeleteStorage.Location = new System.Drawing.Point(751, 363); + this.buttonDeleteStorage.Name = "buttonDeleteStorage"; + this.buttonDeleteStorage.Size = new System.Drawing.Size(150, 33); + this.buttonDeleteStorage.TabIndex = 10; + this.buttonDeleteStorage.Text = "Удалить набор"; + this.buttonDeleteStorage.UseVisualStyleBackColor = true; + this.buttonDeleteStorage.Click += new System.EventHandler(this.buttonDeleteStorage_Click); + // + // textBoxStorageName + // + this.textBoxStorageName.Location = new System.Drawing.Point(751, 101); + this.textBoxStorageName.Name = "textBoxStorageName"; + this.textBoxStorageName.Size = new System.Drawing.Size(150, 27); + this.textBoxStorageName.TabIndex = 11; + // + // FormExcavatorCollection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(926, 591); + this.Controls.Add(this.textBoxStorageName); + this.Controls.Add(this.buttonDeleteStorage); + this.Controls.Add(this.buttonAddStorage); + this.Controls.Add(this.listBoxStorages); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonAddmash); + this.Controls.Add(this.maskedTextBoxNumber); + this.Controls.Add(this.buttonDeletemash); + this.Controls.Add(this.buttonUpdate); + this.Controls.Add(this.labelInstruments); + this.Controls.Add(this.pictureBoxCollection); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.Name = "FormExcavatorCollection"; + this.Text = "Набор объектов"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Button buttonAddmash; + private PictureBox pictureBoxCollection; + private Label labelInstruments; + private Button buttonUpdate; + private Button buttonDeletemash; + private ColorDialog colorDialog; + private MaskedTextBox maskedTextBoxNumber; + private Label label1; + private ListBox listBoxStorages; + private Button buttonAddStorage; + private Button buttonDeleteStorage; + private TextBox textBoxStorageName; + } +} \ No newline at end of file diff --git a/Excavator/FormExcavatorCollection.cs b/Excavator/FormExcavatorCollection.cs new file mode 100644 index 0000000..f053d88 --- /dev/null +++ b/Excavator/FormExcavatorCollection.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Excavator.Generic; +using Excavator.Drawing; +using Excavator.Move_Strategy; + +namespace Excavator +{ + public partial class FormExcavatorCollection : Form + { + private readonly MashsGenericStorage _storage; + public FormExcavatorCollection() + { + InitializeComponent(); + _storage = new MashsGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); + } + private void ReloadObjects() + { + int index = listBoxStorages.SelectedIndex; + listBoxStorages.Items.Clear(); + for (int i = 0; i < _storage.Keys.Count; i++) + { + listBoxStorages.Items.Add(_storage.Keys[i]); + } + if (listBoxStorages.Items.Count > 0 && (index == -1 || index >= listBoxStorages.Items.Count)) + { + listBoxStorages.SelectedIndex = 0; + } + else if (listBoxStorages.Items.Count > 0 && index > -1 && index < listBoxStorages.Items.Count) + { + listBoxStorages.SelectedIndex = index; + } + } + private void buttonAddStorage_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxStorageName.Text)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _storage.AddSet(textBoxStorageName.Text); + ReloadObjects(); + } + private void listBoxObjects_SelectedIndexChanged(object sender, EventArgs e) + { + pictureBoxCollection.Image = _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.Showmash(); + } + private void buttonDeleteStorage_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + _storage.DelSet(listBoxStorages.SelectedItem.ToString() ?? string.Empty); + ReloadObjects(); + } + } + private void buttonAddmash_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + MessageBox.Show("Не выбран набор"); + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; + if (obj == null) + { + return; + } + FormExcavator form = new(); + if (form.ShowDialog() == DialogResult.OK) + { + if (obj + form.Selectedmash != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBoxCollection.Image = obj.Showmash(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + } + private void buttonDeletemash_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; + if (obj == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + int pos = 0; + try + { + pos = Convert.ToInt32(maskedTextBoxNumber.Text); + } + catch + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (obj - pos) + { + MessageBox.Show("Объект удален"); + pictureBoxCollection.Image = obj.Showmash(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + } + private void buttonUpdate_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? + string.Empty]; + if (obj == null) + { + return; + } + pictureBoxCollection.Image = obj.Showmash(); + } + } +} diff --git a/Excavator/FormExcavatorCollection.resx b/Excavator/FormExcavatorCollection.resx new file mode 100644 index 0000000..f1dbd20 --- /dev/null +++ b/Excavator/FormExcavatorCollection.resx @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 36 + + \ No newline at end of file diff --git a/Excavator/Generic/MashGenericCollection.cs b/Excavator/Generic/MashGenericCollection.cs new file mode 100644 index 0000000..bd5dc3c --- /dev/null +++ b/Excavator/Generic/MashGenericCollection.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Excavator.Drawing; +using Excavator.Move_Strategy; + +namespace Excavator.Generic +{ + internal class MashGenericCollection + where T : DrawingMash + where U : IMoveableObject + { + private readonly int _pictureWidth; + private readonly int _pictureHeight; + private readonly int _placeSizeWidth = 200; + private readonly int _placeSizeHeight = 120; + private readonly SetGeneric _collection; + public MashGenericCollection(int picWidth, int picHeight) + { + int width = picWidth / _placeSizeWidth; + int height = picHeight / _placeSizeHeight; + _pictureWidth = picWidth; + _pictureHeight = picHeight; + + _collection = new SetGeneric(width * height); + } + public static int operator +(MashGenericCollection collect, T? obj) + { + if (obj != null) + { + return collect._collection.Insert(obj); + } + return -1; + } + public static bool operator -(MashGenericCollection collect, int pos) + { + if (collect._collection.Getmash(pos) == null) + { + return false; + } + return collect?._collection.Remove(pos) ?? false; + } + public U? GetU(int pos) + { + return (U?)_collection[pos]?.GetMoveableObject; + } + public int ReturnLength() + { + return _collection.Count; + } + public Bitmap Showmash() + { + Bitmap bmp = new(_pictureWidth, _pictureHeight); + Graphics gr = Graphics.FromImage(bmp); + DrawBackground(gr); + DrawObjects(gr); + return bmp; + } + private void DrawBackground(Graphics gr) + { + Pen pen = new(Color.Black, 3); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; ++i) + { + for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + { + gr.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); + gr.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); + } + } + } + private void DrawObjects(Graphics g) + { + int x = _pictureWidth / _placeSizeWidth - 1; + int y = 0; + foreach (var mash in _collection.Getmash()) + { + if (mash != null) + { + if (x < 0) + { + x = _pictureWidth / _placeSizeWidth - 1; + ++y; + } + mash.SetPosition(_placeSizeWidth * x, _placeSizeHeight * y); + mash.DrawTransport(g); + --x; + } + } + } + } +} \ No newline at end of file diff --git a/Excavator/Generic/MashsGenericStorage.cs b/Excavator/Generic/MashsGenericStorage.cs new file mode 100644 index 0000000..51d4ac4 --- /dev/null +++ b/Excavator/Generic/MashsGenericStorage.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Excavator.Drawing; +using Excavator.Move_Strategy; + +namespace Excavator.Generic +{ + internal class MashsGenericStorage + { + readonly Dictionary> _mashStorages; + public List Keys => _mashStorages.Keys.ToList(); + private readonly int _pictureWidth; + private readonly int _pictureHeight; + + public MashsGenericStorage(int pictureWidth, int pictureHeight) + { + _mashStorages = new Dictionary>(); + _pictureWidth = pictureWidth; + _pictureHeight = pictureHeight; + } + public void AddSet(string name) + { + foreach (string nameStorage in Keys) + { + if (nameStorage == name) + { + MessageBox.Show("Набор с заданным именем уже есть", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + _mashStorages.Add(name, new MashGenericCollection(_pictureWidth, _pictureHeight)); + } + public void DelSet(string name) + { + if (_mashStorages.ContainsKey(name)) + { + _mashStorages.Remove(name); + } + + } + public MashGenericCollection? this[string ind] + { + get + { + if (_mashStorages.ContainsKey(ind)) + { + return _mashStorages[ind]; + } + return null; + } + } + } +} diff --git a/Excavator/Generic/SetGeneric.cs b/Excavator/Generic/SetGeneric.cs new file mode 100644 index 0000000..8d59117 --- /dev/null +++ b/Excavator/Generic/SetGeneric.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Generic +{ + internal class SetGeneric + where T : class + { + private readonly List _places; + public int Count => _places.Count; + private readonly int _maxCount; + public SetGeneric(int count) + { + _maxCount = count; + _places = new List(count); + } + public int Insert(T mash) + { + _places.Insert(0, mash); + return 0; + } + public bool Insert(T mash, int position) + { + if (position < 0 || position >= Count || Count >= _maxCount) + { + return false; + } + _places.Insert(position, mash); + return true; + } + public bool Remove(int position) + { + if (position < 0 || position >= Count) + { + return false; + } + _places.RemoveAt(position); + return true; + } + 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 Getmash(int? maxmash = null) + { + for (int i = 0; i < _places.Count; ++i) + { + yield return _places[i]; + if (maxmash.HasValue && i == maxmash.Value) + { + yield break; + } + } + } + } +} diff --git a/Excavator/Move_Strategy/AbstractStrategy.cs b/Excavator/Move_Strategy/AbstractStrategy.cs new file mode 100644 index 0000000..a307eee --- /dev/null +++ b/Excavator/Move_Strategy/AbstractStrategy.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Excavator.Entities; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace Excavator.Move_Strategy +{ + 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; + } + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/DrawingObjectBus.cs b/Excavator/Move_Strategy/DrawingObjectBus.cs new file mode 100644 index 0000000..06feec6 --- /dev/null +++ b/Excavator/Move_Strategy/DrawingObjectBus.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; + +using Excavator.Entities; +using Excavator.Drawing; + +namespace Excavator.Move_Strategy +{ + public class DrawingObjectmash : IMoveableObject + { + private readonly DrawingMash? _DrawingMash = null; + public DrawingObjectmash(DrawingMash DrawingMash) + { + _DrawingMash = DrawingMash; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_DrawingMash == null || _DrawingMash.EntityMash == null) + { + return null; + } + return new ObjectParameters(_DrawingMash.GetPosX, _DrawingMash.GetPosY, _DrawingMash.GetWidth, _DrawingMash.GetHeight); + } + } + public int GetStep => (int)(_DrawingMash?.EntityMash?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _DrawingMash?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _DrawingMash?.MoveTransport(direction); + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/IMoveableObject.cs b/Excavator/Move_Strategy/IMoveableObject.cs new file mode 100644 index 0000000..1a83719 --- /dev/null +++ b/Excavator/Move_Strategy/IMoveableObject.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Excavator.Drawing; +using Excavator.Entities; + +namespace Excavator.Move_Strategy +{ + public interface IMoveableObject + { + ObjectParameters? GetObjectPosition { get; } + int GetStep { get; } + bool CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/MoveToBorder.cs b/Excavator/Move_Strategy/MoveToBorder.cs new file mode 100644 index 0000000..54e9fd4 --- /dev/null +++ b/Excavator/Move_Strategy/MoveToBorder.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Move_Strategy +{ + internal class MoveToBorder : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.RightBorder <= FieldWidth && + objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder <= FieldHeight && + objParams.DownBorder + GetStep() >= FieldHeight; + } + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = objParams.ObjectMiddleHorizontal - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.ObjectMiddleVertical - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/MoveToCenter.cs b/Excavator/Move_Strategy/MoveToCenter.cs new file mode 100644 index 0000000..5196e4a --- /dev/null +++ b/Excavator/Move_Strategy/MoveToCenter.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Move_Strategy +{ + 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(); + } + } + } + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/ObjectParameters.cs b/Excavator/Move_Strategy/ObjectParameters.cs new file mode 100644 index 0000000..cc0e999 --- /dev/null +++ b/Excavator/Move_Strategy/ObjectParameters.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Move_Strategy +{ + 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; + } + } +} \ No newline at end of file diff --git a/Excavator/Move_Strategy/Status.cs b/Excavator/Move_Strategy/Status.cs new file mode 100644 index 0000000..c7af06c --- /dev/null +++ b/Excavator/Move_Strategy/Status.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Excavator.Move_Strategy +{ + public enum Status + { + NotInit, + InProgress, + Finish + } +} \ No newline at end of file diff --git a/Excavator/Program.cs b/Excavator/Program.cs index 476326d..cc3f9ab 100644 --- a/Excavator/Program.cs +++ b/Excavator/Program.cs @@ -6,7 +6,7 @@ namespace Excavator static void Main() { ApplicationConfiguration.Initialize(); - Application.Run(new FormMashCollection()); + Application.Run(new FormExcavatorCollection()); } } } \ No newline at end of file diff --git a/Excavator/Properties/Resources.resx b/Excavator/Properties/Resources.resx index c998c95..aebcb60 100644 --- a/Excavator/Properties/Resources.resx +++ b/Excavator/Properties/Resources.resx @@ -118,16 +118,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\ArrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ArrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\ArrowUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ArrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\ArrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ArrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file