Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Зиновьева Милана #13

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
67 changes: 67 additions & 0 deletions ConsoleClient/DependencyInjectionConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.Drawing;
using Autofac;
using DrawingTagsCloudVisualization;
using TagsCloudVisualization;
using TagsCloudVisualization.FilesProcessing;
using TagsCloudVisualization.ManagingRendering;

namespace ConsoleClient;

public static class DependencyInjectionConfig
{
public static IContainer BuildContainer(Options options)
{
var builder = new ContainerBuilder();

builder.RegisterInstance(new MyStemWrapper.MyStem
{
PathToMyStem = "mystem",
Parameters = "-ni"
}).As<MyStemWrapper.MyStem>().SingleInstance();

builder.RegisterType<MorphologicalProcessing>()
.As<IMorphologicalAnalyzer>()
.InstancePerDependency();

builder.RegisterType<TxtFileProcessor>()
.As<IFileProcessor>()
.InstancePerDependency();

builder.Register<ISpiral>(c =>
{
var centerPoint = new Point(options.CenterX, options.CenterY);
return options.AlgorithmForming switch
{
"Circle" => new ArchimedeanSpiral(centerPoint, 1),
_ => new FermatSpiral(centerPoint, 20),
};
}).As<ISpiral>().InstancePerDependency();

builder.RegisterType<WordHandler>()
.As<IWordHandler>()
.InstancePerDependency();
builder.RegisterType<RectangleGenerator>()
.As<IRectangleGenerator>()
.InstancePerDependency();
builder.RegisterType<TagsCloudDrawingFacade>()
.As<ITagsCloudDrawingFacade>()
.InstancePerDependency();

switch (options.AlgorithmDrawing)
{
case "Altering":
builder.RegisterType<AlternatingColorsTagsCloudDrawer>().As<ITagsCloudDrawer>()
.InstancePerDependency();
break;
default:
builder.RegisterType<StandartTagsCloudDrawer>().As<ITagsCloudDrawer>()
.InstancePerDependency();
break;
}
builder.RegisterType<ImageSaver>()
.As<IImageSaver>()
.InstancePerDependency();

return builder.Build();
}
}
13 changes: 12 additions & 1 deletion ConsoleClient/Examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,16 @@ Args: dotnet run -- -c pink -o Examples/example3.png
![alt text](example3.png)

# 5 example:

Args: dotnet run -- -a Fermat -o Examples/example4.png
![alt text](example4.png)
![alt text](example4.png)

# 6 example:

Args: dotnet run -- -p S -o Examples/example5.png
![alt text](example5.png)

# 7 example:

Args: dotnet run -- -d Altering -o Examples/example7.png
![alt text](example7.png)
Binary file modified ConsoleClient/Examples/example.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ConsoleClient/Examples/example5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ConsoleClient/Examples/example7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions ConsoleClient/ITagsCloudDrawingFacade.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace ConsoleClient;
public interface ITagsCloudDrawingFacade
{
void DrawRectangle(Options options);
}
14 changes: 10 additions & 4 deletions ConsoleClient/Options.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@ public class Options
[Option('y', "centerY", Default = 200, HelpText = "Координата Y центра.")]
public int CenterY { get; set; }

[Option('l', "lenght", Default = 400, HelpText = "Длина изображения")]
public int Lenght { get; set; }
[Option('l', "length", Default = 400, HelpText = "Длина изображения")]
public int Length { get; set; }

[Option('w', "width", Default = 400, HelpText = "Ширина изображения")]
public int Width{ get; set; }

[Option('c', "color", Default = "black", HelpText = "Цвет текста")]
public string Color{ get; set; }

[Option('a', "algoritm", Default = "Circle", HelpText = "Алгоритм(квадрат, круг)")]
public string Algorithm{ get; set; }
[Option('a', "algorithmf", Default = "Circle", HelpText = "Алгоритм формирования(квадрат, круг)")]
public string AlgorithmForming{ get; set; }

