Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2006-07-10 13:22:07 +0400
committerCampbell Barton <ideasman42@gmail.com>2006-07-10 13:22:07 +0400
commit309fb2ec26ece92b7c30e2354237344d46bc4068 (patch)
tree78cb78e80fe0e0a938ea6de466b5fd8b357478c4 /release
parent06095778c19a6e5191d0a27908a90d55d9b5837c (diff)
removed a script I wrote and added it under a different name.
Moved from NMesh to Mesh and optimized.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/mesh_skin.py (renamed from release/scripts/skin.py)131
1 files changed, 71 insertions, 60 deletions
diff --git a/release/scripts/skin.py b/release/scripts/mesh_skin.py
index c319de31915..4e2626e5e77 100644
--- a/release/scripts/skin.py
+++ b/release/scripts/mesh_skin.py
@@ -90,7 +90,7 @@ class edgeLoop:
vIdx += 1
# Assign linked list
- for eIdx in range(len(self.edges)-1):
+ for eIdx in xrange(len(self.edges)-1):
self.edges[eIdx].next = self.edges[eIdx+1]
self.edges[eIdx].prev = self.edges[eIdx-1]
# Now last
@@ -157,8 +157,12 @@ class edgeLoop:
e.v1, e.v2 = e.v2, e.v1
self.normal = -self.normal
- # Removes N Smallest edges and backs up
def removeSmallest(self, cullNum, otherLoopLen):
+ '''
+ Removes N Smallest edges and backs up the loop,
+ this is so we can loop between 2 loops as if they are the same length,
+ backing up and restoring incase the loop needs to be skinned with another loop of a different length.
+ '''
global CULL_METHOD
if CULL_METHOD == 0: # Shortest edge
@@ -184,7 +188,7 @@ class edgeLoop:
currentEdge = currentEdge.next
smallestEdge = currentEdge
- for i in range(step):
+ for i in xrange(step):
currentEdge = currentEdge.next
while currentEdge.removed == 1:
currentEdge = currentEdge.next
@@ -200,51 +204,53 @@ class edgeLoop:
# Returns face edges.
# face must have edge data.
-def faceEdges(me, f):
- if len(f) == 3:
- return [\
- me.findEdge(f[0], f[1]),\
- me.findEdge(f[1], f[2]),\
- me.findEdge(f[2], f[0])\
- ]
- elif len(f) == 4:
- return [\
- me.findEdge(f[0], f[1]),\
- me.findEdge(f[1], f[2]),\
- me.findEdge(f[2], f[3]),\
- me.findEdge(f[3], f[0])\
- ]
-
def getSelectedEdges(me, ob):
- SEL_FLAG = NMesh.EdgeFlags['SELECT']
- FGON_FLAG = NMesh.EdgeFlags['FGON']
-
- edges = [e for e in me.edges if e.flag & SEL_FLAG if (e.flag & FGON_FLAG) == 0 ]
-
- # Now remove edges that face 2 or more selected faces usoing them
- edgeFromSelFaces = []
- for f in me.faces:
- if len(f) >2 and f.sel:
- edgeFromSelFaces.extend(faceEdges(me, f))
-
- # Remove all edges with 2 or more selected faces as uses.
- for e in edgeFromSelFaces:
- if edgeFromSelFaces.count(e) > 1:
- me.removeEdge(e.v1, e.v2)
+ MESH_MODE= Blender.Mesh.Mode()
+
+ if MESH_MODE==Blender.Mesh.SelectModes.EDGE or MESH_MODE==Blender.Mesh.SelectModes.VERTEX:
+ Blender.Mesh.Mode(Blender.Mesh.SelectModes.EDGE)
+ edges= [ ed for ed in me.edges if ed.sel ]
+ Blender.Mesh.Mode(MESH_MODE)
+ return edges
+
+ elif MESH_MODE==Blender.Mesh.SelectModes.FACE:
+ Blender.Mesh.Mode(Blender.Mesh.SelectModes.EDGE)
+
+ def ed_key(ed):
+ i1= ed.v1.index
+ i2= ed.v2.index
+ if i1 > i2:
+ return i2, i1
+ else:
+ return i1, i2
+
+ # value is [edge, face_sel_user_in]
+ edge_dict= dict((ed_key(ed), [ed, 0]) for ed in me.edges)
+
+ for f in me.faces:
+ if f.sel:
+ fidx= [v.index for v in f.v]
+ for i in xrange(len(fidx)):
+ i1= fidx[i]
+ i2= fidx[i-1]
+
+ if i1>i2:
+ i1,i2= i2,i1
+
+ # ed_data is a list of 2 ed and face user
+ ed_data= edge_dict[i1,i2]
+ ed_data[1]+=1
+
+
+ Blender.Mesh.Mode(MESH_MODE)
+ return [ ed_data[0] for ed_data in edge_dict.itervalues() if ed_data[1] == 1 ]
- # Remove selected faces?
- fIdx = len(me.faces)
- while fIdx:
- fIdx-=1
- if len(me.faces[fIdx]) > 2:
- if me.faces[fIdx].sel:
- me.faces.pop(fIdx)
- return [e for e in edges if edgeFromSelFaces.count(e) < 2]
# Like vert loops
def getVertLoops(selEdges):
+
mainVertLoops = []
while selEdges:
e = selEdges.pop()
@@ -287,6 +293,9 @@ def getVertLoops(selEdges):
def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
+
+ new_faces= [] #
+
# Make sure e1 loops is bigger then e2
if len(eloop1.edges) != len(eloop2.edges):
if len(eloop1.edges) < len(eloop2.edges):
@@ -316,7 +325,7 @@ def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
bestOffset = 0
# Loop rotation offset to test.1
eLoopIdxs = range(len(eloop1.edges))
- for offset in range(len(eloop1.edges)):
+ for offset in xrange(len(eloop1.edges)):
totEloopDist = 0 # Measure this total distance for thsi loop.
offsetIndexLs = eLoopIdxs[offset:] + eLoopIdxs[:offset] # Make offset index list
@@ -340,18 +349,13 @@ def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
- for loopIdx in range(len(eloop2.edges)):
+ for loopIdx in xrange(len(eloop2.edges)):
e1 = eloop1.edges[loopIdx]
e2 = eloop2.edges[loopIdx]
# Remember the pairs for fan filling culled edges.
e1.match = e2; e2.match = e1
-
- # need some smart face flipping code here.
- f = NMesh.Face([e1.v1, e1.v2, e2.v2, e2.v1])
-
- f.sel = 1
- me.faces.append(f)
+ new_faces.append([e1.v1, e1.v2, e2.v2, e2.v1])
# FAN FILL MISSING FACES.
if CULL_FACES:
@@ -366,12 +370,7 @@ def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
vertFanPivot = contextEdge.match.v2
while contextEdge.next.removed == 1:
-
- f = NMesh.Face([contextEdge.next.v1, contextEdge.next.v2, vertFanPivot] )
-
-
- f.sel = 1
- me.faces.append(f)
+ new_faces.append([contextEdge.next.v1, contextEdge.next.v2, vertFanPivot])
# Should we use another var?, this will work for now.
contextEdge.next.removed = 1
@@ -380,6 +379,9 @@ def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
FAN_FILLED_FACES += 1
eloop1.restore() # Add culled back into the list.
+
+ me.faces.extend(new_faces)
+
#if angleBetweenLoopNormals > 90:
# eloop2.reverse()
@@ -393,11 +395,13 @@ def main():
if ob == None or ob.getType() != 'Mesh':
return
- me = ob.getData()
+ me = ob.getData(mesh=1)
+ '''
if not me.edges:
Draw.PupMenu('Error, add edge data first')
if is_editmode: Window.EditMode(1)
return
+ '''
# BAD BLENDER PYTHON API, NEED TO ENTER EXIT EDIT MODE FOR ADDING EDGE DATA.
# ADD EDGE DATA HERE, Python API CANT DO IT YET, LOOSES SELECTION
@@ -439,7 +443,7 @@ def main():
# VERT LOOP ORDERING CODE
- # Build a worm list - grow from Both ends
+ # "Build a worm" list - grow from Both ends
edgeOrderedList = [edgeLoops.pop()]
# Find the closest.
@@ -478,13 +482,20 @@ def main():
else: # Add closest First
edgeOrderedList.insert(0, edgeLoops.pop(bestIdxSoFar) ) # First
- for i in range(len(edgeOrderedList)-1):
+ for i in xrange(len(edgeOrderedList)-1):
skin2EdgeLoops(edgeOrderedList[i], edgeOrderedList[i+1], me, ob, 0)
if choice == 1 and len(edgeOrderedList) > 2: # Loop
skin2EdgeLoops(edgeOrderedList[0], edgeOrderedList[-1], me, ob, 0)
- print '\nArray done in %.4f sec.' % (sys.time()-time1)
- me.update(1, 1, 0)
+ print '\nSkin done in %.4f sec.' % (sys.time()-time1)
+
+ # REMOVE SELECTED FACES.
+ faces= [ f for f in me.faces if f.sel ]
+ print faces
+ if faces:
+ print faces
+ me.faces.delete(1, faces)
+
if is_editmode: Window.EditMode(1)
if __name__ == '__main__':