forked from bartvdbraak/blender
String fix and a bunch of PEP8 issues I had collected in the meanwhile.
This commit is contained in:
parent
19c0a169b8
commit
648122b1a2
@ -22,19 +22,20 @@ import bpy
|
||||
|
||||
EPS_SPLINE_DIV = 15.0 # remove doubles is ~15th the length of the spline
|
||||
|
||||
|
||||
def get_hub(co, _hubs, EPS_SPLINE):
|
||||
|
||||
|
||||
if 1:
|
||||
for hub in _hubs.values():
|
||||
if (hub.co - co).length < EPS_SPLINE:
|
||||
return hub
|
||||
|
||||
|
||||
key = co.toTuple(3)
|
||||
hub = _hubs[key] = Hub(co, key, len(_hubs))
|
||||
return hub
|
||||
else:
|
||||
pass
|
||||
|
||||
|
||||
'''
|
||||
key = co.toTuple(3)
|
||||
try:
|
||||
@ -43,10 +44,11 @@ def get_hub(co, _hubs, EPS_SPLINE):
|
||||
hub = _hubs[key] = Hub(co, key, len(_hubs))
|
||||
return hub
|
||||
'''
|
||||
|
||||
|
||||
|
||||
class Hub(object):
|
||||
__slots__ = "co", "key", "index", "links"
|
||||
|
||||
def __init__(self, co, key, index):
|
||||
self.co = co.copy()
|
||||
self.key = key
|
||||
@ -55,10 +57,10 @@ class Hub(object):
|
||||
|
||||
def get_weight(self):
|
||||
f = 0.0
|
||||
|
||||
|
||||
for hub_other in self.links:
|
||||
f += (self.co - hub_other.co).length
|
||||
|
||||
|
||||
def replace(self, other):
|
||||
for hub in self.links:
|
||||
try:
|
||||
@ -67,8 +69,7 @@ class Hub(object):
|
||||
pass
|
||||
if other not in hub.links:
|
||||
hub.links.append(other)
|
||||
|
||||
|
||||
|
||||
def dist(self, other):
|
||||
return (self.co - other.co).length
|
||||
|
||||
@ -80,9 +81,8 @@ class Hub(object):
|
||||
if l_b is not self and l_b in self.links:
|
||||
# will give duplicates
|
||||
faces.append((self.index, l_a.index, l_b.index))
|
||||
|
||||
# now quads, check which links share 2 different verts
|
||||
# directly
|
||||
|
||||
# now quads, check which links share 2 different verts directly
|
||||
def validate_quad(face):
|
||||
if len(set(face)) != len(face):
|
||||
return False
|
||||
@ -90,41 +90,41 @@ class Hub(object):
|
||||
return False
|
||||
if hub_ls[face[2]] in hub_ls[face[0]].links:
|
||||
return False
|
||||
|
||||
|
||||
if hub_ls[face[1]] in hub_ls[face[3]].links:
|
||||
return False
|
||||
if hub_ls[face[3]] in hub_ls[face[1]].links:
|
||||
return False
|
||||
|
||||
|
||||
return True
|
||||
|
||||
for i, l_a in enumerate(self.links):
|
||||
links_a = set([l.index for l in l_a.links])
|
||||
for j in range(i):
|
||||
l_b = self.links[j]
|
||||
|
||||
|
||||
links_b = set([l.index for l in l_b.links])
|
||||
|
||||
|
||||
isect = links_a.intersection(links_b)
|
||||
if len(isect) == 2:
|
||||
isect = list(isect)
|
||||
|
||||
|
||||
# check there are no diagonal lines
|
||||
face = (isect[0], l_a.index, isect[1], l_b.index)
|
||||
if validate_quad(face):
|
||||
|
||||
|
||||
faces.append(face)
|
||||
|
||||
|
||||
return faces
|
||||
|
||||
|
||||
|
||||
class Spline:
|
||||
__slots__ = "points", "hubs", "length"
|
||||
|
||||
def __init__(self, points):
|
||||
self.points = points
|
||||
self.hubs = []
|
||||
|
||||
|
||||
# calc length
|
||||
f = 0.0
|
||||
co_prev = self.points[0]
|
||||
@ -136,46 +136,49 @@ class Spline:
|
||||
def link(self):
|
||||
if len(self.hubs) < 2:
|
||||
return
|
||||
|
||||
|
||||
edges = list(set([i for i, hub in self.hubs]))
|
||||
edges.sort()
|
||||
|
||||
edges_order = {}
|
||||
for i in edges:
|
||||
edges_order[i] = []
|
||||
|
||||
|
||||
|
||||
|
||||
# self.hubs.sort()
|
||||
for i, hub in self.hubs:
|
||||
edges_order[i].append(hub)
|
||||
|
||||
|
||||
hubs_order = []
|
||||
for i in edges:
|
||||
ls = edges_order[i]
|
||||
edge_start = self.points[i]
|
||||
ls.sort(key=lambda hub: (hub.co - edge_start).length)
|
||||
hubs_order.extend(ls)
|
||||
|
||||
|
||||
# Now we have the order, connect the hubs
|
||||
hub_prev = hubs_order[0]
|
||||
|
||||
|
||||
for hub in hubs_order[1:]:
|
||||
hub.links.append(hub_prev)
|
||||
hub_prev.links.append(hub)
|
||||
hub_prev = hub
|
||||
|
||||
|
||||
def get_points(stroke):
|
||||
return [point.co.copy() for point in stroke.points]
|
||||
|
||||
|
||||
def get_splines(gp):
|
||||
for l in gp.layers:
|
||||
if l.active: # XXX - should be layers.active
|
||||
break
|
||||
|
||||
|
||||
frame = l.active_frame
|
||||
|
||||
|
||||
return [Spline(get_points(stroke)) for stroke in frame.strokes]
|
||||
|
||||
|
||||
def xsect_spline(sp_a, sp_b, _hubs):
|
||||
from Mathutils import LineIntersect
|
||||
from Mathutils import MidpointVecs
|
||||
@ -191,7 +194,7 @@ def xsect_spline(sp_a, sp_b, _hubs):
|
||||
# print(pt_a, pt_a_prev, pt_b, pt_b_prev)
|
||||
xsect = LineIntersect(pt_a, pt_a_prev, pt_b, pt_b_prev)
|
||||
if xsect is not None:
|
||||
if (xsect[0]-xsect[1]).length <= EPS_SPLINE:
|
||||
if (xsect[0] - xsect[1]).length <= EPS_SPLINE:
|
||||
f = ClosestPointOnLine(xsect[1], pt_a, pt_a_prev)[1]
|
||||
# if f >= 0.0-EPS_SPLINE and f <= 1.0+EPS_SPLINE: # for some reason doesnt work so well, same below
|
||||
if f >= 0.0 and f <= 1.0:
|
||||
@ -206,90 +209,90 @@ def xsect_spline(sp_a, sp_b, _hubs):
|
||||
sp_b.hubs.append((b, hub))
|
||||
|
||||
pt_b_prev = pt_b
|
||||
|
||||
|
||||
pt_a_prev = pt_a
|
||||
|
||||
|
||||
def calculate(gp):
|
||||
splines = get_splines(gp)
|
||||
_hubs = {}
|
||||
|
||||
|
||||
for i, sp in enumerate(splines):
|
||||
for j, sp_other in enumerate(splines):
|
||||
if j<=i:
|
||||
if j <= i:
|
||||
continue
|
||||
|
||||
xsect_spline(sp, sp_other, _hubs)
|
||||
|
||||
|
||||
for sp in splines:
|
||||
sp.link()
|
||||
|
||||
|
||||
# remove these
|
||||
hubs_ls = [hub for hub in _hubs.values() if hub.index != -1]
|
||||
|
||||
|
||||
_hubs.clear()
|
||||
_hubs = None
|
||||
|
||||
|
||||
for i, hub in enumerate(hubs_ls):
|
||||
hub.index = i
|
||||
|
||||
|
||||
# Now we have connected hubs, write all edges!
|
||||
def order(i1, i2):
|
||||
if i1 > i2:
|
||||
return i2, i1
|
||||
return i1, i2
|
||||
|
||||
|
||||
edges = {}
|
||||
|
||||
|
||||
for hub in hubs_ls:
|
||||
i1 = hub.index
|
||||
for hub_other in hub.links:
|
||||
for hub_other in hub.links:
|
||||
i2 = hub_other.index
|
||||
edges[order(i1, i2)] = None
|
||||
|
||||
|
||||
verts = []
|
||||
edges = edges.keys()
|
||||
faces = []
|
||||
|
||||
|
||||
for hub in hubs_ls:
|
||||
verts.append(hub.co)
|
||||
faces.extend(hub.calc_faces(hubs_ls))
|
||||
|
||||
|
||||
# remove double faces
|
||||
faces = dict([(tuple(sorted(f)), f) for f in faces]).values()
|
||||
|
||||
|
||||
mesh = bpy.data.add_mesh("Retopo")
|
||||
mesh.from_pydata(verts, [], faces)
|
||||
|
||||
|
||||
scene = bpy.context.scene
|
||||
mesh.update()
|
||||
obj_new = bpy.data.add_object('MESH', "Torus")
|
||||
obj_new.data = mesh
|
||||
scene.objects.link(obj_new)
|
||||
|
||||
|
||||
return obj_new
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
scene = bpy.context.scene
|
||||
obj = bpy.context.object
|
||||
|
||||
|
||||
gp = None
|
||||
|
||||
|
||||
if obj:
|
||||
gp = obj.grease_pencil
|
||||
|
||||
|
||||
if not gp:
|
||||
gp = scene.grease_pencil
|
||||
|
||||
if not gp:
|
||||
raise Exception("no active grease pencil")
|
||||
|
||||
|
||||
obj_new = calculate(gp)
|
||||
|
||||
|
||||
scene.objects.active = obj_new
|
||||
obj_new.selected = True
|
||||
|
||||
|
||||
# nasty, recalc normals
|
||||
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
|
||||
bpy.ops.mesh.normals_make_consistent(inside=False)
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
import bpy
|
||||
|
||||
|
||||
def rna_idprop_ui_get(item, create=True):
|
||||
try:
|
||||
return item['_RNA_UI']
|
||||
@ -57,7 +58,7 @@ def rna_idprop_ui_prop_clear(item, prop):
|
||||
pass
|
||||
|
||||
|
||||
def draw(layout, context, context_member, use_edit = True):
|
||||
def draw(layout, context, context_member, use_edit=True):
|
||||
|
||||
def assign_props(prop, val, key):
|
||||
prop.path = context_member
|
||||
@ -69,7 +70,7 @@ def draw(layout, context, context_member, use_edit = True):
|
||||
pass
|
||||
|
||||
rna_item = eval("context." + context_member)
|
||||
|
||||
|
||||
# poll should really get this...
|
||||
if not rna_item:
|
||||
return
|
||||
@ -138,6 +139,7 @@ rna_property = StringProperty(name="Property Name",
|
||||
rna_min = FloatProperty(name="Min", default=0.0, precision=3)
|
||||
rna_max = FloatProperty(name="Max", default=1.0, precision=3)
|
||||
|
||||
|
||||
class WM_OT_properties_edit(bpy.types.Operator):
|
||||
'''Internal use (edit a property path)'''
|
||||
bl_idname = "wm.properties_edit"
|
||||
@ -206,15 +208,15 @@ class WM_OT_properties_edit(bpy.types.Operator):
|
||||
prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create
|
||||
if prop_ui:
|
||||
self.properties.min = prop_ui.get("min", -1000000000)
|
||||
self.properties.max = prop_ui.get("max", 1000000000)
|
||||
self.properties.description = prop_ui.get("description", "")
|
||||
self.properties.max = prop_ui.get("max", 1000000000)
|
||||
self.properties.description = prop_ui.get("description", "")
|
||||
|
||||
if 0:
|
||||
_message= "PyConsole, press Ctrl+D to unlock the BGE"
|
||||
_message = "PyConsole, press Ctrl+D to unlock the BGE"
|
||||
import sys
|
||||
|
||||
# evaluate commands in current namespace
|
||||
frame= sys._getframe()
|
||||
frame = sys._getframe()
|
||||
namespace = frame.f_globals.copy()
|
||||
namespace.update(frame.f_locals)
|
||||
|
||||
@ -252,7 +254,7 @@ class WM_OT_properties_add(bpy.types.Operator):
|
||||
i = 1
|
||||
while prop_new in names:
|
||||
prop_new = prop + str(i)
|
||||
i+=1
|
||||
i += 1
|
||||
|
||||
return prop_new
|
||||
|
||||
@ -261,6 +263,7 @@ class WM_OT_properties_add(bpy.types.Operator):
|
||||
item[property] = 1.0
|
||||
return ('FINISHED',)
|
||||
|
||||
|
||||
class WM_OT_properties_remove(bpy.types.Operator):
|
||||
'''Internal use (edit a property path)'''
|
||||
bl_idname = "wm.properties_remove"
|
||||
@ -273,4 +276,3 @@ class WM_OT_properties_remove(bpy.types.Operator):
|
||||
item = eval("context.%s" % self.properties.path)
|
||||
del item[self.properties.property]
|
||||
return ('FINISHED',)
|
||||
|
||||
|
@ -22,11 +22,13 @@ import bpy
|
||||
|
||||
language_id = 'python'
|
||||
|
||||
|
||||
def add_scrollback(text, text_type):
|
||||
for l in text.split('\n'):
|
||||
bpy.ops.console.scrollback_append(text=l.replace('\t', ' '),
|
||||
type=text_type)
|
||||
|
||||
|
||||
def get_console(console_id):
|
||||
'''
|
||||
helper function for console operators
|
||||
@ -70,6 +72,7 @@ def get_console(console_id):
|
||||
PROMPT = '>>> '
|
||||
PROMPT_MULTI = '... '
|
||||
|
||||
|
||||
def execute(context):
|
||||
sc = context.space_data
|
||||
|
||||
|
@ -25,19 +25,21 @@ import bpy
|
||||
|
||||
language_id = 'shell'
|
||||
|
||||
|
||||
def add_scrollback(text, text_type):
|
||||
for l in text.split('\n'):
|
||||
bpy.ops.console.scrollback_append(text=l.replace('\t', ' '),
|
||||
type=text_type)
|
||||
|
||||
|
||||
def shell_run(text):
|
||||
import subprocess
|
||||
val, output= subprocess.getstatusoutput(text)
|
||||
val, output = subprocess.getstatusoutput(text)
|
||||
|
||||
if not val:
|
||||
style= 'OUTPUT'
|
||||
style = 'OUTPUT'
|
||||
else:
|
||||
style= 'ERROR'
|
||||
style = 'ERROR'
|
||||
|
||||
add_scrollback(output, style)
|
||||
|
||||
@ -60,7 +62,7 @@ def execute(context):
|
||||
bpy.ops.console.history_append(text="", current_character=0,
|
||||
remove_duplicates=True)
|
||||
|
||||
sc.prompt = os.getcwd()+PROMPT
|
||||
sc.prompt = os.getcwd() + PROMPT
|
||||
return ('FINISHED',)
|
||||
|
||||
|
||||
@ -74,7 +76,6 @@ def banner(context):
|
||||
sc = context.space_data
|
||||
|
||||
shell_run("bash --version")
|
||||
sc.prompt = os.getcwd()+PROMPT
|
||||
sc.prompt = os.getcwd() + PROMPT
|
||||
|
||||
return ('FINISHED',)
|
||||
|
||||
|
@ -84,7 +84,7 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel):
|
||||
cloth = md.settings
|
||||
|
||||
split = layout.split()
|
||||
|
||||
|
||||
split.active = cloth_panel_enabled(md)
|
||||
|
||||
col = split.column()
|
||||
|
@ -69,12 +69,13 @@ class CONSOLE_MT_console(bpy.types.Menu):
|
||||
layout.operator("console.copy")
|
||||
layout.operator("console.paste")
|
||||
layout.menu("CONSOLE_MT_language")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
||||
class CONSOLE_MT_report(bpy.types.Menu):
|
||||
bl_label = "Report"
|
||||
|
||||
|
@ -61,9 +61,9 @@ class IMAGE_MT_view(bpy.types.Menu):
|
||||
layout.operator("image.view_selected")
|
||||
|
||||
layout.operator("image.view_all")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
@ -83,18 +83,18 @@ class INFO_MT_file(bpy.types.Menu):
|
||||
layout.operator("wm.save_mainfile", text="Save", icon='ICON_FILE_TICK')
|
||||
layout.operator_context = 'INVOKE_AREA'
|
||||
layout.operator("wm.save_as_mainfile", text="Save As...")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.userpref_show", text="User Preferences...", icon='ICON_PREFERENCES')
|
||||
layout.operator("wm.read_homefile", text="Load Factory Settings").factory = True
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator_context = 'INVOKE_AREA'
|
||||
layout.operator("wm.link_append", text="Link")
|
||||
layout.operator("wm.link_append", text="Append").link = False
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.menu("INFO_MT_file_import")
|
||||
|
@ -82,9 +82,9 @@ class NODE_MT_view(bpy.types.Menu):
|
||||
layout.separator()
|
||||
|
||||
layout.operator("node.view_all")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
@ -76,9 +76,9 @@ class OUTLINER_MT_view(bpy.types.Menu):
|
||||
|
||||
col.operator("outliner.show_one_level")
|
||||
col.operator("outliner.show_hierarchy")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
@ -109,10 +109,11 @@ class SEQUENCER_MT_view(bpy.types.Menu):
|
||||
layout.prop(st, "separate_color_preview")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
||||
class SEQUENCER_MT_select(bpy.types.Menu):
|
||||
bl_label = "Select"
|
||||
|
||||
@ -336,8 +337,8 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel):
|
||||
if not strip:
|
||||
return False
|
||||
|
||||
return strip.type in ('ADD','SUBTRACT','ALPHA_OVER','ALPHA_UNDER',
|
||||
'GAMMA_CROSS','MULTIPLY','OVER_DROP',
|
||||
return strip.type in ('ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
|
||||
'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
|
||||
'PLUGIN',
|
||||
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED')
|
||||
|
||||
|
@ -123,7 +123,6 @@ class TEXT_PT_find(bpy.types.Panel):
|
||||
row.prop(st, "find_all", text="All")
|
||||
|
||||
|
||||
|
||||
class TEXT_MT_text(bpy.types.Menu):
|
||||
bl_label = "Text"
|
||||
|
||||
@ -160,9 +159,9 @@ class TEXT_MT_text(bpy.types.Menu):
|
||||
layout.operator("text.properties", icon='ICON_MENU_PANEL')
|
||||
|
||||
layout.menu("TEXT_MT_templates")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
@ -1415,9 +1415,9 @@ class WM_OT_keymap_edit(bpy.types.Operator):
|
||||
|
||||
|
||||
class WM_OT_keymap_restore(bpy.types.Operator):
|
||||
"Restore key map"
|
||||
"Restore key map(s)."
|
||||
bl_idname = "wm.keymap_restore"
|
||||
bl_label = "Restore Key Map"
|
||||
bl_label = "Restore Key Map(s)"
|
||||
|
||||
all = BoolProperty(attr="all", name="All Keymaps", description="Restore all keymaps to default.")
|
||||
|
||||
|
@ -32,15 +32,15 @@ class VIEW3D_HT_header(bpy.types.Header):
|
||||
edit_object = context.edit_object
|
||||
obj = context.active_object
|
||||
toolsettings = context.scene.tool_settings
|
||||
|
||||
|
||||
row = layout.row()
|
||||
row.template_header()
|
||||
|
||||
|
||||
sub = row.row(align=True)
|
||||
|
||||
|
||||
# Menus
|
||||
if context.area.show_menus:
|
||||
|
||||
|
||||
sub.menu("VIEW3D_MT_view")
|
||||
|
||||
# Select Menu
|
||||
@ -269,19 +269,15 @@ class VIEW3D_MT_view(bpy.types.Menu):
|
||||
layout.operator("view3d.view_all")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.animation_play", text="Playback Animation")
|
||||
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("screen.area_dupli")
|
||||
layout.operator("screen.region_quadview")
|
||||
layout.operator("screen.screen_full_area")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class VIEW3D_MT_view_navigation(bpy.types.Menu):
|
||||
bl_label = "Navigation"
|
||||
@ -413,7 +409,7 @@ class VIEW3D_MT_select_pose(bpy.types.Menu):
|
||||
props = layout.operator("pose.select_hierarchy", text="Extend Child")
|
||||
props.extend = True
|
||||
props.direction = 'CHILD'
|
||||
|
||||
|
||||
layout.operator("object.select_pattern", text="Select Pattern...")
|
||||
|
||||
|
||||
@ -605,7 +601,7 @@ class VIEW3D_MT_select_edit_armature(bpy.types.Menu):
|
||||
props = layout.operator("armature.select_hierarchy", text="Extend Child")
|
||||
props.extend = True
|
||||
props.direction = 'CHILD'
|
||||
|
||||
|
||||
layout.operator("object.select_pattern", text="Select Pattern...")
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user