From 35e96bc99130f4bc5477185cdf0c2a7015602f8f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Feb 2007 11:16:49 +0000 Subject: [PATCH] added messages to scripts, stopping them from modifying multires meshes. object_cookie_cutter - can now also use curves to cut holes in a mesh. --- release/scripts/bevel_center.py | 27 ++++++--- release/scripts/bpymodules/BPyMessages.py | 13 ++-- release/scripts/mesh_boneweight_copy.py | 16 +++-- release/scripts/mesh_cleanup.py | 38 +++++++----- release/scripts/mesh_poly_reduce.py | 15 +++-- release/scripts/mesh_skin.py | 9 ++- release/scripts/mesh_solidify.py | 15 +++-- release/scripts/object_cookie_cutter.py | 74 ++++++++++++----------- release/scripts/unweld.py | 51 ++++++++-------- 9 files changed, 154 insertions(+), 104 deletions(-) diff --git a/release/scripts/bevel_center.py b/release/scripts/bevel_center.py index e390709039e..0ea305a0120 100644 --- a/release/scripts/bevel_center.py +++ b/release/scripts/bevel_center.py @@ -2,7 +2,7 @@ """ Registration info for Blender menus Name: 'Bevel Center' -Blender: 240 +Blender: 243 Group: 'Mesh' Tip: 'Bevel selected faces, edges, and vertices' """ @@ -50,7 +50,7 @@ from Blender import NMesh, Window, Scene from Blender.Draw import * from Blender.Mathutils import * from Blender.BGL import * - +import BPyMessages #PY23 NO SETS# ''' try: @@ -72,8 +72,13 @@ def act_mesh_ob(): scn = Scene.GetCurrent() ob = scn.objects.active if ob == None or ob.type != 'Mesh': - PupMenu('ERROR%t|Select a mesh object.') + BPyMessages.Error_NoMeshActive() return + + if ob.getData(mesh=1).multires: + BPyMessages.Error_NoMeshMultiresEdit() + return + return ob def make_sel_vert(*co): @@ -356,10 +361,14 @@ def draw(): glClear(GL_COLOR_BUFFER_BIT) Button("Bevel",EVENT_BEVEL,10,100,280,25) + + BeginAlign() left=Number('', EVENT_NOEVENT,10,70,45, 20,left.val,0,right.val,'Set the minimum of the slider') - right = Number("",EVENT_NOEVENT,245,70,45,20,right.val,left.val,200,"Set the maximum of the slider") dist=Slider("Thickness ",EVENT_UPDATE,60,70,180,20,dist.val,left.val,right.val,0, \ "Thickness of the bevel, can be changed even after bevelling") + right = Number("",EVENT_NOEVENT,245,70,45,20,right.val,left.val,200,"Set the maximum of the slider") + + EndAlign() glRasterPos2d(8,40) Text('To finish, you can use recursive bevel to smooth it') @@ -396,7 +405,7 @@ def bevel(): is_editmode = Window.EditMode() if is_editmode: Window.EditMode(0) - me = ob.getData() + me = ob.data NV = {} #PY23 NO SETS# NV_ext = set() @@ -420,11 +429,13 @@ def bevel(): def bevel_update(): """ Use NV to update the bevel """ global dist, old_dist - is_editmode = Window.EditMode() - if is_editmode: Window.EditMode(0) if old_dist == None: - PupMenu('ERROR%t|Must bevel first.') + # PupMenu('Error%t|Must bevel first.') + return + + is_editmode = Window.EditMode() + if is_editmode: Window.EditMode(0) fac = dist.val - old_dist old_dist = dist.val diff --git a/release/scripts/bpymodules/BPyMessages.py b/release/scripts/bpymodules/BPyMessages.py index e17de20c4d3..dbf8d8524a3 100644 --- a/release/scripts/bpymodules/BPyMessages.py +++ b/release/scripts/bpymodules/BPyMessages.py @@ -1,14 +1,17 @@ from Blender import Draw, sys def Error_NoMeshSelected(): - Draw.PupMenu('ERROR%t|No mesh objects selected') + Draw.PupMenu('Error%t|No mesh objects selected') def Error_NoActive(): - Draw.PupMenu('ERROR%t|No active object') + Draw.PupMenu('Error%t|No active object') def Error_NoMeshActive(): - Draw.PupMenu('ERROR%t|Active object is not a mesh') + Draw.PupMenu('Error%t|Active object is not a mesh') def Error_NoMeshUvSelected(): - Draw.PupMenu('ERROR%t|No mesh objects with texface selected') + Draw.PupMenu('Error%t|No mesh objects with texface selected') def Error_NoMeshUvActive(): - Draw.PupMenu('ERROR%t|Active object is not a mesh with texface') + Draw.PupMenu('Error%t|Active object is not a mesh with texface') +def Error_NoMeshMultiresEdit(): + Draw.PupMenu('Error%t|Unable to complete action with multires enabled') + # File I/O messages def Error_NoFile(path): diff --git a/release/scripts/mesh_boneweight_copy.py b/release/scripts/mesh_boneweight_copy.py index 9db31be72e6..8aa9a1e3213 100755 --- a/release/scripts/mesh_boneweight_copy.py +++ b/release/scripts/mesh_boneweight_copy.py @@ -1,7 +1,7 @@ #!BPY """ Name: 'Bone Weight Copy' -Blender: 241 +Blender: 243 Group: 'Object' Tooltip: 'Copy Bone Weights from 1 mesh, to all other selected meshes.' """ @@ -257,12 +257,16 @@ def main(): else: data= (ob, me, worldspace_verts(me, ob), groups) sel.append(data) - - if not sel or from_data==None: - Blender.Draw.PupMenu('Select 2 or more mesh objects, aborting.') - if not sel and quality: - from_data[1].verts= None + + if not from_data: + Blender.Draw.PupMenu('Error%t|No mesh with vertex groups found.') return + + if not sel: + Blender.Draw.PupMenu('Error%t|Select 2 or more mesh objects, aborting.') + if quality: from_data[1].verts= None + return + t= Blender.sys.time() Window.WaitCursor(1) diff --git a/release/scripts/mesh_cleanup.py b/release/scripts/mesh_cleanup.py index 31b42204fa3..a2fde4ffa8b 100644 --- a/release/scripts/mesh_cleanup.py +++ b/release/scripts/mesh_cleanup.py @@ -306,20 +306,26 @@ def main(): Blender.Window.WaitCursor(1) for me in meshes: - if CLEAN_FACE_SMALL: - rem_face_count += rem_area_faces(me, limit) + + if me.multires: + multires_level_orig = me.multiresDrawLevel + me.multiresDrawLevel = 1 + print 'Warning, cannot perform destructive operations on multires mesh:', me.name + else: + if CLEAN_FACE_SMALL: + rem_face_count += rem_area_faces(me, limit) + + if CLEAN_FACE_PERIMETER: + rem_face_count += rem_perimeter_faces(me, limit) - if CLEAN_FACE_PERIMETER: - rem_face_count += rem_perimeter_faces(me, limit) - - if CLEAN_EDGE_SMALL: # for all use 2- remove all edges. - rem_edge_count += rem_free_edges(me, limit) - - if CLEAN_EDGE_NOFACE: - rem_edge_count += rem_free_edges(me) - - if CLEAN_VERTS_FREE: - rem_vert_count += rem_free_verts(me) + if CLEAN_EDGE_SMALL: # for all use 2- remove all edges. + rem_edge_count += rem_free_edges(me, limit) + + if CLEAN_EDGE_NOFACE: + rem_edge_count += rem_free_edges(me) + + if CLEAN_VERTS_FREE: + rem_vert_count += rem_free_verts(me) if CLEAN_MATERIALS: rem_material_count += rem_unused_materials(me) @@ -345,7 +351,11 @@ def main(): if CLEAN_NAN_UVS: fix_nan_uvcount = fix_nan_uvs(me) - + + # restore multires. + if me.multires: + me.multiresDrawLevel = multires_level_orig + Blender.Window.WaitCursor(0) if is_editmode: Window.EditMode(0) stat_string= 'Removed from ' + str(len(meshes)) + ' Mesh(es)%t|' diff --git a/release/scripts/mesh_poly_reduce.py b/release/scripts/mesh_poly_reduce.py index 23942e810f3..9d8bb61f652 100644 --- a/release/scripts/mesh_poly_reduce.py +++ b/release/scripts/mesh_poly_reduce.py @@ -1,7 +1,7 @@ #!BPY """ Name: 'Poly Reducer' -Blender: 241 +Blender: 243 Group: 'Mesh' Tooltip: 'Removed polygons from a mesh while maintaining the shape, textures and weights.' """ @@ -17,6 +17,7 @@ This script simplifies the mesh by removing faces, keeping the overall shape of from Blender import Draw, Window, Scene, Mesh, Mathutils, sys, Object import BPyMesh # reload(BPyMesh) +import BPyMessages # ***** BEGIN GPL LICENSE BLOCK ***** # @@ -42,13 +43,17 @@ import BPyMesh def main(): scn = Scene.GetCurrent() - act_ob= scn.getActiveObject() - if not act_ob or act_ob.getType()!='Mesh': - Draw.PupMenu('Error, select a mesh as your active object') + act_ob= scn.objects.active + if not act_ob or act_ob.type != 'Mesh': + BPyMessages.Error_NoMeshActive() return - act_me= act_ob.getData(mesh=1) + + if act_me.multires: + BPyMessages.Error_NoMeshMultiresEdit() + return + act_group= act_me.activeGroup if not act_group: act_group= '' diff --git a/release/scripts/mesh_skin.py b/release/scripts/mesh_skin.py index 39738d23ae7..a8a74eeb24d 100644 --- a/release/scripts/mesh_skin.py +++ b/release/scripts/mesh_skin.py @@ -2,7 +2,7 @@ """ Name: 'Bridge Faces/Edge-Loops' -Blender: 237 +Blender: 243 Group: 'Mesh' Tooltip: 'Select 2 vert loops, then run this script.' """ @@ -53,6 +53,7 @@ import Blender from Blender import Window from Blender.Mathutils import MidpointVecs, Vector, CrossVecs from Blender.Mathutils import AngleBetweenVecs as _AngleBetweenVecs_ +import BPyMessages from Blender.Draw import PupMenu @@ -521,9 +522,15 @@ def main(): if is_editmode: Window.EditMode(0) ob = Blender.Scene.GetCurrent().objects.active if ob == None or ob.type != 'Mesh': + BPyMessages.Error_NoMeshActive() return me = ob.getData(mesh=1) + + if me.multires: + BPyMessages.Error_NoMeshMultiresEdit() + return + time1 = Blender.sys.time() selEdges = getSelectedEdges(me, ob) vertLoops = getVertLoops(selEdges, me) # list of lists of edges. diff --git a/release/scripts/mesh_solidify.py b/release/scripts/mesh_solidify.py index f527444013e..fd72af4e658 100644 --- a/release/scripts/mesh_solidify.py +++ b/release/scripts/mesh_solidify.py @@ -19,6 +19,8 @@ Optionaly you can skin between the original and new faces to make a watertight s from Blender import * import BPyMesh # reload(BPyMesh) +import BPyMessages +# reload(BPyMessages) # python 2.3 has no reversed() iterator. this will only work on lists and tuples try: @@ -97,16 +99,17 @@ def lengthFromAngle(angle): return sqrt((x*x)+(y*y)) - - - - def main(): scn = Scene.GetCurrent() ob = scn.objects.active if not ob or ob.type != 'Mesh': - Draw.PupMenu('ERROR: Active object is not a mesh, aborting.') + BPyMessages.Error_NoMeshActive() + return + + me = ob.getData(mesh=1) + if me.multires: + BPyMessages.Error_NoMeshMultiresEdit() return # Create the variables. @@ -132,7 +135,7 @@ def main(): is_editmode = Window.EditMode() if is_editmode: Window.EditMode(0) - # Main code function + # Main code function me = ob.getData(mesh=1) me_faces = me.faces faces_sel= [f for f in me_faces if f.sel] diff --git a/release/scripts/object_cookie_cutter.py b/release/scripts/object_cookie_cutter.py index 561975b5d26..0319f9b7dc9 100755 --- a/release/scripts/object_cookie_cutter.py +++ b/release/scripts/object_cookie_cutter.py @@ -29,9 +29,8 @@ This script supports UV coordinates and images. import Blender -import BPyMathutils from math import sqrt -reload(BPyMathutils) +import BPyMesh Vector= Blender.Mathutils.Vector LineIntersect2D= Blender.Geometry.LineIntersect2D @@ -80,14 +79,10 @@ def point_in_bounds(pt, bounds): each tuple is xmin, ymin, xmax, ymax ''' - if\ - pt.xbounds[2] or\ - pt.y>bounds[3]: - return False - else: + if bounds[0] < pt.x < bounds[2] and bounds[1] < pt.y < bounds[3]: return True + else: + return False def point_in_poly2d(pt, fvco): @@ -555,9 +550,9 @@ def main(): print '\nRunning Cookie Cutter' time= Blender.sys.time() - - obs= [ob for ob in Blender.Object.GetSelected() if ob.getType()=='Mesh'] - + scn = Blender.Scene.GetCurrent() + obs= [ob for ob in scn.objects.context if ob.type in ('Mesh', 'Curve')] + MULTIRES_ERROR = False # Divide into 2 lists- 1 with faces, one with only edges terrains= [] #[me for me in mes if me.faces] @@ -566,29 +561,34 @@ def main(): terrain_type= auto_class(['mesh', 'bounds', 'face_bounds', 'edge_bounds', 'edge_dict', 'cutters', 'matrix']) for ob in obs: - me= ob.getData(mesh=1) + if ob.type == 'Mesh': + me= ob.getData(mesh=1) + else: + me= BPyMesh.getMeshFromObject(ob) # a new terrain instance - t= terrain_type() - - t.matrix= ob.matrixWorld * Blender.Window.GetViewMatrix() - - # Transform the object by its matrix - me.transform(t.matrix) - - # Set the terrain bounds - t.bounds= bounds_xy(me.verts) - t.edge_bounds= [bounds_xy(ed) for ed in me.edges] - t.mesh= me - - - if me.faces: # Terrain. - t.edge_dict= mesh_edge_dict(me) - t.face_bounds= [bounds_xy(f) for f in me.faces] - t.cutters= [] # Store cutting objects that cut us here - terrains.append(t) - elif len(me.edges)>2: # Cutter - cutters.append(t) + if me.multires: + MULTIRES_ERROR = True + else: + t= terrain_type() + + t.matrix= ob.matrixWorld * Blender.Window.GetViewMatrix() + + # Transform the object by its matrix + me.transform(t.matrix) + + # Set the terrain bounds + t.bounds= bounds_xy(me.verts) + t.edge_bounds= [bounds_xy(ed) for ed in me.edges] + t.mesh= me + + if me.faces: # Terrain. + t.edge_dict= mesh_edge_dict(me) + t.face_bounds= [bounds_xy(f) for f in me.faces] + t.cutters= [] # Store cutting objects that cut us here + terrains.append(t) + elif len(me.edges)>2: # Cutter + cutters.append(t) totcuts= len(terrains)*len(cutters) if not totcuts: @@ -631,13 +631,17 @@ def main(): f.sel= 1 Blender.Mesh.Mode(Blender.Mesh.SelectModes['FACE']) - # Restore the transformation for data in (terrains, cutters): for t in data: - t.mesh.transform(t.matrix.copy().invert()) + if t.mesh.users: # it may have been a temp mesh from a curve. + t.mesh.transform(t.matrix.copy().invert()) Blender.Window.WaitCursor(0) + + if MULTIRES_ERROR: + Blender.Draw.PupMenu('Error%t|One or more meshes meshes not cut because they are multires.') + print 'terrains:%i cutters %i %.2f secs taken' % (len(terrains), len(cutters), Blender.sys.time()-time) diff --git a/release/scripts/unweld.py b/release/scripts/unweld.py index a35b97f19b8..4fd13f647d6 100644 --- a/release/scripts/unweld.py +++ b/release/scripts/unweld.py @@ -1,7 +1,7 @@ #!BPY """ Registration info for Blender menus: <- these words are ignored Name: 'Unweld vertex/ices' -Blender: 234 +Blender: 243 Group: 'Mesh' Tip: 'Unweld all faces from a (or several) selected and common vertex. Made vertex bevelling' """ @@ -86,7 +86,7 @@ import Blender from Blender import Noise from Blender.Draw import * from Blender.BGL import * - +import BPyMessages # $Id$ NR=Noise.random @@ -213,30 +213,33 @@ def collecte_edge(listf2v,me,thegood): if DEBUG : print 'number of edges : ',edges," Edge list : " ,edgelist return edges, edgelist -OBJECT=Blender.Scene.getCurrent().getActiveObject() +OBJECT=Blender.Scene.GetCurrent().getActiveObject() if OBJECT and OBJECT.getType()=='Mesh': - EDITMODE=Blender.Window.EditMode() - Blender.Window.EditMode(0) - name = "Unweld %t|Unbind Points %x1|With Noise %x2|Middle Face %x3" - result = Blender.Draw.PupMenu(name) - if result: - me=OBJECT.getData() - sole=0 - vSelection=[] - for v in me.verts: - if v.sel==1: - vSelection.append(v) - for v in vSelection: - thegood=v - if DEBUG : print thegood - listf2v=connectedFacesList(me,thegood) - me=createAdditionalFace(me,thegood,listf2v) - #OBJECT.link(me) - me.update() - OBJECT.makeDisplayList() - - Blender.Window.EditMode(EDITMODE) + if OBJECT.getData(mesh=1).multires: + BPyMessages.Error_NoMeshMultiresEdit() + else: + EDITMODE=Blender.Window.EditMode() + Blender.Window.EditMode(0) + name = "Unweld %t|Unbind Points %x1|With Noise %x2|Middle Face %x3" + result = Blender.Draw.PupMenu(name) + if result: + me=OBJECT.getData() + sole=0 + vSelection=[] + for v in me.verts: + if v.sel==1: + vSelection.append(v) + for v in vSelection: + thegood=v + if DEBUG : print thegood + listf2v=connectedFacesList(me,thegood) + me=createAdditionalFace(me,thegood,listf2v) + #OBJECT.link(me) + me.update() + OBJECT.makeDisplayList() + + Blender.Window.EditMode(EDITMODE) else: name = "Nothing to do! Did you select at least one vertex?"