]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
bos #19197 + issue #3245: Set size of sketch plane without modification of selection...
authorvsv <vsv@opencascade.com>
Thu, 28 May 2020 09:28:36 +0000 (12:28 +0300)
committervsv <vsv@opencascade.com>
Thu, 28 May 2020 09:28:49 +0000 (12:28 +0300)
src/PartSet/PartSet_PreviewSketchPlane.cpp
src/PartSet/PartSet_WidgetSketchLabel.cpp

index 9d7164d220743bce65e683115f516780fb608316..83529e23891f309d9eab8290d9d5932e6a84470b 100644 (file)
@@ -104,6 +104,21 @@ void PartSet_PreviewSketchPlane::createSketchPlane(const CompositeFeaturePtr& th
     myShape = GeomAlgoAPI_FaceBuilder::squareFace(
       myViewCentralPoint.get() ? myViewCentralPoint : anOrigin->pnt(), aNormal->dir(), aFaceSize);
   }
+  else if (myIsUseSizeOfView && (mySizeOfView > 0)) {
+    std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(myShape));
+    std::shared_ptr<GeomAPI_Pln> aPlane = aFace->getPlane();
+    if (aPlane.get()) {
+      double anA, aB, aC, aD;
+      aPlane->coefficients(anA, aB, aC, aD);
+      std::shared_ptr<GeomAPI_Dir> aNormDir(new GeomAPI_Dir(anA, aB, aC));
+      std::shared_ptr<GeomAPI_XYZ> aCoords = aNormDir->xyz();
+      std::shared_ptr<GeomAPI_XYZ> aZero(new GeomAPI_XYZ(0, 0, 0));
+      aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero));
+      std::shared_ptr<GeomAPI_Pnt> anOrigPnt(new GeomAPI_Pnt(aCoords));
+      myShape = GeomAlgoAPI_FaceBuilder::squareFace(
+        myViewCentralPoint.get() ? myViewCentralPoint : anOrigPnt, aNormDir, mySizeOfView);
+    }
+  }
   myPlane = createPreviewPlane();
 
   aDisp->displayAIS(myPlane, false/*load object in selection*/, 1/*shaded*/, false);
index 234a7699d3097e8013fd3e31e789a7d141876d1e..9365adc575d8067ce1476cc03c8c32d7ec47f706 100644 (file)
@@ -39,7 +39,6 @@
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_AttributeString.h>
 #include <ModelAPI_Events.h>
