STL Format
Aus Wikizone
Version vom 23. Januar 2013, 15:03 Uhr von 134.3.241.116 (Diskussion)
inary STL files have the following format:
UINT8[80] – Header UINT32 – Number of triangles foreach triangle REAL32[3] – Normal vector REAL32[3] – Vertex 1 REAL32[3] – Vertex 2 REAL32[3] – Vertex 3 UINT16 – Attribute byte count end
Programmbeispiele[Bearbeiten]
PHP Beispiel - Volumen der Bounding Box eines binary STL Files berechnen
Kann z.B. zum Berechnen der vorausichtlichen Materialmenge genutzt werden.
Quelle: http://schmidtcds.com/2011/07/php-stl-files/ Zugriff: 2013-01
<!--
Name: stlvolume.php
Desc: Binary STL File Volume approximation
Comments: This php script will generate the bounding box volume of a given .stl file.
Created By: Michael D. Schmidt
Date: July 17, 2011
-->
<?php
$x_max = 0;
$y_max = 0;
$z_max = 0;
$x_min = 0;
$y_min = 0;
$z_min = 0;
$filepath = "PUT THE LOCATION OF YOUR .STL FILE HERE";
$fp = fopen($filepath, "rb");
$section = file_get_contents($filepath, NULL, NULL, 0, 79);
fseek($fp, 80);
$data = fread($fp, 4);
$numOfFacets = unpack("I", $data);
for ($i = 0; $i < $numOfFacets[1]; $i++){
//Start Normal Vector
$data = fread($fp, 4);
$hold = unpack("f", $data);
$normalVectorsX[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$normalVectorsY[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$normalVectorsZ[$i] = $hold[1];
//End Normal Vector
//Start Vertex1
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex1X[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex1Y[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex1Z[$i] = $hold[1];
//End Vertex1
//Start Vertex2
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex2X[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex2Y[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex2Z[$i] = $hold[1];
//End Vertex2
//Start Vertex3
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex3X[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex3Y[$i] = $hold[1];
$data = fread($fp, 4);
$hold = unpack("f", $data);
$vertex3Z[$i] = $hold[1];
//End Vertex3
//Attribute Byte Count
$data = fread($fp, 2);
$hold = unpack("S", $data);
$abc[$i] = $hold[1];
$x_vals = array($vertex1X[$i], $vertex2X[$i], $vertex3X[$i]);
$y_vals = array($vertex1Y[$i], $vertex2Y[$i], $vertex3Y[$i]);
$z_vals = array($vertex1Z[$i], $vertex2Z[$i], $vertex3Z[$i]);
if(max($x_vals) > $x_max) {
$x_max = max($x_vals);
}
if(max($y_vals) > $y_max) {
$y_max = max($y_vals);
}
if(max($z_vals) > $z_max) {
$z_max = max($z_vals);
}
if(min($x_vals) < $x_min) {
$x_min = min($x_vals);
}
if(min($y_vals) < $y_min) {
$y_min = min($y_vals);
}
if(min($z_vals) < $z_min) {
$z_min = min($z_vals);
}
}
$x_dim = $x_max - $x_min;
$y_dim = $y_max - $y_min;
$z_dim = $z_max - $z_min;
$volume = $x_dim*$y_dim*$z_dim;
$raw_cost = 15;
$tray_cost = $raw_cost;
$material_cost = $raw_cost*$volume*1.02;
$support_cost = $raw_cost*2;
$total = $tray_cost + $material_cost + $support_cost;
echo "$".number_format($total, 2, '.', ',');
?>