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 @@
{{ $message }}
@@ -274,6 +283,8 @@{{ session('success') }}
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, }),