319 : _fName(fName),
320 _min(T()),
321 _max(T()),
322 _maxDist2(0),
323 clout(std::cout, "STLmesh")
324{
325 std::ifstream f(fName.c_str(), std::ios::in);
326 _triangles.reserve(10000);
327 if (!f.good()) {
328 throw std::runtime_error("STL File not valid.");
329 }
330 char buf[6];
331 buf[5] = 0;
332 f.read(buf, 5);
333 const std::string asciiHeader = "solid";
334 if (std::string(buf) == asciiHeader) {
335 f.seekg(0, std::ios::beg);
336 if (f.good()) {
337 std::string s0, s1;
338 int i = 0;
339 while (!f.eof()) {
340 f >> s0;
341 if (s0 == "facet") {
342 STLtriangle<T> tri;
343 f >> s1 >> tri.normal[0] >> tri.normal[1] >> tri.normal[2];
344 f >> s0 >> s1;
345 f >> s0 >> tri.point[0].coords[0] >> tri.point[0].coords[1]
346 >> tri.point[0].coords[2];
347 f >> s0 >> tri.point[1].coords[0] >> tri.point[1].coords[1]
348 >> tri.point[1].coords[2];
349 f >> s0 >> tri.point[2].coords[0] >> tri.point[2].coords[1]
350 >> tri.point[2].coords[2];
351 f >> s0;
352 f >> s0;
353 for (int k = 0; k < 3; k++) {
354 tri.point[0].coords[k] *= stlSize;
355 tri.point[1].coords[k] *= stlSize;
356 tri.point[2].coords[k] *= stlSize;
357 }
358 if (i == 0) {
359 _min = T();
360 _max = T();
361
362 _min[0] = tri.point[0].coords[0];
363 _min[1] = tri.point[0].coords[1];
364 _min[2] = tri.point[0].coords[2];
365
366 _max[0] = tri.point[0].coords[0];
367 _max[1] = tri.point[0].coords[1];
368 _max[2] = tri.point[0].coords[2];
369
370 _min[0] =
util::min(_min[0], tri.point[1].coords[0]);
371 _min[1] =
util::min(_min[1], tri.point[1].coords[1]);
372 _min[2] =
util::min(_min[2], tri.point[1].coords[2]);
373
374 _max[0] =
util::max(_max[0], tri.point[1].coords[0]);
375 _max[1] =
util::max(_max[1], tri.point[1].coords[1]);
376 _max[2] =
util::max(_max[2], tri.point[1].coords[2]);
377
378 _min[0] =
util::min(_min[0], tri.point[2].coords[0]);
379 _min[1] =
util::min(_min[1], tri.point[2].coords[1]);
380 _min[2] =
util::min(_min[2], tri.point[2].coords[2]);
381
382 _max[0] =
util::max(_max[0], tri.point[2].coords[0]);
383 _max[1] =
util::max(_max[1], tri.point[2].coords[1]);
384 _max[2] =
util::max(_max[2], tri.point[2].coords[2]);
385
386 }
387 else {
388 _min[0] =
util::min(_min[0], tri.point[0].coords[0]);
389 _min[1] =
util::min(_min[1], tri.point[0].coords[1]);
390 _min[2] =
util::min(_min[2], tri.point[0].coords[2]);
391
392 _max[0] =
util::max(_max[0], tri.point[0].coords[0]);
393 _max[1] =
util::max(_max[1], tri.point[0].coords[1]);
394 _max[2] =
util::max(_max[2], tri.point[0].coords[2]);
395
396 _min[0] =
util::min(_min[0], tri.point[1].coords[0]);
397 _min[1] =
util::min(_min[1], tri.point[1].coords[1]);
398 _min[2] =
util::min(_min[2], tri.point[1].coords[2]);
399
400 _max[0] =
util::max(_max[0], tri.point[1].coords[0]);
401 _max[1] =
util::max(_max[1], tri.point[1].coords[1]);
402 _max[2] =
util::max(_max[2], tri.point[1].coords[2]);
403
404 _min[0] =
util::min(_min[0], tri.point[2].coords[0]);
405 _min[1] =
util::min(_min[1], tri.point[2].coords[1]);
406 _min[2] =
util::min(_min[2], tri.point[2].coords[2]);
407
408 _max[0] =
util::max(_max[0], tri.point[2].coords[0]);
409 _max[1] =
util::max(_max[1], tri.point[2].coords[1]);
410 _max[2] =
util::max(_max[2], tri.point[2].coords[2]);
411 }
412
413 i++;
414 tri.init();
415 _triangles.push_back(tri);
416
417 _maxDist2 =
util::max(distPoints(tri.point[0], tri.point[1]),
418 _maxDist2);
419 _maxDist2 =
util::max(distPoints(tri.point[2], tri.point[1]),
420 _maxDist2);
421 _maxDist2 =
util::max(distPoints(tri.point[0], tri.point[2]),
422 _maxDist2);
423 }
424 else if (s0 == "endsolid") {
425 break;
426 }
427 }
428 }
429 }
430 else {
431 f.close();
432 f.open(fName.c_str(), std::ios::in | std::ios::binary);
433 char comment[80];
434 f.read(comment, 80);
435
436 if (!f.good()) {
437 throw std::runtime_error("STL File not valid.");
438 }
439
440 comment[79] = 0;
441 int32_t nFacets;
442 f.read(reinterpret_cast<char *>(&nFacets), sizeof(int32_t));
443
444 if (!f.good()) {
445 throw std::runtime_error("STL File not valid.");
446 }
447
448 float v[12];
449 std::uint16_t uint16;
450 for (int32_t i = 0; i < nFacets; ++i) {
451 for (unsigned int j = 0; j < 12; ++j) {
452 f.read(reinterpret_cast<char *>(&v[j]), sizeof(float));
453 }
454 f.read(reinterpret_cast<char *>(&uint16), sizeof(std::uint16_t));
455 STLtriangle<T> tri;
456 tri.normal[0] = v[0];
457 tri.normal[1] = v[1];
458 tri.normal[2] = v[2];
459 tri.point[0].coords[0] = v[3];
460 tri.point[0].coords[1] = v[4];
461 tri.point[0].coords[2] = v[5];
462 tri.point[1].coords[0] = v[6];
463 tri.point[1].coords[1] = v[7];
464 tri.point[1].coords[2] = v[8];
465 tri.point[2].coords[0] = v[9];
466 tri.point[2].coords[1] = v[10];
467 tri.point[2].coords[2] = v[11];
468
469 for (int k = 0; k < 3; k++) {
470 tri.point[0].coords[k] *= stlSize;
471 tri.point[1].coords[k] *= stlSize;
472 tri.point[2].coords[k] *= stlSize;
473 }
474 if (i == 0) {
475 _min[0] = tri.point[0].coords[0];
476 _min[1] = tri.point[0].coords[1];
477 _min[2] = tri.point[0].coords[2];
478
479 _max[0] = tri.point[0].coords[0];
480 _max[1] = tri.point[0].coords[1];
481 _max[2] = tri.point[0].coords[2];
482
483 _min[0] =
util::min(_min[0], (T) tri.point[1].coords[0]);
484 _min[1] =
util::min(_min[1], (T) tri.point[1].coords[1]);
485 _min[2] =
util::min(_min[2], (T) tri.point[1].coords[2]);
486
487 _max[0] =
util::max(_max[0], (T) tri.point[1].coords[0]);
488 _max[1] =
util::max(_max[1], (T) tri.point[1].coords[1]);
489 _max[2] =
util::max(_max[2], (T) tri.point[1].coords[2]);
490
491 _min[0] =
util::min(_min[0], (T) tri.point[2].coords[0]);
492 _min[1] =
util::min(_min[1], (T) tri.point[2].coords[1]);
493 _min[2] =
util::min(_min[2], (T) tri.point[2].coords[2]);
494
495 _max[0] =
util::max(_max[0], (T) tri.point[2].coords[0]);
496 _max[1] =
util::max(_max[1], (T) tri.point[2].coords[1]);
497 _max[2] =
util::max(_max[2], (T) tri.point[2].coords[2]);
498
499 }
500 else {
501 _min[0] =
util::min(_min[0], (T) tri.point[0].coords[0]);
502 _min[1] =
util::min(_min[1], (T) tri.point[0].coords[1]);
503 _min[2] =
util::min(_min[2], (T) tri.point[0].coords[2]);
504
505 _max[0] =
util::max(_max[0], (T) tri.point[0].coords[0]);
506 _max[1] =
util::max(_max[1], (T) tri.point[0].coords[1]);
507 _max[2] =
util::max(_max[2], (T) tri.point[0].coords[2]);
508
509 _min[0] =
util::min(_min[0], (T) tri.point[1].coords[0]);
510 _min[1] =
util::min(_min[1], (T) tri.point[1].coords[1]);
511 _min[2] =
util::min(_min[2], (T) tri.point[1].coords[2]);
512
513 _max[0] =
util::max(_max[0], (T) tri.point[1].coords[0]);
514 _max[1] =
util::max(_max[1], (T) tri.point[1].coords[1]);
515 _max[2] =
util::max(_max[2], (T) tri.point[1].coords[2]);
516
517 _min[0] =
util::min(_min[0], (T) tri.point[2].coords[0]);
518 _min[1] =
util::min(_min[1], (T) tri.point[2].coords[1]);
519 _min[2] =
util::min(_min[2], (T) tri.point[2].coords[2]);
520
521 _max[0] =
util::max(_max[0], (T) tri.point[2].coords[0]);
522 _max[1] =
util::max(_max[1], (T) tri.point[2].coords[1]);
523 _max[2] =
util::max(_max[2], (T) tri.point[2].coords[2]);
524 }
525 tri.init();
526 _triangles.push_back(tri);
527
528 _maxDist2 =
util::max(distPoints(tri.point[0], tri.point[1]), _maxDist2);
529 _maxDist2 =
util::max(distPoints(tri.point[2], tri.point[1]), _maxDist2);
530 _maxDist2 =
util::max(distPoints(tri.point[0], tri.point[2]), _maxDist2);
531 }
532 }
533 f.close();
534}
cpu::simd::Pack< T > min(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)