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
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

@ -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):

@ -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)

@ -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|'

@ -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= ''

@ -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.

@ -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]

@ -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.x<bounds[0] or\
pt.y<bounds[1] or\
pt.x>bounds[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)

@ -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?"