diff --git a/src/Mod/PartDesign/App/FeatureMultiTransform.cpp b/src/Mod/PartDesign/App/FeatureMultiTransform.cpp index f4f8e05b2b..14cc57177b 100644 --- a/src/Mod/PartDesign/App/FeatureMultiTransform.cpp +++ b/src/Mod/PartDesign/App/FeatureMultiTransform.cpp @@ -52,10 +52,11 @@ void MultiTransform::positionBySupport() PartDesign::Transformed::positionBySupport(); std::vector transFeatures = Transformations.getValues(); for (auto f : transFeatures) { - if (!(f->isDerivedFrom())) { + auto transFeature = Base::freecad_dynamic_cast(f); + if (!transFeature) { throw Base::TypeError("Transformation features must be subclasses of Transformed"); } - PartDesign::Transformed* transFeature = static_cast(f); + transFeature->Placement.setValue(this->Placement.getValue()); // To avoid that a linked transform feature stays touched after a recompute @@ -95,22 +96,19 @@ MultiTransform::getTransformations(const std::vector origi std::list result; std::list cogs; - std::vector::const_iterator f; - for (f = transFeatures.begin(); f != transFeatures.end(); ++f) { - if (!((*f)->isDerivedFrom())) { + for (auto const& f : transFeatures) { + auto transFeature = Base::freecad_dynamic_cast(f); + if (!transFeature) { throw Base::TypeError("Transformation features must be subclasses of Transformed"); } - PartDesign::Transformed* transFeature = static_cast(*f); - std::list newTransformations = transFeature->getTransformations(originals); + std::list newTransformations = transFeature->getTransformations(originals); if (result.empty()) { // First transformation Feature result = newTransformations; - for (std::list::const_iterator nt = newTransformations.begin(); - nt != newTransformations.end(); - ++nt) { - cogs.push_back(cog.Transformed(*nt)); + for (auto nt : newTransformations) { + cogs.push_back(cog.Transformed(nt)); } } else { @@ -121,7 +119,7 @@ MultiTransform::getTransformations(const std::vector origi std::list oldCogs; cogs.swap(oldCogs); // empty cogs to receive new cogs - if ((*f)->is()) { + if (transFeature->is()) { // Diagonal method // Multiply every element in the old transformations' slices with the corresponding // element in the newTransformations. Example: @@ -141,15 +139,13 @@ MultiTransform::getTransformations(const std::vector origi } unsigned sliceLength = oldTransformations.size() / newTransformations.size(); - std::list::const_iterator ot = oldTransformations.begin(); - std::list::const_iterator oc = oldCogs.begin(); + auto ot = oldTransformations.begin(); + auto oc = oldCogs.begin(); - for (std::list::const_iterator nt = newTransformations.begin(); - nt != newTransformations.end(); - ++nt) { + for (auto const& nt : newTransformations) { for (unsigned s = 0; s < sliceLength; s++) { gp_Trsf trans; - double factor = nt->ScaleFactor(); // extract scale factor + double factor = nt.ScaleFactor(); // extract scale factor if (factor > Precision::Confusion()) { trans.SetScale(*oc, factor); // recreate the scaled transformation to @@ -158,8 +154,8 @@ MultiTransform::getTransformations(const std::vector origi cogs.push_back(*oc); // Scaling does not affect the COG } else { - trans = (*nt) * (*ot); - cogs.push_back(oc->Transformed(*nt)); + trans = nt * (*ot); + cogs.push_back(oc->Transformed(nt)); } result.push_back(trans); ++ot; @@ -174,16 +170,12 @@ MultiTransform::getTransformations(const std::vector origi // a11 a12 b1 a11*b1 a12*b1 a11*b2 a12*b2 a11*b3 a12*b3 // a21 a22 mul b2 = a21*b1 a22*b1 a21*b2 a22*b2 a21*b3 a22*b3 // b3 - for (std::list::const_iterator nt = newTransformations.begin(); - nt != newTransformations.end(); - ++nt) { - std::list::const_iterator oc = oldCogs.begin(); + for (auto const& nt : newTransformations) { + auto oc = oldCogs.begin(); - for (std::list::const_iterator ot = oldTransformations.begin(); - ot != oldTransformations.end(); - ++ot) { - result.push_back((*nt) * (*ot)); - cogs.push_back(oc->Transformed(*nt)); + for (auto const& ot : oldTransformations) { + result.push_back(nt * ot); + cogs.push_back(oc->Transformed(nt)); ++oc; } } diff --git a/src/Mod/PartDesign/App/FeatureScaled.cpp b/src/Mod/PartDesign/App/FeatureScaled.cpp index 7675eb12f0..a6a0b8fd7d 100644 --- a/src/Mod/PartDesign/App/FeatureScaled.cpp +++ b/src/Mod/PartDesign/App/FeatureScaled.cpp @@ -57,11 +57,11 @@ short Scaled::mustExecute() const const std::list Scaled::getTransformations(const std::vector originals) { - double factor = Factor.getValue(); + double const factor = Factor.getValue(); if (factor < Precision::Confusion()) { throw Base::ValueError("Scaling factor too small"); } - int occurrences = Occurrences.getValue(); + int const occurrences = Occurrences.getValue(); if (occurrences < 2) { throw Base::ValueError("At least two occurrences required"); } diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 004dddb995..619301fc5b 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -109,10 +109,8 @@ Part::Feature* Transformed::getBaseObject(bool silent) const // first App::DocumentObject* firstOriginal = originals.empty() ? nullptr : originals.front(); if (firstOriginal) { - if (firstOriginal->isDerivedFrom(Part::Feature::getClassTypeId())) { - rv = static_cast(firstOriginal); - } - else { + rv = Base::freecad_dynamic_cast(firstOriginal); + if (!rv) { err = QT_TRANSLATE_NOOP("Exception", "Transformation feature Linked object is not a Part object"); } @@ -131,30 +129,25 @@ Part::Feature* Transformed::getBaseObject(bool silent) const App::DocumentObject* Transformed::getSketchObject() const { std::vector originals = Originals.getValues(); - if (!originals.empty() && originals.front()->isDerivedFrom()) { - return (static_cast(originals.front()))->getVerifiedSketch(true); + DocumentObject const* firstOriginal = !originals.empty() ? originals.front() : nullptr; + + if (auto feature = Base::freecad_dynamic_cast(firstOriginal)) { + return feature->getVerifiedSketch(true); } - else if (!originals.empty() && originals.front()->isDerivedFrom()) { + if (Base::freecad_dynamic_cast(firstOriginal)) { return nullptr; } - else if (this->isDerivedFrom()) { - // if Originals is empty then try the linear pattern's Direction property - const LinearPattern* pattern = static_cast(this); + if (auto pattern = Base::freecad_dynamic_cast(this)) { return pattern->Direction.getValue(); } - else if (this->isDerivedFrom()) { - // if Originals is empty then try the polar pattern's Axis property - const PolarPattern* pattern = static_cast(this); + if (auto pattern = Base::freecad_dynamic_cast(this)) { return pattern->Axis.getValue(); } - else if (this->isDerivedFrom()) { - // if Originals is empty then try the mirror pattern's MirrorPlane property - const Mirrored* pattern = static_cast(this); + if (auto pattern = Base::freecad_dynamic_cast(this)) { return pattern->MirrorPlane.getValue(); } - else { - return nullptr; - } + + return nullptr; } void Transformed::Restore(Base::XMLReader& reader) @@ -185,13 +178,13 @@ void Transformed::handleChangedPropertyType(Base::XMLReader& reader, // The property 'Angle' of PolarPattern has changed from PropertyFloat // to PropertyAngle and the property 'Length' has changed to PropertyLength. Base::Type inputType = Base::Type::fromName(TypeName); - if (prop->isDerivedFrom() - && inputType.isDerivedFrom(App::PropertyFloat::getClassTypeId())) { + if (auto property = Base::freecad_dynamic_cast(prop); + property != nullptr && inputType.isDerivedFrom(App::PropertyFloat::getClassTypeId())) { // Do not directly call the property's Restore method in case the implementation // has changed. So, create a temporary PropertyFloat object and assign the value. App::PropertyFloat floatProp; floatProp.Restore(reader); - static_cast(prop)->setValue(floatProp.getValue()); + property->setValue(floatProp.getValue()); } else { PartDesign::Feature::handleChangedPropertyType(reader, TypeName, prop); @@ -260,7 +253,7 @@ App::DocumentObjectExecReturn* Transformed::execute() } // Get the support - Part::Feature* supportFeature; + Part::Feature* supportFeature = nullptr; try { supportFeature = getBaseObject(); @@ -287,7 +280,7 @@ App::DocumentObjectExecReturn* Transformed::execute() TopTools_ListOfShape shapeTools; std::vector shapes; - std::vector::const_iterator transformIter = transformations.begin(); + auto transformIter = transformations.cbegin(); // First transformation is skipped since it should not be part of the toolShape. ++transformIter; @@ -328,55 +321,52 @@ App::DocumentObjectExecReturn* Transformed::execute() Part::TopoShape fuseShape; Part::TopoShape cutShape; - if (original->isDerivedFrom()) { - PartDesign::FeatureAddSub* feature = - static_cast(original); - feature->getAddSubShape(fuseShape, cutShape); - if (fuseShape.isNull() && cutShape.isNull()) { - return new App::DocumentObjectExecReturn( - QT_TRANSLATE_NOOP("Exception", - "Shape of additive/subtractive feature is empty")); - } - gp_Trsf trsf = feature->getLocation().Transformation().Multiplied(trsfInv); -#ifdef FC_USE_TNP_FIX - if (!fuseShape.isNull()) { - fuseShape = fuseShape.makeElementTransform(trsf); - } - if (!cutShape.isNull()) { - cutShape = cutShape.makeElementTransform(trsf); - } -#else - if (!fuseShape.isNull()) { - fuseShape = fuseShape.makeTransform(trsf); - } - if (!cutShape.isNull()) { - cutShape = cutShape.makeTransform(trsf); - } - -#endif - } - else { + auto feature = Base::freecad_dynamic_cast(original); + if (!feature) { return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP( "Exception", "Only additive and subtractive features can be transformed")); } + feature->getAddSubShape(fuseShape, cutShape); + if (fuseShape.isNull() && cutShape.isNull()) { + return new App::DocumentObjectExecReturn( + QT_TRANSLATE_NOOP("Exception", + "Shape of additive/subtractive feature is empty")); + } + gp_Trsf trsf = feature->getLocation().Transformation().Multiplied(trsfInv); +#ifdef FC_USE_TNP_FIX + if (!fuseShape.isNull()) { + fuseShape = fuseShape.makeElementTransform(trsf); + } + if (!cutShape.isNull()) { + cutShape = cutShape.makeElementTransform(trsf); + } +#else + if (!fuseShape.isNull()) { + fuseShape = fuseShape.makeTransform(trsf); + } + if (!cutShape.isNull()) { + cutShape = cutShape.makeTransform(trsf); + } + +#endif + TopoDS_Shape current = support; if (!fuseShape.isNull()) { TopTools_ListOfShape shapeArguments; shapeArguments.Append(current); TopTools_ListOfShape shapeTools = getTransformedCompShape(fuseShape.getShape()); if (!shapeTools.IsEmpty()) { - std::unique_ptr mkBool( - new BRepAlgoAPI_Fuse()); - mkBool->SetArguments(shapeArguments); - mkBool->SetTools(shapeTools); - mkBool->Build(); - if (!mkBool->IsDone()) { + BRepAlgoAPI_Fuse mkBool; + mkBool.SetArguments(shapeArguments); + mkBool.SetTools(shapeTools); + mkBool.Build(); + if (!mkBool.IsDone()) { return new App::DocumentObjectExecReturn( QT_TRANSLATE_NOOP("Exception", "Boolean operation failed")); } - current = mkBool->Shape(); + current = mkBool.Shape(); } } if (!cutShape.isNull()) { @@ -384,15 +374,15 @@ App::DocumentObjectExecReturn* Transformed::execute() shapeArguments.Append(current); TopTools_ListOfShape shapeTools = getTransformedCompShape(cutShape.getShape()); if (!shapeTools.IsEmpty()) { - std::unique_ptr mkBool(new BRepAlgoAPI_Cut()); - mkBool->SetArguments(shapeArguments); - mkBool->SetTools(shapeTools); - mkBool->Build(); - if (!mkBool->IsDone()) { + BRepAlgoAPI_Cut mkBool; + mkBool.SetArguments(shapeArguments); + mkBool.SetTools(shapeTools); + mkBool.Build(); + if (!mkBool.IsDone()) { return new App::DocumentObjectExecReturn( QT_TRANSLATE_NOOP("Exception", "Boolean operation failed")); } - current = mkBool->Shape(); + current = mkBool.Shape(); } } @@ -404,15 +394,15 @@ App::DocumentObjectExecReturn* Transformed::execute() shapeArguments.Append(support); TopTools_ListOfShape shapeTools = getTransformedCompShape(support); if (!shapeTools.IsEmpty()) { - std::unique_ptr mkBool(new BRepAlgoAPI_Fuse()); - mkBool->SetArguments(shapeArguments); - mkBool->SetTools(shapeTools); - mkBool->Build(); - if (!mkBool->IsDone()) { + BRepAlgoAPI_Fuse mkBool; + mkBool.SetArguments(shapeArguments); + mkBool.SetTools(shapeTools); + mkBool.Build(); + if (!mkBool.IsDone()) { return new App::DocumentObjectExecReturn( QT_TRANSLATE_NOOP("Exception", "Boolean operation failed")); } - support = mkBool->Shape(); + support = mkBool.Shape(); } break; } @@ -449,9 +439,9 @@ TopoDS_Shape Transformed::refineShapeIfActive(const TopoDS_Shape& oldShape) cons return oldShape; } -void Transformed::divideTools(const std::vector& toolsIn, +void divideTools(const std::vector& toolsIn, std::vector& individualsOut, - TopoDS_Compound& compoundOut) const + TopoDS_Compound& compoundOut) { using ShapeBoundPair = std::pair; using PairList = std::list; @@ -459,8 +449,7 @@ void Transformed::divideTools(const std::vector& toolsIn, PairList pairList; - std::vector::const_iterator it; - for (it = toolsIn.begin(); it != toolsIn.end(); ++it) { + for (auto it = toolsIn.begin(); it != toolsIn.end(); ++it) { Bnd_Box bound; BRepBndLib::Add(*it, bound); bound.SetGap(0.0); @@ -475,11 +464,10 @@ void Transformed::divideTools(const std::vector& toolsIn, PairVector currentGroup; currentGroup.push_back(pairList.front()); pairList.pop_front(); - PairList::iterator it = pairList.begin(); + auto it = pairList.begin(); while (it != pairList.end()) { - PairVector::const_iterator groupIt; bool found(false); - for (groupIt = currentGroup.begin(); groupIt != currentGroup.end(); ++groupIt) { + for (auto groupIt = currentGroup.begin(); groupIt != currentGroup.end(); ++groupIt) { if (!(*it).second.IsOut((*groupIt).second)) { // touching means is out. found = true; break; @@ -498,8 +486,7 @@ void Transformed::divideTools(const std::vector& toolsIn, builder.Add(compoundOut, currentGroup.front().first); } else { - PairVector::const_iterator groupIt; - for (groupIt = currentGroup.begin(); groupIt != currentGroup.end(); ++groupIt) { + for (auto groupIt = currentGroup.cbegin(); groupIt != currentGroup.end(); ++groupIt) { individualsOut.push_back((*groupIt).first); } } @@ -523,7 +510,7 @@ TopoDS_Shape Transformed::getRemainingSolids(const TopoDS_Shape& shape) builder.Add(compShape, xp.Current()); } - return TopoDS_Shape(std::move(compShape)); + return {std::move(compShape)}; } } // namespace PartDesign