]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
[bos #37689] EDF 28575 - vertical edges are recognised as horizontal master mbs/37689_bad_sketch_orient 72/head
authormbs <martin.bernhard@opencascade.com>
Wed, 2 Oct 2024 08:39:57 +0000 (09:39 +0100)
committermbs <martin.bernhard@opencascade.com>
Thu, 24 Oct 2024 08:45:44 +0000 (09:45 +0100)
There are different algorithms used to compute the orientation of a new sketch and the orientation of the view.
Explicitly set up vector to the view orientation to match the sketch orientation.

src/ModuleBase/ModuleBase_IViewer.h
src/PartSet/PartSet_Tools.cpp
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/SHAPERGUI/SHAPERGUI_SalomeViewer.cpp
src/SHAPERGUI/SHAPERGUI_SalomeViewer.h
src/XGUI/XGUI_ViewerProxy.cpp
src/XGUI/XGUI_ViewerProxy.h

index c9c070176462050ab3b1ad07c6888e1b0b5eff24..83555284a8e37fcaaffb5d174193be01f87884e2 100644 (file)
@@ -97,6 +97,16 @@ Q_OBJECT
   virtual void setViewProjection( double theX, double theY, double theZ,
                                   double theTwist ) = 0;
 
+  //! Sets the view projection and up direction
+  /// \param theX the X projection value
+  /// \param theY the Y projection value
+  /// \param theZ the Z projection value
+  /// \param theUpX the X value of the up direction vector
+  /// \param theUpY the Y value of the up direction vector
+  /// \param theUpZ the Z value of the up direction vector
+  virtual void setViewProjection( double theX, double theY, double theZ,
+                                  double theUpX, double theUpY, double theUpZ) = 0;
+
   /// Add selection filter to the viewer
   /// \param theFilter a selection filter
   virtual void addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) = 0;
index fd71ff50bbf7480c8eeda1ac1cf2d31f8b43564b..3b088851f02228d14b9a87e596e04211805519f0 100644 (file)
@@ -307,8 +307,17 @@ std::shared_ptr<GeomAPI_Pln> PartSet_Tools::sketchPlane(CompositeFeaturePtr theS
       theSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID()));
 
   if (aNormal.get() && aNormal->isInitialized() &&
-      anOrigin.get() && anOrigin->isInitialized())
-    aPlane = std::shared_ptr<GeomAPI_Pln>(new GeomAPI_Pln(anOrigin->pnt(), aNormal->dir()));
+      anOrigin.get() && anOrigin->isInitialized()) {
+    std::shared_ptr<GeomDataAPI_Dir> aDirX = std::dynamic_pointer_cast<GeomDataAPI_Dir>(
+        theSketch->data()->attribute(SketchPlugin_Sketch::DIRX_ID()));
+    if (aDirX.get() && aDirX->isInitialized()) {
+      std::shared_ptr<GeomAPI_Ax3> anAxes = std::shared_ptr<GeomAPI_Ax3>(new GeomAPI_Ax3(anOrigin->pnt(), aDirX->dir(), aNormal->dir()));
+      aPlane = std::shared_ptr<GeomAPI_Pln>(new GeomAPI_Pln(anAxes));
+    }
+    else {
+      aPlane = std::shared_ptr<GeomAPI_Pln>(new GeomAPI_Pln(anOrigin->pnt(), aNormal->dir()));
+    }
+  }
 
   return aPlane;
 }
index e1f71f19a45e611ae9d80dbc4dcf75531c66cd96..08c6d7f4174a6f4157a91a23b0deb71022758c8e 100644 (file)
 #define DBL_MAX 1.7976931348623158e+308
 #endif
 
+
+
+//=============================================================================
+//function : setViewProjection
+//purpose  : Set the view projection with a specific plane orientation
+//=============================================================================
+static void setViewProjection(ModuleBase_IWorkshop* theWorkshop, const GeomPlanePtr thePlane, bool theReversed)
+{
+  GeomDirPtr aDirection = thePlane->direction();
+  GeomDirPtr aXDirection = thePlane->xDirection();
+  gp_Dir aNormDir = aDirection->impl<gp_Dir>();
+  gp_Dir aXDirPln = aXDirection->impl<gp_Dir>();
+  if (theReversed) {
+    aNormDir.Reverse();
+    aXDirPln.Reverse();
+  }
+
+  gp_Dir aYDirPln = aNormDir.Crossed(aXDirPln);
+
+  // Set the view projection and up direction
+  theWorkshop->viewer()->setViewProjection(aNormDir.X(), aNormDir.Y(), aNormDir.Z(), aYDirPln.X(), aYDirPln.Y(), aYDirPln.Z());
+}
+
+
 PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
                         ModuleBase_IWorkshop* theWorkshop,
                         const Config_WidgetAPI* theData,
@@ -383,15 +407,12 @@ void PartSet_WidgetSketchLabel::updateByPlaneSelected(const ModuleBase_ViewerPrs
   }
   // 2. if the planes were displayed, change the view projection
 
-  std::shared_ptr<GeomAPI_Dir> aDir = aPlane->direction();
-  gp_XYZ aXYZ = aDir->impl<gp_Dir>().XYZ();
-  double aTwist = 0.0;
-
   // Rotate view if the sketcher plane is selected only from preview planes
   // Preview planes are created only if there is no any shape
   bool aRotate = Config_PropManager::boolean(SKETCH_TAB_NAME, "rotate_to_plane");
   if (aRotate) {
-    myWorkshop->viewer()->setViewProjection(aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aTwist);
+    bool aReversed = myViewInverted->isChecked();
+    setViewProjection(myWorkshop, aPlane, aReversed);
   }
   if (isSetSizeOfView && aSizeOfView > 0) {
     Handle(V3d_View) aView3d = myWorkshop->viewer()->activeView();
@@ -739,11 +760,9 @@ void PartSet_WidgetSketchLabel::onSetPlaneView()
 {
   std::shared_ptr<GeomAPI_Pln> aPlane = plane();
   if (aPlane.get()) {
-    std::shared_ptr<GeomAPI_Dir> aDirection = aPlane->direction();
-    gp_Dir aDir = aDirection->impl<gp_Dir>();
-    if (myViewInverted->isChecked())
-      aDir.Reverse();
-    myWorkshop->viewer()->setViewProjection(aDir.X(), aDir.Y(), aDir.Z(), 0.);
+    bool aReversed = myViewInverted->isChecked();
+    setViewProjection(myWorkshop, aPlane, aReversed);
+
     PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
     if (aModule)
       aModule->onViewTransformed();
index d14bfcbcbab891167e4c3ebc144cc33edc4f480a..3b282ad977a2394a9bc117544f09c4afed696c0b 100644 (file)
@@ -430,6 +430,26 @@ void SHAPERGUI_SalomeViewer::setViewProjection(double theX, double theY,
   }
 }
 
+//**********************************************
+void SHAPERGUI_SalomeViewer::setViewProjection(double theX, double theY, double theZ, double theUpX, double theUpY, double theUpZ)
+{
+  if (!mySelector)
+    return;
+
+  SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
+  OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
+  if (aVFrame) {
+    Handle(V3d_View) aView3d = aVFrame->getViewPort()->getView();
+    if (!aView3d.IsNull()) {
+      aView3d->SetProj(theX, theY, theZ);
+      aView3d->SetUp (theUpX, theUpY, theUpZ);
+      aView3d->FitAll(0.01, false);
+      if (aView3d->Depth() < 0.1)
+        aView3d->DepthFitAll();
+    }
+  }
+}
+
 //***************************************
 void SHAPERGUI_SalomeViewer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
 {
index 3657b04747ef9510f409348fc3e686e939e1d2bc..60f9d38226397b6a6a14c7b922738732c1b65f33 100644 (file)
@@ -135,6 +135,16 @@ Q_OBJECT
   virtual void setViewProjection( double theX, double theY, double theZ,
                                   double theTwist );
 
+  //! Sets the view projection and up direction
+  /// \param theX the X projection value
+  /// \param theY the Y projection value
+  /// \param theZ the Z projection value
+  /// \param theUpX the X value of the up direction vector
+  /// \param theUpY the Y value of the up direction vector
+  /// \param theUpZ the Z value of the up direction vector
+  virtual void setViewProjection( double theX, double theY, double theZ,
+                                  double theUpX, double theUpY, double theUpZ);
+
   /// Set selector
   /// \param theSel a selector instance
   void setSelector(SHAPERGUI_OCCSelector* theSel);
index cc73e969d09231ad0ad0395bbafac7ddddb253ee..7cbd621116be0b59c549eaa95635610e5195b064 100644 (file)
@@ -128,6 +128,18 @@ void XGUI_ViewerProxy::setViewProjection(double theX, double theY, double theZ,
   }
 }
 
+void XGUI_ViewerProxy::setViewProjection(double theX, double theY, double theZ, double theUpX, double theUpY, double theUpZ)
+{
+  Handle(V3d_View) aView3d = activeView();
+  if (!aView3d.IsNull()) {
+    aView3d->SetProj(theX, theY, theZ);
+    aView3d->SetUp (theUpX, theUpY, theUpZ);
+    aView3d->FitAll(0.01, false);
+    if (aView3d->Depth() < 0.1)
+      aView3d->DepthFitAll();
+  }
+}
+
 void XGUI_ViewerProxy::fitAll()
 {
 #ifdef HAVE_SALOME
index d4b029cbad11693881ff0ee9265ff6e8b202ee34..d8965af30ce87f98a2d74963f23ed30031a33e96 100644 (file)
@@ -93,6 +93,16 @@ Q_OBJECT
   virtual void setViewProjection( double theX, double theY, double theZ,
                                   double theTwist );
 
+  //! Sets the view projection and up direction
+  /// \param theX the X projection value
+  /// \param theY the Y projection value
+  /// \param theZ the Z projection value
+  /// \param theUpX the X value of the up direction vector
+  /// \param theUpY the Y value of the up direction vector
+  /// \param theUpZ the Z value of the up direction vector
+  virtual void setViewProjection( double theX, double theY, double theZ,
+                                  double theUpX, double theUpY, double theUpZ);
+
   //! Sets the view fitted all
   virtual void fitAll();