Example #1
0
function parse_stl_string($str)
{
    $lines = split("\n", $str);
    $vertexes = array();
    $normals = array();
    $faces = array();
    $face_vertexes = array();
    $normal_count = -1;
    foreach ($lines as $line) {
        // TODO: maybe faster if you strip spaces on whole contents instead of every line
        $line = preg_replace('/\\s+/', ' ', $line);
        $line = preg_replace('/\\s+$/', '', $line);
        // echo $line . "<br/>\n";
        // TODO: probably don't need to parse normals anyway
        preg_match('/facet normal (.*) (.*) (.*)$/', $line, $matches);
        if (count($matches) > 1) {
            $normals[] = array((double) $matches[1], (double) $matches[2], (double) $matches[3]);
            $normal_count++;
        } else {
            preg_match('/vertex (.*) (.*) (.*)$/', $line, $matches);
            if (count($matches) > 1) {
                $vertex = array((double) $matches[1], (double) $matches[2], (double) $matches[3]);
                if (!in_array($vertex, $vertexes)) {
                    $vertexes[] = $vertex;
                }
                $face_vertexes[$normal_count][] = $vertex;
            }
        }
    }
    $faces = make_faces($vertexes, $face_vertexes);
    return array($vertexes, $faces);
}
Example #2
0
function parse_stl_binary($fp)
{
    $vertexes = array();
    $faces = array();
    $face_vertexes = array();
    // $fp = fopen($filename, "rb");
    rewind($fp);
    // skip header
    $data = fread($fp, 80);
    $header = unpack("c*", $data);
    // get number of faces
    $data = fread($fp, 4);
    $count = unpack("i", $data);
    for ($i = 0; $i < $count[1]; $i++) {
        // skip normals
        $data = fread($fp, 12);
        $normal = unpack("fff", $data);
        for ($v_count = 0; $v_count < 3; $v_count++) {
            $points = array();
            for ($v_index = 0; $v_index < 3; $v_index++) {
                $data = fread($fp, 4);
                $points[] = unpack("f", $data);
            }
            $vertex = array($points[0][1], $points[1][1], $points[2][1]);
            if (!in_array($vertex, $vertexes)) {
                $vertexes[] = $vertex;
            }
            $face_vertexes[$i][] = $vertex;
        }
        $data = fread($fp, 2);
        $attribute = unpack("S", $data);
    }
    $faces = make_faces($vertexes, $face_vertexes);
    return array($vertexes, $faces);
}