1,
'height' => 1,
'length' => 1
);
// Konstruktor
private function __construct ($class) {
// Call highest constructor
parent::constructor($class);
if ((defined('DEBUG_CORE')) && (defined('DEBUG_CONSTRUCT'))) $this->getDebugInstance()->output(sprintf("[%s:] Konstruktor erreicht.
\n",
$this->__toString()
));
// Set part description and class name
$this->setPartDescr("Simulator-Basis-Einheit");
// Etwas aufraeumen, dies sollte ganz zum Schluss erfolgen!
$this->removeResizeFactorArray();
$this->removeCurrPart();
$this->removeCurrShip();
}
// Public constructor
public function constructor ($class) {
// Call real constructor
$this->__construct($class);
}
// Magic __isset method
private function __isset ($var) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Checking %s in class.
\n",
$this->__toString(), $var
));
return isset($this->$var);
}
// Magic __unset method
private function __unset($var) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Removing %s from class.
\n",
$this->__toString(), $var
));
unset($this->$var);
}
// Setter-Methode fuer Laenge
public function setLength ($length) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Länge gesetzt.
\n",
$this->__toString(),
$length
));
$this->length = (float) $length;
}
// Setter-Methode fuer Breite
public function setWidth ($width) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Breite gesetzt.
\n",
$this->__toString(),
$width
));
$this->width = (float) $width;
}
// Setter-Methode fuer Hoehe
public function setHeight ($height) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Höhe gesetzt.
\n",
$this->__toString(),
$height
));
$this->height = (float) $height;
}
// Getter-Methode fuer Laenge
public function getLength () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge angefordert.
\n",
$this->__toString()
));
return $this->length;
}
// Getter-Methode fuer Breite
public function getWidth () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge angefordert.
\n",
$this->__toString()
));
return $this->width;
}
// Getter-Methode fuer Hoehe
public function getHeight () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Höhe angefordert.
\n",
$this->__toString()
));
return $this->height;
}
// Setter-Methode fuer Teil-Instanz
public function setPartInstance ($struct) {
$this->partInstance = (Object) $struct;
}
// Getter-Methode fuer Teil-Instanz
public function getPartInstance () {
if (!isset($this->partInstance)) {
return null;
}
return $this->partInstance;
}
// Remover-Methode fuer die Teil-Instanz
public function removePartInstance () {
if ($this->getPartInstance() !== null) {
// Warnung ausgeben
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] partInstance ist nicht null! Instanz-Attribut wird nicht entfernt.
\n",
$this->__toString()
));
} else {
// Leere Instanz kann entfernt werden
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] partInstance wurde entfernt.
\n",
$this->__toString()
));
unset($this->partInstance);
}
}
// Prueft ob all Umberechnungsfaktoren gesetzt sind
private function isResizeFactorValid () {
return (($this->getResizeFactorElement('width') > 1)
|| ($this->getResizeFactorElement('height') > 1)
|| ($this->getResizeFactorElement('length') > 1)
);
}
// Baut einen Motor in das Schiff ein
public function addShipPartToShip (ConstructableShip $shipInstance, ConstructableShipPart $partInstance) {
// Schiff/-steil merken
$this->currShip = $shipInstance;
$this->currPart = $partInstance;
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Maschinenraum mit Motor %s wird fuer das Schiff %s konstruiert.
\n",
$this->__toString(),
$this->currPart->getPartDescr(),
$this->currShip->getShipName()
));
// Passt ueberhaupt das Schiffsteil in's Schiff?
if ($this->isShipPartSizeValid()) {
// Berechnungen fuer umliegendes Objekt anpassen
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Das Schiffsteil %s vom Typ %s passt in das Schiff %s hinein.
\n",
$this->__toString(),
$this->currPart->getPartDescr(),
$this->currPart->__toString(),
$this->currShip->getShipName()
));
// Muessen die Masse angepasst werden?
if ($this->isResizeFactorValid()) {
// Neue Angaben berechnen (wir lassen etwas Lust fuer Kabelbaeume, Roehren, Maschinisten, etc.)
$this->newWidth = (float) $this->currPart->getWidth() * $this->resizeFactorArray['width'];
$this->newHeight = (float) $this->currPart->getHeight() * $this->resizeFactorArray['height'];
$this->newLength = (float) $this->currPart->getLength() * $this->resizeFactorArray['length'];
// Passt dies nun immer noch?
if ($this->isNewSizeValid()) {
// Das passt auch, dann Werte setzen und Motor-Instanz merken
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Das Schiffsteil %s passt in das Schiff %s hinein.
\n",
$this->__toString(),
$this->getPartDescr(),
$this->currShip->getShipName()
));
$this->setWidth($this->newWidth);
$this->setHeight($this->newHeight);
$this->setLength($this->newLength);
// Einige Dinge entfernen...
$this->removeAllNewAttr();
} else {
// Passt nicht! Also wieder Exception werfen...
throw new StructureShipMismatchException(sprintf("[%s:] Das Schiffsteil %s vom Typ %s ist zu gross für das Schiff!",
$this->currPart->__toString(),
$this->currPart->getPartDescr(),
$this->currPart->__toString()
), 2);
}
} elseif ($this->currPart != null) {
// Aktuelle Masse setzen
$this->setWidth($this->currPart->getWidth());
$this->setHeight($this->currPart->getHeight());
$this->setLength($this->currPart->getLength());
}
// Existiert ein Schiffsteil?
if (!is_null($this->currPart)) {
// Debug-Meldung ausgeben
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Schiffsteil %s gefunden.
\n",
$this->currPart->realClass,
$this->currPart->getPartDescr()
));
// Schiffsteil-Instanz setzen
$this->setPartInstance($this->currPart);
// Instanzen entfernen
$this->currPart->removeCurrShip();
$this->currPart->removeCurrPart();
$this->currPart->removePartInstance();
$this->currPart->removeResizeFactorArray();
}
} else {
// Exception werfen!
throw new StructureShipMismatchException(sprintf("[%s:] Das Schiffsteil %s vom Typ %s passt nicht in das Schiff!",
$this->currPart->realClass,
$this->currPart->getPartDescr(),
$this->currPart->__toString()
), 1);
}
// Nochmals etwas aufraeumen
$this->removeResizeFactorArray();
$this->removeCurrShip();
$this->removeCurrPart();
}
// Array fuer Umrechnungstabelle entfernen
public function removeResizeFactorArray () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeResizeFactor erreicht.
\n",
$this->__toString()
));
unset($this->resizeFactorArray);
}
// Alle newXXX-Attribute entfernen
public function removeAllNewAttr () {
unset($this->newWidth);
unset($this->newHeight);
unset($this->newLength);
}
// Aktuelle Schiff-Instanz entfernen
public function removeCurrShip () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeCurrShip erreicht.
\n",
$this->__toString()
));
unset($this->currShip);
}
// Aktuelle Schiff-Instanz entfernen
public function removeCurrPart () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeCurrPart erreicht.
\n",
$this->__toString()
));
unset($this->currPart);
}
// Breite entfernen
public function removeWidth () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Breite entfernt.
\n",
$this->__toString()
));
unset($this->width);
}
// Hoehe entfernen
public function removeHeight () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Höhe entfernt.
\n",
$this->__toString()
));
unset($this->height);
}
// Laenge entfernen
public function removeLength () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge entfernt.
\n",
$this->__toString()
));
unset($this->length);
}
// Tiefgang entfernen
public function removeDraught () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Tiefgang entfernt.
\n",
$this->__toString()
));
unset($this->draught);
}
// Getter-Methode fuer Element aus resizeFactor
public function getResizeFactorElement ($el) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] getResizeFactorElement erreicht. (element=%s)
\n",
$this->__toString(),
$el
));
if (isset($this->resizeFactorArray[$el])) {
// Element gefunden
return $this->resizeFactorArray[$el];
} else {
// Element nicht gefunden!
return 0;
}
}
// Setter-Methode fuer Element in resizeFactor
public function setResizeFactorElement ($el, $value) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Umberechnungsfaktor %s=%s gesetzt.
\n",
$this->__toString(),
$el,
$value
));
$this->resizeFactorArray[$el] = (float) $value;
}
// Kontrolliert, ob die Abmasse Schiffsteil->Schiff stimmen
public function isShipPartSizeValid () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] isShipPartSizeValid erreicht.
\n",
$this->__toString()
));
return (
(
( // Already defined ship messurings
($this->currPart->getWidth() < $this->currShip->getWidth())
&& ($this->currPart->getHeight() < $this->currShip->getDraught())
&& ($this->currPart->getLength() < $this->currShip->getLength())
) || ( // Ship messurings shall be calculated
($this->currShip->getWidth() == 0)
&& ($this->currShip->getHeight() == 0)
&& ($this->currShip->getLength() == 0)
)
// The inserted part must be messured!
) && ($this->currPart->getWidth() > 0)
&& ($this->currPart->getHeight() > 0)
&& ($this->currPart->getLength() > 0)
);
}
// Kontrolliert, ob die Abmasse Maschinenraum->Schiff stimmen
public function isNewSizeValid () {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] isNewSizeValid erreicht.
\n",
$this->__toString()
));
return (
( // Already defined ship messurings
($this->newWidth < $this->currShip->getWidth())
&& ($this->newHeight < $this->currShip->getDraught())
&& ($this->newLength < $this->currShip->getLength())
) || ( // Ship messurings shall be calculated
($this->currShip->getWidth() == 0)
&& ($this->currShip->getHeight() == 0)
&& ($this->currShip->getLength() == 0)
)
);
}
// Masse extrahieren
public function extractDimensions ($dim) {
if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] extractDimensions erreicht für %s.
\n",
$this->__toString(),
$this->getPartDescr()
));
// Abmasse setzen
if ((isset($dim)) && (is_array($dim)) && (count($dim) == 3)) {
// Abmasse aus Array holen
$this->setWidth($dim[0]);
$this->setHeight($dim[1]);
$this->setLength($dim[2]);
} else {
// Nicht gefundene Abmasse!
throw new DimNotFoundInArrayException($this, self::EXCEPTION_DIMENSION_ARRAY_INVALID);
}
}
}
// [EOF]
?>