1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-16 20:30:09 -07:00

Move loaders to own namespace

This commit is contained in:
David Hübner 2017-01-17 00:30:39 +01:00
parent b06c8b1bcb
commit dcb475407b
6 changed files with 93 additions and 57 deletions

View File

@ -18,11 +18,11 @@ services:
arguments: ['@doctrine.orm.entity_manager', '@manager.brickset','@manager.rebrickable'] arguments: ['@doctrine.orm.entity_manager', '@manager.brickset','@manager.rebrickable']
loader.rebrickable: loader.rebrickable:
class: AppBundle\Service\RebrickableLoader class: AppBundle\Loader\RebrickableLoader
arguments: ['@doctrine.orm.entity_manager', '@manager.rebrickable'] arguments: ['@doctrine.orm.entity_manager', '@manager.rebrickable']
loader.ldraw: loader.ldraw:
class: AppBundle\Service\LDrawLoader class: AppBundle\Loader\LDrawLoader
arguments: ['@doctrine.orm.entity_manager', '%kernel.root_dir%/../bin/ldview', '%kernel.root_dir%/../var/data/ldraw'] arguments: ['@doctrine.orm.entity_manager', '%kernel.root_dir%/../bin/ldview', '@oneup_flysystem.ldraw_filesystem']
app.form.filter_set: app.form.filter_set:
class: AppBundle\Form\FilterSetType class: AppBundle\Form\FilterSetType

View File

@ -22,6 +22,10 @@ class LoadLDrawCommand extends ContainerAwareCommand
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$this->getContainer()->get('loader.ldraw')->loadModels($input->getArgument('ldraw')); $ldrawLoader = $this->getContainer()->get('loader.ldraw');
$ldrawLoader->setOutput($output);
$ldrawLoader->loadModels($input->getArgument('ldraw'));
} }
} }

View File