[Option('p', "partofspeech", Default = "all", HelpText = "Часть речи S V A")]
public string PartOfSpeech{ get; set; }

[Option('d', "algorithmd", Default = "Standart", HelpText = "Алгоритм рисования(Standart, Altering)")]
public string AlgorithmDrawing{ get; set; }
}
83 changes: 34 additions & 49 deletions ConsoleClient/Program.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
using System.Drawing;
using Autofac;
using CommandLine;
using DrawingTagsCloudVisualization;
using TagsCloudVisualization;
using TagsCloudVisualization.FilesProcessing;
using TagsCloudVisualization.ManagingRendering;

namespace ConsoleClient;


public class Program
{
static void Main(string[] args)
Expand All @@ -19,59 +15,30 @@ static void Main(string[] args)

private static void RunApplication(Options options)
{
var builder = new ContainerBuilder();

builder.Register(c =>
if (options.AlgorithmForming != "Circle" && options.AlgorithmForming != "Fermat")
{
var mystem = new MyStemWrapper.MyStem
{
PathToMyStem = "mystem",
Parameters = "-ni"
};
return mystem;
}).As<MyStemWrapper.MyStem>().SingleInstance();

builder.RegisterType<MorphologicalProcessing>()
.As<IMorphologicalAnalyzer>()
.InstancePerDependency();

builder.RegisterType<TxtFileProcessor>()
.As<IFileProcessor>()
.InstancePerDependency();

builder.RegisterType<RectangleGenerator>()
.As<IRectangleGenerator>()
.InstancePerDependency();
Console.WriteLine($"Ошибка: Неизвестный алгоритм '{options.AlgorithmForming}'. Допустимые значения: 'Circle', 'Fermat'.");
return;
}

builder.Register<ISpiral>(c =>
if (options.PartOfSpeech != "all" && options.PartOfSpeech != "S" && options.PartOfSpeech != "V"
&& options.PartOfSpeech != "A")
{
if (options.Algorithm.Equals("Circle", StringComparison.OrdinalIgnoreCase))
{
return new ArchimedeanSpiral(new Point(options.CenterX, options.CenterY), 1);
}
return new FermatSpiral(new Point(options.CenterX, options.CenterY), 20);
}).As<ISpiral>().InstancePerDependency();

builder.RegisterType<WordHandler>()
.As<IWordHandler>()
.InstancePerDependency();
Console.WriteLine($"Ошибка: Неизвестная часть речи '{options.PartOfSpeech}'");
return;
}

builder.Register(c =>
if (options.AlgorithmDrawing != "Standart" && options.AlgorithmDrawing != "Altering")
{
var wordHandler = c.Resolve<IWordHandler>();
var frequencyRectangles = wordHandler.ProcessFile(options.InputFilePath);
var arrRect = c.Resolve<IRectangleGenerator>().ExecuteRectangles(frequencyRectangles, new Point(options.CenterX, options.CenterY));
return new DrawingTagsCloud(arrRect);
}).As<IDrawingTagsCloud>().InstancePerDependency();

var container = builder.Build();
Console.WriteLine($"Ошибка: Неизвестный алгоритм рассказки '{options.AlgorithmDrawing}'");
return;
}
var container = DependencyInjectionConfig.BuildContainer(options);

using var scope = container.BeginLifetimeScope();
try
{
var drawingTagsCloud = scope.Resolve<IDrawingTagsCloud>();
drawingTagsCloud.SaveToFile(options.OutputFilePath, options.Lenght, options.Width, options.Color);

scope.Resolve<ITagsCloudDrawingFacade>().DrawRectangle(options);
Console.WriteLine($"Облако тегов успешно сохранено в файл: {options.OutputFilePath}");
}
catch (Exception ex)
Expand All @@ -83,5 +50,23 @@ private static void RunApplication(Options options)
private static void HandleErrors(IEnumerable<Error> errors)
{
Console.WriteLine("Ошибка при обработке аргументов командной строки.");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот тут бы обработать коллекцию ошибок, чтобы пользователя не оставить в недоумении

foreach (var error in errors)
{
switch (error)
{
case UnknownOptionError unknownOptionError:
Console.WriteLine($"- Неизвестный параметр: {unknownOptionError.Token}");
break;
case SetValueExceptionError setValueExceptionError:
Console.WriteLine($"- Ошибка установки значения: {setValueExceptionError.Exception.Message}");
break;
case MissingValueOptionError missingValueOptionError:
Console.WriteLine($"- Отсутствует значение: {missingValueOptionError.NameInfo}");
break;
default:
Console.WriteLine($"- Неизвестная ошибка: {error.GetType().Name}");
break;
}
}
}
}
20 changes: 20 additions & 0 deletions ConsoleClient/TagsCloudDrawingFacade.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Drawing;
using DrawingTagsCloudVisualization;
using TagsCloudVisualization;
namespace ConsoleClient;

