added messages to scripts, stopping them from modifying multires meshes.

object_cookie_cutter - can now also use curves to cut holes in a mesh.
This commit is contained in:
Campbell Barton 2007-02-06 11:16:49 +00:00
parent a185758581
commit 35e96bc991
9 changed files with 154 additions and 104 deletions

@ -2,7 +2,7 @@
""" Registration info for Blender menus """ Registration info for Blender menus
Name: 'Bevel Center' Name: 'Bevel Center'
Blender: 240 Blender: 243
Group: 'Mesh' Group: 'Mesh'
Tip: 'Bevel selected faces, edges, and vertices' Tip: 'Bevel selected faces, edges, and vertices'
""" """
@ -50,7 +50,7 @@ from Blender import NMesh, Window, Scene
from Blender.Draw import * from Blender.Draw import *
from Blender.Mathutils import * from Blender.Mathutils import *
from Blender.BGL import * from Blender.BGL import *
import BPyMessages
#PY23 NO SETS# #PY23 NO SETS#
''' '''
try: try:
@ -72,8 +72,13 @@ def act_mesh_ob():
scn = Scene.GetCurrent() scn = Scene.GetCurrent()
ob = scn.objects.active ob = scn.objects.active
if ob == None or ob.type != 'Mesh': if ob == None or ob.type != 'Mesh':
PupMenu('ERROR%t|Select a mesh object.') BPyMessages.Error_NoMeshActive()
return return
if ob.getData(mesh=1).multires:
BPyMessages.Error_NoMeshMultiresEdit()
return
return ob return ob
def make_sel_vert(*co): def make_sel_vert(*co):
@ -356,10 +361,14 @@ def draw():
glClear(GL_COLOR_BUFFER_BIT) glClear(GL_COLOR_BUFFER_BIT)
Button("Bevel",EVENT_BEVEL,10,100,280,25) 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') 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, \ 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") "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) glRasterPos2d(8,40)
Text('To finish, you can use recursive bevel to smooth it') Text('To finish, you can use recursive bevel to smooth it')
@ -396,7 +405,7 @@ def bevel():
is_editmode = Window.EditMode() is_editmode = Window.EditMode()
if is_editmode: Window.EditMode(0) if is_editmode: Window.EditMode(0)
me = ob.getData() me = ob.data
NV = {} NV = {}
#PY23 NO SETS# NV_ext = set() #PY23 NO SETS# NV_ext = set()
@ -420,11 +429,13 @@ def bevel():
def bevel_update(): def bevel_update():
""" Use NV to update the bevel """ """ Use NV to update the bevel """
global dist, old_dist global dist, old_dist
is_editmode = Window.EditMode()
if is_editmode: Window.EditMode(0)
if old_dist == None: 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 fac = dist.val - old_dist
old_dist = dist.val old_dist = dist.val

@ -1,14 +1,17 @@
from Blender import Draw, sys from Blender import Draw, sys
def Error_NoMeshSelected(): def Error_NoMeshSelected():
Draw.PupMenu('ERROR%t|No mesh objects selected') Draw.PupMenu('Error%t|No mesh objects selected')
def Error_NoActive(): def Error_NoActive():
Draw.PupMenu('ERROR%t|No active object') Draw.PupMenu('Error%t|No active object')
def Error_NoMeshActive(): 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(): 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(): 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 # File I/O messages
def Error_NoFile(path): def Error_NoFile(path):

@ -1,7 +1,7 @@
#!BPY #!BPY
""" """
Name: 'Bone Weight Copy' Name: 'Bone Weight Copy'
Blender: 241 Blender: 243
Group: 'Object' Group: 'Object'
Tooltip: 'Copy Bone Weights from 1 mesh, to all other selected meshes.' Tooltip: 'Copy Bone Weights from 1 mesh, to all other selected meshes.'
""" """
@ -257,12 +257,16 @@ def main():
else: else:
data= (ob, me, worldspace_verts(me, ob), groups) data= (ob, me, worldspace_verts(me, ob), groups)
sel.append(data) sel.append(data)
if not sel or from_data==None: if not from_data:
Blender.Draw.PupMenu('Select 2 or more mesh objects, aborting.') Blender.Draw.PupMenu('Error%t|No mesh with vertex groups found.')
if not sel and quality:
from_data[1].verts= None
return 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() t= Blender.sys.time()
Window.WaitCursor(1) Window.WaitCursor(1)

