/* * Dit bestand bevat enkele functies (procedures) die gebruikt kunnen * worden bij de scripting oefening van BSc2. * Boven elke procedure staat een beknopte beschrijving * en een voorbeeld hoe deze gebruikte kan worden. * * * Een lijst met procedures in dit bestand: * * - rebuildCurveZeroToOne("curvenaam"); resulaat: - * - parameterDivision(geheelgetal); resultaat: array (float) * - halfwayParameterDivision(geheelgetal); resultaat: array (float) * - tubeExtrude("profielcurve","padcurve"); resultaat: - * - extrudeTube("padcurve", getal ); resultaat: - * - parameterYRotation("curve", getal ); resultaat: float * - getObjectsByName("naam"); resultaat: array (string) * - getSelectedObjects(); resultaat: array (string) * - getSelectedCurves(); resultaat: array (string) * - isNurbsCurve("objectnaam"); resultaat: 1 of 0 (int) * */ /* rebuildCurveZeroToOne ( $object ) * Deze functie past de opgegeven curve aan naar een parameter-range van 0-1 * * vb: * rebuildCurveZeroToOne("curve1"); * */ global proc rebuildCurveZeroToOne ( string $object ) { if ( !isNurbsCurve($object) ) { //het opgegeven object is geen nurbscurve. niet verder gaan. return; } int $degree; $degree = `getAttr ($object+".degree")`; rebuildCurve -replaceOriginal 1 -end 1 -degree $degree -keepRange 0 -keepControlPoints 1 $object; } /* parameterDivision ( $numspans ) * Deze functie geeft een array met punten terug * die de reeks 0-1 in een x aantal spans onderverdeeld * * vb: * parameterDivision(5); * // Result: 0 0.2 0.4 0.6 0.8 1 // * * parameterDivision(7); * // Result: 0 0.142857 0.285714 0.428571 0.571429 0.714286 0.857143 1 // * */ global proc float[] parameterDivision ( int $numspans ) { float $distance = 1 / float($numspans); float $pos = 0; float $result[]; int $num = 0; while ( $pos <= 1 ) { $result[$num] = $pos; $num++; $pos = $num * $distance; } return $result; } /* halfwayParameterDivision ( $numspans ) * Deze functie geeft een array met punten terug * die halverwege de spans liggen van een 0-1 range die * in een x-aantal spans opgedeeld is * * vb: * halfwayParameterDivision(5); * // Result: 0.1 0.3 0.5 0.7 0.9 // * * halfwayParameterDivision(7); * // Result: 0.0714286 0.214286 0.357143 0.5 0.642857 0.785714 0.928571 // * */ global proc float[] halfwayParameterDivision ( int $numspans ) { float $distance = 1 / float($numspans); float $pos = $distance / 2; // eerste waarde ligt op de halve afstand float $result[]; int $num = 0; while ( $pos < 1 ) { $result[$num] = $pos; $num++; $pos = $pos + $distance; } return $result; } /* tubeExtrude( $profile, $path ) * Deze functie voert een extrusie van het type Tube uit * met een profiel-curve en een pad-curve * */ global proc tubeExtrude( string $profile, string $path) { extrude -ch true -rn false -po 0 -et 2 -ucp 1 -fpt 1 -upn 1 -rotation 0 -scale 1 -rsp 1 $profile $path; return; } /* extrudeTube( $path, $maintubeSize ) * maakt een cirkelvormige extrusie met opgegeven radius * langs een opgegeven pad. * */ global proc extrudeTube( string $path, float $mainTubeSize) { string $name[]; $name = `circle -r $mainTubeSize`; extrude -ch true -rn false -po 0 -et 2 -ucp 1 -fpt 1 -upn 1 -rotation 0 -scale 1 -rsp 1 $name[0] $path; return; } /* parameterYRotation( $curve, $parameter ) * Geeft de rotatie om de Y-as die nodig is om een object * uit te lijnen met een curve (in XZ vlak) op een bepaald punt * */ global proc float parameterYRotation( string $curve, float $parameter ) { float $v[]; // vector van de normaal float $angle[]; $v = `pointOnCurve -nt -pr $parameter $curve`; $angle = `angleBetween -euler -v1 1 0 0 -v2 $v[0] $v[1] $v[2]`; return $angle[1]; } /* getObjectsByName ( $name ) * Deze functie geeft een string array terug met alle objecten * met een naam die begint met de opgegeven string * * vb: * getObjectsByName("pCube"); * // Result: pCube pCube1 pCube2 etc... * */ global proc string[] getObjectsByName ( string $name ) { return `ls -long -objectsOnly ($name+"*")`; } /* getSelectedObjects () * Deze functie geeft een string array terug met * de namen van de geselecteerde objecten * * vb: * getSelectedObjects(); * // Result: |pCube1 |curve2 |nurbsSphere7 // * */ global proc string[] getSelectedObjects ( ) { string $obj[]; string $objName; string $shapes[]; string $sCurves[]; int $i = 0; return `ls -sl -long -tr -o`; } /* getSelectedCurves () * Deze functie geeft een string array terug met * geselecteerde curves * * vb: * getSelectedCurves(); * // Result: |curve1 |curve2 |curve3 // * */ global proc string[] getSelectedCurves ( ) { string $obj[]; string $objName; string $shapes[]; string $sCurves[]; int $i = 0; $obj = `ls -sl -long -tr`; //list all selected transformnodes for ( $objName in $obj ) { $shapes = `listRelatives -children -shapes $objName`; if ( `objectType $shapes[0]` == "nurbsCurve" ) { $sCurves[$i] = $objName; $i++; } } return $sCurves; } /* isNurbsCurve ( $object ) * Deze functie geeft '1' terug als het opgegeven object een NurbsCurve is * * vb: * isNurbsCurve("curve1"); * // Result: 1 // * * isNurbsCurve("pCube1"); * // Result: 0 // * */ global proc int isNurbsCurve ( string $object ) { string $shapes[]; string $objType; // Om te kunnen zien of het opgegeven object een curve is, // moeten we naar de zgn 'shapenode' kijken: $shapes = `listRelatives -children -shapes $object`; // In theorie kunnen er meerdere shapenodes zijn, // maar normaalgesproken is er maar 1, dus kijken we naar array-index 0 $objType = `objectType $shapes[0]`; if ( $objType == "nurbsCurve" ) { return 1; } else { return 0; } }