1098 lines
51 KiB
Python
1098 lines
51 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# ----------------------------------------------------------
|
|
# Automatic generation of curtains
|
|
# Author: Antonio Vazquez (antonioya)
|
|
#
|
|
# ----------------------------------------------------------
|
|
# noinspection PyUnresolvedReferences
|
|
import bpy
|
|
from copy import copy
|
|
from math import cos, sin, radians
|
|
from bpy.types import Operator
|
|
from bpy.props import BoolProperty, IntProperty, FloatProperty
|
|
from .achm_tools import *
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
# Define UI class
|
|
# Japanese curtains
|
|
# ------------------------------------------------------------------
|
|
class ARCHIMESH_OT_Japan(Operator):
|
|
bl_idname = "mesh.archimesh_japan"
|
|
bl_label = "Japanese curtains"
|
|
bl_description = "Japanese curtains Generator"
|
|
bl_category = 'View'
|
|
bl_options = {'REGISTER', 'UNDO'}
|
|
|
|
width: FloatProperty(
|
|
name='Width',
|
|
min=0.30, max=4, default=1, precision=3,
|
|
description='Total width',
|
|
)
|
|
height: FloatProperty(
|
|
name='Height',
|
|
min=0.20, max=50, default=1.8, precision=3,
|
|
description='Total height',
|
|
)
|
|
num: IntProperty(
|
|
name='Rails',
|
|
min=2, max=5, default=2,
|
|
description='Number total of rails',
|
|
)
|
|
palnum: IntProperty(
|
|
name='Panels',
|
|
min=1, max=2, default=1,
|
|
description='Panels by rail',
|
|
)
|
|
|
|
open01: FloatProperty(
|
|
name='Position 01',
|
|
min=0, max=1, default=0, precision=3,
|
|
description='Position of the panel',
|
|
)
|
|
open02: FloatProperty(
|
|
name='Position 02',
|
|
min=0, max=1, default=0, precision=3,
|
|
description='Position of the panel',
|
|
)
|
|
open03: FloatProperty(
|
|
name='Position 03',
|
|
min=0, max=1, default=0, precision=3,
|
|
description='Position of the panel',
|
|
)
|
|
open04: FloatProperty(
|
|
name='Position 04',
|
|
min=0, max=1, default=0, precision=3,
|
|
description='Position of the panel',
|
|
)
|
|
open05: FloatProperty(
|
|
name='Position 05',
|
|
min=0, max=1, default=0, precision=3,
|
|
description='Position of the panel',
|
|
)
|
|
|
|
# Materials
|
|
crt_mat: BoolProperty(
|
|
name="Create default Cycles materials",
|
|
description="Create default materials for Cycles render",
|
|
default=True,
|
|
)
|
|
|
|
# -----------------------------------------------------
|
|
# Draw (create UI interface)
|
|
# -----------------------------------------------------
|
|
# noinspection PyUnusedLocal
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
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(self, 'width')
|
|
row.prop(self, 'height')
|
|
row = box.row()
|
|
row.prop(self, 'num')
|
|
row.prop(self, 'palnum')
|
|
|
|
if self.num >= 1:
|
|
row = box.row()
|
|
row.prop(self, 'open01', slider=True)
|
|
if self.num >= 2:
|
|
row = box.row()
|
|
row.prop(self, 'open02', slider=True)
|
|
if self.num >= 3:
|
|
row = box.row()
|
|
row.prop(self, 'open03', slider=True)
|
|
if self.num >= 4:
|
|
row = box.row()
|
|
row.prop(self, 'open04', slider=True)
|
|
if self.num >= 5:
|
|
row = box.row()
|
|
row.prop(self, 'open05', slider=True)
|
|
|
|
box = layout.box()
|
|
if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
box.enabled = False
|
|
box.prop(self, 'crt_mat')
|
|
if self.crt_mat:
|
|
box.label(text="* Remember to verify fabric texture folder")
|
|
else:
|
|
row = layout.row()
|
|
row.label(text="Warning: Operator does not work in local view mode", icon='ERROR')
|
|
|
|
# -----------------------------------------------------
|
|
# Execute
|
|
# -----------------------------------------------------
|
|
# noinspection PyUnusedLocal
|
|
def execute(self, context):
|
|
if bpy.context.mode == "OBJECT":
|
|
create_japan_mesh(self)
|
|
return {'FINISHED'}
|
|
else:
|
|
self.report({'WARNING'}, "Archimesh: Option only valid in Object mode")
|
|
return {'CANCELLED'}
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Generate mesh data
|
|
# All custom values are passed using self container (self.myvariable)
|
|
# ------------------------------------------------------------------------------
|
|
def create_japan_mesh(self):
|
|
# deactivate others
|
|
for o in bpy.data.objects:
|
|
if o.select_get() is True:
|
|
o.select_set(False)
|
|
bpy.ops.object.select_all(action='DESELECT')
|
|
# Create units
|
|
generate_japan(self)
|
|
|
|
return
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
# Define UI class
|
|
# Roller curtains
|
|
# ------------------------------------------------------------------
|
|
class ARCHIMESH_OT_Roller(Operator):
|
|
bl_idname = "mesh.archimesh_roller"
|
|
bl_label = "Roller curtains"
|
|
bl_description = "Roller_curtains Generator"
|
|
bl_category = 'View'
|
|
bl_options = {'REGISTER', 'UNDO'}
|
|
|
|
width: FloatProperty(
|
|
name='Width',
|
|
min=0.30, max=4, default=1, precision=3,
|
|
description='Total width',
|
|
)
|
|
height: FloatProperty(
|
|
name='Height',
|
|
min=0.01, max=50, default=1.7, precision=3,
|
|
description='Total height',
|
|
)
|
|
|
|
# Materials
|
|
crt_mat: BoolProperty(
|
|
name="Create default Cycles materials",
|
|
description="Create default materials for Cycles render",
|
|
default=True,
|
|
)
|
|
|
|
# -----------------------------------------------------
|
|
# Draw (create UI interface)
|
|
# -----------------------------------------------------
|
|
# noinspection PyUnusedLocal
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
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(self, 'width')
|
|
row.prop(self, 'height')
|
|
|
|
box = layout.box()
|
|
if not context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
box.enabled = False
|
|
box.prop(self, 'crt_mat')
|
|
if self.crt_mat:
|
|
box.label(text="* Remember to verify fabric texture folder")
|
|
else:
|
|
row = layout.row()
|
|
row.label(text="Warning: Operator does not work in local view mode", icon='ERROR')
|
|
|
|
# -----------------------------------------------------
|
|
# Execute
|
|
# -----------------------------------------------------
|
|
# noinspection PyUnusedLocal
|
|
def execute(self, context):
|
|
if bpy.context.mode == "OBJECT":
|
|
create_roller_mesh(self)
|
|
return {'FINISHED'}
|
|
else:
|
|
self.report({'WARNING'}, "Archimesh: Option only valid in Object mode")
|
|
return {'CANCELLED'}
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Generate mesh data
|
|
# All custom values are passed using self container (self.myvariable)
|
|
# ------------------------------------------------------------------------------
|
|
def create_roller_mesh(self):
|
|
# deactivate others
|
|
for o in bpy.data.objects:
|
|
if o.select_get() is True:
|
|
o.select_set(False)
|
|
bpy.ops.object.select_all(action='DESELECT')
|
|
generate_roller(self)
|
|
|
|
return
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Generate japanese curtains
|
|
# All custom values are passed using self container (self.myvariable)
|
|
# ------------------------------------------------------------------------------
|
|
def generate_japan(self):
|
|
support = []
|
|
panel = []
|
|
|
|
location = bpy.context.scene.cursor.location
|
|
myloc = copy(location) # copy location to keep 3D cursor position
|
|
|
|
# ------------------
|
|
# Rail
|
|
# ------------------
|
|
myrail = create_japan_rail("Rail",
|
|
self.width - 0.02, self.num,
|
|
myloc.x, myloc.y, myloc.z,
|
|
self.crt_mat)
|
|
# refine
|
|
remove_doubles(myrail)
|
|
set_normals(myrail)
|
|
|
|
# --------------------------------------------------------------------------------
|
|
# Supports
|
|
# --------------------------------------------------------------------------------
|
|
width = (self.width / self.num) / self.palnum
|
|
# left
|
|
posx = 0.01 + 0.01
|
|
posy = 0.006
|
|
posz = 0.006
|
|
for x in range(self.num):
|
|
mysup = create_japan_support("Support_" + str(x) + ".L",
|
|
width - 0.02, # subtract 2 cm
|
|
0, 0, 0,
|
|
self.crt_mat)
|
|
support.extend([mysup])
|
|
mysup.parent = myrail
|
|
|
|
if x == 0:
|
|
f = self.open01
|
|
if x == 1:
|
|
f = self.open02
|
|
if x == 2:
|
|
f = self.open03
|
|
if x == 3:
|
|
f = self.open04
|
|
if x == 4:
|
|
f = self.open05
|
|
|
|
if self.palnum == 1:
|
|
maxpos = ((self.width / self.palnum) - width - 0.02) * f
|
|
else:
|
|
maxpos = ((self.width / self.palnum) - width) * f
|
|
|
|
mysup.location.x = posx + maxpos
|
|
mysup.location.y = -posy
|
|
mysup.location.z = posz
|
|
|
|
posy += 0.015
|
|
# Right
|
|
if self.palnum > 1:
|
|
posx = self.width - width # + 0.01
|
|
posy = 0.006
|
|
posz = 0.006
|
|
for x in range(self.num):
|
|
mysup = create_japan_support("Support_" + str(x) + ".R",
|
|
width - 0.02, # subtract 2 cm
|
|
0, 0, 0,
|
|
self.crt_mat)
|
|
support.extend([mysup])
|
|
mysup.parent = myrail
|
|
|
|
if x == 0:
|
|
f = self.open01
|
|
if x == 1:
|
|
f = self.open02
|
|
if x == 2:
|
|
f = self.open03
|
|
if x == 3:
|
|
f = self.open04
|
|
if x == 4:
|
|
f = self.open05
|
|
|
|
maxpos = ((self.width / self.palnum) - width) * f
|
|
|
|
mysup.location.x = posx - maxpos
|
|
mysup.location.y = -posy
|
|
mysup.location.z = posz
|
|
|
|
posy += 0.015
|
|
# --------------------------------------------------------------------------------
|
|
# Panels
|
|
# --------------------------------------------------------------------------------
|
|
width = ((self.width / self.num) / self.palnum) + 0.01
|
|
posx = -0.01
|
|
posy = -0.006
|
|
posz = -0.008
|
|
x = 1
|
|
fabricmat = None
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
fabricmat = create_fabric_material("Fabric_material", False, 0.653, 0.485, 0.265,
|
|
0.653, 0.485, 0.265)
|
|
|
|
for sup in support:
|
|
mypanel = create_japan_panel("Panel_" + str(x),
|
|
width, self.height,
|
|
0, 0, 0,
|
|
self.crt_mat, fabricmat)
|
|
panel.extend([mypanel])
|
|
mypanel.parent = sup
|
|
mypanel.location.x = posx
|
|
mypanel.location.y = posy
|
|
mypanel.location.z = posz
|
|
x += 1
|
|
# ------------------------
|
|
# Strings
|
|
# ------------------------
|
|
x = myrail.location.x
|
|
y = myrail.location.y
|
|
z = myrail.location.z
|
|
|
|
long = -1
|
|
if self.height < 1:
|
|
long = -self.height
|
|
|
|
myp = [((0, 0, 0), (- 0.25, 0, 0), (0.0, 0, 0)),
|
|
((0, 0, long), (- 0.01, 0, long), (0.25, 0, long))] # double element
|
|
mycurve1 = create_bezier("String_1", myp, (x, y, z))
|
|
mycurve1.parent = myrail
|
|
mycurve1.location.x = self.width
|
|
mycurve1.location.y = -0.004
|
|
mycurve1.location.z = 0.005
|
|
|
|
mycurve2 = create_bezier("String_2", myp, (x, y, z))
|
|
mycurve2.parent = myrail
|
|
mycurve2.location.x = self.width
|
|
mycurve2.location.y = -0.01
|
|
mycurve2.location.z = 0.005
|
|
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
mat = create_diffuse_material("String_material", False, 0.1, 0.1, 0.1,
|
|
0.1, 0.1, 0.1, 0.01)
|
|
set_material(mycurve1, mat)
|
|
set_material(mycurve2, mat)
|
|
|
|
# refine
|
|
for obj in support:
|
|
remove_doubles(obj)
|
|
set_normals(obj)
|
|
|
|
# deactivate others
|
|
for o in bpy.data.objects:
|
|
if o.select_get() is True:
|
|
o.select_set(False)
|
|
|
|
myrail.select_set(True)
|
|
bpy.context.view_layer.objects.active = myrail
|
|
|
|
return
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create japan rail
|
|
#
|
|
# objName: Name for the new object
|
|
# sX: Size in X axis
|
|
# ways: Number of ways
|
|
# pX: position X axis
|
|
# pY: position Y axis
|
|
# pZ: position Z axis
|
|
# mat: Flag for creating materials
|
|
# ------------------------------------------------------------------------------
|
|
def create_japan_rail(objname, sx, ways, px, py, pz, mat):
|
|
myvertex = []
|
|
myfaces = []
|
|
|
|
waysize = 0.005 # gap
|
|
sz = 0.0145
|
|
size = 0.005
|
|
sizeint = 0.01
|
|
tap = 0.01
|
|
sy = (size * 2) + (waysize * ways) + (sizeint * (ways - 1))
|
|
v = 0
|
|
# left extension
|
|
myvertex.extend([(0, 0, 0), (0, 0, sz), (0, -sy, sz), (0, -sy, 0),
|
|
(tap, 0, 0), (tap, 0, sz), (tap, -sy, sz), (tap, -sy, 0)])
|
|
myfaces.extend([(0, 1, 2, 3), (4, 5, 6, 7), (0, 1, 5, 4), (3, 2, 6, 7), (2, 1, 5, 6), (3, 0, 4, 7)])
|
|
v += 8
|
|
# Center
|
|
myvertex.extend([(tap, -size, size), (tap, -size, 0), (tap, 0, 0), (tap, 0, sz), (tap, -sy, sz), (tap, -sy, 0),
|
|
(tap, -sy + size, 0), (tap, -sy + size, sz - 0.002)])
|
|
myvertex.extend([(sx + tap, -size, size), (sx + tap, -size, 0), (sx + tap, 0, 0),
|
|
(sx + tap, 0, sz), (sx + tap, -sy, sz),
|
|
(sx + tap, -sy, 0), (sx + tap, -sy + size, 0), (sx + tap, -sy + size, sz - 0.002)])
|
|
myfaces.extend([(v, v + 8, v + 9, v + 1), (v + 1, v + 9, v + 10, v + 2), (v + 2, v + 10, v + 11, v + 3),
|
|
(v + 3, v + 11, v + 12, v + 4),
|
|
(v + 4, v + 12, v + 13, v + 5), (v + 5, v + 13, v + 14, v + 6), (v + 7, v + 15, v + 14, v + 6)])
|
|
v += 16
|
|
# Right extension
|
|
myvertex.extend([(sx + tap, 0, 0), (sx + tap, 0, sz), (sx + tap, -sy, sz),
|
|
(sx + tap, -sy, 0), (sx + tap + tap, 0, 0),
|
|
(sx + tap + tap, 0, sz), (sx + tap + tap, -sy, sz), (sx + tap + tap, -sy, 0)])
|
|
myfaces.extend([(v, v + 1, v + 2, v + 3), (v + 4, v + 5, v + 6, v + 7),
|
|
(v, v + 1, v + 5, v + 4), (v + 3, v + 2, v + 6, v + 7),
|
|
(v + 2, v + 1, v + 5, v + 6), (v + 3, v, v + 4, v + 7)])
|
|
v += 8
|
|
|
|
# Internal
|
|
space = waysize + size
|
|
if ways > 1:
|
|
for x in range(ways - 1):
|
|
myvertex.extend([(tap, -space, sz), (tap, -space, 0), (tap, -space - sizeint, 0),
|
|
(tap, -space - sizeint, size)])
|
|
myvertex.extend([(sx + tap, -space, sz), (sx + tap, -space, 0), (sx + tap, -space - sizeint, 0),
|
|
(sx + tap, -space - sizeint, size)])
|
|
myfaces.extend([(v, v + 4, v + 5, v + 1), (v + 1, v + 5, v + 6, v + 2), (v + 2, v + 6, v + 7, v + 3)])
|
|
v += 8
|
|
space = space + waysize + sizeint
|
|
|
|
mymesh = bpy.data.meshes.new(objname)
|
|
myobject = bpy.data.objects.new(objname, mymesh)
|
|
|
|
myobject.location[0] = px
|
|
myobject.location[1] = py
|
|
myobject.location[2] = pz
|
|
bpy.context.collection.objects.link(myobject)
|
|
|
|
mymesh.from_pydata(myvertex, [], myfaces)
|
|
mymesh.update(calc_edges=True)
|
|
|
|
# ---------------------------------
|
|
# Materials
|
|
# ---------------------------------
|
|
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
# External
|
|
mat = create_diffuse_material(objname + "_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
|
|
set_material(myobject, mat)
|
|
|
|
return myobject
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create japan support
|
|
#
|
|
# objName: Name for the new object
|
|
# sX: Size in X axis
|
|
# pX: position X axis
|
|
# pY: position Y axis
|
|
# pZ: position Z axis
|
|
# mat: Flag for creating materials
|
|
# ------------------------------------------------------------------------------
|
|
def create_japan_support(objname, sx, px, py, pz, mat):
|
|
myvertex = []
|
|
myfaces = []
|
|
|
|
waysize = 0.008
|
|
sz = 0.015
|
|
sy = 0.006
|
|
|
|
myvertex.extend([(0, 0, 0), (0, 0, -sz), (0, -sy, -sz), (0, -sy, -waysize), (0, -0.003, -waysize), (0, -0.003, 0)])
|
|
myvertex.extend(
|
|
[(sx, 0, 0), (sx, 0, -sz), (sx, -sy, -sz), (sx, -sy, - waysize), (sx, -0.003, -waysize), (sx, -0.003, 0)])
|
|
myfaces.extend(
|
|
[(0, 1, 7, 6), (2, 3, 9, 8), (1, 7, 8, 2), (3, 4, 10, 9), (4, 5, 11, 10), (0, 6, 11, 5), (0, 1, 2, 3, 4, 5),
|
|
(6, 7, 8, 9, 10, 11)])
|
|
|
|
mymesh = bpy.data.meshes.new(objname)
|
|
myobject = bpy.data.objects.new(objname, mymesh)
|
|
|
|
myobject.location[0] = px
|
|
myobject.location[1] = py
|
|
myobject.location[2] = pz
|
|
bpy.context.collection.objects.link(myobject)
|
|
|
|
mymesh.from_pydata(myvertex, [], myfaces)
|
|
mymesh.update(calc_edges=True)
|
|
|
|
# ---------------------------------
|
|
# Materials
|
|
# ---------------------------------
|
|
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
# External
|
|
mat = create_diffuse_material(objname + "_material", False, 0.8, 0.8, 0.8, 0.6, 0.6, 0.6, 0.15)
|
|
set_material(myobject, mat)
|
|
|
|
return myobject
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create japan panel
|
|
#
|
|
# 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
|
|
# fabricMat: Fabric material
|
|
# ------------------------------------------------------------------------------
|
|
def create_japan_panel(objname, sx, sz, px, py, pz, mat, fabricmat):
|
|
myvertex = []
|
|
myfaces = []
|
|
|
|
myvertex.extend([(0, 0, 0), (0, 0, -sz), (sx, 0, -sz), (sx, 0, 0)])
|
|
myfaces.extend([(0, 1, 2, 3)])
|
|
|
|
mymesh = bpy.data.meshes.new(objname)
|
|
myobject = bpy.data.objects.new(objname, mymesh)
|
|
|
|
myobject.location[0] = px
|
|
myobject.location[1] = py
|
|
myobject.location[2] = pz
|
|
bpy.context.collection.objects.link(myobject)
|
|
|
|
mymesh.from_pydata(myvertex, [], myfaces)
|
|
mymesh.update(calc_edges=True)
|
|
|
|
# ---------------------------------
|
|
# Materials
|
|
# ---------------------------------
|
|
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
unwrap_mesh(myobject, True)
|
|
# remap UV to use all texture
|
|
for uv_loop in myobject.data.uv_layers.active.data:
|
|
myvector = uv_loop.uv
|
|
if myvector.x > 0.0001:
|
|
myvector.x = 1
|
|
|
|
set_material(myobject, fabricmat)
|
|
return myobject
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create bezier curve
|
|
# ------------------------------------------------------------------------------
|
|
def create_bezier(objname, points, origin, depth=0.001, fill='FULL'):
|
|
curvedata = bpy.data.curves.new(name=objname, type='CURVE')
|
|
curvedata.dimensions = '3D'
|
|
curvedata.fill_mode = fill
|
|
curvedata.bevel_resolution = 5
|
|
curvedata.bevel_depth = depth
|
|
|
|
myobject = bpy.data.objects.new(objname, curvedata)
|
|
myobject.location = origin
|
|
|
|
bpy.context.collection.objects.link(myobject)
|
|
|
|
polyline = curvedata.splines.new('BEZIER')
|
|
polyline.bezier_points.add(len(points) - 1)
|
|
|
|
for idx, (knot, h1, h2) in enumerate(points):
|
|
point = polyline.bezier_points[idx]
|
|
point.co = knot
|
|
point.handle_left = h1
|
|
point.handle_right = h2
|
|
point.handle_left_type = 'FREE'
|
|
point.handle_right_type = 'FREE'
|
|
|
|
return myobject
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Generate Roller curtains
|
|
# All custom values are passed using self container (self.myvariable)
|
|
# ------------------------------------------------------------------------------
|
|
def generate_roller(self):
|
|
location = bpy.context.scene.cursor.location
|
|
myloc = copy(location) # copy location to keep 3D cursor position
|
|
|
|
# ------------------
|
|
# Roller Top
|
|
# ------------------
|
|
fabricsolid = None
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
fabricsolid = create_diffuse_material("Fabric_solid_material", False, 0.653, 0.485, 0.265)
|
|
|
|
myroller = create_roller_rail("Roller",
|
|
self.width,
|
|
0.035,
|
|
myloc.x, myloc.y, myloc.z,
|
|
self.crt_mat, fabricsolid)
|
|
# refine
|
|
remove_doubles(myroller)
|
|
set_normals(myroller)
|
|
|
|
# --------------------------------------------------------------------------------
|
|
# Sides
|
|
# --------------------------------------------------------------------------------
|
|
plastic = None
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
plastic = create_diffuse_material("Plastic_roller_material", False, 0.653, 0.485, 0.265, 0.653, 0.485, 0.265,
|
|
0.2)
|
|
|
|
myside_l = create_roller_sides(myroller, "L",
|
|
0.026, 0, 0,
|
|
self.crt_mat, plastic)
|
|
# refine
|
|
remove_doubles(myside_l)
|
|
set_normals(myside_l)
|
|
|
|
myside_r = create_roller_sides(myroller, "R",
|
|
self.width - 0.026, 0, 0,
|
|
self.crt_mat, plastic)
|
|
# refine
|
|
remove_doubles(myside_r)
|
|
set_normals(myside_r)
|
|
|
|
# --------------------------------------------------------------------------------
|
|
# Panel
|
|
# --------------------------------------------------------------------------------
|
|
fabricmat = None
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
fabricmat = create_fabric_material("Fabric_translucent_material", False, 0.653, 0.485, 0.265, 0.653, 0.485,
|
|
0.265)
|
|
|
|
mypanel = create_japan_panel("Panel",
|
|
self.width, self.height,
|
|
0, 0, 0,
|
|
self.crt_mat, fabricmat)
|
|
mypanel.parent = myroller
|
|
mypanel.location.x = 0
|
|
mypanel.location.y = 0.035
|
|
mypanel.location.z = 0
|
|
# ------------------
|
|
# Roller Bottom
|
|
# ------------------
|
|
mybottom = create_roller_rail("Roller_bottom",
|
|
self.width,
|
|
0.001,
|
|
0, 0, -self.height,
|
|
self.crt_mat, plastic)
|
|
mybottom.parent = mypanel
|
|
# refine
|
|
remove_doubles(myroller)
|
|
set_normals(myroller)
|
|
|
|
# ------------------------
|
|
# Strings
|
|
# ------------------------
|
|
myp = [((0.0000, -0.0328, -0.0000), (0.0000, -0.0403, -0.3327), (0.0000, -0.0293, 0.1528)),
|
|
((0.0000, 0.0000, 0.3900), (0.0000, -0.0264, 0.3900), (-0.0000, 0.0226, 0.3900)),
|
|
((-0.0000, 0.0212, 0.0000), (-0.0000, 0.0189, 0.1525), (-0.0000, 0.0260, -0.3326)),
|
|
((-0.0000, -0.0000, -0.8518), (-0.0000, 0.0369, -0.8391), (0.0000, -0.0373, -0.8646))] # double element
|
|
mycurve = create_bezier("String", myp, (0, 0, 0))
|
|
set_curve_cycle(mycurve)
|
|
mycurve.parent = myroller
|
|
mycurve.location.x = self.width + 0.015
|
|
mycurve.location.y = 0
|
|
mycurve.location.z = -0.38
|
|
if self.crt_mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
mat = create_diffuse_material("String_material", False, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.01)
|
|
set_material(mycurve, mat)
|
|
|
|
# deactivate others
|
|
for o in bpy.data.objects:
|
|
if o.select_get() is True:
|
|
o.select_set(False)
|
|
|
|
myroller.select_set(True)
|
|
bpy.context.view_layer.objects.active = myroller
|
|
|
|
return
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create roller
|
|
#
|
|
# objName: Object name
|
|
# width: Total width of roller
|
|
# radio: Roll radio
|
|
# pX: position X axis
|
|
# pY: position Y axis
|
|
# pZ: position Z axis
|
|
# mat: create default cycles material
|
|
# mymaterial: plastic material or fabric
|
|
# ------------------------------------------------------------------------------
|
|
def create_roller_rail(objname, width, radio, px, py, pz, mat, mymaterial):
|
|
myvertex = []
|
|
myfaces = []
|
|
pies = 16
|
|
seg = 0
|
|
|
|
# Add right circle
|
|
for i in range(pies):
|
|
x = cos(radians(seg)) * radio
|
|
y = sin(radians(seg)) * radio
|
|
mypoint = [(0.0, x, y)]
|
|
myvertex.extend(mypoint)
|
|
seg += 360 / pies
|
|
# Add left circle
|
|
seg = 0
|
|
for i in range(pies):
|
|
x = cos(radians(seg)) * radio
|
|
y = sin(radians(seg)) * radio
|
|
mypoint = [(width, x, y)]
|
|
myvertex.extend(mypoint)
|
|
seg += 360 / pies
|
|
# -------------------------------------
|
|
# Faces
|
|
# -------------------------------------
|
|
t = 1
|
|
for n in range(0, pies):
|
|
t += 1
|
|
if t > pies:
|
|
t = 1
|
|
myface = [(n, n - pies + 1, n + 1, n + pies)]
|
|
myfaces.extend(myface)
|
|
else:
|
|
myface = [(n, n + 1, n + pies + 1, n + pies)]
|
|
myfaces.extend(myface)
|
|
|
|
mymesh = bpy.data.meshes.new(objname)
|
|
myroll = bpy.data.objects.new(objname, mymesh)
|
|
bpy.context.collection.objects.link(myroll)
|
|
|
|
mymesh.from_pydata(myvertex, [], myfaces)
|
|
mymesh.update(calc_edges=True)
|
|
# Position
|
|
myroll.location.x = px
|
|
myroll.location.y = py
|
|
myroll.location.z = pz
|
|
|
|
# Materials
|
|
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
set_material(myroll, mymaterial)
|
|
|
|
# Smooth
|
|
set_smooth(myroll)
|
|
|
|
return myroll
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create roller sides
|
|
#
|
|
# myRoller: Roller to add sides
|
|
# side: Side of the cap R/L
|
|
# pX: position X axis
|
|
# pY: position Y axis
|
|
# pZ: position Z axis
|
|
# mat: create default cycles material
|
|
# plastic: plastic material
|
|
# ------------------------------------------------------------------------------
|
|
def create_roller_sides(myroller, side, px, py, pz, mat, plastic):
|
|
# Retry mesh data
|
|
mydata = roller_side()
|
|
|
|
# move data
|
|
myvertex = mydata[0]
|
|
myfaces = mydata[1]
|
|
|
|
mymesh = bpy.data.meshes.new("Side." + side)
|
|
myside = bpy.data.objects.new("Side." + side, mymesh)
|
|
bpy.context.collection.objects.link(myside)
|
|
mymesh.from_pydata(myvertex, [], myfaces)
|
|
mymesh.update(calc_edges=True)
|
|
# Position
|
|
myside.location.x = px
|
|
myside.location.y = py
|
|
myside.location.z = pz
|
|
# rotate
|
|
if side == "L":
|
|
myside.rotation_euler = (0, 0, radians(180))
|
|
# parent
|
|
myside.parent = myroller
|
|
|
|
# Materials
|
|
if mat and bpy.context.scene.render.engine in {'CYCLES', 'BLENDER_EEVEE'}:
|
|
set_material(myside, plastic)
|
|
|
|
# Smooth
|
|
set_smooth(myside)
|
|
set_modifier_subsurf(myside)
|
|
|
|
return myside
|
|
|
|
|
|
# ----------------------------------------------
|
|
# Roller side data
|
|
# ----------------------------------------------
|
|
def roller_side():
|
|
# ------------------------------------
|
|
# Mesh data
|
|
# ------------------------------------
|
|
minx = -7.54842304218073e-08
|
|
maxx = 0.05209559202194214
|
|
miny = -0.04486268758773804
|
|
maxy = 0.04486268758773804
|
|
minz = -0.04486268758773804
|
|
maxz = 0.08202265202999115
|
|
|
|
# Vertex
|
|
myvertex = [(maxx - 0.004684023559093475, maxy, minz + 0.04486270064847542),
|
|
(maxx - 0.004684023559093475, maxy - 0.0034149661660194397, minz + 0.027694489806890488),
|
|
(maxx - 0.004684023559093475, maxy - 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx - 0.004684023559093475, maxy - 0.02769448049366474, minz + 0.0034149736166000366),
|
|
(maxx - 0.004684023559093475, miny + 0.044862685327428764, minz),
|
|
(maxx - 0.004684023559093475, miny + 0.027694476768374443, minz + 0.0034149736166000366),
|
|
(maxx - 0.004684023559093475, miny + 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx - 0.004684023559093475, miny + 0.0034149661660194397, minz + 0.02769448794424534),
|
|
(maxx - 0.004684023559093475, miny, minz + 0.04486269387439812),
|
|
(maxx - 0.004684023559093475, miny + 0.0034149624407291412, minz + 0.06203090213239193),
|
|
(maxx - 0.004684023559093475, miny + 0.013139966875314713, maxz - 0.050299935042858124),
|
|
(maxx - 0.004684023559093475, miny + 0.027694474905729294, maxz - 0.04057491198182106),
|
|
(maxx - 0.004684023559093475, maxy - 0.027694473043084145, maxz - 0.04057491570711136),
|
|
(maxx - 0.004684023559093475, maxy - 0.013139966875314713, maxz - 0.05029993876814842),
|
|
(maxx - 0.004684023559093475, maxy - 0.0034149587154388428, minz + 0.062030890956521034),
|
|
(maxx - 0.0046574510633945465, miny + 0.028278490528464317, minz + 0.0048249028623104095),
|
|
(maxx - 0.0046574510633945465, miny + 0.014219092205166817, minz + 0.014219097793102264),
|
|
(maxx - 0.0046574510633945465, miny + 0.004824899137020111, minz + 0.028278499841690063),
|
|
(maxx - 0.003122705966234207, maxy, minz + 0.04486270064847542),
|
|
(maxx - 0.003122705966234207, maxy - 0.0034149661660194397, minz + 0.027694489806890488),
|
|
(maxx - 0.003122705966234207, maxy - 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx - 0.003122705966234207, maxy - 0.02769448049366474, minz + 0.0034149736166000366),
|
|
(maxx - 0.003149278461933136, maxy - 0.04486268735455812, maxz - 0.03868604078888893),
|
|
(maxx - 0.003149278461933136, maxy - 0.02827848680317402, maxz - 0.04198484495282173),
|
|
(maxx - 0.003149278461933136, maxy - 0.014219081029295921, maxz - 0.05137905105948448),
|
|
(maxx - 0.003149278461933136, maxy - 0.004824887961149216, minz + 0.06144687905907631),
|
|
(maxx - 0.02118653617799282, miny + 0.027694474905729294, maxz - 0.04057491570711136),
|
|
(maxx - 0.02118653617799282, miny + 0.013139966875314713, maxz - 0.050299935042858124),
|
|
(maxx - 0.02118653617799282, miny + 0.0034149624407291412, minz + 0.06203090213239193),
|
|
(maxx - 0.02118653617799282, miny, minz + 0.04486269262849252),
|
|
(maxx - 0.003122705966234207, miny, minz + 0.04486269387439812),
|
|
(maxx - 0.003122705966234207, miny + 0.0034149624407291412, minz + 0.06203090213239193),
|
|
(maxx - 0.003122705966234207, miny + 0.013139966875314713, maxz - 0.050299935042858124),
|
|
(maxx - 0.003122705966234207, miny + 0.027694474905729294, maxz - 0.04057491198182106),
|
|
(maxx - 0.02118653617799282, maxy - 0.02769448049366474, minz + 0.0034149661660194397),
|
|
(maxx - 0.02118653617799282, maxy - 0.013139978051185608, minz + 0.013139981776475906),
|
|
(maxx - 0.02118653617799282, maxy - 0.0034149661660194397, minz + 0.02769448794424534),
|
|
(maxx - 0.02118653617799282, maxy, minz + 0.044862699402576034),
|
|
(maxx - 0.020517520606517792, miny + 0.01146744191646576, minz + 0.03102993033826351),
|
|
(maxx - 0.020517520606517792, miny + 0.01930307224392891, minz + 0.019303075969219208),
|
|
(maxx - 0.020517520606517792, miny + 0.031029919162392616, minz + 0.01146744191646576),
|
|
(maxx - 0.020517520606517792, miny + 0.04486268576937835, minz + 0.008715935051441193),
|
|
(maxx - 0.003122705966234207, maxy - 0.013139966875314713, maxz - 0.02605174481868744),
|
|
(maxx, miny + 0.013139966875314713, maxz - 0.026319395750761032),
|
|
(maxx, miny + 0.027694474905729294, maxz - 0.026230186223983765),
|
|
(maxx, maxy - 0.013139966875314713, maxz - 0.02605174481868744),
|
|
(maxx - 0.0046574510633945465, miny + 0.0015261024236679077, minz + 0.04486269394558251),
|
|
(maxx - 0.0046574510633945465, miny + 0.004824895411729813, minz + 0.061446888372302055),
|
|
(maxx - 0.0046574510633945465, miny + 0.014219081029295921, maxz - 0.05137904919683933),
|
|
(maxx - 0.0046574510633945465, miny + 0.02827848680317402, maxz - 0.04198484495282173),
|
|
(maxx, maxy - 0.027694473043084145, maxz - 0.026230186223983765),
|
|
(maxx, maxy - 0.04486268735205459, maxz - 0.02629481628537178),
|
|
(maxx - 0.003122705966234207, maxy - 0.027694473043084145, maxz - 0.04057491570711136),
|
|
(maxx - 0.003122705966234207, maxy - 0.013139966875314713, maxz - 0.05029993876814842),
|
|
(maxx - 0.003122705966234207, maxy - 0.0034149587154388428, minz + 0.062030890956521034),
|
|
(maxx - 0.003149278461933136, maxy - 0.0015261024236679077, minz + 0.044862700489230356),
|
|
(maxx - 0.003149278461933136, maxy - 0.004824899137020111, minz + 0.028278501704335213),
|
|
(maxx - 0.003149278461933136, maxy - 0.014219092205166817, minz + 0.014219097793102264),
|
|
(maxx - 0.003149278461933136, maxy - 0.028278492391109467, minz + 0.0048249028623104095),
|
|
(maxx - 0.003149278461933136, miny + 0.0015261024236679077, minz + 0.04486269394558251),
|
|
(maxx - 0.003149278461933136, miny + 0.004824895411729813, minz + 0.061446888372302055),
|
|
(maxx - 0.003149278461933136, miny + 0.014219081029295921, maxz - 0.05137904919683933),
|
|
(maxx - 0.003149278461933136, miny + 0.02827848680317402, maxz - 0.04198484495282173),
|
|
(maxx - 0.02118653617799282, maxy - 0.0034149587154388428, minz + 0.062030889093875885),
|
|
(maxx - 0.02118653617799282, maxy - 0.013139966875314713, maxz - 0.05029993876814842),
|
|
(maxx - 0.02118653617799282, maxy - 0.027694473043084145, maxz - 0.04057491570711136),
|
|
(maxx - 0.02118653617799282, maxy - 0.04486268735205459, maxz - 0.03715994209051132),
|
|
(maxx - 0.020517520606517792, maxy - 0.011467430740594864, minz + 0.058695447631180286),
|
|
(maxx - 0.020517520606517792, maxy - 0.019303061068058014, maxz - 0.05646303482353687),
|
|
(maxx - 0.020517520606517792, maxy - 0.031029915437102318, maxz - 0.04862739145755768),
|
|
(maxx - 0.020517520606517792, maxy - 0.044862687395027134, maxz - 0.045875877141952515),
|
|
(maxx, miny + 0.0034149661660194397, minz + 0.02769448794424534),
|
|
(maxx, miny + 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx, miny + 0.027694476768374443, minz + 0.0034149736166000366),
|
|
(maxx, miny + 0.044862685327428764, minz),
|
|
(maxx - 0.02118653617799282, miny + 0.0034149661660194397, minz + 0.02769448794424534),
|
|
(maxx - 0.02118653617799282, miny + 0.013139978051185608, minz + 0.013139981776475906),
|
|
(maxx - 0.02118653617799282, miny + 0.027694476768374443, minz + 0.0034149661660194397),
|
|
(maxx - 0.02118653617799282, miny + 0.044862685327428764, minz),
|
|
(maxx - 0.020517520606517792, maxy - 0.031029922887682915, minz + 0.01146744191646576),
|
|
(maxx - 0.020517520606517792, maxy - 0.01930307224392891, minz + 0.019303075969219208),
|
|
(maxx - 0.020517520606517792, maxy - 0.01146744191646576, minz + 0.03102993033826351),
|
|
(maxx - 0.020517520606517792, maxy - 0.008715927600860596, minz + 0.04486269835125789),
|
|
(maxx - 0.0046574510633945465, maxy - 0.04486268735455812, maxz - 0.03868604078888893),
|
|
(maxx - 0.0046574510633945465, maxy - 0.02827848680317402, maxz - 0.04198484495282173),
|
|
(maxx - 0.0046574510633945465, maxy - 0.014219081029295921, maxz - 0.05137905105948448),
|
|
(maxx - 0.0046574510633945465, maxy - 0.004824887961149216, minz + 0.06144687905907631),
|
|
(maxx - 0.0046574510633945465, maxy - 0.0015261024236679077, minz + 0.044862700489230356),
|
|
(maxx - 0.0046574510633945465, maxy - 0.004824899137020111, minz + 0.028278501704335213),
|
|
(maxx - 0.0046574510633945465, maxy - 0.014219092205166817, minz + 0.014219097793102264),
|
|
(maxx - 0.0046574510633945465, maxy - 0.028278492391109467, minz + 0.0048249028623104095),
|
|
(maxx - 0.003149278461933136, miny + 0.004824899137020111, minz + 0.028278499841690063),
|
|
(maxx - 0.003149278461933136, miny + 0.014219092205166817, minz + 0.014219097793102264),
|
|
(maxx - 0.003149278461933136, miny + 0.028278490528464317, minz + 0.0048249028623104095),
|
|
(maxx, miny, minz + 0.04486269387439812),
|
|
(maxx, miny + 0.0034149624407291412, minz + 0.06203090213239193),
|
|
(maxx, miny + 0.013139966875314713, maxz - 0.050299935042858124),
|
|
(maxx, miny + 0.027694474905729294, maxz - 0.04057491198182106),
|
|
(maxx - 0.020517520606517792, miny + 0.031029917299747467, maxz - 0.04862739145755768),
|
|
(maxx - 0.020517520606517792, miny + 0.019303061068058014, maxz - 0.056463029235601425),
|
|
(maxx - 0.020517520606517792, miny + 0.011467434465885162, minz + 0.05869545880705118),
|
|
(maxx - 0.020517520606517792, miny + 0.008715927600860596, minz + 0.04486269289324163),
|
|
(maxx - 0.003122705966234207, miny + 0.0034149661660194397, minz + 0.02769448794424534),
|
|
(maxx - 0.003122705966234207, miny + 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx - 0.003122705966234207, miny + 0.027694476768374443, minz + 0.0034149736166000366),
|
|
(maxx - 0.003122705966234207, miny + 0.044862685327428764, minz),
|
|
(maxx, maxy - 0.02769448049366474, minz + 0.0034149736166000366),
|
|
(maxx, maxy - 0.013139978051185608, minz + 0.013139985501766205),
|
|
(maxx, maxy - 0.0034149661660194397, minz + 0.027694489806890488),
|
|
(maxx, maxy, minz + 0.04486270064847542),
|
|
(maxx, maxy - 0.0034149587154388428, minz + 0.062030890956521034),
|
|
(maxx, maxy - 0.013139966875314713, maxz - 0.05029993876814842),
|
|
(maxx, maxy - 0.027694473043084145, maxz - 0.04057491570711136),
|
|
(maxx, maxy - 0.04486268735205459, maxz - 0.03715994209051132),
|
|
(maxx - 0.003122705966234207, maxy - 0.027694473043084145, maxz - 0.026230186223983765),
|
|
(maxx - 0.003122705966234207, maxy - 0.04486268735205459, maxz - 0.02629481628537178),
|
|
(maxx - 0.003122705966234207, miny + 0.027694474905729294, maxz - 0.026230186223983765),
|
|
(maxx - 0.003122705966234207, miny + 0.013139966875314713, maxz - 0.026319395750761032),
|
|
(maxx - 0.003122705966234207, miny + 0.013139966875314713, maxz - 0.0018796995282173157),
|
|
(maxx - 0.01466318964958191, miny + 0.013139966875314713, maxz - 0.0018796995282173157),
|
|
(maxx, miny + 0.027694474905729294, maxz - 0.0017904937267303467),
|
|
(maxx, maxy - 0.013139966875314713, maxz - 0.001612052321434021),
|
|
(maxx - 0.009187713265419006, maxy - 0.013139966875314713, maxz - 0.02605174481868744),
|
|
(maxx - 0.009187713265419006, maxy - 0.027694473043084145, maxz - 0.026230186223983765),
|
|
(maxx - 0.009187713265419006, maxy - 0.04486268735205459, maxz - 0.02629481628537178),
|
|
(maxx - 0.009187713265419006, miny + 0.027694474905729294, maxz - 0.026230186223983765),
|
|
(maxx - 0.009187713265419006, miny + 0.013139966875314713, maxz - 0.026319395750761032),
|
|
(maxx - 0.003122705966234207, maxy - 0.013139966875314713, maxz - 0.001612052321434021),
|
|
(maxx - 0.01466318964958191, miny + 0.027694474905729294, maxz - 0.0017904937267303467),
|
|
(maxx, miny + 0.022660084068775177, minz + 0.03566607739776373),
|
|
(maxx, miny + 0.02786955051124096, minz + 0.027869559824466705),
|
|
(maxx, miny + 0.03566606715321541, minz + 0.022660093382000923),
|
|
(maxx, miny + 0.04486268649608238, minz + 0.020830770954489708),
|
|
(maxx, miny + 0.02083076350390911, minz + 0.044862694725740226),
|
|
(maxx, miny + 0.022660082206130028, minz + 0.05405931267887354),
|
|
(maxx, miny + 0.02786954492330551, minz + 0.061855828389525414),
|
|
(maxx, miny + 0.035666066221892834, maxz - 0.059820037335157394),
|
|
(maxx, maxy - 0.03566606715321541, minz + 0.022660093382000923),
|
|
(maxx, maxy - 0.02786955051124096, minz + 0.027869559824466705),
|
|
(maxx, maxy - 0.022660084068775177, minz + 0.035666078329086304),
|
|
(maxx, maxy - 0.02083076350390911, minz + 0.044862698354463326),
|
|
(maxx, maxy - 0.02266007848083973, minz + 0.05405930709093809),
|
|
(maxx, maxy - 0.02786954492330551, minz + 0.061855828389525414),
|
|
(maxx, maxy - 0.035666064359247684, maxz - 0.059820037335157394),
|
|
(maxx, maxy - 0.04486268734234705, maxz - 0.05799071677029133),
|
|
(maxx, miny + 0.04486268733843682, minz + 0.04486269544876009),
|
|
(maxx - 0.009557131677865982, maxy - 0.04486268735205459, maxz - 0.02464577928185463),
|
|
(maxx - 0.009557131677865982, miny + 0.027694474905729294, maxz - 0.024581149220466614),
|
|
(maxx - 0.009557131677865982, maxy - 0.013139966875314713, maxz - 0.024402707815170288),
|
|
(maxx - 0.009557131677865982, miny + 0.013139966875314713, maxz - 0.02467035874724388),
|
|
(maxx - 0.009557131677865982, maxy - 0.027694473043084145, maxz - 0.024581149220466614),
|
|
(maxx - 0.015024378895759583, miny + 0.027694474905729294, maxz - 0.00017844140529632568),
|
|
(maxx - 0.015024378895759583, miny + 0.013139966875314713, maxz - 0.0002676546573638916),
|
|
(maxx - 0.015024378895759583, maxy - 0.04486268735205459, maxz - 0.0002430751919746399),
|
|
(maxx - 0.015024378895759583, maxy - 0.027694473043084145, maxz - 0.00017844140529632568),
|
|
(maxx - 0.015024378895759583, maxy - 0.013139966875314713, maxz),
|
|
(maxx, miny + 0.013139966875314713, maxz - 0.0018796995282173157),
|
|
(maxx - 0.01466318964958191, maxy - 0.04486268735205459, maxz - 0.001855120062828064),
|
|
(maxx, maxy - 0.04486268735205459, maxz - 0.001855120062828064),
|
|
(maxx - 0.01466318964958191, maxy - 0.027694473043084145, maxz - 0.0017904937267303467),
|
|
(maxx - 0.01466318964958191, maxy - 0.013139966875314713, maxz - 0.001612052321434021),
|
|
(maxx, maxy - 0.027694473043084145, maxz - 0.0017904937267303467),
|
|
(maxx - 0.020517520606517792, miny + 0.014739999547600746, minz + 0.03238546848297119),
|
|
(maxx - 0.020517520606517792, miny + 0.021807780489325523, minz + 0.02180778607726097),
|
|
(maxx - 0.020517520606517792, miny + 0.03238545823842287, minz + 0.014740003272891045),
|
|
(maxx - 0.020517520606517792, miny + 0.044862685933359736, minz + 0.012258127331733704),
|
|
(maxx - 0.020517520606517792, maxy - 0.014739990234375, minz + 0.05733991041779518),
|
|
(maxx - 0.020517520606517792, maxy - 0.021807771176099777, maxz - 0.05896773934364319),
|
|
(maxx - 0.020517520606517792, maxy - 0.03238545451313257, maxz - 0.051899950951337814),
|
|
(maxx - 0.020517520606517792, maxy - 0.044862687428120204, maxz - 0.049418069422245026),
|
|
(maxx - 0.020517520606517792, maxy - 0.03238546196371317, minz + 0.014740003272891045),
|
|
(maxx - 0.020517520606517792, maxy - 0.021807780489325523, minz + 0.02180778607726097),
|
|
(maxx - 0.020517520606517792, maxy - 0.014739999547600746, minz + 0.03238546848297119),
|
|
(maxx - 0.020517520606517792, maxy - 0.012258119881153107, minz + 0.04486269794694575),
|
|
(maxx - 0.020517520606517792, miny + 0.03238545544445515, maxz - 0.051899950951337814),
|
|
(maxx - 0.020517520606517792, miny + 0.021807771176099777, maxz - 0.05896773561835289),
|
|
(maxx - 0.020517520606517792, miny + 0.014739995822310448, minz + 0.05733991973102093),
|
|
(maxx - 0.020517520606517792, miny + 0.012258119881153107, minz + 0.04486269302378876),
|
|
(minx, miny + 0.014739999547600746, minz + 0.03238546848297119),
|
|
(minx, miny + 0.021807780489325523, minz + 0.02180778607726097),
|
|
(minx, miny + 0.03238545823842287, minz + 0.014740003272891045),
|
|
(minx, miny + 0.044862685933359736, minz + 0.012258127331733704),
|
|
(minx, maxy - 0.014739990234375, minz + 0.05733991041779518),
|
|
(minx, maxy - 0.021807771176099777, maxz - 0.05896773934364319),
|
|
(minx, maxy - 0.03238545451313257, maxz - 0.051899950951337814),
|
|
(minx, maxy - 0.044862687428120204, maxz - 0.049418069422245026),
|
|
(minx, maxy - 0.03238546196371317, minz + 0.014740003272891045),
|
|
(minx, maxy - 0.021807780489325523, minz + 0.02180778607726097),
|
|
(minx, maxy - 0.014739999547600746, minz + 0.03238546848297119),
|
|
(minx, maxy - 0.012258119881153107, minz + 0.04486269794694575),
|
|
(minx, miny + 0.03238545544445515, maxz - 0.051899950951337814),
|
|
(minx, miny + 0.021807771176099777, maxz - 0.05896773561835289),
|
|
(minx, miny + 0.014739995822310448, minz + 0.05733991973102093),
|
|
(minx, miny + 0.012258119881153107, minz + 0.04486269302378876)]
|
|
|
|
# Faces
|
|
myfaces = [(37, 0, 1, 36), (36, 1, 2, 35), (35, 2, 3, 34), (34, 3, 4, 78), (78, 4, 5, 77),
|
|
(77, 5, 6, 76), (76, 6, 7, 75), (75, 7, 8, 29), (29, 8, 9, 28), (28, 9, 10, 27),
|
|
(27, 10, 11, 26), (65, 12, 13, 64), (8, 7, 17, 46), (63, 14, 0, 37), (64, 13, 14, 63),
|
|
(34, 78, 41, 79), (64, 63, 67, 68), (76, 75, 38, 39), (65, 64, 68, 69), (27, 26, 98, 99),
|
|
(78, 77, 40, 41), (28, 27, 99, 100), (35, 34, 79, 80), (63, 37, 82, 67), (29, 28, 100, 101),
|
|
(26, 66, 70, 98), (36, 35, 80, 81), (66, 65, 69, 70), (77, 76, 39, 40), (37, 36, 81, 82),
|
|
(75, 29, 101, 38), (19, 18, 109, 108), (31, 32, 61, 60), (2, 1, 88, 89), (103, 102, 91, 92),
|
|
(7, 6, 16, 17), (54, 18, 55, 25), (32, 33, 62, 61), (18, 19, 56, 55), (6, 5, 15, 16),
|
|
(11, 10, 48, 49), (52, 53, 24, 23), (0, 14, 86, 87), (94, 71, 129, 133), (97, 113, 51, 44),
|
|
(33, 32, 117, 116), (18, 54, 110, 109), (32, 31, 95, 96), (96, 97, 44, 43), (102, 103, 72, 71),
|
|
(53, 52, 114, 42), (21, 20, 107, 106), (103, 104, 73, 72), (31, 30, 94, 95), (20, 19, 108, 107),
|
|
(30, 102, 71, 94), (105, 21, 106, 74), (54, 53, 111, 110), (104, 105, 74, 73), (47, 46, 59, 60),
|
|
(90, 89, 57, 58), (87, 86, 25, 55), (48, 47, 60, 61), (49, 48, 61, 62), (83, 49, 62, 22),
|
|
(16, 15, 93, 92), (88, 87, 55, 56), (84, 83, 22, 23), (17, 16, 92, 91), (85, 84, 23, 24),
|
|
(46, 17, 91, 59), (89, 88, 56, 57), (86, 85, 24, 25), (104, 103, 92, 93), (3, 2, 89, 90),
|
|
(20, 21, 58, 57), (13, 12, 84, 85), (9, 8, 46, 47), (102, 30, 59, 91), (30, 31, 60, 59),
|
|
(19, 20, 57, 56), (14, 13, 85, 86), (53, 54, 25, 24), (10, 9, 47, 48), (1, 0, 87, 88),
|
|
(111, 53, 42, 45), (112, 111, 45, 50), (32, 96, 43, 117), (113, 112, 50, 51), (115, 116, 125, 124),
|
|
(42, 114, 123, 122), (116, 117, 126, 125), (114, 115, 124, 123), (112, 113, 144, 143),
|
|
(95, 94, 133, 134),
|
|
(110, 111, 142, 141), (96, 95, 134, 135), (74, 106, 137, 132), (97, 96, 135, 136), (73, 74, 132, 131),
|
|
(107, 108, 139, 138), (113, 97, 136, 144), (72, 73, 131, 130), (108, 109, 140, 139),
|
|
(109, 110, 141, 140),
|
|
(71, 72, 130, 129), (106, 107, 138, 137), (111, 112, 143, 142), (135, 134, 145), (137, 138, 145),
|
|
(142, 143, 145), (136, 135, 145), (131, 132, 145), (143, 144, 145), (144, 136, 145),
|
|
(130, 131, 145), (141, 142, 145), (129, 130, 145), (132, 137, 145), (133, 129, 145),
|
|
(138, 139, 145), (134, 133, 145), (139, 140, 145), (140, 141, 145), (26, 11, 83, 66),
|
|
(66, 83, 12, 65), (12, 83, 84), (22, 52, 23), (83, 11, 49), (21, 105, 58),
|
|
(4, 90, 58, 105), (15, 4, 105, 93), (33, 22, 62), (4, 3, 90), (105, 104, 93),
|
|
(5, 4, 15), (52, 22, 115, 114), (22, 33, 116, 115), (124, 125, 147, 146), (122, 123, 150, 148),
|
|
(125, 126, 149, 147), (123, 124, 146, 150), (157, 128, 151, 153), (159, 157, 153, 154),
|
|
(160, 159, 154, 155),
|
|
(128, 119, 152, 151), (146, 147, 128, 157), (150, 146, 157, 159), (148, 150, 159, 160),
|
|
(147, 149, 119, 128),
|
|
(69, 68, 167, 168), (101, 100, 176, 177), (39, 38, 162, 163), (100, 99, 175, 176), (41, 40, 164, 165),
|
|
(80, 79, 170, 171), (82, 81, 172, 173), (67, 82, 173, 166), (70, 69, 168, 169), (38, 101, 177, 162),
|
|
(98, 70, 169, 174), (40, 39, 163, 164), (79, 41, 165, 170), (99, 98, 174, 175), (81, 80, 171, 172),
|
|
(68, 67, 166, 167), (169, 168, 184, 185), (170, 165, 181, 186), (172, 171, 187, 188),
|
|
(162, 177, 193, 178),
|
|
(164, 163, 179, 180), (167, 166, 182, 183), (174, 169, 185, 190), (168, 167, 183, 184),
|
|
(175, 174, 190, 191),
|
|
(171, 170, 186, 187), (173, 172, 188, 189), (163, 162, 178, 179), (165, 164, 180, 181),
|
|
(177, 176, 192, 193),
|
|
(166, 173, 189, 182), (176, 175, 191, 192), (51, 50, 161, 158), (127, 160, 155), (156, 120, 151, 152),
|
|
(155, 154, 161, 121), (161, 154, 153, 158), (42, 122, 148), (117, 149, 126), (127, 42, 148, 160),
|
|
(118, 152, 119), (158, 153, 151, 120), (50, 45, 121, 161), (117, 118, 119, 149), (43, 44, 120, 156),
|
|
(44, 51, 158, 120), (117, 43, 156, 118), (45, 42, 127, 121)]
|
|
|
|
return myvertex, myfaces
|
|
|
|
|
|
# --------------------------------------------------------------------
|
|
# Set curve cycle
|
|
#
|
|
# myObject: Curve object
|
|
# --------------------------------------------------------------------
|
|
def set_curve_cycle(myobject):
|
|
bpy.context.view_layer.objects.active = myobject
|
|
# go edit mode
|
|
bpy.ops.object.mode_set(mode='EDIT')
|
|
# select all faces
|
|
bpy.ops.curve.select_all(action='SELECT')
|
|
# St cyclic
|
|
bpy.ops.curve.cyclic_toggle(direction='CYCLIC_U')
|
|
# go object mode again
|
|
bpy.ops.object.editmode_toggle()
|