blender/release/scripts/unweld044.py
Willian Padovani Germano b82be27659 Bundled scripts:
-starting updates and new additions for Blender 2.34:
  Some of the new scripts require Python modules not builtin with Blender, so you either need a full Python install or the needed extra modules.  This is an ongoing work, there should be more scripts, better testing and also proper ways to tell users they don't have all expected modules.  It's expected that Win users won't need full Python installs, since we can provide a minimal zip with the needed modules from 2.34 on.

Thanks to Anthony D'Agostino (scorpius), Jean-Michel Soler (jms) and Campbell Barton (Cam / ideasman) for donating the scripts now added / updated.

BPython:
-added two new script menu groups: Tools and Utils.  We still need to find places elsewhere in the gui where the groups can be put.
2004-06-07 01:34:15 +00:00

367 lines
13 KiB
Python

#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'UnWeld'
Blender: 232
Group: 'Modifiers'
Tip: 'unweld all faces from one selected and commun vertex. Made vertex bevelling'
"""
# ------------------------------------------
# Un-Weld script 0.4.4 beta
#
# split all faces from one selected vertex
# (c) 2004 J-M Soler released under Blender Artistic License
#----------------------------------------------
# Official Page :
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_faces2vertex.htm#exemple
# Communicate problems and errors on:
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#----------------------------------------------
# Blender Artistic License
# http://download.blender.org/documentation/html/x21254.html
#---------------------------------------------
# Changelog
#----------------------------------------------
# 25/05 :
# -- separate choise, normal (same place) or spread at random, middle of the face
# -- works on several vertices too
# -- Quite vertex bevelling on <<lone>> vertex : create hole in faces around this
# vertex
# 03/06 :
# -- a sort of "bevelled vertex" extrusion controled by horizontal mouse
# displacement. just a beta test to the mouse control.
#----------------------------------------------
# Page officielle :
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_faces2vertex.htm#exemple
# Communiquer les problemes et erreurs sur:
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
# Blender Artistic License
# http://download.blender.org/documentation/html/x21254.html
#---------------------------------------------
# Changelog
#----------------------------------------------
# 25/05 :
# -- separation du choix, normal ou dispersion hasardeuse, milieu de face
# -- sommets multiples /
# -- Quite vertex bevelling on lone vertex : create hole in faces around the
# vertex
# 03/06 :
# -- a sort of "bevelled vertex" extrusion controled by horizontal mouse
# displacement
#----------------------------------------------
import Blender
from Blender import Noise
from Blender.Draw import *
from Blender.BGL import *
Nr=Noise.random
decal=0.03
t=[0.0,0.0,0.0]
pl=[]
orig=[]
DEBUG = 0
SUBSURF=0
DIM=Create(1.0)
def Tampon(v,t):
for n in range(len(v)): t[n]=t[n]+v[n]
return t
def freeTampon(t):
for n in range(3): t[n]=0.0
return t
def TamponMoyen(t,f):
for n in range(3): t[n]/=len(f)
return t
def appliqueMoyenne(v,t):
for n in range(len(v)): v[n]=t[n]
return v
def docF(f0,f):
try:
f0.mat=f.mat
f0.uv=f.uv
f0.col=f.col
f0.image=f.image
return f0
except:
pass
def listConnecterFace(me,lebon):
listf2v={}
#tri des faces connectees aux sommets selectionnes
for f in me.faces:
for v in f.v:
if v==lebon:
if v.index not in listf2v.keys():
listf2v[me.verts.index(v)]=[f]
elif f not in listf2v[me.verts.index(v)]:
listf2v[me.verts.index(v)].append(f)
return listf2v
def creerFaceSupplementaire(me,lebon,listf2v):
global t
for f in listf2v[lebon.index]:
f0=Blender.NMesh.Face()
if result==3: t=freeTampon(t)
for v in f.v:
if result==3: t=Tampon(v,t)
if v!=lebon:
f0.append(v)
else:
if result==2:
nv=Blender.NMesh.Vert(lebon.co[0]+Nr()*decal,lebon.co[1]+Nr()*decal,lebon.co[2]+Nr()*decal)
else:
nv=Blender.NMesh.Vert(lebon.co[0],lebon.co[1],lebon.co[2])
me.verts.append(nv)
f0.append(me.verts[me.verts.index(nv)])
localise=me.verts.index(nv)
docF(f0,f)
if result==3:
t=TamponMoyen(t,f0.v)
me.verts[localise]=appliqueMoyenne(me.verts[localise],t)
me.faces.append(f0)
del me.verts[me.verts.index(lebon)]
for f in listf2v[lebon.index]:
del me.faces[me.faces.index(f)]
return me
def collecte_edge(listf2v,me,lebon):
back=0
edgelist = []
vertlist = []
if DEBUG : print listf2v
for face in listf2v[lebon.index]:
if len(face.v) == 4:
vlist = [0,1,2,3,0]
elif len(face.v) == 3:
vlist = [0,1,2,0]
else:
vlist = [0,1]
for i in range(len(vlist)-1):
vert0 = min(face.v[vlist[i]].index,face.v[vlist[i+1]].index)
vert1 = max(face.v[vlist[i]].index,face.v[vlist[i+1]].index)
edgeinlist = 0
if vert0==lebon.index or vert1==lebon.index:
for edge in edgelist:
if ((edge[0]==vert0) and (edge[1]==vert1)):
edgeinlist = 1
edge[2] = edge[2]+1
edge.append(me.faces.index(face))
break
if edgeinlist==0:
edge = [vert0,vert1,1,me.faces.index(face)]
edgelist.append(edge)
for edge in edgelist:
#print edge
if len(edge)==4:
del edgelist[edgelist.index(edge)]
edges=len(edgelist)
if DEBUG : print 'number of edges : ',edges," Edge list : " ,edgelist
return edges, edgelist
MouseClickG= Blender.Draw.LEFTMOUSE
MouseClickD= Blender.Draw.RIGHTMOUSE
MouseClickM= Blender.Draw.MIDDLEMOUSE
mouse_x=1
mouse_y=1
x=1
y=1
debut=0
def D():
size=Buffer(GL_FLOAT, 4)
glGetFloatv(GL_SCISSOR_BOX, size)
size= size.list
glColor3f(0.1, 0.1, 0.15)
glRasterPos2f(10, size[3]-16)
Text("Quit = Qkey")
glRasterPos2f(10, size[3]-36)
Text("Mouse to the Rigth = Increase")
glRasterPos2f(10, size[3]-56)
Text("Mouse to the Left = Decrease")
def E(evt,val):
global mouse_x,x,pl,orig,me,debut
global mouse_y,y, MouseClickG,MouseClickD,MouseClickM
if (evt== QKEY): Exit()
if (evt == MOUSEX):
mouse_x = val
pos=x-mouse_x
x=mouse_x
if pos==0:
pos=1
deplace(pl,orig,abs(pos)/pos)
if (evt == MOUSEY): mouse_y = val
def BE(evt):
pass
def deplace(pl,orig,n):
global me, OBJECT
for p in pl:
#print p, orig,len(me.verts)
me.verts[p].co[0]+=n*orig[0]
me.verts[p].co[1]+=n*orig[1]
me.verts[p].co[2]+=n*orig[2]
me.update()
Blender.Redraw()
def VertexBevel(result):
global t,pl, orig,me, SUBSURF
unique=0
for v in me.verts:
if v.sel==1:
lebon=v
unique+=1
if unique==1:
edges=0
edgelist=[]
vertlist=[]
orig=lebon.no[:]
listf2v=listConnecterFace(me,lebon)
edges, edgelist = collecte_edge(listf2v,me,lebon)
for f in listf2v[lebon.index]:
f0=Blender.NMesh.Face()
for v in f.v:
if v!=lebon:
f0.append(v)
else:
nv=Blender.NMesh.Vert(lebon.co[0],lebon.co[1],lebon.co[2])
nv.sel=1
me.verts.append(nv)
f0.append(me.verts[me.verts.index(nv)])
for e in edgelist:
if e[-1]==me.faces.index(f) or e[-2]==me.faces.index(f):
if me.verts.index(nv) not in e:
e.insert(0,me.verts.index(nv))
docF(f0,f)
me.faces.append(f0)
vertlist.append([me.verts.index(nv),me.faces.index(f)])
for e in edgelist :
del e[e.index(lebon.index)]
f0=Blender.NMesh.Face()
for n in range(3):
f0.v.append(me.verts[e[n]])
me.faces.append(f0);
for ve in vertlist:
t=freeTampon(t)
for v in me.faces[ve[1]].v:
t=Tampon(v,t)
t=TamponMoyen(t,me.faces[ve[1]].v)
ve.append(t[:])
me.verts[ve[0]]=appliqueMoyenne(me.verts[ve[0]],t)
def swap(x,y):
return y,x
p=[[edgelist[0][0],edgelist[0][1]]]
while len(p)!=len(edgelist):
for n in range(1,len(edgelist)) :
if p[-1][1]== edgelist[n][0]:
p.append([edgelist[n][0],edgelist[n][1]])
n+=1
elif p[-1][1]== edgelist[n][1]:
edgelist[n][0],edgelist[n][1]=swap(edgelist[n][0],edgelist[n][1])
p.append([edgelist[n][0],edgelist[n][1]])
n+=1
if len(p)%2==0:
P0=p[:(len(p))/2] ; P1=p[len(p)/2:]; P1.reverse()
for s in range(len(P0)-1):
f0=Blender.NMesh.Face()
table=[P0[s][0],P0[s][1],P1[s+1][0],P1[s+1][1]]
for t in table:f0.v.append(me.verts[t])
me.faces.append(f0)
elif len(p) >3 :
P0=p[:(len(p)-1)/2];P1=p[(len(p)-1)/2:-1]; P1.reverse()
for s in range(len(P0)-1):
f0=Blender.NMesh.Face()
table=[P0[s][0],P0[s][1],P1[s+1][0],P1[s+1][1]]
for t in table:f0.v.append(me.verts[t])
me.faces.append(f0)
f0=Blender.NMesh.Face()
table=[p[-1][0],P0[0][0],P1[-1][1]]
for t in table:f0.v.append(me.verts[t])
me.faces.append(f0)
elif len(p) ==3 :
if DEBUG :print P0,P1
f0=Blender.NMesh.Face()
table=[p[0][0],p[0][1],p[1][1]]
for t in table:f0.v.append(me.verts[t])
me.faces.append(f0)
for f in listf2v[lebon.index]:
del me.faces[me.faces.index(f)]
del me.verts[me.verts.index(lebon)]
me.update()
if me.mode&Blender.NMesh.Modes['SUBSURF']:
me.mode-=Blender.NMesh.Modes['SUBSURF']
SUBSURF=1
me.update()
OBJECT[0].makeDisplayList()
if result==5:
pl=[]
for s in me.verts:
if s.sel==1:
pl.append(s.index)
Blender.Draw.Register(D,E,BE)
"""
if SUBSURF==1 :
me.mode+=Blender.NMesh.Modes['SUBSURF']
me.update()
OBJECT[0].makeDisplayList()
"""
else:
name = " It could leave only one selected vertex %t | ok %x1 ?"
result = Blender.Draw.PupMenu(name)
OBJECT=Blender.Object.GetSelected()
if len(OBJECT)!=0:
if OBJECT[0].getType()=='Mesh':
name = "Un-Weld, OK ? %t| unbind points %x1| with noise ? %x2| middle face ? %x3| static bevel vertex ? %x4| moving bevel vertex ? %x5|"
result = Blender.Draw.PupMenu(name)
if result:
me=OBJECT[0].getData()
unique=0
if result<4:
#tri des sommets selectionnes
for v in me.verts:
if v.sel==1:
lebon=v
if DEBUG : print lebon
#dictionnaires des faces connectees aux sommets selectionnes
listf2v=listConnecterFace(me,lebon)
me=creerFaceSupplementaire(me,lebon,listf2v)
OBJECT[0].link(me)
OBJECT[0].makeDisplayList()
else:
VertexBevel(result)
OBJECT[0].makeDisplayList()
else:
name = "Nothing to do! Are you sure ?"
result = Blender.Draw.PupMenu(name)