home · contact · privacy
Add --ldraw=fill_n_studs mode. master
authorPlom Heller <plom@plomlompom.com>
Sun, 2 Aug 2026 19:16:51 +0000 (21:16 +0200)
committerPlom Heller <plom@plomlompom.com>
Sun, 2 Aug 2026 19:16:51 +0000 (21:16 +0200)
bricksplom.py

index 6fd40aff591580629ce405e5657b4252a2570a38..b12064c0fdd48630d5dd5c04e664c69546c55222 100755 (executable)
@@ -50,12 +50,14 @@ PARAM_Q_DELIMITERS = {CHAR_ATTR_EQ, CHAR_TEXTCONTAINS}
 TOK_SORT_BOX = 'box'
 TOK_SORT_ID = 'id'
 
+LDRAW_MODE_FILL_N_STUDS = 'fill_n_studs'
 LDRAW_MODE_FILL_PATHS = 'fill_paths'
-LDRAW_MODE_VERIFY_PATHS = 'verify_paths'
 LDRAW_MODE_VERIFY_N_STUDS = 'verify_n_studs'
-LDRAW_MODES = {LDRAW_MODE_FILL_PATHS,
-               LDRAW_MODE_VERIFY_PATHS,
-               LDRAW_MODE_VERIFY_N_STUDS}
+LDRAW_MODE_VERIFY_PATHS = 'verify_paths'
+LDRAW_MODES = {LDRAW_MODE_FILL_N_STUDS,
+               LDRAW_MODE_FILL_PATHS,
+               LDRAW_MODE_VERIFY_N_STUDS,
+               LDRAW_MODE_VERIFY_PATHS}
 
 ATTR_DESCS: dict[str, str] = {
     'n_studs': 'number of studs',
@@ -706,6 +708,12 @@ class BricksDb:
                     assert design.direct_attrs is not None
                     design.direct_attrs.ldraw = filename
         self._check_consistencies()
+        if LDRAW_MODE_FILL_N_STUDS in self._ldraw_modes:
+            for design in [d for d in self._designs_ldrawed()
+                           if d.n_studs != 1]:
+                assert design.direct_attrs is not None
+                design.direct_attrs.n_studs\
+                    = self._ldraw_studs_count(design.ldraw)
 
     @property
     def boxes(
@@ -719,6 +727,13 @@ class BricksDb:
             collected[box_id] = Box(box_id, bricks_set, db=self)
         return collected
 
+    def _designs_ldrawed(
+            self
+            ) -> tuple[BrickDesign, ...]:
+        return tuple(design for design in self.designs.values()
+                     if (not design.alternate_to)
+                     and design.ldraw and design.ldraw != '!')
+
     def _ldraw_studs_count(
             self,
             filename: str
@@ -790,10 +805,7 @@ class BricksDb:
                                 if v != 0]:
             fails += [f'invalid count for brick of ID: {brick_id} ({count})']
 
-        for design in [
-                design for design in self.designs.values()
-                if (not design.alternate_to)
-                and design.ldraw and design.ldraw != '!']:
+        for design in self._designs_ldrawed():
             # hunt for dangling Design.ldraw references
             if LDRAW_MODE_VERIFY_PATHS in self._ldraw_modes:
                 if not self._path_ldraw.joinpath(design.ldraw).exists():