From 74e4698c438df6d602b3fff6d18bed49160b8ef8 Mon Sep 17 00:00:00 2001 From: THE_KONDRAT Date: Sun, 27 Apr 2025 14:19:57 +0300 Subject: [PATCH] render service with test layer +grpc interaction --- .../ConcreteLayers/Layer1.cs => .dockerignore | 0 Domain/ConsoleImageDrawer.cs | 77 ---------------- Domain/{Something => }/ExpIniFileGenerator.cs | 2 +- Domain/ILayer.cs | 8 -- .../IFrameRender.cs} | 0 Domain/Interfaces/ILayer.cs | 13 +++ Domain/Interfaces/IRenderManager.cs | 8 ++ Domain/Project.cs | 0 Domain/Render.cs | 0 Domain/RenderManager.cs | 0 Domain/RenderPart/BigFrameRender.cs | 92 +++++++++++++++++++ Domain/RenderPart/FrameRender.cs | 6 ++ Domain/RenderPart/RenderPartBase.cs | 46 ++++++++++ Make3.RenderServer/Dockerfile | 23 +++++ .../Grpc/Protos/Layers/test-layer.proto | 0 Make3.RenderServer/Layers/TestLayer.cs | 0 Make3.RenderServer/Make3.RenderServer.csproj | 20 ++++ Make3.RenderServer/Make3.RenderServer.http | 6 ++ Make3.RenderServer/Program.cs | 41 +++++++++ .../Properties/launchSettings.json | 23 +++++ .../TestProjectBackgroundService.cs | 0 .../appsettings.Development.json | 8 ++ Make3.RenderServer/appsettings.json | 9 ++ Make3.Renderer/Layer1.cs | 17 ++++ Make3.Renderer/Layers/LayerBase.cs | 26 ------ Make3.Renderer/Layers/TrekoLayers/Treko.cs | 45 --------- Make3.Renderer/Layers/TrekoLayers/Treko3d.cs | 17 ---- 27 files changed, 313 insertions(+), 174 deletions(-) rename Domain/ConcreteLayers/Layer1.cs => .dockerignore (100%) delete mode 100644 Domain/ConsoleImageDrawer.cs rename Domain/{Something => }/ExpIniFileGenerator.cs (98%) delete mode 100644 Domain/ILayer.cs rename Domain/{RenderConveyerBelt.cs => Interfaces/IFrameRender.cs} (100%) create mode 100644 Domain/Interfaces/ILayer.cs create mode 100644 Domain/Interfaces/IRenderManager.cs create mode 100644 Domain/Project.cs create mode 100644 Domain/Render.cs create mode 100644 Domain/RenderManager.cs create mode 100644 Domain/RenderPart/BigFrameRender.cs create mode 100644 Domain/RenderPart/FrameRender.cs create mode 100644 Domain/RenderPart/RenderPartBase.cs create mode 100644 Make3.RenderServer/Dockerfile create mode 100644 Make3.RenderServer/Grpc/Protos/Layers/test-layer.proto create mode 100644 Make3.RenderServer/Layers/TestLayer.cs create mode 100644 Make3.RenderServer/Make3.RenderServer.csproj create mode 100644 Make3.RenderServer/Make3.RenderServer.http create mode 100644 Make3.RenderServer/Program.cs create mode 100644 Make3.RenderServer/Properties/launchSettings.json create mode 100644 Make3.RenderServer/TestProjectBackgroundService.cs create mode 100644 Make3.RenderServer/appsettings.Development.json create mode 100644 Make3.RenderServer/appsettings.json create mode 100644 Make3.Renderer/Layer1.cs delete mode 100644 Make3.Renderer/Layers/LayerBase.cs delete mode 100644 Make3.Renderer/Layers/TrekoLayers/Treko.cs delete mode 100644 Make3.Renderer/Layers/TrekoLayers/Treko3d.cs diff --git a/Domain/ConcreteLayers/Layer1.cs b/.dockerignore similarity index 100% rename from Domain/ConcreteLayers/Layer1.cs rename to .dockerignore diff --git a/Domain/ConsoleImageDrawer.cs b/Domain/ConsoleImageDrawer.cs deleted file mode 100644 index 85177f0..0000000 --- a/Domain/ConsoleImageDrawer.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -namespace Domain; - -public class ConsoleImageDrawer -{ - private char[,]? _image; // Изображение хранится внутри класса - - // 1. Нарисовать изображение - public void DrawImage(char[,] image) - { - Console.Clear(); - _image = image; - for (int i = 0; i < _image.GetLength(0); i++) - { - for (int j = 0; j < _image.GetLength(1); j++) - { - Console.SetCursorPosition(j, i); - Console.Write(_image[i, j]); - } - } - } - - // 2. Заменить фон в указанной области на цвет - public void SetBackgroundColor(int startRow, int startCol, int height, int width, ConsoleColor color) - { - if (_image == null) - { - Console.Clear(); - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Image is not set"); - Console.ForegroundColor = ConsoleColor.Black; - return; - } - Console.BackgroundColor = color; - for (int i = startRow; i < Math.Min(startRow + height, _image.GetLength(0)); i++) - { - for (int j = startCol; j < Math.Min(startCol + width, _image.GetLength(1)); j++) - { - Console.SetCursorPosition(j, i); - Console.Write(_image[i, j]); - } - } - Console.ResetColor(); // Сброс цвета - } - - // 3. Отменить фон (вернуть черный) - public void ResetBackgroundColor(int startRow, int startCol, int height, int width) - { - SetBackgroundColor(startRow, startCol, height, width, ConsoleColor.Black); - } - - // 4. Изменить цвет указанного символа - public void SetCharacterColor(int row, int col, ConsoleColor foregroundColor) - { - if (_image == null) - { - Console.Clear(); - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Image is not set"); - Console.ForegroundColor = ConsoleColor.Black; - return; - } - if (row >= 0 && row < _image.GetLength(0) && col >= 0 && col < _image.GetLength(1)) - { - Console.SetCursorPosition(col, row); - Console.ForegroundColor = foregroundColor; - Console.Write(_image[row, col]); - Console.ResetColor(); // Сброс цвета - } - } - - // 5. Стереть изображение - public void ClearImage() - { - Console.Clear(); - } -} diff --git a/Domain/Something/ExpIniFileGenerator.cs b/Domain/ExpIniFileGenerator.cs similarity index 98% rename from Domain/Something/ExpIniFileGenerator.cs rename to Domain/ExpIniFileGenerator.cs index 942e7e3..96bd9e1 100644 --- a/Domain/Something/ExpIniFileGenerator.cs +++ b/Domain/ExpIniFileGenerator.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Domain.Somthing; +namespace Domain.Something; public class ExpIniFileGenerator(uint rowCount, uint oddColumnCount, uint evenColumnCount) { diff --git a/Domain/ILayer.cs b/Domain/ILayer.cs deleted file mode 100644 index 0f0501a..0000000 --- a/Domain/ILayer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Domain.Abstractions; - -public interface ILayer -{ - public uint Order { get; } - public OpticalSchema OpticalSchema { get; } - public Task Execute(); -} diff --git a/Domain/RenderConveyerBelt.cs b/Domain/Interfaces/IFrameRender.cs similarity index 100% rename from Domain/RenderConveyerBelt.cs rename to Domain/Interfaces/IFrameRender.cs diff --git a/Domain/Interfaces/ILayer.cs b/Domain/Interfaces/ILayer.cs new file mode 100644 index 0000000..a089c17 --- /dev/null +++ b/Domain/Interfaces/ILayer.cs @@ -0,0 +1,13 @@ +using SkiaSharp; +namespace Domain; + +public interface ILayer +{ + public uint Order { get; } + public OpticalSchema OpticalSchema { get; } + public SKBitmap Image { get; } + public SKBitmap? Mask { get; } + public bool InvertMask { get; } + public Task Prerender(); + public Task Render(uint u, uint u1, uint frameWidth, uint frameHeight, SKBitmap automask); +} diff --git a/Domain/Interfaces/IRenderManager.cs b/Domain/Interfaces/IRenderManager.cs new file mode 100644 index 0000000..c207fd0 --- /dev/null +++ b/Domain/Interfaces/IRenderManager.cs @@ -0,0 +1,8 @@ +namespace Domain; + +public interface IRenderManager +{ + public Task StartRender(Project project); + public Task StopRender(Guid renderId); + IEnumerable GetActiveRenders(); +} \ No newline at end of file diff --git a/Domain/Project.cs b/Domain/Project.cs new file mode 100644 index 0000000..e69de29 diff --git a/Domain/Render.cs b/Domain/Render.cs new file mode 100644 index 0000000..e69de29 diff --git a/Domain/RenderManager.cs b/Domain/RenderManager.cs new file mode 100644 index 0000000..e69de29 diff --git a/Domain/RenderPart/BigFrameRender.cs b/Domain/RenderPart/BigFrameRender.cs new file mode 100644 index 0000000..b308958 --- /dev/null +++ b/Domain/RenderPart/BigFrameRender.cs @@ -0,0 +1,92 @@ +using Domain.Abstractions; +using Domain.Interfaces; +using Domain.Something; +using SkiaSharp; + +namespace Domain; + +public class BigFrameRender : RenderPartBase +{ + private readonly uint _bigFrameWidth; + private readonly uint _bigFrameHeight; + public BigFrameRender(IEnumerable layers, uint row, uint col, uint bigFrameWidth, uint bigFrameHeight, Guid renderId) : + base(layers, row, col, renderId) + { + _bigFrameWidth = bigFrameWidth; + _bigFrameHeight = bigFrameHeight; + } + + public override async Task> Execute(CancellationToken cancellationToken) + { + var frameExpInfos = new List(); + BigFrameLayerRenderResult? previousLayerResult = null; + // _drawer.SetBackgroundColor((int)y, (int)x, (int)currentFrameHeight, (int)currentFrameWidth, ConsoleColor.DarkBlue); + + foreach (var layer in _layers.OrderBy(q => q.Order)) + { + previousLayerResult = await RenderBigFrame(layer, _col, _row, _bigFrameWidth, _bigFrameHeight, previousLayerResult); + } + + if (previousLayerResult != null) + { + //split bigFrame + for (uint row = 0; row < _bigFrameHeight; row++) + { + for (uint col = 0; col < _bigFrameWidth; col++) + { + try + { + // Task.Delay(20).Wait(); + var frameInfo = new ExpIniFileGenerator.FrameExpInfo{ Row = row, Column = col }; + // if (!IsImageEmpty(previousLayerResult.Frame[col,row])) + // { + // frameInfo.IsContainAnything = true; + // await SaveImage(previousLayerResult.Frame[col, row], ""); + // } + frameExpInfos.Add(frameInfo); + } + catch (Exception ex) + { + + } + } + } + } + + return frameExpInfos; + } + + private async Task RenderBigFrame(ILayer layer, uint x, uint y, uint bigFrameWidth, uint bigFrameHeight, BigFrameLayerRenderResult? previousLayerResult) + { + var automask = previousLayerResult?.Frame ?? new SKBitmap(Convert.ToInt32(bigFrameWidth), Convert.ToInt32(bigFrameHeight)); + var result = new BigFrameLayerRenderResult() + { + Frame = new SKBitmap(Convert.ToInt32(bigFrameWidth), Convert.ToInt32(bigFrameHeight)), + }; + result.Frame = await layer.Render(x, y, bigFrameWidth, bigFrameHeight, automask); + return result; + } + + private bool IsImageEmpty(char image) + { + return image is '\0' or ' '; + } + + private async Task SaveImage(char image, string destination) + { + //destinationn is object + // + await Task.Delay(200); + } + + protected override Task RenderImage() + { + throw new NotImplementedException(); + } + + + public override long EstimateMemoryUsage() + { + return 10; + } +} \ No newline at end of file diff --git a/Domain/RenderPart/FrameRender.cs b/Domain/RenderPart/FrameRender.cs new file mode 100644 index 0000000..ea666dd --- /dev/null +++ b/Domain/RenderPart/FrameRender.cs @@ -0,0 +1,6 @@ +namespace Domain.RenderPart; + +// public class FrameRenderPart : RenderPartBase +// { +// +// } \ No newline at end of file diff --git a/Domain/RenderPart/RenderPartBase.cs b/Domain/RenderPart/RenderPartBase.cs new file mode 100644 index 0000000..99fded6 --- /dev/null +++ b/Domain/RenderPart/RenderPartBase.cs @@ -0,0 +1,46 @@ +using System.Collections; +using Domain.Abstractions; +using Domain.Interfaces; +using Domain.Something; + +namespace Domain; + +public abstract class RenderPartBase : IFrameRender +{ + protected readonly IEnumerable _layers; + + protected uint _row; + protected uint _col; + + public Guid RenderId { get; private set; } + + protected RenderPartBase(IEnumerable layers, uint row, uint col, Guid renderId) + { + _layers = layers; + _row = row; + _col = col; + RenderId = renderId; + } + + public abstract Task> Execute(CancellationToken cancellationToken); + + public abstract long EstimateMemoryUsage(); + + protected abstract Task RenderImage(); + + protected virtual Task CreateFrameInfo() + { + throw new NotImplementedException(); + return Task.FromResult(new ExpIniFileGenerator.FrameExpInfo()); + } + + protected virtual uint SetFrameNumber(uint row, uint column, uint columnsInRow) + { + return column + (row * columnsInRow); + } + + protected Task SaveFrame() + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Make3.RenderServer/Dockerfile b/Make3.RenderServer/Dockerfile new file mode 100644 index 0000000..0c93438 --- /dev/null +++ b/Make3.RenderServer/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +USER $APP_UID +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Make3.RenderServer/Make3.RenderServer.csproj", "Make3.RenderServer/"] +RUN dotnet restore "Make3.RenderServer/Make3.RenderServer.csproj" +COPY . . +WORKDIR "/src/Make3.RenderServer" +RUN dotnet build "./Make3.RenderServer.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./Make3.RenderServer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Make3.RenderServer.dll"] diff --git a/Make3.RenderServer/Grpc/Protos/Layers/test-layer.proto b/Make3.RenderServer/Grpc/Protos/Layers/test-layer.proto new file mode 100644 index 0000000..e69de29 diff --git a/Make3.RenderServer/Layers/TestLayer.cs b/Make3.RenderServer/Layers/TestLayer.cs new file mode 100644 index 0000000..e69de29 diff --git a/Make3.RenderServer/Make3.RenderServer.csproj b/Make3.RenderServer/Make3.RenderServer.csproj new file mode 100644 index 0000000..672bca4 --- /dev/null +++ b/Make3.RenderServer/Make3.RenderServer.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + enable + enable + Linux + + + + + + + + + .dockerignore + + + + diff --git a/Make3.RenderServer/Make3.RenderServer.http b/Make3.RenderServer/Make3.RenderServer.http new file mode 100644 index 0000000..f847760 --- /dev/null +++ b/Make3.RenderServer/Make3.RenderServer.http @@ -0,0 +1,6 @@ +@Make3.RenderServer_HostAddress = http://localhost:5198 + +GET {{Make3.RenderServer_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/Make3.RenderServer/Program.cs b/Make3.RenderServer/Program.cs new file mode 100644 index 0000000..d5e0ef3 --- /dev/null +++ b/Make3.RenderServer/Program.cs @@ -0,0 +1,41 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi +builder.Services.AddOpenApi(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.MapOpenApi(); +} + +app.UseHttpsRedirection(); + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/weatherforecast", () => + { + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; + }) + .WithName("GetWeatherForecast"); + +app.Run(); + +record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} \ No newline at end of file diff --git a/Make3.RenderServer/Properties/launchSettings.json b/Make3.RenderServer/Properties/launchSettings.json new file mode 100644 index 0000000..a35e9d4 --- /dev/null +++ b/Make3.RenderServer/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5198", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7264;http://localhost:5198", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Make3.RenderServer/TestProjectBackgroundService.cs b/Make3.RenderServer/TestProjectBackgroundService.cs new file mode 100644 index 0000000..e69de29 diff --git a/Make3.RenderServer/appsettings.Development.json b/Make3.RenderServer/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/Make3.RenderServer/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Make3.RenderServer/appsettings.json b/Make3.RenderServer/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/Make3.RenderServer/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Make3.Renderer/Layer1.cs b/Make3.Renderer/Layer1.cs new file mode 100644 index 0000000..0a8897c --- /dev/null +++ b/Make3.Renderer/Layer1.cs @@ -0,0 +1,17 @@ +using Domain.Abstractions; + +namespace Domain.ConcreteLayers; + +public class Layer1 : ILayer +{ + public uint Order { get; set; } + public OpticalSchema OpticalSchema { get; set; } + public char[,] Image { get; set; } + public char[,]? Mask { get; set; } + public bool InvertMask { get; set; } + + public Task Execute() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Make3.Renderer/Layers/LayerBase.cs b/Make3.Renderer/Layers/LayerBase.cs deleted file mode 100644 index 34f3ce0..0000000 --- a/Make3.Renderer/Layers/LayerBase.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Domain; -using Domain.Abstractions; - -namespace Make3.Renderer.Layers; - -internal abstract class LayerBase : ILayer -{ - public uint Order { get; private set; } - - public abstract OpticalSchema OpticalSchema { get; } - - protected LayerBase(uint order) - { - Order = order; - } - - public async Task Execute() - { - await Render(); - } - - protected virtual Task Render() - { - throw new NotImplementedException(); - } -} diff --git a/Make3.Renderer/Layers/TrekoLayers/Treko.cs b/Make3.Renderer/Layers/TrekoLayers/Treko.cs deleted file mode 100644 index 825a981..0000000 --- a/Make3.Renderer/Layers/TrekoLayers/Treko.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Domain; - -namespace Make3.Renderer.Layers.TrekoLayers -{ - internal class Treko : LayerBase - { - public override OpticalSchema OpticalSchema => OpticalSchema.Sp0; - - - internal Treko(uint order) : base(order) { } - - protected override Task Render() - { - var a = Step3(Step2(Step1())); - - - - - //return base.Render(); - return Task.CompletedTask; - } - - protected string Step1() - { - Step1_1(); - return ""; - } - - protected string Step1_1() - { - return ""; - } - - private string Step2(string inputValue) - { - return "nothing"; - } - - private int Step3(string inputValue) - { - return 0; - } - - } -} diff --git a/Make3.Renderer/Layers/TrekoLayers/Treko3d.cs b/Make3.Renderer/Layers/TrekoLayers/Treko3d.cs deleted file mode 100644 index 08e0b53..0000000 --- a/Make3.Renderer/Layers/TrekoLayers/Treko3d.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Domain; - -namespace Make3.Renderer.Layers.TrekoLayers -{ - internal class Treko3d : LayerBase - { - public override OpticalSchema OpticalSchema => OpticalSchema.Sp0; - - internal Treko3d(uint order) : base(order) { } - - protected override Task Render() - { - - return base.Render(); - } - } -}