code cleanup: curve extra objects thanks @batfinger

This commit is contained in:
Brendon Murphy 2016-08-11 02:05:58 +10:00
parent 69bda0309b
commit a36c5cd168
5 changed files with 641 additions and 448 deletions

View File

@ -45,8 +45,91 @@ else:
from . import add_surface_plane_cone
import bpy
from bpy.types import Menu
from bpy.types import Menu, AddonPreferences
from bpy.props import StringProperty, IntProperty, BoolProperty
def convert_old_presets(data_path, msg_data_path, old_preset_subdir, new_preset_subdir, fixdic={}, ext=".py"):
''' convert old presets '''
def convert_presets(self, context):
if not getattr(self, data_path, False):
return None
import os
target_path = os.path.join("presets", old_preset_subdir)
target_path = bpy.utils.user_resource('SCRIPTS',
target_path)
# created an anytype op to run against preset
op = type('', (), {})()
files = [f for f in os.listdir(target_path) if f.endswith(ext)]
if not files:
print("No old presets in %s" % target_path)
setattr(self, msg_data_path, "No old presets")
return None
new_target_path = os.path.join("presets", new_preset_subdir)
new_target_path = bpy.utils.user_resource('SCRIPTS',
new_target_path,
create=True)
for f in files:
file = open(os.path.join(target_path, f))
for line in file:
if line.startswith("op."):
exec(line)
file.close()
for key, items in fixdic.items():
if hasattr(op, key) and isinstance(getattr(op, key), int):
setattr(op, key, items[getattr(op, key)])
# create a new one
new_file_path = os.path.join(new_target_path, f)
if os.path.isfile(new_file_path):
# do nothing
print("Preset %s already exists, passing..." % f)
continue
file_preset = open(new_file_path, 'w')
file_preset.write("import bpy\n")
file_preset.write("op = bpy.context.active_operator\n")
for prop, value in vars(op).items():
file_preset.write("op.%s = %s\n" % (prop, str(value)))
file_preset.close()
print("Writing new preset to %s" % new_file_path)
setattr(self, msg_data_path, "Converted %d old presets" % len(files))
return None
return convert_presets
class CurveExtraObjectsAddonPreferences(AddonPreferences):
bl_idname = __name__
spiral_fixdic = {"spiral_type": ['ARCH', 'ARCH', 'LOG', 'SPHERE', 'TORUS'],
"curve_type": ['POLY', 'NURB'],
"spiral_direction": ['COUNTER_CLOCKWISE', 'CLOCKWISE']
}
update_spriral_presets_msg = StringProperty(default="Nothing to do")
update_spiral_presets = BoolProperty(
name="Update Old Presets",
description="Update presets to reflect data changes",
default=False,
update=convert_old_presets("update_spiral_presets", # this props name
"update_spiral_presets_msg", # message prop
"operator/curve.spirals",
"curve_extras/curve.spirals",
fixdic=spiral_fixdic)
)
def draw(self, context):
layout = self.layout
layout.label(text="Spirals")
if self.update_spiral_presets:
layout.label(self.update_spriral_presets_msg, icon='FILE_TICK')
else:
layout.prop(self, "update_spiral_presets")
# TODO check if this is even used.
class INFO_MT_curve_extras_add(Menu):
# Define the "Extras" menu
bl_idname = "curve_extra_objects_add"
@ -55,31 +138,40 @@ class INFO_MT_curve_extras_add(Menu):
def draw(self, context):
layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
layout.operator("mesh.curveaceous_galore",
text="Curve Profiles")
layout.operator("curve.spirals",
text="Spirals")
layout.operator_menu_enum("mesh.curveaceous_galore",
"ProfileType",
)
layout.operator_menu_enum("curve.spirals",
"spiral_type",
icon='FORCE_VORTEX')
layout.operator("curve.torus_knot_plus",
text="Torus Knot Plus")
# Define "Extras" menus
def menu_func(self, context):
self.layout.separator()
self.layout.operator("mesh.curveaceous_galore",
text="Curve Profiles")
self.layout.operator("curve.torus_knot_plus",
text="Torus Knot Plus")
self.layout.operator("curve.spirals",
text="Spirals")
if context.mode != 'OBJECT':
# fix in D2142 will allow to work in EDIT_CURVE
return None
layout = self.layout
layout.separator()
layout.operator_menu_enum("mesh.curveaceous_galore",
"ProfileType",
)
layout.operator_menu_enum("curve.spirals",
"spiral_type",
icon='FORCE_VORTEX')
layout.operator("curve.torus_knot_plus", text="Torus Knot Plus")
def menu_surface(self, context):
layout = self.layout
self.layout.separator()
self.layout.operator("object.add_surface_wedge", text="Wedge", icon="MOD_CURVE")
self.layout.operator("object.add_surface_cone", text="Cone", icon="MOD_CURVE")
self.layout.operator("object.add_surface_star", text="Star", icon="MOD_CURVE")
self.layout.operator("object.add_surface_plane", text="Plane", icon="MOD_CURVE")
self.layout.operator("curve.smooth_x_times", text="Special Smooth", icon="MOD_CURVE")
if context.mode == 'EDIT_SURFACE':
self.layout.operator("curve.smooth_x_times", text="Special Smooth", icon="MOD_CURVE")
elif context.mode == 'OBJECT':
self.layout.operator("object.add_surface_wedge", text="Wedge", icon="MOD_CURVE")
self.layout.operator("object.add_surface_cone", text="Cone", icon="MOD_CURVE")
self.layout.operator("object.add_surface_star", text="Star", icon="MOD_CURVE")
self.layout.operator("object.add_surface_plane", text="Plane", icon="MOD_CURVE")
def register():
bpy.utils.register_module(__name__)

View File

