diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index 0cd1d68..4ea4579 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -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 \ No newline at end of file + stl2pov_bin: /usr/bin/stl2pov + + # Path to admesh + admesh_bin: /usr/bin/admesh \ No newline at end of file diff --git a/app/config/service/loader.yml b/app/config/service/loader.yml index 315d173..19aca24 100644 --- a/app/config/service/loader.yml +++ b/app/config/service/loader.yml @@ -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 \ No newline at end of file diff --git a/app/config/service/service.yml b/app/config/service/service.yml index 09e611f..c0fc0f2 100644 --- a/app/config/service/service.yml +++ b/app/config/service/service.yml @@ -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 diff --git a/src/AppBundle/Service/Loader/ImageLoader.php b/src/AppBundle/Service/Loader/ImageLoader.php index c895df2..0c32b5b 100644 --- a/src/AppBundle/Service/Loader/ImageLoader.php +++ b/src/AppBundle/Service/Loader/ImageLoader.php @@ -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 diff --git a/src/AppBundle/Service/Loader/ModelLoader.php b/src/AppBundle/Service/Loader/ModelLoader.php index 3bff293..40f163c 100644 --- a/src/AppBundle/Service/Loader/ModelLoader.php +++ b/src/AppBundle/Service/Loader/ModelLoader.php @@ -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']]); diff --git a/src/AppBundle/Service/LDViewService.php b/src/AppBundle/Service/Stl/StlConverterService.php similarity index 81% rename from src/AppBundle/Service/LDViewService.php rename to src/AppBundle/Service/Stl/StlConverterService.php index 72925d3..57f26df 100644 --- a/src/AppBundle/Service/LDViewService.php +++ b/src/AppBundle/Service/Stl/StlConverterService.php @@ -1,21 +1,24 @@ 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); } } } diff --git a/src/AppBundle/Service/Stl/StlFixerService.php b/src/AppBundle/Service/Stl/StlFixerService.php new file mode 100644 index 0000000..c8c2e1f --- /dev/null +++ b/src/AppBundle/Service/Stl/StlFixerService.php @@ -0,0 +1,64 @@ +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); + } + } +} diff --git a/src/AppBundle/Service/StlRendererService.php b/src/AppBundle/Service/Stl/StlRendererService.php similarity index 98% rename from src/AppBundle/Service/StlRendererService.php rename to src/AppBundle/Service/Stl/StlRendererService.php index 20afdc1..818c856 100644 --- a/src/AppBundle/Service/StlRendererService.php +++ b/src/AppBundle/Service/Stl/StlRendererService.php @@ -1,6 +1,6 @@