diff --git a/app/config/service/loader.yml b/app/config/service/loader.yml index 19aca24..8d04f63 100644 --- a/app/config/service/loader.yml +++ b/app/config/service/loader.yml @@ -17,7 +17,7 @@ services: service.loader.relation: class: AppBundle\Service\Loader\RelationLoader - arguments: ['@api.manager.rebrickable', '@app.relation.mapper'] + arguments: ['@app.relation.mapper','@repository.ldraw.model', '@repository.rebrickable.part'] parent: service.loader.base service.loader.image: diff --git a/src/AppBundle/Exception/RelationMapper/InvalidResourceException.php b/src/AppBundle/Exception/RelationMapper/InvalidResourceException.php new file mode 100644 index 0000000..c653577 --- /dev/null +++ b/src/AppBundle/Exception/RelationMapper/InvalidResourceException.php @@ -0,0 +1,7 @@ +rebrickableAPIManager = $rebrickableApiManager; $this->relationMapper = $relationMapper; + $this->modelRepository = $modelRepository; + $this->partRepository = $partRepository; } public function loadAll() { - $parts = $this->em->getRepository(Part::class)->findAll(); + $parts = $this->partRepository->findAll(); $this->load($parts); } public function loadNotPaired($parts) { - $parts = $this->em->getRepository(Part::class)->findAllNotPaired(); + $parts = $this->partRepository->findAllNotPaired(); $this->load($parts); } @@ -44,7 +50,13 @@ class RelationLoader extends BaseLoader $this->initProgressBar(count($parts)); /** @var Part $part */ foreach ($parts as $part) { - $this->loadPartRelation($part); + $model = $this->loadPartRelation($part); + + if ($model) { + $part->setModel($model); + $this->partRepository->save($part); + } + $this->progressBar->setMessage($part->getNumber()); $this->progressBar->advance(); } @@ -56,33 +68,28 @@ class RelationLoader extends BaseLoader * * @param Part $part * - * @return Model $m + * @return Model|null */ private function loadPartRelation(Part $part) { - $modelRepository = $this->em->getRepository(Model::class); - $number = $part->getNumber(); - $model = $modelRepository->findOneByNumber($number); + $model = $this->modelRepository->findOneByNumber($number); if (!$model) { $number = $this->relationMapper->find($this->getPrintedParentId($number), 'part_model'); - $model = $modelRepository->findOneByNumber($number); + $model = $this->modelRepository->findOneByNumber($number); if (!$model) { - $model = $modelRepository->findOneByName($part->getName()); + $model = $this->modelRepository->findOneByName($part->getName()); } } - if ($model) { - $part->setModel($model); - $this->em->getRepository(Part::class)->save($part); - } + return $model; } /** - * Get printed part parent number. + * Get id of parent for printed parts form part id. * - * @param $id + * @param $number * * @return string|null LDraw number of printed part parent */ diff --git a/src/AppBundle/Util/LDModelParser.php b/src/AppBundle/Util/LDModelParser.php index b4c6df8..516bfc4 100644 --- a/src/AppBundle/Util/LDModelParser.php +++ b/src/AppBundle/Util/LDModelParser.php @@ -101,16 +101,16 @@ class LDModelParser $model['license'] = preg_replace('/(^!LICENSE )(.*) : (.*)$/', '$2', $line); } } elseif (strpos($line, '1 ') === 0) { - $reference = $this->getReferencedModelNumber($line); + if ($reference = $this->getReferencedModelNumber($line)) { + $id = strtolower($reference['id']); + $color = strtolower($reference['color']); - $id = strtolower($reference['id']); - $color = strtolower($reference['color']); - - // group subparts by color and id - if (isset($model['subparts'][$id][$color])) { - $model['subparts'][$id][$color] = $model['subparts'][$id][$color] + 1; - } else { - $model['subparts'][$id][$color] = 1; + // group subparts by color and id + if (isset($model['subparts'][$id][$color])) { + $model['subparts'][$id][$color] = $model['subparts'][$id][$color] + 1; + } else { + $model['subparts'][$id][$color] = 1; + } } } elseif (!empty($line) && !in_array($line[0], ['2', '3', '4', '5'])) { throw new ErrorParsingLineException($model['id'], $line); @@ -141,13 +141,16 @@ class LDModelParser * * @param $line * - * @return string|null Filename of referenced part + * @return array|null Filename of referenced part */ public function getReferencedModelNumber($line) { $line = strtolower(preg_replace('!\s+!', ' ', $line)); - if (preg_match('/^1 ([0-9]{1,3}) (.*) (.*)\.dat$/', $line, $matches)) { + // Do not load inverse part as subpart of model + if (preg_match('/^1 ([0-9]{1,3}) (0 0 0 -1 0 0 0 1 0 0 0 1) (.*)\.dat$/', $line, $matches)) { + return null; + } elseif (preg_match('/^1 ([0-9]{1,3}) (.*) (.*)\.dat$/', $line, $matches)) { $id = str_replace('\\', DIRECTORY_SEPARATOR, $matches[3]); $color = $matches[1];