@ -21,14 +21,16 @@ class LoadRebrickableCommand extends ContainerAwareCommand
{ {
$rebrickableLoader = $this->getContainer()->get('loader.rebrickable'); $rebrickableLoader = $this->getContainer()->get('loader.rebrickable');
$rebrickableLoader->setOutput($output);
try { try {
$rebrickableLoader->loadColors(); $rebrickableLoader->loadColors();
$rebrickableLoader->loadParts($output); $rebrickableLoader->loadParts();
$rebrickableLoader->loadBuildingKits($output); $rebrickableLoader->loadBuildingKits();
$rebrickableLoader->loadPartBuildingKits($output); $rebrickableLoader->loadPartBuildingKits();
} catch (\Exception $e) { } catch (\Exception $e) {
printf($e->getMessage()); printf($e->getMessage());
} }

View File

@ -1,38 +1,39 @@
<?php <?php
namespace AppBundle\Service; namespace AppBundle\Loader;
use AppBundle\Entity\Model; use AppBundle\Entity\Model;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Adapter\NullAdapter;
use League\Flysystem\FileExistsException;
use League\Flysystem\FileNotFoundException;
use League\Flysystem\Filesystem;
use Oneup\FlysystemBundle\OneupFlysystemBundle;
use Symfony\Component\Asset\Exception\LogicException; use Symfony\Component\Asset\Exception\LogicException;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\SplFileInfo; use Symfony\Component\Finder\SplFileInfo;
use Symfony\Component\Process\Exception\ProcessFailedException; use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\ProcessBuilder; use Symfony\Component\Process\ProcessBuilder;
class LDrawLoader class LDrawLoader extends Loader
{ {
/**
* @var EntityManager
*/
private $em;
/** /**
* @var string LDView binary file path * @var string LDView binary file path
*/ */
private $ldview; private $ldview;
/** /**
* @var string LDraw library root path * @var $ldraw Filesystem
*/ */
private $ldraw; private $ldraw;
/** /**
* @var string * @var \League\Flysystem\Filesystem
*/ */
private $dataPath; private $dataPath;
public function __construct($em, $ldview, $dataPath) public function __construct($em, $ldview, $dataPath)
{ {
$this->em = $em; $this->em = $em;
@ -40,17 +41,26 @@ class LDrawLoader
$this->dataPath = $dataPath; $this->dataPath = $dataPath;
} }
// LDraw
public function loadModels($LDrawLibrary) public function loadModels($LDrawLibrary)
{ {
$adapter = new Local(getcwd().DIRECTORY_SEPARATOR.$LDrawLibrary);
$this->ldraw = new Filesystem($adapter);
// $files = $this->ldraw->get('parts')->getContents();
$finder = new Finder(); $finder = new Finder();
$files = $finder->files()->name('*.dat')->depth('== 0')->in(getcwd().DIRECTORY_SEPARATOR.$LDrawLibrary.'/parts'); $files = $finder->files()->name('*.dat')->depth('== 0')->in(getcwd().DIRECTORY_SEPARATOR.$LDrawLibrary.DIRECTORY_SEPARATOR.'parts');
$this->ldraw = getcwd().DIRECTORY_SEPARATOR.$LDrawLibrary;
$progressBar = new ProgressBar($this->output, $files->count());
$progressBar->setFormat('very_verbose');
$progressBar->setMessage('Loading LDraw library models');
$progressBar->setFormat('%message:6s% %current%/%max% [%bar%]%percent:3s%% (%elapsed:6s%/%estimated:-6s%)');
$progressBar->start();
foreach ($files as $file) { foreach ($files as $file) {
$this->loadModelHeader($file); $this->loadModelHeader($file);
$this->createStlFile($file);
$progressBar->advance();
} }
$progressBar->finish();
} }
private function loadModelHeader(SplFileInfo $fileInfo) private function loadModelHeader(SplFileInfo $fileInfo)
@ -82,29 +92,6 @@ class LDrawLoader
$model->setAuthor(explode('Author: ', $line)[1]); $model->setAuthor(explode('Author: ', $line)[1]);
} }
} }
$builder = new ProcessBuilder();
$process = $builder
->setPrefix($this->ldview)
->setArguments([
$fileInfo->getRealPath(),
'-ExportFiles=1',
'-LDrawDir='.$this->ldraw,
'-ExportSuffix=.stl',
'-ExportsDir='.$this->dataPath,
])
->getProcess();
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
} else {
var_dump($process->getOutput());
}
// $this->em->persist($model); // $this->em->persist($model);
// $this->em->flush(); // $this->em->flush();
} else { } else {
@ -112,4 +99,26 @@ class LDrawLoader
} }
fclose($handle); fclose($handle);
} }
private function createStlFile(SplFileInfo $file)
{
$builder = new ProcessBuilder();
$process = $builder
->setPrefix($this->ldview)
->setArguments([
// $this->ldraw->getAdapter()->getPathPrefix().$file['path'],
$file->getRealPath(),
'-ExportFiles=1',
'-LDrawDir='.$this->ldraw->getAdapter()->getPathPrefix(),
'-ExportSuffix=.stl',
'-ExportsDir='.$this->dataPath->getAdapter()->getPathPrefix(),
])
->getProcess();
$process->run();
if (!$process->isSuccessful() || !$this->dataPath->has(str_replace('.dat','.stl',$file->getFilename()))) {
throw new ProcessFailedException($process); //TODO
}
}
} }

View File

@ -0,0 +1,23 @@
<?php
namespace AppBundle\Loader;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\OutputInterface;
class Loader
{
/**
* @var EntityManager
*/
protected $em;
protected $output;
public function setOutput(OutputInterface $output) {
$this->output = $output;
$this->output->setDecorated(true);
}
}

View File