@ -306,20 +306,26 @@ def main():
Blender.Window.WaitCursor(1) Blender.Window.WaitCursor(1)
for me in meshes: 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: if CLEAN_EDGE_SMALL: # for all use 2- remove all edges.
rem_face_count += rem_perimeter_faces(me, limit) rem_edge_count += rem_free_edges(me, limit)
if CLEAN_EDGE_SMALL: # for all use 2- remove all edges. if CLEAN_EDGE_NOFACE:
rem_edge_count += rem_free_edges(me, limit) rem_edge_count += rem_free_edges(me)
if CLEAN_EDGE_NOFACE: if CLEAN_VERTS_FREE:
rem_edge_count += rem_free_edges(me) rem_vert_count += rem_free_verts(me)
if CLEAN_VERTS_FREE:
rem_vert_count += rem_free_verts(me)
if CLEAN_MATERIALS: if CLEAN_MATERIALS:
rem_material_count += rem_unused_materials(me) rem_material_count += rem_unused_materials(me)
@ -345,7 +351,11 @@ def main():
if CLEAN_NAN_UVS: if CLEAN_NAN_UVS:
fix_nan_uvcount = fix_nan_uvs(me) fix_nan_uvcount = fix_nan_uvs(me)
# restore multires.
if me.multires:
me.multiresDrawLevel = multires_level_orig
Blender.Window.WaitCursor(0) Blender.Window.WaitCursor(0)
if is_editmode: Window.EditMode(0) if is_editmode: Window.EditMode(0)
stat_string= 'Removed from ' + str(len(meshes)) + ' Mesh(es)%t|' stat_string= 'Removed from ' + str(len(meshes)) + ' Mesh(es)%t|'

@ -1,7 +1,7 @@
#!BPY #!BPY
""" """
Name: 'Poly Reducer' Name: 'Poly Reducer'
Blender: 241 Blender: 243
Group: 'Mesh' Group: 'Mesh'
Tooltip: 'Removed polygons from a mesh while maintaining the shape, textures and weights.' 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 from Blender import Draw, Window, Scene, Mesh, Mathutils, sys, Object
import BPyMesh import BPyMesh
# reload(BPyMesh) # reload(BPyMesh)
import BPyMessages
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
@ -42,13 +43,17 @@ import BPyMesh
def main(): def main():
scn = Scene.GetCurrent() scn = Scene.GetCurrent()
act_ob= scn.getActiveObject() act_ob= scn.objects.active
if not act_ob or act_ob.getType()!='Mesh': if not act_ob or act_ob.type != 'Mesh':
Draw.PupMenu('Error, select a mesh as your active object') BPyMessages.Error_NoMeshActive()
return return
act_me= act_ob.getData(mesh=1) act_me= act_ob.getData(mesh=1)
if act_me.multires:
BPyMessages.Error_NoMeshMultiresEdit()
return
act_group= act_me.activeGroup act_group= act_me.activeGroup
if not act_group: act_group= '' if not act_group: act_group= ''

@ -2,7 +2,7 @@
""" """
Name: 'Bridge Faces/Edge-Loops' Name: 'Bridge Faces/Edge-Loops'
Blender: 237 Blender: 243
Group: 'Mesh' Group: 'Mesh'
Tooltip: 'Select 2 vert loops, then run this script.' Tooltip: 'Select 2 vert loops, then run this script.'
""" """
@ -53,6 +53,7 @@ import Blender
from Blender import Window from Blender import Window
from Blender.Mathutils import MidpointVecs, Vector, CrossVecs from Blender.Mathutils import MidpointVecs, Vector, CrossVecs
from Blender.Mathutils import AngleBetweenVecs as _AngleBetweenVecs_ from Blender.Mathutils import AngleBetweenVecs as _AngleBetweenVecs_
import BPyMessages
from Blender.Draw import PupMenu from Blender.Draw import PupMenu
@ -521,9 +522,15 @@ def main():
if is_editmode: Window.EditMode(0) if is_editmode: Window.EditMode(0)
ob = Blender.Scene.GetCurrent().objects.active ob = Blender.Scene.GetCurrent().objects.active
if ob == None or ob.type != 'Mesh': if ob == None or ob.type != 'Mesh':
BPyMessages.Error_NoMeshActive()
return return
me = ob.getData(mesh=1) me = ob.getData(mesh=1)
if me.multires:
BPyMessages.Error_NoMeshMultiresEdit()
return
time1 = Blender.sys.time() time1 = Blender.sys.time()
selEdges = getSelectedEdges(me, ob) selEdges = getSelectedEdges(me, ob)
vertLoops = getVertLoops(selEdges, me) # list of lists of edges. vertLoops = getVertLoops(selEdges, me) # list of lists of edges.

