From 7da7700ca0114408a3083d76873d375ec5d48151 Mon Sep 17 00:00:00 2001 From: billyboy35 Date: Tue, 12 Nov 2024 22:17:57 +0100 Subject: [PATCH] Next --- .env.example | 2 +- .../Controllers/MetalCuttingController.php | 16 +- app/Http/Controllers/WelcomeController.php | 11 ++ app/Services/DxfService.php | 76 +++++++- app/Services/FunctionService.php | 35 +++- app/Services/GcodeService.php | 172 ++++++++++++++++-- app/Services/ImageService.php | 25 ++- app/Services/PatterneService.php | 23 ++- config/app.php | 2 +- public/.htaccess | 17 +- resources/js/app.js | 1 + .../index.blade.php | 19 +- resources/views/layouts/app.blade.php | 13 +- resources/views/welcome.blade.php | 2 +- routes/web.php | 9 +- vite.config.js | 2 - 16 files changed, 348 insertions(+), 77 deletions(-) create mode 100644 app/Http/Controllers/WelcomeController.php rename resources/views/{metal-cutting => image-cut}/index.blade.php (94%) diff --git a/.env.example b/.env.example index a1b3de4..5e203d7 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -APP_NAME=Laravel +APP_NAME=Image2Cut APP_ENV=local APP_KEY= APP_DEBUG=true diff --git a/app/Http/Controllers/MetalCuttingController.php b/app/Http/Controllers/MetalCuttingController.php index 5981822..2e4b53f 100644 --- a/app/Http/Controllers/MetalCuttingController.php +++ b/app/Http/Controllers/MetalCuttingController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers; -use App\Services\DxfService; use Illuminate\Http\Request; use App\Services\ImageService; use App\Services\FunctionService; @@ -27,7 +26,7 @@ public function __construct(PatterneService $patterneService , // Affiche le formulaire public function index() { - return view('metal-cutting.index'); + return view('image-cut.index'); } // Traite les données du formulaire et génère l'image @@ -40,7 +39,7 @@ public function process(Request $request) 'min_tool_diameter' => 'required|numeric|min:1', 'max_tool_diameter' => 'required|numeric|gt:min_tool_diameter', 'image' => 'required|image|mimes:jpeg,png,jpg|max:2048', // Upload image - 'shape' => 'required|in:circle,square,rectangle,triangle,random', + 'shape' => 'required|in:circle,square,rectangle,triangle,hexagon,random', 'angle' => 'required|numeric|min:0|max:360', 'espace' => 'required|numeric|min:2|gt:max_tool_diameter', 'ignoreThreshold' => 'required|numeric|min:0|max:100', @@ -57,6 +56,7 @@ public function process(Request $request) $angle = $request->input('angle'); $espace = $request->input('espace'); $fade = $request->has('fade'); + $invert = $request->has('invert'); $ignoreThreshold = $request->input('ignoreThreshold'); $alignment = $request->input('alignment'); $pen = $request->input('pen'); @@ -86,7 +86,8 @@ public function process(Request $request) $maxToolDiameter, $fullImagePath, $shape, - $fade, + $fade, + $invert, $alignment, $angle, $ignoreThreshold, @@ -110,7 +111,7 @@ public function process(Request $request) $partSizeY = $result['partSizeY']; // Rediriger avec l'URL du pattern généré - return redirect()->route('metal-cutting.index') + return redirect()->route('image-cut.index') ->withInput(input: $validatedData) ->with('generateTools', $generateTools) ->with('usedTools', $usedTools) @@ -118,7 +119,8 @@ public function process(Request $request) ->with('shape', $shape) ->with('angle', $angle) ->with('espace', $espace) - ->with('fade', $fade) + ->with('fade', $fade) + ->with('invert', $invert) ->with('ignoreThreshold', $ignoreThreshold) ->with('partSizeY', $partSizeY) ->with('pen', $pen) @@ -130,6 +132,6 @@ public function process(Request $request) ->with('originalImageUrl', $publicImageUrl); } - return redirect()->route('metal-cutting.index')->with('error', 'Aucune image n\'a été uploadée.'); + return redirect()->route('image-cut.index')->with('error', 'Aucune image n\'a été uploadée.'); } } diff --git a/app/Http/Controllers/WelcomeController.php b/app/Http/Controllers/WelcomeController.php new file mode 100644 index 0000000..8ce1cdb --- /dev/null +++ b/app/Http/Controllers/WelcomeController.php @@ -0,0 +1,11 @@ + (255 - $ignoreThreshold)) { + return; + } + } else { + // Ignorer les pixels très sombres (logique normale) + if ($grayValue < $ignoreThreshold) { + return; + } } - + // Mapper la nuance de gris sur une taille d'outil dans le tableau généré - $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes); + $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes, $invert); // Vérifier si l'outil est trop proche des bords pour éviter de dessiner hors de l'image if ($x - $toolSize / 2 < 0 || $x + $toolSize / 2 > imagesx($resizedImage) || $y - $toolSize / 2 < 0 || $y + $toolSize / 2 > imagesy($resizedImage)) { @@ -79,8 +87,16 @@ public function drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape case 'square': $this->writeSquareToDXF($x, -$y, $toolSize, $angle, $pen); break; + case 'rectangle': + $this->writeRectangleToDXF($x, -$y, $toolSize*2, $toolSize,$angle, $pen); + break; case 'triangle': - $this->writeTriangleeToDXF($x, -$y, $toolSize, $angle, $pen); + $this->writeTriangleToDXF($x, -$y, $toolSize, $angle, $pen); + break; + case 'hexagon': + // Calcul des points pour un hexagone + $points = $this->functionService->calculateHexagonPoints($toolSize); + $this->writeHexagonToDXF($x, -$y, $toolSize, $angle, $pen); break; } @@ -107,7 +123,7 @@ private function writeCircleToDXF($x, $y, $radius, $angle = null, $pen) fwrite($this->dxfFile, "0"); // Fin de l'entité } - private function writeSquareToDXF($x, $y, $size, $angle, $pen) { + private function writeSquareToDXF($x, $y, $size, $angle, $pen) { // Génère un carré au format DXF (les coordonnées des 4 points après rotation) $halfSize = $size / 2; @@ -123,7 +139,24 @@ private function writeSquareToDXF($x, $y, $size, $angle, $pen) { return $this->generateDXFPolygon($points, $pen); } - private function writeTriangleeToDXF($x, $y, $size, $angle, $pen) { + private function writeRectangleToDXF($x, $y, $width, $height, $angle, $pen) { + // Génère un rectangle au format DXF (les coordonnées des 4 points après rotation) + $halfWidth = $width / 2; + $halfHeight = $height / 2; + + // Calcul des points avec rotation + $points = $this->rotatePoints([ + ['x' => $x - $halfWidth, 'y' => $y - $halfHeight], // coin supérieur gauche + ['x' => $x + $halfWidth, 'y' => $y - $halfHeight], // coin supérieur droit + ['x' => $x + $halfWidth, 'y' => $y + $halfHeight], // coin inférieur droit + ['x' => $x - $halfWidth, 'y' => $y + $halfHeight], // coin inférieur gauche + ['x' => $x - $halfWidth, 'y' => $y - $halfHeight], // retour au coin supérieur gauche + ], $x, $y, $angle); + + return $this->generateDXFPolygon($points, $pen); + } + + private function writeTriangleToDXF($x, $y, $size, $angle, $pen) { // Génère un triangle au format DXF (les coordonnées des 3 points après rotation) $halfSize = $size / 2; $points = [ @@ -138,6 +171,33 @@ private function writeTriangleeToDXF($x, $y, $size, $angle, $pen) { return $this->generateDXFPolygon($rotatedPoints, $pen); } + private function writeHexagonToDXF($x, $y, $toolSize, $angle, $pen) { + // Calcul des points de l'hexagone + $points = $this->calculateHexagonPoints($x, $y, $toolSize); + + // Appliquer la rotation aux points + $rotatedPoints = $this->rotatePoints($points, $x, $y, $angle); + + // Générer l'hexagone en DXF avec les points tournés + return $this->generateDXFPolygon($rotatedPoints, $pen); + } + + public function calculateHexagonPoints($x, $y, $toolSize) { + $radius = $toolSize / 2; // Le rayon du cercle circonscrit + $angleStep = 60; // Chaque angle entre les sommets est de 60 degrés + + $points = []; + for ($i = 0; $i < 7; $i++) { + $angle = deg2rad($i * $angleStep); // Convertir l'angle en radians + $points[] = [ + 'x' => $x + $radius * cos($angle), // Calcul de la coordonnée x + 'y' => $y + $radius * sin($angle) // Calcul de la coordonnée y + ]; + } + + return $points; + } + private function generateDXFPolygon($points, $pen) { // Génère un polygone DXF à partir d'une liste de points $dxfData = "0\nPOLYLINE\n8\n0\n66\n1\n62\n{$pen}\n"; diff --git a/app/Services/FunctionService.php b/app/Services/FunctionService.php index ffb4388..2042d8a 100644 --- a/app/Services/FunctionService.php +++ b/app/Services/FunctionService.php @@ -5,11 +5,18 @@ class FunctionService { - public function mapGrayToToolSize($grayValue, $toolSizes) + public function mapGrayToToolSize($grayValue, $toolSizes, $invert = false) { - // Mapper la valeur grise à une taille d'outil - $index = (int) ($grayValue / 255 * (count($toolSizes) - 1)); // Calculer l'indice en fonction de la nuance de gris - return $toolSizes[$index]; // Retourner la taille d'outil correspondante + // Calculer l'indice en fonction de la nuance de gris + $index = (int) ($grayValue / 255 * (count($toolSizes) - 1)); + + // Si l'inversion est activée, inverser l'indice + if ($invert) { + $index = (count($toolSizes) - 1) - $index; // Inverser l'indice + } + + // Retourner la taille d'outil correspondante + return $toolSizes[$index]; } public function generateToolSizes($numberOfTools, $minToolDiameter, $maxToolDiameter) @@ -42,4 +49,24 @@ public function isOverlapping($x, $y, $toolSize, $positions) return false; // Aucune forme ne se chevauche } + public function calculateHexagonPoints($toolSize) + { + $halfSize = $toolSize / 2; + $radius = $toolSize / 2; // Rayon de l'hexagone + + // Points pour un hexagone régulier (angle entre chaque point : 60 degrés) + $points = []; + for ($i = 0; $i < 6; $i++) { + // Calculer les angles pour chaque sommet de l'hexagone + $angle = deg2rad(60 * $i); + // Calculer les coordonnées en fonction du rayon et de l'angle + $x = $halfSize + $radius * cos($angle); // Décalage en X + $y = $halfSize + $radius * sin($angle); // Décalage en Y + $points[] = $x; + $points[] = $y; + } + + return $points; + } + } \ No newline at end of file diff --git a/app/Services/GcodeService.php b/app/Services/GcodeService.php index 99ba5f4..f523377 100644 --- a/app/Services/GcodeService.php +++ b/app/Services/GcodeService.php @@ -31,7 +31,7 @@ public function saveGcodeFile($filename) } // Dessine une forme à une position donnée dans le fichier Gcode - public function drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold) + public function drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold, $invert) { // Vérifier que $x et $y sont dans les limites de l'image redimensionnée if ($x >= imagesx($resizedImage) || $y >= imagesy($resizedImage)) { @@ -41,12 +41,20 @@ public function drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $sha $grayValue = imagecolorat($resizedImage, $x, $y) & 0xFF; // Extraire la composante grise // Ignorer les pixels très sombres - if ($grayValue < $ignoreThreshold) { - return; + if ($invert) { + // Ignorer les pixels très clairs si on inverse la logique + if ($grayValue > (255 - $ignoreThreshold)) { + return; + } + } else { + // Ignorer les pixels très sombres (logique normale) + if ($grayValue < $ignoreThreshold) { + return; + } } // Mapper la nuance de gris sur une taille d'outil dans le tableau généré - $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes); + $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes, $invert); // Vérifier si l'outil est trop proche des bords pour éviter de dessiner hors de l'image if ($x - $toolSize / 2 < 0 || $x + $toolSize / 2 > imagesx($resizedImage) || $y - $toolSize / 2 < 0 || $y + $toolSize / 2 > imagesy($resizedImage)) { @@ -79,9 +87,15 @@ public function drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $sha case 'square': $this->writeSquareToGcode($x, -$y, $toolSize, $angle); break; + case 'rectangle': + $this->writeRectangleToGcode($x, -$y, $toolSize*2, $toolSize,$angle); + break; case 'triangle': $this->writeTriangleToGcode($x, -$y, $toolSize, $angle); break; + case 'hexagon': + $this->writeHexagonToGcode($x, -$y, $toolSize, $angle); + break; } // Ajouter la position de la forme dessinée @@ -112,30 +126,134 @@ private function writeCircleToGcode($x, $y, $radius, $angle = null) private function writeSquareToGcode($x, $y, $size, $angle) { $halfSize = $size / 2; - $this->writeLine("G0 X" . ($x - $halfSize) . " Y" . ($y - $halfSize) . " ; Move to first corner"); + + // Points du carré avant rotation (coin supérieur gauche, coin supérieur droit, etc.) + $points = [ + ['x' => $x - $halfSize, 'y' => $y - $halfSize], // Coin supérieur gauche + ['x' => $x + $halfSize, 'y' => $y - $halfSize], // Coin supérieur droit + ['x' => $x + $halfSize, 'y' => $y + $halfSize], // Coin inférieur droit + ['x' => $x - $halfSize, 'y' => $y + $halfSize], // Coin inférieur gauche + ['x' => $x - $halfSize, 'y' => $y - $halfSize] // Retour au premier coin pour fermer le carré + ]; + + // Appliquer la rotation des points + $rotatedPoints = $this->rotatePoints($points, $x, $y, $angle); + + // Déplacer vers le premier coin après rotation + $this->writeLine("G0 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Move to first corner"); + + // Descendre à la profondeur de coupe $this->writeLine("G1 Z-1.0 F500 ; Lower to cutting depth"); - + // Dessiner les côtés du carré - $this->writeLine("G1 X" . ($x + $halfSize) . " Y" . ($y - $halfSize) . " F300 ; Draw side"); - $this->writeLine("G1 X" . ($x + $halfSize) . " Y" . ($y + $halfSize) . " ; Draw side"); - $this->writeLine("G1 X" . ($x - $halfSize) . " Y" . ($y + $halfSize) . " ; Draw side"); - $this->writeLine("G1 X" . ($x - $halfSize) . " Y" . ($y - $halfSize) . " ; Draw side"); + for ($i = 1; $i < count($rotatedPoints); $i++) { + $this->writeLine("G1 X" . $rotatedPoints[$i]['x'] . " Y" . $rotatedPoints[$i]['y'] . " F300 ; Draw side"); + } + + // Remonter à une hauteur sécuritaire + $this->writeLine("G1 Z5.0 F500 ; Raise to safe height"); + } + + private function writeRectangleToGcode($x, $y, $width, $height, $angle) { + // Calculer la moitié des dimensions du rectangle + $halfWidth = $width / 2; + $halfHeight = $height / 2; + + // Calcul des 4 coins avant rotation + $points = [ + ['x' => $x - $halfWidth, 'y' => $y - $halfHeight], // coin supérieur gauche + ['x' => $x + $halfWidth, 'y' => $y - $halfHeight], // coin supérieur droit + ['x' => $x + $halfWidth, 'y' => $y + $halfHeight], // coin inférieur droit + ['x' => $x - $halfWidth, 'y' => $y + $halfHeight], // coin inférieur gauche + ]; + + // Appliquer la rotation à chaque point + $rotatedPoints = $this->rotatePoints($points, $x, $y, $angle); + + // Commencer à dessiner le rectangle + $this->writeLine("G0 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Move to first corner"); + $this->writeLine("G1 Z-1.0 F500 ; Lower to cutting depth"); + + // Dessiner les côtés du rectangle + $this->writeLine("G1 X" . $rotatedPoints[1]['x'] . " Y" . $rotatedPoints[1]['y'] . " F300 ; Draw top side"); + $this->writeLine("G1 X" . $rotatedPoints[2]['x'] . " Y" . $rotatedPoints[2]['y'] . " ; Draw right side"); + $this->writeLine("G1 X" . $rotatedPoints[3]['x'] . " Y" . $rotatedPoints[3]['y'] . " ; Draw bottom side"); + $this->writeLine("G1 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Draw left side"); + $this->writeLine("G1 Z5.0 F500 ; Raise to safe height"); } - private function writeTriangleToGcode($x, $y, $size, $angle) { + private function writeTriangleToGcode($x, $y, $size, $angle) { $halfSize = $size / 2; + + // Définir les trois points du triangle + $points = [ + ['x' => $x, 'y' => $y - $halfSize], // Point du sommet du triangle (au-dessus) + ['x' => $x - $halfSize, 'y' => $y + $halfSize], // Coin inférieur gauche + ['x' => $x + $halfSize, 'y' => $y + $halfSize], // Coin inférieur droit + ['x' => $x, 'y' => $y - $halfSize] // Retour au sommet pour fermer le triangle + ]; + + // Appliquer la rotation des points + $rotatedPoints = $this->rotatePoints($points, $x, $y, $angle); + + // Déplacer vers le premier point après rotation (sommet) + $this->writeLine("G0 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Move to top point"); + + // Descendre à la profondeur de coupe + $this->writeLine("G1 Z-1.0 F500 ; Lower to cutting depth"); + + // Dessiner les côtés du triangle + for ($i = 1; $i < count($rotatedPoints); $i++) { + $this->writeLine("G1 X" . $rotatedPoints[$i]['x'] . " Y" . $rotatedPoints[$i]['y'] . " F300 ; Draw side"); + } + + // Remonter à une hauteur sécuritaire + $this->writeLine("G1 Z5.0 F500 ; Raise to safe height"); + } + + public function calculateHexagonPoints($x, $y, $toolSize) { + $radius = $toolSize / 2; // Le rayon du cercle circonscrit + $angleStep = 60; // Chaque angle entre les sommets est de 60 degrés + + $points = []; + for ($i = 0; $i < 6; $i++) { + $angle = deg2rad($i * $angleStep); // Convertir l'angle en radians + $points[] = [ + 'x' => $x + $radius * cos($angle), // Calcul de la coordonnée x + 'y' => $y + $radius * sin($angle) // Calcul de la coordonnée y + ]; + } + + return $points; + } + + private function writeHexagonToGcode($x, $y, $toolSize, $angle) { + // Calcul des points de l'hexagone + $points = $this->calculateHexagonPoints($x, $y, $toolSize); + + // Appliquer la rotation aux points + $rotatedPoints = $this->rotatePoints($points, $x, $y, $angle); + + // Déplacer vers le premier point après rotation + $this->writeLine("G0 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Move to first corner"); - $this->writeLine("G0 X$x Y" . ($y - $halfSize) . " ; Move to top point"); + // Descendre à la profondeur de coupe $this->writeLine("G1 Z-1.0 F500 ; Lower to cutting depth"); - $this->writeLine("G1 X" . ($x - $halfSize) . " Y" . ($y + $halfSize) . " F300 ; Draw side"); - $this->writeLine("G1 X" . ($x + $halfSize) . " Y" . ($y + $halfSize) . " ; Draw side"); - $this->writeLine("G1 X$x Y" . ($y - $halfSize) . " ; Draw side"); + // Dessiner les côtés de l'hexagone + for ($i = 1; $i < count($rotatedPoints); $i++) { + $this->writeLine("G1 X" . $rotatedPoints[$i]['x'] . " Y" . $rotatedPoints[$i]['y'] . " F300 ; Draw side"); + } + + // Revenir au premier point pour fermer l'hexagone + $this->writeLine("G1 X" . $rotatedPoints[0]['x'] . " Y" . $rotatedPoints[0]['y'] . " ; Close hexagon"); + // Remonter à une hauteur sécuritaire $this->writeLine("G1 Z5.0 F500 ; Raise to safe height"); - } + } + // Ferme le fichier code une fois que toutes les entités ont été ajoutées public function closeGcodeFile() @@ -146,5 +264,27 @@ public function closeGcodeFile() $this->writeLine("M30 ; End program"); fclose($this->gcodeFile); } + + private function rotatePoints($points, $cx, $cy, $angle) { + // Convertir l'angle de degrés en radians + $rad = deg2rad($angle); + + $rotatedPoints = []; + + // Appliquer la rotation à chaque point + foreach ($points as $point) { + $x = $point['x']; + $y = $point['y']; + + // Calcul des nouvelles coordonnées après rotation + $newX = $cx + ($x - $cx) * cos($rad) - ($y - $cy) * sin($rad); + $newY = $cy + ($x - $cx) * sin($rad) + ($y - $cy) * cos($rad); + + // Ajouter le point tourné à la liste des nouveaux points + $rotatedPoints[] = ['x' => $newX, 'y' => $newY]; + } + + return $rotatedPoints; + } } diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index 616b10a..53b2456 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -12,7 +12,7 @@ public function __construct(FunctionService $functionService , ){ $this->functionService = $functionService ; } - public function drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold) { + public function drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold, $invert) { // Vérifier que $x et $y sont dans les limites de l'image redimensionnée if ($x >= imagesx($resizedImage) || $y >= imagesy($resizedImage)) { @@ -22,12 +22,20 @@ public function drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes $grayValue = imagecolorat($resizedImage, $x, $y) & 0xFF; // Extraire la composante grise // Ignorer les pixels très sombres - if ($grayValue < $ignoreThreshold) { - return; + if ($invert) { + // Ignorer les pixels très clairs si on inverse la logique + if ($grayValue > (255 - $ignoreThreshold)) { + return; + } + } else { + // Ignorer les pixels très sombres (logique normale) + if ($grayValue < $ignoreThreshold) { + return; + } } // Mapper la nuance de gris sur une taille d'outil dans le tableau généré - $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes); + $toolSize = $this->functionService->mapGrayToToolSize($grayValue, $toolSizes, $invert); // Vérifier si l'outil est trop proche des bords pour éviter de dessiner hors de l'image if ($x - $toolSize / 2 < 0 || $x + $toolSize / 2 > imagesx($resizedImage) || $y - $toolSize / 2 < 0 || $y + $toolSize / 2 > imagesy($resizedImage)) { @@ -66,6 +74,9 @@ public function drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes case 'square': imagefilledrectangle($tempImage, 0, 0, $toolSize, $toolSize, $white); break; + case 'rectangle': + imagefilledrectangle($tempImage, 0, 0, $toolSize*2, $toolSize, $white); + break; case 'triangle': $points = [ $toolSize/2, 0, // Sommet supérieur @@ -74,6 +85,12 @@ public function drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes ]; imagefilledpolygon($tempImage, $points, 3, $white); break; + case 'hexagon': + // Calcul des points pour un hexagone + $points = $this->functionService->calculateHexagonPoints($toolSize); + imagefilledpolygon($tempImage, $points, 6, $white); + break; + } // Appliquer la rotation à l'image temporaire contenant la forme diff --git a/app/Services/PatterneService.php b/app/Services/PatterneService.php index 263858a..79744df 100644 --- a/app/Services/PatterneService.php +++ b/app/Services/PatterneService.php @@ -27,7 +27,7 @@ public function __construct(ImageService $imageService , $this->filterService = $filterService ; } - public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $maxToolDiameter, $imagePath, $shape, $fade, $alignment = 'straight', $angle = null, $ignoreThreshold, $espace, $pen, $exportDXF=false) + public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $maxToolDiameter, $imagePath, $shape, $fade, $invert, $alignment = 'straight', $angle = null, $ignoreThreshold, $espace, $pen, $exportDXF=false) { // Détecter le type MIME de l'image d'entrée pour obtenir les dimensions $imageInfo = getimagesize($imagePath); @@ -93,6 +93,9 @@ public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $m // Variables pour ajuster la densité du motif $spacing = $espace; // Espace entre chaque forme + if($shape === 'rectangle'){ + $spacing += $maxToolDiameter; // si c'est rectangle on double la valeur X pour éviter la superposition + } for ($y = 0; $y < imagesy($resizedImage); $y += $spacing) { // Vérification du mode d'alignement @@ -102,9 +105,9 @@ public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $m // Tracer des formes sur les colonnes paires for ($x = 0; $x < imagesx($resizedImage); $x += ($spacing * 2)) { // Récupérer la couleur du pixel et dessiner la forme - $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold); - $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold,$pen); - $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold); + $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold, $invert); + $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold, $invert,$pen); + $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold, $invert); if(isset($CurrenttoolSize) ){ $hitcount++; @@ -117,9 +120,9 @@ public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $m // Si on est sur une ligne impaire, tracer des formes sur les colonnes impaires for ($x = $spacing; $x < imagesx($resizedImage); $x += ($spacing * 2)) { // Récupérer la couleur du pixel et dessiner la forme - $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold); - $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold, $pen); - $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold); + $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold, $invert); + $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold, $invert, $pen); + $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold, $invert); if(isset($CurrenttoolSize)) { $hitcount++; @@ -133,9 +136,9 @@ public function generatePattern($partSizeX, $numberOfTools, $minToolDiameter, $m // Mode "straight" : dessiner les formes de manière régulière for ($x = 0; $x < imagesx($resizedImage); $x += $spacing) { // Récupérer la couleur du pixel et dessiner la forme - $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold); - $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold, $pen); - $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold); + $CurrenttoolSize = $this->imageService->drawShapeAtPosition($resizedImage, $newImage, $x, $y, $toolSizes, $shape, $positions, $angle, $ignoreThreshold, $invert); + $this->dxfService->drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, $dxfpositions, $angle , $ignoreThreshold, $invert, $pen); + $this->gcodeService->drawShapeAtPositionGCode($resizedImage, $x, $y, $toolSizes, $shape, $gCodepositions, $angle , $ignoreThreshold, $invert); if(isset($CurrenttoolSize)) { $hitcount++; diff --git a/config/app.php b/config/app.php index f467267..fae7ef2 100644 --- a/config/app.php +++ b/config/app.php @@ -52,7 +52,7 @@ | */ - 'url' => env('APP_URL', 'http://localhost'), + 'url' => env('APP_URL', 'http://image2cut.xyz'), /* |-------------------------------------------------------------------------- diff --git a/public/.htaccess b/public/.htaccess index 819cee4..c812164 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -1,14 +1,21 @@ - Options -MultiViews + Options -MultiViews -Indexes RewriteEngine On - # Redirect Trailing Slashes... - RewriteRule ^(.*)/$ /$1 [L,R=301] - # Handle Front Controller... + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] + RewriteRule ^ /index.php [L] \ No newline at end of file diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0..149cb68 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,2 @@ import './bootstrap'; +import _ from 'lodash'; \ No newline at end of file diff --git a/resources/views/metal-cutting/index.blade.php b/resources/views/image-cut/index.blade.php similarity index 94% rename from resources/views/metal-cutting/index.blade.php rename to resources/views/image-cut/index.blade.php index 08731e4..52012e4 100644 --- a/resources/views/metal-cutting/index.blade.php +++ b/resources/views/image-cut/index.blade.php @@ -1,12 +1,12 @@ @extends('layouts.app') @section('content') -
+

Image 2 cut

-
+ @csrf
@@ -21,7 +21,7 @@ @if(session('partSizeY'))
- +
@endif
@@ -35,6 +35,7 @@ + @error('shape') @@ -150,6 +151,14 @@
+
+ +
+ + +
+
+
@@ -172,7 +181,7 @@
- + @error('image')

{{ $message }}

@@ -274,6 +283,8 @@

{{ session('success') }}

+ @else + @endif @if(session('hitcount'))
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 52d4210..ce33788 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -5,8 +5,9 @@ - - {{ config('app.name', 'Laravel') }} + + + Image2Cut - Génération gratuite de fichiers DXF et GCode pour découpe @vite('resources/css/app.css') @@ -15,17 +16,11 @@ - - - - - - +
@yield('content')
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 12bf1c3..01236c5 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -76,7 +76,7 @@

Welcome to Image2Cut

Votre générateur de modèles de découpe de personnalisés

- + Voir sur GitHub diff --git a/routes/web.php b/routes/web.php index e2b2306..5e84db9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,10 +3,9 @@ use Illuminate\Support\Facades\Route; +use App\Http\Controllers\WelcomeController; use App\Http\Controllers\MetalCuttingController; -Route::get('/welcome', function () { - return view('welcome'); -}); -Route::get('/', [MetalCuttingController::class, 'index'])->name('metal-cutting.index'); -Route::post('/', [MetalCuttingController::class, 'process'])->name('metal-cutting.process'); +Route::get('/', [WelcomeController::class, 'index'])->name('index'); +Route::get('/image-cut', [MetalCuttingController::class, 'index'])->name('image-cut.index'); +Route::post('/image-cut', [MetalCuttingController::class, 'process'])->name('image-cut.process'); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 3149607..4d2b879 100644 --- a/vite.config.js +++ b/vite.config.js @@ -7,8 +7,6 @@ export default defineConfig({ input: [ 'resources/js/app.js', 'resources/css/app.css', - 'node_modules/lodash/lodash.min.js', - 'node_modules/dropzone/dist/dropzone-min.js' ], refresh: true, }),