Advertisement
Guest User

cscad

a guest
Feb 17th, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.03 KB | None | 0 0
  1. #!/usr/bin/php
  2. <?php
  3.  
  4. //print_r($_SERVER);exit;
  5.  
  6. $module_names_stl = array();
  7. $module_names_db = array();  // only nominal names
  8. $module_names_dxf = array();
  9.  
  10. $module_name = '';
  11. $module_name_nominal = '';
  12.  
  13. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  14.  
  15. $cwd = getcwd();
  16.  
  17. if(sizeof($argv)==1){
  18.   foreach(glob('*.csg.scad') as $scad_file_name){
  19.     $scad_file_name_elements = pathinfo($scad_file_name);
  20.     $cwd_elements = explode('/',$cwd);
  21.     if(is_file($scad_file_name))
  22.       process_scad_file($scad_file_name);
  23.   }
  24. }
  25.  
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28. function process_scad_file($scad_file_name){
  29.  
  30.   $scad_file_name_elements = pathinfo($scad_file_name);
  31.   // print_r($scad_file_name_elements);
  32.   if($scad_file_name_elements['extension']!='scad')
  33.     exit(print_usage());
  34.  
  35.   $scad_file_content = file($scad_file_name);
  36.  
  37.   $scad_name = str_replace('.','_',str_replace('.scad','',$scad_file_name));
  38.   $stl_header_file_name = str_replace('.scad','.stl.h',$scad_file_name);
  39.  
  40.   $cwd = getcwd();
  41.   $parent_pid = getmypid();
  42.   $datestamp = date("Y-m-d");
  43.  
  44.   // EXTRACT MODULE NAMES  ///////////////////////////////////////////////////
  45.  
  46.   foreach($scad_file_content as $l){
  47.     if(preg_match('/^module[ ]+([a-zA-Z0-9_]+)/i',$l,$matches)){
  48.       $module_name = $matches[1];
  49.       if(preg_match('/_dxf/i',$module_name)){
  50.         if(!in_array($module_name,$module_names_dxf))
  51.           $module_names_dxf[] = $module_name;
  52.       }
  53.       else if( !preg_match('/no_stl/i',$l)
  54.           && !in_array($module_name,$module_names_stl) )
  55.         $module_names_stl[] = $module_name;
  56.       else if( !preg_match('/_exploded$/i',$module_name) &&
  57.           !preg_match('/no_db/',$l)){
  58.         if(preg_match('/^CAM_/i',$module_name))
  59.           $module_name_nominal = str_replace('CAM_','',$module_name);
  60.       }
  61.     }
  62.     if(preg_match('/^[ \t]+module[ ]+([a-zA-Z0-9_]+)/i',$l,$matches)){
  63.       $submodule_name = $matches[1];
  64.       if(preg_match('/dxf/i',$l))
  65.         $modules_submodules[$module_name][$submodule_name]['dxf'] = 1;
  66.       if(preg_match('/stl/i',$l))
  67.         $modules_submodules[$module_name][$submodule_name]['stl'] = 1;
  68.     }
  69.   }
  70.  
  71.   // MAKE STL DIRECTORY ///////////////////////////////////////////////////
  72.  
  73.   $stl_dir = $cwd . '/' . str_replace('.scad','.stl',$scad_file_name);
  74.   $stl_dir_rel = str_replace('.scad','.stl',$scad_file_name);
  75.  
  76.   //$stl_dir_rel = '_stl_';
  77.   //$stl_dir = $cwd . '/'. $stl_dir_rel;
  78.  
  79.   if(!is_dir($stl_dir))
  80.     mkdir($stl_dir);
  81.   if(is_dir($stl_dir))
  82.     chmod($stl_dir,0755);
  83.  
  84.   // SAVE HEADER FILE /////////////////////////////////////////////////////
  85.  
  86.   $buffer = '//////////////////////////////////////////////////////'."\n";
  87.   $buffer .= '//'."\n";
  88.  
  89.   foreach($module_names_stl as $module_name){
  90.     $buffer .= '// '.$scad_name.'_stl("'.$module_name.'");'."\n";
  91.   }
  92.  
  93.   $buffer .= '//'."\n";
  94.   $buffer .= '//////////////////////////////////////////////////////'."\n";
  95.   $buffer .= "\n\n";
  96.  
  97.   $buffer .= 'module '.$scad_name.'_stl (select="",c,scafold=false){'."\n\n";
  98.     foreach($module_names_stl as $module_name){
  99.       $buffer .= '  if(select=="'.$module_name.'")';
  100.       $buffer .= ' '.$module_name."()children();\n";
  101.     }
  102.     $buffer .= "\n";
  103.     foreach($module_names_stl as $module_name){
  104.       $buffer .= '  module '.$module_name."(){\n";
  105.       $buffer .= '    lt_ = dict('.preg_replace('/^_/','',$scad_name).'_transforms,parent_module(2),parent_module(0));'."\n";
  106.       $buffer .= '    lt = lt_?lt_:translation([0,0,0]);'."\n";
  107.       $buffer .= '    multmatrix(lt){'."\n";
  108.       $buffer .= '      if(scafold==false)'."\n";
  109.       $buffer .= '        color('."\n";
  110.       $buffer .= '          c?c[0]:dict('.preg_replace('/^_/','',$scad_name).'_colors,parent_module(0))[0],'."\n";
  111.       $buffer .= '          c?c[1]:dict('.preg_replace('/^_/','',$scad_name).'_colors,parent_module(0))[1])'."\n";
  112.       $buffer .= '          import("'.$stl_dir_rel.'/'.$module_name.'.stl", convexity=3);'."\n";
  113.       $buffer .= '      children();'."\n";
  114.       $buffer .= '    }'."\n";
  115.       $buffer .= '  }'."\n";
  116.     }
  117.   $buffer .= "\n}\n";
  118.  
  119.  
  120.  
  121.   file_put_contents($stl_header_file_name,$buffer);
  122.   chmod($stl_header_file_name,0666);
  123.  
  124.   // EXPORT INDIVIDUAL STL FILES  ////////////////////////////////////////
  125.  
  126.   foreach($module_names_stl as $module_name){
  127.  
  128.     $pid = pcntl_fork();
  129.  
  130.     if($pid==-1) die('ERROR: could not fork');
  131.     else if($pid){}
  132.     else{
  133.  
  134.       chdir($stl_dir);
  135.       $stl_file_name = $module_name.'.stl';
  136.  
  137.       if(!is_file($stl_file_name)){
  138.  
  139.         echo 'stl: '.$module_name."\n";
  140.        
  141.         $tmp_file_name = $module_name.'.tmp.scad';
  142.         $tmp_file_content = "use <../".$scad_file_name.">\n";      
  143.         $tmp_file_content .= $module_name."();\n";
  144.         file_put_contents($tmp_file_name,$tmp_file_content);
  145.  
  146.         $cmd = "openscad -q -o $stl_file_name $tmp_file_name";
  147.         //echo $cmd."\n";
  148.         exec($cmd);
  149.         if(is_file($stl_file_name))
  150.           chmod($stl_file_name,0666);
  151.  
  152.         unlink($tmp_file_name);
  153.  
  154.       }
  155.  
  156.       exit;
  157.  
  158.     }
  159.   }
  160.  
  161.   // EXPORT INDIVIDUAL STL FILES FROM SUBMODULES ////////////////////////////////////////
  162.  
  163.   foreach($modules_submodules as $root_module_name=>$submodules)
  164.     foreach($submodules as $submodule_name=>$flags)
  165.       if($flags['stl']){
  166.  
  167.         $module_name = $root_module_name.'.'.$submodule_name;
  168.  
  169.         $pid = pcntl_fork();
  170.  
  171.         if($pid==-1) die('ERROR: could not fork');
  172.         else if($pid){}
  173.         else{
  174.  
  175.           chdir($stl_dir);
  176.           $stl_file_name = $module_name.'.stl';
  177.  
  178.           if(!is_file($stl_file_name)){
  179.  
  180.             echo 'stl: '.$module_name."\n";
  181.            
  182.             $tmp_file_name = $module_name.'.tmp.scad';
  183.             $tmp_file_content = "use <../".$scad_file_name.">\n";      
  184.             $tmp_file_content .= $root_module_name.'(select="'.$submodule_name.'");'."\n";
  185.             file_put_contents($tmp_file_name,$tmp_file_content);
  186.  
  187.             $cmd = "openscad -q -o $stl_file_name $tmp_file_name";
  188.             //echo $cmd."\n";
  189.             exec($cmd);
  190.             if(is_file($stl_file_name))
  191.               chmod($stl_file_name,0666);
  192.  
  193.             unlink($tmp_file_name);
  194.  
  195.           }
  196.  
  197.           exit;
  198.  
  199.         }
  200.       }
  201.  
  202.   // MAKE DXF DIRECTORY ///////////////////////////////////////////////////
  203.  
  204.   $dxf_dir = $cwd . '/' . str_replace('.scad','.dxf',$scad_file_name);
  205.   //$dxf_dir = $cwd . '/_dxf_';
  206.  
  207.   // EXPORT INDIVIDUAL DXF FILES  ////////////////////////////////////////
  208.  
  209.   foreach($module_names_dxf as $module_name){
  210.  
  211.     $pid = pcntl_fork();
  212.  
  213.     if($pid==-1){
  214.       die('ERROR: could not fork');
  215.     }
  216.     else if($pid){
  217.       //pcntl_wait($status);
  218.     }
  219.     else{
  220.  
  221.       if(!is_dir($dxf_dir))
  222.         mkdir($dxf_dir);
  223.       if(is_dir($dxf_dir))
  224.         chmod($dxf_dir,0755);
  225.  
  226.       chdir($dxf_dir);
  227.       $dxf_file_name = $module_name.'.dxf';
  228.  
  229.       if(!is_file($dxf_file_name)){
  230.  
  231.         echo 'dxf: '.$module_name."\n";
  232.        
  233.         $tmp_file_name = $module_name.'.tmp.scad';
  234.         $tmp_file_content = "use <../".$scad_file_name.">\n";      
  235.         $tmp_file_content .= 'projection()'.$module_name."();\n";
  236.         file_put_contents($tmp_file_name,$tmp_file_content);
  237.  
  238.         $cmd = "openscad -q -o $dxf_file_name $tmp_file_name";
  239.         //echo $cmd."\n";
  240.         exec($cmd);
  241.         if(is_file($dxf_file_name))
  242.           chmod($stl_file_name,0666);
  243.  
  244.         unlink($tmp_file_name);
  245.  
  246.       }
  247.  
  248.       break;
  249.  
  250.     }
  251.   }
  252.  
  253.  
  254. }
  255.  
  256. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  257.  
  258. function print_usage(){
  259.   echo "USAGE: cscad \n";
  260. }
  261.  
  262. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  263.  
  264. function deref_path($file_name){
  265.   if(is_link($file_name))
  266.     return(deref_path(readlink($file_name)));
  267.   else
  268.     return($file_name);
  269. }
  270.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement