From ee283f399858a3297d4629a968ecad8a6c0e6bb0 Mon Sep 17 00:00:00 2001 From: adv Date: Thu, 23 Jan 2014 09:57:19 +0000 Subject: [PATCH] Translation of obstacle (Bug #341). --- src/HYDROData/HYDROData_Obstacle.cxx | 72 ++++++++++++++++++- src/HYDROData/HYDROData_Obstacle.h | 63 ++++++++++------ src/HYDROData/HYDROData_ShapesTool.cxx | 23 ++++++ src/HYDROData/HYDROData_ShapesTool.h | 13 ++++ src/HYDROGUI/HYDROGUI_TranslateObstacleOp.cxx | 33 +++++---- src/HYDROPy/HYDROData_Obstacle.sip | 8 +++ 6 files changed, 173 insertions(+), 39 deletions(-) diff --git a/src/HYDROData/HYDROData_Obstacle.cxx b/src/HYDROData/HYDROData_Obstacle.cxx index 560d91e1..bde8f4fc 100644 --- a/src/HYDROData/HYDROData_Obstacle.cxx +++ b/src/HYDROData/HYDROData_Obstacle.cxx @@ -26,6 +26,7 @@ #include #include +#include #include @@ -73,14 +74,23 @@ QStringList HYDROData_Obstacle::DumpToPython( MapOfTreatedObjects& theTreatedObj aResList << QString( "%1.SetGeomObjectEntry( \"%2\" );" ) .arg( anObstacleName ).arg( aGeomObjectEntry.ToCString() ); + aResList << QString( "" ); } else if ( !aFilePath.isEmpty() ) { aResList << QString( "%1.ImportFromFile( \"%2\" );" ) .arg( anObstacleName ).arg( aFilePath ); + aResList << QString( "" ); } - aResList << QString( "" ); + // Write the translation points + double aDx, aDy, aDz; + if ( getTranslation( aDx, aDy, aDz ) ) + { + aResList << QString( "%1.Translate( %2, %3, %4 );" ) + .arg( anObstacleName ).arg( aDx ).arg( aDy ).arg( aDz ); + aResList << QString( "" ); + } aResList << QString( "%1.Update();" ).arg( anObstacleName ); aResList << QString( "" ); @@ -212,6 +222,21 @@ TCollection_AsciiString HYDROData_Obstacle::GetGeomObjectEntry() const return aRes; } +void HYDROData_Obstacle::Translate( const double theDx, + const double theDy, + const double theDz ) +{ + TopoDS_Shape aShape3D = GetShape3D(); + + TopoDS_Shape aTranslatedShape3D = HYDROData_ShapesTool::Translated( aShape3D, theDx, theDy, theDz ); + if ( aTranslatedShape3D.IsNull() ) + return; + + SetShape3D( aTranslatedShape3D ); + + setTranslation( theDx, theDy, theDz ); +} + TopoDS_Shape HYDROData_Obstacle::ImportBREP( const QString& theFilePath ) const { TopoDS_Shape aResShape; @@ -385,6 +410,11 @@ QColor HYDROData_Obstacle::getDefaultBorderColor() const return DefaultBorderColor(); } +ObjectKind HYDROData_Obstacle::getAltitudeObjectType() const +{ + return KIND_OBSTACLE_ALTITUDE; +} + void HYDROData_Obstacle::createGroupObjects() { TopoDS_Shape anObstacleShape = GetTopShape(); @@ -404,10 +434,46 @@ void HYDROData_Obstacle::createGroupObjects() } } -ObjectKind HYDROData_Obstacle::getAltitudeObjectType() const +void HYDROData_Obstacle::setTranslation( const double theDx, + const double theDy, + const double theDz ) { - return KIND_OBSTACLE_ALTITUDE; + TDF_Label aLabel = myLab.FindChild( DataTag_Translation ); + + double aCurDx = theDx; + double aCurDy = theDy; + double aCurDz = theDz; + + double aPrevDx, aPrevDy, aPrevDz; + if ( getTranslation( aPrevDx, aPrevDy, aPrevDz ) ) + { + aCurDx += aPrevDx; + aCurDy += aPrevDy; + aCurDz += aPrevDz; + } + + Handle(TDataStd_RealArray) aCoeffsArray = TDataStd_RealArray::Set( aLabel, 1, 3 ); + aCoeffsArray->SetValue( 1, aCurDx ); + aCoeffsArray->SetValue( 2, aCurDy ); + aCoeffsArray->SetValue( 3, aCurDz ); } +bool HYDROData_Obstacle::getTranslation( double& theDx, double& theDy, double& theDz ) const +{ + theDx = theDy = theDz = 0.0; + + TDF_Label aLabel = myLab.FindChild( DataTag_Translation, false ); + if ( aLabel.IsNull() ) + return false; + + Handle(TDataStd_RealArray) aCoeffsArray; + if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), aCoeffsArray ) ) + return false; + theDx = aCoeffsArray->Value( 1 ); + theDy = aCoeffsArray->Value( 2 ); + theDz = aCoeffsArray->Value( 3 ); + + return true; +} diff --git a/src/HYDROData/HYDROData_Obstacle.h b/src/HYDROData/HYDROData_Obstacle.h index 2e38854b..ccf1599d 100644 --- a/src/HYDROData/HYDROData_Obstacle.h +++ b/src/HYDROData/HYDROData_Obstacle.h @@ -20,7 +20,8 @@ protected: { DataTag_First = HYDROData_ArtificialObject::DataTag_First + 100, ///< first tag, to reserve DataTag_GeomObjectEntry, ///< study entry of the imported GEOM object - DataTag_FilePath ///< imported file path + DataTag_FilePath, ///< imported file path + DataTag_Translation, ///< translation coefficients }; public: @@ -113,6 +114,14 @@ public: */ HYDRODATA_EXPORT TCollection_AsciiString GetGeomObjectEntry() const; + + /** + * Translate the obstacle to the given distance. + */ + HYDRODATA_EXPORT void Translate( const double theDx, + const double theDy, + const double theDz ); + protected: /** @@ -133,27 +142,6 @@ protected: private: - /** - * Create all necessary child group objects. - */ - HYDRODATA_EXPORT void createGroupObjects(); - -protected: - - friend class HYDROData_Iterator; - - /** - * Creates new object in the internal data structure. Use higher level objects - * to create objects with real content. - */ - HYDRODATA_EXPORT HYDROData_Obstacle(); - - /** - * Destructs properties of the object and object itself, removes it from the document. - */ - virtual HYDRODATA_EXPORT ~HYDROData_Obstacle(); - -private: /** * Imports shape from the BREP file. * \param theFilePath the path to file @@ -174,6 +162,37 @@ private: * \return shape as TopoDS_Shape (null shape if import was failed) */ TopoDS_Shape ImportSTEP( const QString& theFilePath ) const; + + /** + * Create all necessary child group objects. + */ + void createGroupObjects(); + + /** + * Sets the translation coefficients. + */ + void setTranslation( const double theDx, const double theDy, const double theDz ); + + /** + * Returns the translation coefficients. + */ + bool getTranslation( double& theDx, double& theDy, double& theDz ) const; + +protected: + + friend class HYDROData_Iterator; + + /** + * Creates new object in the internal data structure. Use higher level objects + * to create objects with real content. + */ + HYDRODATA_EXPORT HYDROData_Obstacle(); + + /** + * Destructs properties of the object and object itself, removes it from the document. + */ + virtual HYDRODATA_EXPORT ~HYDROData_Obstacle(); + }; #endif diff --git a/src/HYDROData/HYDROData_ShapesTool.cxx b/src/HYDROData/HYDROData_ShapesTool.cxx index d591c3a6..d11b3691 100644 --- a/src/HYDROData/HYDROData_ShapesTool.cxx +++ b/src/HYDROData/HYDROData_ShapesTool.cxx @@ -81,6 +81,29 @@ bool HYDROData_ShapesTool::IsVerticesEquals( const TopoDS_Vertex& theFirstVert, return aFirstPoint.IsEqual( aSecondPoint, Precision::Confusion() ); } +TopoDS_Shape HYDROData_ShapesTool::Translated( const TopoDS_Shape& theShape, + const double theDx, + const double theDy, + const double theDz ) +{ + TopoDS_Shape aTranslatedShape; + if ( theShape.IsNull() ) + return aTranslatedShape; + + gp_Vec aVec( theDx, theDy, theDz ); + + gp_Trsf aTrsf; + aTrsf.SetTranslation( aVec ); + + TopLoc_Location aLocOrig = theShape.Location(); + gp_Trsf aTrsfOrig = aLocOrig.Transformation(); + + TopLoc_Location aLocRes( aTrsf * aTrsfOrig ); + aTranslatedShape = theShape.Located( aLocRes ); + + return aTranslatedShape; +} + bool HYDROData_ShapesTool::IsEdgesEquals( const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, const bool theIs2D ) diff --git a/src/HYDROData/HYDROData_ShapesTool.h b/src/HYDROData/HYDROData_ShapesTool.h index 886b5808..db50bb20 100644 --- a/src/HYDROData/HYDROData_ShapesTool.h +++ b/src/HYDROData/HYDROData_ShapesTool.h @@ -60,6 +60,19 @@ public: const TopoDS_Edge& theSecondEdge, const bool theIs2D = false ); + /** + * \brief Translate the shape to the given distance. + * \param theShape shape to translate + * \param theDx X vector component + * \param theDy Y vector component + * \param theDz Z vector component + * \return result translated shape + */ + static TopoDS_Shape Translated( const TopoDS_Shape& theShape, + const double theDx, + const double theDy, + const double theDz ); + /** * \brief Adds the sequence of shapes to other sequence. * \param theShapes sequence to which the shapes will be added diff --git a/src/HYDROGUI/HYDROGUI_TranslateObstacleOp.cxx b/src/HYDROGUI/HYDROGUI_TranslateObstacleOp.cxx index c6771910..952fe9fb 100644 --- a/src/HYDROGUI/HYDROGUI_TranslateObstacleOp.cxx +++ b/src/HYDROGUI/HYDROGUI_TranslateObstacleOp.cxx @@ -28,6 +28,8 @@ #include "HYDROGUI_Tool.h" #include "HYDROGUI_UpdateFlags.h" +#include + #include #include #include @@ -109,17 +111,16 @@ bool HYDROGUI_TranslateObstacleOp::processApply( int& theUpdateFlags, return false; } - // Get the translated shape - TopoDS_Shape aTranslatedShape = getTranslatedShape(); - if ( aTranslatedShape.IsNull() ) { - return false; - } - // Erase preview erasePreview(); - // Set the translated shape to the obstacle - myEditedObject->SetShape3D( aTranslatedShape ); + // Get the translated shape + double aDx = aPanel->getDx(); + double aDy = aPanel->getDy(); + double aDz = aPanel->getDz(); + + // Translate the obstacle + myEditedObject->Translate( aDx, aDy, aDz ); myEditedObject->Update(); module()->setIsToUpdate( myEditedObject ); @@ -132,9 +133,9 @@ bool HYDROGUI_TranslateObstacleOp::processApply( int& theUpdateFlags, void HYDROGUI_TranslateObstacleOp::createPreview() { - if ( myEditedObject.IsNull() ) { + HYDROGUI_TranslateObstacleDlg* aPanel = (HYDROGUI_TranslateObstacleDlg*)inputPanel(); + if ( myEditedObject.IsNull() || !aPanel ) return; - } // Create preview presentation if necessary if ( !myPreviewPrs ) { @@ -154,11 +155,15 @@ void HYDROGUI_TranslateObstacleOp::createPreview() } } - // Get the translated shape - TopoDS_Shape aTranslatedShape = getTranslatedShape(); - // Set the translated shape to the preview presentation - if ( myPreviewPrs ) { + if ( myPreviewPrs ) + { + double aDx = aPanel->getDx(); + double aDy = aPanel->getDy(); + double aDz = aPanel->getDz(); + TopoDS_Shape anOriShape = myEditedObject->GetShape3D(); + + TopoDS_Shape aTranslatedShape = HYDROData_ShapesTool::Translated( anOriShape, aDx, aDy, aDz ); myPreviewPrs->setShape( aTranslatedShape ); } } diff --git a/src/HYDROPy/HYDROData_Obstacle.sip b/src/HYDROPy/HYDROData_Obstacle.sip index 14cce6d6..f9eb1cf1 100644 --- a/src/HYDROPy/HYDROData_Obstacle.sip +++ b/src/HYDROPy/HYDROData_Obstacle.sip @@ -90,6 +90,14 @@ public: TCollection_AsciiString GetGeomObjectEntry() const; +public: + + /** + * Translate the obstacle to the given distance. + */ + void Translate( const double theDx, const double theDy, const double theDz ); + + protected: /** -- 2.39.2