diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index 072868a..be71996 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -22,4 +22,7 @@ parameters: brickset_apikey: ~ # Rebrickable API key obtainable at http://rebrickable.com/api/ - rebrickable_apikey: ~ \ No newline at end of file + rebrickable_apikey: ~ + + # Absolute path to OSMesa port of LDView + ldview_bin: /usr/bin/ldview \ No newline at end of file diff --git a/app/config/services.yml b/app/config/services.yml index 5814f07..244a52a 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -17,6 +17,10 @@ services: class: AppBundle\Service\CollectionService arguments: ['@doctrine.orm.entity_manager', '@manager.brickset','@manager.rebrickable'] + service.ldview: + class: AppBundle\Service\LDViewService + arguments: ['%ldview_bin%', '@oneup_flysystem.ldraw_filesystem'] + loader.rebrickable: class: AppBundle\Command\Loader\RebrickableLoader arguments: ['@doctrine.orm.entity_manager', '@manager.rebrickable', '%rebrickable_url%' ] diff --git a/src/AppBundle/Service/LDViewService.php b/src/AppBundle/Service/LDViewService.php new file mode 100644 index 0000000..719eddd --- /dev/null +++ b/src/AppBundle/Service/LDViewService.php @@ -0,0 +1,68 @@ +ldview = $ldview; + $this->stlStorage = $stlStorage; + } + + /** + * Convert LDraw model from .dat format to .stl by using LDView + * stores created file to $stlStorage filesystem + * + * @param Filesystem $LDrawDir + * + * @return File + */ + public function datToStl($file, $LDrawDir) + { + $stlFilename = $file['filename'].'.stl'; + + if (!$this->stlStorage->has($stlFilename)) { + $builder = new ProcessBuilder(); + $process = $builder + ->setPrefix($this->ldview) + ->setArguments([ + $LDrawDir->getAdapter()->getPathPrefix().$file['path'], + '-LDrawDir='.$LDrawDir->getAdapter()->getPathPrefix(), + '-ExportFile='.$this->stlStorage->getAdapter()->getPathPrefix().$stlFilename, + ]) + ->getProcess(); + + $process->run(); + + if (!$this->stlStorage->has($stlFilename)) { + throw new LogicException($file['basename'].': new file not found'); //TODO + } elseif (!$process->isSuccessful()) { + throw new LogicException($file['basename'].' : '.$process->getOutput()); //TODO + } + } + + return $this->stlStorage->get($stlFilename); + } +}