From 3131b97aa88736ac628428a8ceb025d9b7a8a965 Mon Sep 17 00:00:00 2001 From: David Osterberg Date: Sun, 28 Feb 2021 13:35:14 +0100 Subject: [PATCH] PartDesign: Transformed. Fix regression in preview --- src/Mod/PartDesign/App/FeatureTransformed.cpp | 21 ++++- src/Mod/PartDesign/App/FeatureTransformed.h | 10 +-- .../Gui/ViewProviderTransformed.cpp | 80 ++++++++----------- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index d241e767bf..1acf6193b2 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -296,7 +296,6 @@ App::DocumentObjectExecReturn *Transformed::execute(void) bool overlapping = false; std::vector::const_iterator t = transformations.begin(); - //++t; // Skip first transformation, which is always the identity transformation bool first = true; for (; t != transformations.end(); ++t) { // Make an explicit copy of the shape because the "true" parameter to BRepBuilderAPI_Transform @@ -372,6 +371,7 @@ App::DocumentObjectExecReturn *Transformed::execute(void) } this->Shape.setValue(getSolid(support)); // picking the first solid + rejected = getRemainingSolids(support); #ifndef FC_DEBUG Base::Console().Message("Transformed: Elapsed CPU time: %f s\n", (std::clock() - start0 ) / (double)(CLOCKS_PER_SEC)); @@ -454,4 +454,23 @@ void Transformed::divideTools(const std::vector &toolsIn, std::vec } } +TopoDS_Shape Transformed::getRemainingSolids(const TopoDS_Shape& shape) +{ + BRep_Builder builder; + TopoDS_Compound compShape; + builder.MakeCompound(compShape); + + if (shape.IsNull()) + Standard_Failure::Raise("Shape is null"); + TopExp_Explorer xp; + xp.Init(shape,TopAbs_SOLID); + xp.Next(); // skip the first + + for (; xp.More(); xp.Next()) { + builder.Add(compShape, xp.Current()); + } + + return compShape; +} + } diff --git a/src/Mod/PartDesign/App/FeatureTransformed.h b/src/Mod/PartDesign/App/FeatureTransformed.h index b3ab64bc77..e306871497 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.h +++ b/src/Mod/PartDesign/App/FeatureTransformed.h @@ -83,20 +83,18 @@ public: short mustExecute() const; //@} - /** returns a list of the transformations that where rejected during the last execute + /** returns the compound of the shapes that were rejected during the last execute * because they did not overlap with the support */ - typedef std::map > rejectedMap; - const rejectedMap getRejectedTransformations(void) { return rejected; } + TopoDS_Shape rejected; protected: void Restore(Base::XMLReader &reader); virtual void positionBySupport(void); TopoDS_Shape refineShapeIfActive(const TopoDS_Shape&) const; void divideTools(const std::vector &toolsIn, std::vector &individualsOut, - TopoDS_Compound &compoundOut) const; - - rejectedMap rejected; + TopoDS_Compound &compoundOut) const; + static TopoDS_Shape getRemainingSolids(const TopoDS_Shape&); private: static const char* OverlapEnums[]; diff --git a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp index 1f83738f16..0d402d0b71 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp @@ -157,10 +157,15 @@ void ViewProviderTransformed::recomputeFeature(bool recompute) PartDesign::Transformed* pcTransformed = static_cast(getObject()); if(recompute || (pcTransformed->isError() || pcTransformed->mustExecute())) pcTransformed->recomputeFeature(true); - const PartDesign::Transformed::rejectedMap &rejected_trsf = pcTransformed->getRejectedTransformations(); + unsigned rejected = 0; - for (PartDesign::Transformed::rejectedMap::const_iterator r = rejected_trsf.begin(); r != rejected_trsf.end(); r++) - rejected += r->second.size(); + TopoDS_Shape cShape = pcTransformed->rejected; + TopExp_Explorer xp; + xp.Init(cShape, TopAbs_SOLID); + for (; xp.More(); xp.Next()) { + rejected++; + } + QString msg = QString::fromLatin1("%1"); if (rejected > 0) { msg = QString::fromLatin1("%1
\r\n%2"); @@ -192,21 +197,9 @@ void ViewProviderTransformed::recomputeFeature(bool recompute) pcRejectedRoot ->removeChild(7); } - for (PartDesign::Transformed::rejectedMap::const_iterator o = rejected_trsf.begin(); o != rejected_trsf.end(); o++) { - if (o->second.empty()) continue; - - Part::TopoShape fuseShape; - Part::TopoShape cutShape; - if ((o->first)->getTypeId().isDerivedFrom(PartDesign::FeatureAddSub::getClassTypeId())) { - PartDesign::FeatureAddSub* feature = static_cast(o->first); - feature->getAddSubShape(fuseShape, cutShape); - } - - if (fuseShape.isNull()) continue; - - // Display the rejected transformations in red - TopoDS_Shape cShape(fuseShape.getShape()); + // Display the rejected transformations in red + if (rejected > 0) { try { // calculating the deflection value Standard_Real xMin, yMin, zMin, xMax, yMax, zMax; @@ -333,41 +326,34 @@ void ViewProviderTransformed::recomputeFeature(bool recompute) // counting up the per Face offsets FaceNodeOffset += nbNodesInFace; FaceTriaOffset += nbTriInFace; + + + // normalize all normals + for (int i=0; i < nbrNodes; i++) + norms[i].normalize(); + + // end the editing of the nodes + rejectedCoords ->point .finishEditing(); + rejectedNorms ->vector .finishEditing(); + rejectedFaceSet ->coordIndex .finishEditing(); + + // fill in the transformation matrices + SoMultipleCopy* rejectedTrfms = new SoMultipleCopy(); + + + rejectedTrfms->matrix.finishEditing(); + rejectedTrfms->addChild(rejectedFaceSet); + SoSeparator* sep = new SoSeparator(); + sep->addChild(rejectedCoords); + sep->addChild(rejectedNorms); + sep->addChild(rejectedTrfms); + pcRejectedRoot->addChild(sep); } - - // normalize all normals - for (int i=0; i < nbrNodes; i++) - norms[i].normalize(); - - // end the editing of the nodes - rejectedCoords ->point .finishEditing(); - rejectedNorms ->vector .finishEditing(); - rejectedFaceSet ->coordIndex .finishEditing(); - - // fill in the transformation matrices - SoMultipleCopy* rejectedTrfms = new SoMultipleCopy(); - rejectedTrfms->matrix.setNum((o->second).size()); - SbMatrix* mats = rejectedTrfms->matrix.startEditing(); - - std::list::const_iterator trsf = (o->second).begin(); - for (unsigned int i=0; i < (o->second).size(); i++,trsf++) { - Base::Matrix4D mat; - Part::TopoShape::convertToMatrix(*trsf,mat); - mats[i] = convert(mat); - } - rejectedTrfms->matrix.finishEditing(); - rejectedTrfms->addChild(rejectedFaceSet); - SoSeparator* sep = new SoSeparator(); - sep->addChild(rejectedCoords); - sep->addChild(rejectedNorms); - sep->addChild(rejectedTrfms); - pcRejectedRoot->addChild(sep); } catch (...) { Base::Console().Error("Cannot compute Inventor representation for the rejected transformations of shape of %s.\n", - pcTransformed->getNameInDocument()); + pcTransformed->getNameInDocument()); } } - }