home *** CD-ROM | disk | FTP | other *** search
- // Copyright (C) 1997-2000 Alias|Wavefront,
- // a division of Silicon Graphics Limited.
- //
- // The information in this file is provided for the exclusive use of the
- // licensees of Alias|Wavefront. Such users have the right to use, modify,
- // and incorporate this code into other products for purposes authorized
- // by the Alias|Wavefront license agreement, without fee.
- //
- // ALIAS|WAVEFRONT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- // INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- // EVENT SHALL ALIAS|WAVEFRONT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- // DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- //
- //
- // Description :
- // To extract a bounded portion on a NURBS surface defined
- // by four selected isoparams on the surface.
- //
- // Usage :
- // Select 4 isoparams which enclose a region on a NURBS surface.
- // execute the script "subSurface" :
- // return the name of the nurbs surface extracted.
-
- proc float[] minMaxSrfRange( string $srf )
- //
- //
- //
- {
- float $range[] ;
- string $attr = $srf + ".mnu" ;
- $range[0] = `getAttr $attr` ;
- $attr = $srf + ".mnv" ;
- $range[1] = `getAttr $attr` ;
- $attr = $srf + ".mxu" ;
- $range[2] = `getAttr $attr` ;
- $attr = $srf + ".mxv" ;
- $range[3] = `getAttr $attr` ;
- return $range ;
- }
-
- proc string extractSubSurface(
- string $srf,
- float $umin,
- float $vmin,
- float $umax,
- float $vmax )
- //
- // Description :
- //
- {
- string $extract = "" ;
- //
- // detach surface along umin, umax
- //
- string $diru = " -d 1 " ;
- string $resultsu[] ;
- string $cmd = "detachSurface " ;
- $cmd += " -ch 0 " ;
- $cmd += " -rpo 0 " ;
- $cmd += $diru ;
- $cmd += " -p " ;
- $cmd += $umin ;
- $cmd += " -p " ;
- $cmd += $umax ;
- $cmd += " " ;
-
- $cmd += $srf ;
- $resultsu = eval($cmd) ;
- if( size($resultsu) == 0 ) return $extract ;
-
- // get the piece we really want.
- //
- int $found = -1 ;
- int $n = size($resultsu) ;
- float $midu = 0.5 * ( $umin + $umax ) ;
- float $minu, $minv ;
- float $maxu, $maxv ;
- for( $i = 0 ; $i < $n ; $i++ ) {
- float $rangeu[] ;
- $rangeu = minMaxSrfRange( $resultsu[$i] ) ;
- if( $midu <= $rangeu[2] && $midu >= $rangeu[0] ) {
- $found = $i;
- break ;
- }
- }
- if( $found == -1 ) {
- print("failed in detach along u...\n") ;
- delete $resultsu ;
- return $extract ;
- }
-
- // cut the found surface in v direction.
- //
- string $dirv = " -d 0 " ;
- $cmd = "detachSurface " ;
- $cmd += " -ch 0 " ;
- $cmd += " -rpo 0 " ;
- $cmd += $dirv ;
- $cmd += " -p " ;
- $cmd += $vmin ;
- $cmd += " -p " ;
- $cmd += $vmax ;
- string $ssrf = $resultsu[$found] ;
- $cmd += " " ;
- $cmd += $ssrf ;
- string $resultsv[] = eval($cmd) ;
- if( size($resultsv) == 0 ) {
- delete $resultsu ;
- return $extract ;
- }
- int $n = size($resultsv) ;
- float $midv = 0.5 * ( $vmin + $vmax ) ;
- for( $i = 0 ; $i < $n ; $i++ ) {
- float $rangev[] ;
- $rangev = minMaxSrfRange( $resultsv[$i] ) ;
- if( $midv <= $rangev[3] && $midv >= $rangev[1] ) {
- $found = $i;
- break ;
- }
- }
-
- delete $resultsu ;
- if( $found == -1 ) {
- print("failed in detach along v...\n") ;
- delete $resultsv ;
- return $extract ;
- }
-
- $extract = $resultsv[$found] ;
- for( $i = 0 ; $i < $n ; $i++ ) {
- if( $i != $found ) delete $resultsv[$i] ;
- }
- return $extract ;
- }
-
- global proc string subSurface()
- //
- // Description :
- // To extract only the enclosed portion of
- // the surface defined by the four selected
- // isoparms on the surface.
- //
- //
- {
-
- // get the surface from the select list.
- //
- global int $gSelectIsoparmsBit;
-
- string $slist[] = `ls -sl` ;
- if( size($slist) == 0 ) {
- error "select a nurbs surface.";
- return "" ;
- }
-
- string $srf[] ;
- $srf = `filterExpand -ex true -sm $gSelectIsoparmsBit $slist` ;
- if( size($srf) != 4 ) {
- error "select bounded NURBS surface region defined by four isoparms.";
- return "" ;
- }
-
- // get the surface. and the region (min,max) in
- // (u,v).
- //
- int $i ;
- float $uvals[] ;
- float $vvals[] ;
- float $minu, $minv ;
- float $maxu, $maxv ;
- int $uindex = 0 ;
- int $vindex = 0 ;
-
- for( $i = 0 ; $i < 4 ; $i++ ) {
- string $foundUStr = `match "\\.u\\[" $srf[$i]`;
- string $foundVStr = `match "\\.v\\[" $srf[$i]`;
- int $foundU = 0 ;
- if(size($foundUStr) > 0 ) $foundU = 1 ;
- int $foundV = 0 ;
- if(size($foundVStr) > 0 ) $foundV = 1 ;
- if( !$foundU && !$foundV ) continue ;
-
- string $buffer[] ;
- string $token = "[" ;
- tokenize($srf[$i], "[", $buffer);
-
- // get the parameter value.
- //
- string $b[] ;
- $token = "]" ;
- tokenize( $buffer[1], $token, $b) ;
-
- if( $foundU ) {
- $uvals[$uindex] = $b[0] ;
- $uindex++ ;
- } else if( $foundV ) {
- $vvals[$vindex] = $b[0] ;
- $vindex++ ;
- }
- }
-
- string $buffer[] ;
- tokenize($srf[0], ".", $buffer);
- string $surface = $buffer[0];
-
- $umin = $uvals[0] ;
- $umax = $uvals[1] ;
- if( $uvals[0] > $uvals[1] ) {
- $umin = $uvals[1] ;
- $umax = $uvals[0] ;
- }
-
- $vmin = $vvals[0] ;
- $vmax = $vvals[1] ;
- if( $vvals[0] > $vvals[1] ) {
- $vmin = $vvals[1] ;
- $vmax = $vvals[0] ;
- }
-
- string $subSrf = extractSubSurface($surface,$umin,$vmin,$umax,$vmax);
- select -r $subSrf ;
- return $subSrf ;
- }
-