@ -1,6 +1,6 @@
<?php <?php
namespace AppBundle\Service; namespace AppBundle\Loader;
use AppBundle\Api\Manager\RebrickableManager; use AppBundle\Api\Manager\RebrickableManager;
use AppBundle\Entity\Category; use AppBundle\Entity\Category;
@ -12,13 +12,8 @@ use AppBundle\Entity\Part_BuildingKit;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\ProgressBar;
class RebrickableLoader class RebrickableLoader extends Loader
{ {
/**
* @var EntityManager
*/
private $em;
/** /**
* @var RebrickableManager * @var RebrickableManager
*/ */
@ -29,11 +24,14 @@ class RebrickableLoader
*/ */
public function __construct($em, $rebrickableManager) public function __construct($em, $rebrickableManager)
{ {
/**
* @var $em EntityManager
* */
$this->em = $em; $this->em = $em;
$this->rebrickableManager = $rebrickableManager; $this->rebrickableManager = $rebrickableManager;
} }
public function loadPartBuildingKits($output) public function loadPartBuildingKits()
{ {
$partRepository = $this->em->getRepository('AppBundle:Part'); $partRepository = $this->em->getRepository('AppBundle:Part');
$buldingKitRepository = $this->em->getRepository('AppBundle:BuildingKit'); $buldingKitRepository = $this->em->getRepository('AppBundle:BuildingKit');
@ -48,7 +46,7 @@ class RebrickableLoader
$header = fgetcsv($handle, 200, ','); $header = fgetcsv($handle, 200, ',');
// create a new progress bar (50 units) // create a new progress bar (50 units)
$progress = new ProgressBar($output, intval(exec("wc -l '$setPieces'"))); $progress = new ProgressBar($this->output, intval(exec("wc -l '$setPieces'")));
$progress->setFormat('very_verbose'); $progress->setFormat('very_verbose');
$progress->setBarWidth(50); $progress->setBarWidth(50);
$progress->start(); $progress->start();
@ -90,7 +88,7 @@ class RebrickableLoader
unlink($setPieces); unlink($setPieces);
} }
public function loadBuildingKits($output) public function loadBuildingKits()
{ {
$keywordRepository = $this->em->getRepository('AppBundle:Keyword'); $keywordRepository = $this->em->getRepository('AppBundle:Keyword');
@ -103,7 +101,7 @@ class RebrickableLoader
$header = fgetcsv($handle, 500, ','); $header = fgetcsv($handle, 500, ',');
// create a new progress bar (50 units) // create a new progress bar (50 units)
$progress = new ProgressBar($output, intval(exec("wc -l '$sets'"))); $progress = new ProgressBar($this->output, intval(exec("wc -l '$sets'")));
$progress->setFormat('very_verbose'); $progress->setFormat('very_verbose');
$progress->setBarWidth(50); $progress->setBarWidth(50);
$progress->start(); $progress->start();
@ -151,7 +149,7 @@ class RebrickableLoader
unlink($sets); unlink($sets);
} }
public function loadParts($output) public function loadParts()
{ {
$pieces = tempnam(sys_get_temp_dir(), 'printabrick.'); $pieces = tempnam(sys_get_temp_dir(), 'printabrick.');
file_put_contents($pieces, fopen('compress.zlib://http://rebrickable.com/files/pieces.csv.gz', 'r')); file_put_contents($pieces, fopen('compress.zlib://http://rebrickable.com/files/pieces.csv.gz', 'r'));
@ -163,7 +161,7 @@ class RebrickableLoader
if (($handle = fopen($pieces, 'r')) !== false) { if (($handle = fopen($pieces, 'r')) !== false) {
// create a new progress bar (50 units) // create a new progress bar (50 units)
$progress = new ProgressBar($output, intval(exec("wc -l '$pieces'"))); $progress = new ProgressBar($this->output, intval(exec("wc -l '$pieces'")));
$progress->setFormat('very_verbose'); $progress->setFormat('very_verbose');
$progress->setBarWidth(50); $progress->setBarWidth(50);
$progress->start(); $progress->start();