1<?php 2 3namespace PhpOffice\PhpSpreadsheet\Chart; 4 5/** 6 * Created by PhpStorm. 7 * User: Wiktor Trzonkowski 8 * Date: 6/17/14 9 * Time: 12:11 PM. 10 */ 11class Axis extends Properties 12{ 13 /** 14 * Axis Number. 15 * 16 * @var array of mixed 17 */ 18 private $axisNumber = [ 19 'format' => self::FORMAT_CODE_GENERAL, 20 'source_linked' => 1, 21 ]; 22 23 /** 24 * Axis Options. 25 * 26 * @var array of mixed 27 */ 28 private $axisOptions = [ 29 'minimum' => null, 30 'maximum' => null, 31 'major_unit' => null, 32 'minor_unit' => null, 33 'orientation' => self::ORIENTATION_NORMAL, 34 'minor_tick_mark' => self::TICK_MARK_NONE, 35 'major_tick_mark' => self::TICK_MARK_NONE, 36 'axis_labels' => self::AXIS_LABELS_NEXT_TO, 37 'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO, 38 'horizontal_crosses_value' => null, 39 ]; 40 41 /** 42 * Fill Properties. 43 * 44 * @var array of mixed 45 */ 46 private $fillProperties = [ 47 'type' => self::EXCEL_COLOR_TYPE_ARGB, 48 'value' => null, 49 'alpha' => 0, 50 ]; 51 52 /** 53 * Line Properties. 54 * 55 * @var array of mixed 56 */ 57 private $lineProperties = [ 58 'type' => self::EXCEL_COLOR_TYPE_ARGB, 59 'value' => null, 60 'alpha' => 0, 61 ]; 62 63 /** 64 * Line Style Properties. 65 * 66 * @var array of mixed 67 */ 68 private $lineStyleProperties = [ 69 'width' => '9525', 70 'compound' => self::LINE_STYLE_COMPOUND_SIMPLE, 71 'dash' => self::LINE_STYLE_DASH_SOLID, 72 'cap' => self::LINE_STYLE_CAP_FLAT, 73 'join' => self::LINE_STYLE_JOIN_BEVEL, 74 'arrow' => [ 75 'head' => [ 76 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, 77 'size' => self::LINE_STYLE_ARROW_SIZE_5, 78 ], 79 'end' => [ 80 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, 81 'size' => self::LINE_STYLE_ARROW_SIZE_8, 82 ], 83 ], 84 ]; 85 86 /** 87 * Shadow Properties. 88 * 89 * @var array of mixed 90 */ 91 private $shadowProperties = [ 92 'presets' => self::SHADOW_PRESETS_NOSHADOW, 93 'effect' => null, 94 'color' => [ 95 'type' => self::EXCEL_COLOR_TYPE_STANDARD, 96 'value' => 'black', 97 'alpha' => 40, 98 ], 99 'size' => [ 100 'sx' => null, 101 'sy' => null, 102 'kx' => null, 103 ], 104 'blur' => null, 105 'direction' => null, 106 'distance' => null, 107 'algn' => null, 108 'rotWithShape' => null, 109 ]; 110 111 /** 112 * Glow Properties. 113 * 114 * @var array of mixed 115 */ 116 private $glowProperties = [ 117 'size' => null, 118 'color' => [ 119 'type' => self::EXCEL_COLOR_TYPE_STANDARD, 120 'value' => 'black', 121 'alpha' => 40, 122 ], 123 ]; 124 125 /** 126 * Soft Edge Properties. 127 * 128 * @var array of mixed 129 */ 130 private $softEdges = [ 131 'size' => null, 132 ]; 133 134 /** 135 * Get Series Data Type. 136 * 137 * @param mixed $format_code 138 * 139 * @return string 140 */ 141 public function setAxisNumberProperties($format_code) 142 { 143 $this->axisNumber['format'] = (string) $format_code; 144 $this->axisNumber['source_linked'] = 0; 145 } 146 147 /** 148 * Get Axis Number Format Data Type. 149 * 150 * @return string 151 */ 152 public function getAxisNumberFormat() 153 { 154 return $this->axisNumber['format']; 155 } 156 157 /** 158 * Get Axis Number Source Linked. 159 * 160 * @return string 161 */ 162 public function getAxisNumberSourceLinked() 163 { 164 return (string) $this->axisNumber['source_linked']; 165 } 166 167 /** 168 * Set Axis Options Properties. 169 * 170 * @param string $axis_labels 171 * @param string $horizontal_crosses_value 172 * @param string $horizontal_crosses 173 * @param string $axis_orientation 174 * @param string $major_tmt 175 * @param string $minor_tmt 176 * @param string $minimum 177 * @param string $maximum 178 * @param string $major_unit 179 * @param string $minor_unit 180 */ 181 public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null) 182 { 183 $this->axisOptions['axis_labels'] = (string) $axis_labels; 184 ($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null; 185 ($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null; 186 ($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null; 187 ($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null; 188 ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; 189 ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; 190 ($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null; 191 ($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null; 192 ($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null; 193 ($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null; 194 } 195 196 /** 197 * Get Axis Options Property. 198 * 199 * @param string $property 200 * 201 * @return string 202 */ 203 public function getAxisOptionsProperty($property) 204 { 205 return $this->axisOptions[$property]; 206 } 207 208 /** 209 * Set Axis Orientation Property. 210 * 211 * @param string $orientation 212 */ 213 public function setAxisOrientation($orientation) 214 { 215 $this->axisOptions['orientation'] = (string) $orientation; 216 } 217 218 /** 219 * Set Fill Property. 220 * 221 * @param string $color 222 * @param int $alpha 223 * @param string $type 224 */ 225 public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB) 226 { 227 $this->fillProperties = $this->setColorProperties($color, $alpha, $type); 228 } 229 230 /** 231 * Set Line Property. 232 * 233 * @param string $color 234 * @param int $alpha 235 * @param string $type 236 */ 237 public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB) 238 { 239 $this->lineProperties = $this->setColorProperties($color, $alpha, $type); 240 } 241 242 /** 243 * Get Fill Property. 244 * 245 * @param string $property 246 * 247 * @return string 248 */ 249 public function getFillProperty($property) 250 { 251 return $this->fillProperties[$property]; 252 } 253 254 /** 255 * Get Line Property. 256 * 257 * @param string $property 258 * 259 * @return string 260 */ 261 public function getLineProperty($property) 262 { 263 return $this->lineProperties[$property]; 264 } 265 266 /** 267 * Set Line Style Properties. 268 * 269 * @param float $line_width 270 * @param string $compound_type 271 * @param string $dash_type 272 * @param string $cap_type 273 * @param string $join_type 274 * @param string $head_arrow_type 275 * @param string $head_arrow_size 276 * @param string $end_arrow_type 277 * @param string $end_arrow_size 278 */ 279 public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null) 280 { 281 ($line_width !== null) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null; 282 ($compound_type !== null) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null; 283 ($dash_type !== null) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null; 284 ($cap_type !== null) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null; 285 ($join_type !== null) ? $this->lineStyleProperties['join'] = (string) $join_type : null; 286 ($head_arrow_type !== null) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null; 287 ($head_arrow_size !== null) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null; 288 ($end_arrow_type !== null) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null; 289 ($end_arrow_size !== null) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null; 290 } 291 292 /** 293 * Get Line Style Property. 294 * 295 * @param array|string $elements 296 * 297 * @return string 298 */ 299 public function getLineStyleProperty($elements) 300 { 301 return $this->getArrayElementsValue($this->lineStyleProperties, $elements); 302 } 303 304 /** 305 * Get Line Style Arrow Excel Width. 306 * 307 * @param string $arrow 308 * 309 * @return string 310 */ 311 public function getLineStyleArrowWidth($arrow) 312 { 313 return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w'); 314 } 315 316 /** 317 * Get Line Style Arrow Excel Length. 318 * 319 * @param string $arrow 320 * 321 * @return string 322 */ 323 public function getLineStyleArrowLength($arrow) 324 { 325 return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len'); 326 } 327 328 /** 329 * Set Shadow Properties. 330 * 331 * @param int $sh_presets 332 * @param string $sh_color_value 333 * @param string $sh_color_type 334 * @param string $sh_color_alpha 335 * @param float $sh_blur 336 * @param int $sh_angle 337 * @param float $sh_distance 338 */ 339 public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null) 340 { 341 $this->setShadowPresetsProperties((int) $sh_presets) 342 ->setShadowColor( 343 $sh_color_value === null ? $this->shadowProperties['color']['value'] : $sh_color_value, 344 $sh_color_alpha === null ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha, 345 $sh_color_type === null ? $this->shadowProperties['color']['type'] : $sh_color_type 346 ) 347 ->setShadowBlur($sh_blur) 348 ->setShadowAngle($sh_angle) 349 ->setShadowDistance($sh_distance); 350 } 351 352 /** 353 * Set Shadow Color. 354 * 355 * @param int $shadow_presets 356 * 357 * @return Axis 358 */ 359 private function setShadowPresetsProperties($shadow_presets) 360 { 361 $this->shadowProperties['presets'] = $shadow_presets; 362 $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets)); 363 364 return $this; 365 } 366 367 /** 368 * Set Shadow Properties from Mapped Values. 369 * 370 * @param array $properties_map 371 * @param mixed &$reference 372 * 373 * @return Axis 374 */ 375 private function setShadowProperiesMapValues(array $properties_map, &$reference = null) 376 { 377 $base_reference = $reference; 378 foreach ($properties_map as $property_key => $property_val) { 379 if (is_array($property_val)) { 380 if ($reference === null) { 381 $reference = &$this->shadowProperties[$property_key]; 382 } else { 383 $reference = &$reference[$property_key]; 384 } 385 $this->setShadowProperiesMapValues($property_val, $reference); 386 } else { 387 if ($base_reference === null) { 388 $this->shadowProperties[$property_key] = $property_val; 389 } else { 390 $reference[$property_key] = $property_val; 391 } 392 } 393 } 394 395 return $this; 396 } 397 398 /** 399 * Set Shadow Color. 400 * 401 * @param string $color 402 * @param int $alpha 403 * @param string $type 404 * 405 * @return Axis 406 */ 407 private function setShadowColor($color, $alpha, $type) 408 { 409 $this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type); 410 411 return $this; 412 } 413 414 /** 415 * Set Shadow Blur. 416 * 417 * @param float $blur 418 * 419 * @return Axis 420 */ 421 private function setShadowBlur($blur) 422 { 423 if ($blur !== null) { 424 $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur); 425 } 426 427 return $this; 428 } 429 430 /** 431 * Set Shadow Angle. 432 * 433 * @param int $angle 434 * 435 * @return Axis 436 */ 437 private function setShadowAngle($angle) 438 { 439 if ($angle !== null) { 440 $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle); 441 } 442 443 return $this; 444 } 445 446 /** 447 * Set Shadow Distance. 448 * 449 * @param float $distance 450 * 451 * @return Axis 452 */ 453 private function setShadowDistance($distance) 454 { 455 if ($distance !== null) { 456 $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance); 457 } 458 459 return $this; 460 } 461 462 /** 463 * Get Shadow Property. 464 * 465 * @param string|string[] $elements 466 * 467 * @return null|array|int|string 468 */ 469 public function getShadowProperty($elements) 470 { 471 return $this->getArrayElementsValue($this->shadowProperties, $elements); 472 } 473 474 /** 475 * Set Glow Properties. 476 * 477 * @param float $size 478 * @param string $color_value 479 * @param int $color_alpha 480 * @param string $color_type 481 */ 482 public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null) 483 { 484 $this->setGlowSize($size) 485 ->setGlowColor( 486 $color_value === null ? $this->glowProperties['color']['value'] : $color_value, 487 $color_alpha === null ? (int) $this->glowProperties['color']['alpha'] : $color_alpha, 488 $color_type === null ? $this->glowProperties['color']['type'] : $color_type 489 ); 490 } 491 492 /** 493 * Get Glow Property. 494 * 495 * @param array|string $property 496 * 497 * @return string 498 */ 499 public function getGlowProperty($property) 500 { 501 return $this->getArrayElementsValue($this->glowProperties, $property); 502 } 503 504 /** 505 * Set Glow Color. 506 * 507 * @param float $size 508 * 509 * @return Axis 510 */ 511 private function setGlowSize($size) 512 { 513 if ($size !== null) { 514 $this->glowProperties['size'] = $this->getExcelPointsWidth($size); 515 } 516 517 return $this; 518 } 519 520 /** 521 * Set Glow Color. 522 * 523 * @param string $color 524 * @param int $alpha 525 * @param string $type 526 * 527 * @return Axis 528 */ 529 private function setGlowColor($color, $alpha, $type) 530 { 531 $this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type); 532 533 return $this; 534 } 535 536 /** 537 * Set Soft Edges Size. 538 * 539 * @param float $size 540 */ 541 public function setSoftEdges($size) 542 { 543 if ($size !== null) { 544 $softEdges['size'] = (string) $this->getExcelPointsWidth($size); 545 } 546 } 547 548 /** 549 * Get Soft Edges Size. 550 * 551 * @return string 552 */ 553 public function getSoftEdgesSize() 554 { 555 return $this->softEdges['size']; 556 } 557} 558