@ -31,8 +31,8 @@ bl_info = {
'''
##------------------------------------------------------------
#### import modules
# ------------------------------------------------------------
# import modules
import bpy
from bpy.props import (
BoolProperty,
@ -51,11 +51,11 @@ from math import (
)
import mathutils.noise as Noise
from bpy.types import Operator
###------------------------------------------------------------
#### Some functions to use with others:
###------------------------------------------------------------
# ------------------------------------------------------------
# Some functions to use with others:
# ------------------------------------------------------------
#------------------------------------------------------------
# ------------------------------------------------------------
# Generate random number:
def randnum(low=0.0, high=1.0, seed=0):
"""
@ -82,9 +82,9 @@ def randnum(low=0.0, high=1.0, seed=0):
return rnum
#------------------------------------------------------------
# ------------------------------------------------------------
# Make some noise:
def vTurbNoise(x,y,z, iScale=0.25, Size=1.0, Depth=6, Hard=0, Basis=0, Seed=0):
def vTurbNoise(x, y, z, iScale=0.25, Size=1.0, Depth=6, Hard=0, Basis=0, Seed=0):
"""
vTurbNoise((x,y,z), iScale=0.25, Size=1.0, Depth=6, Hard=0, Basis=0, Seed=0 )
@ -109,32 +109,34 @@ def vTurbNoise(x,y,z, iScale=0.25, Size=1.0, Depth=6, Hard=0, Basis=0, Seed=0):
the generated turbulence vector.
(type=3-float list)
"""
rand = randnum(-100,100,Seed)
if Basis == 9: Basis = 14
rand = randnum(-100, 100, Seed)
if Basis == 9:
Basis = 14
vTurb = Noise.turbulence_vector((x/Size+rand, y/Size+rand, z/Size+rand), Depth, Hard, Basis)
tx = vTurb[0]*iScale
ty = vTurb[1]*iScale
tz = vTurb[2]*iScale
return tx,ty,tz
return tx, ty, tz
#------------------------------------------------------------
# Axis: ( used in 3DCurve Turbulence )
def AxisFlip(x,y,z, x_axis=1, y_axis=1, z_axis=1, flip=0 ):
def AxisFlip(x, y, z, x_axis=1, y_axis=1, z_axis=1, flip=0):
if flip != 0:
flip *= -1
else: flip = 1
else:
flip = 1
x *= x_axis*flip
y *= y_axis*flip
z *= z_axis*flip
return x,y,z
return x, y, z
###-------------------------------------------------------------------
#### 2D Curve shape functions:
###-------------------------------------------------------------------
# -------------------------------------------------------------------
# 2D Curve shape functions:
# -------------------------------------------------------------------
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Profile: L, H, T, U, Z
def ProfileCurve(type=0, a=0.25, b=0.25):
"""
@ -155,42 +157,42 @@ def ProfileCurve(type=0, a=0.25, b=0.25):
"""
newpoints = []
if type ==1:
## H:
a*=0.5
b*=0.5
newpoints = [ [ -1.0, 1.0, 0.0 ], [ -1.0+a, 1.0, 0.0 ],
[ -1.0+a, b, 0.0 ], [ 1.0-a, b, 0.0 ], [ 1.0-a, 1.0, 0.0 ],
[ 1.0, 1.0, 0.0 ], [ 1.0, -1.0, 0.0 ], [ 1.0-a, -1.0, 0.0 ],
[ 1.0-a, -b, 0.0 ], [ -1.0+a, -b, 0.0 ], [ -1.0+a, -1.0, 0.0 ],
[ -1.0, -1.0, 0.0 ] ]
elif type ==2:
## T:
a*=0.5
newpoints = [ [ -1.0, 1.0, 0.0 ], [ 1.0, 1.0, 0.0 ],
[ 1.0, 1.0-b, 0.0 ], [ a, 1.0-b, 0.0 ], [ a, -1.0, 0.0 ],
[ -a, -1.0, 0.0 ], [ -a, 1.0-b, 0.0 ], [ -1.0, 1.0-b, 0.0 ] ]
elif type ==3:
## U:
a*=0.5
newpoints = [ [ -1.0, 1.0, 0.0 ], [ -1.0+a, 1.0, 0.0 ],
[ -1.0+a, -1.0+b, 0.0 ], [ 1.0-a, -1.0+b, 0.0 ], [ 1.0-a, 1.0, 0.0 ],
[ 1.0, 1.0, 0.0 ], [ 1.0, -1.0, 0.0 ], [ -1.0, -1.0, 0.0 ] ]
elif type ==4:
## Z:
a*=0.5
newpoints = [ [ -0.5, 1.0, 0.0 ], [ a, 1.0, 0.0 ],
[ a, -1.0+b, 0.0 ], [ 1.0, -1.0+b, 0.0 ], [ 1.0, -1.0, 0.0 ],
[ -a, -1.0, 0.0 ], [ -a, 1.0-b, 0.0 ], [ -1.0, 1.0-b, 0.0 ],
[ -1.0, 1.0, 0.0 ] ]
if type == 1:
# H:
a *= 0.5
b *= 0.5
newpoints = [[-1.0, 1.0, 0.0], [-1.0+a, 1.0, 0.0],
[-1.0+a, b, 0.0], [1.0-a, b, 0.0], [1.0-a, 1.0, 0.0],
[1.0, 1.0, 0.0], [1.0, -1.0, 0.0], [1.0-a, -1.0, 0.0],
[1.0-a, -b, 0.0], [-1.0+a, -b, 0.0], [-1.0+a, -1.0, 0.0],
[-1.0, -1.0, 0.0]]
elif type == 2:
# T:
a *= 0.5
newpoints = [[-1.0, 1.0, 0.0], [1.0, 1.0, 0.0],
[1.0, 1.0-b, 0.0], [a, 1.0-b, 0.0], [a, -1.0, 0.0],
[-a, -1.0, 0.0], [-a, 1.0-b, 0.0], [-1.0, 1.0-b, 0.0]]
elif type == 3:
# U:
a *= 0.5
newpoints = [[-1.0, 1.0, 0.0], [-1.0+a, 1.0, 0.0],
[-1.0+a, -1.0+b, 0.0], [1.0-a, -1.0+b, 0.0], [1.0-a, 1.0, 0.0],
[1.0, 1.0, 0.0], [1.0, -1.0, 0.0], [-1.0, -1.0, 0.0]]
elif type == 4:
# Z:
a *= 0.5
newpoints = [[-0.5, 1.0, 0.0], [a, 1.0, 0.0],
[a, -1.0+b, 0.0], [1.0, -1.0+b, 0.0], [1.0, -1.0, 0.0],
[-a, -1.0, 0.0], [-a, 1.0-b, 0.0], [-1.0, 1.0-b, 0.0],
[-1.0, 1.0, 0.0]]
else:
## L:
newpoints = [ [ -1.0, 1.0, 0.0 ], [ -1.0+a, 1.0, 0.0 ],
[ -1.0+a, -1.0+b, 0.0 ], [ 1.0, -1.0+b, 0.0 ],
[ 1.0, -1.0, 0.0 ], [ -1.0, -1.0, 0.0 ] ]
# L:
newpoints = [[-1.0, 1.0, 0.0], [-1.0+a, 1.0, 0.0],
[-1.0+a, -1.0+b, 0.0], [1.0, -1.0+b, 0.0],
[1.0, -1.0, 0.0], [-1.0, -1.0, 0.0]]
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Miscellaneous.: Diamond, Arrow1, Arrow2, Square, ....
def MiscCurve(type=1, a=1.0, b=0.5, c=1.0):
"""
@ -214,28 +216,28 @@ def MiscCurve(type=1, a=1.0, b=0.5, c=1.0):
"""
newpoints = []
a*=0.5
b*=0.5
a *= 0.5
b *= 0.5
if type == 1:
## diamond:
newpoints = [ [ 0.0, b, 0.0 ], [ a, 0.0, 0.0 ], [ 0.0, -b, 0.0 ], [ -a, 0.0, 0.0 ] ]
# diamond:
newpoints = [[0.0, b, 0.0], [a, 0.0, 0.0], [0.0, -b, 0.0], [-a, 0.0, 0.0]]
elif type == 2:
## Arrow1:
newpoints = [ [ -a, b, 0.0 ], [ a, 0.0, 0.0 ], [ -a, -b, 0.0 ], [ 0.0, 0.0, 0.0 ] ]
# Arrow1:
newpoints = [[-a, b, 0.0], [a, 0.0, 0.0], [-a, -b, 0.0], [0.0, 0.0, 0.0]]
elif type == 3:
## Arrow2:
newpoints = [ [ -1.0, b, 0.0 ], [ -1.0+a, b, 0.0 ],
[ -1.0+a, 1.0, 0.0 ], [ 1.0, 0.0, 0.0 ],
[ -1.0+a, -1.0, 0.0 ], [ -1.0+a, -b, 0.0 ],
[ -1.0, -b, 0.0 ] ]
# Arrow2:
newpoints = [[-1.0, b, 0.0], [-1.0+a, b, 0.0],
[-1.0+a, 1.0, 0.0], [1.0, 0.0, 0.0],
[-1.0+a, -1.0, 0.0], [-1.0+a, -b, 0.0],
[-1.0, -b, 0.0]]
elif type == 4:
## Rounded square:
newpoints = [ [ -a, b-b*0.2, 0.0 ], [ -a+a*0.05, b-b*0.05, 0.0 ], [ -a+a*0.2, b, 0.0 ],
[ a-a*0.2, b, 0.0 ], [ a-a*0.05, b-b*0.05, 0.0 ], [ a, b-b*0.2, 0.0 ],
[ a, -b+b*0.2, 0.0 ], [ a-a*0.05, -b+b*0.05, 0.0 ], [ a-a*0.2, -b, 0.0 ],
[ -a+a*0.2, -b, 0.0 ], [ -a+a*0.05, -b+b*0.05, 0.0 ], [ -a, -b+b*0.2, 0.0 ] ]
# Rounded square:
newpoints = [[-a, b-b*0.2, 0.0], [-a+a*0.05, b-b*0.05, 0.0], [-a+a*0.2, b, 0.0],
[a-a*0.2, b, 0.0], [a-a*0.05, b-b*0.05, 0.0], [a, b-b*0.2, 0.0],
[a, -b+b*0.2, 0.0], [a-a*0.05, -b+b*0.05, 0.0], [a-a*0.2, -b, 0.0],
[-a+a*0.2, -b, 0.0], [-a+a*0.05, -b+b*0.05, 0.0], [-a, -b+b*0.2, 0.0]]
elif type == 5:
## Rounded Rectangle II:
# Rounded Rectangle II:
newpoints = []
x = a / 2
y = b / 2
@ -246,27 +248,27 @@ def MiscCurve(type=1, a=1.0, b=0.5, c=1.0):
if r > y:
r = y - 0.0001
if r>0:
newpoints.append([-x+r,y,0])
newpoints.append([x-r,y,0])
newpoints.append([x,y-r,0])
newpoints.append([x,-y+r,0])
newpoints.append([x-r,-y,0])
newpoints.append([-x+r,-y,0])
newpoints.append([-x,-y+r,0])
newpoints.append([-x,y-r,0])
if r > 0:
newpoints.append([-x+r, y, 0])
newpoints.append([x-r, y, 0])
newpoints.append([x, y-r, 0])
newpoints.append([x, -y+r, 0])
newpoints.append([x-r, -y, 0])
newpoints.append([-x+r, -y, 0])
newpoints.append([-x, -y+r, 0])
newpoints.append([-x, y-r, 0])
else:
newpoints.append([-x,y,0])
newpoints.append([x,y,0])
newpoints.append([x,-y,0])
newpoints.append([-x,-y,0])
newpoints.append([-x, y, 0])
newpoints.append([x, y, 0])
newpoints.append([x, -y, 0])
newpoints.append([-x, -y, 0])
else:
## Square:
newpoints = [ [ -a, b, 0.0 ], [ a, b, 0.0 ], [ a, -b, 0.0 ], [ -a, -b, 0.0 ] ]
# Square:
newpoints = [[-a, b, 0.0], [a, b, 0.0], [a, -b, 0.0], [-a, -b, 0.0]]
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Star:
def StarCurve(starpoints=8, innerradius=0.5, outerradius=1.0, twist=0.0):
"""
@ -295,14 +297,14 @@ def StarCurve(starpoints=8, innerradius=0.5, outerradius=1.0, twist=0.0):
t = (i*step)
x1 = cos(t*pi)*outerradius
y1 = sin(t*pi)*outerradius
newpoints.append([x1,y1,0])
newpoints.append([x1, y1, 0])
x2 = cos(t*pi+(pi/starpoints+twist))*innerradius
y2 = sin(t*pi+(pi/starpoints+twist))*innerradius
newpoints.append([x2,y2,0])
i+=1
newpoints.append([x2, y2, 0])
i += 1
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Flower:
def FlowerCurve(petals=8, innerradius=0.5, outerradius=1.0, petalwidth=2.0):
"""
@ -332,17 +334,17 @@ def FlowerCurve(petals=8, innerradius=0.5, outerradius=1.0, petalwidth=2.0):
t = (i*step)
x1 = cos(t*pi-(pi/petals))*innerradius
y1 = sin(t*pi-(pi/petals))*innerradius
newpoints.append([x1,y1,0])
newpoints.append([x1, y1, 0])
x2 = cos(t*pi-pet)*outerradius
y2 = sin(t*pi-pet)*outerradius
newpoints.append([x2,y2,0])
newpoints.append([x2, y2, 0])
x3 = cos(t*pi+pet)*outerradius
y3 = sin(t*pi+pet)*outerradius
newpoints.append([x3,y3,0])
i+=1
newpoints.append([x3, y3, 0])
i += 1
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Arc,Sector,Segment,Ring:
def ArcCurve(sides=6, startangle=0.0, endangle=90.0, innerradius=0.5, outerradius=1.0, type=3):
"""
@ -371,34 +373,34 @@ def ArcCurve(sides=6, startangle=0.0, endangle=90.0, innerradius=0.5, outerradiu
newpoints = []
sides += 1
angle = (2.0*(1.0/360.0))
endangle-=startangle
endangle -= startangle
step = ((angle*endangle)/(sides-1))
i = 0
while i < sides:
t = (i*step) + angle*startangle
x1 = sin(t*pi)*outerradius
y1 = cos(t*pi)*outerradius
newpoints.append([x1,y1,0])
i+=1
newpoints.append([x1, y1, 0])
i += 1
#if type ==0:
# if type ==0:
# Arc: turn cyclic curve flag off!
# Segment:
if type ==2:
newpoints.append([0,0,0])
if type == 2:
newpoints.append([0, 0, 0])
# Ring:
elif type ==3:
j=sides-1
elif type == 3:
j = sides-1
while j > -1:
t = (j*step) + angle*startangle
x2 = sin(t*pi)*innerradius
y2 = cos(t*pi)*innerradius
newpoints.append([x2,y2,0])
j-=1
newpoints.append([x2, y2, 0])
j -= 1
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Cog wheel:
def CogCurve(theeth=8, innerradius=0.8, middleradius=0.95, outerradius=1.0, bevel=0.5):
"""
@ -431,26 +433,26 @@ def CogCurve(theeth=8, innerradius=0.8, middleradius=0.95, outerradius=1.0, beve
t = (i*step)
x1 = cos(t*pi-(pi/theeth)-pet)*innerradius
y1 = sin(t*pi-(pi/theeth)-pet)*innerradius
newpoints.append([x1,y1,0])
newpoints.append([x1, y1, 0])
x2 = cos(t*pi-(pi/theeth)+pet)*innerradius
y2 = sin(t*pi-(pi/theeth)+pet)*innerradius
newpoints.append([x2,y2,0])
newpoints.append([x2, y2, 0])
x3 = cos(t*pi-pet)*middleradius
y3 = sin(t*pi-pet)*middleradius
newpoints.append([x3,y3,0])
newpoints.append([x3, y3, 0])
x4 = cos(t*pi-(pet*bevel))*outerradius
y4 = sin(t*pi-(pet*bevel))*outerradius
newpoints.append([x4,y4,0])
newpoints.append([x4, y4, 0])
x5 = cos(t*pi+(pet*bevel))*outerradius
y5 = sin(t*pi+(pet*bevel))*outerradius
newpoints.append([x5,y5,0])
newpoints.append([x5, y5, 0])
x6 = cos(t*pi+pet)*middleradius
y6 = sin(t*pi+pet)*middleradius
newpoints.append([x6,y6,0])
i+=1
newpoints.append([x6, y6, 0])
i += 1
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: nSide:
def nSideCurve(sides=6, radius=1.0):
"""
@ -475,12 +477,12 @@ def nSideCurve(sides=6, radius=1.0):
t = (i*step)
x = sin(t*pi)*radius
y = cos(t*pi)*radius
newpoints.append([x,y,0])
i+=1
newpoints.append([x, y, 0])
i += 1
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# 2DCurve: Splat:
def SplatCurve(sides=24, scale=1.0, seed=0, basis=0, radius=1.0):
"""
@ -509,21 +511,21 @@ def SplatCurve(sides=24, scale=1.0, seed=0, basis=0, radius=1.0):
i = 0
while i < sides:
t = (i*step)
turb = vTurbNoise(t,t,t, 1.0, scale, 6, 0, basis, seed )
turb = vTurbNoise(t, t, t, 1.0, scale, 6, 0, basis, seed)
turb = turb[2] * 0.5 + 0.5
x = sin(t*pi)*radius * turb
y = cos(t*pi)*radius * turb
newpoints.append([x,y,0])
i+=1
newpoints.append([x, y, 0])
i += 1
return newpoints
###-----------------------------------------------------------
#### 3D curve shape functions:
###-----------------------------------------------------------
# -----------------------------------------------------------
# 3D curve shape functions:
# -----------------------------------------------------------
###------------------------------------------------------------
# ------------------------------------------------------------
# 3DCurve: Helix:
def HelixCurve( number=100, height=2.0, startangle=0.0, endangle=360.0, width=1.0, a=0.0, b=0.0 ):
def HelixCurve(number=100, height=2.0, startangle=0.0, endangle=360.0, width=1.0, a=0.0, b=0.0):
"""
HelixCurve( number=100, height=2.0, startangle=0.0, endangle=360.0, width=1.0, a=0.0, b=0.0 )
@ -554,20 +556,20 @@ def HelixCurve( number=100, height=2.0, startangle=0.0, endangle=360.0, width=1.
step = angle/(number-1)
h = height/angle
start = (startangle*2.0/360.0)
a/=angle
a /= angle
i = 0
while i < number:
t = ( i*step+start )
x = sin( (t*pi) ) * ( 1.0 + cos( t * pi * a - ( b * pi ) ) ) * ( 0.25 * width )
y = cos( (t*pi) ) * ( 1.0 + cos( t * pi * a - ( b * pi ) ) ) * ( 0.25 * width )
z = ( t * h ) -h*start
newpoints.append([x,y,z])
i+=1
t = (i*step+start)
x = sin((t*pi)) * (1.0 + cos(t * pi * a - (b * pi))) * (0.25 * width)
y = cos((t*pi)) * (1.0 + cos(t * pi * a - (b * pi))) * (0.25 * width)
z = (t * h) - h*start
newpoints.append([x, y, z])
i += 1
return newpoints
###------------------------------------------------------------ ?
# ------------------------------------------------------------ ?
# 3DCurve: Cycloid: Cycloid, Epicycloid, Hypocycloid
def CycloidCurve( number=24, length=2.0, type=0, a=1.0, b=1.0, startangle=0.0, endangle=360.0 ):
def CycloidCurve(number=24, length=2.0, type=0, a=1.0, b=1.0, startangle=0.0, endangle=360.0):
"""
CycloidCurve( number=24, length=2.0, type=0, a=1.0, b=1.0, startangle=0.0, endangle=360.0 )
@ -591,39 +593,39 @@ def CycloidCurve( number=24, length=2.0, type=0, a=1.0, b=1.0, startangle=0.0, e
#h = height/angle
d = length
start = (startangle*2.0/360.0)
a/=angle
a /= angle
i = 0
if type == 0: # Epitrochoid
if type == 0: # Epitrochoid
while i < number:
t = ( i*step+start )
t = (i*step+start)
x = ((a + b) * cos(t*pi)) - (d * cos(((a+b)/b)*t*pi))
y = ((a + b) * sin(t*pi)) - (d * sin(((a+b)/b)*t*pi))
z = 0 # ( t * h ) -h*start
newpoints.append([x,y,z])
i+=1
z = 0 # ( t * h ) -h*start
newpoints.append([x, y, z])
i += 1
else:
newpoints = [[-1,-1,0], [-1,1,0], [1,1,0], [1,-1,0]]
newpoints = [[-1, -1, 0], [-1, 1, 0], [1, 1, 0], [1, -1, 0]]
return newpoints
##------------------------------------------------------------
# ------------------------------------------------------------
# calculates the matrix for the new object
# depending on user pref
def align_matrix(context):
loc = Matrix.Translation(context.scene.cursor_location)
obj_align = context.user_preferences.edit.object_align
if (context.space_data.type == 'VIEW_3D'
and obj_align == 'VIEW'):
and obj_align == 'VIEW'):
rot = context.space_data.region_3d.view_matrix.to_3x3().inverted().to_4x4()
else:
rot = Matrix()
align_matrix = loc * rot
return align_matrix
##------------------------------------------------------------
#### Curve creation functions
# ------------------------------------------------------------
# Curve creation functions
# sets bezierhandles to auto
def setBezierHandles(obj, mode = 'AUTOMATIC'):
def setBezierHandles(obj, mode='AUTOMATIC'):
scene = bpy.context.scene
if obj.type != 'CURVE':
return
@ -648,8 +650,8 @@ def vertsToPoints(Verts, splineType):
for v in Verts:
vertArray += v
if splineType == 'NURBS':
vertArray.append(1) #for nurbs w=1
else: #for poly w=0
vertArray.append(1) # for nurbs w=1
else: # for poly w=0
vertArray.append(0)
return vertArray
@ -661,8 +663,8 @@ def createCurve(context, vertArray, self, align_matrix):
# create curve
scene = context.scene
newCurve = bpy.data.curves.new(name, type = 'CURVE') # curvedatablock
newSpline = newCurve.splines.new(type = splineType) # spline
newCurve = bpy.data.curves.new(name, type='CURVE') # curvedatablock
newSpline = newCurve.splines.new(type=splineType) # spline
# create spline from vertarray
if splineType == 'BEZIER':
@ -680,11 +682,11 @@ def createCurve(context, vertArray, self, align_matrix):
newSpline.order_u = self.order_u
# create object with newCurve
new_obj = bpy.data.objects.new(name, newCurve) # object
scene.objects.link(new_obj) # place in active scene
new_obj.select = True # set as selected
new_obj = bpy.data.objects.new(name, newCurve) # object
scene.objects.link(new_obj) # place in active scene
new_obj.select = True # set as selected
scene.objects.active = new_obj # set as active
new_obj.matrix_world = align_matrix # apply matrix
new_obj.matrix_world = align_matrix # apply matrix
# set bezierhandles
if splineType == 'BEZIER':
@ -692,7 +694,7 @@ def createCurve(context, vertArray, self, align_matrix):
return
##------------------------------------------------------------
# ------------------------------------------------------------
# Main Function
def main(context, self, align_matrix):
# deselect all objects
@ -781,7 +783,7 @@ class Curveaceous_galore(Operator):
# align_matrix for the invoke
align_matrix = None
#### general properties
# general properties
ProfileTypes = [
('Profile', 'Profile', 'Profile'),
('Miscellaneous', 'Miscellaneous', 'Miscellaneous'),
@ -804,7 +806,7 @@ class Curveaceous_galore(Operator):
description="Type of splines to output",
items=SplineTypes)
#### Curve Options
# Curve Options
shapeItems = [
('2D', '2D', '2D'),
('3D', '3D', '3D')]
@ -829,7 +831,7 @@ class Curveaceous_galore(Operator):
description="bezier handles type",
items=bezHandles)
#### ProfileCurve properties
# ProfileCurve properties
ProfileCurveType = IntProperty(name="Type",
min=1, soft_min=1,
max=5, soft_max=5,
@ -842,7 +844,7 @@ class Curveaceous_galore(Operator):
default=0.25,
description="var2 of ProfileCurve")
#### MiscCurve properties
# MiscCurve properties
MiscCurveType = IntProperty(name="Type",
min=1, soft_min=1,
max=6, soft_max=6,
@ -859,7 +861,7 @@ class Curveaceous_galore(Operator):
min=0, soft_min=0,
description="var3 of MiscCurve")
#### Common properties
# Common properties
innerRadius = FloatProperty(name="Inner radius",
default=0.5,
min=0, soft_min=0,
@ -873,7 +875,7 @@ class Curveaceous_galore(Operator):
min=0, soft_min=0,
description="Outer radius")
#### Flower properties
# Flower properties
petals = IntProperty(name="Petals",
default=8,
min=2, soft_min=2,
@ -883,7 +885,7 @@ class Curveaceous_galore(Operator):
min=0.01, soft_min=0.01,
description="Petal width")
#### Star properties
# Star properties
starPoints = IntProperty(name="Star points",
default=8,
min=2, soft_min=2,
@ -892,7 +894,7 @@ class Curveaceous_galore(Operator):
default=0.0,
description="Twist")
#### Arc properties
# Arc properties
arcSides = IntProperty(name="Arc sides",
default=6,
min=1, soft_min=1,
@ -909,7 +911,7 @@ class Curveaceous_galore(Operator):
max=3, soft_max=3,
description="Sides of arc")
#### Cogwheel properties
# Cogwheel properties
teeth = IntProperty(name="Teeth",
default=8,
min=2, soft_min=2,
@ -920,13 +922,13 @@ class Curveaceous_galore(Operator):
max=1, soft_max=1,
description="Bevel")
#### Nsided property
# Nsided property
Nsides = IntProperty(name="Sides",
default=8,
min=3, soft_min=3,
description="Number of sides")
#### Splat properties
# Splat properties
splatSides = IntProperty(name="Splat sides",
default=24,
min=3, soft_min=3,
@ -945,7 +947,7 @@ class Curveaceous_galore(Operator):
max=14, soft_max=14,
description="Basis")
#### Helix properties
# Helix properties
helixPoints = IntProperty(name="resolution",
default=100,
min=3, soft_min=3,
@ -970,7 +972,7 @@ class Curveaceous_galore(Operator):
default=0.0,
description="Helix var2")
#### Cycloid properties
# Cycloid properties
cycloPoints = IntProperty(name="Resolution",
default=100,
min=3, soft_min=3,
@ -1035,10 +1037,10 @@ class Curveaceous_galore(Operator):
elif self.ProfileType == 'Arc':
box.prop(self, 'arcSides')
box.prop(self, 'arcType') # has only one Type?
box.prop(self, 'arcType') # has only one Type?
box.prop(self, 'startAngle')
box.prop(self, 'endAngle')
box.prop(self, 'innerRadius') # doesn't seem to do anything
box.prop(self, 'innerRadius') # doesn't seem to do anything
box.prop(self, 'outerRadius')
elif self.ProfileType == 'Cogwheel':
@ -1070,7 +1072,7 @@ class Curveaceous_galore(Operator):
elif self.ProfileType == 'Cycloid':
box.prop(self, 'cycloPoints')
#box.prop(self, 'cycloType') # needs the other types first
# box.prop(self, 'cycloType') # needs the other types first
box.prop(self, 'cycloStart')
box.prop(self, 'cycloEnd')
box.prop(self, 'cyclo_a')
@ -1102,7 +1104,7 @@ class Curveaceous_galore(Operator):
##### POLL #####
@classmethod
def poll(cls, context):
return context.scene != None
return context.scene is not None
##### EXECUTE #####
def execute(self, context):
@ -1113,8 +1115,8 @@ class Curveaceous_galore(Operator):
# deal with 2D - 3D curve differences
if self.ProfileType in ['Helix', 'Cycloid']:
self.shape = '3D'
#else:
#self.shape = '2D' # someone decide if we want this
# else:
# self.shape = '2D' # someone decide if we want this
if self.ProfileType in ['Helix']:
self.use_cyclic_u = False

View File

@ -15,116 +15,119 @@
'''
import bpy, time
from bpy.props import (
EnumProperty,
BoolProperty,
FloatProperty,
IntProperty,
)
from math import (
sin,
cos,
pi,
cos,
pi,
exp
)
from bpy_extras.object_utils import AddObjectHelper, object_data_add
from bpy.types import Operator
from bpy.types import Operator, Menu
from bl_operators.presets import AddPresetBase
#make normal spiral
#-----------------------------------------------------------------------------
# make normal spiral
# ----------------------------------------------------------------------------
def make_spiral(props, context):
#archemedian and logarithmic can be plottet in zylindrical coordinates
#if props.spiral_type != 1 and props.spiral_type != 2:
# return None
# archemedian and logarithmic can be plottet in zylindrical coordinates
# if props.spiral_type != 1 and props.spiral_type != 2:
# return None
#INPUT: turns->degree->max_phi, steps, direction
#Initialise Polar Coordinate Enviroment
#-------------------------------
props.degree = 360*props.turns #If you want to make the slider for degree
steps = props.steps * props.turns #props.steps[per turn] -> steps[for the whole spiral]
# INPUT: turns->degree->max_phi, steps, direction
# Initialise Polar Coordinate Enviroment
# -------------------------------
props.degree = 360*props.turns # If you want to make the slider for degree
steps = props.steps * props.turns # props.steps[per turn] -> steps[for the whole spiral]
props.z_scale = props.dif_z * props.turns
max_phi = pi*props.degree/180 #max angle in radian
step_phi = max_phi/steps #angle in radians between two vertices
if props.spiral_direction == 1:
step_phi *= -1 #flip direction
max_phi *= -1
step_z = props.z_scale/(steps-1) #z increase in one step
verts = []
verts.extend([props.radius,0,0,1])
cur_phi = 0
cur_z = 0
#-------------------------------
#Archemedean: dif_radius, radius
max_phi = pi*props.degree/180 # max angle in radian
step_phi = max_phi/steps # angle in radians between two vertices
if props.spiral_direction == 'CLOCKWISE':
step_phi *= -1 # flip direction
max_phi *= -1
step_z = props.z_scale/(steps-1) # z increase in one step
verts = []
verts.extend([props.radius, 0, 0, 1])
cur_phi = 0
cur_z = 0
# ------------------------------
# Archemedean: dif_radius, radius
cur_rad = props.radius
step_rad = props.dif_radius/(steps * 360/props.degree)
#radius increase per angle for archemedean spiral| (steps * 360/props.degree)...Steps needed for 360 deg
#Logarithmic: radius, B_force, ang_div, dif_z
#print("max_phi:",max_phi,"step_phi:",step_phi,"step_rad:",step_rad,"step_z:",step_z)
step_rad = props.dif_radius/(steps * 360/props.degree)
# radius increase per angle for archemedean spiral| (steps * 360/props.degree)...Steps needed for 360 deg
# Logarithmic: radius, B_force, ang_div, dif_z
# print("max_phi:",max_phi,"step_phi:",step_phi,"step_rad:",step_rad,"step_z:",step_z)
while abs(cur_phi) <= abs(max_phi):
cur_phi += step_phi
cur_z += step_z
#-------------------------------
if props.spiral_type == 1:
cur_z += step_z
# ------------------------------
if props.spiral_type == 'ARCH':
cur_rad += step_rad
if props.spiral_type == 2:
#r = a*e^{|theta| * b}
cur_rad = props.radius * pow(props.B_force, abs(cur_phi))
#-------------------------------
if props.spiral_type == 'LOG':
# r = a*e^{|theta| * b}
cur_rad = props.radius * pow(props.B_force, abs(cur_phi))
# ------------------------------
px = cur_rad * cos(cur_phi)
py = cur_rad * sin(cur_phi)
verts.extend( [px,py,cur_z,1] )
verts.extend([px, py, cur_z, 1])
return verts
#make Spheric spiral
#-----------------------------------------------------------------------------
# make Spheric spiral
# ----------------------------------------------------------------------------
def make_spiral_spheric(props, context):
#INPUT: turns, steps[per turn], radius
#use spherical Coordinates
step_phi = (2*pi) / props.steps #Step of angle in radians for one turn
steps = props.steps * props.turns #props.steps[per turn] -> steps[for the whole spiral]
max_phi = 2*pi*props.turns #max angle in radian
step_phi = max_phi/steps #angle in radians between two vertices
if props.spiral_direction == 1: #flip direction
# INPUT: turns, steps[per turn], radius
# use spherical Coordinates
step_phi = (2*pi) / props.steps # Step of angle in radians for one turn
steps = props.steps * props.turns # props.steps[per turn] -> steps[for the whole spiral]
max_phi = 2*pi*props.turns # max angle in radian
step_phi = max_phi/steps # angle in radians between two vertices
if props.spiral_direction == 'CLOCKWISE': # flip direction
step_phi *= -1
max_phi *= -1
step_theta = pi / (steps-1) #theta increase in one step (pi == 180 deg)
step_theta = pi / (steps-1) # theta increase in one step (pi == 180 deg)
verts = []
verts.extend([0,0,-props.radius,1]) #First vertex at south pole
verts.extend([0, 0, -props.radius, 1]) # First vertex at south pole
#cur_rad = props.radius = CONST
cur_phi = 0
cur_theta = -pi/2 #Beginning at south pole
cur_theta = -pi/2 # Beginning at south pole
while abs(cur_phi) <= abs(max_phi):
#Coordinate Transformation sphere->rect
# Coordinate Transformation sphere->rect
px = props.radius * cos(cur_theta) * cos(cur_phi)
py = props.radius * cos(cur_theta) * sin(cur_phi)
pz = props.radius * sin(cur_theta)
verts.extend([px,py,pz,1])
verts.extend([px, py, pz, 1])
cur_theta += step_theta
cur_phi += step_phi
return verts
#make torus spiral
#-----------------------------------------------------------------------------
# make torus spiral
# ----------------------------------------------------------------------------
def make_spiral_torus(props, context):
#INPUT: turns, steps, inner_radius, curves_number, mul_height, dif_inner_radius, cycles
max_phi = 2*pi*props.turns * props.cycles #max angle in radian
step_phi = 2*pi/props.steps #Step of angle in radians between two vertices
if props.spiral_direction == 1: #flip direction
# INPUT: turns, steps, inner_radius, curves_number, mul_height, dif_inner_radius, cycles
max_phi = 2*pi*props.turns * props.cycles # max angle in radian
step_phi = 2*pi/props.steps # Step of angle in radians between two vertices
if props.spiral_direction == 'CLOCKWISE': # flip direction
step_phi *= -1
max_phi *= -1
step_theta = (2*pi / props.turns) / props.steps
@ -133,24 +136,24 @@ def make_spiral_torus(props, context):
step_z = props.dif_z / (props.steps * props.turns)
verts = []
cur_phi = 0 #Inner Ring Radius Angle
cur_theta = 0 #Ring Radius Angle
cur_phi = 0 # Inner Ring Radius Angle
cur_theta = 0 # Ring Radius Angle
cur_rad = props.radius
cur_inner_rad = props.inner_radius
cur_z = 0
n_cycle = 0
while abs(cur_phi) <= abs(max_phi):
#Torus Coordinates -> Rect
px = ( cur_rad + cur_inner_rad * cos(cur_phi) ) * cos(props.curves_number * cur_theta)
py = ( cur_rad + cur_inner_rad * cos(cur_phi) ) * sin(props.curves_number * cur_theta)
# Torus Coordinates -> Rect
px = (cur_rad + cur_inner_rad * cos(cur_phi)) * cos(props.curves_number * cur_theta)
py = (cur_rad + cur_inner_rad * cos(cur_phi)) * sin(props.curves_number * cur_theta)
pz = cur_inner_rad * sin(cur_phi) + cur_z
verts.extend([px,py,pz,1])
verts.extend([px, py, pz, 1])
if props.touch == True and cur_phi >= n_cycle * 2*pi:
step_z = ( (n_cycle+1) * props.dif_inner_radius + props.inner_radius ) * 2 / (props.steps * props.turns)
if props.touch and cur_phi >= n_cycle * 2*pi:
step_z = ((n_cycle+1) * props.dif_inner_radius + props.inner_radius) * 2 / (props.steps * props.turns)
n_cycle += 1
cur_theta += step_theta
@ -160,55 +163,72 @@ def make_spiral_torus(props, context):
cur_z += step_z
return verts
#-----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
def draw_curve(props, context):
if props.spiral_type == 1:
if props.spiral_type == 'ARCH':
verts = make_spiral(props, context)
if props.spiral_type == 2:
if props.spiral_type == 'LOG':
verts = make_spiral(props, context)
if props.spiral_type == 3:
if props.spiral_type == 'SPHERE':
verts = make_spiral_spheric(props, context)
if props.spiral_type == 4:
if props.spiral_type == 'TORUS':
verts = make_spiral_torus(props, context)
curve_data = bpy.data.curves.new(name='Spiral', type='CURVE')
curve_data.dimensions = '3D'
spline = curve_data.splines.new(type=props.curve_type)
'''
if props.curve_type == 0:
spline = curve_data.splines.new(type='POLY')
elif props.curve_type == 1:
spline = curve_data.splines.new(type='NURBS')
spline.points.add( len(verts)*0.25-1 )
#Add only one quarter of points as elements in verts, because verts looks like: "x,y,z,?,x,y,z,?,x,..."
'''
spline.points.add(len(verts)*0.25-1)
# Add only one quarter of points as elements in verts, because verts looks like: "x,y,z,?,x,y,z,?,x,..."
spline.points.foreach_set('co', verts)
new_obj = object_data_add(context, curve_data)
class spirals(Operator):
class CURVE_OT_spirals(Operator):
bl_idname = "curve.spirals"
bl_label = "Spirals"
bl_options = {'REGISTER','UNDO', 'PRESET'}
#UNDO needed for operator redo and therefore also to let the addobjecthelp appear!!!
bl_description = "adds different types of spirals"
bl_label = "Add Curve: Spirals"
bl_options = {'REGISTER', 'UNDO'}
# UNDO needed for operator redo and therefore also to let the addobjecthelp appear!!!
bl_description = "Create different types of spirals"
spiral_type = EnumProperty(items=[('ARCH', "Archemedian", "Archemedian"),
("LOG", "Logarithmic", "Logarithmic"),
("SPHERE", "Spheric", "Spheric"),
("TORUS", "Torus", "Torus")],
default='ARCH',
name="Spiral Type",
description="Type of spiral to add")
curve_type = EnumProperty(items=[('POLY', "Poly", "PolyLine"),
("NURBS", "NURBS", "NURBS")],
default='POLY',
name="Curve Type",
description="Type of spline to use")
spiral_direction = EnumProperty(items=[('COUNTER_CLOCKWISE', "Counter Clockwise", "Wind in a counter clockwise direction"),
("CLOCKWISE", "Clockwise", "Wind in a clockwise direction")],
default='COUNTER_CLOCKWISE',
name="Spiral Direction",
description="Direction of winding")
spiral_type = IntProperty(default=1, min=1, max=4, description="1:archemedian, 2:logarithmic, 3:spheric, 4:torus")
curve_type = IntProperty(default=0, min=0, max=1, description="0:Poly, 1:Nurb")
spiral_direction = IntProperty(default=0, min=0, max=1, description="0:counter-clockwise, 1:clockwise")
turns = IntProperty(default=1, min=1, max=1000, description="Length of Spiral in 360 deg")
steps = IntProperty(default=24, min=2, max=1000, description="Number of Vertices per turn")
radius = FloatProperty(default=1.00, min=0.00, max=100.00, description="radius for first turn")
dif_z = FloatProperty(default=0, min=-10.00, max=100.00, description="increase in z axis per turn")
#needed for 1 and 2 spiral_type
#ARCHMEDEAN variables
# needed for 1 and 2 spiral_type
# ARCHMEDEAN variables
dif_radius = FloatProperty(default=0.00, min=-50.00, max=50.00, description="radius increment in each turn")
#step between turns(one turn equals 360 deg)
#LOG variables
# step between turns(one turn equals 360 deg)
# LOG variables
B_force = FloatProperty(default=1.00, min=0.00, max=30.00, description="factor of exponent")
#TORUS variables
# TORUS variables
inner_radius = FloatProperty(default=0.20, min=0.00, max=100, description="Inner Radius of Torus")
dif_inner_radius = FloatProperty(default=0, min=-10, max=100, description="Increase of inner Radius per Cycle")
dif_radius = FloatProperty(default=0, min=-10, max=100, description="Increase of Torus Radius per Cycle")
@ -218,47 +238,98 @@ class spirals(Operator):
def draw(self, context):
layout = self.layout
layout.prop(self, 'spiral_type', text="Spiral Type")
layout.prop(self, 'curve_type', text="Curve Type")
layout.prop(self, 'spiral_direction', text="Spiral Direction")
col = layout.column_flow(align=True)
col.label('Presets:')
row = col.row(align=True)
row.menu("OBJECT_MT_spiral_curve_presets", text=bpy.types.OBJECT_MT_spiral_curve_presets.bl_label)
row.operator("curve_extras.spiral_presets", text="", icon='ZOOMIN')
#op = row.operator("curve.spiral_presets", text="SAVE")
#op.name = bpy.types.OBJECT_MT_spiral_curve_presets.bl_label
op = row.operator("curve_extras.spiral_presets", text="", icon='ZOOMOUT')
op.remove_active = True
layout.prop(self, 'spiral_type')
layout.prop(self, 'curve_type')
layout.prop(self, 'spiral_direction')
layout.label(text="Spiral Parameters:")
layout.prop(self, 'turns', text = "Turns")
layout.prop(self, 'steps', text = "Steps")
layout.prop(self, 'turns', text="Turns")
layout.prop(self, 'steps', text="Steps")
box = layout.box()
if self.spiral_type == 1:
box.prop(self, 'dif_radius', text = "Radius Growth")
box.prop(self, 'radius', text = "Radius")
box.prop(self, 'dif_z', text = "Height")
if self.spiral_type == 2:
box.prop(self, 'radius', text = "Radius")
box.prop(self, 'B_force', text = "Expansion Force")
box.prop(self, 'dif_z', text = "Height")
if self.spiral_type == 3:
box.prop(self, 'radius', text = "Radius")
if self.spiral_type == 4:
box.prop(self, 'cycles', text = "Number of Cycles")
if self.spiral_type == 'ARCH':
box.prop(self, 'dif_radius', text="Radius Growth")
box.prop(self, 'radius', text="Radius")
box.prop(self, 'dif_z', text="Height")
if self.spiral_type == 'LOG':
box.prop(self, 'radius', text="Radius")
box.prop(self, 'B_force', text="Expansion Force")
box.prop(self, 'dif_z', text="Height")
if self.spiral_type == 'SPHERE':
box.prop(self, 'radius', text="Radius")
if self.spiral_type == 'TORUS':
box.prop(self, 'cycles', text="Number of Cycles")
if self.dif_inner_radius == 0 and self.dif_z == 0:
self.cycles = 1
box.prop(self, 'radius', text = "Radius")
box.prop(self, 'radius', text="Radius")
if self.dif_z == 0:
box.prop(self, 'dif_z', text = "Height per Cycle")
box.prop(self, 'dif_z', text="Height per Cycle")
else:
box2 = box.box()
box2.prop(self, 'dif_z', text = "Height per Cycle")
box2.prop(self, 'touch', text = "Make Snail")
box.prop(self, 'inner_radius', text = "Inner Radius")
box.prop(self, 'curves_number', text = "Curves Number")
box.prop(self, 'dif_radius', text = "Increase of Torus Radius")
box.prop(self, 'dif_inner_radius', text = "Increase of Inner Radius")
box2.prop(self, 'dif_z', text="Height per Cycle")
box2.prop(self, 'touch', text="Make Snail")
box.prop(self, 'inner_radius', text="Inner Radius")
box.prop(self, 'curves_number', text="Curves Number")
box.prop(self, 'dif_radius', text="Increase of Torus Radius")
box.prop(self, 'dif_inner_radius', text="Increase of Inner Radius")
@classmethod
def poll(cls, context):
#method called by blender to check if the operator can be run
return context.scene != None
# method called by blender to check if the operator can be run
return context.scene is not None
def execute(self, context):
time_start = time.time()
draw_curve(self, context)
print("Drawing Spiral Finished: %.4f sec", time.time() - time_start)
print("Drawing Spiral Finished: %.4f sec" % (time.time() - time_start))
return {'FINISHED'}
class CURVE_EXTRAS_OT_spirals_presets(AddPresetBase, Operator):
'''Spirals Presets'''
bl_idname = "curve_extras.spiral_presets"
bl_label = "Spirals"
preset_menu = "OBJECT_MT_spiral_curve_presets"
preset_subdir = "curve_extras/curve.spirals"
preset_defines = [
"op = bpy.context.active_operator",
]
preset_values = [
"op.spiral_type",
"op.curve_type",
"op.spiral_direction",
"op.turns",
"op.steps",
"op.radius",
"op.dif_z",
"op.dif_radius",
"op.B_force",
"op.inner_radius",
"op.dif_inner_radius",
"op.cycles",
"op.curves_number",
"op.touch",
]
class OBJECT_MT_spiral_curve_presets(Menu):
'''Presets for curve.spiral.'''
bl_label = "Spiral Curve Presets"
bl_idname = "OBJECT_MT_spiral_curve_presets"
preset_subdir = "curve_extras/curve.spirals"
preset_operator = "script.execute_preset"
draw = bpy.types.Menu.draw_preset
if __name__ == "__main__":
bpy.utils.register_module(__name__)

View File

@ -36,14 +36,14 @@ bl_info = {
import bpy
from bpy.props import (
BoolProperty,
EnumProperty,
FloatProperty,
EnumProperty,
FloatProperty,
IntProperty
)
from math import (
sin,
cos,
pi,
cos,
pi,
sqrt
)
from mathutils import *
@ -65,28 +65,28 @@ def gcd(a, b):
####################### Knot Definitions ###############################
########################################################################
def Torus_Knot(self, linkIndex=0):
p = self.torus_p # revolution count (around the torus center)
q = self.torus_q # spin count (around the torus tube)
p = self.torus_p # revolution count (around the torus center)
q = self.torus_q # spin count (around the torus tube)
N = self.torus_res # curve resolution (number of control points)
N = self.torus_res # curve resolution (number of control points)
# use plus options only when they are enabled
if self.options_plus:
u = self.torus_u # p multiplier
v = self.torus_v # q multiplier
h = self.torus_h # height (scale along Z)
s = self.torus_s # torus scale (radii scale factor)
else: # don't use plus settings
u = self.torus_u # p multiplier
v = self.torus_v # q multiplier
h = self.torus_h # height (scale along Z)
s = self.torus_s # torus scale (radii scale factor)
else: # don't use plus settings
u = 1
v = 1
h = 1
s = 1
R = self.torus_R * s # major radius (scaled)
r = self.torus_r * s # minor radius (scaled)
R = self.torus_R * s # major radius (scaled)
r = self.torus_r * s # minor radius (scaled)
# number of decoupled links when (p,q) are NOT co-primes
links = gcd(p,q) # = 1 when (p,q) are co-primes
links = gcd(p, q) # = 1 when (p,q) are co-primes
# parametrized angle increment (cached outside of the loop for performance)
# NOTE: the total angle is divided by number of decoupled links to ensure
@ -95,17 +95,17 @@ def Torus_Knot(self, linkIndex=0):
# link phase : each decoupled link is phased equally around the torus center
# NOTE: linkIndex value is in [0, links-1]
linkPhase = 2*pi/q * linkIndex # = 0 when there is just ONE link
linkPhase = 2*pi/q * linkIndex # = 0 when there is just ONE link
# user defined phasing
if self.options_plus:
rPhase = self.torus_rP # user defined revolution phase
sPhase = self.torus_sP # user defined spin phase
else: # don't use plus settings
rPhase = self.torus_rP # user defined revolution phase
sPhase = self.torus_sP # user defined spin phase
else: # don't use plus settings
rPhase = 0
sPhase = 0
rPhase += linkPhase # total revolution phase of the current link
rPhase += linkPhase # total revolution phase of the current link
if DEBUG:
print("")
@ -117,16 +117,18 @@ def Torus_Knot(self, linkIndex=0):
print("link phase = %.2f rad" % linkPhase)
# flip directions ? NOTE: flipping both is equivalent to no flip
if self.flip_p: p*=-1
if self.flip_q: q*=-1
if self.flip_p:
p *= -1
if self.flip_q:
q *= -1
# create the 3D point array for the current link
newPoints = []
for n in range(N-1):
# t = 2*pi / links * n/(N-1) with: da = 2*pi/links/(N-1) => t = n * da
# t = 2*pi / links * n/(N-1) with: da = 2*pi/links/(N-1) => t = n * da
t = n * da
theta = p*t*u + rPhase # revolution angle
phi = q*t*v + sPhase # spin angle
theta = p*t*u + rPhase # revolution angle
phi = q*t*v + sPhase # spin angle
x = (R + r*cos(phi)) * cos(theta)
y = (R + r*cos(phi)) * sin(theta)
@ -134,7 +136,7 @@ def Torus_Knot(self, linkIndex=0):
# append 3D point
# NOTE : the array is adjusted later as needed to 4D for POLY and NURBS
newPoints.append([x,y,z])
newPoints.append([x, y, z])
return newPoints
@ -142,7 +144,7 @@ def Torus_Knot(self, linkIndex=0):
# Calculate the align matrix for the new object (based on user preferences)
def align_matrix(self, context):
if self.absolute_location:
loc = Matrix.Translation(Vector((0,0,0)))
loc = Matrix.Translation(Vector((0, 0, 0)))
else:
loc = Matrix.Translation(context.scene.cursor_location)
@ -161,7 +163,7 @@ def align_matrix(self, context):
# ------------------------------------------------------------------------------
# Set curve BEZIER handles to auto
def setBezierHandles(obj, mode = 'AUTOMATIC'):
def setBezierHandles(obj, mode='AUTOMATIC'):
scene = bpy.context.scene
if obj.type != 'CURVE':
return
@ -174,7 +176,7 @@ def setBezierHandles(obj, mode = 'AUTOMATIC'):
# ------------------------------------------------------------------------------
# Convert array of vert coordinates to points according to spline type
def vertsToPoints(Verts, splineType):
# main vars
# main vars
vertArray = []
# array for BEZIER spline output (V3)
@ -187,8 +189,8 @@ def vertsToPoints(Verts, splineType):
for v in Verts:
vertArray += v
if splineType == 'NURBS':
vertArray.append(1) # for NURBS w=1
else: # for POLY w=0
vertArray.append(1) # for NURBS w=1
else: # for POLY w=0
vertArray.append(0)
return vertArray
@ -196,7 +198,7 @@ def vertsToPoints(Verts, splineType):
# ------------------------------------------------------------------------------
# Create the Torus Knot curve and object and add it to the scene
def create_torus_knot(self, context):
# pick a name based on (p,q) parameters
# pick a name based on (p,q) parameters
aName = "Torus Knot %i x %i" % (self.torus_p, self.torus_q)
# create curve
@ -208,12 +210,12 @@ def create_torus_knot(self, context):
# create torus knot link(s)
if self.multiple_links:
links = gcd(self.torus_p, self.torus_q);
links = gcd(self.torus_p, self.torus_q)
else:
links = 1;
links = 1
for l in range(links):
# get vertices for the current link
# get vertices for the current link
verts = Torus_Knot(self, l)
# output splineType 'POLY' 'NURBS' or 'BEZIER'
@ -255,10 +257,10 @@ def create_torus_knot(self, context):
# set object in the scene
scene = bpy.context.scene
scene.objects.link(new_obj) # place in active scene
new_obj.select = True # set as selected
scene.objects.link(new_obj) # place in active scene
new_obj.select = True # set as selected
scene.objects.active = new_obj # set as active
new_obj.matrix_world = self.align_matrix # apply matrix
new_obj.matrix_world = self.align_matrix # apply matrix
# set BEZIER handles
if splineType == 'BEZIER':
@ -269,28 +271,28 @@ def create_torus_knot(self, context):
# ------------------------------------------------------------------------------
# Create materials to be assigned to each TK link
def addLinkColors(self, curveData):
# some predefined colors for the torus knot links
# some predefined colors for the torus knot links
colors = []
if self.colorSet == "1": # RGBish
colors += [ [0.0, 0.0, 1.0] ]
colors += [ [0.0, 1.0, 0.0] ]
colors += [ [1.0, 0.0, 0.0] ]
colors += [ [1.0, 1.0, 0.0] ]
colors += [ [0.0, 1.0, 1.0] ]
colors += [ [1.0, 0.0, 1.0] ]
colors += [ [1.0, 0.5, 0.0] ]
colors += [ [0.0, 1.0, 0.5] ]
colors += [ [0.5, 0.0, 1.0] ]
else: # RainBow
colors += [ [0.0, 0.0, 1.0] ]
colors += [ [0.0, 0.5, 1.0] ]
colors += [ [0.0, 1.0, 1.0] ]
colors += [ [0.0, 1.0, 0.5] ]
colors += [ [0.0, 1.0, 0.0] ]
colors += [ [0.5, 1.0, 0.0] ]
colors += [ [1.0, 1.0, 0.0] ]
colors += [ [1.0, 0.5, 0.0] ]
colors += [ [1.0, 0.0, 0.0] ]
if self.colorSet == "1": # RGBish
colors += [[0.0, 0.0, 1.0]]
colors += [[0.0, 1.0, 0.0]]
colors += [[1.0, 0.0, 0.0]]
colors += [[1.0, 1.0, 0.0]]
colors += [[0.0, 1.0, 1.0]]
colors += [[1.0, 0.0, 1.0]]
colors += [[1.0, 0.5, 0.0]]
colors += [[0.0, 1.0, 0.5]]
colors += [[0.5, 0.0, 1.0]]
else: # RainBow
colors += [[0.0, 0.0, 1.0]]
colors += [[0.0, 0.5, 1.0]]
colors += [[0.0, 1.0, 1.0]]
colors += [[0.0, 1.0, 0.5]]
colors += [[0.0, 1.0, 0.0]]
colors += [[0.5, 1.0, 0.0]]
colors += [[1.0, 1.0, 0.0]]
colors += [[1.0, 0.5, 0.0]]
colors += [[1.0, 0.0, 0.0]]
me = curveData
mat_offset = len(me.materials)
@ -301,17 +303,19 @@ def addLinkColors(self, curveData):
matListNames = bpy.data.materials.keys()
# create the material
if matName not in matListNames:
if DEBUG: print("Creating new material : %s" % matName)
if DEBUG:
print("Creating new material : %s" % matName)
mat = bpy.data.materials.new(matName)
else:
if DEBUG: print("Material %s already exists" % matName)
if DEBUG:
print("Material %s already exists" % matName)
mat = bpy.data.materials[matName]
# set material color
if self.options_plus and self.random_colors:
mat.diffuse_color = random(), random(), random()
else:
cID = i % (len(colors)) # cycle through predefined colors
cID = i % (len(colors)) # cycle through predefined colors
mat.diffuse_color = colors[cID]
if self.options_plus:
@ -332,7 +336,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
bl_context = "object"
def mode_update_callback(self, context):
# keep the equivalent radii sets (R,r)/(eR,iR) in sync
# keep the equivalent radii sets (R,r)/(eR,iR) in sync
if self.mode == 'EXT_INT':
self.torus_eR = self.torus_R + self.torus_r
self.torus_iR = self.torus_R - self.torus_r
@ -340,19 +344,19 @@ class torus_knot_plus(Operator, AddObjectHelper):
# align_matrix for the invoke
align_matrix = None
#### GENERAL options
# GENERAL options
options_plus = BoolProperty(
name="Extra Options",
default=False,
description="Show more options (the plus part)",
)
absolute_location = BoolProperty(
name= "Absolute Location",
name="Absolute Location",
default=False,
description="Set absolute location instead of relative to 3D cursor",
)
#### COLOR options
# COLOR options
use_colors = BoolProperty(
name="Use Colors",
default=False,
@ -360,7 +364,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
)
colorSet = EnumProperty(
name="Color Set",
items= (('1', 'RGBish', 'RGBsish ordered colors'),
items=(('1', 'RGBish', 'RGBsish ordered colors'),
('2', 'Rainbow', 'Rainbow ordered colors')),
)
random_colors = BoolProperty(
@ -375,7 +379,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
description="Color saturation",
)
#### SURFACE Options
# SURFACE Options
geo_surface = BoolProperty(
name="Surface",
default=True,
@ -407,7 +411,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
description="Offset the surface relative to the curve"
)
#### TORUS KNOT Options
# TORUS KNOT Options
torus_p = IntProperty(
name="p",
default=2,
@ -460,7 +464,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
description="Phase spins by this radian amount"
)
#### TORUS DIMENSIONS options
# TORUS DIMENSIONS options
mode = EnumProperty(
name="Torus Dimensions",
items=(("MAJOR_MINOR", "Major/Minor",
@ -514,7 +518,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
description="Scale along the local Z axis"
)
#### CURVE options
# CURVE options
torus_res = IntProperty(
name="Curve Resolution",
default=100,
@ -573,7 +577,8 @@ class torus_knot_plus(Operator, AddObjectHelper):
links = gcd(self.torus_p, self.torus_q)
info = "Multiple Links"
if links > 1: info += " ( " + str(links) + " )"
if links > 1:
info += " ( " + str(links) + " )"
box.prop(self, 'multiple_links', text=info)
if self.options_plus:
@ -596,7 +601,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
col = box.column(align=True)
col.prop(self, "torus_r")
else: # EXTERIOR-INTERIOR
else: # EXTERIOR-INTERIOR
col = box.column(align=True)
col.prop(self, "torus_eR")
@ -617,7 +622,7 @@ class torus_knot_plus(Operator, AddObjectHelper):
col.label(text="Output Curve Type:")
col.row().prop(self, 'outputType', expand=True)
depends=box.column()
depends = box.column()
depends.prop(self, 'torus_res')
# deactivate the "curve resolution" if "adaptive resolution" is enabled
depends.enabled = not self.adaptive_resolution
@ -658,29 +663,31 @@ class torus_knot_plus(Operator, AddObjectHelper):
##### POLL #####
@classmethod
def poll(cls, context):
if context.mode != "OBJECT": return False
return context.scene != None
if context.mode != "OBJECT":
return False
return context.scene is not None
##### EXECUTE #####
def execute(self, context):
if self.mode == 'EXT_INT':
# adjust the equivalent radii pair : (R,r) <=> (eR,iR)
# adjust the equivalent radii pair : (R,r) <=> (eR,iR)
self.torus_R = (self.torus_eR + self.torus_iR)*0.5
self.torus_r = (self.torus_eR - self.torus_iR)*0.5
if self.adaptive_resolution:
# adjust curve resolution automatically based on (p,q,R,r) values
# adjust curve resolution automatically based on (p,q,R,r) values
p = self.torus_p
q = self.torus_q
R = self.torus_R
r = self.torus_r
links = gcd(p,q)
links = gcd(p, q)
# get an approximate length of the whole TK curve
maxTKLen = 2*pi*sqrt(p*p*(R+r)*(R+r) + q*q*r*r) # upper bound approximation
minTKLen = 2*pi*sqrt(p*p*(R-r)*(R-r) + q*q*r*r) # lower bound approximation
avgTKLen = (minTKLen + maxTKLen)/2 # average approximation
if DEBUG: print("Approximate average TK length = %.2f" % avgTKLen)
self.torus_res = max(3, avgTKLen/links * 8) # x N factor = control points per unit length
maxTKLen = 2*pi*sqrt(p*p*(R+r)*(R+r) + q*q*r*r) # upper bound approximation
minTKLen = 2*pi*sqrt(p*p*(R-r)*(R-r) + q*q*r*r) # lower bound approximation
avgTKLen = (minTKLen + maxTKLen)/2 # average approximation
if DEBUG:
print("Approximate average TK length = %.2f" % avgTKLen)
self.torus_res = max(3, avgTKLen/links * 8) # x N factor = control points per unit length
# update align matrix
self.align_matrix = align_matrix(self, context)

View File

@ -30,6 +30,7 @@ from bpy.props import (
)
from bpy.types import Operator
from bpy.utils import register_class, unregister_class
class MakeSurfaceWedge(Operator):
@ -58,6 +59,10 @@ class MakeSurfaceWedge(Operator):
min=1,
max=500)
@classmethod
def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
# variables
size = self.size
@ -66,7 +71,7 @@ class MakeSurfaceWedge(Operator):
# add a surface Plane
bpy.ops.object.add_surface_plane()
# save some time, by getting instant acces to those values.
ao = bpy.context.active_object
ao = context.active_object
point = ao.data.splines[0].points
# rotate 90 degrees on the z axis
ao.rotation_euler[0] = 0.0
@ -77,10 +82,10 @@ class MakeSurfaceWedge(Operator):
bpy.ops.curve.select_all(action='DESELECT')
# select points 0 and 1, and extrudde them
# declaring ao and point again seems necesary...
ao = bpy.context.active_object
ao = context.active_object
point = ao.data.splines[0].points
point[0].select = True
ao = bpy.context.active_object
ao = context.active_object
point = ao.data.splines[0].points
point[1].select = True
bpy.ops.curve.extrude()
@ -102,14 +107,14 @@ class MakeSurfaceWedge(Operator):
# get origin to geometry.
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='MEDIAN')
# change name
bpy.context.active_object.name = 'SurfaceWedge'
context.active_object.name = 'SurfaceWedge'
# get the wedge to the 3d cursor.
bpy.context.active_object.location = bpy.context.scene.cursor_location
context.active_object.location = context.scene.cursor_location
bpy.ops.transform.resize(value=(size, size, size))
# adjust resolution in u and v direction
bpy.context.active_object.data.resolution_u = res_u
bpy.context.active_object.data.resolution_v = res_v
context.active_object.data.resolution_u = res_u
context.active_object.data.resolution_v = res_v
return{'FINISHED'}
@ -141,6 +146,10 @@ class MakeSurfaceCone(Operator):
min=1,
max=500)
@classmethod
def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
size = self.size
res_u = self.res_u
@ -149,8 +158,8 @@ class MakeSurfaceCone(Operator):
# add basemesh, a nurbs torus
bpy.ops.surface.primitive_nurbs_surface_torus_add(location=(0, 0, 0))
# get active object and active object name
ao = bpy.context.active_object
aoname = bpy.context.active_object.name
ao = context.active_object
aoname = context.active_object.name
# go to edit mode
bpy.ops.object.mode_set(mode='EDIT')
# deselect all
@ -181,18 +190,18 @@ class MakeSurfaceCone(Operator):
bpy.ops.object.editmode_toggle()
bpy.ops.object.editmode_toggle()
# change name
bpy.context.active_object.name = 'SurfaceCone'
context.active_object.name = 'SurfaceCone'
# go back to object mode
bpy.ops.object.editmode_toggle()
# bring object to cursor
bpy.ops.object.mode_set(mode='OBJECT')
bpy.context.active_object.location = bpy.context.scene.cursor_location
context.active_object.location = context.scene.cursor_location
# adjust size
bpy.ops.transform.resize(value=(size, size, size))
# adjust resolution in u and v direction
bpy.context.active_object.data.resolution_u = res_u
bpy.context.active_object.data.resolution_v = res_v
context.active_object.data.resolution_u = res_u
context.active_object.data.resolution_v = res_v
return{'FINISHED'}
@ -222,6 +231,10 @@ class MakeSurfaceStar(Operator):
min=1,
max=500)
@classmethod
def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
size = self.size
res_u = self.res_u
@ -231,7 +244,7 @@ class MakeSurfaceStar(Operator):
bpy.ops.surface.primitive_nurbs_surface_circle_add(location=(0, 0, 0))
# we got 8 points, we need 40 points.
# get active object
ao = bpy.context.active_object
ao = context.active_object
# enter edtimode
bpy.ops.object.mode_set(mode='EDIT')
# deselect all
@ -261,7 +274,7 @@ class MakeSurfaceStar(Operator):
(0.1545085906982422, -0.4755282402038574, 0.25, 1.0),
(0.8090166449546814, -0.5877856612205505, 0.2499999850988388, 1.0)]
for i in range(0, 10):
bpy.context.active_object.data.splines[0].points[i].co = ListOfCoords[i]
context.active_object.data.splines[0].points[i].co = ListOfCoords[i]
# now select all, and subdivide till 40 points is reached:
bpy.ops.curve.select_all(action='SELECT')
@ -280,15 +293,15 @@ class MakeSurfaceStar(Operator):
# origin to geometry
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='MEDIAN')
# get object to 3d cursor
bpy.context.active_object.location = bpy.context.scene.cursor_location
context.active_object.location = context.scene.cursor_location
# change name
ao.name = 'SurfaceStar'
# adjust size
bpy.ops.transform.resize(value=(size, size, size))
# adjust resolution in u and v direction
bpy.context.active_object.data.resolution_u = res_u
bpy.context.active_object.data.resolution_v = res_v
context.active_object.data.resolution_u = res_u
context.active_object.data.resolution_v = res_v
return{'FINISHED'}
@ -318,6 +331,10 @@ class MakeSurfacePlane(Operator):
min=1,
max=500)
@classmethod
def poll(cls, context):
return context.mode == 'OBJECT'
def execute(self, context):
size = self.size
res_u = self.res_u
@ -326,34 +343,34 @@ class MakeSurfacePlane(Operator):
bpy.ops.surface.primitive_nurbs_surface_surface_add() # add the base mesh, a NURBS Surface
bpy.ops.transform.resize(value=(1, 1, 0.0001), constraint_axis=(False, False, True)) # make it flat
ao = bpy.context.active_object.name # get the active object' s name
ao = context.active_object.name # get the active object' s name
# added surface has 16 points
# deleting points to get plane shape.
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.curve.select_all(action='DESELECT')
bpy.context.active_object.data.splines[0].points[0].select = True
bpy.context.active_object.data.splines[0].points[1].select = True
bpy.context.active_object.data.splines[0].points[2].select = True
bpy.context.active_object.data.splines[0].points[3].select = True
context.active_object.data.splines[0].points[0].select = True
context.active_object.data.splines[0].points[1].select = True
context.active_object.data.splines[0].points[2].select = True
context.active_object.data.splines[0].points[3].select = True
bpy.ops.curve.delete(type='VERT')
bpy.context.active_object.data.splines[0].points[8].select = True
bpy.context.active_object.data.splines[0].points[9].select = True
bpy.context.active_object.data.splines[0].points[10].select = True
bpy.context.active_object.data.splines[0].points[11].select = True
context.active_object.data.splines[0].points[8].select = True
context.active_object.data.splines[0].points[9].select = True
context.active_object.data.splines[0].points[10].select = True
context.active_object.data.splines[0].points[11].select = True
bpy.ops.curve.delete(type='VERT')
bpy.context.active_object.data.splines[0].points[0].select = True
bpy.context.active_object.data.splines[0].points[4].select = True
context.active_object.data.splines[0].points[0].select = True
context.active_object.data.splines[0].points[4].select = True
bpy.ops.curve.delete(type='VERT')
bpy.context.active_object.data.splines[0].points[2].select = True
bpy.context.active_object.data.splines[0].points[5].select = True
context.active_object.data.splines[0].points[2].select = True
context.active_object.data.splines[0].points[5].select = True
bpy.ops.curve.delete(type='VERT')
# assigning name
bpy.context.active_object.name = 'SurfacePlane'
context.active_object.name = 'SurfacePlane'
# select all
bpy.ops.curve.select_all(action='SELECT')
# bringing origin to center:
@ -363,12 +380,12 @@ class MakeSurfacePlane(Operator):
bpy.ops.object.transform_apply(scale=True)
# bring object to 3d cursor.
bpy.ops.object.mode_set(mode='OBJECT')
bpy.context.active_object.location = bpy.context.scene.cursor_location
context.active_object.location = context.scene.cursor_location
bpy.ops.transform.resize(value=(size, size, size))
# adjust resolution in u and v direction
bpy.context.active_object.data.resolution_u = res_u
bpy.context.active_object.data.resolution_v = res_v
context.active_object.data.resolution_u = res_u
context.active_object.data.resolution_v = res_v
return{'FINISHED'}
@ -391,6 +408,10 @@ class SmoothXtimes(Operator):
default=1,
description='amount of smooths')
@classmethod
def poll(cls, context):
return context.mode == 'EDIT_SURFACE'
def execute(self, context):
# smooth times time(s).
times = self.times
@ -420,12 +441,12 @@ def SmoothXtimes_button(self, context):
def register():
bpy.utils.register_class(UserInterface)
bpy.utils.register_class(MakeSurfacePlane)
bpy.utils.register_class(MakeSurfaceCone)
bpy.utils.register_class(MakeSurfaceStar)
bpy.utils.register_class(MakeSurfaceWedge)
bpy.utils.register_class(SmoothXtimes)
register_class(UserInterface)
register_class(MakeSurfacePlane)
register_class(MakeSurfaceCone)
register_class(MakeSurfaceStar)
register_class(MakeSurfaceWedge)
register_class(SmoothXtimes)
bpy.types.INFO_MT_surface_add.append(Surface_plane_button)
bpy.types.INFO_MT_surface_add.append(Surface_cone_button)
bpy.types.INFO_MT_surface_add.append(Surface_star_button)
@ -434,12 +455,12 @@ def register():
def unregister():
bpy.utils.unregister_class(UserInterface)
bpy.utils.unregister_class(MakeSurfacePlane)
bpy.utils.unregister_class(MakeSurfaceCone)
bpy.utils.unregister_class(MakeSurfaceStar)
bpy.utils.unregister_class(MakeSurfaceWedge)
bpy.utils.unregister_class(SmoothXtimes)
unregister_class(UserInterface)
unregister_class(MakeSurfacePlane)
unregister_class(MakeSurfaceCone)
unregister_class(MakeSurfaceStar)
unregister_class(MakeSurfaceWedge)
unregister_class(SmoothXtimes)
bpy.types.INFO_MT_surface_add.remove(Surface_plane_button)
bpy.types.INFO_MT_surface_add.remove(Surface_cone_button)
bpy.types.INFO_MT_surface_add.remove(Surface_star_button)