X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_PreviewSketchPlane.cpp;h=43d7005ee73ae2f4a4bdcb72b9f5501e68712d3a;hb=8031e4f1c6fb3b346fb3fd24cbdd77b6f9c1efad;hp=f0f614bb0f4ec9d7dccc2037b878fa7b1f784433;hpb=2714903267d23cd0c81166c506fb3edd1e069d40;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_PreviewSketchPlane.cpp b/src/PartSet/PartSet_PreviewSketchPlane.cpp index f0f614bb0..43d7005ee 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-2019 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" @@ -29,6 +28,7 @@ #include #include +#include #include #include @@ -40,6 +40,8 @@ #include #include +#include + PartSet_PreviewSketchPlane::PartSet_PreviewSketchPlane() : myPreviewIsDisplayed(false), mySizeOfView(0), myIsUseSizeOfView(false) { @@ -62,49 +64,129 @@ void PartSet_PreviewSketchPlane::eraseSketchPlane(ModuleBase_IWorkshop* theWorks 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::integer(SKETCH_TAB_NAME, "planes_size"); - myShape = GeomAlgoAPI_FaceBuilder::squareFace(anOrigin->pnt(), aNormal->dir(), aFaceSize); - } - myPlane = createPreviewPlane(); - } + AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast + (theSketch->data()->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (!aSelAttr) + return; + + if (myShape.get() && myShape->isSame(aSelAttr->value())) + return; XGUI_Displayer* aDisp = XGUI_Tools::workshop(theWorkshop)->displayer(); - aDisp->displayAIS(myPlane, true, 1/*shaded*/, false); + 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); + } + myPlane = createPreviewPlane(); + + aDisp->displayAIS(myPlane, false/*load object in selection*/, 1/*shaded*/, false); myPreviewIsDisplayed = true; } -void PartSet_PreviewSketchPlane::setSizeOfView(double theSizeOfView, bool isUseSizeOfView) +double maximumSize(double theXmin, double theYmin, double theZmin, + double theXmax, double theYmax, double theZmax) +{ + double aSize = fabs(theXmax - theXmin); + double aSizeToCompare = fabs(theYmax - theYmin); + if (aSizeToCompare > aSize) + aSize = aSizeToCompare; + aSizeToCompare = fabs(theZmax - theZmin); + if (aSizeToCompare > aSize) + aSize = aSizeToCompare; + + return aSize; +} + +bool PartSet_PreviewSketchPlane::getDefaultSizeOfView( + const CompositeFeaturePtr& theSketch, double& theSizeOfView, + std::shared_ptr& theCentralPnt) +{ + if (!PartSet_Tools::sketchPlane(theSketch).get()) + return false; + + 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()) + return false; + + Bnd_Box aBox; + int aNumberOfSubs = theSketch->numberOfSubs(); + for (int aSubFeatureId = 0; aSubFeatureId < aNumberOfSubs; aSubFeatureId++) { + FeaturePtr aFeature = theSketch->subFeature(aSubFeatureId); + if (!aFeature.get()) + continue; + + std::list aResults = aFeature->results(); + std::list::const_iterator aResultIt; + for (aResultIt = aResults.begin(); aResultIt != aResults.end(); ++aResultIt) { + ResultPtr aResult = *aResultIt; + std::shared_ptr aShapePtr = aResult->shape(); + if (aShapePtr.get()) { + TopoDS_Shape aShape = aShapePtr->impl(); + if (aShape.IsNull()) + continue; + BRepBndLib::Add(aShape, aBox); + } + } + } + if (aBox.IsVoid()) + return 0; + + double aXmin, aXmax, anYmin, anYmax, aZmin, aZmax; + aBox.Get(aXmin, anYmin, aZmin, aXmax, anYmax, aZmax); + + theSizeOfView = maximumSize(aXmin, anYmin, aZmin, aXmax, anYmax, aZmax); + if (theSizeOfView > 0) { + gp_Pnt aCentre(aXmax-fabs(aXmax-aXmin)/2., anYmax-fabs(anYmax-anYmin)/2., + aZmax - fabs(aZmax-aZmin)/2.); + theCentralPnt = std::shared_ptr(new GeomAPI_Pnt(aCentre.X(), aCentre.Y(), + aCentre.Z())); + } + return true; +} + +void PartSet_PreviewSketchPlane::setSizeOfView(double theSizeOfView, bool isUseSizeOfView, + const std::shared_ptr& theCentralPoint) { mySizeOfView = theSizeOfView; myIsUseSizeOfView = isUseSizeOfView; + + myViewCentralPoint = theCentralPoint; } AISObjectPtr PartSet_PreviewSketchPlane::createPreviewPlane() @@ -124,6 +206,7 @@ AISObjectPtr PartSet_PreviewSketchPlane::createPreviewPlane() int aDispMode = 1; // shading Handle(AIS_InteractiveObject) anAISIO = aAIS->impl(); if (!anAISIO.IsNull()) { + //anAISIO->SetInfiniteState(Standard_True); anAISIO->Attributes()->SetFaceBoundaryDraw( Standard_True ); anAISIO->SetDisplayMode(aDispMode); }