public class TagsCloudDrawingFacade(
IWordHandler wordHandler,
IRectangleGenerator rectangleGenerator, IImageSaver imageSaver) : ITagsCloudDrawingFacade
{
private readonly IWordHandler _wordHandler = wordHandler;
private readonly IRectangleGenerator _rectangleGenerator = rectangleGenerator;
private readonly IImageSaver _imageSaver = imageSaver;

public void DrawRectangle(Options options)
{
var frequencyRectangles = _wordHandler.ProcessFile(options.InputFilePath, options.PartOfSpeech);
var arrRect = _rectangleGenerator.ExecuteRectangles(frequencyRectangles, new Point(options.CenterX, options.CenterY));
_imageSaver.SaveToFile(options.OutputFilePath, options.Length, options.Width, options.Color, arrRect);
}
}
48 changes: 48 additions & 0 deletions DrawingTagsCloudVisualization/AlternatingColorsTagsCloudDrawer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Microsoft.Maui.Graphics;
using TagsCloudVisualization;

namespace DrawingTagsCloudVisualization;

public class AlternatingColorsTagsCloudDrawer() : ITagsCloudDrawer
{
private readonly List<Color> colors = new List<Color>
{
Colors.White,
Colors.Red,
Colors.Green,
Colors.Yellow,
Colors.Blue,
Colors.Pink,
Colors.Black
};

public ICanvas Draw(ICanvas canvas, string color, List<RectangleInformation> rectangleInformation)
{
for (int i = 0; i < rectangleInformation.Count; i++)
{
var rectInfo = rectangleInformation[i];
var rect = rectInfo.rectangle;
var text = rectInfo.word;

var currentColor = colors[i % colors.Count];
canvas.FontColor = currentColor;

float fontSize = rect.Height;
var textBounds = canvas.GetStringSize(text, Font.Default, fontSize);

while ((textBounds.Width > rect.Width || textBounds.Height > rect.Height) && fontSize > 1)
{
fontSize -= 1;
textBounds = canvas.GetStringSize(text, Font.Default, fontSize);
}

canvas.FontSize = fontSize;
var textX = rect.X + (rect.Width - textBounds.Width) / 2;
var textY = rect.Y + (rect.Height - textBounds.Height) / 2;

canvas.DrawString(text, textX, textY, HorizontalAlignment.Left);
}

return canvas;
}
}
67 changes: 0 additions & 67 deletions DrawingTagsCloudVisualization/DrawingTagsCloud.cs

This file was deleted.

8 changes: 8 additions & 0 deletions DrawingTagsCloudVisualization/IImageSaver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using TagsCloudVisualization;

namespace DrawingTagsCloudVisualization;

public interface IImageSaver
{
public void SaveToFile(string filePath, int lenght, int width, string color, List<RectangleInformation> rectangleInformation);
}
9 changes: 9 additions & 0 deletions DrawingTagsCloudVisualization/ITagsCloudDrawer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Microsoft.Maui.Graphics;
using TagsCloudVisualization;

namespace DrawingTagsCloudVisualization;

public interface ITagsCloudDrawer
{
public ICanvas Draw(ICanvas canvas, string color, List<RectangleInformation> rectangleInformation);
}
Loading