-#include <ModelAPI_ResultConstruction.h>
 
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_ViewerPrs.h>
@@ -347,20 +346,21 @@ void PartSet_WidgetSketchLabel::updateByPlaneSelected(const ModuleBase_ViewerPrs
   // 1. hide main planes if they have been displayed and display sketch preview plane
   myPreviewPlanes->erasePreviewPlanes(myWorkshop);
 
+  QString aSizeOfViewStr = mySizeOfView->text();
+  bool isSetSizeOfView = false;
+  double aSizeOfView = 0;
+  if (!aSizeOfViewStr.isEmpty()) {
+    aSizeOfView = aSizeOfViewStr.toDouble(&isSetSizeOfView);
+    if (isSetSizeOfView && aSizeOfView <= 0) {
+      isSetSizeOfView = false;
+    }
+  }
   PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
   if (aModule) {
     CompositeFeaturePtr aSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
-    bool isSetSizeOfView = false;
-    double aSizeOfView = 0;
-    QString aSizeOfViewStr = mySizeOfView->text();
-    if (!aSizeOfViewStr.isEmpty()) {
-      aSizeOfView = aSizeOfViewStr.toDouble(&isSetSizeOfView);
-      if (isSetSizeOfView && aSizeOfView <= 0) {
-        isSetSizeOfView = false;
-      }
-    }
     aModule->sketchMgr()->previewSketchPlane()->setSizeOfView(aSizeOfView, isSetSizeOfView);
-    aModule->sketchMgr()->previewSketchPlane()->createSketchPlane(aSketch, myWorkshop);
+    // Call of createSketchPlane is managed by events Loop
+    //aModule->sketchMgr()->previewSketchPlane()->createSketchPlane(aSketch, myWorkshop);
   }
   // 2. if the planes were displayed, change the view projection
 
@@ -374,18 +374,13 @@ void PartSet_WidgetSketchLabel::updateByPlaneSelected(const ModuleBase_ViewerPrs
   if (aRotate) {
     myWorkshop->viewer()->setViewProjection(aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aTwist);
   }
-  QString aSizeOfViewStr = mySizeOfView->text();
-  if (!aSizeOfViewStr.isEmpty()) {
-    bool isOk;
-    double aSizeOfView = aSizeOfViewStr.toDouble(&isOk);
-    if (isOk && aSizeOfView > 0) {
-      Handle(V3d_View) aView3d = myWorkshop->viewer()->activeView();
-      if (!aView3d.IsNull()) {
-        Bnd_Box aBndBox;
-        double aHalfSize = aSizeOfView/2.0;
-        aBndBox.Update(-aHalfSize, -aHalfSize, -aHalfSize, aHalfSize, aHalfSize, aHalfSize);
-        aView3d->FitAll(aBndBox, 0.01, false);
-      }
+  if (isSetSizeOfView && aSizeOfView > 0) {
+    Handle(V3d_View) aView3d = myWorkshop->viewer()->activeView();
+    if (!aView3d.IsNull()) {
+      Bnd_Box aBndBox;
+      double aHalfSize = aSizeOfView/2.0;
+      aBndBox.Update(-aHalfSize, -aHalfSize, -aHalfSize, aHalfSize, aHalfSize, aHalfSize);
+      aView3d->FitAll(aBndBox, 0.01, false);
     }
   }
   if (myOpenTransaction) {
@@ -506,61 +501,48 @@ bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const ModuleBase_View
 {
   bool isOwnerSet = false;
 
-  GeomShapePtr aShape = thePrs->shape();
+  const GeomShapePtr& aShape = thePrs->shape();
   std::shared_ptr<GeomAPI_Dir> aDir;
 
-  if (!aShape.get() || aShape->isNull()) {
-    if (thePrs->object() && (feature() != thePrs->object())) {
-      if (thePrs->object()->groupName() == ModelAPI_ResultConstruction::group()) {
-        ResultConstructionPtr aConstruction =
-          std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(thePrs->object());
-        if (aConstruction.get())
-          aShape = aConstruction->shape();
-      }
-    }
-  }
-
   if (aShape.get() && !aShape->isNull()) {
     const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
     aDir = setSketchPlane(aTDShape);
     isOwnerSet = aDir.get();
   }
   if (thePrs->object() && (feature() != thePrs->object())) {
-    if (thePrs->object()->groupName() != ModelAPI_ResultConstruction::group()) {
-      FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object());
-      DataPtr aData = feature()->data();
-      AttributeSelectionPtr aSelAttr =
-        std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
-        (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
-      if (aSelAttr.get()) {
-        ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(thePrs->object());
-        if (aRes.get()) {
-          GeomShapePtr aShapePtr;
-          if (!aShape.get() || aShape->isNull()) {  // selection happens in the OCC viewer
-            aShapePtr = ModelAPI_Tools::shape(aRes);
-          }
-          else { // selection happens in OB browser
-            aShapePtr = aShape;
-          }
-          if (aShapePtr.get() && aShapePtr->isFace()) {
-            const TopoDS_Shape& aTDShape = aShapePtr->impl<TopoDS_Shape>();
-            setSketchPlane(aTDShape);
-            aSelAttr->setValue(aRes, aShapePtr);
-            isOwnerSet = true;
-          }
+    FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object());
+    DataPtr aData = feature()->data();
+    AttributeSelectionPtr aSelAttr =
+      std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
+      (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
+    if (aSelAttr.get()) {
+      ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(thePrs->object());
+      if (aRes.get()) {
+        GeomShapePtr aShapePtr;
+        if (!aShape.get() || aShape->isNull()) {  // selection happens in the OCC viewer
+          aShapePtr = ModelAPI_Tools::shape(aRes);
         }
-        else {
-          aSelAttr->setValue(aFeature, GeomShapePtr());
-          GeomShapePtr aSelShape = aSelAttr->value();
-          if (!aSelShape.get() && aSelAttr->contextFeature().get() &&
-            aSelAttr->contextFeature()->firstResult().get()) {
-            aSelShape = aSelAttr->contextFeature()->firstResult()->shape();
-          }
-          if (aSelShape.get() && aSelShape->isPlanar()) {
-            const TopoDS_Shape& aTDShape = aSelShape->impl<TopoDS_Shape>();
-            setSketchPlane(aTDShape);
-            isOwnerSet = true;
-          }
+        else { // selection happens in OB browser
+          aShapePtr = aShape;
+        }
+        if (aShapePtr.get() && aShapePtr->isFace()) {
+          const TopoDS_Shape& aTDShape = aShapePtr->impl<TopoDS_Shape>();
+          setSketchPlane(aTDShape);
+          aSelAttr->setValue(aRes, aShapePtr);
+          isOwnerSet = true;
+        }
+      }
+      else {
+        aSelAttr->setValue(aFeature, GeomShapePtr());
+        GeomShapePtr aSelShape = aSelAttr->value();
+        if (!aSelShape.get() && aSelAttr->contextFeature().get() &&
+          aSelAttr->contextFeature()->firstResult().get()) {
+          aSelShape = aSelAttr->contextFeature()->firstResult()->shape();
+        }
+        if (aSelShape.get() && aSelShape->isPlanar()) {
+          const TopoDS_Shape& aTDShape = aSelShape->impl<TopoDS_Shape>();
+          setSketchPlane(aTDShape);
+          isOwnerSet = true;
         }
       }
     }