From c91322ff1341cdbad28c77224168c263f0d73034 Mon Sep 17 00:00:00 2001 From: Andrea Settimi Date: Mon, 21 Aug 2023 16:00:03 +0200 Subject: [PATCH] REFACTOR-MILESTONE: finished first version for feedback system --- src/AIAC/Feedback/HoleFeedback.cpp | 204 ++++++++++++++++------------- src/AIAC/Feedback/HoleFeedback.h | 106 ++++++++++++--- 2 files changed, 196 insertions(+), 114 deletions(-) diff --git a/src/AIAC/Feedback/HoleFeedback.cpp b/src/AIAC/Feedback/HoleFeedback.cpp index 9539d7d1..d0462c63 100644 --- a/src/AIAC/Feedback/HoleFeedback.cpp +++ b/src/AIAC/Feedback/HoleFeedback.cpp @@ -1,105 +1,108 @@ #include "AIAC/Application.h" #include "HoleFeedback.h" -namespace AIAC { - HoleFeedbackVisualizer::HoleFeedbackVisualizer() { - auto pt1 = GOPoint::Add(0.f, 0.f, 0.f); - auto pt2 = GOPoint::Add(5.f, 5.f, 5.f); - pt1->SetVisibility(false); - pt2->SetVisibility(false); +namespace AIAC +{ + HoleFeedbackText::HoleFeedbackText() + { + auto pt1 = GOPoint::Add(0.f, 0.f, 0.f); pt1->SetVisibility(false); + auto pt2 = GOPoint::Add(5.f, 5.f, 5.f); pt2->SetVisibility(false); this->m_InfoText = GOText::Add("///", *pt1); this->m_InfoText->SetTextSize(GOTextSize::Small); this->m_InfoText->SetColor(GOColor::WHITE); - this->m_HoleLine2ToolStart = GOLine::Add(*pt1, *pt2); - this->m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); + this->m_AllPrimitives.push_back(this->m_InfoText); + + Deactivate(); + } + + HoleFeedbackPosition::HoleFeedbackPosition() + { + auto pt1 = GOPoint::Add(0.f, 0.f, 0.f); pt1->SetVisibility(false); + auto pt2 = GOPoint::Add(5.f, 5.f, 5.f); pt2->SetVisibility(false); + this->m_HoleLine2ToolEnd = GOLine::Add(*pt1, *pt2); this->m_HoleLine2ToolEnd->SetColor(GOColor::RED); - this->m_DrillBitLineAxis = GOLine::Add(*pt1, *pt2); - this->m_HoleLineAxis = GOLine::Add(*pt1, *pt2); - this->m_HoleLineAxis->SetColor(GOColor::GREEN); + + this->m_HoleLine2ToolStart = GOLine::Add(*pt1, *pt2); + this->m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); + + this->m_HoleLine2ToolEnd->SetVisibility(false); + this->m_HoleLine2ToolStart->SetVisibility(true); + + this->m_AllPrimitives.push_back(this->m_HoleLine2ToolStart); + + Deactivate(); + } + + HoleFeedbackRotation::HoleFeedbackRotation() + { + auto pt1 = GOPoint::Add(0.f, 0.f, 0.f); pt1->SetVisibility(false); + auto pt2 = GOPoint::Add(5.f, 5.f, 5.f); pt2->SetVisibility(false); + this->m_GUILineOrientation = GOLine::Add(*pt1, *pt2); this->m_GUILineOrientation->SetColor(GOColor::WHITE); - - this->m_HoleLine2ToolStart->SetVisibility(true); // << position guidance - this->m_HoleLine2ToolEnd->SetVisibility(false); + this->m_GUILineOrientation->SetVisibility(true); - this->m_DrillBitLineAxis->SetVisibility(false); - this->m_HoleLineAxis->SetVisibility(false); - this->m_AllPrimitives.push_back(this->m_InfoText); - this->m_AllPrimitives.push_back(this->m_HoleLine2ToolStart); this->m_AllPrimitives.push_back(this->m_GUILineOrientation); + } - Deactivate(); + HoleFeedback::HoleFeedback() + { + auto pt1 = GOPoint::Add(0.f, 0.f, 0.f); pt1->SetVisibility(false); + auto pt2 = GOPoint::Add(5.f, 5.f, 5.f); pt2->SetVisibility(false); + + this->m_DrillBitLineAxis = GOLine::Add(*pt1, *pt2); + this->m_HoleLineAxis = GOLine::Add(*pt1, *pt2); + + this->m_DrillBitLineAxis->SetVisibility(false); + this->m_HoleLineAxis->SetVisibility(false); } - void HoleFeedback::Update() { - /* - Feeds (in chronological order): - - (i) position - - (ii) angle - - (iii) depth - - * x Tb - * \ - * \ - * \ v3 - * \ - * \ - * x Tt - * .. - * . .v2 - * . . - * . x Hs - * v1 . / - * . / - * . / v4 - * . / - * ./ - * x He - - */ + void HoleFeedback::Update() + { + auto hole = dynamic_cast(AC_FF_COMP); float scaleF = AIAC::Config::Get(AIAC::Config::SEC_AIAC, AIAC::Config::SCALE_FACTOR, 50.f); - this->m_Visualizer.m_HoleLine2ToolStart->SetPts(*AC_FF_TOOL->GetData().TooltipGO, // start + this->m_VisPosition.m_HoleLine2ToolStart->SetPts(*AC_FF_TOOL->GetData().TooltipGO, // start *hole->GetStartPointGO()); // end - this->m_Visualizer.m_HoleLine2ToolEnd->SetPts(*AC_FF_TOOL->GetData().TooltipGO, // start + this->m_VisPosition.m_HoleLine2ToolEnd->SetPts(*AC_FF_TOOL->GetData().TooltipGO, // start *hole->GetEndPointGO()); // end - this->m_Visualizer.m_DrillBitLineAxis->SetPts(*AC_FF_TOOL->GetData().ToolbaseGO, // start + this->m_DrillBitLineAxis->SetPts(*AC_FF_TOOL->GetData().ToolbaseGO, // start *AC_FF_TOOL->GetData().TooltipGO); // end - this->m_Visualizer.m_HoleLineAxis->SetPts(*hole->GetStartPointGO(), // start + this->m_HoleLineAxis->SetPts(*hole->GetStartPointGO(), // start *hole->GetEndPointGO()); // end // angle orientation guidance - glm::vec3 midPtToolAxis = this->m_Visualizer.m_DrillBitLineAxis->GetMidPointValues(); - glm::vec3 translVec = glm::vec3(this->m_Visualizer.m_HoleLineAxis->GetPEnd().X() - this->m_Visualizer.m_DrillBitLineAxis->GetPEnd().X(), - this->m_Visualizer.m_HoleLineAxis->GetPEnd().Y() - this->m_Visualizer.m_DrillBitLineAxis->GetPEnd().Y(), - this->m_Visualizer.m_HoleLineAxis->GetPEnd().Z() - this->m_Visualizer.m_DrillBitLineAxis->GetPEnd().Z()); - this->m_Visualizer.m_DrillBitLineAxis->Translate(translVec); - float lengthHole = this->m_Visualizer.m_HoleLineAxis->GetLength(); - float lengthDrillBit = this->m_Visualizer.m_DrillBitLineAxis->GetLength(); + glm::vec3 midPtToolAxis = this->m_DrillBitLineAxis->GetMidPointValues(); + glm::vec3 translVec = glm::vec3(this->m_HoleLineAxis->GetPEnd().X() - this->m_DrillBitLineAxis->GetPEnd().X(), + this->m_HoleLineAxis->GetPEnd().Y() - this->m_DrillBitLineAxis->GetPEnd().Y(), + this->m_HoleLineAxis->GetPEnd().Z() - this->m_DrillBitLineAxis->GetPEnd().Z()); + this->m_DrillBitLineAxis->Translate(translVec); + float lengthHole = this->m_HoleLineAxis->GetLength(); + float lengthDrillBit = this->m_DrillBitLineAxis->GetLength(); float lengthDiff = lengthHole - lengthDrillBit; - this->m_Visualizer.m_DrillBitLineAxis->ExtendFromStart(lengthDiff); - - this->m_Visualizer.m_GUILineOrientation->SetPts(this->m_Visualizer.m_DrillBitLineAxis->GetPStart(), // start - this->m_Visualizer.m_HoleLineAxis->GetPStart()); // end - glm::vec3 vectGUITrans = glm::vec3(midPtToolAxis.x - this->m_Visualizer.m_DrillBitLineAxis->GetPStart().X(), - midPtToolAxis.y - this->m_Visualizer.m_DrillBitLineAxis->GetPStart().Y(), - midPtToolAxis.z - this->m_Visualizer.m_DrillBitLineAxis->GetPStart().Z()); - this->m_Visualizer.m_GUILineOrientation->Translate(vectGUITrans); - - // FIXME: normally you shouldn't call this->m_Visualizer.y yourself - this->m_Visualizer.m_HoleLine2ToolStart->InitGLObject(); - this->m_Visualizer.m_HoleLine2ToolEnd->InitGLObject(); - this->m_Visualizer.m_DrillBitLineAxis->InitGLObject(); - this->m_Visualizer.m_HoleLineAxis->InitGLObject(); - this->m_Visualizer.m_GUILineOrientation->InitGLObject(); + this->m_DrillBitLineAxis->ExtendFromStart(lengthDiff); + + this->m_VisRotation.m_GUILineOrientation->SetPts(this->m_DrillBitLineAxis->GetPStart(), // start + this->m_HoleLineAxis->GetPStart()); // end + glm::vec3 vectGUITrans = glm::vec3(midPtToolAxis.x - this->m_DrillBitLineAxis->GetPStart().X(), + midPtToolAxis.y - this->m_DrillBitLineAxis->GetPStart().Y(), + midPtToolAxis.z - this->m_DrillBitLineAxis->GetPStart().Z()); + this->m_VisRotation.m_GUILineOrientation->Translate(vectGUITrans); + + // FIXME: should this go into the renderer? + this->m_VisPosition.m_HoleLine2ToolStart->InitGLObject(); + this->m_VisPosition.m_HoleLine2ToolEnd->InitGLObject(); + this->m_DrillBitLineAxis->InitGLObject(); + this->m_HoleLineAxis->InitGLObject(); + this->m_VisRotation.m_GUILineOrientation->InitGLObject(); // (i) start distance - float dist = this->m_Visualizer.m_HoleLine2ToolStart->GetLength(); + float dist = this->m_VisPosition.m_HoleLine2ToolStart->GetLength(); float distScaled = dist / scaleF; int distScaledMM = std::round(distScaled * 1000.f); if (distScaledMM > 99) distScaledMM = 99; @@ -108,59 +111,72 @@ namespace AIAC { if (distScaledMMStr.size() == 1) distScaledMMStr = "0" + distScaledMMStr; // (ii) detect if inside - float angle = this->m_Visualizer.m_HoleLine2ToolStart->ComputeAngle(this->m_Visualizer.m_HoleLine2ToolEnd); + float angle = this->m_VisPosition.m_HoleLine2ToolStart->ComputeAngle(this->m_VisPosition.m_HoleLine2ToolEnd); // (iii) angle - float angleOrient = this->m_Visualizer.m_DrillBitLineAxis->ComputeAngle(this->m_Visualizer.m_HoleLineAxis); + float angleOrient = this->m_DrillBitLineAxis->ComputeAngle(this->m_HoleLineAxis); int angleOrientRounded = angleOrient; if (angleOrientRounded > 99) angleOrientRounded = 99; std::string angleOrientRoundedStr = std::to_string(angleOrientRounded); if (angleOrientRoundedStr.size() == 1) angleOrientRoundedStr = "0" + angleOrientRoundedStr; // (iv) depth - float depthLeft = this->m_Visualizer.m_HoleLineAxis->GetPStart().DistanceTo(*AC_FF_TOOL->GetData().TooltipGO); - float holeLength = this->m_Visualizer.m_HoleLineAxis->GetLength(); + float depthLeft = this->m_HoleLineAxis->GetPStart().DistanceTo(*AC_FF_TOOL->GetData().TooltipGO); + float holeLength = this->m_HoleLineAxis->GetLength(); float depthDrilled = holeLength - depthLeft; float depthDrilledScaled = depthDrilled / scaleF; int depthDrilledScaledMM = std::round(depthDrilledScaled * 1000.f); std::string depthDrilledScaledMMStr = std::to_string(depthDrilledScaledMM); // >>>>>>>>>>>>>>>>> - // computed feedbacks - if (160.f < angle && angle < 200.f) // TODO: set tolerance var member, 20deg for now + // (v) computed feedbacks + this->m_VisText.m_InfoText->SetColor(GOColor::WHITE); + if ((180.f - this->m_InsideOutDetection) < angle && angle < (180.f + m_InsideOutDetection)) { distScaledMMStr = "00"; - this->m_Visualizer.m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); + this->m_VisPosition.m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); if (depthDrilled < 0.f) - this->m_Visualizer.m_HoleLine2ToolEnd->SetColor(GOColor::RED); + { + this->m_VisPosition.m_HoleLine2ToolEnd->SetColor(GOColor::RED); + this->m_VisText.m_InfoText->SetColor(GOColor::RED); + } else - this->m_Visualizer.m_HoleLine2ToolEnd->SetColor(GOColor::GREEN); + this->m_VisPosition.m_HoleLine2ToolEnd->SetColor(GOColor::GREEN); } else { if (depthDrilled > 0.f) - this->m_Visualizer.m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); + this->m_VisPosition.m_HoleLine2ToolStart->SetColor(GOColor::YELLOW); else - this->m_Visualizer.m_HoleLine2ToolStart->SetColor(GOColor::RED); - + { + this->m_VisPosition.m_HoleLine2ToolStart->SetColor(GOColor::RED); + this->m_VisText.m_InfoText->SetColor(GOColor::RED); + } } - if (angleOrient < 0.5f) // TODO: set tolerance var member - this->m_Visualizer.m_GUILineOrientation->SetVisibility(false); + if (angleOrient < this->m_OrientationTolerance) + // this->m_VisRotation.m_GUILineOrientation->SetVisibility(false); + this->m_VisRotation.Activate(); else - this->m_Visualizer.m_GUILineOrientation->SetVisibility(true); + // this->m_VisRotation.m_GUILineOrientation->SetVisibility(true); + this->m_VisRotation.Deactivate(); - // -- text std::string test = " s:" + distScaledMMStr + "/a:" + angleOrientRoundedStr + "/e:" + depthDrilledScaledMMStr; - this->m_Visualizer.m_InfoText->SetText(test); - this->m_Visualizer.m_InfoText->SetAnchor(midPtToolAxis); + this->m_VisText.m_InfoText->SetText(test); + this->m_VisText.m_InfoText->SetAnchor(midPtToolAxis); } - void HoleFeedback::Activate() { + void HoleFeedback::Activate() + { Update(); - m_Visualizer.Activate(); + this->m_VisText.Activate(); + this->m_VisPosition.Activate(); + this->m_VisRotation.Activate(); } - void HoleFeedback::Deactivate() { - m_Visualizer.Deactivate(); + void HoleFeedback::Deactivate() + { + this->m_VisText.Deactivate(); + this->m_VisPosition.Deactivate(); + this->m_VisRotation.Deactivate(); } } diff --git a/src/AIAC/Feedback/HoleFeedback.h b/src/AIAC/Feedback/HoleFeedback.h index 9803e01b..cb381d0b 100644 --- a/src/AIAC/Feedback/HoleFeedback.h +++ b/src/AIAC/Feedback/HoleFeedback.h @@ -10,42 +10,108 @@ namespace AIAC { /** - @brief The visualizer for the HoleFeedback class + @brief The general visualizer for the info displayed as text */ - class HoleFeedbackVisualizer : public FeedbackVisualizer { + class HoleFeedbackText : public FeedbackVisualizer + { public: - HoleFeedbackVisualizer(); + HoleFeedbackText(); private: - /// the line from the drillbit tip to the start of the hole (aka start distance) - std::shared_ptr m_HoleLine2ToolStart; - /// the line from the drillbit tip to the end of the hole (aka depth) - std::shared_ptr m_HoleLine2ToolEnd; // <<< position - /// the line axis for the drillbit - std::shared_ptr m_DrillBitLineAxis; - /// the line axis for the hole - std::shared_ptr m_HoleLineAxis; - /// GUI indicator for orientation - std::shared_ptr m_GUILineOrientation; // <<< orientation - /// All text objects + // @brief text visualized for numeric values of start, orientation and depth std::shared_ptr m_InfoText; friend class HoleFeedback; }; - class HoleFeedback : public FabFeedback { + /** + @brief The UI widget for providing feedback on position + */ + class HoleFeedbackPosition : public FeedbackVisualizer + { + public: + HoleFeedbackPosition(); + + private: + /// @brief the line from the drillbit tip to the end of the hole + std::shared_ptr m_HoleLine2ToolEnd; + /// @brief the line from the drillbit tip to the start of the hole (aka start distance) + std::shared_ptr m_HoleLine2ToolStart; + + friend class HoleFeedback; + }; + + /** + @brief The UI widget for providing feedback on rotation + */ + class HoleFeedbackRotation : public FeedbackVisualizer + { + public: + HoleFeedbackRotation(); + + private: + /// @brief UI indicator for orientation + std::shared_ptr m_GUILineOrientation; + + friend class HoleFeedback; + }; + + /** + @brief The UI widget for providing feedback on orientation + Feeds (in chronological order): + - (i) position + - (ii) angle + - (iii) depth + + * x Tb + * \ + * \ + * \ v3 + * \ + * \ + * x Tt + * .. + * . .v2 + * . . + * . x Hs + * v1 . / + * . / + * . / v4 + * . / + * ./ + * x He + + */ + class HoleFeedback : public FabFeedback + { public: - HoleFeedback() = default; + HoleFeedback(); ~HoleFeedback() = default; void Update() override; void Activate() override; void Deactivate() override; - private: - // TODO: here we need to differentiate between the different types of visualization - // e.g.: the position visualization and rotation visualizations need to be different - HoleFeedbackVisualizer m_Visualizer; + private: ///< general data for all feedbacks but not visualized + /// @brief the line axis for the drillbit + std::shared_ptr m_DrillBitLineAxis; + /// @brief the line axis for the hole + std::shared_ptr m_HoleLineAxis; + + private: ///< for UI widgets + /// @brief the text visualized for numeric values of start, orientation and depth + HoleFeedbackText m_VisText; + /// @brief The ui widget for position guidance + HoleFeedbackPosition m_VisPosition; + /// @brief The ui widget to guide for the orientation + HoleFeedbackRotation m_VisRotation; + + private: ///< tolerances for angle and position feedbacks + /// @brief the tolerance to detect if the tooltip is inside or outside the hole + float m_InsideOutDetection = 20.f; + /// @brief acceptable tolerance for the correct rotation detection + float m_OrientationTolerance = 0.5f; + }; }