Skip to content

Commit

Permalink
Next
Browse files Browse the repository at this point in the history
  • Loading branch information
SMEWebify committed Nov 12, 2024
1 parent 06fe7db commit 7da7700
Show file tree
Hide file tree
Showing 16 changed files with 348 additions and 77 deletions.
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
APP_NAME=Laravel
APP_NAME=Image2Cut
APP_ENV=local
APP_KEY=
APP_DEBUG=true
Expand Down
16 changes: 9 additions & 7 deletions app/Http/Controllers/MetalCuttingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace App\Http\Controllers;

use App\Services\DxfService;
use Illuminate\Http\Request;
use App\Services\ImageService;
use App\Services\FunctionService;
Expand All @@ -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
Expand All @@ -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',
Expand All @@ -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');
Expand Down Expand Up @@ -86,7 +86,8 @@ public function process(Request $request)
$maxToolDiameter,
$fullImagePath,
$shape,
$fade,
$fade,
$invert,
$alignment,
$angle,
$ignoreThreshold,
Expand All @@ -110,15 +111,16 @@ 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)
->with('hitcount', $hitcount)
->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)
Expand All @@ -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.');
}
}
11 changes: 11 additions & 0 deletions app/Http/Controllers/WelcomeController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Http\Controllers;

class WelcomeController extends Controller
{
public function index()
{
return view('welcome');
}
}
76 changes: 68 additions & 8 deletions app/Services/DxfService.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function saveDXFFile($filename)
}

// Dessine une forme à une position donnée dans le fichier DXF
public function drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold, $pen)
public function drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape, &$positions, $angle = null, $ignoreThreshold, $invert, $pen)
{

// Vérifier que $x et $y sont dans les limites de l'image redimensionnée
Expand All @@ -40,12 +40,20 @@ public function drawShapeAtPositionDXF($resizedImage, $x, $y, $toolSizes, $shape
$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)) {
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;

Expand All @@ -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 = [
Expand All @@ -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";
Expand Down
35 changes: 31 additions & 4 deletions app/Services/FunctionService.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

}
Loading

0 comments on commit 7da7700

Please sign in to comment.