blender/release/scripts/unweld.py
Campbell Barton ab77b4aade uvcalc_smart_project.py - fixed error in rare cases.
xfig_export.py - NMesh to Mesh, minor improvements/cleanup.
unweld.py - fixed error when a vert had no faces, also some small speedups and changes.
2007-05-01 09:40:10 +00:00

248 lines
7.0 KiB
Python

#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'Unweld vertex/ices'
Blender: 243
Group: 'Mesh'
Tip: 'Unweld all faces from a (or several) 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.6 "
__bpydoc__ = """\
This script unwelds faces from one or several selected vertex/vertices.
Usage:
In edit mode Select at least one vertex, then run this script.
The options are:
- unbind points;<br>
a new point is added to each face connected to the selected one.
- with noise;<br>
the new points location is varied with noise
- middle face;<br>
the new point is located at the center of face to which it is connected
"""
# ------------------------------------------
# Un-Weld script 0.4.6
# name="UnWeld"
# Tip= 'Unweld all faces from a selected and common vertex.'
# date='06/08/2006'
# split all faces from one selected vertex
# (c) 2004 J-M Soler released under GPL licence
#----------------------------------------------
# Official Page :
# website = 'http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_faces2vertex.htm#exemple'
# Communicate problems and errors on:
# community = '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 choice, 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.
# 08/08 :
# -- minor correction to completely disconnect face.
#----------------------------------------------
# Page officielle :
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_faces2vertex.htm#exemple
# Commsoler 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 /
# -- presque unvertex bevelling sur un vertex solitaire : cree
# un trou dans la facette autour du sommet
# 03/06 :
# -- une sorte de vertex extruder en biseau, controle par
# movement horizontal de la souris
# 08/08 :
# -- correction mineure pour s'assurer que les faces soient
# entierment deconnectees
#----------------------------------------------
import Blender
from Blender import Noise
from Blender.Draw import *
from Blender.BGL import *
import BPyMessages
# $Id$
NR=Noise.random
DECAL=0.03
t=[0.0,0.0,0.0]
pl=[]
orig=[]
DEBUG = 0
SUBSURF=0
DIM=Create(1.0)
def Buffer(v,t):
if DEBUG : print dir(v)
for n in range(len(v)): t[n]=t[n]+v[n]
return t
def freeBuffer(t):
for n in range(3): t[n]=0.0
return t
def ModalBuffer(t,f):
for n in range(3): t[n]/=len(f)
return t
def applyModalValue(v,t):
for n in range(len(v)): v[n]=t[n]
return v
def docF(f0,f):
if f0 and f:
f0.mat=f.mat
if f.uv :
f0.uv=f.uv
if f.col :
f0.col=f.col
if f.image :
f0.image=f.image
f0.smooth=f.smooth
f0.mode=f.mode
f0.flag=f.flag
return f0
def connectedFacesList(me,thegood):
listf2v={}
#tri des faces connectees aux sommets selectionnes
for f in me.faces:
for v in f.v:
if v==thegood:
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 createAdditionalFace(me,thegood,listf2v):
global t
for f in listf2v[thegood.index]:
f0=Blender.NMesh.Face()
if result==3: t=freeBuffer(t)
for v in f.v:
if result==3: t=Buffer(v,t)
if v!=thegood:
f0.append(v)
else:
if result==2:
nv=Blender.NMesh.Vert(thegood.co[0]+NR()*DECAL,
thegood.co[1]+NR()*DECAL,
thegood.co[2]+NR()*DECAL)
else:
nv=Blender.NMesh.Vert(thegood.co[0],
thegood.co[1],
thegood.co[2])
nv.sel=1
me.verts.append(nv)
f0.append(me.verts[me.verts.index(nv)])
localise=me.verts.index(nv)
docF(f0,f)
if result==3:
t=ModalBuffer(t,f0.v)
me.verts[localise]=applyModalValue(me.verts[localise],t)
me.faces.append(f0)
del me.verts[me.verts.index(thegood)]
for f in listf2v[thegood.index]:
del me.faces[me.faces.index(f)]
return me
def collecte_edge(listf2v,me,thegood):
back=0
edgelist = []
vertlist = []
if DEBUG : print listf2v
for face in listf2v[thegood.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 xrange(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==thegood.index or vert1==thegood.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 i, edge in enumerate(edgelist):
#print edge
if len(edge)==4:
del edgelist[i]
edges=len(edgelist)
if DEBUG : print 'number of edges : ',edges," Edge list : " ,edgelist
return edges, edgelist
import bpy
OBJECT= bpy.data.scenes.active.objects.active
if OBJECT and OBJECT.type=='Mesh':
if OBJECT.getData(mesh=1).multires:
BPyMessages.Error_NoMeshMultiresEdit()
elif not BPyMessages.Warning_MeshDistroyLayers(OBJECT.getData(mesh=1)):
pass
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()
for v in me.verts:
if v.sel:
thegood=v
if DEBUG : print thegood
listf2v=connectedFacesList(me,thegood)
if listf2v:
me=createAdditionalFace(me,thegood,listf2v)
#OBJECT.link(me)
me.update()
OBJECT.makeDisplayList()
Blender.Window.EditMode(EDITMODE)
else:
BPyMessages.Error_NoMeshActive()