@ -19,6 +19,8 @@ Optionaly you can skin between the original and new faces to make a watertight s
from Blender import * from Blender import *
import BPyMesh import BPyMesh
# reload(BPyMesh) # reload(BPyMesh)
import BPyMessages
# reload(BPyMessages)
# python 2.3 has no reversed() iterator. this will only work on lists and tuples # python 2.3 has no reversed() iterator. this will only work on lists and tuples
try: try:
@ -97,16 +99,17 @@ def lengthFromAngle(angle):
return sqrt((x*x)+(y*y)) return sqrt((x*x)+(y*y))
def main(): def main():
scn = Scene.GetCurrent() scn = Scene.GetCurrent()
ob = scn.objects.active ob = scn.objects.active
if not ob or ob.type != 'Mesh': 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 return
# Create the variables. # Create the variables.
@ -132,7 +135,7 @@ def main():
is_editmode = Window.EditMode() is_editmode = Window.EditMode()
if is_editmode: Window.EditMode(0) if is_editmode: Window.EditMode(0)
# Main code function # Main code function
me = ob.getData(mesh=1) me = ob.getData(mesh=1)
me_faces = me.faces me_faces = me.faces
faces_sel= [f for f in me_faces if f.sel] faces_sel= [f for f in me_faces if f.sel]

@ -29,9 +29,8 @@ This script supports UV coordinates and images.
import Blender import Blender
import BPyMathutils
from math import sqrt from math import sqrt
reload(BPyMathutils) import BPyMesh
Vector= Blender.Mathutils.Vector Vector= Blender.Mathutils.Vector
LineIntersect2D= Blender.Geometry.LineIntersect2D LineIntersect2D= Blender.Geometry.LineIntersect2D
@ -80,14 +79,10 @@ def point_in_bounds(pt, bounds):
each tuple is each tuple is
xmin, ymin, xmax, ymax xmin, ymin, xmax, ymax
''' '''
if\ if bounds[0] < pt.x < bounds[2] and bounds[1] < pt.y < bounds[3]:
pt.x<bounds[0] or\
pt.y<bounds[1] or\
pt.x>bounds[2] or\
pt.y>bounds[3]:
return False
else:
return True return True
else:
return False
def point_in_poly2d(pt, fvco): def point_in_poly2d(pt, fvco):
@ -555,9 +550,9 @@ def main():
print '\nRunning Cookie Cutter' print '\nRunning Cookie Cutter'
time= Blender.sys.time() time= Blender.sys.time()
scn = Blender.Scene.GetCurrent()
obs= [ob for ob in Blender.Object.GetSelected() if ob.getType()=='Mesh'] 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 # Divide into 2 lists- 1 with faces, one with only edges
terrains= [] #[me for me in mes if me.faces] 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']) terrain_type= auto_class(['mesh', 'bounds', 'face_bounds', 'edge_bounds', 'edge_dict', 'cutters', 'matrix'])
for ob in obs: 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 # a new terrain instance
t= terrain_type() if me.multires:
MULTIRES_ERROR = True
t.matrix= ob.matrixWorld * Blender.Window.GetViewMatrix() else:
t= terrain_type()
# Transform the object by its matrix
me.transform(t.matrix) t.matrix= ob.matrixWorld * Blender.Window.GetViewMatrix()
# Set the terrain bounds # Transform the object by its matrix
t.bounds= bounds_xy(me.verts) me.transform(t.matrix)
t.edge_bounds= [bounds_xy(ed) for ed in me.edges]
t.mesh= me # Set the terrain bounds
t.bounds= bounds_xy(me.verts)
t.edge_bounds= [bounds_xy(ed) for ed in me.edges]
if me.faces: # Terrain. t.mesh= me
t.edge_dict= mesh_edge_dict(me)
t.face_bounds= [bounds_xy(f) for f in me.faces] if me.faces: # Terrain.
t.cutters= [] # Store cutting objects that cut us here t.edge_dict= mesh_edge_dict(me)
terrains.append(t) t.face_bounds= [bounds_xy(f) for f in me.faces]
elif len(me.edges)>2: # Cutter t.cutters= [] # Store cutting objects that cut us here
cutters.append(t) terrains.append(t)
elif len(me.edges)>2: # Cutter
cutters.append(t)
totcuts= len(terrains)*len(cutters) totcuts= len(terrains)*len(cutters)
if not totcuts: if not totcuts:
@ -631,13 +631,17 @@ def main():
f.sel= 1 f.sel= 1
Blender.Mesh.Mode(Blender.Mesh.SelectModes['FACE']) Blender.Mesh.Mode(Blender.Mesh.SelectModes['FACE'])
# Restore the transformation # Restore the transformation
for data in (terrains, cutters): for data in (terrains, cutters):
for t in data: 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) 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) print 'terrains:%i cutters %i %.2f secs taken' % (len(terrains), len(cutters), Blender.sys.time()-time)

