running_case = array( 'bpmnActivity' => $arrActivity, ); //GET DIAGRAMS $diagrams = $this->get_project_diagrams($schema['diagrams']); foreach ($diagrams as $diagram) { $files = $this->diagram_to_png($diagram); } } return $files; } /** * Function to retrieve shapes of diagrams * @param $prj_id */ private function get_project_diagrams($diagram) { $this->diagram = $diagram; if (isset($diagram)) { $response = array(); foreach ($diagram as $row) { $tmp = new \stdClass(); $tmp->activities = $row['activities']; $tmp->events = $row['events']; $tmp->gateways = $row['gateways']; $tmp->artifacts = $row['artifacts']; $tmp->flows = $row['flows']; $tmp->datas = $row['data']; $tmp->participants = $row['participants']; $tmp->laneset = $row['laneset']; $tmp->lanes = $row['lanes']; $response[] = $tmp; } return $response; } } private function diagram_to_png($diagram, $prj_name = '') { $serialize_data = serialize($diagram); $data = unserialize($serialize_data); $png_data = $this->convert_png_array($data); //TODO: avoid hardcoded $sprite_filename = PATH_HTML . 'lib/img/mafe_sprite.png'; //TODO: avoid hardcoded $sprite_filename_bw = PATH_HTML . 'lib/img/mafe_sprite.png'; $image_sprite = imagecreatefrompng($sprite_filename); $image_sprite_bw = imagecreatefrompng($sprite_filename_bw); $sprite_map = $this->load_sprite_coords(); $image = $this->allocate_diagram_image($png_data, $sprite_map, $image_sprite, $image_sprite_bw); return $image; } private function convert_png_array($data) { $pngArray = array(); foreach ($data->participants as $participants) { $tmpData = array(); $tmpData[0] = 'bpmnParticipant'; $tmpData[1] = $participants['bou_x']; $tmpData[2] = $participants['bou_y']; $tmpData[3] = $participants['bou_width']; $tmpData[4] = $participants['bou_height']; $tmpData[5] = ""; $tmpData[6] = $participants['par_name']; $tmpData[7] = ""; $tmpData[8] = $participants['par_uid']; $pngArray[] = $tmpData; } foreach ($data->laneset as $laneset) { $tmpData = array(); $tmpData[0] = 'bpmnPool'; $tmpData[1] = $laneset['bou_x']; $tmpData[2] = $laneset['bou_y']; $tmpData[3] = $laneset['bou_width']; $tmpData[4] = $laneset['bou_height']; //$tmpData[5] = $laneset['dat_type']; $tmpData[6] = $laneset['lns_name']; $tmpData[7] = ""; $tmpData[8] = $laneset['lns_uid']; $pngArray[] = $tmpData; } foreach ($data->lanes as $lanes) { $tmpData = array(); $tmpData[0] = 'bpmnLane'; $tmpData[1] = $lanes['bou_x']; $tmpData[2] = $lanes['bou_y']; $tmpData[3] = $lanes['bou_width']; $tmpData[4] = $lanes['bou_height']; $tmpData[5] = ""; $tmpData[6] = $lanes['lan_name']; $tmpData[7] = ""; $tmpData[8] = $lanes['lan_uid']; $tmpData[9] = ""; $tmpData[10] = $lanes['bou_container']; $tmpData[11] = $lanes['bou_element']; $pngArray[] = $tmpData; } foreach ($data->activities as $activity) { $tmpData = array(); $tmpData[0] = 'bpmnActivity'; $tmpData[1] = $activity['bou_x']; $tmpData[2] = $activity['bou_y']; $tmpData[3] = $activity['bou_width']; $tmpData[4] = $activity['bou_height']; $tmpData[5] = $activity['act_type']; $tmpData[6] = $activity['act_name']; $tmpData[7] = $activity['act_task_type'] . '_' . $activity['act_loop_type'] . '_' . $activity['act_is_adhoc'] . '_' . $activity['act_is_collapsed']; $tmpData[8] = $activity['act_uid']; $tmpData[9] = $activity['act_script_type']; $tmpData[10] = $activity['bou_container']; $tmpData[11] = $activity['bou_element']; $pngArray[] = $tmpData; } foreach ($data->events as $event) { $tmpData = array(); $tmpData[0] = 'bpmnEvent'; $tmpData[1] = $event['bou_x']; $tmpData[2] = $event['bou_y']; $tmpData[3] = $event['bou_width']; $tmpData[4] = $event['bou_height']; if ($event['evn_type'] == 'BOUNDARY') { $tmpData[5] = $event['evn_is_interrupting'] . '_INTERMEDIATE_EVENT'; } else { $tmpData[5] = $event['evn_is_interrupting'] . '_' . $event['evn_type'] . '_EVENT'; } $tmpData[6] = $event['evn_name']; if ($event['evn_type'] == 'BOUNDARY') { $tmpData[7] = 'INTERMEDIATE_' . $event['evn_marker'] . '_' . $event['evn_behavior']; } else if ($event['evn_type'] == 'INTERMEDIATE') { if ($event['evn_marker'] == 'EMPTY') { $tmpData[7] = 'EMPTY'; } else { if ($event['evn_behavior'] != '') { $tmpData[7] = $event['evn_type'] . '_' . $event['evn_marker'] . '_' . $event['evn_behavior']; } else { $tmpData[7] = $event['evn_type'] . '_' . $event['evn_marker']; } } } else { if ($event['evn_marker'] == 'EMPTY') { $tmpData[7] = 'EMPTY'; } else { if ($event['evn_message'] != '') { $tmpData[7] = $event['evn_type'] . '_' . $event['evn_marker'] . '_' . $event['evn_message']; } else { $tmpData[7] = $event['evn_type'] . '_' . $event['evn_marker']; } } } $tmpData[8] = $event['evn_uid']; $tmpData[9] = ""; $tmpData[10] = $event['bou_container']; $tmpData[11] = $event['bou_element']; $pngArray[] = $tmpData; } foreach ($data->gateways as $gateway) { $tmpData = array(); $tmpData[0] = 'bpmnGateway'; $tmpData[1] = $gateway['bou_x']; $tmpData[2] = $gateway['bou_y']; $tmpData[3] = $gateway['bou_width']; $tmpData[4] = $gateway['bou_height']; $tmpData[5] = $gateway['gat_type'] . '_GATEWAY'; $tmpData[6] = $gateway['gat_name']; $tmpData[7] = ''; $tmpData[8] = $gateway['gat_uid']; $tmpData[9] = ''; $tmpData[10] = $gateway['bou_container']; $tmpData[11] = $gateway['bou_element']; $pngArray[] = $tmpData; } foreach ($data->artifacts as $artifact) { $tmpData = array(); $tmpData[0] = 'bpmnArtifact'; $tmpData[1] = $artifact['bou_x']; $tmpData[2] = $artifact['bou_y']; $tmpData[3] = $artifact['bou_width']; $tmpData[4] = $artifact['bou_height']; $tmpData[5] = $artifact['art_name']; $tmpData[6] = $artifact['art_type']; $tmpData[7] = ''; $tmpData[8] = $artifact['art_uid']; $tmpData[9] = ''; $tmpData[10] = $artifact['bou_container']; $tmpData[11] = $artifact['bou_element']; $pngArray[] = $tmpData; } foreach ($data->flows as $flow) { $tmpData = array(); $tmpData[0] = 'bpmnFlow'; $tmpData[1] = $flow['flo_name']; $tmpData[2] = $flow['flo_type']; $tmpData[3] = $flow['flo_element_origin_type']; $tmpData[4] = "";//$flow['flo_element_origin_port']; $tmpData[5] = $flow['flo_element_dest_type']; $tmpData[6] = "";//$flow['flo_element_dest_port']; $tmpData[7] = $flow['flo_element_origin']; $tmpData[8] = $flow['flo_element_dest']; $tmpData[9] = $flow['flo_state']; $pngArray[] = $tmpData; } foreach ($data->datas as $data) { $tmpData = array(); $tmpData[0] = 'bpmnData'; $tmpData[1] = $data['bou_x']; $tmpData[2] = $data['bou_y']; $tmpData[3] = $data['bou_width']; $tmpData[4] = $data['bou_height']; $tmpData[5] = $data['dat_type']; $tmpData[6] = $data['dat_name']; $tmpData[7] = ""; $tmpData[8] = $data['dat_uid']; $tmpData[9] = ''; $tmpData[10] = $data['bou_container']; $tmpData[11] = $data['bou_element']; $pngArray[] = $tmpData; } return $pngArray; } private function load_sprite_coords() { $xMap = array(); $xMap['1_START_EVENT'] = array(0, 6623); $xMap['START_MESSAGECATCH_LEAD'] = array(0, 6770); $xMap['START_TIMER_LEAD'] = array(0, 10382); $xMap['START_CONDITIONAL_LEAD'] = array(0, 4737); $xMap['START_SIGNALCATCH_LEAD'] = array(0, 4643); $xMap['INTERMEDIATE_MESSAGETHROW_THROW'] = array(0, 5425); // $xMap['INTERMEDIATE_LINKTHROW_THROW'] = array(0, 4887); // $xMap['INTERMEDIATE_COMPENSATIONTHROW_THROW'] = array(0, 4260); $xMap['INTERMEDIATE_SIGNALTHROW_THROW'] = array(0, 5556); $xMap['INTERMEDIATE_MESSAGECATCH_CATCH'] = array(0, 10509); $xMap['INTERMEDIATE_TIMER_CATCH'] = array(0, 4405); $xMap['INTERMEDIATE_CONDITIONAL_CATCH'] = array(0, 5310); // $xMap['INTERMEDIATE_LINKCATCH_CATCH'] = array(0, 4648); $xMap['INTERMEDIATE_SIGNALCATCH_CATCH'] = array(0, 5162); $xMap['1_END_EVENT'] = array(0, 6704); $xMap['END_MESSAGETHROW'] = array(0, 6856); $xMap['END_ERRORTHROW'] = array(0, 6312); $xMap['END_CANCELTHROW'] = array(0, 5125); $xMap['END_COMPENSATIONTHROW'] = array(0, 5473); $xMap['END_SIGNALTHROW'] = array(0, 6985); $xMap['END_TERMINATETHROW'] = array(0, 6737); $xMap['EXCLUSIVE_GATEWAY'] = array(0, 3228); $xMap['PARALLEL_GATEWAY'] = array(0, 4438); $xMap['INCLUSIVE_GATEWAY'] = array(0, 2736); // $xMap['EVENTBASED_GATEWAY'] = array(0, 2753); // $xMap['COMPLEX_GATEWAY'] = array(0, 4394); $xMap['TASK_SENDTASK'] = array(0, 11059); $xMap['TASK_RECEIVETASK'] = array(0, 10890); $xMap['TASK_USERTASK'] = array(0, 6482); $xMap['TASK_SERVICETASK'] = array(0, 10187); $xMap['TASK_SCRIPTTASK'] = array(0, 10361); $xMap['TASK_MANUALTASK'] = array(0, 10688); $xMap['TASK_BUSINESSRULE'] = array(0, 11136); $xMap['LOOP_LOOP'] = array(0, 8439); $xMap['LOOP_PARALLEL'] = array(0, 9714); $xMap['LOOP_SEQUENTIAL'] = array(0, 9642); $xMap['DATAOBJECT'] = array(0, 8010); $xMap['DATAINPUT'] = array(0, 8544); $xMap['DATAOUTPUT'] = array(0, 8824); $xMap['DATASTORE'] = array(0, 3780); $xMap['arrow_target_right'] = array(0, 9333); $xMap['arrow_target_left'] = array(0, 9380); $xMap['arrow_target_top'] = array(0, 9425); $xMap['arrow_target_bottom'] = array(0, 9458); $xMap['arrow_conditional_source_right'] = array(0, 99); $xMap['arrow_conditional_source_left'] = array(0, 99); $xMap['arrow_conditional_source_top'] = array(0, 111); $xMap['arrow_conditional_source_bottom'] = array(0, 111); $xMap['arrow_default_source_right'] = array(0, 6893); $xMap['arrow_default_source_left'] = array(0, 6910); $xMap['arrow_default_source_top'] = array(0, 6863); $xMap['arrow_default_source_bottom'] = array(0, 6882); $xMap['text_now'] = array(0, 0); $xMap['icon_terminated'] = array(0, 10); return $xMap; } private function allocate_diagram_image(array $pngData, $xSpriteMap, $imgSprite, $imgSpriteBW = '') { $font = PATH_HTML .'lib/fonts/Chivo/Chivo-Regular.ttf'; $minX = 10000; $minY = 10000; $maxW = 0; $maxH = 0; $border = 40; foreach ($pngData as $coords) { if ($coords[0] !== 'bpmnFlow') { if ($minX > $coords[1]) { $minX = $coords[1]; } if ($minY > $coords[2]) { $minY = $coords[2]; } if ($maxW < ($coords[1] + $coords[3])) { $maxW = $coords[1] + $coords[3]; } if ($maxH < ($coords[2] + $coords[4])) { $maxH = $coords[2] + $coords[4]; } } } $x1 = $minX - $border; $y1 = $minY - $border; $x2 = $maxW + $border; $y2 = $maxH + $border; $cWidth = $x2 - $x1; $cHeight = $y2 - $y1; if ($cWidth < 0 && $cHeight < 0) { $cWidth = 100; $cHeight = 100; } $img = imagecreatetruecolor($cWidth, $cHeight); $white = imagecolorallocate($img, 255, 255, 255); $black = imagecolorallocate($img, 0, 0, 0); $groupColor = imagecolorallocate($img, 153, 94, 6); $gray = imagecolorallocate($img, 0xC0, 0xC0, 0xC0); $aNotSupportedColor = imagecolorallocate($img, 59, 71, 83); $aNotSupportedFillColor = $white; imagefill($img,0,0,$white); foreach ($pngData as $figure) { $shape_running = $this->get_shape_process($figure[8], $figure[0], $img); $shape_image = $imgSprite ; $aTaskColor = isset($shape_running->colors['color']) ? $shape_running->colors['color'] : imagecolorallocate($img, 59, 71, 83); $aTaskFillColor = isset($shape_running->colors['fillcolor']) ? $shape_running->colors['fillcolor'] : imagecolorallocate($img, 255, 255, 255); switch ($figure[0]) { case 'bpmnParticipant': case 'bpmnPool': $X1 = $figure[1] - $x1; $Y1 = $figure[2] - $y1; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4]; $points = array($X1 + 3, $Y1, $X2 - 3, $Y1, $X2, $Y1 + 3, $X2, $Y2 - 3, $X2 - 3, $Y2, $X1 + 3, $Y2, $X1, $Y2 - 3, $X1, $Y1 + 3); $borderColor = $aNotSupportedColor; $fillColor = $aNotSupportedFillColor; imagesetthickness($img, 3); imagefilledpolygon($img, $points, 8, $fillColor); imagepolygon($img, $points, 8, $borderColor); imageline ( $img , $X1+40 , $Y1 , $X1+40 , $Y2 , $aTaskColor ); //Print Text if (isset($figure[9]) && $figure[9] != '') { $tt = explode('_', $figure[7]); $this->print_text($img, $figure[6], 10, 90, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0], $tt[0]); } else { $this->print_text($img, $figure[6], 10, 90, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0]); } break; case 'bpmnLane': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $X1 = $figure[1] - $x1 + $newPoints[0]; $Y1 = $figure[2] - $y1 + $newPoints[1]; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4]; $points = array($X1 + 3, $Y1, $X2 - 3, $Y1, $X2, $Y1 + 3, $X2, $Y2 - 3, $X2 - 3, $Y2, $X1 + 3, $Y2, $X1, $Y2 - 3, $X1, $Y1 + 3); $borderColor = $aNotSupportedColor; $fillColor = $aNotSupportedFillColor; imagesetthickness($img, 3); imagefilledpolygon($img, $points, 8, $fillColor); imagepolygon($img, $points, 8, $borderColor); if (isset($figure[9]) && $figure[9] != '') { $tt = explode('_', $figure[7]); $this->print_text($img, $figure[6], 10, 90, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0], $tt[0]); } else { $this->print_text($img, $figure[6], 10, 90, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0], $figure[5]); } break; case 'bpmnActivity': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $X1 = $figure[1] - $x1 + $newPoints[0]; $Y1 = $figure[2] - $y1 + $newPoints[1]; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4]; $properties = explode('_', $figure[7]); $points = array($X1 + 3, $Y1, $X2 - 3, $Y1, $X2, $Y1 + 3, $X2, $Y2 - 3, $X2 - 3, $Y2, $X1 + 3, $Y2, $X1, $Y2 - 3, $X1, $Y1 + 3); $points2 = array($X1 + 5, $Y1 + 2, $X2 - 5, $Y1 + 2, $X2 - 2, $Y1 + 5, $X2 - 2, $Y2 - 5, $X2 - 5, $Y2 - 2, $X1 + 5, $Y2 - 2, $X1 + 2, $Y2 - 5, $X1 + 2, $Y1 + 5); switch ($figure[5]) { case 'TASK': $borderColor = $aTaskColor; $fillColor = $aTaskFillColor; imagesetthickness($img, 2); break; default: $borderColor = $aNotSupportedColor; $fillColor = $aNotSupportedFillColor; imagesetthickness($img, 4); } //CURRENT CASE if ($shape_running->running) { $points_active = array($X1 + 3, $Y1, $X2 - 3, $Y1, $X2, $Y1 + 3, $X2, $Y2 - 3, $X2 - 3, $Y2, $X1 + 3, $Y2, $X1, $Y2 - 3, $X1, $Y1 + 3); imagefilledpolygon($img, $points, 8, $fillColor); imagepolygon($img, $points_active, 8, $borderColor); } else { imagefilledpolygon($img, $points, 8, $fillColor); imagepolygon($img, $points, 8, $borderColor); } //Task Type if ($figure[5] == 'TASK' || $figure[5] == 'TASKCALLACTIVITY') { if (isset($figure[9]) && $figure[9] != '') { $css = 'scripttask_' . strtolower($figure[9]); $spriteCoords = $xSpriteMap[$css]; imagecopy($img, $shape_image, $figure[1] - $x1 - 2 + $newPoints[0], $figure[2] - $y1 - 2 + $newPoints[1], $spriteCoords[0], $spriteCoords[1], 39, 39); } elseif ($properties[0] != "EMPTY") { $css = 'TASK_' . strtoupper($properties[0]); $spriteCoords = $xSpriteMap[$css]; imagecopy($img, $shape_image, $figure[1] - $x1 + 4 + $newPoints[0], $figure[2] - $y1 + 4 + $newPoints[1], $spriteCoords[0], $spriteCoords[1], 21, 21); } } //Makers if ($figure[5] == 'TASK' && ($properties[1] != 'NONE' && $properties[1] != 'EMPTY')) { $css = 'LOOP_' . strtoupper($properties[1]); $spriteCoords = $xSpriteMap[$css]; imagecopy($img, $shape_image, $figure[1] - $x1 + $newPoints[0] + ($figure[3] - 21) / 2, $figure[2] - $y1 + $newPoints[1] + $figure[4] - 23, $spriteCoords[0], $spriteCoords[1], 21, 21); } //Print Text if (isset($figure[9]) && $figure[9] != '') { $tt = explode('_', $figure[7]); $this->print_text($img, $figure[6], 10, 0, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0], $tt[0]); } else { $this->print_text($img, $figure[6], 10, 0, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0], $figure[5]); } break; case 'bpmnEvent': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $X1 = $figure[1] - $x1 + $newPoints[0]; $Y1 = $figure[2] - $y1 + $figure[4] - 10 + $newPoints[1]; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4] + 5; $css = $figure[5]; $marker = $figure[7]; $spriteCoords = ($marker != 'EMPTY')?$xSpriteMap[$marker]:$xSpriteMap[$css]; $mk = explode('_', $figure[7]); //CURRENT CASE imagecopy($img, $shape_image, $figure[1] - $x1 + $newPoints[0], $figure[2] - $y1 + $newPoints[1], $spriteCoords[0], $spriteCoords[1], $figure[3], $figure[4]); if ($marker != 'EMPTY') { //END_CANCELTHROW??? if (isset($xSpriteMap[$marker])) { $spriteCoords2 = $xSpriteMap[$marker]; if (!($shape_running->running && $mk[1] == 'TIMER')) { imagecopy($img, $shape_image, $figure[1] - $x1 + $newPoints[0], $figure[2] - $y1 + $newPoints[1], $spriteCoords2[0], $spriteCoords2[1], $figure[3], $figure[4]); } } } $this->print_text($img, $figure[6], 10, 0, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0]); break; case 'bpmnGateway': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $X1 = $figure[1] - $x1 + $newPoints[0]; $Y1 = $figure[2] - $y1 + $figure[4] - 10 + $newPoints[1]; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4] + 5; $css = $figure[5]; $spriteCoords = $xSpriteMap[$css]; imagecopy($img, $shape_image, $figure[1] - $x1 + $newPoints[0], $figure[2] - $y1 + $newPoints[1], $spriteCoords[0], $spriteCoords[1], $figure[3], $figure[4]); $this->print_text($img, $figure[6], 10, 0, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0]); break; case 'bpmnArtifact': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $xX1 = $figure[1] - $x1 + $newPoints[0]; $xY1 = $figure[2] - $y1 + $newPoints[1]; $xX2 = $xX1 + $figure[3]; $xY2 = $xY1 + $figure[4]; if ($figure[6] == 'GROUP') { imagesetthickness($img, 2); $style = array( $groupColor, $groupColor, $groupColor, $groupColor, $groupColor, $white, $white, $white, $white, $white ); imagesetstyle($img, $style); imageline($img, $xX1, $xY1, $xX2, $xY1, IMG_COLOR_STYLED); imageline($img, $xX2, $xY1, $xX2, $xY2, IMG_COLOR_STYLED); imageline($img, $xX2, $xY2, $xX1, $xY2, IMG_COLOR_STYLED); imageline($img, $xX1, $xY2, $xX1, $xY1, IMG_COLOR_STYLED); $this->print_text($img, $figure[5], 10, 0, $black, $font, $xX1, $xY1 - 5, $xX2, $xY2, $figure[0], $figure[5]); } if ($figure[6] == 'TEXT_ANNOTATION') { imagesetthickness($img, 1); imageline($img, $xX1, $xY1, $xX1, $xY2, $black); imageline($img, $xX1, $xY1, $xX1 + 15, $xY1, $black); imageline($img, $xX1, $xY2, $xX1 + 15, $xY2, $black); $this->print_text($img, $figure[5], 10, 0, $black, $font, $xX1, $xY1, $xX2, $xY2, $figure[0], $figure[6]); } break; //this break wasn't here ... case 'bpmnData': $newPoints = $this->getNewPoints($figure[11],$figure[10]); $X1 = $figure[1] - $x1 + $newPoints[0]; $Y1 = $figure[2] - $y1 + $figure[4] - 10 + $newPoints[1]; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4] + 5; $css = $figure[5]; $spriteCoords = $xSpriteMap[$css]; imagecopy($img, $shape_image, $figure[1] - $x1 + $newPoints[0], $figure[2] - $y1 + $newPoints[1], $spriteCoords[0], $spriteCoords[1], $figure[3], $figure[4]); $this->print_text($img, $figure[6], 10, 0, $black, $font, $X1, $Y1, $X2, $Y2, $figure[0]); break; case 'bpmnFlow': $X1 = $figure[1] - $x1 ; $Y1 = $figure[2] - $y1 ; $X2 = $X1 + $figure[3]; $Y2 = $Y1 + $figure[4]; imagesetthickness($img, 1); $lines = $figure[9]; $shape_o = $this->get_shape_process($figure[7], $figure[3]); $shape_d = $this->get_shape_process($figure[8], $figure[5]); // if ($shape_o->in_flow && $shape_d->in_flow) { $line_color = $black; $shape_image = $imgSprite; // } else { // $line_color = $gray; // $shape_image = $imgSpriteBW; // } foreach ($lines as $key => $segment) { if (isset($lines[$key + 1]) && $lines[$key + 1]['x'] != '' && $lines[$key + 1]['y'] != '') { if ($figure[2] == 'MESSAGE' || $figure[2] == 'ASSOCIATION' || $figure[2] == 'DATAASSOCIATION') { $style = array( $black, $black, $black, $black, $white, $white, $white, $white ); imagesetstyle($img, $style); imageline($img, $lines[$key]['x'] - $x1, $lines[$key]['y'] - $y1, $lines[$key + 1]['x'] - $x1, $lines[$key + 1]['y'] - $y1, IMG_COLOR_STYLED); } else { imageline($img, $lines[$key]['x'] - $x1, $lines[$key]['y'] - $y1, $lines[$key + 1]['x'] - $x1, $lines[$key + 1]['y'] - $y1, $line_color); } if ((int) ((sizeof($lines) - 1) / 2) == $key) { $this->print_text($img, $figure[1], 10, 0, $black, $font, $lines[$key]['x'] - $x1, $lines[$key]['y'] - $y1, $lines[$key + 1]['x'] - $x1, $lines[$key + 1]['y'] - $y1, $figure[0]); } } } $decorator_width = 11; $decorator_height = 11; //END DECORATOR if ($lines[sizeof($lines) - 1]['x'] == $lines[sizeof($lines) - 2]['x']) { if ($lines[sizeof($lines) - 1]['y'] < $lines[sizeof($lines) - 2]['y']) { $spriteCoords = $xSpriteMap['arrow_target_bottom']; imagecopy($img, $shape_image, $lines[sizeof($lines) - 1]['x'] - (int) ($decorator_width / 2) - $x1, $lines[sizeof($lines) - 1]['y'] - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } else { $spriteCoords = $xSpriteMap['arrow_target_top']; imagecopy($img, $shape_image, $lines[sizeof($lines) - 1]['x'] - (int) ($decorator_width / 2) - $x1, $lines[sizeof($lines) - 1]['y'] - $decorator_height - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } } elseif (($lines[sizeof($lines) - 1]['y'] == $lines[sizeof($lines) - 2]['y'])) { if ($lines[sizeof($lines) - 1]['x'] < $lines[sizeof($lines) - 2]['x']) { $spriteCoords = $xSpriteMap['arrow_target_right']; imagecopy($img, $shape_image, $lines[sizeof($lines) - 1]['x'] - $x1, $lines[sizeof($lines) - 1]['y'] - (int) ($decorator_height / 2) - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } else { $spriteCoords = $xSpriteMap['arrow_target_left']; imagecopy($img, $shape_image, $lines[sizeof($lines) - 1]['x'] - $decorator_width - $x1, $lines[sizeof($lines) - 1]['y'] - (int) ($decorator_height / 2) - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } } //SOURCE DECORATOR if ($figure[2] === 'DEFAULT' OR $figure[2] === 'CONDITIONAL') { if ($figure[2] === 'DEFAULT') { $source_decorator = '_default'; } elseif ($figure[2] === 'CONDITIONAL') { $source_decorator = '_conditional'; } if ($lines[0]['x'] == $lines[1]['x']) { if ($lines[0]['y'] < $lines[1]['y']) { $spriteCoords = $xSpriteMap['arrow' . $source_decorator . '_source_top']; imagecopy($img, $shape_image, $lines[0]['x'] - (int) ($decorator_width / 2) - $x1, $lines[0]['y'] - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } else { $spriteCoords = $xSpriteMap['arrow' . $source_decorator . '_source_bottom']; imagecopy($img, $shape_image, $lines[0]['x'] - (int) ($decorator_width / 2) - $x1, $lines[0]['y'] - $decorator_height - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } } elseif (($lines[0]['y'] == $lines[1]['y'])) { if ($lines[0]['x'] < $lines[1]['x']) { $spriteCoords = $xSpriteMap['arrow' . $source_decorator . '_source_right']; imagecopy($img, $shape_image, $lines[0]['x'] - $x1, $lines[0]['y'] - (int) ($decorator_height / 2) - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } else { $spriteCoords = $xSpriteMap['arrow' . $source_decorator . '_source_left']; imagecopy($img, $shape_image, $lines[0]['x'] - $decorator_width - $x1, $lines[0]['y'] - (int) ($decorator_height / 2) - $y1, $spriteCoords[0], $spriteCoords[1], $decorator_width, $decorator_height); } } } break; } } return $img; } private function get_shape_process($id, $shape, $img = null) { $result = new \stdClass(); $result->running = false; $process_route = $this->running_case; if ($shape != 'bpmnFlow') { if (isset($process_route[$shape]) && array_key_exists($id, $process_route[$shape])) { $result->status = $process_route[$shape][$id]; $result->colors = $this->get_shape_process_color($process_route[$shape][$id], $img); $result->running = true; } } return $result; } private function get_shape_process_color($status, $img) { $img = is_null($img) ? imagecreate(10,10):$img; $red = imagecolorallocate($img, 189, 10, 23); $red_1 = imagecolorallocate($img, 114, 2, 12); $orange = imagecolorallocate($img, 197, 119, 1); $orange_1 = imagecolorallocate($img, 150, 91, 2); $silver = imagecolorallocate($img, 170, 168, 166); $silver_1 = imagecolorallocate($img, 111, 109, 108); $green = imagecolorallocate($img, 27, 121, 9); $green_1 = imagecolorallocate($img, 15, 85, 2); $white = imagecolorallocate($img, 59, 71, 83); $white_1 = imagecolorallocate($img, 255, 255, 255); $result = array(); switch ($status) { case 'TASK_IN_PROGRESS'://red $result['fillcolor'] = $red; $result['color'] = $red_1; break; case 'TASK_COMPLETED'://green $result['fillcolor'] = $green; $result['color'] = $green_1; break; case 'TASK_PENDING_NOT_EXECUTED'://silver $result['fillcolor'] = $silver; $result['color'] = $silver_1; break; case 'TASK_PARALLEL'://orange $result['fillcolor'] = $orange; $result['color'] = $orange_1; break; default: $result['fillcolor'] = $white; $result['color'] = $white_1; break; } return $result; } private function getNewPoints($idElement, $elementName) { $defenitions = array( 'bpmnParticipant' => 'participants', 'bpmnPool' => 'laneset', 'bpmnLane' => 'lanes', 'bpmnActivity' => 'activities', 'bpmnEvent' => 'events', 'bpmnGateway' => 'gateways', 'bpmnArtifact' => 'artifacts', 'bpmnData' => 'datas' ); $result = array(0,0); $resRec = array(0,0); if(isset($defenitions[$elementName])){ $name = $defenitions[$elementName]; foreach($this->diagram as $schem){ $elements = $schem[$name]; foreach ($elements as $element) { if($element['bou_container'] != "bpmnDiagram"){ $resRec = $this->getNewPoints($element['bou_element'],$element['bou_container']); } if($element['lns_uid'] == $idElement || $element['lan_uid'] == $idElement){ $result = array($element['bou_x'] + $resRec[0],$element['bou_y'] + $resRec[1]); } } } } return $result; } private function print_text($IMG, $txt, $size, $angle, $color, $font, $x1, $y1, $x2, $y2, $type = '', $stype = '') { //TODO Create a section to write multi-line text $yy = 0; switch ($type) { case 'bpmnActivity': case 'bpmnArtifact': if ($stype == 'SCRIPTTASK') { $line = $this->wrap_text($size, $angle, $font, $txt, $x2 + 50 - $x1); } else { $line = $this->wrap_text($size, $angle, $font, $txt, $x2 - $x1); } break; case 'bpmnEvent': $line = $this->wrap_text($size, $angle, $font, $txt, $x2 + 40 - $x1); break; case 'bpmnGateway': $line = $this->wrap_text($size, $angle, $font, $txt, $x2 + 40 - $x1); break; case 'bpmnPool': case 'bpmnParticipant': case 'bpmnLane': $line = $this->wrap_text($size, $angle, $font, $txt, $y2 + 40 - $y1); break; default: $line = $this->wrap_text($size, $angle, $font, $txt, $x2 - $x1); } $h = count($line) * 16; foreach ($line as $value) { $w = strlen(trim($value))*6; $X = ($x1 + ((($x2 - $x1) - $w) / 2)) - 5; if ($type == 'bpmnActivity' && $stype == 'TASK') { $Y = $y1 + (($y2 - $y1)/2) - floor($h/2) + $yy + 10; } else if ($type == 'bpmnArtifact' && $stype == 'TEXT_ANNOTATION') { $Y = $y1 + (($y2 - $y1)/2) - floor($h/2) + $yy + 10; } else if ($type == 'bpmnActivity' && $stype == 'SCRIPTTASK') { $Y = $y2 + $yy + 100; } else if ($type == 'bpmnPool' || $type == 'bpmnParticipant' || $type == 'bpmnLane') { $X = $x1 + $yy + 25; $Y = ($y2 - ((($y2 - $y1) - $w) / 2)); } else if ($type == 'bpmnFlow') { $Y = $y1 + $yy + 15; } else { $Y = $y1 + $yy + 25; } imagettftext($IMG, $size, $angle, $X, $Y, $color, $font, $value); $yy += 16; } } private function wrap_text($fontSize, $angle, $fontFace, $string, $width) { $pattern = '[\n|\r|\n\r]'; $string = preg_replace($pattern, ' ', trim($string)); $arr = explode(' ', $string); $sa = ''; $sf = array(); foreach ($arr as $word) { $sa_ = $sa; $sa .= ' ' . $word; $w = strlen(trim($sa))*6; if ($w >= $width) { $sf[] = $sa_; $sa = $word; } } $sf[] = $sa; return $sf; } }