diff options
author | Stephen Leger <stephen@3dservices.ch> | 2017-08-03 16:59:40 +0300 |
---|---|---|
committer | Stephen Leger <stephen@3dservices.ch> | 2017-08-04 06:13:39 +0300 |
commit | 00b84551cf7798c402508bce9458a2ed2ca1fc77 (patch) | |
tree | 786d56eb32024f5fa2a6c84f12afbcc7a1e824e2 | |
parent | 83e5b12b75643ea5f71a5de40533d82d9179ab2a (diff) |
archipack: thumb generator to replace static thumbs, revert _preset to preset according to talk with ideasman42
-rw-r--r-- | archipack/__init__.py | 20 | ||||
-rw-r--r-- | archipack/_presets/archipack_materials/floor.txt | 11 | ||||
-rw-r--r-- | archipack/_presets/archipack_materials/roof.txt | 12 | ||||
-rw-r--r-- | archipack/_presets/archipack_materials/wall.txt | 8 | ||||
-rw-r--r-- | archipack/archipack_cutter.py | 18 | ||||
-rw-r--r-- | archipack/archipack_floor.py | 9 | ||||
-rw-r--r-- | archipack/archipack_manipulator.py | 4 | ||||
-rw-r--r-- | archipack/archipack_material.py | 98 | ||||
-rw-r--r-- | archipack/archipack_object.py | 15 | ||||
-rw-r--r-- | archipack/archipack_preset.py | 74 | ||||
-rw-r--r-- | archipack/archipack_progressbar.py | 17 | ||||
-rw-r--r-- | archipack/archipack_rendering.py | 94 | ||||
-rw-r--r-- | archipack/archipack_roof.py | 194 | ||||
-rw-r--r-- | archipack/archipack_thumbs.py | 183 | ||||
-rw-r--r-- | archipack/presets/archipack_door/160x200_dual.py (renamed from archipack/_presets/archipack_door/160x200_dual.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_door/400x240_garage.py (renamed from archipack/_presets/archipack_door/400x240_garage.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_door/80x200.py (renamed from archipack/_presets/archipack_door/80x200.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_fence/glass_panels.py (renamed from archipack/_presets/archipack_fence/glass_panels.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_fence/inox_glass_concrete.py (renamed from archipack/_presets/archipack_fence/inox_glass_concrete.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_fence/metal.py (renamed from archipack/_presets/archipack_fence/metal.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_fence/metal_glass.py (renamed from archipack/_presets/archipack_fence/metal_glass.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_fence/wood.py (renamed from archipack/_presets/archipack_fence/wood.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/boards_200x20.py (renamed from archipack/_presets/archipack_floor/boards_200x20.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/herringbone_50x10.py (renamed from archipack/_presets/archipack_floor/herringbone_50x10.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/herringbone_p_50x10.py (renamed from archipack/_presets/archipack_floor/herringbone_p_50x10.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/hexagon_10.py (renamed from archipack/_presets/archipack_floor/hexagon_10.py) | 3 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/hopscotch_30x30.py (renamed from archipack/_presets/archipack_floor/hopscotch_30x30.py) | 3 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/parquet_15x3.py (renamed from archipack/_presets/archipack_floor/parquet_15x3.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/stepping_stone_30x30.py (renamed from archipack/_presets/archipack_floor/stepping_stone_30x30.py) | 3 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/tile_30x60.py (renamed from archipack/_presets/archipack_floor/tile_30x60.py) | 3 | ||||
-rw-r--r-- | archipack/presets/archipack_floor/windmill_30x30.py (renamed from archipack/_presets/archipack_floor/windmill_30x30.py) | 3 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/door.txt (renamed from archipack/_presets/archipack_materials/door.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/fence.txt (renamed from archipack/_presets/archipack_materials/fence.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/floor.txt | 22 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/handle.txt (renamed from archipack/_presets/archipack_materials/handle.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/roof.txt | 49 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/slab.txt (renamed from archipack/_presets/archipack_materials/slab.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/stair.txt (renamed from archipack/_presets/archipack_materials/stair.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/truss.txt (renamed from archipack/_presets/archipack_materials/truss.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/wall2.txt (renamed from archipack/_presets/archipack_materials/wall2.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_materials/window.txt (renamed from archipack/_presets/archipack_materials/window.txt) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/braas_1.py (renamed from archipack/_presets/archipack_roof/braas_1.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/braas_2.py (renamed from archipack/_presets/archipack_roof/braas_2.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/eternit.py (renamed from archipack/_presets/archipack_roof/eternit.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/lauze.py (renamed from archipack/_presets/archipack_roof/lauze.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/metal.py (renamed from archipack/_presets/archipack_roof/metal.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/ondule.py (renamed from archipack/_presets/archipack_roof/ondule.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/roman.py (renamed from archipack/_presets/archipack_roof/roman.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/round.py (renamed from archipack/_presets/archipack_roof/round.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_roof/square.py (renamed from archipack/_presets/archipack_roof/square.py) | 1 | ||||
-rw-r--r-- | archipack/presets/archipack_stair/i_wood_over_concrete.py (renamed from archipack/_presets/archipack_stair/i_wood_over_concrete.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_stair/l_wood_over_concrete.py (renamed from archipack/_presets/archipack_stair/l_wood_over_concrete.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_stair/o_wood_over_concrete.py (renamed from archipack/_presets/archipack_stair/o_wood_over_concrete.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_stair/u_wood_over_concrete.py (renamed from archipack/_presets/archipack_stair/u_wood_over_concrete.py) | 2 | ||||
-rw-r--r-- | archipack/presets/archipack_window/120x110_flat_2.py (renamed from archipack/_presets/archipack_window/120x110_flat_2.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/120x110_flat_2_elliptic.py (renamed from archipack/_presets/archipack_window/120x110_flat_2_elliptic.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/120x110_flat_2_oblique.py (renamed from archipack/_presets/archipack_window/120x110_flat_2_oblique.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/120x110_flat_2_round.py (renamed from archipack/_presets/archipack_window/120x110_flat_2_round.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/180x110_flat_3.py (renamed from archipack/_presets/archipack_window/180x110_flat_3.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/180x210_flat_3.py (renamed from archipack/_presets/archipack_window/180x210_flat_3.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/180x210_rail_2.py (renamed from archipack/_presets/archipack_window/180x210_rail_2.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/240x210_rail_3.py (renamed from archipack/_presets/archipack_window/240x210_rail_3.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/80x80_flat_1.py (renamed from archipack/_presets/archipack_window/80x80_flat_1.py) | 0 | ||||
-rw-r--r-- | archipack/presets/archipack_window/80x80_flat_1_circle.py (renamed from archipack/_presets/archipack_window/80x80_flat_1_circle.py) | 0 | ||||
-rw-r--r-- | archipack/presets/missing.png (renamed from archipack/_presets/missing.png) | bin | 1261 -> 1261 bytes |
65 files changed, 616 insertions, 242 deletions
diff --git a/archipack/__init__.py b/archipack/__init__.py index 93a50e66..7707abd3 100644 --- a/archipack/__init__.py +++ b/archipack/__init__.py @@ -261,7 +261,7 @@ class Archipack_Pref(AddonPreferences): col.label(text="Manipulators:") col.prop(self, "arrow_size") col.prop(self, "handle_size") - + # layout.operator("archipack.render_thumbs") # ---------------------------------------------------- # Archipack panels @@ -283,18 +283,16 @@ class TOOLS_PT_Archipack_Tools(Panel): def draw(self, context): wm = context.window_manager layout = self.layout - row = layout.row(align=True) - box = row.box() + box = layout.box() box.label("Auto boolean") - row = box.row(align=True) - row.operator("archipack.auto_boolean", text="AutoBoolean", icon='AUTO').mode = 'HYBRID' - row = layout.row(align=True) - box = row.box() + box.operator("archipack.auto_boolean", text="AutoBoolean", icon='AUTO').mode = 'HYBRID' + box = layout.box() box.label("Rendering") - row = box.row(align=True) - row.prop(wm.archipack, 'render_type', text="") - row = box.row(align=True) - row.operator("archipack.render", icon='RENDER_STILL') + box.prop(wm.archipack, 'render_type', text="") + box.operator("archipack.render", icon='RENDER_STILL') + box = layout.box() + box.label("Render presets Thumbnails") + box.operator("archipack.render_thumbs", icon='ERROR') class TOOLS_PT_Archipack_Create(Panel): diff --git a/archipack/_presets/archipack_materials/floor.txt b/archipack/_presets/archipack_materials/floor.txt deleted file mode 100644 index e04180a6..00000000 --- a/archipack/_presets/archipack_materials/floor.txt +++ /dev/null @@ -1,11 +0,0 @@ -DEFAULT##|##Floor_grout -DEFAULT##|##Floor_alt1 -DEFAULT##|##Floor_alt2 -DEFAULT##|##Floor_alt3 -DEFAULT##|##Floor_alt4 -DEFAULT##|##Floor_alt5 -DEFAULT##|##Floor_alt6 -DEFAULT##|##Floor_alt7 -DEFAULT##|##Floor_alt8 -DEFAULT##|##Floor_alt9 -DEFAULT##|##Floor_alt10 diff --git a/archipack/_presets/archipack_materials/roof.txt b/archipack/_presets/archipack_materials/roof.txt deleted file mode 100644 index 84e6394e..00000000 --- a/archipack/_presets/archipack_materials/roof.txt +++ /dev/null @@ -1,12 +0,0 @@ -DEFAULT##|##Roof_sheeting -DEFAULT##|##Roof_rakes -DEFAULT##|##Roof_eaves -DEFAULT##|##Roof_ridge -DEFAULT##|##Roof_rafter -DEFAULT##|##Roof_valley -DEFAULT##|##Roof_hip_tiles -DEFAULT##|##Roof_tiles -DEFAULT##|##Roof_tiles2 -DEFAULT##|##Roof_tiles3 -DEFAULT##|##Roof_tiles4 -DEFAULT##|##Roof_tiles5 diff --git a/archipack/_presets/archipack_materials/wall.txt b/archipack/_presets/archipack_materials/wall.txt deleted file mode 100644 index e489e4a6..00000000 --- a/archipack/_presets/archipack_materials/wall.txt +++ /dev/null @@ -1,8 +0,0 @@ -DEFAULT##|##Wall_inside -DEFAULT##|##Wall_outside -DEFAULT##|##Wall_cuts -DEFAULT##|##Wall_alt1 -DEFAULT##|##Wall_alt2 -DEFAULT##|##Wall_alt3 -DEFAULT##|##Wall_alt4 -DEFAULT##|##Wall_alt5 diff --git a/archipack/archipack_cutter.py b/archipack/archipack_cutter.py index bce82008..ba51b863 100644 --- a/archipack/archipack_cutter.py +++ b/archipack/archipack_cutter.py @@ -40,6 +40,7 @@ class CutterSegment(Line): def __init__(self, p, v, type='DEFAULT'): Line.__init__(self, p, v) self.type = type + self.is_hole = True @property def copy(self): @@ -404,23 +405,29 @@ class CutAblePolygon(): # no points found at all if start < 0: # print("no pt inside") - return + return not keep_inside if not slice_res: # print("slice fails") # found more segments than input # cutter made more than one loop - return + return True if len(store) < 1: if is_inside: # print("not touching, add as hole") - self.holes.append(cutter) - return + if keep_inside: + self.segs = cutter.segs + else: + self.holes.append(cutter) + + return True self.segs = store self.is_convex() + return True + class CutAbleGenerator(): @@ -641,8 +648,7 @@ class ArchipackCutter(): row.prop(self, 'parts_expand', icon="TRIA_DOWN", icon_only=True, text="Parts", emboss=False) box.prop(self, 'n_parts') for i, part in enumerate(self.parts): - if i < self.n_parts: - part.draw(layout, context, i) + part.draw(layout, context, i) else: row.prop(self, 'parts_expand', icon="TRIA_RIGHT", icon_only=True, text="Parts", emboss=False) diff --git a/archipack/archipack_floor.py b/archipack/archipack_floor.py index 29957716..9899905d 100644 --- a/archipack/archipack_floor.py +++ b/archipack/archipack_floor.py @@ -806,9 +806,6 @@ class FloorGenerator(CutAblePolygon, CutAbleGenerator): m.set_pts([pt1, pt2, pt3]) def generate_pattern(self, d, verts, faces, matids, uvs): - # clear data before refreshing it - - self.uv_factor = 1 / max(self.xmax, self.ymax) # automatically scale to keep within reasonable bounds if d.pattern == "boards": self.boards(d, verts, faces, matids, uvs) @@ -1225,14 +1222,14 @@ class archipack_floor(ArchipackObject, Manipulable, PropertyGroup): vary_materials = BoolProperty( name="Vary Material?", - default=False, + default=True, description="Vary Material indexes", update=update) matid = IntProperty( name="#variations", min=1, max=10, - default=1, + default=7, description="Material index maxi", update=update) auto_update = BoolProperty( @@ -1815,7 +1812,7 @@ class ARCHIPACK_OT_floor(ArchipackCreateTool, Operator): # activate manipulators at creation time o.select = True context.scene.objects.active = o - bpy.ops.archipack.floor_manipulate() + self.manipulate() return {'FINISHED'} else: self.report({'WARNING'}, "Option only valid in Object mode") diff --git a/archipack/archipack_manipulator.py b/archipack/archipack_manipulator.py index c96af62a..034507d8 100644 --- a/archipack/archipack_manipulator.py +++ b/archipack/archipack_manipulator.py @@ -2094,7 +2094,7 @@ class ARCHIPACK_OT_manipulate(Operator): return res def invoke(self, context, event): - if context.space_data.type == 'VIEW_3D': + if context.space_data is not None and context.space_data.type == 'VIEW_3D': context.window_manager.modal_handler_add(self) return {'RUNNING_MODAL'} else: @@ -2213,7 +2213,7 @@ class Manipulable(): # take care of context switching # when call from outside of 3d view - if context.space_data.type != 'VIEW_3D': + if context.space_data is not None and context.space_data.type != 'VIEW_3D': for window in bpy.context.window_manager.windows: screen = window.screen for area in screen.areas: diff --git a/archipack/archipack_material.py b/archipack/archipack_material.py index 7cb44180..c226c7fb 100644 --- a/archipack/archipack_material.py +++ b/archipack/archipack_material.py @@ -37,6 +37,7 @@ from bpy.props import ( StringProperty ) + setman = None libman = None @@ -49,7 +50,10 @@ class MatLib(): """ def __init__(self, matlib_path, name): self.name = name - self.path = os.path.join(matlib_path, name) + try: + self.path = os.path.join(matlib_path, name) + except: + pass self.materials = [] def cleanup(self): @@ -60,14 +64,15 @@ class MatLib(): list material names """ # print("MatLib.load_list(%s)" % (self.name)) - self.materials.clear() - - with bpy.data.libraries.load(self.path) as (data_from, data_to): - for mat in data_from.materials: - self.materials.append(mat) - if sort: - self.materials = list(sorted(self.materials)) + try: + with bpy.data.libraries.load(self.path) as (data_from, data_to): + for mat in data_from.materials: + self.materials.append(mat) + if sort: + self.materials = list(sorted(self.materials)) + except: + pass def has(self, name): return name in self.materials @@ -76,15 +81,19 @@ class MatLib(): """ Load a material from library """ - # print("MatLib.load_mat(%s) linked:%s" % (name, link)) - with bpy.data.libraries.load(self.path, link, False) as (data_from, data_to): - data_to.materials = [name] + try: + # print("MatLib.load_mat(%s) linked:%s" % (name, link)) + with bpy.data.libraries.load(self.path, link, False) as (data_from, data_to): + data_to.materials = [name] + except: + pass def get_mat(self, name, link): """ apply a material by name to active_object into slot index lazy load material list on demand + return material or None """ # Lazy load material names @@ -116,14 +125,14 @@ class MatlibsManager(): self.matlibs.clear() def get_prefs(self, context): + """ + let raise error if any + """ global __name__ prefs = None - try: - # retrieve addon name from imports - addon_name = __name__.split('.')[0] - prefs = context.user_preferences.addons[addon_name].preferences - except: - pass + # retrieve addon name from imports + addon_name = __name__.split('.')[0] + prefs = context.user_preferences.addons[addon_name].preferences return prefs @property @@ -166,7 +175,7 @@ class MatlibsManager(): prefs = self.get_prefs(context) self.add_to_list(prefs.matlib_path) except: - print("unable to load %s" % mat_path) + print("Archipack: Unable to load default material library, please check path in addon prefs") pass def apply(self, context, slot_index, name, link=False): @@ -248,20 +257,23 @@ class MaterialSetManager(): # print("load filename %s" % filename) material_sets = {} - + # create file object, and set open mode if os.path.exists(filename): - - f = open(filename, 'r') - lines = f.readlines() - - for line in lines: - s_key, mat_name = line.split("##|##") - if str(s_key) not in material_sets.keys(): - material_sets[s_key] = [] - material_sets[s_key].append(mat_name.strip()) - - f.close() + try: + f = open(filename, 'r') + lines = f.readlines() + + for line in lines: + s_key, mat_name = line.split("##|##") + if str(s_key) not in material_sets.keys(): + material_sets[s_key] = [] + material_sets[s_key].append(mat_name.strip()) + except: + print("Archipack: An error occured while loading {}".format(filename)) + pass + finally: + f.close() for s_key in material_sets.keys(): self.register_set(object_type, s_key, material_sets[s_key]) @@ -275,9 +287,14 @@ class MaterialSetManager(): for s_key in o_dict.keys(): for mat in o_dict[s_key]: lines.append("{}##|##{}\n".format(s_key, mat)) - f = open(filename, 'w') - f.writelines(lines) - f.close() + try: + f = open(filename, 'w') + f.writelines(lines) + except: + print("Archipack: An error occured while saving {}".format(filename)) + pass + finally: + f.close() def add(self, context, set_name): o = context.active_object @@ -302,9 +319,10 @@ class MaterialSetManager(): if object_type not in self.objects.keys(): self.load(object_type) if object_type not in self.objects.keys(): + print("Archipack: Unknown object type {}".format(object_type)) return None if set_name not in self.objects[object_type].keys(): - print("set {} not found".format(set_name)) + print("Archipack: set {} not found".format(set_name)) return None return self.objects[object_type][set_name] @@ -315,9 +333,9 @@ class MaterialSetManager(): if object_type not in self.objects.keys(): self.objects[object_type] = {} - + s_keys = self.objects[object_type].keys() - + if len(s_keys) < 1: return [('DEFAULT', 'Default', '', 0)] @@ -344,7 +362,7 @@ class archipack_material(PropertyGroup): ) material = EnumProperty( name="Material", - description="Material type", + description="Material Set name", items=material_enum, update=update ) @@ -429,7 +447,7 @@ class ARCHIPACK_OT_material(Operator): ) material = StringProperty( name="Material", - description="Material type", + description="Material Set name", default="" ) @@ -455,8 +473,10 @@ class ARCHIPACK_OT_material(Operator): pass if res: + # print("ARCHIPACK_OT_material.apply {} {}".format(self.category, self.material)) return {'FINISHED'} else: + print("Archipack: unable to add material {} for {}".format(self.material, self.category)) self.report({'WARNING'}, 'Material {} for {} not found'.format(self.material, self.category)) return {'CANCELLED'} @@ -469,7 +489,7 @@ class ARCHIPACK_OT_material_add(Operator): material = StringProperty( name="Material", - description="Material type", + description="Material Set name", default="" ) diff --git a/archipack/archipack_object.py b/archipack/archipack_object.py index b99fc33b..7c3a2c16 100644 --- a/archipack/archipack_object.py +++ b/archipack/archipack_object.py @@ -36,7 +36,6 @@ from bpy_extras.view3d_utils import ( region_2d_to_origin_3d, region_2d_to_vector_3d ) -# from .materialutils import MaterialUtils class ArchipackObject(): @@ -151,18 +150,30 @@ class ArchipackCreateTool(): def load_preset(self, d): """ Load python preset + d: archipack object datablock preset: full filename.py with path """ d.auto_update = False + fallback = True if self.filepath != "": try: bpy.ops.script.python_file_run(filepath=self.filepath) + fallback = False except: - print("Archipack unable to load preset file : %s" % (self.filepath)) pass + if fallback: + # fallback to load preset on background process + try: + exec(compile(open(self.filepath).read(), self.filepath, 'exec')) + except: + print("Archipack unable to load preset file : %s" % (self.filepath)) + pass d.auto_update = True def add_material(self, o, material='DEFAULT', category=None): + # skip if preset allready add material + if "archipack_material" in o: + return try: if category is None: category = self.archipack_category diff --git a/archipack/archipack_preset.py b/archipack/archipack_preset.py index 6dd39b28..3541042c 100644 --- a/archipack/archipack_preset.py +++ b/archipack/archipack_preset.py @@ -26,6 +26,7 @@ # ---------------------------------------------------------- import bpy import os +import subprocess from bl_operators.presets import AddPresetBase from mathutils import Vector from bpy.props import StringProperty @@ -235,19 +236,19 @@ class PresetMenu(): self.imageList.append(self.default_image.filepath_raw) return dir_path = os.path.dirname(os.path.realpath(__file__)) - sub_path = "_presets" + os.path.sep + "missing.png" + sub_path = "presets" + os.path.sep + "missing.png" filepath = os.path.join(dir_path, sub_path) if os.path.exists(filepath) and os.path.isfile(filepath): self.default_image = bpy.data.images.load(filepath=filepath) self.imageList.append(self.default_image.filepath_raw) if self.default_image is None: - raise EnvironmentError("archipack/_presets/missing.png not found") + raise EnvironmentError("archipack/presets/missing.png not found") def scan_files(self, category): file_list = [] # load default presets dir_path = os.path.dirname(os.path.realpath(__file__)) - sub_path = "_presets" + os.path.sep + category + sub_path = "presets" + os.path.sep + category presets_path = os.path.join(dir_path, sub_path) if os.path.exists(presets_path): file_list += [presets_path + os.path.sep + f[:-3] @@ -280,7 +281,7 @@ class PresetMenu(): """ image = None img_idx = bpy.data.images.find(os.path.basename(filepath) + '.png') - if img_idx > -1: + if img_idx > -1 and bpy.data.images[img_idx].filepath_raw == filepath: image = bpy.data.images[img_idx] self.imageList.append(image.filepath_raw) elif os.path.exists(filepath + '.png') and os.path.isfile(filepath + '.png'): @@ -522,6 +523,23 @@ class ArchipackPreset(AddPresetBase): # remove thumb os.remove(filepath[:-3] + ".png") + def background_render(self, context, cls, preset): + print("bg render") + generator = os.path.dirname(os.path.realpath(__file__)) + os.path.sep + "archipack_thumbs.py" + # Run external instance of blender like the original thumbnail generator. + cmd = [ + bpy.app.binary_path, + "--background", + "-noaudio", + "--python", generator, + "--", + "cls:" + cls, + "preset:" + preset + ] + print(repr(cmd)) + + subprocess.Popen(cmd) + def post_cb(self, context): if not self.remove_active: @@ -536,49 +554,9 @@ class ArchipackPreset(AddPresetBase): target_path, create=True) - filepath = os.path.join(target_path, filename) + ".png" - - # render thumb - scene = context.scene - render = scene.render - - # save render parame - resolution_x = render.resolution_x - resolution_y = render.resolution_y - resolution_percentage = render.resolution_percentage - old_filepath = render.filepath - use_file_extension = render.use_file_extension - use_overwrite = render.use_overwrite - use_compositing = render.use_compositing - use_sequencer = render.use_sequencer - file_format = render.image_settings.file_format - color_mode = render.image_settings.color_mode - color_depth = render.image_settings.color_depth - - render.resolution_x = 150 - render.resolution_y = 100 - render.resolution_percentage = 100 - render.filepath = filepath - render.use_file_extension = True - render.use_overwrite = True - render.use_compositing = False - render.use_sequencer = False - render.image_settings.file_format = 'PNG' - render.image_settings.color_mode = 'RGBA' - render.image_settings.color_depth = '8' - bpy.ops.render.render(animation=False, write_still=True, use_viewport=False) - - # restore render params - render.resolution_x = resolution_x - render.resolution_y = resolution_y - render.resolution_percentage = resolution_percentage - render.filepath = old_filepath - render.use_file_extension = use_file_extension - render.use_overwrite = use_overwrite - render.use_compositing = use_compositing - render.use_sequencer = use_sequencer - render.image_settings.file_format = file_format - render.image_settings.color_mode = color_mode - render.image_settings.color_depth = color_depth + preset = os.path.join(target_path, filename) + ".py" + cls = self.preset_subdir[10:] + print("post cb cls:%s preset:%s" % (cls, preset)) + self.background_render(context, cls, preset) return diff --git a/archipack/archipack_progressbar.py b/archipack/archipack_progressbar.py index 16740c99..35ed166d 100644 --- a/archipack/archipack_progressbar.py +++ b/archipack/archipack_progressbar.py @@ -36,13 +36,16 @@ info_header_draw = None def update(self, context): global last_update - areas = context.window.screen.areas - for area in areas: - if area.type == 'INFO': - area.tag_redraw() - if time() - last_update > 0.1: - bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) - last_update = time() + if (context.window is not None and + context.window.screen is not None and + context.window.screen.areas is not None): + areas = context.window.screen.areas + for area in areas: + if area.type == 'INFO': + area.tag_redraw() + if time() - last_update > 0.1: + bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) + last_update = time() def register(): diff --git a/archipack/archipack_rendering.py b/archipack/archipack_rendering.py index 3d86d4d8..d95bb742 100644 --- a/archipack/archipack_rendering.py +++ b/archipack/archipack_rendering.py @@ -30,8 +30,9 @@ import bpy # noinspection PyUnresolvedReferences import bgl -from os import path, remove +from os import path, remove, listdir from sys import exc_info +import subprocess # noinspection PyUnresolvedReferences import bpy_extras.image_utils as img_utils # noinspection PyUnresolvedReferences @@ -39,6 +40,95 @@ from math import ceil from bpy.types import Operator +class ARCHIPACK_OT_render_thumbs(Operator): + bl_idname = "archipack.render_thumbs" + bl_label = "Render preset thumbs" + bl_description = "Render all presets thumbs" + bl_options = {'REGISTER', 'INTERNAL'} + + def background_render(self, context, cls, preset): + generator = path.dirname(path.realpath(__file__)) + path.sep + "archipack_thumbs.py" + # Run external instance of blender like the original thumbnail generator. + cmd = [ + bpy.app.binary_path, + "--background", + "-noaudio", + "--python", generator, + "--", + "cls:" + cls, + "preset:" + preset + ] + + popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) + for stdout_line in iter(popen.stdout.readline, ""): + yield stdout_line + popen.stdout.close() + popen.wait() + + def scan_files(self, category): + file_list = [] + # load default presets + dir_path = path.dirname(path.realpath(__file__)) + sub_path = "presets" + path.sep + category + presets_path = path.join(dir_path, sub_path) + if path.exists(presets_path): + file_list += [presets_path + path.sep + f[:-3] + for f in listdir(presets_path) + if f.endswith('.py') and + not f.startswith('.')] + # load user def presets + preset_paths = bpy.utils.script_paths("presets") + for preset in preset_paths: + presets_path = path.join(preset, category) + if path.exists(presets_path): + file_list += [presets_path + path.sep + f[:-3] + for f in listdir(presets_path) + if f.endswith('.py') and + not f.startswith('.')] + + file_list.sort() + return file_list + + def rebuild_thumbs(self, context): + file_list = [] + dir_path = path.dirname(path.realpath(__file__)) + sub_path = "presets" + presets_path = path.join(dir_path, sub_path) + print(presets_path) + if path.exists(presets_path): + dirs = listdir(presets_path) + for dir in dirs: + abs_dir = path.join(presets_path, dir) + if path.isdir(abs_dir): + files = self.scan_files(dir) + file_list.extend([(dir, file) for file in files]) + + ttl = len(file_list) + for i, preset in enumerate(file_list): + dir, file = preset + cls = dir[10:] + context.scene.archipack_progress = (100 * i / ttl) + for l in self.background_render(context, cls, file + ".py"): + if "[log]" in l: + print(l[5:].strip()) + # elif not "Fra:1" in l: + # print(l.strip()) + + @classmethod + def poll(cls, context): + return context.scene.archipack_progress < 0 + + def invoke(self, context, event): + return context.window_manager.invoke_confirm(self, event) + + def execute(self, context): + context.scene.archipack_progress_text = 'Generating thumbs' + context.scene.archipack_progress = 0 + self.rebuild_thumbs(context) + context.scene.archipack_progress = -1 + return {'FINISHED'} + + # ------------------------------------------------------------- # Defines button for render # @@ -523,7 +613,9 @@ class ARCHIPACK_OT_render(Operator): def register(): bpy.utils.register_class(ARCHIPACK_OT_render) + bpy.utils.register_class(ARCHIPACK_OT_render_thumbs) def unregister(): bpy.utils.unregister_class(ARCHIPACK_OT_render) + bpy.utils.unregister_class(ARCHIPACK_OT_render_thumbs) diff --git a/archipack/archipack_roof.py b/archipack/archipack_roof.py index d3399d85..b3f8e904 100644 --- a/archipack/archipack_roof.py +++ b/archipack/archipack_roof.py @@ -1578,6 +1578,9 @@ class RoofGenerator(CutAbleGenerator): idmat = 7 rand = 3 + ttl = len(self.pans) + if ttl < 1: + return sx, sy, sz = d.tile_size_x, d.tile_size_y, d.tile_size_z @@ -1687,10 +1690,10 @@ class RoofGenerator(CutAbleGenerator): dx, dy = d.tile_space_x, d.tile_space_y - ttl = len(self.pans) step = 100 / ttl - context.scene.archipack_progress_text = "Build tiles:" + if d.quick_edit: + context.scene.archipack_progress_text = "Build tiles:" for i, pan in enumerate(self.pans): @@ -1737,7 +1740,8 @@ class RoofGenerator(CutAbleGenerator): progress = step * i + substep * k # print("progress %s" % (progress)) - context.scene.archipack_progress = progress + if d.quick_edit: + context.scene.archipack_progress = progress y = k * dy @@ -1875,7 +1879,8 @@ class RoofGenerator(CutAbleGenerator): bmed.bmesh_join(context, o, [bm], normal_update=True) bpy.ops.object.mode_set(mode='OBJECT') - context.scene.archipack_progress = -1 + if d.quick_edit: + context.scene.archipack_progress = -1 def _rake(self, s, i, boundary, pan, width, height, altitude, offset, idmat, @@ -2654,9 +2659,9 @@ class RoofGenerator(CutAbleGenerator): x1, y1 = s.lerp(t0) x2, y2 = p1 x3, y3 = s.lerp(t1) - z0 = self.z + d.beam_alt + z0 = self.z + d.beam_alt + pan.altitude(p0) z1 = z0 - d.beam_height - z2 = self.z + d.beam_alt + z2 = self.z + d.beam_alt + pan.altitude(p1) z3 = z2 - d.beam_height verts.extend([ (x0, y0, z0), @@ -2910,9 +2915,18 @@ class RoofGenerator(CutAbleGenerator): s2 = pan.last_seg(i) s3 = pan.next_seg(i) - - res, p0, t0 = s0.intersect(s2) - res, p1, t1 = s0.intersect(s3) + p0 = s0.p0 + p1 = s0.p1 + t0 = 0 + t1 = 1 + res, p, t = s0.intersect(s2) + if res: + t0 = t + p0 = p + res, p, t = s0.intersect(s3) + if res: + t1 = t + p1 = p p0 = s.lerp(t0) p1 = s.lerp(t1) @@ -3043,8 +3057,14 @@ class RoofGenerator(CutAbleGenerator): s0 = s.offset(-2 * d.tile_couloir) s1 = pan.last_seg(i) s2 = pan.next_seg(i) - res, p0, t = s0.intersect(s1) - res, p1, t = s0.intersect(s2) + p0 = s0.p0 + p1 = s0.p1 + res, p, t = s0.intersect(s1) + if res: + p0 = p + res, p, t = s0.intersect(s2) + if res: + p1 = p alt = self.z + d.valley_altitude x0, y0 = s1.p1 x1, y1 = p0 @@ -3397,14 +3417,21 @@ class RoofGenerator(CutAbleGenerator): """ either external or holes cuts """ + to_remove = [] for b in o.children: d = archipack_roof_cutter.datablock(b) if d is not None: g = d.ensure_direction() g.change_coordsys(b.matrix_world, o.matrix_world) - for pan in self.pans: - pan.slice(g) + for i, pan in enumerate(self.pans): + keep = pan.slice(g) + if not keep: + if i not in to_remove: + to_remove.append(i) pan.limits() + to_remove.sort() + for i in reversed(to_remove): + self.pans.pop(i) def draft(self, context, verts, edges): for pan in self.pans: @@ -3469,7 +3496,7 @@ class ArchipackSegment(): name="length", min=0.01, max=1000.0, - default=2.0, + default=4.0, update=update ) a0 = FloatProperty( @@ -3552,10 +3579,10 @@ class ArchipackLines(): class archipack_roof_segment(ArchipackSegment, PropertyGroup): bound_idx = IntProperty( - default=0, - min=0, - update=update_manipulators - ) + default=0, + min=0, + update=update_manipulators + ) width_left = FloatProperty( name="L Width", min=0.01, @@ -3610,31 +3637,31 @@ class archipack_roof_segment(ArchipackSegment, PropertyGroup): update=update ) take_precedence = BoolProperty( - name="Take precedence", - description="On T segment take width precedence", - default=False, - update=update - ) + name="Take precedence", + description="On T segment take width precedence", + default=False, + update=update + ) constraint_type = EnumProperty( - items=( - ('HORIZONTAL', 'Horizontal', '', 0), - ('SLOPE', 'Slope', '', 1) - ), - default='HORIZONTAL', - update=update_manipulators - ) + items=( + ('HORIZONTAL', 'Horizontal', '', 0), + ('SLOPE', 'Slope', '', 1) + ), + default='HORIZONTAL', + update=update_manipulators + ) enforce_part = EnumProperty( - name="Enforce part", - items=( - ('AUTO', 'Auto', '', 0), - ('VALLEY', 'Valley', '', 1), - ('HIP', 'Hip', '', 2) - ), - default='AUTO', - update=update - ) + name="Enforce part", + items=( + ('AUTO', 'Auto', '', 0), + ('VALLEY', 'Valley', '', 1), + ('HIP', 'Hip', '', 2) + ), + default='AUTO', + update=update + ) def find_in_selection(self, context): """ @@ -3737,11 +3764,6 @@ class archipack_roof(ArchipackLines, ArchipackObject, Manipulable, PropertyGroup name="Quick Edit", default=True ) - force_update = BoolProperty( - options={'SKIP_SAVE'}, - name="Throttle", - default=True - ) tile_enable = BoolProperty( name="Enable", @@ -4223,51 +4245,51 @@ class archipack_roof(ArchipackLines, ArchipackObject, Manipulable, PropertyGroup ) t_parent = StringProperty( - name="Parent", - default="", - update=update_parent - ) + name="Parent", + default="", + update=update_parent + ) t_part = IntProperty( - name="Part", - description="Parent part index", - default=0, - min=0, - update=update_cutter - ) + name="Part", + description="Parent part index", + default=0, + min=0, + update=update_cutter + ) t_dist_x = FloatProperty( - name="Dist x", - description="Location on axis ", - default=0, - update=update_cutter - ) + name="Dist x", + description="Location on axis ", + default=0, + update=update_cutter + ) t_dist_y = FloatProperty( - name="Dist y", - description="Lateral distance from axis", - min=0.0001, - default=0.0001, - update=update_cutter - ) + name="Dist y", + description="Lateral distance from axis", + min=0.0001, + default=0.0001, + update=update_cutter + ) hole_offset_left = FloatProperty( - name="Left", - description="Left distance from border", - min=0, - default=0, - update=update_cutter - ) + name="Left", + description="Left distance from border", + min=0, + default=0, + update=update_cutter + ) hole_offset_right = FloatProperty( - name="Right", - description="Right distance from border", - min=0, - default=0, - update=update_cutter - ) + name="Right", + description="Right distance from border", + min=0, + default=0, + update=update_cutter + ) hole_offset_front = FloatProperty( - name="Front", - description="Front distance from border", - default=0, - update=update_cutter - ) + name="Front", + description="Front distance from border", + default=0, + update=update_cutter + ) def make_wall_fit(self, context, o, wall, inside=False): origin = Vector((0, 0, self.z)) @@ -5007,6 +5029,12 @@ class ARCHIPACK_OT_roof(ArchipackCreateTool, Operator): o.select = True context.scene.objects.active = o self.add_material(o) + + # disable progress bar when + # background render thumbs + if not self.auto_manipulate: + d.quick_edit = False + self.load_preset(d) return o @@ -5335,7 +5363,7 @@ class ARCHIPACK_OT_roof_preset(ArchipackPreset, Operator): @property def blacklist(self): - return ['n_parts', 'parts', 'manipulators', 'user_defined_path'] + return ['n_parts', 'parts', 'manipulators', 'user_defined_path', 'quick_edit', 'draft'] def register(): diff --git a/archipack/archipack_thumbs.py b/archipack/archipack_thumbs.py new file mode 100644 index 00000000..5b14e91b --- /dev/null +++ b/archipack/archipack_thumbs.py @@ -0,0 +1,183 @@ +# -*- coding:utf-8 -*- + +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- 1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +# ---------------------------------------------------------- +# Author: Stephen Leger (s-leger) +# Inspired by Asset-Flinguer +# ---------------------------------------------------------- +import sys +from mathutils import Vector +import bpy + + +def log(s): + print("[log]" + s) + + +def generateThumb(context, cls, preset): + log("### RENDER THUMB ############################") + log("Start generating: " + cls) + + # engine settings + context.scene.render.engine = 'CYCLES' + render = context.scene.cycles + render.progressive = 'PATH' + render.samples = 24 + render.use_square_samples = True + render.preview_samples = 24 + render.aa_samples = 24 + render.transparent_max_bounces = 8 + render.transparent_min_bounces = 8 + render.transmission_bounces = 8 + render.max_bounces = 8 + render.min_bounces = 6 + render.caustics_refractive = False + render.caustics_reflective = False + render.use_transparent_shadows = True + render.diffuse_bounces = 1 + render.glossy_bounces = 4 + bpy.ops.object.select_all(action="SELECT") + bpy.ops.object.delete() + # create object, loading preset + getattr(bpy.ops.archipack, cls)('INVOKE_DEFAULT', filepath=preset, auto_manipulate=False) + + o = context.active_object + size = o.dimensions + x, y, z = o.bound_box[0] + min_x = x + min_y = y + min_z = z + x, y, z = o.bound_box[6] + max_x = x + max_y = y + max_z = z + center = Vector(( + min_x + 0.5 * (max_x - min_x), + min_y + 0.5 * (max_y - min_y), + min_z + 0.5 * (max_z - min_z))) + + # oposite / tan (0.5 * fov) where fov is 49.134 deg + dist = max(size) / 0.32 + loc = center + dist * Vector((0.5, -1, 0.5)).normalized() + + log("Prepare camera") + bpy.ops.object.camera_add(view_align=True, + enter_editmode=False, + location=loc, + rotation=(1.150952, 0.0, 0.462509)) + cam = context.active_object + cam.data.lens = 50 + cam.select = True + context.scene.camera = cam + + bpy.ops.object.select_all(action="DESELECT") + o.select = True + bpy.ops.view3d.camera_to_view_selected() + + log("Prepare scene") + # add plane + bpy.ops.mesh.primitive_plane_add( + radius=1000, + view_align=False, + enter_editmode=False, + location=(0, 0, 0) + ) + p = context.active_object + m = bpy.data.materials.new("Plane") + m.use_nodes = True + m.node_tree.nodes[1].inputs[0].default_value = (1, 1, 1, 1) + p.data.materials.append(m) + + # add 3 lights + bpy.ops.object.lamp_add( + type='POINT', + radius=1, + view_align=False, + location=(3.69736, -7, 6.0)) + l = context.active_object + l.data.use_nodes = True + tree = l.data.node_tree + nodes = l.data.node_tree.nodes + emit = nodes["Emission"] + emit.inputs[1].default_value = 2000.0 + + bpy.ops.object.lamp_add( + type='POINT', + radius=1, + view_align=False, + location=(9.414563179016113, 5.446230888366699, 5.903861999511719)) + l = context.active_object + l.data.use_nodes = True + tree = l.data.node_tree + nodes = l.data.node_tree.nodes + emit = nodes["Emission"] + falloff = nodes.new(type="ShaderNodeLightFalloff") + falloff.inputs[0].default_value = 5 + tree.links.new(falloff.outputs[2], emit.inputs[1]) + + bpy.ops.object.lamp_add( + type='POINT', + radius=1, + view_align=False, + location=(-7.847615718841553, 1.03135085105896, 5.903861999511719)) + l = context.active_object + l.data.use_nodes = True + tree = l.data.node_tree + nodes = l.data.node_tree.nodes + emit = nodes["Emission"] + falloff = nodes.new(type="ShaderNodeLightFalloff") + falloff.inputs[0].default_value = 5 + tree.links.new(falloff.outputs[2], emit.inputs[1]) + + # Set output filename. + render = context.scene.render + render.filepath = preset[:-3] + ".png" + render.use_file_extension = True + render.use_overwrite = True + render.use_compositing = False + render.use_sequencer = False + render.resolution_x = 150 + render.resolution_y = 100 + render.resolution_percentage = 100 + # render.image_settings.file_format = 'PNG' + # render.image_settings.color_mode = 'RGBA' + # render.image_settings.color_depth = '8' + + # Configure output size. + log("Render") + + # Render thumbnail + bpy.ops.render.render(write_still=True) + + log("### COMPLETED ############################") + + +preset = "" + +for arg in sys.argv: + if arg.startswith("cls:"): + cls = arg[4:] + if arg.startswith("preset:"): + preset = arg[7:] + + +generateThumb(bpy.context, cls, preset) diff --git a/archipack/_presets/archipack_door/160x200_dual.py b/archipack/presets/archipack_door/160x200_dual.py index 7a9e5ebc..7a9e5ebc 100644 --- a/archipack/_presets/archipack_door/160x200_dual.py +++ b/archipack/presets/archipack_door/160x200_dual.py diff --git a/archipack/_presets/archipack_door/400x240_garage.py b/archipack/presets/archipack_door/400x240_garage.py index 2060cc3b..2060cc3b 100644 --- a/archipack/_presets/archipack_door/400x240_garage.py +++ b/archipack/presets/archipack_door/400x240_garage.py diff --git a/archipack/_presets/archipack_door/80x200.py b/archipack/presets/archipack_door/80x200.py index a29e3ddc..a29e3ddc 100644 --- a/archipack/_presets/archipack_door/80x200.py +++ b/archipack/presets/archipack_door/80x200.py diff --git a/archipack/_presets/archipack_fence/glass_panels.py b/archipack/presets/archipack_fence/glass_panels.py index 2d150b71..2d150b71 100644 --- a/archipack/_presets/archipack_fence/glass_panels.py +++ b/archipack/presets/archipack_fence/glass_panels.py diff --git a/archipack/_presets/archipack_fence/inox_glass_concrete.py b/archipack/presets/archipack_fence/inox_glass_concrete.py index 80d3fb6c..80d3fb6c 100644 --- a/archipack/_presets/archipack_fence/inox_glass_concrete.py +++ b/archipack/presets/archipack_fence/inox_glass_concrete.py diff --git a/archipack/_presets/archipack_fence/metal.py b/archipack/presets/archipack_fence/metal.py index 5e7ecbfd..5e7ecbfd 100644 --- a/archipack/_presets/archipack_fence/metal.py +++ b/archipack/presets/archipack_fence/metal.py diff --git a/archipack/_presets/archipack_fence/metal_glass.py b/archipack/presets/archipack_fence/metal_glass.py index fb5149cb..fb5149cb 100644 --- a/archipack/_presets/archipack_fence/metal_glass.py +++ b/archipack/presets/archipack_fence/metal_glass.py diff --git a/archipack/_presets/archipack_fence/wood.py b/archipack/presets/archipack_fence/wood.py index 9a9a42d9..9a9a42d9 100644 --- a/archipack/_presets/archipack_fence/wood.py +++ b/archipack/presets/archipack_fence/wood.py diff --git a/archipack/_presets/archipack_floor/boards_200x20.py b/archipack/presets/archipack_floor/boards_200x20.py index 0ec933a5..d256cf42 100644 --- a/archipack/_presets/archipack_floor/boards_200x20.py +++ b/archipack/presets/archipack_floor/boards_200x20.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='DEFAULT') d.add_grout = False d.bevel = False d.bevel_amount = 0.001 diff --git a/archipack/_presets/archipack_floor/herringbone_50x10.py b/archipack/presets/archipack_floor/herringbone_50x10.py index 33acfa23..5e12e365 100644 --- a/archipack/_presets/archipack_floor/herringbone_50x10.py +++ b/archipack/presets/archipack_floor/herringbone_50x10.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='DEFAULT') d.add_grout = False d.bevel = False d.bevel_amount = 0.001 diff --git a/archipack/_presets/archipack_floor/herringbone_p_50x10.py b/archipack/presets/archipack_floor/herringbone_p_50x10.py index 03a68ec9..15946169 100644 --- a/archipack/_presets/archipack_floor/herringbone_p_50x10.py +++ b/archipack/presets/archipack_floor/herringbone_p_50x10.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='DEFAULT') d.add_grout = False d.bevel = False d.bevel_amount = 0.001 diff --git a/archipack/_presets/archipack_floor/hexagon_10.py b/archipack/presets/archipack_floor/hexagon_10.py index d8db8bef..5e0b7ce5 100644 --- a/archipack/_presets/archipack_floor/hexagon_10.py +++ b/archipack/presets/archipack_floor/hexagon_10.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='TILES') d.add_grout = True d.bevel = True d.bevel_amount = 0.0015 @@ -23,7 +24,7 @@ d.thickness_variance = 25.0 d.tile_length = 0.3 d.tile_width = 0.1 d.vary_length = False -d.vary_materials = False +d.vary_materials = True d.vary_thickness = False d.vary_width = False d.width_spacing = 0.002 diff --git a/archipack/_presets/archipack_floor/hopscotch_30x30.py b/archipack/presets/archipack_floor/hopscotch_30x30.py index 189c9b48..b662a0e3 100644 --- a/archipack/_presets/archipack_floor/hopscotch_30x30.py +++ b/archipack/presets/archipack_floor/hopscotch_30x30.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='TILES') d.add_grout = True d.bevel = True d.bevel_amount = 0.0015 @@ -23,7 +24,7 @@ d.thickness_variance = 25.0 d.tile_length = 0.3 d.tile_width = 0.3 d.vary_length = False -d.vary_materials = False +d.vary_materials = True d.vary_thickness = False d.vary_width = False d.width_spacing = 0.002 diff --git a/archipack/_presets/archipack_floor/parquet_15x3.py b/archipack/presets/archipack_floor/parquet_15x3.py index 2e62961a..e7ee7c00 100644 --- a/archipack/_presets/archipack_floor/parquet_15x3.py +++ b/archipack/presets/archipack_floor/parquet_15x3.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='DEFAULT') d.add_grout = False d.bevel = False d.bevel_amount = 0.001 diff --git a/archipack/_presets/archipack_floor/stepping_stone_30x30.py b/archipack/presets/archipack_floor/stepping_stone_30x30.py index db85715d..bace036f 100644 --- a/archipack/_presets/archipack_floor/stepping_stone_30x30.py +++ b/archipack/presets/archipack_floor/stepping_stone_30x30.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='TILES') d.add_grout = True d.bevel = True d.bevel_amount = 0.0015 @@ -23,7 +24,7 @@ d.thickness_variance = 25.0 d.tile_length = 0.3 d.tile_width = 0.3 d.vary_length = False -d.vary_materials = False +d.vary_materials = True d.vary_thickness = False d.vary_width = False d.width_spacing = 0.002 diff --git a/archipack/_presets/archipack_floor/tile_30x60.py b/archipack/presets/archipack_floor/tile_30x60.py index af92cd68..091b3d0e 100644 --- a/archipack/_presets/archipack_floor/tile_30x60.py +++ b/archipack/presets/archipack_floor/tile_30x60.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='TILES') d.add_grout = True d.bevel = True d.bevel_amount = 0.0015 @@ -23,7 +24,7 @@ d.thickness_variance = 25.0 d.tile_length = 0.3 d.tile_width = 0.6 d.vary_length = False -d.vary_materials = False +d.vary_materials = True d.vary_thickness = False d.vary_width = False d.width_spacing = 0.002 diff --git a/archipack/_presets/archipack_floor/windmill_30x30.py b/archipack/presets/archipack_floor/windmill_30x30.py index 8a690a1a..753a2de6 100644 --- a/archipack/_presets/archipack_floor/windmill_30x30.py +++ b/archipack/presets/archipack_floor/windmill_30x30.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_floor[0] +bpy.ops.archipack.material(category='floor', material='TILES') d.add_grout = True d.bevel = True d.bevel_amount = 0.0015 @@ -23,7 +24,7 @@ d.thickness_variance = 25.0 d.tile_length = 0.3 d.tile_width = 0.3 d.vary_length = False -d.vary_materials = False +d.vary_materials = True d.vary_thickness = False d.vary_width = False d.width_spacing = 0.002 diff --git a/archipack/_presets/archipack_materials/door.txt b/archipack/presets/archipack_materials/door.txt index 18951498..18951498 100644 --- a/archipack/_presets/archipack_materials/door.txt +++ b/archipack/presets/archipack_materials/door.txt diff --git a/archipack/_presets/archipack_materials/fence.txt b/archipack/presets/archipack_materials/fence.txt index 00827582..00827582 100644 --- a/archipack/_presets/archipack_materials/fence.txt +++ b/archipack/presets/archipack_materials/fence.txt diff --git a/archipack/presets/archipack_materials/floor.txt b/archipack/presets/archipack_materials/floor.txt new file mode 100644 index 00000000..ad94757c --- /dev/null +++ b/archipack/presets/archipack_materials/floor.txt @@ -0,0 +1,22 @@ +DEFAULT##|##Floor_grout +DEFAULT##|##Floor_alt1 +DEFAULT##|##Floor_alt2 +DEFAULT##|##Floor_alt3 +DEFAULT##|##Floor_alt4 +DEFAULT##|##Floor_alt5 +DEFAULT##|##Floor_alt6 +DEFAULT##|##Floor_alt7 +DEFAULT##|##Floor_alt8 +DEFAULT##|##Floor_alt9 +DEFAULT##|##Floor_alt10 +TILES##|##Floor_grout +TILES##|##Floor_tiles_alt1 +TILES##|##Floor_tiles_alt2 +TILES##|##Floor_tiles_alt3 +TILES##|##Floor_tiles_alt4 +TILES##|##Floor_tiles_alt5 +TILES##|##Floor_tiles_alt6 +TILES##|##Floor_alt7 +TILES##|##Floor_alt8 +TILES##|##Floor_alt9 +TILES##|##Floor_alt10
\ No newline at end of file diff --git a/archipack/_presets/archipack_materials/handle.txt b/archipack/presets/archipack_materials/handle.txt index 458cb1c2..458cb1c2 100644 --- a/archipack/_presets/archipack_materials/handle.txt +++ b/archipack/presets/archipack_materials/handle.txt diff --git a/archipack/presets/archipack_materials/roof.txt b/archipack/presets/archipack_materials/roof.txt new file mode 100644 index 00000000..1527ea78 --- /dev/null +++ b/archipack/presets/archipack_materials/roof.txt @@ -0,0 +1,49 @@ +DEFAULT##|##Roof_sheeting +DEFAULT##|##Roof_rakes +DEFAULT##|##Roof_eaves +DEFAULT##|##Roof_ridge +DEFAULT##|##Roof_rafter +DEFAULT##|##Roof_valley +DEFAULT##|##Roof_hip_tiles +DEFAULT##|##Roof_tiles +DEFAULT##|##Roof_tiles2 +DEFAULT##|##Roof_tiles3 +DEFAULT##|##Roof_tiles4 +DEFAULT##|##Roof_tiles5 +STONE##|##Roof_sheeting +STONE##|##Roof_rakes +STONE##|##Roof_eaves +STONE##|##Roof_ridge +STONE##|##Roof_rafter +STONE##|##Roof_valley +STONE##|##Roof_hip_stone +STONE##|##Roof_tiles_stone +STONE##|##Roof_tiles_stone2 +STONE##|##Roof_tiles_stone3 +STONE##|##Roof_tiles_stone4 +STONE##|##Roof_tiles_stone5 +BLACK##|##Roof_sheeting +BLACK##|##Roof_rakes +BLACK##|##Roof_eaves +BLACK##|##Roof_ridge +BLACK##|##Roof_rafter +BLACK##|##Roof_valley +BLACK##|##Roof_hip_black +BLACK##|##Roof_tiles_black +BLACK##|##Roof_tiles_black2 +BLACK##|##Roof_tiles_black3 +BLACK##|##Roof_tiles_black4 +BLACK##|##Roof_tiles_black5 +METAL##|##Roof_sheeting +METAL##|##Roof_rakes +METAL##|##Roof_eaves +METAL##|##Roof_ridge +METAL##|##Roof_rafter +METAL##|##Roof_valley +METAL##|##Roof_hip_metal +METAL##|##Roof_metal +METAL##|##Roof_metal2 +METAL##|##Roof_metal3 +METAL##|##Roof_metal4 +METAL##|##Roof_metal5 + diff --git a/archipack/_presets/archipack_materials/slab.txt b/archipack/presets/archipack_materials/slab.txt index 8d3490fe..8d3490fe 100644 --- a/archipack/_presets/archipack_materials/slab.txt +++ b/archipack/presets/archipack_materials/slab.txt diff --git a/archipack/_presets/archipack_materials/stair.txt b/archipack/presets/archipack_materials/stair.txt index 44966d35..44966d35 100644 --- a/archipack/_presets/archipack_materials/stair.txt +++ b/archipack/presets/archipack_materials/stair.txt diff --git a/archipack/_presets/archipack_materials/truss.txt b/archipack/presets/archipack_materials/truss.txt index 00718d4b..00718d4b 100644 --- a/archipack/_presets/archipack_materials/truss.txt +++ b/archipack/presets/archipack_materials/truss.txt diff --git a/archipack/_presets/archipack_materials/wall2.txt b/archipack/presets/archipack_materials/wall2.txt index 789c285d..789c285d 100644 --- a/archipack/_presets/archipack_materials/wall2.txt +++ b/archipack/presets/archipack_materials/wall2.txt diff --git a/archipack/_presets/archipack_materials/window.txt b/archipack/presets/archipack_materials/window.txt index 8f5f8575..8f5f8575 100644 --- a/archipack/_presets/archipack_materials/window.txt +++ b/archipack/presets/archipack_materials/window.txt diff --git a/archipack/_presets/archipack_roof/braas_1.py b/archipack/presets/archipack_roof/braas_1.py index 5ba9e6c6..442eb450 100644 --- a/archipack/_presets/archipack_roof/braas_1.py +++ b/archipack/presets/archipack_roof/braas_1.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='DEFAULT') d.tile_model = 'BRAAS1' d.tile_size_z = 0.05 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/braas_2.py b/archipack/presets/archipack_roof/braas_2.py index bd573c8e..f027ca95 100644 --- a/archipack/_presets/archipack_roof/braas_2.py +++ b/archipack/presets/archipack_roof/braas_2.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='DEFAULT') d.tile_model = 'BRAAS2' d.tile_size_z = 0.05 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/eternit.py b/archipack/presets/archipack_roof/eternit.py index 033cbf11..697df83b 100644 --- a/archipack/_presets/archipack_roof/eternit.py +++ b/archipack/presets/archipack_roof/eternit.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='BLACK') d.tile_model = 'ETERNIT' d.tile_size_z = 0.01 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/lauze.py b/archipack/presets/archipack_roof/lauze.py index 987d55bc..5b71b871 100644 --- a/archipack/_presets/archipack_roof/lauze.py +++ b/archipack/presets/archipack_roof/lauze.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='STONE') d.tile_model = 'LAUZE' d.tile_size_z = 0.04 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/metal.py b/archipack/presets/archipack_roof/metal.py index 33d35f66..35f8f1e6 100644 --- a/archipack/_presets/archipack_roof/metal.py +++ b/archipack/presets/archipack_roof/metal.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='METAL') d.tile_side = 0.0 d.hip_alt = 0.07 d.tile_fit_y = False diff --git a/archipack/_presets/archipack_roof/ondule.py b/archipack/presets/archipack_roof/ondule.py index 68be8fa4..f5592478 100644 --- a/archipack/_presets/archipack_roof/ondule.py +++ b/archipack/presets/archipack_roof/ondule.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='METAL') d.tile_side = 0.0 d.hip_alt = 0.07 d.tile_fit_y = False diff --git a/archipack/_presets/archipack_roof/roman.py b/archipack/presets/archipack_roof/roman.py index 6f3849dd..92e2c1ef 100644 --- a/archipack/_presets/archipack_roof/roman.py +++ b/archipack/presets/archipack_roof/roman.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='DEFAULT') d.tile_model = 'ROMAN' d.tile_size_z = 0.16 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/round.py b/archipack/presets/archipack_roof/round.py index 8da9a049..4705348e 100644 --- a/archipack/_presets/archipack_roof/round.py +++ b/archipack/presets/archipack_roof/round.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='DEFAULT') d.tile_model = 'ROUND' d.tile_size_z = 0.02 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_roof/square.py b/archipack/presets/archipack_roof/square.py index a26a15a8..edfa3848 100644 --- a/archipack/_presets/archipack_roof/square.py +++ b/archipack/presets/archipack_roof/square.py @@ -1,5 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_roof[0] +bpy.ops.archipack.material(category='roof', material='BLACK') d.tile_model = 'PLACEHOLDER' d.tile_size_z = 0.01 d.tile_border = 0.0 diff --git a/archipack/_presets/archipack_stair/i_wood_over_concrete.py b/archipack/presets/archipack_stair/i_wood_over_concrete.py index 53b605cf..53b605cf 100644 --- a/archipack/_presets/archipack_stair/i_wood_over_concrete.py +++ b/archipack/presets/archipack_stair/i_wood_over_concrete.py diff --git a/archipack/_presets/archipack_stair/l_wood_over_concrete.py b/archipack/presets/archipack_stair/l_wood_over_concrete.py index d4fc1344..d4fc1344 100644 --- a/archipack/_presets/archipack_stair/l_wood_over_concrete.py +++ b/archipack/presets/archipack_stair/l_wood_over_concrete.py diff --git a/archipack/_presets/archipack_stair/o_wood_over_concrete.py b/archipack/presets/archipack_stair/o_wood_over_concrete.py index 586aa990..586aa990 100644 --- a/archipack/_presets/archipack_stair/o_wood_over_concrete.py +++ b/archipack/presets/archipack_stair/o_wood_over_concrete.py diff --git a/archipack/_presets/archipack_stair/u_wood_over_concrete.py b/archipack/presets/archipack_stair/u_wood_over_concrete.py index ba16dde5..b523dcde 100644 --- a/archipack/_presets/archipack_stair/u_wood_over_concrete.py +++ b/archipack/presets/archipack_stair/u_wood_over_concrete.py @@ -1,6 +1,6 @@ import bpy d = bpy.context.active_object.data.archipack_stair[0] -d.auto_update = False + d.steps_type = 'CLOSED' d.handrail_slice_right = True d.total_angle = 6.2831854820251465 diff --git a/archipack/_presets/archipack_window/120x110_flat_2.py b/archipack/presets/archipack_window/120x110_flat_2.py index 7c7dcf9b..7c7dcf9b 100644 --- a/archipack/_presets/archipack_window/120x110_flat_2.py +++ b/archipack/presets/archipack_window/120x110_flat_2.py diff --git a/archipack/_presets/archipack_window/120x110_flat_2_elliptic.py b/archipack/presets/archipack_window/120x110_flat_2_elliptic.py index 312f7299..312f7299 100644 --- a/archipack/_presets/archipack_window/120x110_flat_2_elliptic.py +++ b/archipack/presets/archipack_window/120x110_flat_2_elliptic.py diff --git a/archipack/_presets/archipack_window/120x110_flat_2_oblique.py b/archipack/presets/archipack_window/120x110_flat_2_oblique.py index 010b4073..010b4073 100644 --- a/archipack/_presets/archipack_window/120x110_flat_2_oblique.py +++ b/archipack/presets/archipack_window/120x110_flat_2_oblique.py diff --git a/archipack/_presets/archipack_window/120x110_flat_2_round.py b/archipack/presets/archipack_window/120x110_flat_2_round.py index 3d0fd325..3d0fd325 100644 --- a/archipack/_presets/archipack_window/120x110_flat_2_round.py +++ b/archipack/presets/archipack_window/120x110_flat_2_round.py diff --git a/archipack/_presets/archipack_window/180x110_flat_3.py b/archipack/presets/archipack_window/180x110_flat_3.py index 3ae2748a..3ae2748a 100644 --- a/archipack/_presets/archipack_window/180x110_flat_3.py +++ b/archipack/presets/archipack_window/180x110_flat_3.py diff --git a/archipack/_presets/archipack_window/180x210_flat_3.py b/archipack/presets/archipack_window/180x210_flat_3.py index df26b7a5..df26b7a5 100644 --- a/archipack/_presets/archipack_window/180x210_flat_3.py +++ b/archipack/presets/archipack_window/180x210_flat_3.py diff --git a/archipack/_presets/archipack_window/180x210_rail_2.py b/archipack/presets/archipack_window/180x210_rail_2.py index d9f2cb89..d9f2cb89 100644 --- a/archipack/_presets/archipack_window/180x210_rail_2.py +++ b/archipack/presets/archipack_window/180x210_rail_2.py diff --git a/archipack/_presets/archipack_window/240x210_rail_3.py b/archipack/presets/archipack_window/240x210_rail_3.py index 4cec930b..4cec930b 100644 --- a/archipack/_presets/archipack_window/240x210_rail_3.py +++ b/archipack/presets/archipack_window/240x210_rail_3.py diff --git a/archipack/_presets/archipack_window/80x80_flat_1.py b/archipack/presets/archipack_window/80x80_flat_1.py index caf2980b..caf2980b 100644 --- a/archipack/_presets/archipack_window/80x80_flat_1.py +++ b/archipack/presets/archipack_window/80x80_flat_1.py diff --git a/archipack/_presets/archipack_window/80x80_flat_1_circle.py b/archipack/presets/archipack_window/80x80_flat_1_circle.py index 18f5c8bc..18f5c8bc 100644 --- a/archipack/_presets/archipack_window/80x80_flat_1_circle.py +++ b/archipack/presets/archipack_window/80x80_flat_1_circle.py diff --git a/archipack/_presets/missing.png b/archipack/presets/missing.png Binary files differindex 1d3fb40e..1d3fb40e 100644 --- a/archipack/_presets/missing.png +++ b/archipack/presets/missing.png |