import sys
import os
import errno
import json
import re

import maya.cmds as cmd
import maya.mel as mel

def rivet(name=''):
    if not name:
        name = "rivet1"
    parts = []
    list = []
    size = 0
    list = cmd.filterExpand(sm=32)
    if list:
        size = len(list)
    if size > 0:
        if size != 2:
            cmd.error("No two edges selected")
            return ""
        
        nameObject = ''
        e1 = 0
        e2 = 0
        if list[0].split("."):
            nameObject = list[0].split(".")[0]
        e1Str = re.search(r"\[([A-Za-z0-9_]+)\]", list[0])
        e1 = int(e1Str.group(1))
        e2Str = re.search(r"\[([A-Za-z0-9_]+)\]", list[1])
        e2 = int(e2Str.group(1))
        
        nameCFME1 = cmd.createNode("curveFromMeshEdge", n="{}_rivetCurveFromMeshEdge1".format(name))
        cmd.setAttr("{}.ihi".format(nameCFME1), 1)
        cmd.setAttr("{}.ei[0]".format(nameCFME1),  e1)
        nameCFME2 = cmd.createNode("curveFromMeshEdge", n="{}_rivetCurveFromMeshEdge2".format(name))
        cmd.setAttr("{}.ihi".format(nameCFME2), 1)
        cmd.setAttr("{}.ei[0]".format(nameCFME2),  e2)
        nameLoft = cmd.createNode("loft", n="{}_rivetLoft1".format(name))
        cmd.setAttr("{}.ic".format(nameLoft), s=2)
        cmd.setAttr("{}.u".format(nameLoft), 1)
        cmd.setAttr("{}.rsn".format(nameLoft), 1)
        
        namePOSI = cmd.createNode("pointOnSurfaceInfo", n="{}_rivetPointOnSurfaceInfo1".format(name))
        cmd.setAttr("{}.turnOnPercentage".format(namePOSI), 1)
        cmd.setAttr("{}.parameterU".format(namePOSI), 0.5)
        cmd.setAttr("{}.parameterV".format(namePOSI), 0.5)
        
        cmd.connectAttr((nameLoft + ".os"), (namePOSI + ".is"), f=True)
        cmd.connectAttr((nameCFME1 + ".oc"), (nameLoft + ".ic[0]"))
        cmd.connectAttr((nameCFME2 + ".oc"), (nameLoft + ".ic[1]"))
        cmd.connectAttr((nameObject + ".w"), (nameCFME1 + ".im"))
        cmd.connectAttr((nameObject + ".w"), (nameCFME2 + ".im"))
    else:
        list = cmd.filterExpand(sm=41)
        if list:
            size = len(list)
        if size > 0:
            if size != 1:
                cmd.error("No one point selected")
                return ""
            
            nameObject = ''
            u = 0.0
            v = 0.0
            if list[0].split("."):
                nameObject = list[0].split(".")[0]
            if len(list[0].split(".uv")) > 1:
                uv = list[0].split(".uv")[1].split('][')
                u = float(uv[0].replace("[",""))
                v = float(uv[1].replace("]",""))
            
            namePOSI = cmd.createNode("pointOnSurfaceInfo", n="{}_rivetPointOnSurfaceInfo1".format(name))
            cmd.setAttr("{}.turnOnPercentage".format(namePOSI), 0)
            cmd.setAttr("{}.parameterU".format(namePOSI), u)
            cmd.setAttr("{}.parameterV".format(namePOSI), v)
            cmd.connectAttr((nameObject + ".ws"), (namePOSI + ".is"), f=True)
        else:
            cmd.error("No edges or point selected")
            return ""
    
    nameLocator = cmd.createNode("transform", n=name)
    cmd.createNode("locator", n=(nameLocator + "Shape"), p=nameLocator)
    
    nameAC = cmd.createNode("aimConstraint", p=nameLocator, n=(nameLocator + "_rivetAimConstraint1"))
    cmd.setAttr("{}.tg[0].tw".format(nameAC), 1)
    cmd.setAttr("{}.a".format(nameAC), 0, 1, 0, type="double3")
    cmd.setAttr("{}.u".format(nameAC), 0, 0, 1, type="double3")
    cmd.setAttr("{}.v".format(nameAC), k=0)
    cmd.setAttr("{}.tx".format(nameAC), k=0)
    cmd.setAttr("{}.ty".format(nameAC), k=0)
    cmd.setAttr("{}.tz".format(nameAC), k=0)
    cmd.setAttr("{}.rx".format(nameAC), k=0)
    cmd.setAttr("{}.ry".format(nameAC), k=0)
    cmd.setAttr("{}.rz".format(nameAC), k=0)
    cmd.setAttr("{}.sx".format(nameAC), k=0)
    cmd.setAttr("{}.sy".format(nameAC), k=0)
    cmd.setAttr("{}.sz".format(nameAC), k=0)
    
    cmd.connectAttr((namePOSI + ".position"), (nameLocator + ".translate"))
    cmd.connectAttr((namePOSI + ".n"), (nameAC + ".tg[0].tt"))
    cmd.connectAttr((namePOSI + ".tv"), (nameAC + ".wu"))
    cmd.connectAttr((nameAC + ".crx"), (nameLocator + ".rx"))
    cmd.connectAttr((nameAC + ".cry"), (nameLocator + ".ry"))
    cmd.connectAttr((nameAC + ".crz"), (nameLocator + ".rz"))
    
    cmd.select(nameLocator, r=True)
    return nameLocator

Tags:

Comments are closed