Как разместить часть списка режущих кромок в правильном положении для 2D списка режущих кромок - PullRequest
0 голосов
/ 04 июля 2019

Панель 2400 * 1200, и я получу входы в список режущих листов.Возможно, есть лучший способ сделать это, но я использую эту простую концепцию, чтобы сделать это.

  1. Изначально я поместил большую часть в список вырезок на основе области.

  2. Затем я проверяю одинаковую длину или ширину в доступных деталях.

  3. Затем я решил разместить его справа или снизу.

  4. Я делаю то же самое, пока все детали не будут размещены.

Проблема в том, что я не могу сохранить текущую длину и ширину размещенных деталей

Вот что я пытался сделать такдалеко

public function first_dynamic(){
       $panel_length = 2400; //length of the panel
       $panel_width = 1200; // width of the panel
       $kerf_saw = 5; // cutting saw width
       $cutlist = array (
           array(
                'length' => 97,
                'width' => 657,
                'quantity' => 6,
                'rotatable' => 1
            ),
           array(
               'length' => 1031,
               'width' => 261,
               'quantity' => 1,
               'rotatable' => 1
           ),
           array(
               'length' => 337,
               'width' => 297,
               'quantity' => 2,
               'rotatable' => 1
           )
           );
       $parts = $this->getparts($cutlist);

       $x1 = 0;//stating point of x 
       $y1 = 0;//starting point of y
       $curlength = 0;
       $curwidth = 0;
       $left = 0;
       $bottom = 0;
       $col = 0;
       $row = 0;
       //image creation
       header ("Content-type: image/png");
       $handle = ImageCreate ($panel_width, $panel_length) or die ("Cannot Create image");
       $bg_color = ImageColorAllocate ($handle, 255, 255, 255);
       $txt_color = ImageColorAllocate ($handle, 0, 0, 0);
       $blue = imagecolorallocate ($handle, 56, 196, 228);
       $i=1;
       //loop through parts
       goto domagic;

       domagic:{
           if(!empty($parts)){
               $length = $parts[0]['length'];
               $width = $parts[0]['width'];

               if($i==1){
                  $curlength = $length;
                  $curwidth = $width;
                  $row = 1;
                  $column = 1;
               }

               if($bottom){

               }
               if($left){
                   $col++;
                   $curwidth = $curwidth+$kerf_saw;
                   $x1 = $curwidth;
                   $y1=0;
                   if($curwidth+$width > $panel_width){
                       $x1 = $curwidth-$prewidth-$kerf_saw;
                       $y1 = $prelength+$kerf_saw;
                   }

               }

               imagefilledrectangle($handle, $x1, $y1, $x1+$width, $y1+$length, $blue);
               ImageString($handle, 20, $x1+10, $y1+10, "L = $length, W = $width", $txt_color);

               $x1 = $x1;
               $y1 = $y1+$length+$kerf_saw;

               unset($parts[0]);
               $parts = array_values($parts);

               if($length > $width){
                   //to check length to insert on right side
                   $left = 1;
                   $bottom = 0;
                   $parts = $this->getsimilar_length($parts,$length);
                   //have to set current width & height
                   if($i!=1){
                   $curwidth = $curwidth + $width;
                   }
               }
               if($width > $length){
                   //to check width to insert on bottom side
                   $bottom = 1;
                   $left = 0;
                   $parts = $this->getsimilar_width($parts,$width);
               }
               $prewidth = $width;
               $prelength = $length;
//               echo $i.'. Curwidth='.$curwidth.' Curlength='.$curlength.'<br/>';

               $i++;
                if($i<5){
                   goto domagic;
                }
           }
       }

       ImagePng ($handle);

   }
   public function getsimilar_width($parts,$width){
       $dum = array();
       foreach($parts as $data){
           $data['diff'] = abs($width-$data['width']);
           array_push($dum,$data);
       }
       if(!function_exists('sortdiffwid')){
       function sortdiffwid($x, $y) {
            return $x['diff'] - $y['diff'];
       }
       }
       usort($dum, 'sortdiffwid');
       return $dum;
   }
   public function getsimilar_length($parts,$length){
       $dum = array();
       foreach($parts as $data){
           $data['diff'] = abs($length-$data['length']);
           array_push($dum,$data);
       }
       if(!function_exists('sortdifflen')){
       function sortdifflen($x, $y) {
            return $x['diff'] - $y['diff'];
       }
       }
       usort($dum, 'sortdifflen');
       return $dum;
   }
   public function getparts($cutlist){
       $length = count($cutlist);
       $parts = array();
       for($i=0;$i<$length;$i++){
           $quantity = $cutlist[$i]['quantity'];
           $subpart = array();
           for($j=0;$j<$quantity;$j++){
               $subpart['length'] = $cutlist[$i]['length'];
               $subpart['width'] = $cutlist[$i]['width'];
               $subpart['rotatable'] = $cutlist[$i]['rotatable'];
               $subpart['area'] = $cutlist[$i]['length'] * $cutlist[$i]['width'];
               array_push($parts,$subpart);
           }
       }
       function sortById($x, $y) {
            return $y['area'] - $x['area'];
       }
       usort($parts, 'sortById');
       return $parts;
   }

вот что я получил

но четвертая часть на самом деле находится в неправильной позиции и должна быть во втором ряду

image - https://ibb.co/H22wPtY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...