forked from bartvdbraak/blender
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:
parent
a185758581
commit
35e96bc991
@ -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?"
|
||||
|
Loading…
Reference in New Issue
Block a user