diff --git a/.gitignore b/.gitignore index ca1c7a3..e0dfc29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,85 +1,46 @@ -# ---> VisualStudio -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore +# The following command works for downloading when using Git for Windows: +# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore +# +# Download this file using PowerShell v3 under Windows with the following comand: +# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore +# +# or wget: +# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore # User-specific files -*.rsuser *.suo *.user -*.userosscache *.sln.docstates -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - # Build results [Dd]ebug/ -[Dd]ebugPublic/ [Rr]elease/ -[Rr]eleases/ x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ [Bb]in/ [Oo]bj/ -[Ll]og/ -[Ll]ogs/ +# build folder is nowadays used for build scripts and should not be ignored +#build/ -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio *_i.c *_p.c -*_h.h *.ilk *.meta *.obj -*.iobj *.pch *.pdb -*.ipdb *.pgc *.pgd *.rsp @@ -89,41 +50,25 @@ StyleCopReport.xml *.tlh *.tmp *.tmp_proj -*_wpftmp.csproj *.log -*.tlog *.vspscc *.vssscc .builds *.pidb -*.svclog *.scc -# Chutzpah Test files -_Chutzpah* - # Visual C++ cache files ipch/ *.aps *.ncb -*.opendb *.opensdf *.sdf *.cachefile -*.VC.db -*.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ # Guidance Automation Toolkit *.gpState @@ -131,7 +76,6 @@ $tf/ # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper -*.DotSettings.user # TeamCity is a build add-in _TeamCity* @@ -139,30 +83,9 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - # NCrunch -_NCrunch_* +*.ncrunch* .*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ # Installshield output folder [Ee]xpress/ @@ -181,220 +104,124 @@ DocProject/Help/html publish/ # Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj +*.Publish.xml -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ +# Windows Azure Build Output +csx *.build.csdef -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files +# Windows Store app package directory AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ # Others +*.Cache ClientBin/ +[Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.dbproj.schemaview -*.jfm +*.[Pp]ublish.xml *.pfx *.publishsettings -orleans.codegen.cs +modulesbin/ +tempbin/ -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ +# EPiServer Site file (VPP) +AppData/ # RIA/Silverlight projects Generated_Code/ -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak + +# vim +*.txt~ +*.swp +*.swo + +# Temp files when opening LibreOffice on ubuntu +.~lock.* + +# svn +.svn + +# CVS - Source Control +**/CVS/ + +# Remainings from resolving conflicts in Source Control +*.orig # SQL Server files -*.mdf -*.ldf -*.ndf +**/App_Data/*.mdf +**/App_Data/*.ldf +**/App_Data/*.sdf -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl -# Microsoft Fakes -FakesAssemblies/ +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml -# GhostDoc plugin setting file -*.GhostDoc.xml +# ========================= +# Windows detritus +# ========================= -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ +# Windows image file caches +Thumbs.db +ehthumbs.db -# Visual Studio 6 build log -*.plg +# Folder config file +Desktop.ini -# Visual Studio 6 workspace options file -*.opt +# Recycle Bin used on file shares +$RECYCLE.BIN/ -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw +# OS generated files # +Icon? -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp +# Mac desktop service store files +.DS_Store -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp +# SASS Compiler cache +.sass-cache -# Visual Studio 6 technical files -*.ncb -*.aps +# Visual Studio 2014 CTP +**/*.sln.ide -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions +# Visual Studio temp something +.vs/ -# Paket dependency manager -.paket/paket.exe -paket-files/ +# dotnet stuff +project.lock.json -# FAKE - F# Make -.fake/ +# VS 2015+ +*.vc.vc.opendb +*.vc.db -# CodeRush personal settings -.cr/personal +# Rider +.idea/ -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc +# Visual Studio Code +.vscode/ -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config +# Output folder used by Webpack or other FE stuff +**/node_modules/* +**/wwwroot/* -# Tabs Studio -*.tss +# SpecFlow specific +*.feature.cs +*.feature.xlsx.* +*.Specs_*.html -# Telerik's JustMock configuration file -*.jmconfig +# UWP Projects +AppPackages/ -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml +##### +# End of core ignore list, below put you custom 'per project' settings (patterns or path) +##### diff --git a/ProjectAntiAircraftGun/Form1.Designer.cs b/ProjectAntiAircraftGun/Form1.Designer.cs deleted file mode 100644 index f0a04d1..0000000 --- a/ProjectAntiAircraftGun/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectAntiAircraftGun -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - 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.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} \ No newline at end of file diff --git a/ProjectAntiAircraftGun/Form1.cs b/ProjectAntiAircraftGun/Form1.cs deleted file mode 100644 index c5553d6..0000000 --- a/ProjectAntiAircraftGun/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectAntiAircraftGun -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/ProjectAntiAircraftGun/Program.cs b/ProjectAntiAircraftGun/Program.cs deleted file mode 100644 index f60dd13..0000000 --- a/ProjectAntiAircraftGun/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace ProjectAntiAircraftGun -{ - internal static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); - } - } -} \ No newline at end of file diff --git a/ProjectAntiAircraftGun/ProjectAntiAircraftGun.csproj b/ProjectAntiAircraftGun/ProjectAntiAircraftGun.csproj deleted file mode 100644 index e1a0735..0000000 --- a/ProjectAntiAircraftGun/ProjectAntiAircraftGun.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - WinExe - net7.0-windows - enable - true - enable - - - \ No newline at end of file diff --git a/ProjectLiner/.vs/ProjectEvaluation/projectliner.metadata.v7.bin b/ProjectLiner/.vs/ProjectEvaluation/projectliner.metadata.v7.bin new file mode 100644 index 0000000..5606952 Binary files /dev/null and b/ProjectLiner/.vs/ProjectEvaluation/projectliner.metadata.v7.bin differ diff --git a/ProjectLiner/.vs/ProjectEvaluation/projectliner.projects.v7.bin b/ProjectLiner/.vs/ProjectEvaluation/projectliner.projects.v7.bin new file mode 100644 index 0000000..46ec9e3 Binary files /dev/null and b/ProjectLiner/.vs/ProjectEvaluation/projectliner.projects.v7.bin differ diff --git a/ProjectLiner/.vs/ProjectLiner/DesignTimeBuild/.dtbcache.v2 b/ProjectLiner/.vs/ProjectLiner/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000..ff0cefe Binary files /dev/null and b/ProjectLiner/.vs/ProjectLiner/DesignTimeBuild/.dtbcache.v2 differ diff --git a/ProjectLiner/.vs/ProjectLiner/v17/.futdcache.v2 b/ProjectLiner/.vs/ProjectLiner/v17/.futdcache.v2 new file mode 100644 index 0000000..0e041da Binary files /dev/null and b/ProjectLiner/.vs/ProjectLiner/v17/.futdcache.v2 differ diff --git a/ProjectLiner/.vs/ProjectLiner/v17/DocumentLayout.json b/ProjectLiner/.vs/ProjectLiner/v17/DocumentLayout.json new file mode 100644 index 0000000..3ce5baf --- /dev/null +++ b/ProjectLiner/.vs/ProjectLiner/v17/DocumentLayout.json @@ -0,0 +1,282 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\formlinercollection.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\formlinercollection.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\collectiongenericobjects\\listgenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\listgenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\exceptions\\objectisequalexception.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\exceptions\\objectisequalexception.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\drawnings\\drawininglinerequtables.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\drawnings\\drawininglinerequtables.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\collectiongenericobjects\\abstractcompany.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\abstractcompany.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\formlinerconfig.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\formlinerconfig.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\collectiongenericobjects\\massivegenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\massivegenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\formlinerconfig.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\formlinerconfig.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\formlinercollection.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\formlinercollection.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\collectiongenericobjects\\storagecollection.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\storagecollection.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\collectiongenericobjects\\collectioninfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\collectioninfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\collectiongenericobjects\\icollectiongenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\collectiongenericobjects\\icollectiongenericobjects.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|c:\\somegitstuff\\isebd-11_khatypov_k.r_fundamental\\projectliner\\projectliner\\drawnings\\drawninglinercomparebycolor .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\drawnings\\drawninglinercomparebycolor .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\drawnings\\drawninglinercomparebytype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\drawnings\\drawninglinercomparebytype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\projectliner\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{7FB62E78-175F-490A-B5F2-2FF676947033}|ProjectLiner\\ProjectLiner.csproj|solutionrelative:projectliner\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 6, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + }, + { + "$type": "Document", + "DocumentIndex": 7, + "Title": "FormLinerConfig.Designer.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerConfig.Designer.cs", + "RelativeDocumentMoniker": "ProjectLiner\\FormLinerConfig.Designer.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerConfig.Designer.cs", + "RelativeToolTip": "ProjectLiner\\FormLinerConfig.Designer.cs", + "ViewState": "AQIAAJkAAAAAAAAAAAAYwKkAAAA6AAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-14T01:36:11.653Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "FormLinerConfig.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerConfig.cs", + "RelativeDocumentMoniker": "ProjectLiner\\FormLinerConfig.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerConfig.cs", + "RelativeToolTip": "ProjectLiner\\FormLinerConfig.cs", + "ViewState": "AQIAAGsAAAAAAAAAAAAhwH0AAAAMAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-14T01:36:06.638Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "ObjectIsEqualException.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Exceptions\\ObjectIsEqualException.cs", + "RelativeDocumentMoniker": "ProjectLiner\\Exceptions\\ObjectIsEqualException.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Exceptions\\ObjectIsEqualException.cs", + "RelativeToolTip": "ProjectLiner\\Exceptions\\ObjectIsEqualException.cs", + "ViewState": "AQIAAAAAAAAAAAAAAAAAAAoAAABaAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-14T01:32:17.541Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 10, + "Title": "CollectionInfo.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\CollectionInfo.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\CollectionInfo.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\CollectionInfo.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\CollectionInfo.cs", + "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-13T11:28:27.537Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "FormLinerCollection.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerCollection.cs", + "RelativeDocumentMoniker": "ProjectLiner\\FormLinerCollection.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerCollection.cs", + "RelativeToolTip": "ProjectLiner\\FormLinerCollection.cs", + "ViewState": "AQIAADgAAAAAAAAAAAAAAFcAAAA+AAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-13T11:10:13.389Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 8, + "Title": "FormLinerCollection.Designer.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerCollection.Designer.cs", + "RelativeDocumentMoniker": "ProjectLiner\\FormLinerCollection.Designer.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\FormLinerCollection.Designer.cs", + "RelativeToolTip": "ProjectLiner\\FormLinerCollection.Designer.cs", + "ViewState": "AQIAAGAAAAAAAAAAAAAYwEkBAAAmAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-06-13T11:08:24.165Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 12, + "Title": "DrawningLinerCompareByColor .cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawningLinerCompareByColor .cs", + "RelativeDocumentMoniker": "ProjectLiner\\Drawnings\\DrawningLinerCompareByColor .cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawningLinerCompareByColor .cs", + "RelativeToolTip": "ProjectLiner\\Drawnings\\DrawningLinerCompareByColor .cs", + "ViewState": "AQIAAAAAAAAAAAAAAAAAABIAAAAkAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T11:44:30.653Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 13, + "Title": "DrawningLinerCompareByType.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawningLinerCompareByType.cs", + "RelativeDocumentMoniker": "ProjectLiner\\Drawnings\\DrawningLinerCompareByType.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawningLinerCompareByType.cs", + "RelativeToolTip": "ProjectLiner\\Drawnings\\DrawningLinerCompareByType.cs", + "ViewState": "AQIAAAAAAAAAAAAAAAAAABoAAAA7AAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T11:41:01.766Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "DrawiningLinerEqutables.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawiningLinerEqutables.cs", + "RelativeDocumentMoniker": "ProjectLiner\\Drawnings\\DrawiningLinerEqutables.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Drawnings\\DrawiningLinerEqutables.cs", + "RelativeToolTip": "ProjectLiner\\Drawnings\\DrawiningLinerEqutables.cs", + "ViewState": "AQIAAB4AAAAAAAAAAAApwDMAAAAEAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T11:34:01.546Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 14, + "Title": "Program.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Program.cs", + "RelativeDocumentMoniker": "ProjectLiner\\Program.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\Program.cs", + "RelativeToolTip": "ProjectLiner\\Program.cs", + "ViewState": "AQIAAAYAAAAAAAAAAAAcwBkAAABJAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T11:10:44.695Z" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "AbstractCompany.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\AbstractCompany.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\AbstractCompany.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\AbstractCompany.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\AbstractCompany.cs", + "ViewState": "AQIAACAAAAAAAAAAAAAhwDQAAAAIAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T09:30:13.822Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 9, + "Title": "StorageCollection.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\StorageCollection.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\StorageCollection.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\StorageCollection.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\StorageCollection.cs", + "ViewState": "AQIAAAAAAAAAAAAAAAAAABUAAAARAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T09:26:56.734Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "ICollectionGenericObjects.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\ICollectionGenericObjects.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\ICollectionGenericObjects.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\ICollectionGenericObjects.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\ICollectionGenericObjects.cs", + "ViewState": "AQIAABkAAAAAAAAAAAAYwBQAAAA8AAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T08:45:24.02Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "ListGenericObjects.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\ListGenericObjects.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\ListGenericObjects.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\ListGenericObjects.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\ListGenericObjects.cs", + "ViewState": "AQIAACgAAAAAAAAAAAAwwDMAAAAQAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T08:44:54.793Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "MassiveGenericObjects.cs", + "DocumentMoniker": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\MassiveGenericObjects.cs", + "RelativeDocumentMoniker": "ProjectLiner\\CollectionGenericObjects\\MassiveGenericObjects.cs", + "ToolTip": "C:\\SomeGitStuff\\ISEbd-11_Khatypov_K.R_fundamental\\ProjectLiner\\ProjectLiner\\CollectionGenericObjects\\MassiveGenericObjects.cs", + "RelativeToolTip": "ProjectLiner\\CollectionGenericObjects\\MassiveGenericObjects.cs", + "ViewState": "AQIAADkAAAAAAAAAAAAuwFkAAAAJAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-05-22T08:45:00.199Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ProjectAntiAircraftGun/ProjectAntiAircraftGun.sln b/ProjectLiner/ProjectLiner.sln similarity index 55% rename from ProjectAntiAircraftGun/ProjectAntiAircraftGun.sln rename to ProjectLiner/ProjectLiner.sln index 71ca527..57ac0bd 100644 --- a/ProjectAntiAircraftGun/ProjectAntiAircraftGun.sln +++ b/ProjectLiner/ProjectLiner.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.6.33815.320 +VisualStudioVersion = 17.8.34330.188 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectAntiAircraftGun", "ProjectAntiAircraftGun.csproj", "{0C215558-2860-459F-A04D-5BCE3792F5CC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectLiner", "ProjectLiner\ProjectLiner.csproj", "{7FB62E78-175F-490A-B5F2-2FF676947033}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,15 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0C215558-2860-459F-A04D-5BCE3792F5CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C215558-2860-459F-A04D-5BCE3792F5CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C215558-2860-459F-A04D-5BCE3792F5CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C215558-2860-459F-A04D-5BCE3792F5CC}.Release|Any CPU.Build.0 = Release|Any CPU + {7FB62E78-175F-490A-B5F2-2FF676947033}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FB62E78-175F-490A-B5F2-2FF676947033}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FB62E78-175F-490A-B5F2-2FF676947033}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7FB62E78-175F-490A-B5F2-2FF676947033}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {2A46C0F6-1F06-4A83-A51A-7BC26DD276FF} + SolutionGuid = {78BFA3C9-3BCC-4037-9217-9197133D11B5} EndGlobalSection EndGlobal diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..e448c88 --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,106 @@ +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Drawnings; + +namespace ProjectLiner.CollectionGenericObjects; + +public abstract class AbstractCompany +{ + /// + /// Размер места (ширина) + /// + protected readonly int _placeSizeWidth = 210; + /// + /// Размер места (высота) + /// + protected readonly int _placeSizeHeight = 150; + /// + /// Ширина окна + /// + protected readonly int _pictureWidth; + /// + /// Высота окна + /// + protected readonly int _pictureHeight; + /// + /// Коллекция судов + /// + protected ICollectionGenericObjects? _collection = null; + /// + /// Вычисление максимального количества элементов, который можно разместить в окне + /// + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + /// + /// Конструктор + /// + /// Ширина окна + /// Высота окна + /// Коллекция автомобилей + public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects collection) + { + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = collection; + _collection.MaxCount = GetMaxCount; + } + /// + /// Перегрузка оператора сложения для класса + /// + /// Компания + /// Добавляемый объект + /// + public static int? operator +(AbstractCompany company, DrawningLiner ship) + { + return company._collection?.Insert(ship, new DrawiningLinerEqutables()) ?? null; + } + /// + /// Перегрузка оператора удаления для класса + /// + /// Компания + /// Номер удаляемого объекта + /// + public static DrawningLiner operator -(AbstractCompany company, int position) + { + return company._collection?.Remove(position) ?? null; + } + /// + /// Получение случайного объекта из коллекции + /// + /// + public DrawningLiner? GetRandomObject() + { + Random rnd = new(); + return _collection?.Get(rnd.Next(GetMaxCount)); + } + /// + /// Вывод всей коллекции + /// + /// + public Bitmap? Show() + { + Bitmap bitmap = new(_pictureWidth, _pictureHeight); + Graphics graphics = Graphics.FromImage(bitmap); + DrawBackgound(graphics); + SetObjectsPosition(); + for (int i = 0; i < (_collection?.Count ?? 0); ++i) + { + DrawningLiner? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + return bitmap; + } + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); + + /// + /// Сортировка + /// + /// Сравнитель объектов + public void Sort(IComparer comparer) => _collection?.CollectionSort(comparer); +} diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs new file mode 100644 index 0000000..2b5bcb2 --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs @@ -0,0 +1,70 @@ +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLiner.CollectionGenericObjects; + +public class CollectionInfo : IEquatable +{ + /// + /// Название + /// + public string Name { get; private set; } + /// + /// Тип + /// + public CollectionType CollectionType { get; private set; } + /// + /// Описание + /// + public string Description { get; private set; } + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly string _separator = "-"; + /// + /// Конструктор + /// + /// Название + /// Тип + /// Описание + public CollectionInfo(string name, CollectionType collectionType, string + description) + { + Name = name; + CollectionType = collectionType; + Description = description; + } + /// + /// Создание объекта из строки + /// + /// Строка + /// Объект или null + public static CollectionInfo? GetCollectionInfo(string data) + { + string[] strs = data.Split(_separator, + StringSplitOptions.RemoveEmptyEntries); + if (strs.Length < 1 || strs.Length > 3) + { + return null; + } + return new CollectionInfo(strs[0], + (CollectionType)Enum.Parse(typeof(CollectionType), strs[1]), strs.Length > 2 ? + strs[2] : string.Empty); + } + public override string ToString() + { + return Name + _separator + CollectionType + _separator + Description; + } + public bool Equals(CollectionInfo? other) + { + return Name == other?.Name; + } + public override bool Equals(object? obj) + { + return Equals(obj as CollectionInfo); + } + public override int GetHashCode() + { + return Name.GetHashCode(); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionType.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionType.cs new file mode 100644 index 0000000..2dd3c4d --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionType.cs @@ -0,0 +1,19 @@ +namespace ProjectLiner.CollectionGenericObjects; +/// +/// Тип коллекции +/// +public enum CollectionType +{ + /// + /// Неопределено + /// + None = 0, + /// + /// Массив + /// + Massive = 1, + /// + /// Список + /// + List = 2 +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/DockService.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/DockService.cs new file mode 100644 index 0000000..32f6e62 --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/DockService.cs @@ -0,0 +1,59 @@ +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Drawnings; +using System.Drawing; + +namespace ProjectLiner.CollectionGenericObjects; + +public class DockService : AbstractCompany +{ + public DockService(int picWidth, int picHeight, ICollectionGenericObjects collection) : base(picWidth, picHeight, collection) + { + } + + protected override void DrawBackgound(Graphics g) + { + //рисуем пристань + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + Pen pen = new(Color.Black, 3); + for (int i = 0; i < width; i++) + { + for (int j = 0; j < height + 1; ++j) + { + g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, + i * _placeSizeWidth + _placeSizeWidth - 5, j * _placeSizeHeight); + } + } + } + + protected override void SetObjectsPosition() + { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int curWidth = width - 1; + int curHeight = 0; + + for (int i = 0; i < (_collection?.Count ?? 0); i++) + { + if (_collection.Get(i) != null) + { + _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); + _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 20, curHeight * _placeSizeHeight + 4); + } + + if (curWidth > 0) + curWidth--; + else + { + curWidth = width - 1; + curHeight++; + } + if (curHeight > height) + { + return; + } + } + } +} + diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..1692a3e --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,58 @@ +namespace ProjectLiner.CollectionGenericObjects; +/// +/// Интерфейс описания действий для набора хранимых объектов +/// +/// Параметр: ограничение - ссылочный тип +public interface ICollectionGenericObjects where T : class +{ + /// + /// Количество объектов в коллекции + /// + int Count { get; } + /// + /// Установка максимального количества элементов + /// + int MaxCount { set; get; } + /// + /// Добавление объекта в коллекцию + /// + /// Добавляемый объект + /// true - вставка прошла удачно, false - вставка не удалась + int Insert(T obj, IEqualityComparer? comparer = null); + /// + /// Добавление объекта в коллекцию на конкретную позицию + /// + /// Добавляемый объект + /// Позиция + /// true - вставка прошла удачно, false - вставка не удалась + int Insert(T obj, int position, IEqualityComparer? comparer = null); + /// + /// Удаление объекта из коллекции с конкретной позиции + /// + /// Позиция + /// true - удаление прошло удачно, false - удаление не удалось + T Remove(int position); + /// + /// Получение объекта по позиции + /// + /// Позиция + /// Объект + T? Get(int position); + + /// + /// Получение типа коллекции + /// + CollectionType GetCollectionType { get; } + + /// + /// Получение объектов коллекции по одному + /// + /// Поэлементый вывод элементов коллекции + IEnumerable GetItems(); + + /// + /// Сортировка коллекции + /// + /// Сравнитель объектов + void CollectionSort(IComparer comparer); +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs new file mode 100644 index 0000000..ec07065 --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/ListGenericObjects.cs @@ -0,0 +1,102 @@ +using ProjectLiner.Exceptions; + +namespace ProjectLiner.CollectionGenericObjects; + +public class ListGenericObjects : ICollectionGenericObjects + where T : class +{ + /// + /// Список объектов, которые храним + /// + private readonly List _collection; + /// + /// Максимально допустимое число объектов в списке + /// + private int _maxCount; + public int MaxCount + { + get + { + return Count; + } + set + { + if (value > 0) + { + _maxCount = value; + } + } + } + public CollectionType GetCollectionType => CollectionType.List; + public int Count => _collection.Count; + /// + /// Конструктор + /// + public ListGenericObjects() + { + _collection = new(); + } + public T? Get(int position) + { + // TODO проверка позиции + if (position >= Count || position < 0) throw new Exceptions.PositionOutOfCollectionException(); + return _collection[position]; + } + public int Insert(T obj, IEqualityComparer? comparer = null) + { + + if (comparer != null) + { + if (_collection.Contains(obj, comparer)) + { + throw new ObjectIsEqualException(); + } + } + + // TODO проверка, что не превышено максимальное количество элементов + // TODO вставка в конец набора + if (Count == _maxCount) throw new Exceptions.CollectionOverflowException(); + _collection.Add(obj); + return _collection.Count-1;//возможна проблема + } + public int Insert(T obj, int position, IEqualityComparer? comparer = null) + { + + if (comparer != null) + { + if (_collection.Contains(obj, comparer)) + { + throw new ObjectIsEqualException(); + } + } + + // TODO проверка, что не превышено максимальное количество элементов + // TODO проверка позиции + // TODO вставка по позиции + if (Count == _maxCount) throw new Exceptions.CollectionOverflowException(); + if (position >= Count || position < 0) throw new Exceptions.PositionOutOfCollectionException(); + _collection.Insert(position, obj); + return _collection.Count-1; + } + public T Remove(int position) + { + // TODO проверка позиции + // TODO удаление объекта из списка + if (position >= Count || position < 0) throw new Exceptions.PositionOutOfCollectionException(); + T buffer = _collection[position]; + _collection.RemoveAt(position); + return buffer; + } + public IEnumerable GetItems() + { + for (int i = 0; i < Count; ++i) + { + yield return _collection[i]; + } + } + + public void CollectionSort(IComparer comparer) + { + _collection.Sort(comparer); + } +} diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..521402e --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,147 @@ + +using ProjectLiner.Exceptions; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Drawnings; + +namespace ProjectLiner.CollectionGenericObjects; + +public class MassiveGenericObjects : ICollectionGenericObjects + where T : class +{ + /// + /// Массив объектов, которые храним + /// + private T?[] _collection; + + public int Count => _collection.Length; + + public int MaxCount + { + get + { + return _collection.Length; + } + set + { + if (value > 0) + { + if (_collection.Length > 0) + { + Array.Resize(ref _collection, value); + } + else + { + _collection = new T?[value]; + } + } + } + } + + public CollectionType GetCollectionType => CollectionType.Massive; + + /// + /// Конструктор + /// + public MassiveGenericObjects() + { + _collection = Array.Empty(); + } + + public T? Get(int position) + { + // TODO выброс ошибки если выход за границу + if (position >= _collection.Length || position < 0) throw new PositionOutOfCollectionException(position); + // TODO выброс ошибки если объект пустой + return _collection[position]; + } + + public int Insert(T obj, IEqualityComparer? comparer = null) + { + if (comparer != null) + { + foreach (T? item in _collection) + { + if ((comparer as IEqualityComparer).Equals(obj as DrawningLiner, item as DrawningLiner)) + throw new ObjectIsEqualException(); + } + } + + // TODO вставка в свободное место набора + for (int i = 0; i < Count; i++) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + throw new CollectionOverflowException(Count); + } + + public int Insert(T obj, int position, IEqualityComparer? comparer = null) + { + if (comparer != null) + { + foreach (T? item in _collection) + { + if ((comparer as IEqualityComparer).Equals(obj as DrawningLiner, item as DrawningLiner)) + throw new ObjectIsEqualException(); + } + } + + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) + { + _collection[position] = obj; + return position; + } + int index = position + 1; + while (index < _collection.Length) + { + if (_collection[index] == null) + { + _collection[index] = obj; + return index; + } + ++index; + } + index = position - 1; + while (index >= 0) + { + if (_collection[index] == null) + { + _collection[index] = obj; + return index; + } + --index; + } + throw new CollectionOverflowException(Count); + } + + public T Remove(int position) + { + // TODO проверка позиции + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + // TODO удаление объекта из массива, присвоив элементу массива значение null + if (_collection[position] != null) + { + T obj = _collection[position]; + _collection[position] = null; + return obj; + } + throw new ObjectNotFoundException(position); + } + + public IEnumerable GetItems() + { + for (int i = 0; i < _collection.Length; ++i) + { + yield return _collection[i]; + } + } + + public void CollectionSort(IComparer comparer) + { + Array.Sort(_collection, comparer); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs new file mode 100644 index 0000000..0341c80 --- /dev/null +++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs @@ -0,0 +1,208 @@ +using System.Text; +using ProjectLiner.Drawnings; +using ProjectLiner.Exceptions; + +namespace ProjectLiner.CollectionGenericObjects; +//хронилище коллекций +/// +public class StorageCollection + where T : DrawningLiner +{ + + /// + /// Словарь (хранилище) с коллекциями + /// + readonly Dictionary> _storages; + + /// + /// Возвращение списка названий коллекций + /// + public List Keys => _storages.Keys.ToList(); + + /// + /// Конструктор + /// + public StorageCollection() + { + _storages = new Dictionary>(); + } + /// + /// Ключевое слово, с которого должен начинаться файл + /// + private readonly string _collectionKey = "CollectionsStorage"; + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private readonly string _separatorForKeyValue = "|"; + + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly string _separatorItems = ";"; + + /// + /// Добавление коллекции в хранилище + /// + /// Название коллекции + /// тип коллекции + public void AddCollection(string name, CollectionType collectionType) + { + // TODO проверка, что name не пустой и нет в словаре записи с таким ключом + // TODO Прописать логику для добавления + CollectionInfo collectionInfo = new CollectionInfo(name, collectionType, string.Empty); + if (_storages.ContainsKey(collectionInfo)) return; + if (collectionType == CollectionType.None) return; + else if (collectionType == CollectionType.Massive) + _storages[collectionInfo] = new MassiveGenericObjects(); + else if (collectionType == CollectionType.List) + _storages[collectionInfo] = new ListGenericObjects(); + } + /// + /// Удаление коллекции + /// + /// Название коллекции + public void DelCollection(string name) + { + CollectionInfo collectionInfo = new CollectionInfo(name, CollectionType.None, string.Empty); + if (_storages.ContainsKey(collectionInfo)) + _storages.Remove(collectionInfo); + } + + /// + /// Доступ к коллекции + /// + /// Название коллекции + /// + public ICollectionGenericObjects this[string name] + { + get + { + CollectionInfo collectionInfo = new CollectionInfo(name, CollectionType.None, string.Empty); + + if (_storages.ContainsKey(collectionInfo)) + return _storages[collectionInfo]; + + return null; + + } + } + + public void SaveData(string filename) + { + if (_storages.Count == 0) + { + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); + } + if (File.Exists(filename)) + { + File.Delete(filename); + } + using (StreamWriter writer = new StreamWriter(filename)) + { + writer.Write(_collectionKey); + foreach (KeyValuePair> value in _storages) + { + StringBuilder sb = new(); + sb.Append(Environment.NewLine); + if (value.Value.Count == 0) + { + continue; + } + sb.Append(value.Key); + sb.Append(_separatorForKeyValue); + sb.Append(value.Value.MaxCount); + sb.Append(_separatorForKeyValue); + foreach (T? item in value.Value.GetItems()) + { + string data = item?.GetDataForSave() ?? string.Empty; + if (string.IsNullOrEmpty(data)) + { + continue; + } + sb.Append(data); + sb.Append(_separatorItems); + } + writer.Write(sb); + } + + } + } + + /// + /// Загрузка информации по автомобилям в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public void LoadData(string filename) + { + if (!File.Exists(filename)) + { + throw new Exception("Файл не существует"); + } + using (StreamReader fs = File.OpenText(filename)) + { + string str = fs.ReadLine(); + if (str == null || str.Length == 0) + { + throw new Exception("В файле нет данных"); + } + if (!str.StartsWith(_collectionKey)) + { + throw new Exception("В файле неверные данные"); + } + _storages.Clear(); + string strs = ""; + while ((strs = fs.ReadLine()) != null) + { + string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 3) + { + continue; + } + CollectionInfo? collectionInfo = CollectionInfo.GetCollectionInfo(record[0]) ?? throw new Exception("Не удалось определить информацию коллекции: " + record[0]); + + ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionInfo.CollectionType); + if (collection == null) + { + throw new Exception("Не удалось создать коллекцию"); + } + collection.MaxCount = Convert.ToInt32(record[1]); + string[] set = record[2].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + if (elem?.CreateDrawningLiner() is T liner) + { + try + { + if (collection.Insert(liner) == -1) + { + throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new Exception("Коллекция переполнена", ex); + } + } + } + _storages.Add(collectionInfo, collection); + } + } + } + + + /// + /// Создание коллекции по типу + /// + /// + /// + private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) + { + return collectionType switch + { + CollectionType.Massive => new MassiveGenericObjects(), + CollectionType.List => new ListGenericObjects(), + _ => null, + }; + } +} diff --git a/ProjectLiner/ProjectLiner/Drawnings/DirectionType.cs b/ProjectLiner/ProjectLiner/Drawnings/DirectionType.cs new file mode 100644 index 0000000..4cfd804 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DirectionType.cs @@ -0,0 +1,32 @@ +namespace ProjectLiner.Drawnings; + +/// +/// Направление перемещения +/// +public enum DirectionType +{ + /// + /// Неизвестное направление + /// + Unknow = -1, + + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/DrawiningLinerEqutables.cs b/ProjectLiner/ProjectLiner/Drawnings/DrawiningLinerEqutables.cs new file mode 100644 index 0000000..c3b0687 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DrawiningLinerEqutables.cs @@ -0,0 +1,57 @@ +using ProjectLiner.Entities; +using System.Diagnostics.CodeAnalysis; + +namespace ProjectLiner.Drawnings; + +public class DrawiningLinerEqutables : IEqualityComparer +{ + public bool Equals(DrawningLiner? x, DrawningLiner? y) + { + if (x == null || x.EntityLiner == null) + { + return false; + } + if (y == null || y.EntityLiner == null) + { + return false; + } + if (x.GetType().Name != y.GetType().Name) + { + return false; + } + if (x.EntityLiner.Speed != y.EntityLiner.Speed) + { + return false; + } + if (x.EntityLiner.Weight != y.EntityLiner.Weight) + { + return false; + } + if (x.EntityLiner.BodyColor != y.EntityLiner.BodyColor) + { + return false; + } + if (x is DrawningBetterLiner && y is DrawningBetterLiner) + { + EntityBetterLiner _x = (EntityBetterLiner)x.EntityLiner; + EntityBetterLiner _y = (EntityBetterLiner)x.EntityLiner; + if (_x.AdditionalColor != _y.AdditionalColor) + { + return false; + } + if (_x.HasMark != _y.HasMark) + { + return false; + } + if (_x.HasDecoratins != _y.HasDecoratins) + { + return false; + } + } + return true; + } + public int GetHashCode([DisallowNull] DrawningLiner obj) + { + return obj.GetHashCode(); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/DrawningBetterLiner.cs b/ProjectLiner/ProjectLiner/Drawnings/DrawningBetterLiner.cs new file mode 100644 index 0000000..7563151 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DrawningBetterLiner.cs @@ -0,0 +1,69 @@ +using ProjectLiner.Entities; + +namespace ProjectLiner.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningBetterLiner : DrawningLiner +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + public DrawningBetterLiner(int speed, double weight, Color bodyColor, Color additionalColor, bool hasMark, bool hasDecoration) : base(80, 50) + { + EntityLiner = new EntityBetterLiner(speed, weight, bodyColor, additionalColor, hasMark, hasDecoration); + } + + public DrawningBetterLiner(EntityBetterLiner liner) : base(80, 50) + { + EntityLiner = new EntityBetterLiner(liner.Speed, liner.Weight, liner.BodyColor, liner.AdditionalColor, liner.HasMark, liner.HasDecoratins); + } + + public override void DrawTransport(Graphics g) + { + if (EntityLiner == null || EntityLiner is not EntityBetterLiner betterLiner || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(betterLiner.AdditionalColor); + + base.DrawTransport(g); + + //Марка на борту + if (((EntityBetterLiner)EntityLiner).HasMark) + { + g.FillRectangles(additionalBrush, new Rectangle[] + { + new(_startPosX.Value+15,_startPosY.Value+38,17,3), + new(_startPosX.Value+22,_startPosY.Value+32,3,16) + }); + } + + //Декорации + if (((EntityBetterLiner)EntityLiner).HasDecoratins) + { + g.FillRectangles(additionalBrush, new Rectangle[] + { + new(_startPosX.Value+8,_startPosY.Value+0,10,20), + new(_startPosX.Value+26,_startPosY.Value+0,10,20), + new(_startPosX.Value+44,_startPosY.Value+0,10,20), + new(_startPosX.Value+62,_startPosY.Value+0,10,20), + }); + g.DrawRectangles(pen, new Rectangle[] + { + new(_startPosX.Value+8,_startPosY.Value+0,10,20), + new(_startPosX.Value+26,_startPosY.Value+0,10,20), + new(_startPosX.Value+44,_startPosY.Value+0,10,20), + new(_startPosX.Value+62,_startPosY.Value+0,10,20), + }); + + } + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/DrawningLiner.cs b/ProjectLiner/ProjectLiner/Drawnings/DrawningLiner.cs new file mode 100644 index 0000000..016fb8d --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DrawningLiner.cs @@ -0,0 +1,243 @@ +using ProjectLiner.Entities; + +namespace ProjectLiner.Drawnings; + +/// +/// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности +/// +public class DrawningLiner +{ + /// + /// Класс-сущность + /// + public EntityLiner? EntityLiner { get; protected set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки автомобиля + /// + protected int? _startPosX; + + /// + /// Верхняя кооридната прорисовки автомобиля + /// + protected int? _startPosY; + + /// + /// Ширина прорисовки автомобиля + /// + private readonly int _drawningLinerWidth = 80; + + /// + /// Высота прорисовки автомобиля + /// + private readonly int _drawningLinerHeight = 50; + + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + + /// + /// Ширина объекта + /// + public int GetWidth => _drawningLinerWidth; + + /// + /// Высота объекта + /// + public int GetHeight => _drawningLinerHeight; + + /// + /// Пустой конструктор + /// + private DrawningLiner() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + public DrawningLiner(EntityLiner liner) : this() + { + EntityLiner = new EntityLiner(liner.Speed, liner.Weight, liner.BodyColor); + } + + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningLiner(int speed, double weight, Color bodyColor) : this() + { + EntityLiner = new EntityLiner(speed, weight, bodyColor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки лайнера + /// Высота прорисовки лайнера + protected DrawningLiner(int drawningLinerWidth, int drawningLinerHeight) : this() + { + _drawningLinerWidth = drawningLinerWidth; + _pictureHeight = drawningLinerHeight; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + if (_drawningLinerWidth > width || _drawningLinerHeight > height) + return false; + + _pictureWidth = width; + _pictureHeight = height; + if (_startPosX.HasValue && _startPosY.HasValue) + { + if (_pictureWidth - _drawningLinerWidth < _startPosX) + _startPosX = _pictureWidth - _drawningLinerWidth; + if (_pictureHeight - _drawningLinerHeight < _startPosY) + _startPosY = _pictureHeight - _drawningLinerHeight; + } + return true; + } + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + + _startPosX = _pictureWidth - _drawningLinerWidth < x ? _pictureWidth - _drawningLinerWidth : x; + _startPosY = _pictureHeight - _drawningLinerHeight < y ? _pictureHeight - _drawningLinerHeight : y; + + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityLiner == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityLiner.Step > 0) + { + _startPosX -= (int)EntityLiner.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityLiner.Step > 0) + { + _startPosY -= (int)EntityLiner.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + EntityLiner.Step < _pictureWidth - _drawningLinerWidth) + { + _startPosX += (int)EntityLiner.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + EntityLiner.Step < _pictureHeight - _drawningLinerHeight) + { + _startPosY += (int)EntityLiner.Step; + } + return true; + + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityLiner == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + + Brush mainBrush = new SolidBrush(EntityLiner.BodyColor); + + Brush negativeMainBrush = new SolidBrush(Color.FromArgb(255-EntityLiner.BodyColor.R, 255 - EntityLiner.BodyColor.G, 255 - EntityLiner.BodyColor.B)); + + g.FillPolygon(mainBrush, new Point[] { + new(_startPosX.Value+0, _startPosY.Value + 30), + new(_startPosX.Value+15,_startPosY.Value+50), + new(_startPosX.Value+65,_startPosY.Value+50), + new(_startPosX.Value+80,_startPosY.Value+30), + new(_startPosX.Value+0,_startPosY.Value+30), + new(_startPosX.Value+0,_startPosY.Value+20), + new(_startPosX.Value+80, _startPosY.Value+20), + new(_startPosX.Value+80, _startPosY.Value+30) + }); + g.DrawLines(pen, new Point[] { + new(_startPosX.Value+0, _startPosY.Value + 30), + new(_startPosX.Value+15,_startPosY.Value+50), + new(_startPosX.Value+65,_startPosY.Value+50), + new(_startPosX.Value+80,_startPosY.Value+30), + new(_startPosX.Value+0,_startPosY.Value+30), + new(_startPosX.Value+0,_startPosY.Value+20), + new(_startPosX.Value+80, _startPosY.Value+20), + new(_startPosX.Value+80, _startPosY.Value+30) + }); + + g.FillRectangles(negativeMainBrush, new Rectangle[]{ + new(_startPosX.Value+5,_startPosY.Value+22,10,6), + new(_startPosX.Value+20,_startPosY.Value+22,10,6), + new(_startPosX.Value+35,_startPosY.Value+22,10,6), + new(_startPosX.Value+50,_startPosY.Value+22,10,6), + new(_startPosX.Value+65,_startPosY.Value+22,10,6), + }); + g.DrawRectangles(pen, new Rectangle[]{ + new(_startPosX.Value+5,_startPosY.Value+22,10,6), + new(_startPosX.Value+20,_startPosY.Value+22,10,6), + new(_startPosX.Value+35,_startPosY.Value+22,10,6), + new(_startPosX.Value+50,_startPosY.Value+22,10,6), + new(_startPosX.Value+65,_startPosY.Value+22,10,6), + }); + + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByColor .cs b/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByColor .cs new file mode 100644 index 0000000..1a048cf --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByColor .cs @@ -0,0 +1,28 @@ +namespace ProjectLiner.Drawnings; + +public class DrawningLinerCompareByColor : IComparer +{ + public int Compare(DrawningLiner? x, DrawningLiner? y) + { + if (x == null || x.EntityLiner == null) + { + return 1; + } + + if (y == null || y.EntityLiner == null) + { + return -1; + } + var bodycolorCompare = x.EntityLiner.BodyColor.Name.CompareTo(y.EntityLiner.BodyColor.Name); + if (bodycolorCompare != 0) + { + return bodycolorCompare; + } + var speedCompare = x.EntityLiner.Speed.CompareTo(y.EntityLiner.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityLiner.Weight.CompareTo(y.EntityLiner.Weight); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByType.cs b/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByType.cs new file mode 100644 index 0000000..68e17d7 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/DrawningLinerCompareByType.cs @@ -0,0 +1,29 @@ +namespace ProjectLiner.Drawnings; + +public class DrawningLinerCompareByType : IComparer +{ + public int Compare(DrawningLiner? x, DrawningLiner? y) + { + if (x == null || x.EntityLiner == null) + { + return 1; + } + + if (y == null || y.EntityLiner == null) + { + return -1; + } + + if (x.GetType().Name != y.GetType().Name) + { + return x.GetType().Name.CompareTo(y.GetType().Name); + } + + var speedCompare = x.EntityLiner.Speed.CompareTo(y.EntityLiner.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityLiner.Weight.CompareTo(y.EntityLiner.Weight); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Drawnings/ExtentionDrawningLiner.cs b/ProjectLiner/ProjectLiner/Drawnings/ExtentionDrawningLiner.cs new file mode 100644 index 0000000..6fc7102 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Drawnings/ExtentionDrawningLiner.cs @@ -0,0 +1,46 @@ +using ProjectLiner.Entities; +namespace ProjectLiner.Drawnings; +/// +/// Расширение для класса EntityLiner +/// +public static class ExtentionDrawningLiner +{ + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly string _separatorForObject = ":"; + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Объект + public static DrawningLiner? CreateDrawningLiner(this string info) + { + string[] strs = info.Split(_separatorForObject); + EntityLiner? liner = EntityBetterLiner.CreateEntityBetterLiner(strs); + if (liner != null && liner is EntityBetterLiner betterLiner) + { + return new DrawningBetterLiner(betterLiner); + } + liner = EntityLiner.CreateEntityLiner(strs); + if (liner != null) + { + return new DrawningLiner(liner); + } + return null; + } + /// + /// Получение данных для сохранения в файл + /// + /// Сохраняемый объект + /// Строка с данными по объекту + public static string GetDataForSave(this DrawningLiner drawningLiner) + { + string[]? array = drawningLiner?.EntityLiner?.GetStringRepresentation(); + if (array == null) + { + return string.Empty; + } + return string.Join(_separatorForObject, array); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Entities/EntityBetterLiner.cs b/ProjectLiner/ProjectLiner/Entities/EntityBetterLiner.cs new file mode 100644 index 0000000..a5d7bbc --- /dev/null +++ b/ProjectLiner/ProjectLiner/Entities/EntityBetterLiner.cs @@ -0,0 +1,61 @@ +namespace ProjectLiner.Entities; + +/// +/// Класс-сущность "Спортивный автомобиль" +/// +public class EntityBetterLiner : EntityLiner +{/// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; set; } + + /// + /// Имеет марку на боку + /// + public bool HasMark { get; private set; } + + /// + /// Имеет декорации сверху + /// + public bool HasDecoratins { get; private set; } + + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Присутствие марки + /// Присутствие декораций + public EntityBetterLiner(int speed, double weight, Color bodyColor, Color additionalColor, bool hasMark, bool hasDecoratins) : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + HasMark = hasMark; + HasDecoratins = hasDecoratins; + } + /// + /// Получение строк со значениями свойств продвинутого объекта класса-сущности + /// + /// + public override string[] GetStringRepresentation() + { + return new[] { nameof(EntityBetterLiner), Speed.ToString(), Weight.ToString(), BodyColor.Name, AdditionalColor.Name, + HasMark.ToString(), HasDecoratins.ToString()}; + } + /// + /// Создание продвинутого объекта из массива строк + /// + /// + /// + public static EntityBetterLiner? CreateEntityBetterLiner(string[] strs) + { + if (strs.Length != 7 || strs[0] != nameof(EntityBetterLiner)) + { + return null; + } + return new EntityBetterLiner(Convert.ToInt32(strs[1]), Convert.ToDouble(strs[2]), Color.FromName(strs[3]), + Color.FromName(strs[4]), Convert.ToBoolean(strs[5]), Convert.ToBoolean(strs[6])); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Entities/EntityLiner.cs b/ProjectLiner/ProjectLiner/Entities/EntityLiner.cs new file mode 100644 index 0000000..abf99ce --- /dev/null +++ b/ProjectLiner/ProjectLiner/Entities/EntityLiner.cs @@ -0,0 +1,58 @@ +namespace ProjectLiner.Entities; + +/// +/// Класс-сущность "Автомобиль" +/// +public class EntityLiner +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; set; } + + /// + /// Шаг перемещения автомобиля + /// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + public EntityLiner(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + public virtual string[] GetStringRepresentation() + { + return new[] { nameof(EntityLiner), Speed.ToString(), Weight.ToString(), BodyColor.Name }; + } + /// + /// Создание объекта из массива строк + /// + /// + /// + public static EntityLiner? CreateEntityLiner(string[] strs) + { + if (strs.Length != 4 || strs[0] != nameof(EntityLiner)) + { + return null; + } + return new EntityLiner(Convert.ToInt32(strs[1]), + Convert.ToDouble(strs[2]), Color.FromName(strs[3])); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Exceptions/CollectionOverflowException.cs b/ProjectLiner/ProjectLiner/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..f201d5a --- /dev/null +++ b/ProjectLiner/ProjectLiner/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; +namespace ProjectLiner.Exceptions; +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } +public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : + base(message, exception) + { } + protected CollectionOverflowException(SerializationInfo info, + StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Exceptions/ObjectIsEqualException.cs b/ProjectLiner/ProjectLiner/Exceptions/ObjectIsEqualException.cs new file mode 100644 index 0000000..5c82cf1 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Exceptions/ObjectIsEqualException.cs @@ -0,0 +1,15 @@ +using System.Runtime.Serialization; +namespace ProjectLiner.Exceptions; + +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +public class ObjectIsEqualException : ApplicationException +{ + public ObjectIsEqualException(int count) : base("В коллекции содержится одинаковый элемент: " + count) { } + public ObjectIsEqualException() : base("В коллекции содержится одинаковый элемент") { } + public ObjectIsEqualException(string message) : base(message) { } + public ObjectIsEqualException(string message, Exception exception) : base(message, exception) { } + protected ObjectIsEqualException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectLiner/ProjectLiner/Exceptions/ObjectNotFoundException.cs b/ProjectLiner/ProjectLiner/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..41cafa2 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; +namespace ProjectLiner.Exceptions; +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : + base(message, exception) + { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Exceptions/PositionOutOfCollectionException.cs b/ProjectLiner/ProjectLiner/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..22263bf --- /dev/null +++ b/ProjectLiner/ProjectLiner/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,15 @@ +using System.Runtime.Serialization; +namespace ProjectLiner.Exceptions; +/// +/// Класс, описывающий ошибку выхода за границы коллекции +/// +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { } +public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception + exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLiner.Designer.cs b/ProjectLiner/ProjectLiner/FormLiner.Designer.cs new file mode 100644 index 0000000..a62aad1 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.Designer.cs @@ -0,0 +1,152 @@ +using static System.Net.Mime.MediaTypeNames; +using System.Windows.Forms; +using System.Xml.Linq; + +namespace ProjectLiner +{ + partial class FormLiner + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + 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() + { + pictureBoxLiner = new PictureBox(); + buttonUp = new Button(); + buttonRight = new Button(); + buttonLeft = new Button(); + buttonDown = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxLiner).BeginInit(); + SuspendLayout(); + // + // pictureBoxWarmlyShip + // + pictureBoxLiner.Dock = DockStyle.Fill; + pictureBoxLiner.Location = new Point(0, 0); + pictureBoxLiner.Name = "pictureBoxLiner"; + pictureBoxLiner.Size = new Size(830, 366); + pictureBoxLiner.SizeMode = PictureBoxSizeMode.AutoSize; + pictureBoxLiner.TabIndex = 0; + pictureBoxLiner.TabStop = false; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.arrowUp; + buttonUp.BackgroundImageLayout = ImageLayout.Stretch; + buttonUp.Location = new Point(732, 279); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(30, 30); + buttonUp.TabIndex = 2; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += ButtonMove_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.arrowRight; + buttonRight.BackgroundImageLayout = ImageLayout.Stretch; + buttonRight.Location = new Point(778, 324); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(30, 30); + buttonRight.TabIndex = 3; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += ButtonMove_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; + buttonLeft.Location = new Point(685, 324); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(30, 30); + buttonLeft.TabIndex = 4; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += ButtonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.arrowDown; + buttonDown.BackgroundImageLayout = ImageLayout.Stretch; + buttonDown.Location = new Point(732, 324); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(30, 30); + buttonDown.TabIndex = 5; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += ButtonMove_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(685, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(133, 23); + comboBoxStrategy.TabIndex = 7; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(732, 41); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(86, 23); + buttonStrategyStep.TabIndex = 8; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += buttonStrategyStep_Click; + // + // FormWarmlyShip + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(830, 366); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonDown); + Controls.Add(buttonLeft); + Controls.Add(buttonRight); + Controls.Add(buttonUp); + Controls.Add(pictureBoxLiner); + Name = "FormWarmlyShip"; + Text = "WarmlyShip"; + ((System.ComponentModel.ISupportInitialize)pictureBoxLiner).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private PictureBox pictureBoxLiner; + private Button buttonUp; + private Button buttonRight; + private Button buttonLeft; + private Button buttonDown; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLiner.cs b/ProjectLiner/ProjectLiner/FormLiner.cs new file mode 100644 index 0000000..5a20a24 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.cs @@ -0,0 +1,102 @@ +using ProjectLiner.Drawnings; +using ProjectLiner.MovementStrategy; + +namespace ProjectLiner +{ + public partial class FormLiner : Form + { + private DrawningLiner? _drawningLiner; + private AbstractStrategy? _strategy; + /// + /// Получение объекта + /// + public DrawningLiner SetLiner + { + set + { + _drawningLiner = value; + _drawningLiner.SetPictureSize(pictureBoxLiner.Width, pictureBoxLiner.Height); + comboBoxStrategy.Enabled = true; + Draw(); + } + } + public FormLiner() + { + InitializeComponent(); + _strategy = null; + } + private void Draw() + { + if (_drawningLiner == null) + { + return; + } + Bitmap bmp = new(pictureBoxLiner.Width, pictureBoxLiner.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningLiner.DrawTransport(gr); + pictureBoxLiner.Image = bmp; + } + private void ButtonMove_Click(object sender, EventArgs e) + { + if (_drawningLiner == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = _drawningLiner.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = _drawningLiner.MoveTransport(DirectionType.Down); + break; + case "buttonLeft": + result = _drawningLiner.MoveTransport(DirectionType.Left); + break; + case "buttonRight": + result = _drawningLiner.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); + } + } + private void buttonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningLiner == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToCorner(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableLiner(_drawningLiner), + pictureBoxLiner.Width, pictureBoxLiner.Height); + } + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } + } +} diff --git a/ProjectLiner/ProjectLiner/FormLiner.resx b/ProjectLiner/ProjectLiner/FormLiner.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLiner.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs b/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs new file mode 100644 index 0000000..65eb364 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLinerCollection.Designer.cs @@ -0,0 +1,372 @@ +using static System.Net.Mime.MediaTypeNames; +using System.Windows.Forms; +using System.Xml.Linq; + +namespace ProjectLiner +{ + partial class FormLinerCollection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + 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() + { + groupBoxTools = new GroupBox(); + panelCompanyTools = new Panel(); + buttonAddLiner = new Button(); + buttonGoToCheck = new Button(); + buttonRemoveLiner = new Button(); + maskedTextBox1 = new MaskedTextBox(); + buttonRefresh = new Button(); + buttonCreateCompany = new Button(); + panelStorage = new Panel(); + buttonRemoveCollection = new Button(); + listBoxCollection = new ListBox(); + buttonAddCollection = new Button(); + radioButtonList = new RadioButton(); + radioButtonMassive = new RadioButton(); + textBoxCollectionName = new TextBox(); + labelCollectionName = new Label(); + comboBoxSelectorCompany = new ComboBox(); + pictureBox = new PictureBox(); + menuStrip1 = new MenuStrip(); + fileToolStripMenuItem = new ToolStripMenuItem(); + saveToolStripMenuItem = new ToolStripMenuItem(); + loadToolStripMenuItem = new ToolStripMenuItem(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new SaveFileDialog(); + buttonSortByType = new Button(); + buttonSortByColor = new Button(); + groupBoxTools.SuspendLayout(); + panelCompanyTools.SuspendLayout(); + panelStorage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + menuStrip1.SuspendLayout(); + SuspendLayout(); + // + // groupBoxTools + // + groupBoxTools.Controls.Add(panelCompanyTools); + groupBoxTools.Controls.Add(buttonCreateCompany); + groupBoxTools.Controls.Add(panelStorage); + groupBoxTools.Controls.Add(comboBoxSelectorCompany); + groupBoxTools.Dock = DockStyle.Right; + groupBoxTools.Location = new Point(859, 28); + groupBoxTools.Name = "groupBoxTools"; + groupBoxTools.Size = new Size(277, 689); + groupBoxTools.TabIndex = 0; + groupBoxTools.TabStop = false; + groupBoxTools.Text = "Инструменты"; + // + // panelCompanyTools + // + panelCompanyTools.Controls.Add(buttonSortByType); + panelCompanyTools.Controls.Add(buttonSortByColor); + panelCompanyTools.Controls.Add(buttonAddLiner); + panelCompanyTools.Controls.Add(buttonGoToCheck); + panelCompanyTools.Controls.Add(buttonRemoveLiner); + panelCompanyTools.Controls.Add(maskedTextBox1); + panelCompanyTools.Controls.Add(buttonRefresh); + panelCompanyTools.Enabled = false; + panelCompanyTools.Location = new Point(9, 364); + panelCompanyTools.Name = "panelCompanyTools"; + panelCompanyTools.Size = new Size(268, 338); + panelCompanyTools.TabIndex = 9; + // + // buttonAddLiner + // + buttonAddLiner.Location = new Point(4, 3); + buttonAddLiner.Name = "buttonAddLiner"; + buttonAddLiner.Size = new Size(252, 40); + buttonAddLiner.TabIndex = 1; + buttonAddLiner.Text = "Добавление лайнера"; + buttonAddLiner.UseVisualStyleBackColor = true; + buttonAddLiner.Click += buttonAddLiner_Click; + // + // buttonGoToCheck + // + buttonGoToCheck.Location = new Point(4, 131); + buttonGoToCheck.Name = "buttonGoToCheck"; + buttonGoToCheck.Size = new Size(254, 42); + buttonGoToCheck.TabIndex = 5; + buttonGoToCheck.Text = "Передать на тест"; + buttonGoToCheck.UseVisualStyleBackColor = true; + buttonGoToCheck.Click += ButtonGoToCheck_Click; + // + // buttonRemoveLiner + // + buttonRemoveLiner.Location = new Point(4, 82); + buttonRemoveLiner.Name = "buttonRemoveLiner"; + buttonRemoveLiner.Size = new Size(254, 43); + buttonRemoveLiner.TabIndex = 4; + buttonRemoveLiner.Text = "Удалить лайнер"; + buttonRemoveLiner.UseVisualStyleBackColor = true; + buttonRemoveLiner.Click += ButtonDelPlane_Click; + // + // maskedTextBox1 + // + maskedTextBox1.Location = new Point(6, 49); + maskedTextBox1.Mask = "00"; + maskedTextBox1.Name = "maskedTextBox1"; + maskedTextBox1.Size = new Size(252, 27); + maskedTextBox1.TabIndex = 3; + maskedTextBox1.ValidatingType = typeof(int); + // + // buttonReFresh + // + buttonRefresh.Location = new Point(4, 179); + buttonRefresh.Name = "buttonReFresh"; + buttonRefresh.Size = new Size(252, 40); + buttonRefresh.TabIndex = 6; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += ButtonReFresh_Click; + // + // buttonCreateCompany + // + buttonCreateCompany.Location = new Point(13, 330); + buttonCreateCompany.Name = "buttonCreateCompany"; + buttonCreateCompany.Size = new Size(252, 28); + buttonCreateCompany.TabIndex = 8; + buttonCreateCompany.Text = "Создать компанию"; + buttonCreateCompany.UseVisualStyleBackColor = true; + buttonCreateCompany.Click += ButtonCreateCompany_Click; + // + // panelStorage + // + panelStorage.Controls.Add(buttonRemoveCollection); + panelStorage.Controls.Add(listBoxCollection); + panelStorage.Controls.Add(buttonAddCollection); + panelStorage.Controls.Add(radioButtonList); + panelStorage.Controls.Add(radioButtonMassive); + panelStorage.Controls.Add(textBoxCollectionName); + panelStorage.Controls.Add(labelCollectionName); + panelStorage.Dock = DockStyle.Top; + panelStorage.Location = new Point(3, 23); + panelStorage.Name = "panelStorage"; + panelStorage.Size = new Size(271, 270); + panelStorage.TabIndex = 7; + // + // buttonRemoveCollection + // + buttonRemoveCollection.Location = new Point(10, 239); + buttonRemoveCollection.Name = "buttonRemoveCollection"; + buttonRemoveCollection.Size = new Size(252, 28); + buttonRemoveCollection.TabIndex = 6; + buttonRemoveCollection.Text = "Удалить коллекцию"; + buttonRemoveCollection.UseVisualStyleBackColor = true; + buttonRemoveCollection.Click += ButtonCollectionDel_Click; + // + // listBoxCollection + // + listBoxCollection.FormattingEnabled = true; + listBoxCollection.ItemHeight = 20; + listBoxCollection.Location = new Point(10, 129); + listBoxCollection.Name = "listBoxCollection"; + listBoxCollection.Size = new Size(252, 104); + listBoxCollection.TabIndex = 5; + // + // buttonAddCollection + // + buttonAddCollection.Location = new Point(10, 95); + buttonAddCollection.Name = "buttonAddCollection"; + buttonAddCollection.Size = new Size(252, 28); + buttonAddCollection.TabIndex = 4; + buttonAddCollection.Text = "Добавить коллекцию"; + buttonAddCollection.UseVisualStyleBackColor = true; + buttonAddCollection.Click += ButtonCollectionAdd_Click; + // + // radioButtonList + // + radioButtonList.AutoSize = true; + radioButtonList.Location = new Point(150, 65); + radioButtonList.Name = "radioButtonList"; + radioButtonList.Size = new Size(80, 24); + radioButtonList.TabIndex = 3; + radioButtonList.TabStop = true; + radioButtonList.Text = "Список"; + radioButtonList.UseVisualStyleBackColor = true; + // + // radioButtonMassive + // + radioButtonMassive.AutoSize = true; + radioButtonMassive.Location = new Point(42, 65); + radioButtonMassive.Name = "radioButtonMassive"; + radioButtonMassive.Size = new Size(82, 24); + radioButtonMassive.TabIndex = 2; + radioButtonMassive.TabStop = true; + radioButtonMassive.Text = "Массив"; + radioButtonMassive.UseVisualStyleBackColor = true; + // + // textBoxCollectionName + // + textBoxCollectionName.Location = new Point(10, 32); + textBoxCollectionName.Name = "textBoxCollectionName"; + textBoxCollectionName.Size = new Size(252, 27); + textBoxCollectionName.TabIndex = 1; + // + // labelCollectionName + // + labelCollectionName.AutoSize = true; + labelCollectionName.Location = new Point(59, 9); + labelCollectionName.Name = "labelCollectionName"; + labelCollectionName.Size = new Size(158, 20); + labelCollectionName.TabIndex = 0; + labelCollectionName.Text = "Название коллекции:"; + // + // comboBoxSelectorCompany + // + comboBoxSelectorCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSelectorCompany.FormattingEnabled = true; + comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" }); + comboBoxSelectorCompany.Location = new Point(13, 296); + comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; + comboBoxSelectorCompany.Size = new Size(252, 28); + comboBoxSelectorCompany.TabIndex = 0; + comboBoxSelectorCompany.SelectedIndexChanged += ComboBoxSelectorCompany_SelectedIndexChanged; + // + // pictureBox + // + pictureBox.Dock = DockStyle.Fill; + pictureBox.Location = new Point(0, 28); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(859, 689); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(1136, 28); + menuStrip1.TabIndex = 2; + menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, loadToolStripMenuItem }); + fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + fileToolStripMenuItem.Size = new Size(59, 24); + fileToolStripMenuItem.Text = "Файл"; + // + // saveToolStripMenuItem + // + saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + saveToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S; + saveToolStripMenuItem.Size = new Size(227, 26); + saveToolStripMenuItem.Text = "Сохранение"; + saveToolStripMenuItem.Click += saveToolStripMenuItem_Click_1; + // + // loadToolStripMenuItem + // + loadToolStripMenuItem.Name = "loadToolStripMenuItem"; + loadToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.L; + loadToolStripMenuItem.Size = new Size(227, 26); + loadToolStripMenuItem.Text = "Загрузка"; + loadToolStripMenuItem.Click += loadToolStripMenuItem_Click_1; + // + // openFileDialog + // + openFileDialog.Filter = "txt file | *.txt"; + // + // saveFileDialog + // + saveFileDialog.Filter = "txt file | *.txt"; + // + // buttonSortByType + // + buttonSortByType.Location = new Point(4, 225); + buttonSortByType.Name = "buttonSortByType"; + buttonSortByType.Size = new Size(254, 42); + buttonSortByType.TabIndex = 7; + buttonSortByType.Text = "Сортировать по Типу"; + buttonSortByType.UseVisualStyleBackColor = true; + buttonSortByType.Click += buttonSortByType_Click; + // + // buttonSortByColor + // + buttonSortByColor.Location = new Point(4, 273); + buttonSortByColor.Name = "buttonSortByColor"; + buttonSortByColor.Size = new Size(252, 40); + buttonSortByColor.TabIndex = 8; + buttonSortByColor.Text = "Сортировать по Цвету"; + buttonSortByColor.UseVisualStyleBackColor = true; + buttonSortByColor.Click += buttonSortByColor_Click; + // + // FormLinerCollection + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1136, 717); + Controls.Add(pictureBox); + Controls.Add(groupBoxTools); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "FormLinerCollection"; + Text = "Коллекция лайнеров"; + groupBoxTools.ResumeLayout(false); + panelCompanyTools.ResumeLayout(false); + panelCompanyTools.PerformLayout(); + panelStorage.ResumeLayout(false); + panelStorage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private GroupBox groupBoxTools; + private ComboBox comboBoxSelectorCompany; + private PictureBox pictureBox; + private Button buttonRemoveLiner; + private MaskedTextBox maskedTextBox1; + private Button buttonRefresh; + private Button buttonGoToCheck; + private Panel panelStorage; + private RadioButton radioButtonMassive; + private TextBox textBoxCollectionName; + private Label labelCollectionName; + private Button buttonRemoveCollection; + private ListBox listBoxCollection; + private Button buttonAddCollection; + private RadioButton radioButtonList; + private Button buttonCreateCompany; + private Panel panelCompanyTools; + private Button buttonAddLiner; + private MenuStrip menuStrip1; + private ToolStripMenuItem fileToolStripMenuItem; + private ToolStripMenuItem saveToolStripMenuItem; + private ToolStripMenuItem loadToolStripMenuItem; + private OpenFileDialog openFileDialog; + private SaveFileDialog saveFileDialog; + private Button buttonSortByType; + private Button buttonSortByColor; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.cs b/ProjectLiner/ProjectLiner/FormLinerCollection.cs new file mode 100644 index 0000000..ed3a491 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLinerCollection.cs @@ -0,0 +1,349 @@ +using Microsoft.Extensions.Logging; +using ProjectLiner.CollectionGenericObjects; +using ProjectLiner.Drawnings; +using ProjectLiner.Exceptions; +using System.Windows.Forms; + +namespace ProjectLiner; + +public partial class FormLinerCollection : Form +{ + /// + /// Компания + /// + private AbstractCompany? _company = null; + + /// + /// Хранилище коллеций + /// + /// + private readonly StorageCollection _storageCollection; + + private readonly ILogger _logger; + + /// + /// Конструктор + /// + public FormLinerCollection(ILogger logger) + { + InitializeComponent(); + _storageCollection = new(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); + } + /// + /// Выбор компании + /// + /// + /// + /// + private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + panelCompanyTools.Enabled = false; + } + /// + /// Добавление самолёта + /// + /// + /// + private void buttonAddLiner_Click(object sender, EventArgs e) + { + FormLinerConfig form = new(); + // TODO передать метод + + form.Show(); + form.AddEvent(SetLiner); + + } + + /// + /// Добавление самолёта в коллекцию + /// + /// + private void SetLiner(DrawningLiner? liner) + { + try + { + if (_company == null || liner == null) + { + return; + } + + if (_company + liner != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: " + liner.GetDataForSave()); + } + } + + catch (ObjectNotFoundException) { } + catch (CollectionOverflowException ex) + { + MessageBox.Show("Не удалось добавить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + catch (ObjectIsEqualException ex) + { + MessageBox.Show("Такой объект уже присутствует в коллекции"); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Удаление объекта + /// + /// + /// + + private void ButtonDelPlane_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox1.Text) || _company == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + { + return; + } + + int pos = Convert.ToInt32(maskedTextBox1.Text); + + try + { + + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Удален объект по позиции " + pos); + } + } + catch (Exception ex) + { + MessageBox.Show("Не удалось удалить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message);//отсюда идут в ткс2 + } + } + /// + /// Передача объекта в другую форму + /// + /// + /// + private void ButtonGoToCheck_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + DrawningLiner? liner = null; + int counter = 100; + while (liner == null) + { + liner = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + if (liner == null) + { + return; + } + FormLiner form = new() + { + SetLiner = liner/// + }; + form.ShowDialog(); + } + /// + /// Перерисовка коллекции + /// + /// + /// + private void ButtonReFresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + pictureBox.Image = _company.Show(); + } + /// + /// Добавление коллекции + /// + /// + /// + private void ButtonCollectionAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogInformation("Не удалось добавить коллекцию: не все данные заполнены"); + return; + } + try + { + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + + RerfreshListBoxItems(); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); + } + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Удаление коллекции + /// + /// + /// + private void ButtonCollectionDel_Click(object sender, EventArgs e) + { + // TODO прописать логику удаления элемента из коллекции + // нужно убедиться, что есть выбранная коллекция + // спросить у пользователя через MessageBox, что он подтверждает, чтохочет удалить запись + // удалить и обновить ListBox + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + try + { + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RerfreshListBoxItems(); + _logger.LogInformation("Коллекция: " + listBoxCollection.SelectedItem.ToString() + " удалена"); + } + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Обновление спсика в listBoxCollection + /// + private void RerfreshListBoxItems() + { + listBoxCollection.Items.Clear(); + for (int i = 0; i < _storageCollection.Keys?.Count; ++i) + { + string? colName = _storageCollection.Keys?[i].Name; + if (!string.IsNullOrEmpty(colName)) + { + listBoxCollection.Items.Add(colName); + } + } + } + + /// + /// Создать компании + /// + /// + /// + private void ButtonCreateCompany_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + ICollectionGenericObjects? collection = + _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) + { + MessageBox.Show("Коллекция не проинициализирована"); + return; + } + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new DockService(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTools.Enabled = true; + RerfreshListBoxItems(); + + } + + private void saveToolStripMenuItem_Click_1(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + _storageCollection.SaveData(saveFileDialog.FileName); + MessageBox.Show("Сохранение прошло успешно", + "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); + } + + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + } + + private void loadToolStripMenuItem_Click_1(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + _storageCollection.LoadData(openFileDialog.FileName); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + RerfreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); + } + catch (Exception ex) + { + MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + } + + private void buttonSortByType_Click(object sender, EventArgs e) + { + CompareLiner(new DrawningLinerCompareByType()); + } + + private void buttonSortByColor_Click(object sender, EventArgs e) + { + CompareLiner(new DrawningLinerCompareByColor()); + } + + /// + /// Сортировка по сравнителю + /// + /// Сравнитель объектов + private void CompareLiner(IComparer comparer) + { + if (_company == null) + { + return; + } + _company.Sort(comparer); + pictureBox.Image = _company.Show(); + } +} diff --git a/ProjectAntiAircraftGun/Form1.resx b/ProjectLiner/ProjectLiner/FormLinerCollection.resx similarity index 100% rename from ProjectAntiAircraftGun/Form1.resx rename to ProjectLiner/ProjectLiner/FormLinerCollection.resx diff --git a/ProjectLiner/ProjectLiner/FormLinerConfig.Designer.cs b/ProjectLiner/ProjectLiner/FormLinerConfig.Designer.cs new file mode 100644 index 0000000..f6c2c2d --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLinerConfig.Designer.cs @@ -0,0 +1,357 @@ +namespace ProjectLiner +{ + partial class FormLinerConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + 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() + { + groupBoxConfig = new GroupBox(); + groupBoxColors = new GroupBox(); + panelPurple = new Panel(); + panelBlack = new Panel(); + panelGrey = new Panel(); + panelWhite = new Panel(); + panelYellow = new Panel(); + panelBlue = new Panel(); + panelGreen = new Panel(); + panelRed = new Panel(); + checkBoxMark = new CheckBox(); + checkBoxDecoratins = new CheckBox(); + numericUpDownWeight = new NumericUpDown(); + labelWeight = new Label(); + numericUpDownSpeed = new NumericUpDown(); + labelSpeed = new Label(); + labelModifiedObject = new Label(); + labelSimpleObject = new Label(); + pictureBoxObject = new PictureBox(); + buttonAdd = new Button(); + buttonCancel = new Button(); + panelObject = new Panel(); + labelAdditionalColor = new Label(); + labelBodyColor = new Label(); + groupBoxConfig.SuspendLayout(); + groupBoxColors.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).BeginInit(); + ((System.ComponentModel.ISupportInitialize)pictureBoxObject).BeginInit(); + panelObject.SuspendLayout(); + SuspendLayout(); + // + // groupBoxConfig + // + groupBoxConfig.Controls.Add(groupBoxColors); + groupBoxConfig.Controls.Add(checkBoxMark); + groupBoxConfig.Controls.Add(checkBoxDecoratins); + groupBoxConfig.Controls.Add(numericUpDownWeight); + groupBoxConfig.Controls.Add(labelWeight); + groupBoxConfig.Controls.Add(numericUpDownSpeed); + groupBoxConfig.Controls.Add(labelSpeed); + groupBoxConfig.Controls.Add(labelModifiedObject); + groupBoxConfig.Controls.Add(labelSimpleObject); + groupBoxConfig.Dock = DockStyle.Left; + groupBoxConfig.Location = new Point(0, 0); + groupBoxConfig.Name = "groupBoxConfig"; + groupBoxConfig.Size = new Size(478, 239); + groupBoxConfig.TabIndex = 0; + groupBoxConfig.TabStop = false; + groupBoxConfig.Text = "Параметры"; + // + // groupBoxColors + // + groupBoxColors.Controls.Add(panelPurple); + groupBoxColors.Controls.Add(panelBlack); + groupBoxColors.Controls.Add(panelGrey); + groupBoxColors.Controls.Add(panelWhite); + groupBoxColors.Controls.Add(panelYellow); + groupBoxColors.Controls.Add(panelBlue); + groupBoxColors.Controls.Add(panelGreen); + groupBoxColors.Controls.Add(panelRed); + groupBoxColors.Location = new Point(211, 22); + groupBoxColors.Name = "groupBoxColors"; + groupBoxColors.Size = new Size(231, 122); + groupBoxColors.TabIndex = 8; + groupBoxColors.TabStop = false; + groupBoxColors.Text = "Цвета"; + // + // panelPurple + // + panelPurple.BackColor = Color.Purple; + panelPurple.Location = new Point(176, 73); + panelPurple.Name = "panelPurple"; + panelPurple.Size = new Size(35, 32); + panelPurple.TabIndex = 1; + // + // panelBlack + // + panelBlack.BackColor = Color.Black; + panelBlack.Location = new Point(118, 73); + panelBlack.Name = "panelBlack"; + panelBlack.Size = new Size(35, 32); + panelBlack.TabIndex = 1; + // + // panelGrey + // + panelGrey.BackColor = Color.Gray; + panelGrey.Location = new Point(65, 73); + panelGrey.Name = "panelGrey"; + panelGrey.Size = new Size(35, 32); + panelGrey.TabIndex = 4; + // + // panelWhite + // + panelWhite.BackColor = Color.White; + panelWhite.Location = new Point(15, 73); + panelWhite.Name = "panelWhite"; + panelWhite.Size = new Size(35, 32); + panelWhite.TabIndex = 3; + // + // panelYellow + // + panelYellow.BackColor = Color.Yellow; + panelYellow.Location = new Point(176, 22); + panelYellow.Name = "panelYellow"; + panelYellow.Size = new Size(35, 32); + panelYellow.TabIndex = 1; + // + // panelBlue + // + panelBlue.BackColor = Color.Blue; + panelBlue.Location = new Point(118, 22); + panelBlue.Name = "panelBlue"; + panelBlue.Size = new Size(35, 32); + panelBlue.TabIndex = 2; + // + // panelGreen + // + panelGreen.BackColor = Color.FromArgb(0, 192, 0); + panelGreen.Location = new Point(65, 22); + panelGreen.Name = "panelGreen"; + panelGreen.Size = new Size(35, 32); + panelGreen.TabIndex = 1; + // + // panelRed + // + panelRed.BackColor = Color.Red; + panelRed.Location = new Point(15, 22); + panelRed.Name = "panelRed"; + panelRed.Size = new Size(35, 32); + panelRed.TabIndex = 0; + // + // checkBoxMark + // + checkBoxMark.AutoSize = true; + checkBoxMark.Location = new Point(6, 202); + checkBoxMark.Name = "checkBoxMark"; + checkBoxMark.Size = new Size(219, 19); + checkBoxMark.TabIndex = 7; + checkBoxMark.Text = "Признак наличия декораций"; + checkBoxMark.UseVisualStyleBackColor = true; + // + // checkBoxDecoratins + // + checkBoxDecoratins.AutoSize = true; + checkBoxDecoratins.Location = new Point(6, 160); + checkBoxDecoratins.Name = "checkBoxDecoratins"; + checkBoxDecoratins.Size = new Size(151, 19); + checkBoxDecoratins.TabIndex = 6; + checkBoxDecoratins.Text = "Признак наличия маркировки"; + checkBoxDecoratins.UseVisualStyleBackColor = true; + // + // numericUpDownWeight + // + numericUpDownWeight.Location = new Point(80, 68); + numericUpDownWeight.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + numericUpDownWeight.Minimum = new decimal(new int[] { 100, 0, 0, 0 }); + numericUpDownWeight.Name = "numericUpDownWeight"; + numericUpDownWeight.Size = new Size(62, 23); + numericUpDownWeight.TabIndex = 5; + numericUpDownWeight.Value = new decimal(new int[] { 100, 0, 0, 0 }); + // + // labelWeight + // + labelWeight.AutoSize = true; + labelWeight.Location = new Point(12, 70); + labelWeight.Name = "labelWeight"; + labelWeight.Size = new Size(29, 15); + labelWeight.TabIndex = 4; + labelWeight.Text = "Вес:"; + // + // numericUpDownSpeed + // + numericUpDownSpeed.Location = new Point(80, 32); + numericUpDownSpeed.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); + numericUpDownSpeed.Minimum = new decimal(new int[] { 100, 0, 0, 0 }); + numericUpDownSpeed.Name = "numericUpDownSpeed"; + numericUpDownSpeed.Size = new Size(62, 23); + numericUpDownSpeed.TabIndex = 3; + numericUpDownSpeed.Value = new decimal(new int[] { 100, 0, 0, 0 }); + // + // labelSpeed + // + labelSpeed.AutoSize = true; + labelSpeed.Location = new Point(12, 34); + labelSpeed.Name = "labelSpeed"; + labelSpeed.Size = new Size(62, 15); + labelSpeed.TabIndex = 2; + labelSpeed.Text = "Скорость:"; + // + // labelModifiedObject + // + labelModifiedObject.BorderStyle = BorderStyle.FixedSingle; + labelModifiedObject.Location = new Point(354, 194); + labelModifiedObject.Name = "labelModifiedObject"; + labelModifiedObject.Size = new Size(88, 33); + labelModifiedObject.TabIndex = 1; + labelModifiedObject.Text = "Продвинутый"; + labelModifiedObject.TextAlign = ContentAlignment.MiddleCenter; + labelModifiedObject.MouseDown += labelObject_MouseDown; + // + // labelSimpleObject + // + labelSimpleObject.BorderStyle = BorderStyle.FixedSingle; + labelSimpleObject.Location = new Point(248, 194); + labelSimpleObject.Name = "labelSimpleObject"; + labelSimpleObject.Size = new Size(88, 33); + labelSimpleObject.TabIndex = 0; + labelSimpleObject.Text = "Простой"; + labelSimpleObject.TextAlign = ContentAlignment.MiddleCenter; + labelSimpleObject.MouseDown += labelObject_MouseDown; + // + // pictureBoxObject + // + pictureBoxObject.Location = new Point(23, 26); + pictureBoxObject.Name = "pictureBoxObject"; + pictureBoxObject.Size = new Size(158, 152); + pictureBoxObject.TabIndex = 1; + pictureBoxObject.TabStop = false; + // + // buttonAdd + // + buttonAdd.Location = new Point(498, 204); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(75, 23); + buttonAdd.TabIndex = 2; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(579, 204); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 3; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + // + // panelObject + // + panelObject.AllowDrop = true; + panelObject.Controls.Add(labelAdditionalColor); + panelObject.Controls.Add(labelBodyColor); + panelObject.Controls.Add(pictureBoxObject); + panelObject.Location = new Point(484, 12); + panelObject.Name = "panelObject"; + panelObject.Size = new Size(194, 186); + panelObject.TabIndex = 4; + panelObject.DragDrop += panelObject_DragDrop; + panelObject.DragEnter += panelObject_DragEnter; + // + // labelAdditionalColor + // + labelAdditionalColor.AllowDrop = true; + labelAdditionalColor.BorderStyle = BorderStyle.FixedSingle; + labelAdditionalColor.Location = new Point(93, 0); + labelAdditionalColor.Name = "labelAdditionalColor"; + labelAdditionalColor.Size = new Size(88, 21); + labelAdditionalColor.TabIndex = 3; + labelAdditionalColor.Text = "Доп цвет"; + labelAdditionalColor.TextAlign = ContentAlignment.MiddleCenter; + labelAdditionalColor.DragDrop += labelAdditionalColor_DragDrop; + labelAdditionalColor.DragEnter += labelAdditionalColor_DragEnter; + // + // labelBodyColor + // + labelBodyColor.AllowDrop = true; + labelBodyColor.BorderStyle = BorderStyle.FixedSingle; + labelBodyColor.Location = new Point(14, 0); + labelBodyColor.Name = "labelBodyColor"; + labelBodyColor.Size = new Size(75, 21); + labelBodyColor.TabIndex = 2; + labelBodyColor.Text = "Цвет"; + labelBodyColor.TextAlign = ContentAlignment.MiddleCenter; + labelBodyColor.DragDrop += labelBodyColor_DragDrop; + labelBodyColor.DragEnter += labelBodyColor_DragEnter; + // + // FormLinerConfig + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(679, 239); + Controls.Add(panelObject); + Controls.Add(buttonCancel); + Controls.Add(buttonAdd); + Controls.Add(groupBoxConfig); + Name = "FormLinerConfig"; + Text = "Создание объетка"; + groupBoxConfig.ResumeLayout(false); + groupBoxConfig.PerformLayout(); + groupBoxColors.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownSpeed).EndInit(); + ((System.ComponentModel.ISupportInitialize)pictureBoxObject).EndInit(); + panelObject.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBoxConfig; + private Label labelSimpleObject; + private Label labelModifiedObject; + private NumericUpDown numericUpDownWeight; + private Label labelWeight; + private NumericUpDown numericUpDownSpeed; + private Label labelSpeed; + private CheckBox checkBoxDecoratins; + private CheckBox checkBoxMark; + private GroupBox groupBoxColors; + private Panel panelRed; + private Panel panelPurple; + private Panel panelBlack; + private Panel panelGrey; + private Panel panelWhite; + private Panel panelYellow; + private Panel panelBlue; + private Panel panelGreen; + private PictureBox pictureBoxObject; + private Button buttonAdd; + private Button buttonCancel; + private Panel panelObject; + private Label labelAdditionalColor; + private Label labelBodyColor; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/FormLinerConfig.cs b/ProjectLiner/ProjectLiner/FormLinerConfig.cs new file mode 100644 index 0000000..e1a28cb --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLinerConfig.cs @@ -0,0 +1,131 @@ +using ProjectLiner.Drawnings; +using ProjectLiner.Entities; + +namespace ProjectLiner; + +public partial class FormLinerConfig : Form +{ + private DrawningLiner? _Liner = null; + private event Action? LinerDelegate; + public FormLinerConfig() + { + InitializeComponent(); + panelRed.MouseDown += Panel_MouseDown; + panelGreen.MouseDown += Panel_MouseDown; + panelBlue.MouseDown += Panel_MouseDown; + panelYellow.MouseDown += Panel_MouseDown; + panelWhite.MouseDown += Panel_MouseDown; + panelGrey.MouseDown += Panel_MouseDown; + panelBlack.MouseDown += Panel_MouseDown; + panelPurple.MouseDown += Panel_MouseDown; + buttonCancel.Click += (sender, e) => Close(); + } + public void AddEvent(Action inerDelegate) + { + if (LinerDelegate == null) + { + LinerDelegate = inerDelegate; + } + else + { + LinerDelegate += inerDelegate; + } + } + private void DrawObject() + { + Bitmap bmp = new(pictureBoxObject.Width, pictureBoxObject.Height); + Graphics gr = Graphics.FromImage(bmp); + _Liner?.SetPictureSize(pictureBoxObject.Width, pictureBoxObject.Height); + _Liner?.SetPosition(5, 5); + _Liner?.DrawTransport(gr); + pictureBoxObject.Image = bmp; + } + private void labelObject_MouseDown(object sender, MouseEventArgs e) + { + (sender as Label)?.DoDragDrop((sender as Label)?.Name ?? string.Empty, DragDropEffects.Move | DragDropEffects.Copy); + } + private void panelObject_DragEnter(object sender, DragEventArgs e) + { + if (e.Data?.GetDataPresent(DataFormats.Text) ?? false) + { + e.Effect = DragDropEffects.Copy; + } + else + { + e.Effect = DragDropEffects.None; + } + } + private void panelObject_DragDrop(object sender, DragEventArgs e) + { + switch (e.Data?.GetData(DataFormats.Text)?.ToString()) + { + case "labelSimpleObject": + _Liner = new DrawningLiner((int)numericUpDownSpeed.Value, (double)numericUpDownWeight.Value, Color.White); + break; + case "labelModifiedObject": + _Liner = new DrawningBetterLiner((int)numericUpDownSpeed.Value, (double)numericUpDownWeight.Value, + Color.White, Color.Black, checkBoxDecoratins.Checked, checkBoxMark.Checked); + break; + } + labelBodyColor.BackColor = Color.Empty; + labelAdditionalColor.BackColor = Color.Empty; + DrawObject(); + } + private void Panel_MouseDown(object? sender, MouseEventArgs e) + { + // TODO отправка цвета в Drag&Drop + (sender as Control).DoDragDrop((sender as Control).BackColor, DragDropEffects.Move | DragDropEffects.Copy); + } + // TODO Реализовать логику смены цветов: основного и дополнительного (для продвинутого объекта) + private void labelBodyColor_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(typeof(Color))) + { + e.Effect = DragDropEffects.Copy; + } + else + { + e.Effect = DragDropEffects.None; + } + } + private void labelBodyColor_DragDrop(object sender, DragEventArgs e) + { + if (_Liner != null) + { + _Liner.EntityLiner.BodyColor = (Color)e.Data.GetData(typeof(Color)); + DrawObject(); + } + } + private void labelAdditionalColor_DragEnter(object sender, DragEventArgs e) + { + if (_Liner is DrawningBetterLiner) + { + if (e.Data.GetDataPresent(typeof(Color))) + { + e.Effect = DragDropEffects.Copy; + } + else + { + e.Effect = DragDropEffects.None; + } + } + } + + private void labelAdditionalColor_DragDrop(object sender, DragEventArgs e) + { + if (_Liner.EntityLiner is EntityBetterLiner _warmlyship) + { + _warmlyship.AdditionalColor = (Color)e.Data.GetData(typeof(Color)); + } + DrawObject(); + } + private void buttonAdd_Click(object sender, EventArgs e) + { + if (_Liner != null) + { + LinerDelegate?.Invoke(_Liner); + Close(); + } + } + +} diff --git a/ProjectLiner/ProjectLiner/FormLinerConfig.resx b/ProjectLiner/ProjectLiner/FormLinerConfig.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ProjectLiner/ProjectLiner/FormLinerConfig.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/AbstractStrategy.cs b/ProjectLiner/ProjectLiner/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..dea4f76 --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,139 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Класс-стратегия перемещения объекта +/// +public abstract class AbstractStrategy +{ + /// + /// Перемещаемый объект + /// + private IMoveableObject? _moveableObject; + + /// + /// Статус перемещения + /// + private StrategyStatus _state = StrategyStatus.NotInit; + + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + + /// + /// Статус перемещения + /// + public StrategyStatus GetStatus() { return _state; } + + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + + MoveToTarget(); + } + + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(MovementDirection.Right); + + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(MovementDirection.Up); + + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(MovementDirection.Down); + + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/IMoveableObjectcs.cs b/ProjectLiner/ProjectLiner/MovementStrategy/IMoveableObjectcs.cs new file mode 100644 index 0000000..255eebb --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/IMoveableObjectcs.cs @@ -0,0 +1,24 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Интерфейс для работы с перемещаемым объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCenter.cs b/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..92c40cb --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,54 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Стратегия перемещения объекта в центр экрана +/// +public class MoveToCenter : AbstractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + int 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/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCorner.cs b/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCorner.cs new file mode 100644 index 0000000..fbf039a --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/MoveToCorner.cs @@ -0,0 +1,26 @@ +namespace ProjectLiner.MovementStrategy; + +public class MoveToCorner : AbstractStrategy +{ + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.LeftBorder - GetStep() <= 0 || objParams.RightBorder + GetStep() >= FieldWidth || objParams.TopBorder - GetStep() <= 0 || objParams.ObjectMiddleVertical + GetStep() >= FieldHeight; + + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + return; + if (objParams.RightBorder + GetStep() < FieldWidth) + MoveRight(); + if (objParams.DownBorder + GetStep() < FieldHeight) + MoveDown(); + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/MoveableLiner.cs b/ProjectLiner/ProjectLiner/MovementStrategy/MoveableLiner.cs new file mode 100644 index 0000000..b0f31d8 --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/MoveableLiner.cs @@ -0,0 +1,64 @@ +using ProjectLiner.Drawnings; + +namespace ProjectLiner.MovementStrategy; + +/// +/// Класс-реализация IMoveableObject с использованием DrawningLiner +/// +public class MoveableLiner : IMoveableObject +{ + /// + /// Поле-объект класса DrawningLiner или его наследника + /// + private readonly DrawningLiner? _liner = null; + + /// + /// Конструктор + /// + /// Объект класса DrawningLiner + public MoveableLiner(DrawningLiner liner) + { + _liner = liner; + } + + public ObjectParameters? GetObjectPosition + { + get + { + if (_liner == null || _liner.EntityLiner == null || !_liner.GetPosX.HasValue || !_liner.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_liner.GetPosX.Value, _liner.GetPosY.Value, _liner.GetWidth, _liner.GetHeight); + } + } + + public int GetStep => (int)(_liner?.EntityLiner?.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_liner == null || _liner.EntityLiner == null) + { + return false; + } + + return _liner.MoveTransport(GetDirectionType(direction)); + } + + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/MovementDirection.cs b/ProjectLiner/ProjectLiner/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..43cc5fc --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/MovementDirection.cs @@ -0,0 +1,27 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/MovementStrategy/ObjectParameters.cs b/ProjectLiner/ProjectLiner/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..62df457 --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,72 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Параметры-координаты объекта +/// +public class ObjectParameters +{ + /// + /// Координата X + /// + private readonly int _x; + + /// + /// Координата Y + /// + 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; + + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина объекта + /// Высота объекта + 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/ProjectLiner/ProjectLiner/MovementStrategy/StrategyStatus.cs b/ProjectLiner/ProjectLiner/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..3c647fe --- /dev/null +++ b/ProjectLiner/ProjectLiner/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,22 @@ +namespace ProjectLiner.MovementStrategy; + +/// +/// Статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + + /// + /// Выполняется + /// + InProgress, + + /// + /// Завершено + /// + Finish +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Program.cs b/ProjectLiner/ProjectLiner/Program.cs new file mode 100644 index 0000000..dfa05d1 --- /dev/null +++ b/ProjectLiner/ProjectLiner/Program.cs @@ -0,0 +1,47 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using Serilog; +using System.Drawing; +namespace ProjectLiner +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider servicesProvider = services.BuildServiceProvider(); + Application.Run(servicesProvider.GetRequiredService()); + } + + private static void ConfigureServices(ServiceCollection services) + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + services.AddSingleton() + .AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .AddJsonFile($"{pathNeed}serilog.json") + .Build()) + .CreateLogger()); + }); + } + + } +} \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/ProjectLiner.csproj b/ProjectLiner/ProjectLiner/ProjectLiner.csproj new file mode 100644 index 0000000..41ee832 --- /dev/null +++ b/ProjectLiner/ProjectLiner/ProjectLiner.csproj @@ -0,0 +1,34 @@ + + + + WinExe + net7.0-windows + enable + true + enable + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs b/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2df683e --- /dev/null +++ b/ProjectLiner/ProjectLiner/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectLiner.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом 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() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [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("ProjectLiner.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowDown { + get { + object obj = ResourceManager.GetObject("arrowDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowLeft { + get { + object obj = ResourceManager.GetObject("arrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowRight { + get { + object obj = ResourceManager.GetObject("arrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowUp { + get { + object obj = ResourceManager.GetObject("arrowUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectLiner/ProjectLiner/Properties/Resources.resx b/ProjectLiner/ProjectLiner/Properties/Resources.resx new file mode 100644 index 0000000..293419e --- /dev/null +++ b/ProjectLiner/ProjectLiner/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\arrowDown.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowLeft.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowRight.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowUp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectLiner/ProjectLiner/Resources/arrowDown.jpg b/ProjectLiner/ProjectLiner/Resources/arrowDown.jpg new file mode 100644 index 0000000..f21002e Binary files /dev/null and b/ProjectLiner/ProjectLiner/Resources/arrowDown.jpg differ diff --git a/ProjectLiner/ProjectLiner/Resources/arrowLeft.jpg b/ProjectLiner/ProjectLiner/Resources/arrowLeft.jpg new file mode 100644 index 0000000..61b8dae Binary files /dev/null and b/ProjectLiner/ProjectLiner/Resources/arrowLeft.jpg differ diff --git a/ProjectLiner/ProjectLiner/Resources/arrowRight.jpg b/ProjectLiner/ProjectLiner/Resources/arrowRight.jpg new file mode 100644 index 0000000..b440197 Binary files /dev/null and b/ProjectLiner/ProjectLiner/Resources/arrowRight.jpg differ diff --git a/ProjectLiner/ProjectLiner/Resources/arrowUp.jpg b/ProjectLiner/ProjectLiner/Resources/arrowUp.jpg new file mode 100644 index 0000000..e630cea Binary files /dev/null and b/ProjectLiner/ProjectLiner/Resources/arrowUp.jpg differ diff --git a/ProjectLiner/ProjectLiner/serilog.json b/ProjectLiner/ProjectLiner/serilog.json new file mode 100644 index 0000000..a7878e1 --- /dev/null +++ b/ProjectLiner/ProjectLiner/serilog.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "log.log" } + } + ], + "Properties": { + "Application": "Sample" + } + } +} diff --git a/README.md b/README.md deleted file mode 100644 index cde033b..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# ISEbd-11_Khatypov_K.R_fundamental -