Home Technical Talk

Script to perform: Edge Ring > All edges to the same lengh

polycounter lvl 14
Offline / Send Message
walter polycounter lvl 14
Hello !

All in the title,
do you know a script that perform this operation:
I do a Edge Ring > Transform the lengh of the edges to have all the same length.




Indifferently in Max or Maya.

Thanks !

Replies

  • Swordslayer
    Options
    Offline / Send Message
    Swordslayer interpolator
    There might already be one, anyway I've cobbled up a quick maxscript (won't work as expected if there are any shared verts, obviously):
    struct edgeVec
    (
        obj, pts, pos, vec,
    
        fn setEdge len =
        (
            polyOp.setVert obj pts[1] (pos - len * vec)
            polyOp.setVert obj pts[2] (pos + len * vec)
        )
    )
    
    fn averageEdgeLengths obj =
    (
        local edges = polyOp.getEdgeSelection obj
        local verts = polyOp.getVertsUsingEdge obj edges
        local totalLength = 0
    
        local edgeVecs = for e in edges collect
        (
            local verts = polyOp.getEdgeVerts obj e
            local v1 = polyOp.getVert obj verts[1]
            local v2 = polyOp.getVert obj verts[2]
            local vec = v2 - v1
    
            totalLength += length vec
            edgeVec obj:obj pts:verts pos:(v1 + vec/2) vec:(normalize vec)
        )
        local len = totalLength / edges.numberSet / 2
        
        for e in edgeVecs do e.setEdge len
    )
    
    if isKindOf selection[1] Editable_Poly do
        averageEdgeLengths selection[1]
    
  • miauu
    Options
    Offline / Send Message
    miauu polycounter lvl 14
    walter wrote: »
    Hello !

    All in the title,
    do you know a script that perform this operation:
    I do a Edge Ring > Transform the lengh of the edges to have all the same length.

    Indifferently in Max or Maya.

    Thanks !

    I have made Set Edge Length a whyle ago - watch[ame="http://www.youtube.com/watch?v=d9aSsBe6PV4"] this video[/ame].
    I have to update it when I have spare time.
  • Swordslayer
    Options
    Offline / Send Message
    Swordslayer interpolator
    and in case you wanted it for maya too:
    import maya.cmds as cmds
    from pymel.core.datatypes import Vector
    
    class edgeVec:
        def __init__(self, pts, pos, vec):
            self.pts, self.pos, self.vec = pts, pos, vec
    
        def setEdge(self, length):
            move = lambda vert, pos: cmds.move(pos[0], pos[1], pos[2], vert, ws=True, a=True)
            move(self.pts[0], self.pos - length * self.vec)
            move(self.pts[1], self.pos + length * self.vec)
    
    def getEdgeVerts(edge):
        return cmds.ls(cmds.polyListComponentConversion(edge, toVertex=True), flatten=True)
    
    def getEdgeVertsPos(edge):
        verts = cmds.xform(edge, query=True, translation=True, ws=True)
        return (Vector(verts[0:3]), Vector(verts[3:6]))
    
    def averageEdgeLengths():
        edges = cmds.filterExpand(expand=1, selectionMask=32)
        totalLength = 0.
        edgeVecs = []
    
        for e in edges:
            verts = getEdgeVerts(e)
            v1, v2 = getEdgeVertsPos(e)
            vec = v2 - v1
            length = vec.length()
    
            totalLength += length
            edgeVecs.append(edgeVec(verts, v1 + vec/2, vec/length))
    
        length = totalLength / len(edges) / 2
    
        for e in edgeVecs:
            e.setEdge(length)
    
    averageEdgeLengths()
    
  • walter
    Options
    Offline / Send Message
    walter polycounter lvl 14
    Thanks Swordslayer and Miauu for your precious help and your promptness !

    Swordslayer:
    The 3dsMax and Maya Script work like a charme.

    Miauu:
    I take a look to your scripts pack, the ability to setup a lenght greatly interested me.

    To me the perfect stitching and strap from my retopo !
Sign In or Register to comment.