@ -1,7 +1,7 @@
#!BPY #!BPY
""" Registration info for Blender menus: <- these words are ignored """ Registration info for Blender menus: <- these words are ignored
Name: 'Unweld vertex/ices' Name: 'Unweld vertex/ices'
Blender: 234 Blender: 243
Group: 'Mesh' Group: 'Mesh'
Tip: 'Unweld all faces from a (or several) selected and common vertex. Made vertex bevelling' 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 import Noise
from Blender.Draw import * from Blender.Draw import *
from Blender.BGL import * from Blender.BGL import *
import BPyMessages
# $Id$ # $Id$
NR=Noise.random NR=Noise.random
@ -213,30 +213,33 @@ def collecte_edge(listf2v,me,thegood):
if DEBUG : print 'number of edges : ',edges," Edge list : " ,edgelist if DEBUG : print 'number of edges : ',edges," Edge list : " ,edgelist
return edges, edgelist return edges, edgelist
OBJECT=Blender.Scene.getCurrent().getActiveObject() OBJECT=Blender.Scene.GetCurrent().getActiveObject()
if OBJECT and OBJECT.getType()=='Mesh': if OBJECT and OBJECT.getType()=='Mesh':
EDITMODE=Blender.Window.EditMode() if OBJECT.getData(mesh=1).multires:
Blender.Window.EditMode(0) BPyMessages.Error_NoMeshMultiresEdit()
name = "Unweld %t|Unbind Points %x1|With Noise %x2|Middle Face %x3" else:
result = Blender.Draw.PupMenu(name) EDITMODE=Blender.Window.EditMode()
if result: Blender.Window.EditMode(0)
me=OBJECT.getData() name = "Unweld %t|Unbind Points %x1|With Noise %x2|Middle Face %x3"
sole=0 result = Blender.Draw.PupMenu(name)
vSelection=[] if result:
for v in me.verts: me=OBJECT.getData()
if v.sel==1: sole=0
vSelection.append(v) vSelection=[]
for v in vSelection: for v in me.verts:
thegood=v if v.sel==1:
if DEBUG : print thegood vSelection.append(v)
listf2v=connectedFacesList(me,thegood) for v in vSelection:
me=createAdditionalFace(me,thegood,listf2v) thegood=v
#OBJECT.link(me) if DEBUG : print thegood
me.update() listf2v=connectedFacesList(me,thegood)
OBJECT.makeDisplayList() me=createAdditionalFace(me,thegood,listf2v)
#OBJECT.link(me)
Blender.Window.EditMode(EDITMODE) me.update()
OBJECT.makeDisplayList()
Blender.Window.EditMode(EDITMODE)
else: else:
name = "Nothing to do! Did you select at least one vertex?" name = "Nothing to do! Did you select at least one vertex?"