From 2c6aa4990ab6d15a00a94e51ebb7cd0547cc0ed8 Mon Sep 17 00:00:00 2001 From: vsv Date: Thu, 28 May 2020 12:28:36 +0300 Subject: [PATCH] bos #19197 + issue #3245: Set size of sketch plane without modification of selection attribute --- src/PartSet/PartSet_PreviewSketchPlane.cpp | 15 +++ src/PartSet/PartSet_WidgetSketchLabel.cpp | 120 +++++++++------------ 2 files changed, 66 insertions(+), 69 deletions(-) diff --git a/src/PartSet/PartSet_PreviewSketchPlane.cpp b/src/PartSet/PartSet_PreviewSketchPlane.cpp index 9d7164d22..83529e238 100644 --- a/src/PartSet/PartSet_PreviewSketchPlane.cpp +++ b/src/PartSet/PartSet_PreviewSketchPlane.cpp @@ -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 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 : anOrigPnt, aNormDir, mySizeOfView); + } + } myPlane = createPreviewPlane(); aDisp->displayAIS(myPlane, false/*load object in selection*/, 1/*shaded*/, false); diff --git a/src/PartSet/PartSet_WidgetSketchLabel.cpp b/src/PartSet/PartSet_WidgetSketchLabel.cpp index 234a7699d..9365adc57 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.cpp +++ b/src/PartSet/PartSet_WidgetSketchLabel.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -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(myWorkshop->module()); if (aModule) { CompositeFeaturePtr aSketch = std::dynamic_pointer_cast(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 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(thePrs->object()); - if (aConstruction.get()) - aShape = aConstruction->shape(); - } - } - } - if (aShape.get() && !aShape->isNull()) { const TopoDS_Shape& aTDShape = aShape->impl(); 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 - (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); - if (aSelAttr.get()) { - ResultPtr aRes = std::dynamic_pointer_cast(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(); - 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 + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (aSelAttr.get()) { + ResultPtr aRes = std::dynamic_pointer_cast(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(); - setSketchPlane(aTDShape); - isOwnerSet = true; - } + else { // selection happens in OB browser + aShapePtr = aShape; + } + if (aShapePtr.get() && aShapePtr->isFace()) { + const TopoDS_Shape& aTDShape = aShapePtr->impl(); + 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(); + setSketchPlane(aTDShape); + isOwnerSet = true; } } } -- 2.39.2