expre-gen/blender/3.4/scripts/addons/archimesh/achm_window_maker.py
2025-10-17 09:47:23 +08:00

2286 lines
121 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
# ----------------------------------------------------------
# Author: Antonio Vazquez (antonioya)
#
# ----------------------------------------------------------
# noinspection PyUnresolvedReferences
import bpy
from math import pi, radians
from bpy.types import Operator, PropertyGroup, Object, Panel
from bpy.props import StringProperty, FloatProperty, BoolProperty, IntProperty, FloatVectorProperty, \
CollectionProperty, EnumProperty
from .achm_tools import *
# ------------------------------------------------------------------
# Define operator class to create object
# ------------------------------------------------------------------
class ARCHIMESH_OT_Windows(Operator):
bl_idname = "mesh.archimesh_window"
bl_label = "Rail Windows"
bl_description = "Rail Windows Generator"
bl_category = 'View'
bl_options = {'REGISTER', 'UNDO'}
# -----------------------------------------------------
# Draw (create UI interface)
# -----------------------------------------------------
# noinspection PyUnusedLocal
def draw(self, context):
layout = self.layout
row = layout.row()
row.label(text="Use Properties panel (N) to define parms", icon='INFO')
# -----------------------------------------------------
# Execute
# -----------------------------------------------------
def execute(self, context):
if bpy.context.mode == "OBJECT":
create_object(self, context)
return {'FINISHED'}
else:
self.report({'WARNING'}, "Archimesh: Option only valid in Object mode")
return {'CANCELLED'}
# ------------------------------------------------------------------------------
#
# Create main object. The other objects will be children of this.
#
# ------------------------------------------------------------------------------
# noinspection PyUnusedLocal
def create_object(self, context):
# deselect all objects
for o in bpy.data.objects:
o.select_set(False)
# we create main object and mesh
mainmesh = bpy.data.meshes.new("WindowFrane")
mainobject = bpy.data.objects.new("WindowFrame", mainmesh)
mainobject.location = bpy.context.scene.cursor.location
bpy.context.collection.objects.link(mainobject)
mainobject.WindowObjectGenerator.add()
# we shape the main object and create other objects as children
shape_mesh_and_create_children(mainobject, mainmesh)
# we select, and activate, main object
mainobject.select_set(True)
bpy.context.view_layer.objects.active = mainobject
# ------------------------------------------------------------------------------
#
# Update main mesh and children objects
#
# ------------------------------------------------------------------------------
# noinspection PyUnusedLocal
def update_object(self, context):
# When we update, the active object is the main object
o = bpy.context.active_object
oldmesh = o.data
oldname = o.data.name
# Now we deselect that object to not delete it.
o.select_set(False)
# and we create a new mesh
tmp_mesh = bpy.data.meshes.new("temp")
# deselect all objects
for obj in bpy.data.objects:
obj.select_set(False)
# ---------------------------------
# Clear Parent objects (autohole)
# ---------------------------------
myparent = o.parent
ploc = myparent.location
if myparent is not None:
o.parent = None
o.location = ploc
# remove_children(parent)
for child in myparent.children:
# noinspection PyBroadException
try:
# clear child data
child.hide_viewport = False # must be visible to avoid bug
child.hide_render = False # must be visible to avoid bug
old = child.data
child.select_set(True)
bpy.ops.object.delete()
bpy.data.meshes.remove(old)
except:
dummy = -1
myparent.select_set(True)
bpy.ops.object.delete()
# -----------------------
# remove all children
# -----------------------
# first granchild
for child in o.children:
remove_children(child)
# now children of main object
remove_children(o)
# Finally we create all that again (except main object),
shape_mesh_and_create_children(o, tmp_mesh, True)
o.data = tmp_mesh
# Remove data (mesh of active object),
bpy.data.meshes.remove(oldmesh)
tmp_mesh.name = oldname
# and select, and activate, the main object
o.select_set(True)
bpy.context.view_layer.objects.active = o
# ------------------------------------------------------------------------------
# Generate all objects
# For main, it only shapes mesh and creates modifiers (the modifier, only the first time).
# And, for the others, it creates object and mesh.
# ------------------------------------------------------------------------------
# noinspection PyUnusedLocal
def shape_mesh_and_create_children(mainobject, tmp_mesh, update=False):
mp = mainobject.WindowObjectGenerator[0]
# Create only mesh, because the object is created before
if mp.opentype == "1":
generate_rail_window(mainobject, mp, tmp_mesh)
else:
generate_leaf_window(mainobject, mp, tmp_mesh)
remove_doubles(mainobject)
set_normals(mainobject)
# saves OpenGL data
if mp.blind is True:
plus = mp.blind_height
else:
plus = 0
mp.glpoint_a = (-mp.width / 2, 0, 0)
mp.glpoint_b = (-mp.width / 2, 0, mp.height + plus)
mp.glpoint_c = (mp.width / 2, 0, mp.height + plus)
# Lock
mainobject.lock_location = (True, True, True)
mainobject.lock_rotation = (True, True, True)
# -------------------------
# Create empty and parent
# -------------------------
bpy.ops.object.empty_add(type='PLAIN_AXES')
myempty = bpy.data.objects[bpy.context.active_object.name]
myempty.location = mainobject.location
myempty.name = "Window_Group"
parentobject(myempty, mainobject)
mainobject["archimesh.hole_enable"] = True
# Rotate Empty
myempty.rotation_euler.z = radians(mp.r)
# Create control box to open wall holes
gap = 0.002
y = 0
z = 0
if mp.blind is True:
y = mp.blind_rail
if mp.blind is True and mp.blind_box is True:
z = mp.blind_height
myctrl = create_control_box("CTRL_Hole",
mp.width - gap,
mp.depth * 3, # + y,
mp.height + z - gap)
# Add custom property to detect Controller
myctrl["archimesh.ctrl_hole"] = True
set_normals(myctrl)
myctrl.parent = myempty
myctrl.location.x = 0
myctrl.location.y = -mp.depth * 3 / 2
myctrl.location.z = 0
myctrl.display_type = 'BOUNDS'
myctrl.hide_viewport = False
myctrl.hide_render = True
if bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
myctrl.visible_camera = False
myctrl.visible_diffuse = False
myctrl.visible_glossy = False
myctrl.visible_transmission = False
myctrl.visible_shadow = False
mat = create_transparent_material("hidden_material", False)
set_material(myctrl, mat)
# deactivate others
for o in bpy.data.objects:
if o.select_get() is True and o.name != mainobject.name:
o.select_set(False)
return
# ------------------------------------------------------------------
# Define property group class to create or modify
# ------------------------------------------------------------------
class ObjectProperties(PropertyGroup):
width: FloatProperty(
name='Width',
min=0.20, max=50,
default=1.20, precision=3,
description='window width',
update=update_object,
)
depth: FloatProperty(
name='Depth',
min=0.07, max=1,
default=0.10, precision=3,
description='window depth',
update=update_object,
)
height: FloatProperty(
name='Height',
min=0.20, max=50,
default=1, precision=3,
description='window height',
update=update_object,
)
r: FloatProperty(
name='Rotation', min=0, max=360, default=0, precision=1,
description='Window rotation',
update=update_object,
)
external: BoolProperty(
name="External frame",
description="Create an external front frame",
default=True,
update=update_object,
)
frame: FloatProperty(
name='External Frame',
min=0.001, max=1,
default=0.01, precision=3,
description='External Frame size',
update=update_object,
)
frame_L: FloatProperty(
name='Frame',
min=0.02, max=1,
default=0.06, precision=3,
description='Frame size',
update=update_object,
)
wf: FloatProperty(
name='WinFrame',
min=0.001, max=1,
default=0.05, precision=3,
description='Window Frame size',
update=update_object,
)
leafratio: FloatProperty(
name='Leaf ratio',
min=0.001, max=0.999,
default=0.50,
precision=3,
description='Leaf thickness ratio',
update=update_object,
)
opentype: EnumProperty(
items=(
('1', "Rail window", ""),
('2', "Two leaf", ""),
('3', "Right leaf", ""),
('4', "Left leaf", "")),
name="Type",
description="Defines type of window",
update=update_object,
)
handle: BoolProperty(
name="Create handles",
description="Create default handle to the leaf",
default=True,
update=update_object,
)
sill: BoolProperty(
name="Sill",
description="Add sill to window",
default=True,
update=update_object,
)
sill_thickness: FloatProperty(
name='Thickness',
min=0, max=50,
default=0.01, precision=3,
description='Sill thickness',
update=update_object,
)
sill_back: FloatProperty(
name='Back',
min=0, max=10,
default=0.0, precision=3,
description='Extrusion in back side',
update=update_object,
)
sill_front: FloatProperty(
name='Front',
min=0, max=10,
default=0.12, precision=3,
description='Extrusion in front side',
update=update_object,
)
blind: BoolProperty(
name="Blind",
description="Create an external blind",
default=False,
update=update_object,
)
blind_box: BoolProperty(
name="Blind box", description="Create a box over frame for blind",
default=True,
update=update_object,
)
blind_height: FloatProperty(
name='Height',
min=0.001, max=10,
default=0.12, precision=3,
description='Blind box height',
update=update_object,
)
blind_back: FloatProperty(
name='Back',
min=0.001, max=10,
default=0.002, precision=3,
description='Extrusion in back side',
update=update_object,
)
blind_rail: FloatProperty(
name='Separation',
min=0.001, max=10,
default=0.10, precision=3,
description='Separation from frame',
update=update_object,
)
blind_ratio: IntProperty(
name='Extend',
min=0, max=100,
default=20,
description='% of extension (100 full extend)',
update=update_object,
)
# Materials
crt_mat: BoolProperty(
name="Create default Cycles materials",
description="Create default materials for Cycles render",
default=True,
update=update_object,
)
# opengl internal data
glpoint_a: FloatVectorProperty(
name="glpointa",
description="Hidden property for opengl",
default=(0, 0, 0),
)
glpoint_b: FloatVectorProperty(
name="glpointb",
description="Hidden property for opengl",
default=(0, 0, 0),
)
glpoint_c: FloatVectorProperty(
name="glpointc",
description="Hidden property for opengl",
default=(0, 0, 0),
)
# Register
bpy.utils.register_class(ObjectProperties)
Object.WindowObjectGenerator = CollectionProperty(type=ObjectProperties)
# ------------------------------------------------------------------
# Define panel class to modify object
# ------------------------------------------------------------------
class ARCHIMESH_PT_WindowObjectgenerator(Panel):
bl_idname = "OBJECT_PT_window_generator"
bl_label = "Window Rail"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'Create'
# -----------------------------------------------------
# Verify if visible
# -----------------------------------------------------
@classmethod
def poll(cls, context):
o = context.object
if o is None:
return False
if 'WindowObjectGenerator' not in o:
return False
else:
return True
# -----------------------------------------------------
# Draw (create UI interface)
# -----------------------------------------------------
def draw(self, context):
o = context.object
# noinspection PyBroadException
try:
if 'WindowObjectGenerator' not in o:
return
except:
return
layout = self.layout
if bpy.context.mode == 'EDIT_MESH':
layout.label(text='Warning: Operator does not work in edit mode.', icon='ERROR')
else:
myobjdat = o.WindowObjectGenerator[0]
space = bpy.context.space_data
if not space.local_view:
# Imperial units warning
if bpy.context.scene.unit_settings.system == "IMPERIAL":
row = layout.row()
row.label(text="Warning: Imperial units not supported", icon='COLOR_RED')
box = layout.box()
row = box.row()
row.prop(myobjdat, 'opentype')
row = box.row()
row.label(text="Window size")
row = box.row()
row.prop(myobjdat, 'width')
row.prop(myobjdat, 'depth')
row.prop(myobjdat, 'height')
row = box.row()
row.prop(myobjdat, 'wf')
row = box.row()
row.prop(myobjdat, 'r')
row = box.row()
row.prop(myobjdat, 'external')
row.prop(myobjdat, 'handle')
if myobjdat.external:
row.prop(myobjdat, 'frame')
if myobjdat.opentype != "1":
row = box.row()
row.prop(myobjdat, 'frame_L')
row.prop(myobjdat, 'leafratio', slider=True)
box = layout.box()
row = box.row()
row.prop(myobjdat, 'sill')
if myobjdat.sill:
row = box.row()
row.prop(myobjdat, 'sill_thickness')
row.prop(myobjdat, 'sill_back')
row.prop(myobjdat, 'sill_front')
box = layout.box()
row = box.row()
row.prop(myobjdat, 'blind')
if myobjdat.blind:
row = box.row()
row.prop(myobjdat, 'blind_rail')
row.prop(myobjdat, 'blind_ratio', slider=True)
row = box.row()
row.prop(myobjdat, 'blind_box')
if myobjdat.blind_box:
row.prop(myobjdat, 'blind_height')
row.prop(myobjdat, 'blind_back')
box = layout.box()
if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
box.enabled = False
box.prop(myobjdat, 'crt_mat')
else:
row = layout.row()
row.label(text="Warning: Operator does not work in local view mode", icon='ERROR')
# ------------------------------------------------------------------------------
# Generate rail windows
# ------------------------------------------------------------------------------
def generate_rail_window(myframe, mp, mymesh):
myloc = bpy.context.scene.cursor.location
alummat = None
if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
alummat = create_diffuse_material("Window_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
# Frame
win_size, p1, p2 = create_rail_window_frame(myframe, mymesh,
mp.width, mp.depth, mp.height,
mp.frame,
mp.crt_mat, alummat, mp.external,
mp.blind and mp.blind_box,
mp.blind_height,
mp.blind_back,
mp.blind_rail)
remove_doubles(myframe)
set_normals(myframe)
# Window L
width = (mp.width / 2) + 0.01
mywin_l = create_rail_window_leaf("Window.L", "L",
width, win_size, mp.height - 0.05,
mp.wf,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, mp.handle)
remove_doubles(mywin_l)
set_normals(mywin_l)
mywin_l.parent = myframe
mywin_l.location.x = (-mp.width / 2) + 0.01
mywin_l.location.y = p1 - 0.001
mywin_l.location.z = 0.025
# Window R
mywin_r = create_rail_window_leaf("Window.R", "R",
width, win_size, mp.height - 0.05,
mp.wf,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, mp.handle)
remove_doubles(mywin_r)
set_normals(mywin_r)
mywin_r.parent = myframe
mywin_r.location.x = (mp.width / 2) - 0.01
mywin_r.location.y = p2 - 0.001
mywin_r.location.z = 0.025
# Sill
if mp.sill:
mysill = create_sill("Windows_Sill", mp.width,
mp.depth + mp.sill_back + mp.sill_front,
mp.sill_thickness, mp.crt_mat)
mysill.parent = myframe
mysill.location.x = 0
mysill.location.y = -mp.depth - mp.sill_back
mysill.location.z = 0
# Blind
if mp.blind:
myblindrail = create_blind_rail("Blind_rails", mp.width, mp.height,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, mp.blind_rail)
set_normals(myblindrail)
myblindrail.parent = myframe
myblindrail.location.x = 0
myblindrail.location.y = 0
myblindrail.location.z = 0
# Lock
myblindrail.lock_location = (True, True, True)
myblindrail.lock_rotation = (True, True, True)
myblind = create_blind("Blind", mp.width - 0.006, mp.height,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, mp.blind_ratio)
set_normals(myblind)
myblind.parent = myframe
myblind.location.x = 0
myblind.location.y = mp.blind_rail - 0.014
myblind.location.z = mp.height - 0.098
# Lock
myblind.lock_location = (True, True, True)
myblind.lock_rotation = (True, True, True)
# ------------------------------------------------------------------------------
# Generate leaf windows
# ------------------------------------------------------------------------------
def generate_leaf_window(myframe, mp, mymesh):
myloc = bpy.context.scene.cursor.location
alummat = None
if mp.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
alummat = create_diffuse_material("Window_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
# Frame
win_size = create_leaf_window_frame(myframe, mymesh,
mp.width, mp.depth, mp.height,
mp.frame, mp.frame_L, mp.leafratio,
mp.crt_mat, alummat, mp.external,
mp.blind and mp.blind_box, mp.blind_height, mp.blind_back,
mp.blind_rail)
remove_doubles(myframe)
set_normals(myframe)
stepsize = 0.01
# -----------------------------
# Window L
# -----------------------------
if mp.opentype == "2" or mp.opentype == "4":
handle = mp.handle
if mp.opentype == "2":
width = ((mp.width - (mp.frame_L * 2) + stepsize) / 2) + 0.004
handle = False # two windows only one handle
else:
width = mp.width - (mp.frame_L * 2) + stepsize + 0.008
mywin_l = create_leaf_window_leaf("Window.L", "L",
width, win_size, mp.height - (mp.frame_L * 2) + (stepsize * 2) - 0.004,
mp.wf,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, handle)
remove_doubles(mywin_l)
set_normals(mywin_l)
mywin_l.parent = myframe
mywin_l.location.x = -mp.width / 2 + mp.frame_L - stepsize + 0.001
mywin_l.location.y = -mp.depth
mywin_l.location.z = mp.frame_L - (stepsize / 2) - 0.003
# -----------------------------
# Window R
# -----------------------------
if mp.opentype == "2" or mp.opentype == "3":
if mp.opentype == "2":
width = ((mp.width - (mp.frame_L * 2) + stepsize) / 2) + 0.003
else:
width = mp.width - (mp.frame_L * 2) + stepsize + 0.008
mywin_r = create_leaf_window_leaf("Window.R", "R",
width, win_size, mp.height - (mp.frame_L * 2) + (stepsize * 2) - 0.004,
mp.wf,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, mp.handle)
remove_doubles(mywin_r)
set_normals(mywin_r)
mywin_r.parent = myframe
mywin_r.location.x = mp.width / 2 - mp.frame_L + stepsize - 0.001
mywin_r.location.y = -mp.depth
mywin_r.location.z = mp.frame_L - (stepsize / 2) - 0.003
# Sill
if mp.sill:
mysill = create_sill("Windows_Sill", mp.width,
mp.depth + mp.sill_back + mp.sill_front,
mp.sill_thickness, mp.crt_mat)
mysill.parent = myframe
mysill.location.x = 0
mysill.location.y = -mp.depth - mp.sill_back
mysill.location.z = 0
# Blind
if mp.blind:
myblindrail = create_blind_rail("Blind_rails", mp.width, mp.height,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, alummat, mp.blind_rail)
myblindrail.parent = myframe
myblindrail.location.x = 0
myblindrail.location.y = 0
myblindrail.location.z = 0
# Lock
myblindrail.lock_location = (True, True, True)
myblindrail.lock_rotation = (True, True, True)
myblind = create_blind("Blind", mp.width - 0.006, mp.height,
myloc.x, myloc.y, myloc.z,
mp.crt_mat, mp.blind_ratio)
myblind.parent = myframe
myblind.location.x = 0
myblind.location.y = mp.blind_rail - 0.014
myblind.location.z = mp.height - 0.098
# Lock
myblind.lock_location = (True, True, True)
myblind.lock_rotation = (True, True, True)
# deactivate others
for o in bpy.data.objects:
if o.select_get() is True:
o.select_set(False)
myframe.select_set(True)
bpy.context.view_layer.objects.active = myframe
return myframe
# ------------------------------------------------------------------------------
# Create windows frame
#
# sX: Size in X axis
# sY: Size in Y axis
# sZ: Size in Z axis
# frame: size of external frame
# mat: Flag for creating materials
# matdata: Aluminum material
# external: create external frame flag
# blind: blind flag
# blind_height: height of blind box
# blind_back: front extension
# blind_rail: distance of the rail
# ------------------------------------------------------------------------------
def create_rail_window_frame(mywindow, mymesh, sx, sy, sz, frame, mat, matdata, external,
blind, blind_height, blind_back, blind_rail):
myvertex = []
myfaces = []
v = 0
# ===========================================================================
# Horizontal pieces
# ===========================================================================
m = 0.02 # gap in front
gap = 0.001 # gap between leafs
rail = 0.007 # rail width
thick = 0.002 # aluminum thickness
w = (sy - m - gap - thick - thick - thick) / 2 # width of each leaf
p = (w - rail) / 2 # space of each side
side = 0.02 # vertical
for z in (0, sz):
for x in (-sx / 2, sx / 2):
myvertex.extend([(x, 0, z), (x, 0, z + side),
(x, -m - p, z + side),
(x, -m - p, z + (side * 2)), # rail 1
(x, -m - p - rail, z + (side * 2)),
(x, -m - p - rail, z + side),
(x, -m - p - rail - thick - p - gap - p, z + side),
(x, -m - p - rail - thick - p - gap - p, z + (side * 2)), # rail 2
(x, -m - p - rail - thick - p - gap - p - rail, z + (side * 2)),
(x, -m - p - rail - thick - p - gap - p - rail, z + side),
(x, -m - p - rail - thick - p - gap - p - rail - p - thick, z + side)])
# Faces
myfaces.extend([(v + 12, v + 1, v + 0, v + 11), (v + 13, v + 2, v + 1, v + 12), (v + 14, v + 3, v + 2, v + 13),
(v + 15, v + 4, v + 3, v + 14), (v + 16, v + 5, v + 4, v + 15), (v + 17, v + 6, v + 5, v + 16),
(v + 18, v + 7, v + 6, v + 17), (v + 19, v + 8, v + 7, v + 18), (v + 20, v + 9, v + 8, v + 19),
(v + 20, v + 21, v + 10, v + 9)])
side *= -1 # reveser direction
v = len(myvertex)
# ===========================================================================
# Vertical pieces
# ===========================================================================
y = 0
sideb = 0.03
sides = 0.02
thickb = 0.002 # aluminum thickness
win_size = p + rail + p
p1 = y - m - thick
p2 = y - m - thick - gap - p - rail - p - thick
# Left
for x in (-sx / 2, sx / 2):
for z in (0, sz):
myvertex.extend([(x, y, z),
(x + thickb, y, z),
(x + thickb, y - m, z),
(x + thickb + sides, y - m, z),
(x + thickb + sides, y - m - thick, z),
(x + thickb, y - m - thick, z),
(x + thickb, y - m - thick - gap - p - rail - p, z),
(x + thickb + sides, y - m - thick - gap - p - rail - p, z),
(x + thickb + sides, y - m - thick - gap - p - rail - p - thick, z),
(x + thickb, y - m - thick - gap - p - rail - p - thick, z),
(x + thickb, y - m - thick - gap - p - rail - p - thick - p - rail - p, z),
(x + thickb + sideb, y - m - thick - gap - p - rail - p - thick - p - rail - p, z),
(x + thickb + sideb, y - m - thick - gap - p - rail - p - thick - p - rail - p - thick, z),
(x, y - m - thick - gap - p - rail - p - thick - p - rail - p - thick, z)])
# Faces
myfaces.extend([(v + 13, v + 27, v + 14, v + 0), (v + 13, v + 12, v + 26, v + 27),
(v + 11, v + 10, v + 24, v + 25),
(v + 6, v + 5, v + 19, v + 20), (v + 10, v + 9, v + 23, v + 24),
(v + 25, v + 24, v + 27, v + 26), (v + 24, v + 23, v + 15, v + 16),
(v + 22, v + 21, v + 20, v + 23),
(v + 17, v + 16, v + 19, v + 18), (v + 9, v + 8, v + 22, v + 23),
(v + 7, v + 6, v + 20, v + 21), (v + 3, v + 2, v + 16, v + 17),
(v + 5, v + 4, v + 18, v + 19),
(v + 4, v + 3, v + 17, v + 18), (v + 7, v + 8, v + 9, v + 6),
(v + 3, v + 4, v + 5, v + 2), (v + 11, v + 12, v + 13, v + 10),
(v + 6, v + 5, v + 9, v + 10),
(v + 1, v + 0, v + 14, v + 15),
(v + 19, v + 16, v + 15, v + 14, v + 27, v + 24, v + 23, v + 20),
(v + 8, v + 7, v + 21, v + 22), (v + 12, v + 11, v + 25, v + 26),
(v + 2, v + 1, v + 15, v + 16),
(v + 5, v + 6, v + 9, v + 10, v + 13, v + 0, v + 1, v + 2)])
v = len(myvertex)
# reverse
thickb *= -1
sideb *= -1
sides *= -1
# ===========================================================================
# Front covers
# ===========================================================================
x = sx - 0.005 - (sideb * 2) # sideB + small gap
y = y - m - thick - gap - p - rail - p - thick - p - rail - p
z = sideb
# Bottom
myvertex.extend([(-x / 2, y - thick, 0.0),
(-x / 2, y, 0.0),
(x / 2, y, 0.0),
(x / 2, y - thick, 0.0),
(-x / 2, y - thick, z),
(-x / 2, y, z),
(x / 2, y, z),
(x / 2, y - thick, z)])
myfaces.extend([(v + 0, v + 1, v + 2, v + 3), (v + 0, v + 1, v + 5, v + 4), (v + 1, v + 2, v + 6, v + 5),
(v + 2, v + 6, v + 7, v + 3), (v + 5, v + 6, v + 7, v + 4), (v + 0, v + 4, v + 7, v + 3)])
v = len(myvertex)
# Top
myvertex.extend([(-x / 2, y - thick, sz - sideb),
(-x / 2, y, sz - sideb),
(x / 2, y, sz - sideb),
(x / 2, y - thick, sz - sideb),
(-x / 2, y - thick, sz - sideb + z),
(-x / 2, y, sz - sideb + z),
(x / 2, y, sz - sideb + z),
(x / 2, y - thick, sz - sideb + z)])
myfaces.extend([(v + 0, v + 1, v + 2, v + 3), (v + 0, v + 1, v + 5, v + 4), (v + 1, v + 2, v + 6, v + 5),
(v + 2, v + 6, v + 7, v + 3), (v + 5, v + 6, v + 7, v + 4), (v + 0, v + 4, v + 7, v + 3)])
v = len(myvertex)
# ===========================================================================
# External front covers
# ===========================================================================
if external:
x = sx
gap = -0.001
sidem = frame
box = 0
if blind:
box = blind_height
myvertex.extend([((-x / 2) - sidem, y - thick, sz + sidem + box),
((x / 2) + sidem, y - thick, sz + sidem + box),
((-x / 2) - sidem, y - thick, -sidem),
((x / 2) + sidem, y - thick, -sidem),
((-x / 2) - gap, y - thick, sz + gap + box),
((x / 2) + gap, y - thick, sz + gap + box),
((-x / 2) - gap, y - thick, -gap),
((x / 2) + gap, y - thick, -gap)])
myvertex.extend([((-x / 2) - sidem, y - thick * 2, sz + sidem + box),
((x / 2) + sidem, y - thick * 2, sz + sidem + box),
((-x / 2) - sidem, y - thick * 2, -sidem),
((x / 2) + sidem, y - thick * 2, -sidem),
((-x / 2) - gap, y - thick * 2, sz + gap + box),
((x / 2) + gap, y - thick * 2, sz + gap + box),
((-x / 2) - gap, y - thick * 2, -gap),
((x / 2) + gap, y - thick * 2, -gap)])
myfaces.extend([(v + 3, v + 1, v + 9, v + 11), (v + 9, v + 8, v + 0, v + 1),
(v + 1, v + 5, v + 4, v + 0),
(v + 3, v + 7, v + 5, v + 1),
(v + 7, v + 3, v + 2, v + 6),
(v + 0, v + 4, v + 6, v + 2),
(v + 9, v + 13, v + 12, v + 8), (v + 11, v + 15, v + 13, v + 9),
(v + 15, v + 11, v + 10, v + 14),
(v + 8, v + 12, v + 14, v + 10),
(v + 11, v + 3, v + 2, v + 10),
(v + 2, v + 10, v + 8, v + 0), (v + 14, v + 12, v + 4, v + 6),
(v + 7, v + 6, v + 14, v + 15),
(v + 5, v + 13, v + 12, v + 4),
(v + 15, v + 7, v + 5, v + 13)])
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mywindow, matdata)
# --------------
# Blind Box
# --------------
if blind:
mybox = create_blind_box("Blind_box", sx, sy + blind_back + blind_rail, blind_height)
set_normals(mybox)
mybox.parent = mywindow
mybox.location.x = 0
mybox.location.y = -blind_back - sy
mybox.location.z = sz
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mybox, matdata)
# Lock
mybox.lock_location = (True, True, True)
mybox.lock_rotation = (True, True, True)
return win_size, p1, p2
# ------------------------------------------------------------------------------
# Create leafs windows frame
#
# sX: Size in X axis
# sY: Size in Y axis
# sZ: Size in Z axis
# frame: size of external frame
# frame_L: size of main frame
# leafratio: ratio of leaf depth
# mat: Flag for creating materials
# matdata: Aluminum material
# external: create external frame flag
# blind: blind flag
# blind_height: height of blind box
# blind_back: front extension
# blind_rail: distance of the rail
# ------------------------------------------------------------------------------
def create_leaf_window_frame(mywindow, mymesh, sx, sy, sz, frame, frame_l, leafratio, mat, matdata, external,
blind, blind_height, blind_back, blind_rail):
myvertex = []
myfaces = []
# ===========================================================================
# Main frame_L
# ===========================================================================
x = sx / 2
z = sz
y = sy * leafratio
gap = 0.01
size = sy - y - 0.001 # thickness of the leaf
myvertex.extend([(-x, 0, 0),
(-x, 0, z),
(x, 0, z),
(x, 0, 0),
(-x + frame_l, 0, frame_l),
(-x + frame_l, 0, z - frame_l),
(x - frame_l, 0, z - frame_l),
(x - frame_l, 0, frame_l),
(-x + frame_l, -y, frame_l),
(-x + frame_l, -y, z - frame_l),
(x - frame_l, -y, z - frame_l),
(x - frame_l, -y, frame_l),
(-x + frame_l - gap, -y, frame_l - gap),
(-x + frame_l - gap, -y, z - frame_l + gap),
(x - frame_l + gap, -y, z - frame_l + gap),
(x - frame_l + gap, -y, frame_l - gap),
(-x + frame_l - gap, -sy, frame_l - gap),
(-x + frame_l - gap, -sy, z - frame_l + gap),
(x - frame_l + gap, -sy, z - frame_l + gap),
(x - frame_l + gap, -sy, frame_l - gap),
(-x, -sy, 0),
(-x, -sy, z),
(x, -sy, z),
(x, -sy, 0)])
# Faces
myfaces.extend([(1, 5, 4, 0), (21, 1, 0, 20), (17, 21, 20, 16), (16, 12, 13, 17), (12, 8, 9, 13),
(5, 9, 8, 4), (3, 7, 6, 2), (23, 3, 2, 22), (19, 23, 22, 18), (15, 19, 18, 14),
(11, 15, 14, 10), (6, 7, 11, 10), (0, 3, 23, 20), (21, 22, 2, 1), (17, 13, 14, 18),
(21, 17, 18, 22), (13, 9, 10, 14), (8, 11, 7, 4), (8, 12, 15, 11), (4, 7, 3, 0),
(12, 16, 19, 15), (16, 20, 23, 19), (9, 5, 6, 10), (1, 2, 6, 5)])
v = len(myvertex)
# ===========================================================================
# External front covers
# ===========================================================================
if external:
thick = 0.002 # aluminum thickness
x = sx
gap = -0.001
sidem = frame
box = 0
if blind:
box = blind_height
myvertex.extend([((-x / 2) - sidem, -sy, sz + sidem + box),
((x / 2) + sidem, -sy, sz + sidem + box),
((-x / 2) - sidem, -sy, -sidem),
((x / 2) + sidem, -sy, -sidem),
((-x / 2) - gap, -sy, sz + gap + box),
((x / 2) + gap, -sy, sz + gap + box),
((-x / 2) - gap, -sy, -gap),
((x / 2) + gap, -sy, -gap)])
myvertex.extend([((-x / 2) - sidem, -sy - thick, sz + sidem + box),
((x / 2) + sidem, -sy - thick, sz + sidem + box),
((-x / 2) - sidem, -sy - thick, -sidem),
((x / 2) + sidem, -sy - thick, -sidem),
((-x / 2) - gap, -sy - thick, sz + gap + box),
((x / 2) + gap, -sy - thick, sz + gap + box),
((-x / 2) - gap, -sy - thick, -gap),
((x / 2) + gap, -sy - thick, -gap)])
myfaces.extend([(v + 3, v + 1, v + 9, v + 11), (v + 9, v + 8, v + 0, v + 1), (v + 1, v + 5, v + 4, v + 0),
(v + 3, v + 7, v + 5, v + 1), (v + 7, v + 3, v + 2, v + 6),
(v + 0, v + 4, v + 6, v + 2), (v + 9, v + 13, v + 12, v + 8), (v + 11, v + 15, v + 13, v + 9),
(v + 15, v + 11, v + 10, v + 14), (v + 8, v + 12, v + 14, v + 10),
(v + 11, v + 3, v + 2, v + 10), (v + 2, v + 10, v + 8, v + 0), (v + 14, v + 12, v + 4, v + 6),
(v + 7, v + 6, v + 14, v + 15), (v + 5, v + 13, v + 12, v + 4),
(v + 15, v + 7, v + 5, v + 13)])
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mywindow, matdata)
# --------------
# Blind Box
# --------------
if blind:
mybox = create_blind_box("Blind_box", sx, sy + blind_back + blind_rail, blind_height)
set_normals(mybox)
mybox.parent = mywindow
mybox.location.x = 0
mybox.location.y = -blind_back - sy
mybox.location.z = sz
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mybox, matdata)
# Lock
mybox.lock_location = (True, True, True)
mybox.lock_rotation = (True, True, True)
return size
# ------------------------------------------------------------------------------
# Create rail windows leaf
#
# objName: Name for the new object
# hand: Left or Right
# sX: Size in X axis
# sY: Size in Y axis
# sZ: Size in Z axis
# f: size of the frame_L
# pX: position X axis
# pY: position Y axis
# pZ: position Z axis
# mat: Flag for creating materials
# matdata: default material
# handle: create handle flag
# ------------------------------------------------------------------------------
def create_rail_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matdata, handle):
myvertex = []
myfaces = []
v = 0
# ===========================================================================
# Horizontal pieces
# ===========================================================================
rail = 0.010 # rail width
t = sy - 0.002
p = ((t - rail) / 2) - 0.002
side = 0.02 # vertical rail
x = sx
z = sz
fz = f
if hand == "R":
x *= -1
f *= -1
# ------------------------
# frame
# ------------------------
myvertex.extend([(0, 0, 0),
(0, 0, z),
(x, 0, z),
(x, 0, 0),
(f, 0, fz),
(f, 0, z - fz),
(x - f, 0, z - fz),
(x - f, 0, fz),
(f, -t / 2, fz),
(f, -t / 2, z - fz),
(x - f, -t / 2, z - fz),
(x - f, -t / 2, fz),
(f, -t, fz),
(f, -t, z - fz),
(x - f, -t, z - fz),
(x - f, -t, fz),
(0, -t, 0),
(0, -t, z),
(x, -t, z),
(x, -t, 0)])
# ------------------------
# Side rails
# ------------------------
for z in (0, sz):
myvertex.extend([(0, -p, z),
(x, -p, z),
(0, -p, z + side),
(x, -p, z + side),
(0, -p - rail, z + side),
(x, -p - rail, z + side),
(0, -p - rail, z),
(x, -p - rail, z)])
side *= -1 # reverse
# Faces
myfaces.extend([(v + 10, v + 6, v + 7, v + 11), (v + 9, v + 8, v + 4, v + 5),
(v + 13, v + 12, v + 8, v + 9), (v + 14, v + 10, v + 11, v + 15),
(v + 6, v + 10, v + 9, v + 5),
(v + 9, v + 10, v + 14, v + 13), (v + 11, v + 7, v + 4, v + 8), (v + 12, v + 15, v + 11, v + 8),
(v + 3, v + 7, v + 6, v + 2),
(v + 5, v + 4, v + 0, v + 1),
(v + 4, v + 7, v + 3, v + 0), (v + 5, v + 1, v + 2, v + 6), (v + 17, v + 16, v + 12, v + 13),
(v + 15, v + 19, v + 18, v + 14),
(v + 15, v + 12, v + 16, v + 19),
(v + 14, v + 18, v + 17, v + 13), (v + 29, v + 2, v + 1, v + 28),
(v + 35, v + 34, v + 17, v + 18), (v + 35, v + 33, v + 32, v + 34),
(v + 31, v + 29, v + 28, v + 30),
(v + 33, v + 31, v + 30, v + 32), (v + 25, v + 24, v + 22, v + 23),
(v + 19, v + 16, v + 26, v + 27),
(v + 3, v + 21, v + 20, v + 0), (v + 25, v + 27, v + 26, v + 24),
(v + 23, v + 22, v + 20, v + 21), (v + 3, v + 2, v + 29, v + 21),
(v + 19, v + 27, v + 35, v + 18),
(v + 31, v + 33, v + 25, v + 23), (v + 32, v + 30, v + 22, v + 24),
(v + 16, v + 17, v + 34, v + 26), (v + 0, v + 20, v + 28, v + 1)])
# Glass
myfaces.extend([(v + 10, v + 9, v + 8, v + 11)])
v = len(myvertex)
# Faces (last glass)
# ------------------------
# Plastic parts
# ------------------------
ps = -0.004
gap = -0.0002
space = 0.005
if hand == "R":
ps *= -1
gap *= -1
for z in (0, sz):
for x in (0, sx):
if hand == "R":
x *= -1
myvertex.extend([(x + gap, -p, z),
(x + ps, -p, z),
(x + gap, -p, z + side),
(x + ps, -p, z + side),
(x + gap, -p - rail, z + side),
(x + ps, -p - rail, z + side),
(x + gap, -p - rail, z),
(x + ps, -p - rail, z),
(x + gap, -p + rail - space, z),
(x + gap, -p - rail - space, z),
(x + gap, -p + rail - space, z + (side * 1.5)),
(x + gap, -p - rail - space, z + (side * 1.5)),
(x + ps, -p + rail - space, z),
(x + ps, -p - rail - space, z),
(x + ps, -p + rail - space, z + (side * 1.5)),
(x + ps, -p - rail - space, z + (side * 1.5))])
myfaces.extend([(v + 12, v + 8, v + 10, v + 14), (v + 6, v + 7, v + 5, v + 4), (v + 1, v + 0, v + 2, v + 3),
(v + 5, v + 3, v + 2, v + 4), (v + 8, v + 12, v + 1, v + 0),
(v + 7, v + 6, v + 9, v + 13), (v + 13, v + 9, v + 11, v + 15),
(v + 14, v + 10, v + 11, v + 15),
(v + 10, v + 8, v + 0, v + 2, v + 4, v + 6, v + 9, v + 11),
(v + 12, v + 14, v + 15, v + 13, v + 7, v + 5, v + 3, v + 1)])
v = len(myvertex)
ps *= -1
gap *= -1
side *= -1 # reverse vertical
mymesh = bpy.data.meshes.new(objname)
mywindow = bpy.data.objects.new(objname, mymesh)
mywindow.location[0] = px
mywindow.location[1] = py
mywindow.location[2] = pz
bpy.context.collection.objects.link(mywindow)
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
set_normals(mywindow)
# Lock transformation
mywindow.lock_location = (False, True, True) # only X axis
mywindow.lock_rotation = (True, True, True)
# Handle
if handle:
myhandle = create_rail_handle("Handle", mat)
myhandle.parent = mywindow
if hand == "R":
myhandle.location.x = -0.035
else:
myhandle.location.x = +0.035
myhandle.location.y = -sy + 0.001
if sz / 2 <= 1:
myhandle.location.z = sz / 2
else:
myhandle.location.z = 1
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mywindow, matdata)
# Glass
glass = create_glass_material("Glass_material", False)
mywindow.data.materials.append(glass)
select_faces(mywindow, 32, True)
set_material_faces(mywindow, 1)
return mywindow
# ------------------------------------------------------------------------------
# Create leaf windows leaf
#
# objName: Name for the new object
# hand: Left or Right
# sX: Size in X axis
# sY: Size in Y axis
# sZ: Size in Z axis
# f: size of the frame_L
# pX: position X axis
# pY: position Y axis
# pZ: position Z axis
# mat: Flag for creating materials
# matdata: default material
# handle: include handle
# ------------------------------------------------------------------------------
def create_leaf_window_leaf(objname, hand, sx, sy, sz, f, px, py, pz, mat, matdata, handle):
myvertex = []
myfaces = []
x = sx
z = sz
fz = f
t = sy
if hand == "R":
x *= -1
f *= -1
# ------------------------
# frame
# ------------------------
myvertex.extend([(0, 0, 0),
(0, 0, z),
(x, 0, z),
(x, 0, 0),
(f, 0, fz),
(f, 0, z - fz),
(x - f, 0, z - fz),
(x - f, 0, fz),
(f, t / 2, fz),
(f, t / 2, z - fz),
(x - f, t / 2, z - fz),
(x - f, t / 2, fz),
(f, t, fz),
(f, t, z - fz),
(x - f, t, z - fz),
(x - f, t, fz),
(0, t, 0),
(0, t, z),
(x, t, z),
(x, t, 0)])
# Faces
myfaces.extend([(13, 14, 10, 9), (10, 6, 5, 9), (11, 7, 4, 8), (12, 15, 11, 8), (13, 9, 8, 12),
(9, 5, 4, 8), (10, 14, 15, 11), (6, 10, 11, 7), (19, 3, 2, 18), (17, 1, 0, 16),
(2, 1, 17, 18), (19, 16, 0, 3), (13, 17, 18, 14), (15, 14, 18, 19), (13, 12, 16, 17),
(12, 16, 19, 15), (6, 7, 3, 2), (4, 5, 1, 0), (5, 6, 2, 1), (4, 7, 3, 0),
(10, 9, 8, 11)])
mymesh = bpy.data.meshes.new(objname)
mywindow = bpy.data.objects.new(objname, mymesh)
mywindow.location[0] = px
mywindow.location[1] = py
mywindow.location[2] = pz
bpy.context.collection.objects.link(mywindow)
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
set_normals(mywindow)
# Lock transformation
mywindow.lock_location = (True, True, True)
mywindow.lock_rotation = (True, True, False)
if handle:
myhandle = create_leaf_handle("Handle", mat)
if hand == "L":
myhandle.rotation_euler = (0, pi, 0)
myhandle.parent = mywindow
if hand == "R":
myhandle.location.x = -sx + 0.025
else:
myhandle.location.x = sx - 0.025
myhandle.location.y = 0
if sz / 2 <= 1:
myhandle.location.z = sz / 2
else:
myhandle.location.z = 1
set_smooth(myhandle)
set_modifier_subsurf(myhandle)
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(mywindow, matdata)
# Glass
glass = create_glass_material("Glass_material", False)
mywindow.data.materials.append(glass)
select_faces(mywindow, 20, True)
set_material_faces(mywindow, 1)
return mywindow
# ------------------------------------------------------------
# Generate Leaf handle
#
# objName: Object name
# mat: create materials
# ------------------------------------------------------------
def create_leaf_handle(objname, mat):
# ------------------------------------
# Mesh data
# ------------------------------------
minx = -0.018522918224334717
maxx = 0.10613098740577698
miny = -0.04866280406713486
maxy = 0.0002815350890159607
minz = -0.06269633769989014
maxz = 0.06289216876029968
# Vertex
myvertex = [(minx + 0.00752672553062439, maxy - 0.0176689475774765, minz + 0.0503292977809906),
(minx + 0.002989441156387329, maxy - 0.017728276550769806, minz + 0.057490378618240356),
(minx + 0.002640664577484131, maxy - 0.01777590811252594, maxz - 0.05962774157524109),
(minx + 0.006573766469955444, maxy - 0.017799079418182373, maxz - 0.05211767554283142),
(minx + 0.013735026121139526, maxy - 0.01779157668352127, maxz - 0.04758024215698242),
(minx + 0.0222054123878479, maxy - 0.017755411565303802, maxz - 0.04723122715950012),
(minx + 0.02971544861793518, maxy - 0.01770026981830597, maxz - 0.0511641800403595),
(minx + 0.03425273299217224, maxy - 0.017640933394432068, maxz - 0.058325231075286865),
(minx + 0.03460153937339783, maxy - 0.01759330928325653, minz + 0.05879288911819458),
(minx + 0.03066837787628174, maxy - 0.017570137977600098, minz + 0.051282793283462524),
(minx + 0.02350717782974243, maxy - 0.017577648162841797, minz + 0.046745359897613525),
(minx + 0.01503676176071167, maxy - 0.017613813281059265, minz + 0.046396344900131226),
(minx + 0.007489442825317383, maxy - 0.009374044835567474, minz + 0.05037441849708557),
(minx + 0.00295218825340271, maxy - 0.009433373808860779, minz + 0.05753546953201294),
(minx + 0.0026033520698547363, maxy - 0.009481005370616913, maxz - 0.05958262085914612),
(minx + 0.006536513566970825, maxy - 0.009206198155879974, maxz - 0.05207255482673645),
(minx + 0.013697713613510132, maxy - 0.009206198155879974, maxz - 0.04753512144088745),
(minx + 0.029678165912628174, maxy - 0.009206198155879974, maxz - 0.051119059324264526),
(minx + 0.034215450286865234, maxy - 0.009206198155879974, maxz - 0.05828014016151428),
(minx + 0.03456425666809082, maxy - 0.009298399090766907, minz + 0.05883798003196716),
(minx + 0.03063112497329712, maxy - 0.00927523523569107, minz + 0.051327913999557495),
(minx + 0.023469924926757812, maxy - 0.009282737970352173, minz + 0.046790480613708496),
(minx + 0.014999479055404663, maxy - 0.009318903088569641, minz + 0.046441465616226196),
(minx + 0.009239286184310913, maxy - 0.017671361565589905, minz + 0.052188992500305176),
(minx + 0.00540238618850708, maxy - 0.017721541225910187, minz + 0.058244675397872925),
(minx + 0.005107402801513672, maxy - 0.017761819064617157, maxz - 0.06018096208572388),
(minx + 0.00843346118927002, maxy - 0.01778140664100647, maxz - 0.05383017659187317),
(minx + 0.014489203691482544, maxy - 0.017775066196918488, maxz - 0.049993157386779785),
(minx + 0.021652132272720337, maxy - 0.017744481563568115, maxz - 0.04969802498817444),
(minx + 0.028002887964248657, maxy - 0.01769784837961197, maxz - 0.053023844957351685),
(minx + 0.03183978796005249, maxy - 0.01764768362045288, maxz - 0.059079527854919434),
(minx + 0.03213474154472351, maxy - 0.01760740578174591, minz + 0.05934610962867737),
(minx + 0.02880874276161194, maxy - 0.017587818205356598, minz + 0.05299532413482666),
(minx + 0.02275294065475464, maxy - 0.01759415864944458, minz + 0.04915827512741089),
(minx + 0.015590071678161621, maxy - 0.017624743282794952, minz + 0.04886317253112793),
(minx + 0.004389584064483643, maxy - 0.0009383484721183777, minz + 0.05804264545440674),
(minx + 0.00849863886833191, maxy - 0.0009383484721183777, minz + 0.0515575110912323),
(minx + 0.00407370924949646, maxy - 0.0009383484721183777, maxz - 0.05987495183944702),
(minx + 0.007635623216629028, maxy - 0.0009383484721183777, maxz - 0.053073734045028687),
(minx + 0.014120936393737793, maxy - 0.0009383484721183777, maxz - 0.04896456003189087),
(minx + 0.021791845560073853, maxy - 0.0009383484721183777, maxz - 0.04864847660064697),
(minx + 0.0285930335521698, maxy - 0.0009383484721183777, maxz - 0.052210211753845215),
(minx + 0.03270205855369568, maxy - 0.0009383484721183777, maxz - 0.05869537591934204),
(minx + 0.03301793336868286, maxy - 0.0009383484721183777, minz + 0.05922222137451172),
(minx + 0.02945604920387268, maxy - 0.0009383484721183777, minz + 0.052421003580093384),
(minx + 0.022970736026763916, maxy - 0.0009383484721183777, minz + 0.048311829566955566),
(minx + 0.015299826860427856, maxy - 0.0009383484721183777, minz + 0.04799577593803406),
(minx + 0.009323716163635254, maxy - 0.012187294661998749, minz + 0.05233737826347351),
(minx + 0.0055314600467681885, maxy - 0.01223689317703247, minz + 0.05832257866859436),
(minx + 0.005239963531494141, maxy - 0.012276701629161835, maxz - 0.06018644571304321),
(minx + 0.008527249097824097, maxy - 0.012296058237552643, maxz - 0.05390956997871399),
(minx + 0.01451253890991211, maxy - 0.012289784848690033, maxz - 0.05011719465255737),
(minx + 0.02159211039543152, maxy - 0.012259557843208313, maxz - 0.04982548952102661),
(minx + 0.027868926525115967, maxy - 0.012213476002216339, maxz - 0.05311262607574463),
(minx + 0.03166118264198303, maxy - 0.012163884937763214, maxz - 0.05909779667854309),
(minx + 0.03195270895957947, maxy - 0.01212407648563385, minz + 0.059411197900772095),
(minx + 0.028665393590927124, maxy - 0.012104712426662445, minz + 0.05313432216644287),
(minx + 0.02268010377883911, maxy - 0.012110985815525055, minz + 0.049341946840286255),
(minx + 0.01560056209564209, maxy - 0.012141212821006775, minz + 0.04905024170875549),
(minx + 0.009444117546081543, miny + 0.009956002235412598, minz + 0.05219161510467529),
(minx + 0.005651921033859253, miny + 0.00990641862154007, minz + 0.05817681550979614),
(minx + 0.005360394716262817, miny + 0.009866602718830109, maxz - 0.06033217906951904),
(minx + 0.008647710084915161, miny + 0.009847238659858704, maxz - 0.05405530333518982),
(minx + 0.014632970094680786, miny + 0.009853512048721313, maxz - 0.0502629280090332),
(minx + 0.021712541580200195, miny + 0.00988374650478363, maxz - 0.04997122287750244),
(minx + 0.02798938751220703, miny + 0.009929820895195007, maxz - 0.05325835943222046),
(minx + 0.03178161382675171, miny + 0.00997941941022873, maxz - 0.05924355983734131),
(minx + 0.032073140144348145, miny + 0.010019220411777496, minz + 0.05926543474197388),
(minx + 0.02878585457801819, miny + 0.010038584470748901, minz + 0.05298855900764465),
(minx + 0.022800534963607788, miny + 0.010032311081886292, minz + 0.04919618368148804),
(minx + 0.015720993280410767, miny + 0.010002091526985168, minz + 0.04890450835227966),
(minx + 0.009488403797149658, miny + 0.0001087486743927002, minz + 0.05213809013366699),
(minx + 0.0056961774826049805, miny + 5.917251110076904e-05, minz + 0.058123260736465454),
(minx + 0.005404621362686157, miny + 1.9356608390808105e-05, maxz - 0.06038573384284973),
(minx + 0.008691936731338501, miny, maxz - 0.05410885810852051),
(minx + 0.014677256345748901, miny + 6.258487701416016e-06, maxz - 0.05031648278236389),
(minx + 0.021756768226623535, miny + 3.650784492492676e-05, maxz - 0.05002477765083313),
(minx + 0.02803361415863037, miny + 8.258223533630371e-05, maxz - 0.05331191420555115),
(minx + 0.031825870275497437, miny + 0.00013218075037002563, maxz - 0.05929708480834961),
(minx + 0.03211739659309387, miny + 0.00017196685075759888, minz + 0.059211909770965576),
(minx + 0.028830111026763916, miny + 0.00019133836030960083, minz + 0.052935004234313965),
(minx + 0.022844791412353516, miny + 0.0001850724220275879, minz + 0.04914262890815735),
(minx + 0.015765219926834106, miny + 0.00015483051538467407, minz + 0.04885092377662659),
(maxx - 0.010264694690704346, miny + 0.0024030879139900208, minz + 0.0574510395526886),
(maxx - 0.009389877319335938, miny + 0.0028769299387931824, minz + 0.05982285737991333),
(maxx - 0.00899556279182434, miny + 0.003135383129119873, maxz - 0.06170690059661865),
(maxx - 0.00918734073638916, miny + 0.003109179437160492, maxz - 0.0570487380027771),
(maxx - 0.009913921356201172, miny + 0.002805367112159729, maxz - 0.0530393123626709),
(maxx - 0.010980546474456787, miny + 0.002305328845977783, maxz - 0.0507529079914093),
(maxx - 0.011445850133895874, miny + 0.008283689618110657, minz + 0.05754268169403076),
(maxx - 0.010571062564849854, miny + 0.008757516741752625, minz + 0.059914469718933105),
(maxx - 0.01017671823501587, miny + 0.009015955030918121, maxz - 0.06161528825759888),
(maxx - 0.010368555784225464, miny + 0.008989766240119934, maxz - 0.056957095861434937),
(maxx - 0.011095106601715088, miny + 0.008685953915119171, maxz - 0.05294764041900635),
(maxx - 0.012161701917648315, miny + 0.008185915648937225, maxz - 0.050661295652389526),
(maxx - 0.0007557570934295654, miny + 0.019280850887298584, minz + 0.05762714147567749),
(maxx - 0.0026130378246307373, miny + 0.019916504621505737, minz + 0.05755424499511719),
(maxx - 0.00020641088485717773, miny + 0.020433299243450165, minz + 0.059989362955093384),
(maxx, miny + 0.021083541214466095, maxz - 0.06154590845108032),
(maxx - 0.00019183754920959473, miny + 0.021057337522506714, maxz - 0.05688774585723877),
(maxx - 0.0007305145263671875, miny + 0.020361721515655518, maxz - 0.05287277698516846),
(maxx - 0.0014716684818267822, miny + 0.019183076918125153, maxz - 0.05057680606842041),
(maxx - 0.0033288896083831787, miny + 0.0198187455534935, maxz - 0.0506497323513031),
(maxx - 0.0020636916160583496, miny + 0.021068952977657318, minz + 0.05991646647453308),
(maxx - 0.0018572509288787842, miny + 0.021719202399253845, maxz - 0.061618804931640625),
(maxx - 0.002049088478088379, miny + 0.021692998707294464, maxz - 0.05696064233779907),
(maxx - 0.002587735652923584, miny + 0.020997390151023865, maxz - 0.05294567346572876),
(minx + 0.018761008977890015, miny + 9.564310312271118e-05, minz + 0.062207311391830444),
(minx + 0.0222054123878479, maxy - 0.009206198155879974, maxz - 0.04723122715950012),
(minx, maxy - 0.009349517524242401, minz),
(minx, maxy, minz),
(minx + 0.03702586889266968, maxy, minz),
(minx + 0.03702586889266968, maxy - 0.009349517524242401, minz),
(minx, maxy - 0.009349517524242401, maxz),
(minx, maxy, maxz),
(minx + 0.03702586889266968, maxy, maxz),
(minx + 0.03702586889266968, maxy - 0.009349517524242401, maxz),
(minx, maxy - 0.009349517524242401, minz + 0.0038556158542633057),
(minx, maxy - 0.009349517524242401, maxz - 0.0038556158542633057),
(minx, maxy, maxz - 0.0038556158542633057),
(minx, maxy, minz + 0.0038556158542633057),
(minx + 0.03702586889266968, maxy, maxz - 0.0038556158542633057),
(minx + 0.03702586889266968, maxy, minz + 0.0038556158542633057),
(minx + 0.03702586889266968, maxy - 0.009349517524242401, maxz - 0.0038556158542633057),
(minx + 0.03702586889266968, maxy - 0.009349517524242401, minz + 0.0038556158542633057),
(minx, maxy, maxz),
(minx, maxy, minz),
(minx + 0.03702586889266968, maxy, maxz),
(minx + 0.03702586889266968, maxy, minz),
(minx, maxy, maxz - 0.0038556158542633057),
(minx, maxy, minz + 0.0038556158542633057),
(minx + 0.03702586889266968, maxy, maxz - 0.0038556158542633057),
(minx + 0.03702586889266968, maxy, minz + 0.0038556158542633057),
(minx + 0.00467991828918457, maxy, maxz),
(minx + 0.03234601020812988, maxy, maxz),
(minx + 0.03234601020812988, maxy, minz),
(minx + 0.00467991828918457, maxy, minz),
(minx + 0.03234601020812988, maxy - 0.009349517524242401, maxz),
(minx + 0.00467991828918457, maxy - 0.009349517524242401, maxz),
(minx + 0.00467991828918457, maxy - 0.009349517524242401, minz),
(minx + 0.03234601020812988, maxy - 0.009349517524242401, minz),
(minx + 0.03234601020812988, maxy, maxz - 0.0038556158542633057),
(minx + 0.00467991828918457, maxy, maxz - 0.0038556158542633057),
(minx + 0.03234601020812988, maxy, minz + 0.0038556158542633057),
(minx + 0.00467991828918457, maxy, minz + 0.0038556158542633057),
(minx + 0.00467991828918457, maxy - 0.009349517524242401, maxz - 0.0038556158542633057),
(minx + 0.03234601020812988, maxy - 0.009349517524242401, maxz - 0.0038556158542633057),
(minx + 0.00467991828918457, maxy - 0.009349517524242401, minz + 0.0038556158542633057),
(minx + 0.03234601020812988, maxy - 0.009349517524242401, minz + 0.0038556158542633057),
(minx + 0.00467991828918457, maxy, minz),
(minx + 0.03234601020812988, maxy, minz),
(minx + 0.03234601020812988, maxy, maxz),
(minx + 0.00467991828918457, maxy, maxz),
(minx + 0.01765689253807068, maxy - 0.008991599082946777, maxz - 0.00847548246383667),
(minx + 0.014916181564331055, maxy - 0.008991599082946777, maxz - 0.00961071252822876),
(minx + 0.013780921697616577, maxy - 0.008991606533527374, maxz - 0.012351423501968384),
(minx + 0.014916181564331055, maxy - 0.008991606533527374, maxz - 0.015092134475708008),
(minx + 0.01765689253807068, maxy - 0.008991606533527374, maxz - 0.016227364540100098),
(minx + 0.02039763331413269, maxy - 0.008991606533527374, maxz - 0.015092134475708008),
(minx + 0.021532833576202393, maxy - 0.008991606533527374, maxz - 0.012351423501968384),
(minx + 0.02039763331413269, maxy - 0.008991599082946777, maxz - 0.00961071252822876),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, maxz - 0.00847548246383667),
(minx + 0.014916181564331055, maxy - 0.0095299631357193, maxz - 0.00961071252822876),
(minx + 0.013780921697616577, maxy - 0.0095299631357193, maxz - 0.012351423501968384),
(minx + 0.014916181564331055, maxy - 0.0095299631357193, maxz - 0.015092134475708008),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, maxz - 0.016227364540100098),
(minx + 0.02039763331413269, maxy - 0.0095299631357193, maxz - 0.015092134475708008),
(minx + 0.021532833576202393, maxy - 0.0095299631357193, maxz - 0.012351423501968384),
(minx + 0.02039763331413269, maxy - 0.0095299631357193, maxz - 0.00961071252822876),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, maxz - 0.009734481573104858),
(minx + 0.0158064067363739, maxy - 0.0095299631357193, maxz - 0.010500967502593994),
(minx + 0.015039980411529541, maxy - 0.0095299631357193, maxz - 0.012351423501968384),
(minx + 0.0158064067363739, maxy - 0.0095299631357193, maxz - 0.014201879501342773),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, maxz - 0.014968395233154297),
(minx + 0.01950731873512268, maxy - 0.0095299631357193, maxz - 0.014201879501342773),
(minx + 0.020273834466934204, maxy - 0.0095299631357193, maxz - 0.012351423501968384),
(minx + 0.01950731873512268, maxy - 0.0095299631357193, maxz - 0.010500967502593994),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.009734481573104858),
(minx + 0.0158064067363739, maxy - 0.009312078356742859, maxz - 0.010500967502593994),
(minx + 0.015039980411529541, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.0158064067363739, maxy - 0.009312078356742859, maxz - 0.014201879501342773),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.014968395233154297),
(minx + 0.01950731873512268, maxy - 0.009312078356742859, maxz - 0.014201879501342773),
(minx + 0.020273834466934204, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.01950731873512268, maxy - 0.009312078356742859, maxz - 0.010500967502593994),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.01099047064781189),
(minx + 0.01669454574584961, maxy - 0.009312078356742859, maxz - 0.011389046907424927),
(minx + 0.016295909881591797, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.01669454574584961, maxy - 0.009312078356742859, maxz - 0.013313770294189453),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.013712406158447266),
(minx + 0.01861920952796936, maxy - 0.009312078356742859, maxz - 0.013313770294189453),
(minx + 0.019017815589904785, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.01861920952796936, maxy - 0.009312078356742859, maxz - 0.011389046907424927),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.011496275663375854),
(minx + 0.01705223321914673, maxy - 0.009312078356742859, maxz - 0.011746734380722046),
(minx + 0.01680171489715576, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.01705223321914673, maxy - 0.009312078356742859, maxz - 0.012956112623214722),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, maxz - 0.013206571340560913),
(minx + 0.018261581659317017, maxy - 0.009312078356742859, maxz - 0.012956112623214722),
(minx + 0.018512040376663208, maxy - 0.009312078356742859, maxz - 0.012351423501968384),
(minx + 0.018261581659317017, maxy - 0.009312078356742859, maxz - 0.011746734380722046),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.009734481573104858),
(minx + 0.0158064067363739, maxy - 0.009564712643623352, maxz - 0.010500967502593994),
(minx + 0.015039980411529541, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.0158064067363739, maxy - 0.009564712643623352, maxz - 0.014201879501342773),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.014968395233154297),
(minx + 0.01950731873512268, maxy - 0.009564712643623352, maxz - 0.014201879501342773),
(minx + 0.020273834466934204, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.01950731873512268, maxy - 0.009564712643623352, maxz - 0.010500967502593994),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.01099047064781189),
(minx + 0.01669454574584961, maxy - 0.009564712643623352, maxz - 0.011389046907424927),
(minx + 0.016295909881591797, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.01669454574584961, maxy - 0.009564712643623352, maxz - 0.013313770294189453),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.013712406158447266),
(minx + 0.01861920952796936, maxy - 0.009564712643623352, maxz - 0.013313770294189453),
(minx + 0.019017815589904785, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.01861920952796936, maxy - 0.009564712643623352, maxz - 0.011389046907424927),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.011496275663375854),
(minx + 0.01705223321914673, maxy - 0.009564712643623352, maxz - 0.011746734380722046),
(minx + 0.01680171489715576, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.01705223321914673, maxy - 0.009564712643623352, maxz - 0.012956112623214722),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, maxz - 0.013206571340560913),
(minx + 0.018261581659317017, maxy - 0.009564712643623352, maxz - 0.012956112623214722),
(minx + 0.018512040376663208, maxy - 0.009564712643623352, maxz - 0.012351423501968384),
(minx + 0.018261581659317017, maxy - 0.009564712643623352, maxz - 0.011746734380722046),
(minx + 0.01765689253807068, maxy - 0.008991599082946777, minz + 0.017180711030960083),
(minx + 0.014916181564331055, maxy - 0.008991599082946777, minz + 0.016045480966567993),
(minx + 0.013780921697616577, maxy - 0.008991606533527374, minz + 0.01330476999282837),
(minx + 0.014916181564331055, maxy - 0.008991606533527374, minz + 0.010564059019088745),
(minx + 0.01765689253807068, maxy - 0.008991606533527374, minz + 0.009428799152374268),
(minx + 0.02039763331413269, maxy - 0.008991606533527374, minz + 0.010564059019088745),
(minx + 0.021532833576202393, maxy - 0.008991606533527374, minz + 0.01330476999282837),
(minx + 0.02039763331413269, maxy - 0.008991599082946777, minz + 0.016045480966567993),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, minz + 0.017180711030960083),
(minx + 0.014916181564331055, maxy - 0.0095299631357193, minz + 0.016045480966567993),
(minx + 0.013780921697616577, maxy - 0.0095299631357193, minz + 0.01330476999282837),
(minx + 0.014916181564331055, maxy - 0.0095299631357193, minz + 0.010564059019088745),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, minz + 0.009428799152374268),
(minx + 0.02039763331413269, maxy - 0.0095299631357193, minz + 0.010564059019088745),
(minx + 0.021532833576202393, maxy - 0.0095299631357193, minz + 0.01330476999282837),
(minx + 0.02039763331413269, maxy - 0.0095299631357193, minz + 0.016045480966567993),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, minz + 0.015921711921691895),
(minx + 0.0158064067363739, maxy - 0.0095299631357193, minz + 0.015155225992202759),
(minx + 0.015039980411529541, maxy - 0.0095299631357193, minz + 0.01330476999282837),
(minx + 0.0158064067363739, maxy - 0.0095299631357193, minz + 0.01145431399345398),
(minx + 0.01765689253807068, maxy - 0.0095299631357193, minz + 0.010687828063964844),
(minx + 0.01950731873512268, maxy - 0.0095299631357193, minz + 0.01145431399345398),
(minx + 0.020273834466934204, maxy - 0.0095299631357193, minz + 0.01330476999282837),
(minx + 0.01950731873512268, maxy - 0.0095299631357193, minz + 0.015155225992202759),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.015921711921691895),
(minx + 0.0158064067363739, maxy - 0.009312078356742859, minz + 0.015155225992202759),
(minx + 0.015039980411529541, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.0158064067363739, maxy - 0.009312078356742859, minz + 0.01145431399345398),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.010687828063964844),
(minx + 0.01950731873512268, maxy - 0.009312078356742859, minz + 0.01145431399345398),
(minx + 0.020273834466934204, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.01950731873512268, maxy - 0.009312078356742859, minz + 0.015155225992202759),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.014665752649307251),
(minx + 0.01669454574584961, maxy - 0.009312078356742859, minz + 0.014267116785049438),
(minx + 0.016295909881591797, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.01669454574584961, maxy - 0.009312078356742859, minz + 0.012342393398284912),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.011943817138671875),
(minx + 0.01861920952796936, maxy - 0.009312078356742859, minz + 0.012342393398284912),
(minx + 0.019017815589904785, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.01861920952796936, maxy - 0.009312078356742859, minz + 0.014267116785049438),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.014159917831420898),
(minx + 0.01705223321914673, maxy - 0.009312078356742859, minz + 0.01390942931175232),
(minx + 0.01680171489715576, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.01705223321914673, maxy - 0.009312078356742859, minz + 0.012700080871582031),
(minx + 0.01765689253807068, maxy - 0.009312078356742859, minz + 0.012449592351913452),
(minx + 0.018261581659317017, maxy - 0.009312078356742859, minz + 0.012700080871582031),
(minx + 0.018512040376663208, maxy - 0.009312078356742859, minz + 0.01330476999282837),
(minx + 0.018261581659317017, maxy - 0.009312078356742859, minz + 0.01390942931175232),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.015921711921691895),
(minx + 0.0158064067363739, maxy - 0.009564712643623352, minz + 0.015155225992202759),
(minx + 0.015039980411529541, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.0158064067363739, maxy - 0.009564712643623352, minz + 0.01145431399345398),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.010687828063964844),
(minx + 0.01950731873512268, maxy - 0.009564712643623352, minz + 0.01145431399345398),
(minx + 0.020273834466934204, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.01950731873512268, maxy - 0.009564712643623352, minz + 0.015155225992202759),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.014665752649307251),
(minx + 0.01669454574584961, maxy - 0.009564712643623352, minz + 0.014267116785049438),
(minx + 0.016295909881591797, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.01669454574584961, maxy - 0.009564712643623352, minz + 0.012342393398284912),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.011943817138671875),
(minx + 0.01861920952796936, maxy - 0.009564712643623352, minz + 0.012342393398284912),
(minx + 0.019017815589904785, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.01861920952796936, maxy - 0.009564712643623352, minz + 0.014267116785049438),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.014159917831420898),
(minx + 0.01705223321914673, maxy - 0.009564712643623352, minz + 0.01390942931175232),
(minx + 0.01680171489715576, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.01705223321914673, maxy - 0.009564712643623352, minz + 0.012700080871582031),
(minx + 0.01765689253807068, maxy - 0.009564712643623352, minz + 0.012449592351913452),
(minx + 0.018261581659317017, maxy - 0.009564712643623352, minz + 0.012700080871582031),
(minx + 0.018512040376663208, maxy - 0.009564712643623352, minz + 0.01330476999282837),
(minx + 0.018261581659317017, maxy - 0.009564712643623352, minz + 0.01390942931175232)]
# Faces
myfaces = [(12, 0, 1, 13), (13, 1, 2, 14), (14, 2, 3, 15), (15, 3, 4, 16), (17, 6, 7, 18),
(18, 7, 8, 19), (19, 8, 9, 20), (20, 9, 10, 21), (21, 10, 11, 22), (22, 11, 0, 12),
(1, 0, 23, 24), (2, 1, 24, 25), (3, 2, 25, 26), (4, 3, 26, 27), (5, 4, 27, 28),
(6, 5, 28, 29), (7, 6, 29, 30), (8, 7, 30, 31), (9, 8, 31, 32), (10, 9, 32, 33),
(11, 10, 33, 34), (0, 11, 34, 23), (24, 23, 36, 35), (25, 24, 35, 37), (26, 25, 37, 38),
(27, 26, 38, 39), (28, 27, 39, 40), (29, 28, 40, 41), (30, 29, 41, 42), (31, 30, 42, 43),
(32, 31, 43, 44), (33, 32, 44, 45), (34, 33, 45, 46), (23, 34, 46, 36), (48, 47, 59, 60),
(49, 48, 60, 61), (50, 49, 61, 62), (51, 50, 62, 63), (52, 51, 63, 64), (53, 52, 64, 65),
(54, 53, 65, 66), (55, 54, 66, 67), (56, 55, 67, 68), (57, 56, 68, 69), (58, 57, 69, 70),
(59, 47, 58, 70), (60, 59, 71, 72), (61, 60, 72, 73), (62, 61, 73, 74), (63, 62, 74, 75),
(64, 63, 75, 76), (70, 69, 81, 82), (70, 82, 71, 59), (81, 69, 89, 83), (80, 81, 83, 84),
(79, 80, 84, 85), (78, 79, 85, 86), (77, 78, 86, 87), (76, 77, 87, 88), (64, 76, 88, 94),
(69, 68, 90, 89), (68, 67, 91, 90), (67, 66, 92, 91), (66, 65, 93, 92), (65, 64, 94, 93),
(83, 89, 96, 95), (84, 83, 95, 97), (85, 84, 97, 98), (86, 85, 98, 99), (87, 86, 99, 100),
(88, 87, 100, 101), (94, 88, 101, 102), (89, 90, 103, 96), (90, 91, 104, 103), (91, 92, 105, 104),
(92, 93, 106, 105), (93, 94, 102, 106), (100, 106, 102, 101), (99, 105, 106, 100), (98, 104, 105, 99),
(97, 103, 104, 98), (95, 96, 103, 97), (72, 71, 107), (73, 72, 107), (74, 73, 107),
(75, 74, 107), (76, 75, 107), (77, 76, 107), (78, 77, 107), (79, 78, 107),
(80, 79, 107), (81, 80, 107), (82, 81, 107), (71, 82, 107), (17, 108, 5, 6),
(5, 108, 16, 4), (130, 120, 110, 126), (143, 122, 111, 135), (132, 124, 112, 128), (147, 117, 109, 139),
(150, 135, 111, 128), (152, 133, 114, 125), (125, 114, 119, 129),
(129, 119, 120, 130), (134, 115, 121, 141),
(141, 121, 122, 143), (127, 116, 123, 131), (131, 123, 124, 132),
(138, 113, 118, 145), (145, 118, 117, 147),
(117, 130, 126, 109), (122, 132, 128, 111), (140, 150, 128, 112),
(138, 152, 125, 113), (113, 125, 129, 118),
(118, 129, 130, 117), (115, 127, 131, 121), (121, 131, 132, 122),
(120, 144, 136, 110), (144, 143, 135, 136),
(124, 148, 140, 112), (148, 147, 139, 140), (126, 110, 136, 149),
(149, 136, 135, 150), (127, 115, 134, 151),
(151, 134, 133, 152), (114, 133, 142, 119), (133, 134, 141, 142),
(119, 142, 144, 120), (142, 141, 143, 144),
(116, 137, 146, 123), (137, 138, 145, 146), (123, 146, 148, 124),
(146, 145, 147, 148), (109, 126, 149, 139),
(139, 149, 150, 140), (116, 127, 151, 137), (137, 151, 152, 138),
(153, 160, 168, 161), (160, 159, 167, 168),
(159, 158, 166, 167), (158, 157, 165, 166), (157, 156, 164, 165),
(156, 155, 163, 164), (155, 154, 162, 163),
(154, 153, 161, 162), (161, 168, 176, 169), (168, 167, 175, 176),
(167, 166, 174, 175), (166, 165, 173, 174),
(165, 164, 172, 173), (164, 163, 171, 172), (163, 162, 170, 171),
(162, 161, 169, 170), (169, 176, 184, 177),
(176, 175, 183, 184), (175, 174, 182, 183), (174, 173, 181, 182),
(173, 172, 180, 181), (172, 171, 179, 180),
(171, 170, 178, 179), (170, 169, 177, 178), (197, 189, 213, 221),
(184, 183, 191, 192), (196, 197, 221, 220),
(182, 181, 189, 190), (185, 177, 201, 209), (180, 179, 187, 188),
(195, 187, 211, 219), (178, 177, 185, 186),
(198, 199, 223, 222), (192, 191, 199, 200), (191, 183, 207, 215),
(190, 189, 197, 198), (200, 193, 217, 224),
(188, 187, 195, 196), (189, 181, 205, 213), (186, 185, 193, 194),
(194, 193, 200, 199, 198, 197, 196, 195),
(201, 208, 216, 209),
(207, 206, 214, 215), (205, 204, 212, 213), (203, 202, 210, 211),
(209, 216, 224, 217), (215, 214, 222, 223),
(213, 212, 220, 221), (211, 210, 218, 219), (194, 195, 219, 218),
(199, 191, 215, 223), (178, 186, 210, 202),
(193, 185, 209, 217), (177, 184, 208, 201), (180, 188, 212, 204),
(183, 182, 206, 207), (182, 190, 214, 206),
(186, 194, 218, 210), (181, 180, 204, 205), (184, 192, 216, 208),
(188, 196, 220, 212), (179, 178, 202, 203),
(190, 198, 222, 214), (192, 200, 224, 216), (187, 179, 203, 211),
(225, 232, 240, 233), (232, 231, 239, 240),
(231, 230, 238, 239), (230, 229, 237, 238), (229, 228, 236, 237),
(228, 227, 235, 236), (227, 226, 234, 235),
(226, 225, 233, 234), (233, 240, 248, 241), (240, 239, 247, 248),
(239, 238, 246, 247), (238, 237, 245, 246),
(237, 236, 244, 245), (236, 235, 243, 244), (235, 234, 242, 243),
(234, 233, 241, 242), (241, 248, 256, 249),
(248, 247, 255, 256), (247, 246, 254, 255), (246, 245, 253, 254),
(245, 244, 252, 253), (244, 243, 251, 252),
(243, 242, 250, 251), (242, 241, 249, 250), (269, 261, 285, 293),
(256, 255, 263, 264), (268, 269, 293, 292),
(254, 253, 261, 262), (257, 249, 273, 281), (252, 251, 259, 260),
(267, 259, 283, 291), (250, 249, 257, 258),
(270, 271, 295, 294), (264, 263, 271, 272), (263, 255, 279, 287),
(262, 261, 269, 270), (272, 265, 289, 296),
(260, 259, 267, 268), (261, 253, 277, 285), (258, 257, 265, 266),
(266, 265, 272, 271, 270, 269, 268, 267),
(273, 280, 288, 281),
(279, 278, 286, 287), (277, 276, 284, 285), (275, 274, 282, 283),
(281, 288, 296, 289), (287, 286, 294, 295),
(285, 284, 292, 293), (283, 282, 290, 291), (266, 267, 291, 290),
(271, 263, 287, 295), (250, 258, 282, 274),
(265, 257, 281, 289), (249, 256, 280, 273), (252, 260, 284, 276),
(255, 254, 278, 279), (254, 262, 286, 278),
(258, 266, 290, 282), (253, 252, 276, 277), (256, 264, 288, 280),
(260, 268, 292, 284), (251, 250, 274, 275),
(262, 270, 294, 286), (264, 272, 296, 288), (259, 251, 275, 283)]
mesh = bpy.data.meshes.new(objname)
myobject = bpy.data.objects.new(objname, mesh)
myobject.location = bpy.context.scene.cursor.location
bpy.context.collection.objects.link(myobject)
mesh.from_pydata(myvertex, [], myfaces)
mesh.update(calc_edges=True)
# Create materials
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
alumat = create_glossy_material("Handle_material", False, 0.733, 0.779, 0.8)
set_material(myobject, alumat)
return myobject
# ------------------------------------------------------------
# Generate rail handle
#
# objName: Object name
# mat: create materials
# ------------------------------------------------------------
def create_rail_handle(objname, mat):
# ------------------------------------
# Mesh data
# ------------------------------------
minx = -0.007970962673425674
maxx = 0.007971039041876793
miny = -0.0038057267665863037
maxy = 6.780028343200684e-07
minz = -0.07533407211303711
maxz = 0.05025443434715271
# Vertex
myvertex = [(minx, miny + 0.0009473562240600586, minz),
(minx, maxy, minz),
(maxx, maxy, minz),
(maxx, miny + 0.0009473562240600586, minz),
(minx, miny + 0.0009473562240600586, maxz),
(minx, maxy, maxz),
(maxx, maxy, maxz),
(maxx, miny + 0.0009473562240600586, maxz),
(minx, miny + 0.0009473562240600586, minz + 0.0038556158542633057),
(minx, miny + 0.0009473562240600586, maxz - 0.0038556158542633057),
(minx, maxy, minz + 0.0038556158542633057),
(maxx, miny + 0.0009473562240600586, maxz - 0.0038556158542633057),
(maxx, miny + 0.0009473562240600586, minz + 0.0038556158542633057),
(minx, maxy, maxz - 0.0038556158542633057),
(maxx, maxy, maxz - 0.0038556158542633057),
(maxx, maxy, minz + 0.0038556158542633057),
(maxx - 0.002014978788793087, maxy, maxz),
(minx + 0.0020150020718574524, maxy, minz),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, minz),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, minz),
(maxx - 0.002014978788793087, maxy, maxz - 0.0038556158542633057),
(minx + 0.0020150020718574524, maxy, maxz - 0.0038556158542633057),
(maxx - 0.002014978788793087, maxy, minz + 0.0038556158542633057),
(minx + 0.0020150020718574524, maxy, minz + 0.0038556158542633057),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.0038556158542633057),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.0038556158542633057),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, minz + 0.0038556158542633057),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, minz + 0.0038556158542633057),
(maxx - 0.002014978788793087, maxy, minz),
(minx + 0.0020150020718574524, maxy, maxz),
(minx + 0.007114947948139161, miny + 0.001102180453017354, maxz - 0.004768103361129761),
(minx + 0.0057074506767094135, miny + 0.001102180453017354, maxz - 0.005351103842258453),
(minx + 0.005124435992911458, miny + 0.001102176494896412, maxz - 0.006758600473403931),
(minx + 0.0057074506767094135, miny + 0.001102176494896412, maxz - 0.008166097104549408),
(minx + 0.007114947948139161, miny + 0.001102176494896412, maxz - 0.0087490975856781),
(maxx - 0.0074195414781570435, miny + 0.001102176494896412, maxz - 0.008166097104549408),
(maxx - 0.006836557062342763, miny + 0.001102176494896412, maxz - 0.006758600473403931),
(maxx - 0.0074195414781570435, miny + 0.001102180453017354, maxz - 0.005351103842258453),
(minx + 0.007114947948139161, miny + 0.0008257024455815554, maxz - 0.004768103361129761),
(minx + 0.0057074506767094135, miny + 0.0008257024455815554, maxz - 0.005351103842258453),
(minx + 0.005124435992911458, miny + 0.0008257024455815554, maxz - 0.006758600473403931),
(minx + 0.0057074506767094135, miny + 0.0008257024455815554, maxz - 0.008166097104549408),
(minx + 0.007114947948139161, miny + 0.0008257024455815554, maxz - 0.0087490975856781),
(maxx - 0.0074195414781570435, miny + 0.0008257024455815554, maxz - 0.008166097104549408),
(maxx - 0.006836557062342763, miny + 0.0008257024455815554, maxz - 0.006758600473403931),
(maxx - 0.0074195414781570435, miny + 0.0008257024455815554, maxz - 0.005351103842258453),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.0054146647453308105),
(minx + 0.006164627615362406, miny + 0.000937597593292594, maxz - 0.00580829381942749),
(minx + 0.0057710278779268265, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(minx + 0.006164627615362406, miny + 0.000937597593292594, maxz - 0.007708907127380371),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.008102551102638245),
(maxx - 0.007876764051616192, miny + 0.000937597593292594, maxz - 0.007708907127380371),
(maxx - 0.007483118446543813, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(maxx - 0.007876764051616192, miny + 0.000937597593292594, maxz - 0.00580829381942749),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.006059680134057999),
(minx + 0.006620732950977981, miny + 0.000937597593292594, maxz - 0.006264369934797287),
(minx + 0.006416012765839696, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(minx + 0.006620732950977981, miny + 0.000937597593292594, maxz - 0.0072528161108493805),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.0074575357139110565),
(minx + 0.0076091475784778595, miny + 0.000937597593292594, maxz - 0.0072528161108493805),
(minx + 0.007813852455001324, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(minx + 0.0076091475784778595, miny + 0.000937597593292594, maxz - 0.006264369934797287),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.006319437175989151),
(minx + 0.006804424105212092, miny + 0.000937597593292594, maxz - 0.0064480602741241455),
(minx + 0.00667576992418617, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(minx + 0.006804424105212092, miny + 0.000937597593292594, maxz - 0.007069140672683716),
(minx + 0.007114947948139161, miny + 0.000937597593292594, maxz - 0.00719776377081871),
(minx + 0.0074254871578887105, miny + 0.000937597593292594, maxz - 0.007069140672683716),
(minx + 0.007554110663477331, miny + 0.000937597593292594, maxz - 0.006758600473403931),
(minx + 0.0074254871578887105, miny + 0.000937597593292594, maxz - 0.0064480602741241455),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.0054146647453308105),
(minx + 0.006164627615362406, miny + 0.0008078569080680609, maxz - 0.00580829381942749),
(minx + 0.0057710278779268265, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(minx + 0.006164627615362406, miny + 0.0008078569080680609, maxz - 0.007708907127380371),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.008102551102638245),
(maxx - 0.007876764051616192, miny + 0.0008078569080680609, maxz - 0.007708907127380371),
(maxx - 0.007483118446543813, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(maxx - 0.007876764051616192, miny + 0.0008078569080680609, maxz - 0.00580829381942749),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.006059680134057999),
(minx + 0.006620732950977981, miny + 0.0008078569080680609, maxz - 0.006264369934797287),
(minx + 0.006416012765839696, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(minx + 0.006620732950977981, miny + 0.0008078569080680609, maxz - 0.0072528161108493805),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.0074575357139110565),
(minx + 0.0076091475784778595, miny + 0.0008078569080680609, maxz - 0.0072528161108493805),
(minx + 0.007813852455001324, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(minx + 0.0076091475784778595, miny + 0.0008078569080680609, maxz - 0.006264369934797287),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.006319437175989151),
(minx + 0.006804424105212092, miny + 0.0008078569080680609, maxz - 0.0064480602741241455),
(minx + 0.00667576992418617, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(minx + 0.006804424105212092, miny + 0.0008078569080680609, maxz - 0.007069140672683716),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, maxz - 0.00719776377081871),
(minx + 0.0074254871578887105, miny + 0.0008078569080680609, maxz - 0.007069140672683716),
(minx + 0.007554110663477331, miny + 0.0008078569080680609, maxz - 0.006758600473403931),
(minx + 0.0074254871578887105, miny + 0.0008078569080680609, maxz - 0.0064480602741241455),
(minx + 0.0074254871578887105, miny + 0.0008078569080680609, minz + 0.007765233516693115),
(minx + 0.007554110663477331, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(minx + 0.0074254871578887105, miny + 0.0008078569080680609, minz + 0.007144153118133545),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.007015526294708252),
(minx + 0.006804424105212092, miny + 0.0008078569080680609, minz + 0.007144153118133545),
(minx + 0.00667576992418617, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(minx + 0.006804424105212092, miny + 0.0008078569080680609, minz + 0.007765233516693115),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.007893860340118408),
(minx + 0.0076091475784778595, miny + 0.0008078569080680609, minz + 0.007948920130729675),
(minx + 0.007813852455001324, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(minx + 0.0076091475784778595, miny + 0.0008078569080680609, minz + 0.006960481405258179),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.006755754351615906),
(minx + 0.006620732950977981, miny + 0.0008078569080680609, minz + 0.006960481405258179),
(minx + 0.006416012765839696, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(minx + 0.006620732950977981, miny + 0.0008078569080680609, minz + 0.007948920130729675),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.00815361738204956),
(maxx - 0.007876764051616192, miny + 0.0008078569080680609, minz + 0.00840499997138977),
(maxx - 0.007483118446543813, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(maxx - 0.007876764051616192, miny + 0.0008078569080680609, minz + 0.00650438666343689),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.006110742688179016),
(minx + 0.006164627615362406, miny + 0.0008078569080680609, minz + 0.00650438666343689),
(minx + 0.0057710278779268265, miny + 0.0008078569080680609, minz + 0.00745469331741333),
(minx + 0.006164627615362406, miny + 0.0008078569080680609, minz + 0.00840499997138977),
(minx + 0.007114947948139161, miny + 0.0008078569080680609, minz + 0.00879862904548645),
(minx + 0.0074254871578887105, miny + 0.000937597593292594, minz + 0.007765233516693115),
(minx + 0.007554110663477331, miny + 0.000937597593292594, minz + 0.00745469331741333),
(minx + 0.0074254871578887105, miny + 0.000937597593292594, minz + 0.007144153118133545),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.007015526294708252),
(minx + 0.006804424105212092, miny + 0.000937597593292594, minz + 0.007144153118133545),
(minx + 0.00667576992418617, miny + 0.000937597593292594, minz + 0.00745469331741333),
(minx + 0.006804424105212092, miny + 0.000937597593292594, minz + 0.007765233516693115),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.007893860340118408),
(minx + 0.0076091475784778595, miny + 0.000937597593292594, minz + 0.007948920130729675),
(minx + 0.007813852455001324, miny + 0.000937597593292594, minz + 0.00745469331741333),
(minx + 0.0076091475784778595, miny + 0.000937597593292594, minz + 0.006960481405258179),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.006755754351615906),
(minx + 0.006620732950977981, miny + 0.000937597593292594, minz + 0.006960481405258179),
(minx + 0.006416012765839696, miny + 0.000937597593292594, minz + 0.00745469331741333),
(minx + 0.006620732950977981, miny + 0.000937597593292594, minz + 0.007948920130729675),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.00815361738204956),
(maxx - 0.007876764051616192, miny + 0.000937597593292594, minz + 0.00840499997138977),
(maxx - 0.007483118446543813, miny + 0.000937597593292594, minz + 0.00745469331741333),
(maxx - 0.007876764051616192, miny + 0.000937597593292594, minz + 0.00650438666343689),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.006110742688179016),
(minx + 0.006164627615362406, miny + 0.000937597593292594, minz + 0.00650438666343689),
(minx + 0.0057710278779268265, miny + 0.000937597593292594, minz + 0.00745469331741333),
(minx + 0.006164627615362406, miny + 0.000937597593292594, minz + 0.00840499997138977),
(minx + 0.007114947948139161, miny + 0.000937597593292594, minz + 0.00879862904548645),
(maxx - 0.0074195414781570435, miny + 0.0008257024455815554, minz + 0.008862189948558807),
(maxx - 0.006836557062342763, miny + 0.0008257024455815554, minz + 0.00745469331741333),
(maxx - 0.0074195414781570435, miny + 0.0008257024455815554, minz + 0.006047196686267853),
(minx + 0.007114947948139161, miny + 0.0008257024455815554, minz + 0.00546419620513916),
(minx + 0.0057074506767094135, miny + 0.0008257024455815554, minz + 0.006047196686267853),
(minx + 0.005124435992911458, miny + 0.0008257024455815554, minz + 0.00745469331741333),
(minx + 0.0057074506767094135, miny + 0.0008257024455815554, minz + 0.008862189948558807),
(minx + 0.007114947948139161, miny + 0.0008257024455815554, minz + 0.0094451904296875),
(maxx - 0.0074195414781570435, miny + 0.001102180453017354, minz + 0.008862189948558807),
(maxx - 0.006836557062342763, miny + 0.001102176494896412, minz + 0.00745469331741333),
(maxx - 0.0074195414781570435, miny + 0.001102176494896412, minz + 0.006047196686267853),
(minx + 0.007114947948139161, miny + 0.001102176494896412, minz + 0.00546419620513916),
(minx + 0.0057074506767094135, miny + 0.001102176494896412, minz + 0.006047196686267853),
(minx + 0.005124435992911458, miny + 0.001102176494896412, minz + 0.00745469331741333),
(minx + 0.0057074506767094135, miny + 0.001102180453017354, minz + 0.008862189948558807),
(minx + 0.007114947948139161, miny + 0.001102180453017354, minz + 0.0094451904296875),
(maxx - 0.002014978788793087, maxy, maxz - 0.015039850026369095),
(maxx - 0.002014978788793087, maxy, minz + 0.015039850026369095),
(minx, miny + 0.0009473562240600586, minz + 0.015039850026369095),
(minx, miny + 0.0009473562240600586, maxz - 0.015039850026369095),
(minx, maxy, minz + 0.015039850026369095),
(maxx, maxy, maxz - 0.015039850026369095),
(maxx, miny + 0.0009473562240600586, maxz - 0.015039850026369095),
(maxx, miny + 0.0009473562240600586, minz + 0.015039850026369095),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.015039850026369095),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, minz + 0.015039850026369095),
(minx + 0.0020150020718574524, maxy, maxz - 0.015039850026369095),
(minx + 0.0020150020718574524, maxy, minz + 0.015039850026369095),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.015039850026369095),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, minz + 0.015039850026369095),
(maxx, maxy, minz + 0.015039850026369095),
(minx, maxy, maxz - 0.015039850026369095),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, maxz - 0.015039850026369095),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, minz + 0.015039850026369095),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, maxz - 0.015039850026369095),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, minz + 0.015039850026369095),
(maxx - 0.002014978788793087, maxy, maxz - 0.020450454205274582),
(minx, miny + 0.0009473562240600586, maxz - 0.020450454205274582),
(minx, maxy, maxz - 0.020450454205274582),
(maxx, maxy, maxz - 0.020450454205274582),
(maxx, miny + 0.0009473562240600586, maxz - 0.020450454205274582),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.020450454205274582),
(minx + 0.0020150020718574524, maxy, maxz - 0.020450454205274582),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.020450454205274582),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, maxz - 0.020450454205274582),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, maxz - 0.020450454205274582),
(minx, miny + 0.0009473562240600586, maxz - 0.04870907962322235),
(maxx - 0.002014978788793087, maxy, maxz - 0.04870907962322235),
(minx, maxy, maxz - 0.04870907962322235),
(maxx, miny + 0.0009473562240600586, maxz - 0.04870907962322235),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.04870907962322235),
(minx + 0.0020150020718574524, maxy, maxz - 0.04870907962322235),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.04870907962322235),
(maxx, maxy, maxz - 0.04870907962322235),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, maxz - 0.04870907962322235),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, maxz - 0.04870907962322235),
(maxx - 0.0027115284465253353, miny + 0.0009342432022094727, maxz - 0.020450454205274582),
(minx + 0.0027115517295897007, miny + 0.0009342432022094727, maxz - 0.020450454205274582),
(maxx - 0.0027115284465253353, miny + 0.0009342432022094727, maxz - 0.04870907962322235),
(minx + 0.0027115517295897007, miny + 0.0009342432022094727, maxz - 0.04870907962322235),
(minx, miny + 0.0009473562240600586, maxz - 0.026037774980068207),
(maxx - 0.002014978788793087, maxy, maxz - 0.026037774980068207),
(minx, maxy, maxz - 0.026037774980068207),
(maxx, maxy, maxz - 0.026037774980068207),
(maxx, miny + 0.0009473562240600586, maxz - 0.026037774980068207),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.026037774980068207),
(minx + 0.0020150020718574524, maxy, maxz - 0.026037774980068207),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.026037774980068207),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, maxz - 0.026037774980068207),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, maxz - 0.026037774980068207),
(maxx - 0.0027115284465253353, miny + 0.0009342432022094727, maxz - 0.026037774980068207),
(minx + 0.0027115517295897007, miny + 0.0009342432022094727, maxz - 0.026037774980068207),
(minx, miny + 0.0009473562240600586, maxz - 0.03058292716741562),
(maxx - 0.002014978788793087, maxy, maxz - 0.03058292716741562),
(maxx, miny + 0.0009473562240600586, maxz - 0.03058292716741562),
(maxx - 0.002014978788793087, miny + 0.0009473562240600586, maxz - 0.03058292716741562),
(minx + 0.0020150020718574524, maxy, maxz - 0.03058292716741562),
(minx + 0.0020150020718574524, miny + 0.0009473562240600586, maxz - 0.03058292716741562),
(maxx, maxy, maxz - 0.03058292716741562),
(minx, maxy, maxz - 0.03058292716741562),
(maxx - 0.002014978788793087, maxy - 0.0017695352435112, maxz - 0.03058292716741562),
(minx + 0.0020150020718574524, maxy - 0.0017695352435112, maxz - 0.03058292716741562),
(maxx - 0.0027115284465253353, miny + 0.0009342432022094727, maxz - 0.03058292716741562),
(minx + 0.0027115517295897007, miny + 0.0009342432022094727, maxz - 0.03058292716741562),
(maxx - 0.004523299168795347, miny, maxz - 0.026820629835128784),
(minx + 0.004523322451859713, miny, maxz - 0.026820629835128784),
(maxx - 0.004523299168795347, miny, maxz - 0.02980007231235504),
(minx + 0.004523322451859713, miny, maxz - 0.02980007231235504)]
# Faces
myfaces = [(28, 8, 0, 20), (174, 167, 12, 15), (19, 4, 9, 26), (173, 162, 8, 28), (10, 25, 17, 1),
(12, 29, 21, 3), (29, 28, 20, 21), (164, 171, 25, 10), (171, 161, 24, 25), (7, 18, 27, 11),
(18, 19, 26, 27), (167, 169, 29, 12), (169, 173, 28, 29), (32, 40, 47, 39), (39, 47, 46, 38),
(38, 46, 45, 37), (37, 45, 44, 36), (36, 44, 43, 35), (35, 43, 42, 34), (34, 42, 41, 33),
(33, 41, 40, 32), (68, 92, 84, 60), (55, 63, 62, 54), (67, 91, 92, 68), (53, 61, 60, 52),
(56, 80, 72, 48), (51, 59, 58, 50), (66, 90, 82, 58), (49, 57, 56, 48), (69, 93, 94, 70),
(63, 71, 70, 62), (62, 86, 78, 54), (61, 69, 68, 60), (71, 95, 88, 64), (59, 67, 66, 58),
(60, 84, 76, 52), (57, 65, 64, 56), (65, 66, 67, 68, 69, 70, 71, 64), (72, 80, 87, 79), (78, 86, 85, 77),
(76, 84, 83, 75), (74, 82, 81, 73), (80, 88, 95, 87), (86, 94, 93, 85), (84, 92, 91, 83),
(82, 90, 89, 81), (65, 89, 90, 66), (70, 94, 86, 62), (49, 73, 81, 57), (64, 88, 80, 56),
(48, 55, 79, 72), (51, 75, 83, 59), (54, 53, 77, 78), (53, 77, 85, 61), (57, 81, 89, 65),
(52, 51, 75, 76), (55, 79, 87, 63), (59, 83, 91, 67), (50, 49, 73, 74), (61, 85, 93, 69),
(63, 87, 95, 71), (58, 82, 74, 50), (133, 109, 117, 141), (128, 104, 96, 120), (130, 106, 98, 122),
(141, 142, 118, 117), (132, 108, 100, 124), (136, 112, 104, 128), (139, 140, 116, 115),
(134, 110, 102, 126),
(138, 114, 106, 130), (137, 138, 114, 113), (140, 116, 108, 132), (143, 136, 112, 119),
(127, 103, 111, 135),
(142, 118, 110, 134), (121, 97, 105, 129), (126, 102, 101, 125), (109, 101, 102, 110),
(107, 99, 100, 108),
(105, 97, 98, 106), (111, 103, 96, 104), (117, 109, 110, 118), (115, 107, 108, 116),
(113, 105, 106, 114),
(119, 111, 104, 112), (126, 125, 124, 123, 122, 121, 120, 127), (134, 126, 127, 135),
(131, 107, 115, 139),
(132, 124, 125, 133),
(120, 96, 103, 127), (130, 122, 123, 131), (129, 105, 113, 137),
(128, 120, 121, 129), (122, 98, 97, 121),
(142, 134, 135, 143), (125, 101, 109, 133), (140, 132, 133, 141),
(135, 111, 119, 143), (138, 130, 131, 139),
(124, 100, 99, 123), (136, 128, 129, 137), (123, 99, 107, 131),
(158, 150, 151, 159), (157, 149, 150, 158),
(156, 148, 149, 157), (155, 147, 148, 156), (154, 146, 147, 155),
(153, 145, 146, 154), (152, 144, 145, 153),
(159, 151, 144, 152), (197, 193, 167, 174), (26, 9, 163, 172),
(196, 190, 162, 173), (9, 13, 175, 163),
(192, 195, 171, 164), (23, 22, 160, 170), (195, 191, 161, 171),
(11, 27, 168, 166), (193, 194, 169, 167),
(27, 26, 172, 168), (173, 169, 177, 179), (198, 199, 179, 177),
(168, 172, 178, 176), (196, 173, 179, 199),
(185, 168, 176, 188), (160, 165, 183, 180), (172, 163, 181, 187),
(170, 160, 180, 186), (166, 168, 185, 184),
(176, 178, 189, 188), (172, 187, 189, 178), (209, 185, 188, 212),
(222, 218, 193, 197), (221, 216, 190, 196),
(220, 217, 191, 195), (218, 219, 194, 193), (199, 198, 202, 203),
(221, 196, 199, 225), (169, 194, 198, 177),
(226, 227, 203, 202), (225, 199, 203, 227), (212, 188, 200, 214),
(188, 189, 201, 200), (219, 209, 212, 224),
(180, 183, 207, 205), (187, 181, 204, 211), (182, 186, 210, 206),
(186, 180, 205, 210), (184, 185, 209, 208),
(187, 211, 213, 189), (200, 201, 215, 214), (189, 213, 215, 201),
(224, 212, 214, 226), (211, 204, 216, 221),
(210, 205, 217, 220), (208, 209, 219, 218), (211, 221, 225, 213),
(227, 226, 230, 231), (213, 225, 227, 215),
(194, 219, 224, 198), (198, 224, 226, 202), (228, 229, 231, 230),
(215, 227, 231, 229), (226, 214, 228, 230),
(214, 215, 229, 228), (24, 15, 2, 30), (15, 12, 3, 2), (16, 6, 14, 22), (161, 174, 15, 24),
(6, 7, 11, 14), (8, 10, 1, 0), (21, 30, 2, 3), (19, 31, 5, 4), (4, 5, 13, 9),
(162, 164, 10, 8), (25, 24, 30, 17), (5, 31, 23, 13), (31, 16, 22, 23), (0, 1, 17, 20),
(20, 17, 30, 21), (7, 6, 16, 18), (18, 16, 31, 19), (40, 72, 79, 47), (47, 79, 78, 46),
(46, 78, 77, 45), (45, 77, 76, 44), (44, 76, 75, 43), (43, 75, 74, 42), (42, 74, 73, 41),
(41, 73, 72, 40), (79, 55, 54, 78), (77, 53, 52, 76), (75, 51, 50, 74), (73, 49, 48, 72),
(118, 142, 143, 119), (116, 140, 141, 117), (114, 138, 139, 115),
(112, 136, 137, 113), (150, 118, 119, 151),
(149, 117, 118, 150), (148, 116, 117, 149), (147, 115, 116, 148),
(146, 114, 115, 147), (145, 113, 114, 146),
(144, 112, 113, 145), (151, 119, 112, 144), (22, 14, 165, 160),
(191, 197, 174, 161), (14, 11, 166, 165),
(190, 192, 164, 162), (13, 23, 170, 175), (165, 166, 184, 183),
(163, 175, 182, 181), (175, 170, 186, 182),
(217, 222, 197, 191), (216, 223, 192, 190), (223, 220, 195, 192),
(183, 184, 208, 207), (181, 182, 206, 204),
(205, 207, 222, 217), (207, 208, 218, 222), (204, 206, 223, 216), (206, 210, 220, 223)]
mesh = bpy.data.meshes.new(objname)
myobject = bpy.data.objects.new(objname, mesh)
myobject.location = bpy.context.scene.cursor.location
bpy.context.collection.objects.link(myobject)
mesh.from_pydata(myvertex, [], myfaces)
mesh.update(calc_edges=True)
# Create materials
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
plastic = create_diffuse_material("Plastic_Handle_material", False, 0.01, 0.01, 0.01, 0.082, 0.079, 0.02, 0.01)
set_material(myobject, plastic)
return myobject
# ------------------------------------------------------------------------------
# Create rectangular sill
#
# objName: Object name
# x: size x axis
# y: size y axis
# z: size z axis
# mat: material flag
# ------------------------------------------------------------------------------
def create_sill(objname, x, y, z, mat):
myvertex = [(-x / 2, 0, 0.0),
(-x / 2, y, 0.0),
(x / 2, y, 0.0),
(x / 2, 0, 0.0),
(-x / 2, 0, -z),
(-x / 2, y, -z),
(x / 2, y, -z),
(x / 2, 0, -z)]
myfaces = [(0, 1, 2, 3), (0, 1, 5, 4), (1, 2, 6, 5), (2, 6, 7, 3), (5, 6, 7, 4), (0, 4, 7, 3)]
mesh = bpy.data.meshes.new(objname)
myobject = bpy.data.objects.new(objname, mesh)
myobject.location = bpy.context.scene.cursor.location
bpy.context.collection.objects.link(myobject)
mesh.from_pydata(myvertex, [], myfaces)
mesh.update(calc_edges=True)
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
mymat = create_diffuse_material("Sill_material", False, 0.8, 0.8, 0.8)
set_material(myobject, mymat)
return myobject
# ------------------------------------------------------------------------------
# Create blind box
#
# objName: Object name
# x: size x axis
# y: size y axis
# z: size z axis
# mat: material flag
# ------------------------------------------------------------------------------
def create_blind_box(objname, x, y, z):
myvertex = [(-x / 2, 0, 0.0),
(-x / 2, y, 0.0),
(x / 2, y, 0.0),
(x / 2, 0, 0.0),
(-x / 2, 0, z),
(-x / 2, y, z),
(x / 2, y, z),
(x / 2, 0, z)]
myfaces\
= [(0, 1, 2, 3), (0, 1, 5, 4), (1, 2, 6, 5), (2, 6, 7, 3), (5, 6, 7, 4), (0, 4, 7, 3)]
mesh = bpy.data.meshes.new(objname)
myobject = bpy.data.objects.new(objname, mesh)
myobject.location = bpy.context.scene.cursor.location
bpy.context.collection.objects.link(myobject)
mesh.from_pydata(myvertex, [], myfaces)
mesh.update(calc_edges=True)
return myobject
# ------------------------------------------------------------------------------
# Create blind rails
#
# objName: Name for the new object
# sX: Size in X axis
# sZ: Size in Z axis
# pX: position X axis
# pY: position Y axis
# pZ: position Z axis
# mat: Flag for creating materials
# matdata: Aluminum material
# blind_rail: distance of the rail
# ------------------------------------------------------------------------------
def create_blind_rail(objname, sx, sz, px, py, pz, mat, matdata, blind_rail):
myvertex = []
myfaces = []
sideb = 0.04
space = 0.012 # blind is 10 mm thick
thicka = 0.002 # aluminum thickness
thickb = 0.002 # aluminum thickness
for x in (-sx / 2, sx / 2):
for z in (0, sz):
myvertex.extend([(x, 0, z),
(x, blind_rail, z),
(x + sideb, blind_rail, z),
(x + sideb, blind_rail - thicka, z),
(x + thickb, blind_rail - thicka, z),
(x + thickb, blind_rail - thicka - space, z),
(x + sideb, blind_rail - thicka - space, z),
(x + sideb, blind_rail - thicka - space - thicka, z),
(x + thickb, blind_rail - thicka - space - thicka, z),
(x + thickb, 0, z)])
# reverse
thickb *= -1
sideb *= -1
# Faces
myfaces.extend([(31, 30, 20, 21), (32, 31, 21, 22), (33, 32, 22, 23), (37, 36, 26, 27), (35, 34, 24, 25),
(26, 36, 35, 25), (37, 27, 28, 38), (33, 23, 24, 34), (39, 38, 28, 29), (37, 38, 35, 36),
(31, 32, 33, 34), (31, 34, 39, 30), (21, 24, 23, 22), (27, 26, 25, 28), (21, 20, 29, 24),
(11, 1, 0, 10), (12, 2, 1, 11), (13, 14, 4, 3), (12, 13, 3, 2), (17, 7, 6, 16),
(16, 6, 5, 15), (14, 15, 5, 4), (17, 18, 8, 7), (19, 9, 8, 18), (17, 16, 15, 18),
(11, 14, 13, 12), (11, 10, 19, 14), (7, 8, 5, 6), (2, 3, 4, 1), (1, 4, 9, 0)])
mymesh = bpy.data.meshes.new(objname)
myblind = bpy.data.objects.new(objname, mymesh)
myblind.location[0] = px
myblind.location[1] = py
myblind.location[2] = pz
bpy.context.collection.objects.link(myblind)
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
set_material(myblind, matdata)
return myblind
# ------------------------------------------------------------------------------
# Create blind estructure
#
# objName: Name for the new object
# sX: Size in X axis
# sY: Size in Y axis
# sZ: Size in Z axis
# pX: position X axis
# pY: position Y axis
# pZ: position Z axis
# mat: Flag for creating materials
# blind_ratio: extension factor
# ------------------------------------------------------------------------------
def create_blind(objname, sx, sz, px, py, pz, mat, blind_ratio):
myvertex = []
myfaces = []
v = 0
h = 0.05
railgap = 0.005
# calculate total pieces
pieces = int((sz * (blind_ratio / 100)) / h)
if pieces * h < sz:
pieces += 1
z = h
for p in range(pieces):
for x in (-sx / 2, sx / 2):
myvertex.extend([(x, 0, z),
(x, 0, z + h - railgap),
(x, 0.002, z + h - railgap),
(x, 0.002, z + h),
(x, 0.008, z + h),
(x, 0.008, z + h - railgap),
(x, 0.01, z + h - railgap),
(x, 0.01, z)])
z -= h
# Faces
myfaces.extend([(v + 15, v + 7, v + 6, v + 14), (v + 7, v + 15, v + 8, v + 0),
(v + 9, v + 1, v + 0, v + 8),
(v + 10, v + 2, v + 1, v + 9), (v + 13, v + 14, v + 6, v + 5),
(v + 13, v + 5, v + 4, v + 12), (v + 10, v + 11, v + 3, v + 2),
(v + 4, v + 3, v + 11, v + 12)])
v = len(myvertex)
mymesh = bpy.data.meshes.new(objname)
myblind = bpy.data.objects.new(objname, mymesh)
myblind.location[0] = px
myblind.location[1] = py
myblind.location[2] = pz
bpy.context.collection.objects.link(myblind)
mymesh.from_pydata(myvertex, [], myfaces)
mymesh.update(calc_edges=True)
myblind.lock_location = (True, True, False) # only Z axis
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
mat = create_diffuse_material("Blind_plastic_material", False, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.15)
set_material(myblind, mat)
return myblind