UV Cut + Unfold v1.0

PHOTO EMBED

Tue Aug 12 2025 07:42:24 GMT+0000 (Coordinated Universal Time)

Saved by @enite

// ===== UV Cut + Unfold (+ Pack / Texel Density / Padding) — Stable MEL (Maya 2026) =====

global proc uvCU_RunPad(float $td, int $mapSize, int $doSetTD, int $doPack, float $padding)
{
    if ($doSetTD && $td <= 0.0)  error "Texel Density must be > 0.";
    if ($doSetTD && $mapSize <= 0) error "Map Size must be > 0.";

    string $edges[] = `filterExpand -sm 32 -ex 1`;
    if (!size($edges)) error "Select polygon edges (UV seams) first.";

    string $owners[] = `ls -o $edges`;
    string $xforms[];
    for ($o in $owners) {
        string $p[] = `listRelatives -p -pa $o`;
        if (size($p)) {
            int $seen = 0; for ($t in $xforms){ if ($t==$p[0]){$seen=1;break;} }
            if (!$seen) $xforms[size($xforms)] = $p[0];
        }
    }

    select -r $edges;
    polyMapCut;

    // Select ALL UVs on those meshes
    select -cl;
    for ($t in $xforms) {
        string $uvs[] = `polyListComponentConversion -toUV $t`;
        select -add $uvs;
    }
    select -r `filterExpand -sm 35 -ex 1`;

    // If no UVs yet, seed a quick projection & reselect UVs
    if (!size(`ls -sl -fl`)) {
        for ($t in $xforms) {
            select -r $t;
            polyAutoProjection -lm 0 -pb 0 -ibd 1 -cm 0 -l 2 -sc 1 -o 1 -p 6 -ps 0.2 -ch 0;
        }
        select -cl;
        for ($t in $xforms) {
            string $uvs2[] = `polyListComponentConversion -toUV $t`;
            select -add $uvs2;
        }
        select -r `filterExpand -sm 35 -ex 1`;
    }

    // Unfold (Unfold3D tool entry)
    u3dUnfold;

    // Optional Texel Density
    if ($doSetTD) {
        texSetTexelDensity $td $mapSize;
    }

    // Optional Pack (padding in UV units 0..1)
    if ($doPack) {
        polyLayoutUV -l 2 -sc 1 -fr 1 -ps $padding -ch 0;
    }

    string $msg = "[UV] Cut + Unfold";
    if ($doSetTD) $msg += " + TD";
    if ($doPack)  $msg += (" + Pack (Padding: " + $padding + ")");
    print ($msg + ".\n");
}

// Camera planar from current view (your requested flags)
global proc uvCU_PlanarFromCamera()
{
    string $sel[] = `ls -sl`;
    if (!size($sel)) error "Select mesh components or objects to project.";

    string $faces[] = `filterExpand -sm 34 -ex 1`;
    if (!size($faces)) {
        string $toFaces[] = `polyListComponentConversion -toFace $sel`;
        $faces = `filterExpand -sm 34 -ex 1 $toFaces`;
    }
    if (!size($faces)) error "Could not resolve faces from selection.";

    select -r $faces;
    polyProjection -type Planar -md p -constructionHistory 1;

    print "[UV] Camera-based planar projection applied from view.\n";
}

// Button callback — query controls by explicit names and run
global proc uvCU_OnRun()
{
    float $td      = `floatFieldGrp -q -value1 uvCU_tdFld`;
    int   $ms      = `intFieldGrp   -q -value1 uvCU_msFld`;
    int   $doTD    = `checkBox      -q -v      uvCU_cbTD`;
    int   $doPack  = `checkBox      -q -v      uvCU_cbPack`;
    float $padding = `floatFieldGrp -q -value1 uvCU_padFld`;

    optionVar -fv "uvCU_texelDensity" $td;
    optionVar -iv "uvCU_mapSize"      $ms;
    optionVar -iv "uvCU_doSetTD"      $doTD;
    optionVar -iv "uvCU_doPack"       $doPack;
    optionVar -fv "uvCU_padding"      $padding;

    uvCU_RunPad($td, $ms, $doTD, $doPack, $padding);
}

// UI — controls are created with fixed names so callbacks never break
global proc uvCU_UI()
{
    string $win = "uvCutUnfoldTDWin";
    if (`window -exists $win`) deleteUI -window $win;

    window -title "ChatGPT X CS UV Tool" -widthHeight 420 300 $win;
    columnLayout -adj true -rs 6;

        float $defTD   = (`optionVar -exists "uvCU_texelDensity"`) ? `optionVar -q "uvCU_texelDensity"` : 8.0;
        int   $defMap  = (`optionVar -exists "uvCU_mapSize"`)      ? `optionVar -q "uvCU_mapSize"`      : 2048;
        int   $defDoTD = (`optionVar -exists "uvCU_doSetTD"`)      ? `optionVar -q "uvCU_doSetTD"`      : 1;
        int   $defPack = (`optionVar -exists "uvCU_doPack"`)       ? `optionVar -q "uvCU_doPack"`       : 1;
        float $defPad  = (`optionVar -exists "uvCU_padding"`)      ? `optionVar -q "uvCU_padding"`      : 0.005;

        // Name each control explicitly (last arg)
        floatFieldGrp -label "Texel Density (px/unit)" -numberOfFields 1 -value1 $defTD  uvCU_tdFld;
        intFieldGrp   -label "Map Size (px)"           -numberOfFields 1 -value1 $defMap uvCU_msFld;
        checkBox      -l "Scale to density after unfold" -v $defDoTD uvCU_cbTD;
        checkBox      -l "Pack after unfold"             -v $defPack uvCU_cbPack;
        floatFieldGrp -label "UV Padding (0..1)"       -numberOfFields 1 -value1 $defPad uvCU_padFld;

        separator -style "in";

        rowLayout -nc 3 -cw3 180 160 60 -ct3 "both" "both" "both" -co3 2 2 2;
            button -label "CameraBased Planar" -c "uvCU_PlanarFromCamera();";
            button -label "Cut + Unfold"       -c "uvCU_OnRun();";
            button -label "Close"               -c ("deleteUI -window " + $win);
        setParent ..;

    showWindow $win;
}

// Launch
uvCU_UI();
content_copyCOPY