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-02-08 17:38:47 +0300
committerCampbell Barton <ideasman42@gmail.com>2006-02-08 17:38:47 +0300
commit10acbf00abc679855184da750d295d1115bb515c (patch)
tree28b0f75606244ef8ec368b28a5c94d290ce95c13 /release
parent06b432dfa454b41c4a1daaf76483ea049ebe1443 (diff)
This script converts open and closed edge loops into polylines
Supported: Polylines where each vert has no more then 2 edges attached to it.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/mesh_edges2curves.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/release/scripts/mesh_edges2curves.py b/release/scripts/mesh_edges2curves.py
new file mode 100644
index 00000000000..4aeaf6c6b2b
--- /dev/null
+++ b/release/scripts/mesh_edges2curves.py
@@ -0,0 +1,161 @@
+#!BPY
+""" Registration info for Blender menus:
+Name: 'Edges to Curve'
+Blender: 241
+Group: 'Mesh'
+Tip: 'Edges not used by a face are converted into polyline(s)'
+"""
+__author__ = ("Campbell Barton")
+__url__ = ("blender", "elysiun")
+__version__ = "1.0 2006/02/08"
+
+__bpydoc__ = """\
+This script converts open and closed edge loops into polylines
+
+Supported:<br>
+ Polylines where each vert has no more then 2 edges attached to it.
+"""
+
+from Blender import *
+
+def sortPair(a,b):
+ return min(a,b), max(a,b)
+
+def polysFromMesh(me):
+ # a polyline is 2
+ #polylines are a list
+ polyLines = []
+
+ # Get edges not used by a face
+ edgeDict= dict([ (sortPair(ed.v1.index, ed.v2.index), ed) for ed in me.edges ])
+ for f in me.faces:
+ for i in xrange(len(f.v)):
+ key= sortPair(f.v[i].index, f.v[i-1].index)
+ try:
+ del edgeDict[key]
+ except:
+ pass
+ edges= edgeDict.values()
+
+
+ '''
+ # build vert connectivite
+ vertConnex= [list() for i in xrange(len(me.verts))]
+ for ed in edges:
+ i1= ed.v1.index
+ i2= ed.v2.index
+ vertConnex[i1].append(i2)
+ vertConnex[i2].append(i1)
+
+
+ # verts without 2 users are none.
+ vertConnex=[ [None,vc][len(vc)==2] for vc in vertConnex
+ '''
+
+
+ while edges:
+ currentEdge= edges.pop()
+ startVert= currentEdge.v2
+ endVert= currentEdge.v1
+ polyLine= [startVert, endVert]
+ ok= 1
+ while ok:
+ ok= 0
+ #for i, ed in enumerate(edges):
+ i=len(edges)
+ while i:
+ i-=1
+ ed= edges[i]
+ if ed.v1 == endVert:
+ polyLine.append(ed.v2)
+ endVert= polyLine[-1]
+ ok=1
+ edges.pop(i)
+ #break
+ elif ed.v2 == endVert:
+ polyLine.append(ed.v1)
+ endVert= polyLine[-1]
+ ok=1
+ edges.pop(i)
+ #break
+ elif ed.v1 == startVert:
+ polyLine.insert(0, ed.v2)
+ startVert= polyLine[0]
+ ok=1
+ edges.pop(i)
+ #break
+ elif ed.v2 == startVert:
+ polyLine.insert(0, ed.v1)
+ startVert= polyLine[0]
+ ok=1
+ edges.pop(i)
+ #break
+ polyLines.append((polyLine, polyLine[0]==polyLine[-1]))
+ print len(edges), len(polyLines)
+ return polyLines
+
+
+def mesh2polys():
+ scn= Scene.GetCurrent()
+ for ob in scn.getChildren():
+ ob.sel= 0
+ meshOb= scn.getActiveObject()
+ if meshOb==None or meshOb.getType() != 'Mesh':
+ Draw.PupMenu( 'ERROR: No Active Mesh Selected, Aborting' )
+ return
+ Window.WaitCursor(1)
+ Window.EditMode(0)
+ me = meshOb.getData(mesh=1)
+ polygons= polysFromMesh(me)
+ w=t=1
+ cu= Curve.New()
+ cu.setFlag(1)
+ ob= Object.New('Curve', me.name)
+ ob.link(cu)
+ scn.link(ob)
+ ob.Layers= meshOb.Layers
+ ob.setMatrix(meshOb.matrixWorld)
+ ob.sel= 1
+ i=0
+ for poly, closed in polygons:
+ if closed:
+ vIdx= 1
+ else:
+ vIdx= 0
+
+ v= poly[vIdx]
+ cu.appendNurb([v.co.x, v.co.y, v.co.z, w, t])
+ cu[i].type= 0 # Poly Line
+
+ # Close the polyline if its closed.
+ if closed:
+ cu[i].setFlagU(1)
+
+ # Add all the points in the polyline.
+ while vIdx<len(poly):
+ v= poly[vIdx]
+ cu.appendPoint(i, [v.co.x, v.co.y, v.co.z, w])
+ vIdx+=1
+ i+=1
+ Window.WaitCursor(0)
+
+# not used as yet.
+"""
+def writepolys():
+ me = Scene.GetCurrent().getActiveObject().getData(mesh=1)
+ polygons= polysFromMesh(me)
+ file=open('/polygons.txt', 'w')
+ for ply in polygons:
+ file.write('polygon ')
+ if ply[1]:
+ file.write('closed ')
+ else:
+ file.write('open ')
+ file.write('%i\n' % len(ply[0]))
+ for pt in ply[0]:
+ file.write('%.6f %.6f %.6f\n' % tuple(pt.co) )
+ file.close()
+"""
+
+if __name__ == '__main__':
+ mesh2polys()