mirror of
https://github.com/ToxicCrack/PrintABrick.git
synced 2025-05-19 05:30:08 -07:00
Add ADMesh stlfixer
This commit is contained in:
parent
e684d30c45
commit
70341dd390
@ -4,7 +4,7 @@
|
||||
parameters:
|
||||
database_host: 127.0.0.1
|
||||
database_port: ~
|
||||
database_name: symfony
|
||||
database_name: printabrick
|
||||
database_user: root
|
||||
database_password: ~
|
||||
# You should uncomment this if you want use pdo_sqlite
|
||||
@ -24,5 +24,9 @@ parameters:
|
||||
|
||||
# Path to POV-Ray binary - http://www.povray.org/
|
||||
povray_bin: /usr/bin/povray
|
||||
|
||||
# Path to stl2pov (version 3.3.0) - https://github.com/rsmith-nl/stltools/releases/tag/3.3
|
||||
stl2pov_bin: /usr/bin/stl2pov
|
||||
stl2pov_bin: /usr/bin/stl2pov
|
||||
|
||||
# Path to admesh
|
||||
admesh_bin: /usr/bin/admesh
|
@ -22,5 +22,5 @@ services:
|
||||
|
||||
service.loader.image:
|
||||
class: AppBundle\Service\Loader\ImageLoader
|
||||
arguments: ['@oneup_flysystem.media_filesystem', '%app.rebrickable_downloads_url%','@service.renderer.stl']
|
||||
arguments: ['@oneup_flysystem.media_filesystem', '%app.rebrickable_downloads_url%','@service.stl.renderer']
|
||||
parent: service.loader.base
|
@ -3,13 +3,17 @@ services:
|
||||
class: Doctrine\Common\Cache\PhpFileCache
|
||||
arguments: ["%kernel.cache_dir%/brickset", ".cache.php"]
|
||||
|
||||
service.renderer.stl:
|
||||
class: AppBundle\Service\StlRendererService
|
||||
service.stl.renderer:
|
||||
class: AppBundle\Service\Stl\StlRendererService
|
||||
arguments: ['%kernel.root_dir%/Resources/povray_layout/layout.tmpl', '%povray_bin%','%stl2pov_bin%']
|
||||
|
||||
service.ldview:
|
||||
class: AppBundle\Service\LDViewService
|
||||
arguments: ['%ldview_bin%', '@oneup_flysystem.media_filesystem']
|
||||
service.stl.converter:
|
||||
class: AppBundle\Service\Stl\StlConverterService
|
||||
arguments: ['%ldview_bin%', '@oneup_flysystem.media_filesystem', '@service.stl.fixer']
|
||||
|
||||
service.stl.fixer:
|
||||
class: AppBundle\Service\Stl\StlFixerService
|
||||
arguments: ['%admesh_bin%']
|
||||
|
||||
service.zip:
|
||||
class: AppBundle\Service\ZipService
|
||||
|
@ -3,7 +3,7 @@
|
||||
namespace AppBundle\Service\Loader;
|
||||
|
||||
use AppBundle\Entity\LDraw\Model;
|
||||
use AppBundle\Service\StlRendererService;
|
||||
use AppBundle\Service\Stl\StlRendererService;
|
||||
use League\Flysystem\Filesystem;
|
||||
|
||||
class ImageLoader extends BaseLoader
|
||||
|
@ -11,7 +11,7 @@ use AppBundle\Entity\LDraw\Subpart;
|
||||
use AppBundle\Exception\ConvertingFailedException;
|
||||
use AppBundle\Exception\FileException;
|
||||
use AppBundle\Exception\ParseErrorException;
|
||||
use AppBundle\Service\LDViewService;
|
||||
use AppBundle\Service\Stl\StlConverterService;
|
||||
use AppBundle\Util\LDModelParser;
|
||||
use AppBundle\Util\RelationMapper;
|
||||
use League\Flysystem\Adapter\Local;
|
||||
@ -28,9 +28,9 @@ class ModelLoader extends BaseLoader
|
||||
private $ldrawLibraryContext;
|
||||
|
||||
/**
|
||||
* @var LDViewService
|
||||
* @var StlConverterService
|
||||
*/
|
||||
private $LDViewService;
|
||||
private $stlConverter;
|
||||
|
||||
/** @var LDModelParser */
|
||||
private $ldModelParser;
|
||||
@ -41,18 +41,22 @@ class ModelLoader extends BaseLoader
|
||||
/** @var Finder */
|
||||
private $finder;
|
||||
|
||||
/** @var string */
|
||||
private $LDLibraryUrl;
|
||||
|
||||
private $rewite = false;
|
||||
|
||||
/**
|
||||
* LDrawLoaderService constructor.
|
||||
*
|
||||
* @param LDViewService $LDViewService
|
||||
* @param RelationMapper $relationMapper
|
||||
* @param StlConverterService $stlConverter
|
||||
* @param RelationMapper $relationMapper
|
||||
*/
|
||||
public function __construct($LDViewService, $relationMapper)
|
||||
public function __construct($stlConverter, $relationMapper, $LDLibraryUrl)
|
||||
{
|
||||
$this->LDViewService = $LDViewService;
|
||||
$this->stlConverter = $stlConverter;
|
||||
$this->relationMapper = $relationMapper;
|
||||
$this->LDLibraryUrl = $LDLibraryUrl;
|
||||
$this->ldModelParser = new LDModelParser();
|
||||
$this->finder = new Finder();
|
||||
}
|
||||
@ -73,7 +77,7 @@ class ModelLoader extends BaseLoader
|
||||
try {
|
||||
$adapter = new Local($ldrawLibrary);
|
||||
$this->ldrawLibraryContext = new Filesystem($adapter);
|
||||
$this->LDViewService->setLDrawLibraryContext($this->ldrawLibraryContext);
|
||||
$this->stlConverter->setLDrawLibraryContext($this->ldrawLibraryContext);
|
||||
} catch (Exception $exception) {
|
||||
$this->logger->error($exception->getMessage());
|
||||
}
|
||||
@ -235,7 +239,7 @@ class ModelLoader extends BaseLoader
|
||||
try {
|
||||
// update model only if newer version
|
||||
if (!$model->getModified() || ($model->getModified() < $modelArray['modified'])) {
|
||||
$stl = $this->LDViewService->datToStl($file, $this->rewite)->getPath();
|
||||
$stl = $this->stlConverter->datToStl($file, $this->rewite)->getPath();
|
||||
$model->setPath($stl);
|
||||
|
||||
$model
|
||||
@ -349,6 +353,10 @@ class ModelLoader extends BaseLoader
|
||||
if (in_array($modelArray['type'], ['48_Primitive', '8_Primitive', 'Primitive', 'Subpart'])) {
|
||||
return false;
|
||||
}
|
||||
// Do not include Pov-RAY file
|
||||
elseif ($modelArray['category'] == 'Pov-RAY') {
|
||||
return false;
|
||||
}
|
||||
// Do not include sticker models
|
||||
elseif ($modelArray['type'] == 'Sticker') {
|
||||
$this->logger->info('Model skipped.', ['number' => $modelArray['id'], 'type' => $modelArray['type']]);
|
||||
|
@ -1,21 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace AppBundle\Service;
|
||||
namespace AppBundle\Service\Stl;
|
||||
|
||||
use AppBundle\Exception\ConvertingFailedException;
|
||||
use AppBundle\Exception\LDView\LDLibraryMissingException;
|
||||
use League\Flysystem\File;
|
||||
use League\Flysystem\Filesystem;
|
||||
use Symfony\Component\Process\Exception\ProcessFailedException;
|
||||
use Symfony\Component\Process\ProcessBuilder;
|
||||
|
||||
//TODO enable file overwrite
|
||||
class LDViewService
|
||||
class StlConverterService
|
||||
{
|
||||
/**
|
||||
* @var string LDView binary file path
|
||||
*/
|
||||
private $ldview;
|
||||
|
||||
/** @var StlFixerService */
|
||||
private $stlFixer;
|
||||
|
||||
/**
|
||||
* @var Filesystem
|
||||
*/
|
||||
@ -27,15 +30,21 @@ class LDViewService
|
||||
private $ldrawLibraryContext;
|
||||
|
||||
/**
|
||||
* LDViewService constructor.
|
||||
* @var bool
|
||||
*/
|
||||
private $rewrite = false;
|
||||
|
||||
/**
|
||||
* StlConverterService constructor.
|
||||
*
|
||||
* @param string $ldview Path to LDView OSMesa binary file
|
||||
* @param Filesystem $mediaFilesystem Filesystem for generated web assets
|
||||
*/
|
||||
public function __construct($ldview, $mediaFilesystem)
|
||||
public function __construct($ldview, $mediaFilesystem, $stlFixer)
|
||||
{
|
||||
$this->ldview = $ldview;
|
||||
$this->mediaFilesystem = $mediaFilesystem;
|
||||
$this->stlFixer = $stlFixer;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -56,15 +65,19 @@ class LDViewService
|
||||
*
|
||||
* @return File
|
||||
*/
|
||||
public function datToStl($file, $rewrite = false)
|
||||
public function datToStl($file)
|
||||
{
|
||||
if (!$this->ldrawLibraryContext) {
|
||||
throw new LDLibraryMissingException();
|
||||
}
|
||||
|
||||
if (!$this->mediaFilesystem->has('models')) {
|
||||
$this->mediaFilesystem->createDir('models');
|
||||
}
|
||||
|
||||
$newFile = 'models'.DIRECTORY_SEPARATOR.basename($file, '.dat').'.stl';
|
||||
|
||||
if (!$this->mediaFilesystem->has($newFile) || $rewrite) {
|
||||
if (!$this->mediaFilesystem->has($newFile) || $this->rewrite) {
|
||||
$this->runLDView([
|
||||
$file,
|
||||
'-LDrawDir='.$this->ldrawLibraryContext->getAdapter()->getPathPrefix(),
|
||||
@ -75,6 +88,8 @@ class LDViewService
|
||||
|
||||
// Check if file created successfully
|
||||
if ($this->mediaFilesystem->has($newFile)) {
|
||||
$this->stlFixer->fix($this->mediaFilesystem->getAdapter()->getPathPrefix().$newFile);
|
||||
|
||||
return $this->mediaFilesystem->get($newFile);
|
||||
}
|
||||
} else {
|
||||
@ -94,8 +109,12 @@ class LDViewService
|
||||
*
|
||||
* @return File
|
||||
*/
|
||||
public function datToPng($file, $rewrite = false)
|
||||
public function datToPng($file)
|
||||
{
|
||||
if (!$this->ldrawLibraryContext) {
|
||||
throw new LDLibraryMissingException();
|
||||
}
|
||||
|
||||
if (!$this->mediaFilesystem->has('images')) {
|
||||
$this->mediaFilesystem->createDir('images');
|
||||
}
|
||||
@ -149,7 +168,7 @@ class LDViewService
|
||||
$process->run();
|
||||
|
||||
if (!$process->isSuccessful()) {
|
||||
throw new ProcessFailedException($process); //TODO
|
||||
throw new ProcessFailedException($process);
|
||||
}
|
||||
}
|
||||
}
|
64
src/AppBundle/Service/Stl/StlFixerService.php
Normal file
64
src/AppBundle/Service/Stl/StlFixerService.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace AppBundle\Service\Stl;
|
||||
|
||||
use AppBundle\Exception\FileNotFoundException;
|
||||
use Symfony\Component\Process\Exception\ProcessFailedException;
|
||||
use Symfony\Component\Process\ProcessBuilder;
|
||||
|
||||
class StlFixerService
|
||||
{
|
||||
private $ADMesh;
|
||||
|
||||
/**
|
||||
* StlFixerService constructor.
|
||||
*
|
||||
* @param $ADMesh
|
||||
*/
|
||||
public function __construct($ADMesh)
|
||||
{
|
||||
$this->ADMesh = $ADMesh;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotate, scale stl file and save in binary format.
|
||||
*
|
||||
* @param $file
|
||||
*
|
||||
* @throws FileNotFoundException
|
||||
*/
|
||||
public function fix($file)
|
||||
{
|
||||
if (file_exists($file)) {
|
||||
$this->runADMesh([
|
||||
$file,
|
||||
'--x-rotate=-90',
|
||||
'--scale=10',
|
||||
'--no-check',
|
||||
"--write-binary-stl={$file}",
|
||||
]);
|
||||
} else {
|
||||
throw new FileNotFoundException($file);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call ADMesh process with $arguments.
|
||||
*
|
||||
* @param array $arguments
|
||||
*/
|
||||
private function runADMesh(array $arguments)
|
||||
{
|
||||
$builder = new ProcessBuilder();
|
||||
$process = $builder
|
||||
->setPrefix($this->ADMesh)
|
||||
->setArguments($arguments)
|
||||
->getProcess();
|
||||
|
||||
$process->run();
|
||||
|
||||
if (!$process->isSuccessful()) {
|
||||
throw new ProcessFailedException($process);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace AppBundle\Service;
|
||||
namespace AppBundle\Service\Stl;
|
||||
|
||||
use AppBundle\Exception\ConvertingFailedException;
|
||||
use AppBundle\Exception\FileNotFoundException;
|
||||
@ -8,6 +8,7 @@ use AppBundle\Exception\RenderFailedException;
|
||||
use Symfony\Component\Process\Process;
|
||||
use Symfony\Component\Process\ProcessBuilder;
|
||||
|
||||
// TODO create images/{color} directory
|
||||
class StlRendererService
|
||||
{
|
||||
/**
|
Loading…
x
Reference in New Issue
Block a user