Scripts: missed removing this one (was updated by jms and renamed to unweld.py simply)
This commit is contained in:
parent
d65fc84a68
commit
e7469acd16
@ -1,393 +0,0 @@
|
||||
#!BPY
|
||||
""" Registration info for Blender menus: <- these words are ignored
|
||||
Name: 'Unweld'
|
||||
Blender: 234
|
||||
Group: 'Mesh'
|
||||
Tip: 'Unweld all faces from a selected and common vertex. Made vertex bevelling'
|
||||
"""
|
||||
|
||||
__author__ = "Jean-Michel Soler (jms)"
|
||||
__url__ = ("blender", "elysiun",
|
||||
"Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_faces2vertex.htm#exemple",
|
||||
"Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
|
||||
__version__ = "0.4.4 beta"
|
||||
|
||||
__bpydoc__ = """\
|
||||
This script unwelds faces from a selected vertex.
|
||||
|
||||
There's also experimental support for static or dynamic (move mouse in the
|
||||
Scripts window) vertex bevel.
|
||||
|
||||
Usage:
|
||||
|
||||
Select a vertex, then run this script. Its options are:
|
||||
|
||||
- unbind points;<br>
|
||||
- with noise;<br>
|
||||
- middle face;<br>
|
||||
- static bevel vertex;<br>
|
||||
- moving bevel vertex;
|
||||
"""
|
||||
|
||||
# $Id$
|
||||
#
|
||||
# ------------------------------------------
|
||||
# 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 *
|
||||
|
||||
Blender.Window.EditMode(0)
|
||||
|
||||
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 = Q Key")
|
||||
glRasterPos2f(10, size[3]-36)
|
||||
Text("Mouse to the Right = 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 = "Unweld %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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user