X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_PreviewSketchPlane.cpp;h=d3c11e51a38e04dbeb0686d779b4d144f8667d79;hb=1fd15bed1c62f994a3438bc4a12f44d0361f98c9;hp=808de929f96e6d9d29585f539fd17362759407aa;hpb=d4b0a5cb916f4eccf4a0bce02e43a54c7a67cb93;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_PreviewSketchPlane.cpp b/src/PartSet/PartSet_PreviewSketchPlane.cpp index 808de929f..d3c11e51a 100644 --- a/src/PartSet/PartSet_PreviewSketchPlane.cpp +++ b/src/PartSet/PartSet_PreviewSketchPlane.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2021 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "PartSet_PreviewSketchPlane.h" @@ -62,48 +61,83 @@ void PartSet_PreviewSketchPlane::eraseSketchPlane(ModuleBase_IWorkshop* theWorks } } +void PartSet_PreviewSketchPlane::displaySketchPlane(ModuleBase_IWorkshop* theWorkshop) +{ + if (myPlane.get() && (!myPreviewIsDisplayed)) { + XGUI_Displayer* aDisp = XGUI_Tools::workshop(theWorkshop)->displayer(); + aDisp->displayAIS(myPlane, false/*load object in selection*/, 1/*shaded*/, false); + myPreviewIsDisplayed = true; + } +} + + +void PartSet_PreviewSketchPlane::clearPlanePreview() +{ + myPlane = std::shared_ptr(); + myShape = std::shared_ptr(); +} + + void PartSet_PreviewSketchPlane::createSketchPlane(const CompositeFeaturePtr& theSketch, ModuleBase_IWorkshop* theWorkshop) { - // the preview plane has been already created and displayed - if (myPreviewIsDisplayed) - return; - // plane is visualized only if sketch plane is filled if (!PartSet_Tools::sketchPlane(theSketch).get()) return; - if (!myPlane) { // If planes are not created - // Create Preview - // selected linear face parameters - AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast - (theSketch->data()->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); - if (aSelAttr) { - myShape = aSelAttr->value(); - // this case is needed by constructing sketch on a plane, where result shape is equal - // to context result, therefore value() returns NULL and we should use shape of context. - if (!myShape.get() && aSelAttr->context().get()) - myShape = aSelAttr->context()->shape(); - } - if (!myShape.get()) { - // Create Preview for default planes - std::shared_ptr anOrigin = std::dynamic_pointer_cast( - theSketch->data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - std::shared_ptr aNormal = std::dynamic_pointer_cast( - theSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); - - double aFaceSize = myIsUseSizeOfView ? mySizeOfView - : Config_PropManager::real(SKETCH_TAB_NAME, "planes_size"); - if (aFaceSize <= Precision::Confusion()) - aFaceSize = 200; // Set default value + AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast + (theSketch->data()->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (!aSelAttr) + return; + + if (myShape.get() && myShape->isSame(aSelAttr->value()) && myPlane.get()) + return; + + XGUI_Displayer* aDisp = XGUI_Tools::workshop(theWorkshop)->displayer(); + if (myPreviewIsDisplayed) { + aDisp->eraseAIS(myPlane, false); + } + // Create Preview + // selected linear face parameters + myShape = aSelAttr->value(); + // this case is needed by constructing sketch on a plane, where result shape is equal + // to context result, therefore value() returns NULL and we should use shape of context. + if (!myShape.get() && aSelAttr->context().get()) + myShape = aSelAttr->context()->shape(); + + if (!myShape.get()) { + // Create Preview for default planes + std::shared_ptr anOrigin = std::dynamic_pointer_cast( + theSketch->data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aNormal = std::dynamic_pointer_cast( + theSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); + + double aFaceSize = myIsUseSizeOfView ? mySizeOfView + : Config_PropManager::real(SKETCH_TAB_NAME, "planes_size"); + if (aFaceSize <= Precision::Confusion()) + aFaceSize = 200; // Set default value + + myShape = GeomAlgoAPI_FaceBuilder::squareFace( + myViewCentralPoint.get() ? myViewCentralPoint : anOrigin->pnt(), aNormal->dir(), aFaceSize); + } + else if (myIsUseSizeOfView && (mySizeOfView > 0)) { + std::shared_ptr aFace(new GeomAPI_Face(myShape)); + std::shared_ptr aPlane = aFace->getPlane(); + if (aPlane.get()) { + double anA, aB, aC, aD; + aPlane->coefficients(anA, aB, aC, aD); + std::shared_ptr aNormDir(new GeomAPI_Dir(anA, aB, aC)); + std::shared_ptr aCoords = aNormDir->xyz(); + std::shared_ptr aZero(new GeomAPI_XYZ(0, 0, 0)); + aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); + std::shared_ptr anOrigPnt(new GeomAPI_Pnt(aCoords)); myShape = GeomAlgoAPI_FaceBuilder::squareFace( - myViewCentralPoint.get() ? myViewCentralPoint : anOrigin->pnt(), aNormal->dir(), aFaceSize); + myViewCentralPoint.get() ? myViewCentralPoint : anOrigPnt, aNormDir, mySizeOfView); } - myPlane = createPreviewPlane(); } + myPlane = createPreviewPlane(); - XGUI_Displayer* aDisp = XGUI_Tools::workshop(theWorkshop)->displayer(); aDisp->displayAIS(myPlane, false/*load object in selection*/, 1/*shaded*/, false); myPreviewIsDisplayed = true; }