| 482 |
480 |
| 483 bool File::iterator::operator!= ( File::iterator& other ) |
481 bool File::iterator::operator!= ( File::iterator& other ) |
| 484 { |
482 { |
| 485 return !operator== ( other ); |
483 return !operator== ( other ); |
| 486 } |
484 } |
| |
485 |
| |
486 // ============================================================================= |
| |
487 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
488 // ============================================================================= |
| |
489 bbox::bbox() { |
| |
490 reset(); |
| |
491 } |
| |
492 |
| |
493 // ============================================================================= |
| |
494 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
495 // ============================================================================= |
| |
496 void bbox::calculate() { |
| |
497 reset(); |
| |
498 |
| |
499 if (!currentFile()) |
| |
500 return; |
| |
501 |
| |
502 for (LDObject* obj : currentFile()->objs()) |
| |
503 calcObject (obj); |
| |
504 } |
| |
505 |
| |
506 // ============================================================================= |
| |
507 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
508 // ============================================================================= |
| |
509 void bbox::calcObject (LDObject* obj) { |
| |
510 switch (obj->getType()) { |
| |
511 case LDObject::Line: |
| |
512 case LDObject::Triangle: |
| |
513 case LDObject::Quad: |
| |
514 case LDObject::CondLine: |
| |
515 for (short i = 0; i < obj->vertices(); ++i) |
| |
516 calcVertex (obj->getVertex (i)); |
| |
517 |
| |
518 break; |
| |
519 |
| |
520 case LDObject::Subfile: { |
| |
521 LDSubfileObject* ref = static_cast<LDSubfileObject*> (obj); |
| |
522 vector<LDObject*> objs = ref->inlineContents (true, true); |
| |
523 |
| |
524 for (LDObject* obj : objs) { |
| |
525 calcObject (obj); |
| |
526 delete obj; |
| |
527 } |
| |
528 } |
| |
529 break; |
| |
530 |
| |
531 default: |
| |
532 break; |
| |
533 } |
| |
534 } |
| |
535 |
| |
536 // ============================================================================= |
| |
537 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
538 // ============================================================================= |
| |
539 void bbox::calcVertex (const vertex& v) { |
| |
540 for (const Axis ax : g_Axes) { |
| |
541 if (v[ax] < m_v0[ax]) |
| |
542 m_v0[ax] = v[ax]; |
| |
543 |
| |
544 if (v[ax] > m_v1[ax]) |
| |
545 m_v1[ax] = v[ax]; |
| |
546 } |
| |
547 |
| |
548 m_empty = false; |
| |
549 } |
| |
550 |
| |
551 // ============================================================================= |
| |
552 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
553 // ============================================================================= |
| |
554 void bbox::reset() { |
| |
555 m_v0[X] = m_v0[Y] = m_v0[Z] = 0x7FFFFFFF; |
| |
556 m_v1[X] = m_v1[Y] = m_v1[Z] = 0xFFFFFFFF; |
| |
557 |
| |
558 m_empty = true; |
| |
559 } |
| |
560 |
| |
561 // ============================================================================= |
| |
562 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
563 // ============================================================================= |
| |
564 double bbox::size() const { |
| |
565 double xscale = (m_v0[X] - m_v1[X]); |
| |
566 double yscale = (m_v0[Y] - m_v1[Y]); |
| |
567 double zscale = (m_v0[Z] - m_v1[Z]); |
| |
568 double size = zscale; |
| |
569 |
| |
570 if (xscale > yscale) { |
| |
571 if (xscale > zscale) |
| |
572 size = xscale; |
| |
573 } elif (yscale > zscale) |
| |
574 size = yscale; |
| |
575 |
| |
576 if (abs (size) >= 2.0f) |
| |
577 return abs (size / 2); |
| |
578 |
| |
579 return 1.0f; |
| |
580 } |
| |
581 |
| |
582 // ============================================================================= |
| |
583 vertex bbox::center() const { |
| |
584 return vertex ( |
| |
585 (m_v0[X] + m_v1[X]) / 2, |
| |
586 (m_v0[Y] + m_v1[Y]) / 2, |
| |
587 (m_v0[Z] + m_v1[Z]) / 2); |
| |
588 } |