home *** CD-ROM | disk | FTP | other *** search
/ Learning Maya 3 / Learning_Maya_3.iso / docs / mel_scripts / includes / subSurface.mel < prev   
Encoding:
Text File  |  2000-05-17  |  5.1 KB  |  227 lines

  1. // Copyright (C) 1997-2000 Alias|Wavefront,
  2. // a division of Silicon Graphics Limited.
  3. //
  4. // The information in this file is provided for the exclusive use of the
  5. // licensees of Alias|Wavefront.  Such users have the right to use, modify,
  6. // and incorporate this code into other products for purposes authorized
  7. // by the Alias|Wavefront license agreement, without fee.
  8. //
  9. // ALIAS|WAVEFRONT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  10. // INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  11. // EVENT SHALL ALIAS|WAVEFRONT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  12. // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  13. // DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  14. // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  15. // PERFORMANCE OF THIS SOFTWARE.
  16. //
  17. //
  18. //    Description :
  19. //        To extract a bounded portion on a NURBS surface defined
  20. //        by four selected isoparams on the surface.
  21. //
  22. //    Usage :
  23. //        Select 4 isoparams which enclose a region on a NURBS surface.
  24. //        execute the script "subSurface" : 
  25. //        return the name of the nurbs surface extracted.
  26.  
  27. proc float[] minMaxSrfRange( string $srf ) 
  28. //
  29. //
  30. //
  31. {
  32.     float $range[] ;
  33.     string $attr = $srf + ".mnu" ;
  34.     $range[0] = `getAttr $attr` ;
  35.     $attr = $srf + ".mnv" ;
  36.     $range[1] = `getAttr $attr` ;
  37.     $attr = $srf + ".mxu" ;
  38.     $range[2] = `getAttr $attr` ;
  39.     $attr = $srf + ".mxv" ;
  40.     $range[3] = `getAttr $attr` ;
  41.     return $range ;
  42. }
  43.  
  44. proc string extractSubSurface(
  45.     string $srf,
  46.     float $umin,
  47.     float $vmin,
  48.     float $umax,
  49.     float $vmax )
  50. //
  51. //    Description :
  52. //
  53. {
  54.     string $extract = "" ;
  55.     //
  56.     // detach surface  along umin, umax
  57.     //
  58.     string $diru = " -d 1 " ; 
  59.     string $resultsu[] ;
  60.     string $cmd = "detachSurface " ;
  61.     $cmd += " -ch 0 " ;        
  62.     $cmd += " -rpo 0 " ;
  63.     $cmd += $diru ;
  64.     $cmd += " -p " ;
  65.     $cmd += $umin ;
  66.     $cmd += " -p " ;
  67.     $cmd += $umax ;
  68.     $cmd += " " ;
  69.  
  70.     $cmd += $srf  ;
  71.     $resultsu = eval($cmd) ;
  72.     if( size($resultsu) == 0 ) return $extract ;
  73.  
  74.     // get the piece we really want.
  75.     //
  76.     int $found = -1 ;
  77.     int $n = size($resultsu) ;
  78.     float $midu = 0.5 * ( $umin + $umax ) ;
  79.     float $minu, $minv ;
  80.     float $maxu, $maxv ;
  81.     for( $i = 0 ; $i < $n ; $i++ ) {
  82.         float $rangeu[] ;
  83.         $rangeu = minMaxSrfRange( $resultsu[$i] ) ;
  84.         if( $midu <= $rangeu[2] && $midu >= $rangeu[0] ) {
  85.             $found = $i;
  86.             break ;
  87.         } 
  88.     }
  89.     if( $found == -1  )  {
  90.         print("failed in detach along u...\n") ;
  91.         delete $resultsu ;
  92.         return $extract ;
  93.     }
  94.  
  95.     // cut the found surface in v direction.
  96.     //
  97.     string $dirv = " -d 0 " ; 
  98.     $cmd = "detachSurface " ;
  99.     $cmd += " -ch 0 " ;        
  100.     $cmd += " -rpo 0 " ;
  101.     $cmd += $dirv ;
  102.     $cmd += " -p " ;
  103.     $cmd += $vmin ;
  104.     $cmd += " -p " ;
  105.     $cmd += $vmax ;
  106.     string $ssrf = $resultsu[$found] ;
  107.     $cmd += " " ;
  108.     $cmd += $ssrf ;
  109.     string $resultsv[] = eval($cmd) ;
  110.     if( size($resultsv) == 0 ) {
  111.         delete $resultsu ;
  112.         return $extract ;
  113.     }
  114.     int $n = size($resultsv) ;
  115.     float $midv = 0.5 * ( $vmin + $vmax ) ;
  116.     for( $i = 0 ; $i < $n ; $i++ ) {
  117.         float $rangev[] ;
  118.         $rangev = minMaxSrfRange( $resultsv[$i] ) ;
  119.         if( $midv <= $rangev[3] && $midv >= $rangev[1] ) {
  120.             $found = $i;
  121.             break ;
  122.         } 
  123.     }
  124.  
  125.     delete $resultsu ;
  126.     if( $found == -1  )  {
  127.         print("failed in detach along v...\n") ;
  128.         delete $resultsv ;
  129.         return $extract ;
  130.     }
  131.  
  132.     $extract = $resultsv[$found] ;    
  133.     for( $i = 0 ; $i < $n ; $i++ ) {
  134.         if( $i != $found ) delete $resultsv[$i] ;
  135.     }
  136.     return $extract ;
  137. }
  138.  
  139. global proc string subSurface()
  140. //
  141. // Description :
  142. //        To extract only the enclosed portion of
  143. //        the surface defined by the four selected
  144. //        isoparms on the surface.
  145. //    
  146. //
  147. {
  148.  
  149.     // get the surface from the select list.
  150.     //
  151.     global int $gSelectIsoparmsBit;
  152.  
  153.     string $slist[] = `ls -sl` ;
  154.     if( size($slist) == 0 ) {
  155.         error "select a nurbs surface.";
  156.         return "" ;
  157.     }
  158.  
  159.     string $srf[] ;
  160.     $srf = `filterExpand -ex true -sm $gSelectIsoparmsBit $slist` ;
  161.     if( size($srf) != 4 ) {
  162.         error "select bounded NURBS surface region defined by four isoparms.";
  163.         return "" ;
  164.     }
  165.  
  166.     // get the surface. and the region (min,max) in
  167.     // (u,v).
  168.     //
  169.     int $i ;
  170.     float $uvals[] ;
  171.     float $vvals[] ;
  172.     float $minu, $minv ;
  173.     float $maxu, $maxv ;
  174.     int $uindex = 0 ;
  175.     int $vindex = 0 ;
  176.  
  177.     for( $i = 0 ; $i < 4 ; $i++ ) {
  178.         string $foundUStr = `match "\\.u\\[" $srf[$i]`;
  179.         string $foundVStr = `match "\\.v\\[" $srf[$i]`;
  180.         int $foundU = 0 ;
  181.         if(size($foundUStr) > 0 ) $foundU = 1 ;
  182.         int $foundV = 0 ;
  183.         if(size($foundVStr) > 0 ) $foundV = 1 ;
  184.         if( !$foundU && !$foundV ) continue ;
  185.  
  186.         string $buffer[] ;
  187.         string $token = "[" ;
  188.         tokenize($srf[$i], "[", $buffer);
  189.  
  190.         // get the parameter value.
  191.         //
  192.         string $b[] ;
  193.         $token = "]" ;
  194.         tokenize( $buffer[1], $token, $b) ;     
  195.  
  196.         if( $foundU ) {
  197.             $uvals[$uindex] = $b[0] ;
  198.             $uindex++ ;
  199.         } else if( $foundV ) {
  200.             $vvals[$vindex] = $b[0] ;
  201.             $vindex++ ;
  202.         }
  203.     }
  204.  
  205.     string $buffer[] ;
  206.     tokenize($srf[0], ".", $buffer);
  207.     string $surface = $buffer[0];
  208.  
  209.     $umin = $uvals[0] ;
  210.     $umax = $uvals[1] ;
  211.     if( $uvals[0] > $uvals[1] ) {
  212.         $umin = $uvals[1] ;
  213.         $umax = $uvals[0] ;
  214.     }
  215.  
  216.     $vmin = $vvals[0] ;
  217.     $vmax = $vvals[1] ;
  218.     if( $vvals[0] > $vvals[1] ) {
  219.         $vmin = $vvals[1] ;
  220.         $vmax = $vvals[0] ;
  221.     }
  222.  
  223.     string $subSrf = extractSubSurface($surface,$umin,$vmin,$umax,$vmax);
  224.     select -r $subSrf ;
  225.     return $subSrf ;
  226. }
  227.