From b51e83f2522767c5158f206c68736aefe33d455a Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Sun, 19 Jan 2025 01:48:28 +0100 Subject: [PATCH 01/11] Base: Add missing const to Type::createInstance --- src/Base/Type.cpp | 2 +- src/Base/Type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Base/Type.cpp b/src/Base/Type.cpp index 51b2128c1e..27de8a5b98 100644 --- a/src/Base/Type.cpp +++ b/src/Base/Type.cpp @@ -59,7 +59,7 @@ map Type::typemap; vector Type::typedata; set Type::loadModuleSet; -void* Type::createInstance() +void* Type::createInstance() const { instantiationMethod method = typedata[index]->instMethod; return method ? (*method)() : nullptr; diff --git a/src/Base/Type.h b/src/Base/Type.h index 3f580724e2..fad31905db 100644 --- a/src/Base/Type.h +++ b/src/Base/Type.h @@ -88,7 +88,7 @@ public: ~Type() = default; /// creates a instance of this type - void* createInstance(); + void* createInstance() const; /// Checks whether this type can instantiate bool canInstantiate() const; /// creates a instance of the named type From 37f94b7b46165a88a53c9f17a708fcff85a260cf Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Fri, 24 Jan 2025 18:50:25 +0100 Subject: [PATCH 02/11] App: Fix _class_ passing in PROPERTY_HEADER_WITH_EXTENSIONS --- src/App/ExtensionContainer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/ExtensionContainer.h b/src/App/ExtensionContainer.h index 0910125ca9..7972ba4975 100644 --- a/src/App/ExtensionContainer.h +++ b/src/App/ExtensionContainer.h @@ -239,7 +239,7 @@ private: std::map _extensions; }; -#define PROPERTY_HEADER_WITH_EXTENSIONS(_class_) PROPERTY_HEADER_WITH_OVERRIDE(_class) +#define PROPERTY_HEADER_WITH_EXTENSIONS(_class_) PROPERTY_HEADER_WITH_OVERRIDE(_class_) /// We make sure that the PropertyData of the container is not connected to the one of the extension #define PROPERTY_SOURCE_WITH_EXTENSIONS(_class_, _parentclass_) \ From f1ab1ee0ad692eb542ac67f16bc029da090d7ae5 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Mon, 27 Jan 2025 15:58:37 +0100 Subject: [PATCH 03/11] Mod: Fix mistakes in type system class names --- src/Mod/Fem/Gui/ViewProviderFemPostFunction.h | 2 +- src/Mod/Fem/Gui/ViewProviderSetElements.h | 2 +- src/Mod/Fem/Gui/ViewProviderSetFaces.h | 2 +- src/Mod/Fem/Gui/ViewProviderSetGeometry.h | 2 +- src/Mod/Measure/Gui/ViewProviderMeasureBase.h | 2 +- src/Mod/Part/App/CustomFeature.h | 2 +- src/Mod/Part/App/FeaturePartCurveNet.h | 2 +- src/Mod/Part/App/FeaturePartImportIges.h | 2 +- src/Mod/Part/App/FeaturePartImportStep.h | 2 +- src/Mod/Part/App/FeatureProjectOnSurface.h | 2 +- src/Mod/PartDesign/App/FeatureSketchBased.h | 2 +- src/Mod/PartDesign/App/FeatureSolid.h | 2 +- src/Mod/TechDraw/App/DrawComplexSection.h | 2 +- src/Mod/TechDraw/App/DrawViewDetail.h | 2 +- src/Mod/TechDraw/App/DrawViewMulti.h | 2 +- src/Mod/TechDraw/App/DrawViewSection.h | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h index 87b3e9c7e0..f349a256e9 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h @@ -95,7 +95,7 @@ private: class FemGuiExport ViewProviderFemPostFunctionProvider: public Gui::ViewProviderDocumentObject { - PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderFemPostFunction); + PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderFemPostFunctionProvider); public: ViewProviderFemPostFunctionProvider(); diff --git a/src/Mod/Fem/Gui/ViewProviderSetElements.h b/src/Mod/Fem/Gui/ViewProviderSetElements.h index ef9f003537..98a95bf70c 100644 --- a/src/Mod/Fem/Gui/ViewProviderSetElements.h +++ b/src/Mod/Fem/Gui/ViewProviderSetElements.h @@ -31,7 +31,7 @@ namespace FemGui class ViewProviderSetElements: public Gui::ViewProviderGeometryObject { - PROPERTY_HEADER_WITH_OVERRIDE(RobotGui::ViewProviderSetElements); + PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderSetElements); public: bool doubleClicked() override; diff --git a/src/Mod/Fem/Gui/ViewProviderSetFaces.h b/src/Mod/Fem/Gui/ViewProviderSetFaces.h index 0c658ce13f..4987020563 100644 --- a/src/Mod/Fem/Gui/ViewProviderSetFaces.h +++ b/src/Mod/Fem/Gui/ViewProviderSetFaces.h @@ -31,7 +31,7 @@ namespace FemGui class ViewProviderSetFaces: public Gui::ViewProviderGeometryObject { - PROPERTY_HEADER_WITH_OVERRIDE(RobotGui::ViewProviderSetFaces); + PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderSetFaces); public: bool doubleClicked() override; diff --git a/src/Mod/Fem/Gui/ViewProviderSetGeometry.h b/src/Mod/Fem/Gui/ViewProviderSetGeometry.h index ed731cc1d9..8788448be9 100644 --- a/src/Mod/Fem/Gui/ViewProviderSetGeometry.h +++ b/src/Mod/Fem/Gui/ViewProviderSetGeometry.h @@ -31,7 +31,7 @@ namespace FemGui class ViewProviderSetGeometry: public Gui::ViewProviderGeometryObject { - PROPERTY_HEADER_WITH_OVERRIDE(RobotGui::ViewProviderSetGeometry); + PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderSetGeometry); public: bool doubleClicked() override; diff --git a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h index 32ecc60e0b..5d919c7355 100644 --- a/src/Mod/Measure/Gui/ViewProviderMeasureBase.h +++ b/src/Mod/Measure/Gui/ViewProviderMeasureBase.h @@ -72,7 +72,7 @@ public: // NOLINTBEGIN class MeasureGuiExport ViewProviderMeasureBase: public Gui::ViewProviderDocumentObject { - PROPERTY_HEADER_WITH_OVERRIDE(ViewProviderMeasureBase); + PROPERTY_HEADER_WITH_OVERRIDE(MeasureGui::ViewProviderMeasureBase); public: /// constructor. diff --git a/src/Mod/Part/App/CustomFeature.h b/src/Mod/Part/App/CustomFeature.h index 7a4e34ad9f..f76bf7a388 100644 --- a/src/Mod/Part/App/CustomFeature.h +++ b/src/Mod/Part/App/CustomFeature.h @@ -34,7 +34,7 @@ namespace Part */ class PartExport CustomFeature : public Part::Feature { - PROPERTY_HEADER_WITH_OVERRIDE(Part::UserFeature); + PROPERTY_HEADER_WITH_OVERRIDE(Part::CustomFeature); public: /// Constructor diff --git a/src/Mod/Part/App/FeaturePartCurveNet.h b/src/Mod/Part/App/FeaturePartCurveNet.h index b1b84608fe..3283d3b3c9 100644 --- a/src/Mod/Part/App/FeaturePartCurveNet.h +++ b/src/Mod/Part/App/FeaturePartCurveNet.h @@ -31,7 +31,7 @@ namespace Part class CurveNet :public Part::Feature { - PROPERTY_HEADER_WITH_OVERRIDE(Part::FeaturePartCurveNet); + PROPERTY_HEADER_WITH_OVERRIDE(Part::CurveNet); public: CurveNet(); diff --git a/src/Mod/Part/App/FeaturePartImportIges.h b/src/Mod/Part/App/FeaturePartImportIges.h index db0b3fff92..6ed4470385 100644 --- a/src/Mod/Part/App/FeaturePartImportIges.h +++ b/src/Mod/Part/App/FeaturePartImportIges.h @@ -31,7 +31,7 @@ namespace Part class ImportIges :public Part::Feature { - PROPERTY_HEADER_WITH_OVERRIDE(Part::FeaturePartImportIges); + PROPERTY_HEADER_WITH_OVERRIDE(Part::ImportIges); public: ImportIges(); diff --git a/src/Mod/Part/App/FeaturePartImportStep.h b/src/Mod/Part/App/FeaturePartImportStep.h index 4b0475b5f4..bfbdf65c18 100644 --- a/src/Mod/Part/App/FeaturePartImportStep.h +++ b/src/Mod/Part/App/FeaturePartImportStep.h @@ -33,7 +33,7 @@ namespace Part class ImportStep :public Part::Feature { - PROPERTY_HEADER_WITH_OVERRIDE(Part::FeaturePartImportStep); + PROPERTY_HEADER_WITH_OVERRIDE(Part::ImportStep); public: ImportStep(); diff --git a/src/Mod/Part/App/FeatureProjectOnSurface.h b/src/Mod/Part/App/FeatureProjectOnSurface.h index a48f80dd99..a8bafb0433 100644 --- a/src/Mod/Part/App/FeatureProjectOnSurface.h +++ b/src/Mod/Part/App/FeatureProjectOnSurface.h @@ -35,7 +35,7 @@ namespace Part class PartExport ProjectOnSurface : public Part::Feature { - PROPERTY_HEADER_WITH_OVERRIDE(ProjectOnSurface); + PROPERTY_HEADER_WITH_OVERRIDE(Part::ProjectOnSurface); public: ProjectOnSurface(); diff --git a/src/Mod/PartDesign/App/FeatureSketchBased.h b/src/Mod/PartDesign/App/FeatureSketchBased.h index dfeba5a349..08be8a10ef 100644 --- a/src/Mod/PartDesign/App/FeatureSketchBased.h +++ b/src/Mod/PartDesign/App/FeatureSketchBased.h @@ -38,7 +38,7 @@ namespace PartDesign class PartDesignExport ProfileBased : public PartDesign::FeatureAddSub { - PROPERTY_HEADER_WITH_OVERRIDE(PartDesign::SketchBased); + PROPERTY_HEADER_WITH_OVERRIDE(PartDesign::ProfileBased); public: enum class ForbiddenAxis { diff --git a/src/Mod/PartDesign/App/FeatureSolid.h b/src/Mod/PartDesign/App/FeatureSolid.h index f5abf36392..41ceacd520 100644 --- a/src/Mod/PartDesign/App/FeatureSolid.h +++ b/src/Mod/PartDesign/App/FeatureSolid.h @@ -37,7 +37,7 @@ namespace PartDesign */ class PartDesignExport Solid : public Feature { - PROPERTY_HEADER_WITH_OVERRIDE(PartDesign::FeatureSolid); + PROPERTY_HEADER_WITH_OVERRIDE(PartDesign::Solid); public: Solid(); diff --git a/src/Mod/TechDraw/App/DrawComplexSection.h b/src/Mod/TechDraw/App/DrawComplexSection.h index 96ff8f81c1..b1de8c0f38 100644 --- a/src/Mod/TechDraw/App/DrawComplexSection.h +++ b/src/Mod/TechDraw/App/DrawComplexSection.h @@ -37,7 +37,7 @@ namespace TechDraw class TechDrawExport DrawComplexSection: public DrawViewSection { - PROPERTY_HEADER_WITH_OVERRIDE(Part::DrawComplexSection); + PROPERTY_HEADER_WITH_OVERRIDE(TechDraw::DrawComplexSection); public: DrawComplexSection(); diff --git a/src/Mod/TechDraw/App/DrawViewDetail.h b/src/Mod/TechDraw/App/DrawViewDetail.h index e901a5306f..70375b6f56 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.h +++ b/src/Mod/TechDraw/App/DrawViewDetail.h @@ -49,7 +49,7 @@ namespace TechDraw class TechDrawExport DrawViewDetail : public DrawViewPart { - PROPERTY_HEADER_WITH_OVERRIDE(Part::DrawViewDetail); + PROPERTY_HEADER_WITH_OVERRIDE(TechDraw::DrawViewDetail); public: /// Constructor diff --git a/src/Mod/TechDraw/App/DrawViewMulti.h b/src/Mod/TechDraw/App/DrawViewMulti.h index 739df4092c..aec80171f8 100644 --- a/src/Mod/TechDraw/App/DrawViewMulti.h +++ b/src/Mod/TechDraw/App/DrawViewMulti.h @@ -51,7 +51,7 @@ namespace TechDraw */ class TechDrawExport DrawViewMulti : public DrawViewPart { - PROPERTY_HEADER_WITH_OVERRIDE(Part::DrawViewMulti); + PROPERTY_HEADER_WITH_OVERRIDE(TechDraw::DrawViewMulti); public: /// Constructor diff --git a/src/Mod/TechDraw/App/DrawViewSection.h b/src/Mod/TechDraw/App/DrawViewSection.h index dbc1b320f0..95a0919d93 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.h +++ b/src/Mod/TechDraw/App/DrawViewSection.h @@ -77,7 +77,7 @@ using ChangePointVector = std::vector; class TechDrawExport DrawViewSection: public DrawViewPart { - PROPERTY_HEADER_WITH_OVERRIDE(Part::DrawViewSection); + PROPERTY_HEADER_WITH_OVERRIDE(TechDraw::DrawViewSection); public: DrawViewSection(); From ffe33a2c61526af2be75a8677affc35cf6c7e517 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Mon, 27 Jan 2025 16:03:23 +0100 Subject: [PATCH 04/11] App: Add compile time checks for type system class name Ensures: * _class_ is based on BaseClass * _class_ parameter includes a namespace And when _class_ is a document object * namespace is not global namespace * namespace name is in path after /src/ or /src/Mod/ The document object requirements are needed to auto import modules when using addObject --- src/App/PropertyContainer.h | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/App/PropertyContainer.h b/src/App/PropertyContainer.h index 819e4d8c1f..5a6b7647ae 100644 --- a/src/App/PropertyContainer.h +++ b/src/App/PropertyContainer.h @@ -305,6 +305,49 @@ private: \ /// Like PROPERTY_HEADER, but with overridden methods declared as such #define PROPERTY_HEADER_WITH_OVERRIDE(_class_) \ TYPESYSTEM_HEADER_WITH_OVERRIDE(); \ +public: \ + static constexpr const char* getClassName() {\ + /* + TODO: When c++20 is available \ + - Use consteval to ensure the function is evaluated at compile time \ + - Move bulk of the function to a template `validate()` \ + - Use `starts_with` when checking namespace in path \ + */ \ + \ + static_assert(sizeof(_class_) > 0, "Class is not complete"); \ + \ + constexpr const char* sClass = #_class_; \ + constexpr std::string_view vClass {sClass}; \ + static_assert(vClass[0] != '\0', "Class name must not be empty"); \ + static_assert(std::is_base_of::value, \ + "Class must be derived from App::PropertyContainer"); \ + \ + constexpr bool isSubClassOfDocObj = std::is_base_of::value && \ + !std::is_same::value; \ + if constexpr (isSubClassOfDocObj) { \ + constexpr auto pos = vClass.find("::"); \ + static_assert(pos != std::string_view::npos, \ + "Class name must be fully qualified for document object derived classes"); \ + static_assert(pos != 0, "Namespace must not be empty"); \ + \ + constexpr auto vNamespace = vClass.substr(0, pos); \ + constexpr std::string_view filePath = __FILE__; \ + constexpr auto posAfterSrcMod = filePath.find("/src/Mod/"); \ + if constexpr (constexpr bool hasSrcModInPath = posAfterSrcMod != std::string_view::npos) { \ + constexpr auto pathAfterSrcMod = filePath.substr(posAfterSrcMod + 9); \ + /* some workarounds are needed, if CI is ok in the future, remove these: \ + - isSubClassOfDocObj shouldn't be needed, but it is for some compilers \ + - allowing `Path` until it's been properly renamed */ \ + constexpr bool workarounds = !isSubClassOfDocObj || vNamespace == "Path"; \ + /* TODO: use `starts_with` instead of `find` when c++20 is available */ \ + constexpr bool isPathOk = pathAfterSrcMod.find(vNamespace) != std::string_view::npos; \ + static_assert(workarounds || isPathOk, \ + "Classes in `src/Mod` needs to be in a directory with the same name as" \ + " the namespace in order to load correctly"); \ + } \ + } \ + return sClass; \ + } \ protected: \ static const App::PropertyData * getPropertyDataPtr(void); \ const App::PropertyData &getPropertyData(void) const override; \ From a3703098f832028b8fbc764410750c834502ea78 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Tue, 21 Jan 2025 11:49:51 +0100 Subject: [PATCH 05/11] Base: Minor code cleanup in Type --- src/Base/Type.cpp | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/Base/Type.cpp b/src/Base/Type.cpp index 27de8a5b98..f12c041aaf 100644 --- a/src/Base/Type.cpp +++ b/src/Base/Type.cpp @@ -90,30 +90,33 @@ void* Type::createInstanceByName(const char* TypeName, bool bLoadModule) void Type::importModule(const char* TypeName) { // cut out the module name - string Mod = getModuleName(TypeName); + const string mod = getModuleName(TypeName); + // ignore base modules - if (Mod != "App" && Mod != "Gui" && Mod != "Base") { - // remember already loaded modules - set::const_iterator pos = loadModuleSet.find(Mod); - if (pos == loadModuleSet.end()) { - Interpreter().loadModule(Mod.c_str()); -#ifdef FC_LOGLOADMODULE - Console().Log("Act: Module %s loaded through class %s \n", Mod.c_str(), TypeName); -#endif - loadModuleSet.insert(Mod); - } + if (mod == "App" || mod == "Gui" || mod == "Base") { + return; } + + // remember already loaded modules + const auto pos = loadModuleSet.find(mod); + if (pos != loadModuleSet.end()) { + return; + } + + // lets load the module + Interpreter().loadModule(mod.c_str()); +#ifdef FC_LOGLOADMODULE + Console().Log("Act: Module %s loaded through class %s \n", Mod.c_str(), TypeName); +#endif + loadModuleSet.insert(mod); } string Type::getModuleName(const char* ClassName) { - string temp(ClassName); - std::string::size_type pos = temp.find_first_of("::"); + string_view classNameView(ClassName); + auto pos = classNameView.find("::"); - if (pos != std::string::npos) { - return {temp, 0, pos}; - } - return {}; + return pos != string_view::npos ? string(classNameView.substr(0, pos)) : string(); } Type Type::badType() From 6d28a19a3e0f7a000d8cb037b14b3b6b877a8886 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Sun, 19 Jan 2025 01:46:46 +0100 Subject: [PATCH 06/11] App: Add Document::addObject(...) to simplify code --- src/App/Document.cpp | 16 ++++------------ src/App/Document.h | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/App/Document.cpp b/src/App/Document.cpp index 5a074d2a44..9b583183c0 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -3544,7 +3544,7 @@ DocumentObject* Document::addObject(const char* sType, const char* viewType, bool isPartial) { - Base::Type type = + const Base::Type type = Base::Type::getTypeIfDerivedFrom(sType, App::DocumentObject::getClassTypeId(), true); if (type.isBad()) { std::stringstream str; @@ -3557,8 +3557,7 @@ DocumentObject* Document::addObject(const char* sType, return nullptr; } - App::DocumentObject* pcObject = static_cast(typeInstance); - + auto* pcObject = static_cast(typeInstance); pcObject->setDocument(this); // do no transactions if we do a rollback! @@ -3571,15 +3570,8 @@ DocumentObject* Document::addObject(const char* sType, } // get Unique name - string ObjectName; - - if (pObjectName && pObjectName[0] != '\0') { - ObjectName = getUniqueObjectName(pObjectName); - } - else { - ObjectName = getUniqueObjectName(sType); - } - + const bool hasName = pObjectName && pObjectName[0] != '\0'; + const string ObjectName = getUniqueObjectName(hasName ? pObjectName : type.getName()); d->activeObject = pcObject; diff --git a/src/App/Document.h b/src/App/Document.h index b13b206bd0..cdabf8efce 100644 --- a/src/App/Document.h +++ b/src/App/Document.h @@ -268,6 +268,21 @@ public: bool isNew = true, const char* viewType = nullptr, bool isPartial = false); + //@{ + /** Add a feature of T type with sName (ASCII) to this document and set it active. + * Unicode names are set through the Label property. + * @param pObjectName if nonNULL use that name otherwise generate a new unique name based on the + * \a sType + * @param isNew if false don't call the \c DocumentObject::setupObject() callback (default + * is true) + * @param viewType override object's view provider name + * @param isPartial indicate if this object is meant to be partially loaded + */ + template + T* addObject(const char* pObjectName = nullptr, + bool isNew = true, + const char* viewType = nullptr, + bool isPartial = false); /** Add an array of features of the given types and names. * Unicode names are set through the Label property. * @param sType The type of created object @@ -662,6 +677,12 @@ inline int Document::countObjectsOfType() const return this->countObjectsOfType(T::getClassTypeId()); } +template +T* Document::addObject(const char* pObjectName, bool isNew, const char* viewType, bool isPartial) +{ + static_assert(std::is_base_of::value, "T must be derived from DocumentObject"); + return static_cast(addObject(T::getClassName(), pObjectName, isNew, viewType, isPartial)); +} } // namespace App From 265b58c034c0d884ccc487f1cda80b52ff15827a Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Sun, 19 Jan 2025 01:49:04 +0100 Subject: [PATCH 07/11] Mod: Use new addObject(...) using regex --- src/Gui/CommandLink.cpp | 2 +- src/Mod/CAM/App/Area.cpp | 3 +-- src/Mod/Drawing/Gui/TaskOrthoViews.cpp | 3 +-- src/Mod/Fem/App/AppFemPy.cpp | 9 +++---- src/Mod/Import/App/ImportOCAF.cpp | 10 +++---- src/Mod/Import/App/ImportOCAF2.cpp | 20 ++++++-------- src/Mod/Import/App/ImportOCAFAssembly.cpp | 2 +- src/Mod/Import/App/dxf/ImpExpDxf.cpp | 3 +-- src/Mod/Mesh/App/AppMeshPy.cpp | 3 +-- src/Mod/Mesh/App/Importer.cpp | 3 +-- src/Mod/Mesh/Gui/Command.cpp | 9 +++---- src/Mod/Mesh/Gui/ViewProvider.cpp | 2 +- src/Mod/Mesh/Gui/ViewProviderCurvature.cpp | 3 +-- src/Mod/MeshPart/Gui/Command.cpp | 2 +- src/Mod/MeshPart/Gui/CrossSections.cpp | 3 +-- src/Mod/MeshPart/Gui/CurveOnMesh.cpp | 5 ++-- src/Mod/MeshPart/Gui/Tessellation.cpp | 2 +- src/Mod/Part/App/AppPartPy.cpp | 2 +- src/Mod/Part/App/ImportIges.cpp | 7 +++-- src/Mod/Part/App/ImportStep.cpp | 4 +-- src/Mod/Part/App/PartFeature.cpp | 2 +- src/Mod/Part/Gui/CrossSections.cpp | 3 +-- src/Mod/Part/Gui/DlgProjectionOnSurface.cpp | 3 +-- src/Mod/Part/Gui/SectionCutting.cpp | 6 ++--- src/Mod/PartDesign/App/Body.cpp | 2 +- src/Mod/Points/App/AppPointsPy.cpp | 3 +-- src/Mod/Points/Gui/Command.cpp | 6 ++--- src/Mod/ReverseEngineering/Gui/Command.cpp | 6 ++--- src/Mod/Sandbox/App/DocumentThread.cpp | 2 +- src/Mod/Sandbox/Gui/Command.cpp | 8 +++--- src/Mod/TechDraw/Gui/Command.cpp | 12 +++------ src/Mod/TechDraw/Gui/TaskWeldingSymbol.cpp | 2 +- tests/src/Mod/Assembly/App/AssemblyObject.cpp | 3 +-- tests/src/Mod/Measure/App/MeasureDistance.cpp | 7 +++-- tests/src/Mod/Mesh/App/Exporter.cpp | 6 ++--- tests/src/Mod/Part/App/AttachExtension.cpp | 8 +++--- tests/src/Mod/Part/App/FeatureChamfer.cpp | 4 +-- tests/src/Mod/Part/App/FeatureCompound.cpp | 2 +- tests/src/Mod/Part/App/FeatureExtrusion.cpp | 6 ++--- tests/src/Mod/Part/App/FeatureFillet.cpp | 4 +-- tests/src/Mod/Part/App/FeatureMirroring.cpp | 4 +-- tests/src/Mod/Part/App/FeatureOffset.cpp | 8 +++--- tests/src/Mod/Part/App/FeaturePartBoolean.cpp | 2 +- tests/src/Mod/Part/App/FeaturePartCommon.cpp | 2 +- tests/src/Mod/Part/App/FeaturePartCut.cpp | 2 +- tests/src/Mod/Part/App/FeaturePartFuse.cpp | 8 +++--- tests/src/Mod/Part/App/FeatureRevolution.cpp | 4 +-- tests/src/Mod/Part/App/FuzzyBoolean.cpp | 6 ++--- tests/src/Mod/Part/App/PartFeature.cpp | 2 +- tests/src/Mod/Part/App/PartFeatures.cpp | 26 +++++++++---------- tests/src/Mod/Part/App/PartTestHelpers.cpp | 2 +- tests/src/Mod/Part/App/PropertyTopoShape.cpp | 2 +- .../Part/App/TopoShapeMakeElementRefine.cpp | 2 +- tests/src/Mod/PartDesign/App/DatumPlane.cpp | 4 +-- tests/src/Mod/PartDesign/App/Pad.cpp | 7 +++-- tests/src/Mod/PartDesign/App/ShapeBinder.cpp | 10 +++---- tests/src/Mod/Sketcher/App/SketchObject.cpp | 1 + 57 files changed, 125 insertions(+), 159 deletions(-) diff --git a/src/Gui/CommandLink.cpp b/src/Gui/CommandLink.cpp index 875f5b093b..eddb113e8a 100644 --- a/src/Gui/CommandLink.cpp +++ b/src/Gui/CommandLink.cpp @@ -413,7 +413,7 @@ static void linkConvert(bool unlink) { continue; }else{ auto name = doc->getUniqueObjectName("Link"); - auto link = static_cast(doc->addObject("App::Link",name.c_str())); + auto link = doc->addObject(name.c_str()); if(!link) FC_THROWM(Base::RuntimeError,"Failed to create link"); link->setLink(-1,obj); diff --git a/src/Mod/CAM/App/Area.cpp b/src/Mod/CAM/App/Area.cpp index bb1969a63f..46c53279e4 100644 --- a/src/Mod/CAM/App/Area.cpp +++ b/src/Mod/CAM/App/Area.cpp @@ -1452,8 +1452,7 @@ void Area::showShape(const TopoDS_Shape& shape, const char* name, const char* fm va_end(args); name = buf; } - Part::Feature* pcFeature = - static_cast(pcDoc->addObject("Part::Feature", name)); + Part::Feature* pcFeature = pcDoc->addObject(name); pcFeature->Shape.setValue(shape); } } diff --git a/src/Mod/Drawing/Gui/TaskOrthoViews.cpp b/src/Mod/Drawing/Gui/TaskOrthoViews.cpp index 140ffc4218..98d8a2897f 100644 --- a/src/Mod/Drawing/Gui/TaskOrthoViews.cpp +++ b/src/Mod/Drawing/Gui/TaskOrthoViews.cpp @@ -150,8 +150,7 @@ orthoview::orthoview(App::Document* parent, cy = partbox->GetCenter().y; cz = partbox->GetCenter().z; - this_view = static_cast( - parent_doc->addObject("Drawing::FeatureViewPart", myname.c_str())); + this_view = parent_doc->addObject(myname.c_str()); static_cast(page)->addObject(this_view); this_view->Source.setValue(part); diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index 37da55d573..232fe7a62d 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -123,8 +123,7 @@ private: Base::FileInfo file(EncodedName.c_str()); // create new document and add Import feature App::Document* pcDoc = App::GetApplication().newDocument(); - FemMeshObject* pcFeature = static_cast( - pcDoc->addObject("Fem::FemMeshObject", file.fileNamePure().c_str())); + FemMeshObject* pcFeature = pcDoc->addObject(file.fileNamePure().c_str()); pcFeature->Label.setValue(file.fileNamePure().c_str()); pcFeature->FemMesh.setValuePtr(mesh.release()); pcFeature->purgeTouched(); @@ -160,8 +159,7 @@ private: std::unique_ptr mesh(new FemMesh); mesh->read(EncodedName.c_str()); - FemMeshObject* pcFeature = static_cast( - pcDoc->addObject("Fem::FemMeshObject", file.fileNamePure().c_str())); + FemMeshObject* pcFeature = pcDoc->addObject(file.fileNamePure().c_str()); pcFeature->Label.setValue(file.fileNamePure().c_str()); pcFeature->FemMesh.setValuePtr(mesh.release()); pcFeature->purgeTouched(); @@ -321,8 +319,7 @@ private: } FemMeshPy* pShape = static_cast(pcObj); - Fem::FemMeshObject* pcFeature = - static_cast(pcDoc->addObject("Fem::FemMeshObject", name)); + Fem::FemMeshObject* pcFeature = pcDoc->addObject(name); // copy the data pcFeature->FemMesh.setValue(*(pShape->getFemMeshPtr())); pcDoc->recompute(); diff --git a/src/Mod/Import/App/ImportOCAF.cpp b/src/Mod/Import/App/ImportOCAF.cpp index b684ba8a68..4db7eeba24 100644 --- a/src/Mod/Import/App/ImportOCAF.cpp +++ b/src/Mod/Import/App/ImportOCAF.cpp @@ -250,7 +250,7 @@ void ImportOCAF::loadShapes(const TDF_Label& label, if (!localValue.empty()) { if (aShapeTool->IsAssembly(label)) { App::Part* pcPart = nullptr; - pcPart = static_cast(doc->addObject("App::Part", asm_name.c_str())); + pcPart = doc->addObject(asm_name.c_str()); pcPart->Label.setValue(asm_name); pcPart->addObjects(localValue); @@ -326,7 +326,7 @@ void ImportOCAF::createShape(const TDF_Label& label, // Ok we got a Compound which is computed // Just need to add it to a Part::Feature and push it to lValue if (!comp.IsNull() && (ctSolids || ctShells || ctEdges || ctVertices)) { - Part::Feature* part = static_cast(doc->addObject("Part::Feature")); + Part::Feature* part = doc->addObject(); // Let's allocate the relative placement of the Compound from the STEP file tryPlacementFromLoc(part, loc); if (!loc.IsIdentity()) { @@ -352,7 +352,7 @@ void ImportOCAF::createShape(const TDF_Label& label, } if (!localValue.empty() && !mergeShape) { - pcPart = static_cast(doc->addObject("App::Part", name.c_str())); + pcPart = doc->addObject(name.c_str()); pcPart->Label.setValue(name); // localValue contain the objects that must added to the local Part @@ -376,7 +376,7 @@ void ImportOCAF::createShape(const TopoDS_Shape& aShape, const std::string& name, std::vector& lvalue) { - Part::Feature* part = static_cast(doc->addObject("Part::Feature")); + Part::Feature* part = doc->addObject(); if (!loc.IsIdentity()) { part->Shape.setValue(aShape.Moved(loc)); @@ -497,7 +497,7 @@ void ImportXCAF::loadShapes() void ImportXCAF::createShape(const TopoDS_Shape& shape, bool perface, bool setname) const { Part::Feature* part; - part = static_cast(doc->addObject("Part::Feature", default_name.c_str())); + part = doc->addObject(default_name.c_str()); part->Label.setValue(default_name); part->Shape.setValue(shape); std::map::const_iterator jt; diff --git a/src/Mod/Import/App/ImportOCAF2.cpp b/src/Mod/Import/App/ImportOCAF2.cpp index 1cabfbb9f6..feb927adfa 100644 --- a/src/Mod/Import/App/ImportOCAF2.cpp +++ b/src/Mod/Import/App/ImportOCAF2.cpp @@ -269,8 +269,7 @@ ImportOCAF2::expandShape(App::Document* doc, TDF_Label label, const TopoDS_Shape if (objs.empty()) { return nullptr; } - auto compound = - static_cast(doc->addObject("Part::Compound2", "Compound")); + auto compound = doc->addObject("Compound"); compound->Links.setValues(objs); setPlacement(&compound->Placement, shape); return compound; @@ -382,8 +381,7 @@ bool ImportOCAF2::createObject(App::Document* doc, assert(feature); } else { - feature = static_cast( - doc->addObject("Part::Feature", tshape.shapeName().c_str())); + feature = doc->addObject(tshape.shapeName().c_str()); feature->Shape.setValue(shape); } applyFaceColors(feature, {info.faceColor}); @@ -479,10 +477,10 @@ bool ImportOCAF2::createGroup(App::Document* doc, myCollapsedObjects.emplace(info.obj, info.propPlacement); return true; } - auto group = static_cast(doc->addObject("App::LinkGroup", "LinkGroup")); + auto group = doc->addObject("LinkGroup"); for (auto& child : children) { if (child->getDocument() != doc) { - auto link = static_cast(doc->addObject("App::Link", "Link")); + auto link = doc->addObject("Link"); link->Label.setValue(child->Label.getValue()); link->setLink(-1, child); auto pla = Base::freecad_dynamic_cast( @@ -566,8 +564,7 @@ App::DocumentObject* ImportOCAF2::loadShapes() } if (options.merge && ret && !ret->isDerivedFrom()) { auto shape = Part::Feature::getTopoShape(ret); - auto feature = - static_cast(pDocument->addObject("Part::Feature", "Feature")); + auto feature = pDocument->addObject("Feature"); auto name = Tools::labelName(pDoc->Main()); feature->Label.setValue(name.empty() ? default_name.c_str() : name.c_str()); feature->Shape.setValue(shape); @@ -701,8 +698,7 @@ App::DocumentObject* ImportOCAF2::loadShape(App::Document* doc, auto name = getLabelName(label); if (info.faceColor != it->second.faceColor || info.edgeColor != it->second.edgeColor || (!name.empty() && !info.baseName.empty() && name != info.baseName)) { - auto compound = - static_cast(doc->addObject("Part::Compound2", "Compound")); + auto compound = doc->addObject("Compound"); compound->Links.setValue(info.obj); info.propPlacement = &compound->Placement; if (info.faceColor != it->second.faceColor) { @@ -719,7 +715,7 @@ App::DocumentObject* ImportOCAF2::loadShape(App::Document* doc, return info.obj; } - auto link = static_cast(doc->addObject("App::Link", "Link")); + auto link = doc->addObject("Link"); link->setLink(-1, info.obj); setPlacement(&link->Placement, shape); info.obj = link; @@ -826,7 +822,7 @@ bool ImportOCAF2::createAssembly(App::Document* _doc, visibilities[i] = true; // Okay, we are creating a link array - auto link = static_cast(doc->addObject("App::Link", "Link")); + auto link = doc->addObject("Link"); link->setLink(-1, child); link->ShowElement.setValue(false); link->ElementCount.setValue(childInfo.plas.size()); diff --git a/src/Mod/Import/App/ImportOCAFAssembly.cpp b/src/Mod/Import/App/ImportOCAFAssembly.cpp index 2778f00a77..29ecb1d54e 100644 --- a/src/Mod/Import/App/ImportOCAFAssembly.cpp +++ b/src/Mod/Import/App/ImportOCAFAssembly.cpp @@ -241,7 +241,7 @@ void ImportOCAFAssembly::createShape(const TopoDS_Shape& aShape, const TopLoc_Location& loc, const std::string& name) { - Part::Feature* part = static_cast(doc->addObject("Part::Feature")); + Part::Feature* part = doc->addObject(); if (!loc.IsIdentity()) { part->Shape.setValue(aShape.Moved(loc)); } diff --git a/src/Mod/Import/App/dxf/ImpExpDxf.cpp b/src/Mod/Import/App/dxf/ImpExpDxf.cpp index a7284f54b1..c51c1b620a 100644 --- a/src/Mod/Import/App/dxf/ImpExpDxf.cpp +++ b/src/Mod/Import/App/dxf/ImpExpDxf.cpp @@ -736,8 +736,7 @@ std::string ImpExpDxfRead::Deformat(const char* text) void ImpExpDxfRead::DrawingEntityCollector::AddObject(const TopoDS_Shape& shape, const char* nameBase) { - auto pcFeature = - dynamic_cast(Reader.document->addObject("Part::Feature", nameBase)); + auto pcFeature = Reader.document->addObject(nameBase); pcFeature->Shape.setValue(shape); Reader.MoveToLayer(pcFeature); Reader.ApplyGuiStyles(pcFeature); diff --git a/src/Mod/Mesh/App/AppMeshPy.cpp b/src/Mod/Mesh/App/AppMeshPy.cpp index cfcbf3e0ef..0bf62df25a 100644 --- a/src/Mod/Mesh/App/AppMeshPy.cpp +++ b/src/Mod/Mesh/App/AppMeshPy.cpp @@ -303,8 +303,7 @@ private: pcDoc = App::GetApplication().newDocument(); } MeshPy* pMesh = static_cast(pcObj); - Mesh::Feature* pcFeature = - static_cast(pcDoc->addObject("Mesh::Feature", name)); + Mesh::Feature* pcFeature = pcDoc->addObject(name); Mesh::MeshObject* mo = pMesh->getMeshObjectPtr(); if (!mo) { throw Py::Exception(PyExc_ReferenceError, "object doesn't reference a valid mesh"); diff --git a/src/Mod/Mesh/App/Importer.cpp b/src/Mod/Mesh/App/Importer.cpp index 097cca3d9c..647a8fd116 100644 --- a/src/Mod/Mesh/App/Importer.cpp +++ b/src/Mod/Mesh/App/Importer.cpp @@ -119,8 +119,7 @@ void Importer::createMeshFromSegments(const std::string& name, Feature* Importer::createMesh(const std::string& name, MeshObject& mesh) { - Mesh::Feature* pcFeature = - static_cast(document->addObject("Mesh::Feature", name.c_str())); + Mesh::Feature* pcFeature = document->addObject(name.c_str()); pcFeature->Label.setValue(name); pcFeature->Mesh.swapMesh(mesh); return pcFeature; diff --git a/src/Mod/Mesh/Gui/Command.cpp b/src/Mod/Mesh/Gui/Command.cpp index 595bc84f33..970c21f411 100644 --- a/src/Mod/Mesh/Gui/Command.cpp +++ b/src/Mod/Mesh/Gui/Command.cpp @@ -503,8 +503,7 @@ void CmdMeshFromGeometry::activated(int) } // create a mesh feature and assign the mesh - Mesh::Feature* mf = - static_cast(doc->addObject("Mesh::Feature", "Mesh")); + Mesh::Feature* mf = doc->addObject("Mesh"); mf->Mesh.setValue(mesh.getKernel()); } } @@ -1703,8 +1702,7 @@ void CmdMeshMerge::activated(int) } openCommand(QT_TRANSLATE_NOOP("Command", "Mesh merge")); - Mesh::Feature* pcFeature = - static_cast(pcDoc->addObject("Mesh::Feature", "Mesh")); + Mesh::Feature* pcFeature = pcDoc->addObject("Mesh"); Mesh::MeshObject* newMesh = pcFeature->Mesh.startEditing(); std::vector objs = Gui::Selection().getObjectsOfType(Mesh::Feature::getClassTypeId()); @@ -1759,8 +1757,7 @@ void CmdMeshSplitComponents::activated(int) std::unique_ptr kernel(mesh.meshFromSegment(comp)); kernel->setTransform(mesh.getTransform()); - Mesh::Feature* feature = - static_cast(pcDoc->addObject("Mesh::Feature", "Component")); + Mesh::Feature* feature = pcDoc->addObject("Component"); feature->Mesh.setValuePtr(kernel.release()); } } diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 620f82d049..923073307a 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -975,7 +975,7 @@ public: Gui::Document* gui = mesh->getDocument(); App::Document* doc = gui->getDocument(); - auto cpy = static_cast(doc->addObject("Mesh::Feature")); + auto cpy = doc->addObject(); auto org = mesh->getObject(); cpy->Label.setValue(org->Label.getValue()); cpy->Mesh.setValue(org->Mesh.getValue()); diff --git a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp index b66239b902..7c3e18e4e4 100644 --- a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp +++ b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp @@ -480,8 +480,7 @@ public: } } if (!group) { - group = dynamic_cast( - doc->addObject("App::DocumentObjectGroup", internalname.c_str())); + group = doc->addObject(internalname.c_str()); } auto anno = dynamic_cast( diff --git a/src/Mod/MeshPart/Gui/Command.cpp b/src/Mod/MeshPart/Gui/Command.cpp index f2a85f05c1..a261d71a95 100644 --- a/src/Mod/MeshPart/Gui/Command.cpp +++ b/src/Mod/MeshPart/Gui/Command.cpp @@ -159,7 +159,7 @@ void CmdMeshPartTrimByPlane::activated(int) copy.trimByPlane(plnBase, -plnNormal); App::Document* doc = it->getDocument(); - Mesh::Feature* fea = static_cast(doc->addObject("Mesh::Feature")); + Mesh::Feature* fea = doc->addObject(); fea->Label.setValue(it->Label.getValue()); Mesh::MeshObject* feamesh = fea->Mesh.startEditing(); feamesh->swap(copy); diff --git a/src/Mod/MeshPart/Gui/CrossSections.cpp b/src/Mod/MeshPart/Gui/CrossSections.cpp index 5ecd5524a5..3058d443a4 100644 --- a/src/Mod/MeshPart/Gui/CrossSections.cpp +++ b/src/Mod/MeshPart/Gui/CrossSections.cpp @@ -327,8 +327,7 @@ void CrossSections::apply() App::Document* doc = it->getDocument(); std::string s = it->getNameInDocument(); s += "_cs"; - Part::Feature* section = - static_cast(doc->addObject("Part::Feature", s.c_str())); + Part::Feature* section = doc->addObject(s.c_str()); section->Shape.setValue(comp); section->purgeTouched(); } diff --git a/src/Mod/MeshPart/Gui/CurveOnMesh.cpp b/src/Mod/MeshPart/Gui/CurveOnMesh.cpp index cdc22b02b9..445b21a37a 100644 --- a/src/Mod/MeshPart/Gui/CurveOnMesh.cpp +++ b/src/Mod/MeshPart/Gui/CurveOnMesh.cpp @@ -533,7 +533,7 @@ void CurveOnMeshHandler::displaySpline(const Handle(Geom_BSplineCurve) & spline) Gui::View3DInventorViewer* view3d = d_ptr->viewer->getViewer(); App::Document* doc = view3d->getDocument()->getDocument(); doc->openTransaction("Add spline"); - Part::Feature* part = static_cast(doc->addObject("Part::Spline", "Spline")); + Part::Feature* part = doc->addObject("Spline"); part->Shape.setValue(edge); doc->commitTransaction(); } @@ -562,8 +562,7 @@ void CurveOnMeshHandler::displayPolyline(const TopoDS_Wire& wire) Gui::View3DInventorViewer* view3d = d_ptr->viewer->getViewer(); App::Document* doc = view3d->getDocument()->getDocument(); doc->openTransaction("Add polyline"); - Part::Feature* part = - static_cast(doc->addObject("Part::Feature", "Polyline")); + Part::Feature* part = doc->addObject("Polyline"); part->Shape.setValue(wire); doc->commitTransaction(); } diff --git a/src/Mod/MeshPart/Gui/Tessellation.cpp b/src/Mod/MeshPart/Gui/Tessellation.cpp index 875f98433c..d885c7897e 100644 --- a/src/Mod/MeshPart/Gui/Tessellation.cpp +++ b/src/Mod/MeshPart/Gui/Tessellation.cpp @@ -655,7 +655,7 @@ bool Mesh2ShapeGmsh::loadOutput() stlIn.close(); kernel.harmonizeNormals(); - auto fea = static_cast(doc->addObject("Mesh::Feature", "Mesh")); + auto fea = doc->addObject("Mesh"); fea->Label.setValue(d->label); fea->Mesh.setValue(kernel.getKernel()); stl.deleteFile(); diff --git a/src/Mod/Part/App/AppPartPy.cpp b/src/Mod/Part/App/AppPartPy.cpp index ae1a188980..c14aa38d89 100644 --- a/src/Mod/Part/App/AppPartPy.cpp +++ b/src/Mod/Part/App/AppPartPy.cpp @@ -866,7 +866,7 @@ private: } else { throw Py::TypeError("Expects argument of type DocumentObject, Shape, or Geometry"); } - Part::Feature *pcFeature = static_cast(pcDoc->addObject("Part::Feature", name)); + Part::Feature *pcFeature = pcDoc->addObject(name); // copy the data pcFeature->Shape.setValue(shape); pcFeature->purgeTouched(); diff --git a/src/Mod/Part/App/ImportIges.cpp b/src/Mod/Part/App/ImportIges.cpp index c299b0384f..272a8173ee 100644 --- a/src/Mod/Part/App/ImportIges.cpp +++ b/src/Mod/Part/App/ImportIges.cpp @@ -103,8 +103,8 @@ int Part::ImportIgesParts(App::Document *pcDoc, const char* FileName) if (aShape.ShapeType() == TopAbs_SOLID || aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_SHELL) { - App::DocumentObject* obj = pcDoc->addObject("Part::Feature", aName.c_str()); - static_cast(obj)->Shape.setValue(aShape); + auto* obj = pcDoc->addObject(aName.c_str()); + obj->Shape.setValue(aShape); } else { builder.Add(comp, aShape); @@ -114,8 +114,7 @@ int Part::ImportIgesParts(App::Document *pcDoc, const char* FileName) } if (!emptyComp) { std::string name = fi.fileNamePure(); - Part::Feature *pcFeature = static_cast(pcDoc->addObject - ("Part::Feature", name.c_str())); + auto* pcFeature = pcDoc->addObject(name.c_str()); pcFeature->Shape.setValue(comp); } } diff --git a/src/Mod/Part/App/ImportStep.cpp b/src/Mod/Part/App/ImportStep.cpp index 4c13aaf2af..8c26ab469e 100644 --- a/src/Mod/Part/App/ImportStep.cpp +++ b/src/Mod/Part/App/ImportStep.cpp @@ -132,7 +132,7 @@ int Part::ImportStepParts(App::Document *pcDoc, const char* Name) //} Part::Feature *pcFeature; - pcFeature = static_cast(pcDoc->addObject("Part::Feature", name.c_str())); + pcFeature = pcDoc->addObject(name.c_str()); pcFeature->Shape.setValue(aSolid); // This is a trick to access the GUI via Python and set the color property @@ -167,7 +167,7 @@ int Part::ImportStepParts(App::Document *pcDoc, const char* Name) // name += ws->Model()->StringLabel(ent)->ToCString(); //} - Part::Feature *pcFeature = static_cast(pcDoc->addObject("Part::Feature", name.c_str())); + Part::Feature *pcFeature = pcDoc->addObject(name.c_str()); pcFeature->Shape.setValue(aShell); } diff --git a/src/Mod/Part/App/PartFeature.cpp b/src/Mod/Part/App/PartFeature.cpp index 147f4c362b..fdb2c3fbd4 100644 --- a/src/Mod/Part/App/PartFeature.cpp +++ b/src/Mod/Part/App/PartFeature.cpp @@ -1575,7 +1575,7 @@ Feature* Feature::create(const TopoShape& shape, const char* name, App::Document document = App::GetApplication().newDocument(); } } - auto res = static_cast(document->addObject("Part::Feature", name)); + auto res = document->addObject(name); res->Shape.setValue(shape); res->purgeTouched(); return res; diff --git a/src/Mod/Part/Gui/CrossSections.cpp b/src/Mod/Part/Gui/CrossSections.cpp index 5e34e4f09d..d859f83e85 100644 --- a/src/Mod/Part/Gui/CrossSections.cpp +++ b/src/Mod/Part/Gui/CrossSections.cpp @@ -260,8 +260,7 @@ void CrossSections::apply() App::Document* doc = (*it)->getDocument(); std::string s = (*it)->getNameInDocument(); s += "_cs"; - Part::Feature* section = static_cast - (doc->addObject("Part::Feature",s.c_str())); + auto* section = doc->addObject(s.c_str()); section->Shape.setValue(comp); section->purgeTouched(); } diff --git a/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp b/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp index bc7448a2d7..1bf794f2b6 100644 --- a/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp +++ b/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp @@ -165,8 +165,7 @@ DlgProjectionOnSurface::DlgProjectionOnSurface(QWidget* parent) } this->attachDocument(m_partDocument); m_partDocument->openTransaction("Project on surface"); - m_projectionObject = dynamic_cast( - m_partDocument->addObject("Part::Feature", "Projection Object")); + m_projectionObject = m_partDocument->addObject("Projection Object"); if (!m_projectionObject) { throw Base::ValueError(QString(tr("Can not create a projection object!!!")).toUtf8()); } diff --git a/src/Mod/Part/Gui/SectionCutting.cpp b/src/Mod/Part/Gui/SectionCutting.cpp index fbfa8b66c2..bf7d5c2e12 100644 --- a/src/Mod/Part/Gui/SectionCutting.cpp +++ b/src/Mod/Part/Gui/SectionCutting.cpp @@ -606,7 +606,7 @@ void SectionCut::restoreVisibility() Part::Box* SectionCut::createBox(const char* name, const Base::Vector3f& size) // NOLINT { // create a box - auto pcBox = dynamic_cast(doc->addObject("Part::Box", name)); + auto pcBox = doc->addObject(name); if (!pcBox) { throw Base::RuntimeError(std::string("SectionCut error: ") + std::string(name) + std::string(" could not be added\n")); @@ -785,7 +785,7 @@ Part::Box* SectionCut::createZBox(const Base::Vector3f& pos, const Base::Vector3 Part::Cut* SectionCut::createCut(const char* name) { - auto pcCut = dynamic_cast(doc->addObject("Part::Cut", name)); + auto pcCut = doc->addObject(name); if (!pcCut) { throw Base::RuntimeError(std::string("SectionCut error: ") + std::string(name) + std::string(" could not be added\n")); @@ -1004,7 +1004,7 @@ std::vector createLinks(App::Document* doc, const std::vec } newName += "_CutLink"; - auto pcLink = dynamic_cast(doc->addObject("App::Link", newName.c_str())); + auto pcLink = doc->addObject(newName.c_str()); if (!pcLink) { throw Base::RuntimeError("'App::Link' could not be added"); } diff --git a/src/Mod/PartDesign/App/Body.cpp b/src/Mod/PartDesign/App/Body.cpp index ab032aa702..1d9dba2a8f 100644 --- a/src/Mod/PartDesign/App/Body.cpp +++ b/src/Mod/PartDesign/App/Body.cpp @@ -442,7 +442,7 @@ void Body::onChanged(const App::Property* prop) { if (BaseFeature.getValue()) { //setup the FeatureBase if needed if (!first || !first->isDerivedFrom()) { - bf = static_cast(getDocument()->addObject("PartDesign::FeatureBase", "BaseFeature")); + bf = getDocument()->addObject("BaseFeature"); insertObject(bf, first, false); if (!Tip.getValue()) diff --git a/src/Mod/Points/App/AppPointsPy.cpp b/src/Mod/Points/App/AppPointsPy.cpp index e5f1d49e1e..677c3059c4 100644 --- a/src/Mod/Points/App/AppPointsPy.cpp +++ b/src/Mod/Points/App/AppPointsPy.cpp @@ -414,8 +414,7 @@ private: pcDoc = App::GetApplication().newDocument(); } PointsPy* pPoints = static_cast(pcObj); - Points::Feature* pcFeature = - static_cast(pcDoc->addObject("Points::Feature", name)); + Points::Feature* pcFeature = pcDoc->addObject(name); // copy the data pcFeature->Points.setValue(*(pPoints->getPointKernelPtr())); return Py::asObject(pcFeature->getPyObject()); diff --git a/src/Mod/Points/Gui/Command.cpp b/src/Mod/Points/Gui/Command.cpp index b84839a640..03d52f9b45 100644 --- a/src/Mod/Points/Gui/Command.cpp +++ b/src/Mod/Points/Gui/Command.cpp @@ -386,8 +386,7 @@ void CmdPointsMerge::activated(int iMsg) App::Document* doc = App::GetApplication().getActiveDocument(); doc->openTransaction("Merge point clouds"); - Points::Feature* pts = - static_cast(doc->addObject("Points::Feature", "Merged Points")); + Points::Feature* pts = doc->addObject("Merged Points"); Points::PointKernel* kernel = pts->Points.startEditing(); std::vector docObj = @@ -455,8 +454,7 @@ void CmdPointsStructure::activated(int iMsg) for (auto it : docObj) { std::string name = it->Label.getValue(); name += " (Structured)"; - Points::Structured* output = - static_cast(doc->addObject("Points::Structured", name.c_str())); + Points::Structured* output = doc->addObject(name.c_str()); output->Label.setValue(name); // Already sorted, so just make a copy diff --git a/src/Mod/ReverseEngineering/Gui/Command.cpp b/src/Mod/ReverseEngineering/Gui/Command.cpp index acfbbc2a1a..ef03de7103 100644 --- a/src/Mod/ReverseEngineering/Gui/Command.cpp +++ b/src/Mod/ReverseEngineering/Gui/Command.cpp @@ -576,13 +576,11 @@ void CmdMeshBoundary::activated(int) } if (!shape.IsNull()) { - Part::Feature* shapeFea = - static_cast(document->addObject("Part::Feature", "Face from mesh")); + Part::Feature* shapeFea = document->addObject("Face from mesh"); shapeFea->Shape.setValue(shape); } else { - Part::Feature* shapeFea = - static_cast(document->addObject("Part::Feature", "Wire from mesh")); + Part::Feature* shapeFea = document->addObject("Wire from mesh"); shapeFea->Shape.setValue(compound); } } diff --git a/src/Mod/Sandbox/App/DocumentThread.cpp b/src/Mod/Sandbox/App/DocumentThread.cpp index b1a68a867f..bd11674f01 100644 --- a/src/Mod/Sandbox/App/DocumentThread.cpp +++ b/src/Mod/Sandbox/App/DocumentThread.cpp @@ -218,7 +218,7 @@ void DocumentTestThread::run() Base::Console().Message("DocumentTestThread::run()\n"); App::Document* doc = App::GetApplication().getActiveDocument(); DocumentProtector dp(doc); - SandboxObject* obj = static_cast(dp.addObject("Sandbox::SandboxObject")); + SandboxObject* obj = dp.addObject(); DocumentObjectProtector op(obj); App::PropertyString Name;Name.setValue("MyLabel"); diff --git a/src/Mod/Sandbox/Gui/Command.cpp b/src/Mod/Sandbox/Gui/Command.cpp index 5709af9019..d7891830ce 100644 --- a/src/Mod/Sandbox/Gui/Command.cpp +++ b/src/Mod/Sandbox/Gui/Command.cpp @@ -593,7 +593,7 @@ void CmdSandboxMeshLoader::activated(int) Base::Reference data = thread.getMesh(); App::Document* doc = App::GetApplication().getActiveDocument(); - Mesh::Feature* mesh = static_cast(doc->addObject("Mesh::Feature","Mesh")); + Mesh::Feature* mesh = doc->addObject("Mesh"); mesh->Mesh.setValuePtr((Mesh::MeshObject*)data); mesh->purgeTouched(); } @@ -650,7 +650,7 @@ void CmdSandboxMeshLoaderBoost::activated(int) fi.wait(); // wait for it to be finished App::Document* doc = App::GetApplication().getActiveDocument(); - Mesh::Feature* mesh = static_cast(doc->addObject("Mesh::Feature","Mesh")); + Mesh::Feature* mesh = doc->addObject("Mesh"); mesh->Mesh.setValuePtr((Mesh::MeshObject*)fi.get()); mesh->purgeTouched(); } @@ -704,7 +704,7 @@ void CmdSandboxMeshLoaderFuture::activated(int) App::Document* doc = App::GetApplication().getActiveDocument(); for (QFuture< Base::Reference >::const_iterator it = future.begin(); it != future.end(); ++it) { - Mesh::Feature* mesh = static_cast(doc->addObject("Mesh::Feature","Mesh")); + Mesh::Feature* mesh = doc->addObject("Mesh"); mesh->Mesh.setValuePtr((Mesh::MeshObject*)(*it)); mesh->purgeTouched(); } @@ -1368,7 +1368,7 @@ void CmdMengerSponge::activated(int) kernel.RebuildNeighbours(); App::Document* doc = App::GetApplication().newDocument(); - Mesh::Feature* feature = static_cast(doc->addObject("Mesh::Feature","MengerSponge")); + Mesh::Feature* feature = doc->addObject("MengerSponge"); feature->Mesh.setValue(*mesh); feature->purgeTouched(); } diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 5f540a18ae..02d1551960 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -124,15 +124,13 @@ void CmdTechDrawPageDefault::activated(int iMsg) Gui::WaitCursor wc; openCommand(QT_TRANSLATE_NOOP("Command", "Drawing create page")); - auto page = dynamic_cast - (getDocument()->addObject("TechDraw::DrawPage", "Page")); + auto page = getDocument()->addObject("Page"); if (!page) { throw Base::TypeError("CmdTechDrawPageDefault - page not created"); } page->translateLabel("DrawPage", "Page", page->getNameInDocument()); - auto svgTemplate = dynamic_cast - (getDocument()->addObject("TechDraw::DrawSVGTemplate", "Template")); + auto svgTemplate = getDocument()->addObject("Template"); if (!svgTemplate) { throw Base::TypeError("CmdTechDrawPageDefault - template not created"); } @@ -195,15 +193,13 @@ void CmdTechDrawPageTemplate::activated(int iMsg) Gui::WaitCursor wc; openCommand(QT_TRANSLATE_NOOP("Command", "Drawing create page")); - auto page = dynamic_cast - (getDocument()->addObject("TechDraw::DrawPage", "Page")); + auto page = getDocument()->addObject("Page"); if (!page) { throw Base::TypeError("CmdTechDrawPageTemplate - page not created"); } page->translateLabel("DrawPage", "Page", page->getNameInDocument()); - auto svgTemplate = dynamic_cast - (getDocument()->addObject("TechDraw::DrawSVGTemplate", "Template")); + auto svgTemplate = getDocument()->addObject("Template"); if (!svgTemplate) { throw Base::TypeError("CmdTechDrawPageTemplate - template not created"); } diff --git a/src/Mod/TechDraw/Gui/TaskWeldingSymbol.cpp b/src/Mod/TechDraw/Gui/TaskWeldingSymbol.cpp index a554abba31..316f0eefbf 100644 --- a/src/Mod/TechDraw/Gui/TaskWeldingSymbol.cpp +++ b/src/Mod/TechDraw/Gui/TaskWeldingSymbol.cpp @@ -457,7 +457,7 @@ TechDraw::DrawWeldSymbol* TaskWeldingSymbol::createWeldingSymbol() { // Base::Console().Message("TWS::createWeldingSymbol()\n"); App::Document *doc = Application::Instance->activeDocument()->getDocument(); - auto weldSymbol = dynamic_cast(doc->addObject("TechDraw::DrawWeldSymbol", "WeldSymbol")); + auto weldSymbol = doc->addObject("WeldSymbol"); if (!weldSymbol) { throw Base::RuntimeError("TaskWeldingSymbol - new symbol object not found"); } diff --git a/tests/src/Mod/Assembly/App/AssemblyObject.cpp b/tests/src/Mod/Assembly/App/AssemblyObject.cpp index f3ac682166..27e59c68b2 100644 --- a/tests/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/tests/src/Mod/Assembly/App/AssemblyObject.cpp @@ -24,8 +24,7 @@ protected: { _docName = App::GetApplication().getUniqueDocumentName("test"); auto _doc = App::GetApplication().newDocument(_docName.c_str(), "testUser"); - _assemblyObj = - static_cast(_doc->addObject("Assembly::AssemblyObject")); + _assemblyObj = _doc->addObject(); _jointGroupObj = static_cast( _assemblyObj->addObject("Assembly::JointGroup", "jointGroupTest")); } diff --git a/tests/src/Mod/Measure/App/MeasureDistance.cpp b/tests/src/Mod/Measure/App/MeasureDistance.cpp index 86aee30c5a..c88a6fd7d0 100644 --- a/tests/src/Mod/Measure/App/MeasureDistance.cpp +++ b/tests/src/Mod/Measure/App/MeasureDistance.cpp @@ -48,13 +48,12 @@ private: TEST_F(MeasureDistance, testCircleCircle) { App::Document* doc = getDocument(); - auto p1 = dynamic_cast(doc->addObject("Part::Feature", "Shape1")); + auto p1 = doc->addObject("Shape1"); p1->Shape.setValue(makeCircle(gp_Pnt(0.0, 0.0, 0.0))); - auto p2 = dynamic_cast(doc->addObject("Part::Feature", "Shape2")); + auto p2 = doc->addObject("Shape2"); p2->Shape.setValue(makeCircle(gp_Pnt(3.0, 4.0, 0.0))); - auto md = dynamic_cast( - doc->addObject("Measure::MeasureDistance", "Distance")); + auto md = doc->addObject("Distance"); md->Element1.setValue(p1, {"Edge1"}); md->Element2.setValue(p2, {"Edge1"}); diff --git a/tests/src/Mod/Mesh/App/Exporter.cpp b/tests/src/Mod/Mesh/App/Exporter.cpp index 07efa7d2cb..cb63eff7b1 100644 --- a/tests/src/Mod/Mesh/App/Exporter.cpp +++ b/tests/src/Mod/Mesh/App/Exporter.cpp @@ -22,11 +22,11 @@ protected: fileInfo.setFile(Base::FileInfo::getTempFileName() + ".stl"); const double value = 10.0; - cube1 = dynamic_cast(document->addObject("Mesh::Cube", "Cube1")); + cube1 = document->addObject("Cube1"); cube1->Length.setValue(value); cube1->Width.setValue(value); cube1->Height.setValue(value); - cube2 = dynamic_cast(document->addObject("Mesh::Cube", "Cube2")); + cube2 = document->addObject("Cube2"); cube2->Length.setValue(value); cube2->Width.setValue(value); cube2->Height.setValue(value); @@ -130,7 +130,7 @@ TEST_F(ExporterTest, TestMeshesInPart) // add extra scope because the file will be written when destroying the exporter { - auto part = dynamic_cast(getDocument()->addObject("App::Part", "Part")); + auto part = getDocument()->addObject("Part"); part->placement().setValue(plm); part->addObjects(getObjects()); Mesh::MergeExporter exporter(getFileName(), MeshCore::MeshIO::Format::STL); diff --git a/tests/src/Mod/Part/App/AttachExtension.cpp b/tests/src/Mod/Part/App/AttachExtension.cpp index 89afe01be1..65973b8f9b 100644 --- a/tests/src/Mod/Part/App/AttachExtension.cpp +++ b/tests/src/Mod/Part/App/AttachExtension.cpp @@ -38,8 +38,8 @@ private: TEST_F(AttachExtensionTest, testPlanePlane) { - auto plane1 = dynamic_cast(getDocument()->addObject("Part::Plane", "Plane1")); - auto plane2 = dynamic_cast(getDocument()->addObject("Part::Plane", "Plane2")); + auto plane1 = getDocument()->addObject("Plane1"); + auto plane2 = getDocument()->addObject("Plane2"); ASSERT_TRUE(plane1); ASSERT_TRUE(plane2); @@ -57,7 +57,7 @@ TEST_F(AttachExtensionTest, testPlanePlane) TEST_F(AttachExtensionTest, testAttacherEngineType) { - auto plane = dynamic_cast(getDocument()->addObject("Part::Plane", "Plane")); + auto plane = getDocument()->addObject("Plane"); EXPECT_STREQ(plane->AttacherType.getValue(), "Attacher::AttachEngine3D"); EXPECT_STREQ(plane->AttacherEngine.getValueAsString(), "Engine 3D"); @@ -76,7 +76,7 @@ TEST_F(AttachExtensionTest, testAttacherEngineType) TEST_F(AttachExtensionTest, testAttacherTypeEngine) { - auto plane = dynamic_cast(getDocument()->addObject("Part::Plane", "Plane")); + auto plane = getDocument()->addObject("Plane"); EXPECT_STREQ(plane->AttacherType.getValue(), "Attacher::AttachEngine3D"); EXPECT_STREQ(plane->AttacherEngine.getValueAsString(), "Engine 3D"); diff --git a/tests/src/Mod/Part/App/FeatureChamfer.cpp b/tests/src/Mod/Part/App/FeatureChamfer.cpp index 630d8797ee..963153c57b 100644 --- a/tests/src/Mod/Part/App/FeatureChamfer.cpp +++ b/tests/src/Mod/Part/App/FeatureChamfer.cpp @@ -28,11 +28,11 @@ protected: _boxes[1]->Length.setValue(1); _boxes[1]->Width.setValue(2); _boxes[1]->Height.setValue(3); - _fused = dynamic_cast(_doc->addObject("Part::Fuse")); + _fused = _doc->addObject(); _fused->Base.setValue(_boxes[0]); _fused->Tool.setValue(_boxes[1]); _fused->execute(); - _chamfer = dynamic_cast(_doc->addObject("Part::Chamfer")); + _chamfer = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeatureCompound.cpp b/tests/src/Mod/Part/App/FeatureCompound.cpp index 1a250b4b5b..219bb88a65 100644 --- a/tests/src/Mod/Part/App/FeatureCompound.cpp +++ b/tests/src/Mod/Part/App/FeatureCompound.cpp @@ -19,7 +19,7 @@ protected: void SetUp() override { createTestDoc(); - _compound = dynamic_cast(_doc->addObject("Part::Compound")); + _compound = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeatureExtrusion.cpp b/tests/src/Mod/Part/App/FeatureExtrusion.cpp index 7374ed729b..0d14aa7c73 100644 --- a/tests/src/Mod/Part/App/FeatureExtrusion.cpp +++ b/tests/src/Mod/Part/App/FeatureExtrusion.cpp @@ -21,7 +21,7 @@ protected: void SetUp() override { createTestDoc(); - _extrusion = dynamic_cast(_doc->addObject("Part::Extrusion")); + _extrusion = _doc->addObject(); PartTestHelpers::rectangle(len, wid, "Rect1"); _extrusion->Base.setValue(_doc->getObjects().back()); _extrusion->LengthFwd.setValue(ext1); @@ -252,7 +252,7 @@ TEST_F(FeatureExtrusionTest, testExecuteEdge) const double ang = 30; const double tangent = tan(ang / 180.0 * M_PI); BRepBuilderAPI_MakeEdge e1(gp_Pnt(0, 0, 0), gp_Pnt(ext1, ext1, ext1)); - auto edge = dynamic_cast(_doc->addObject("Part::Feature", "Edge")); + auto edge = _doc->addObject("Edge"); edge->Shape.setValue(e1); _extrusion->DirLink.setValue(edge); _extrusion->DirMode.setValue(1); @@ -310,7 +310,7 @@ TEST_F(FeatureExtrusionTest, testFaceWithHoles) // newFace cleans that up and is the outside minus the internal hole. auto face2 = newFace.getShape(); - auto partFeature = dynamic_cast(_doc->addObject("Part::Feature")); + auto partFeature = _doc->addObject(); partFeature->Shape.setValue(face2); _extrusion->Base.setValue(_doc->getObjects().back()); _extrusion->FaceMakerClass.setValue("Part::FaceMakerCheese"); diff --git a/tests/src/Mod/Part/App/FeatureFillet.cpp b/tests/src/Mod/Part/App/FeatureFillet.cpp index 1d4ba4a467..0f1aeb1bb2 100644 --- a/tests/src/Mod/Part/App/FeatureFillet.cpp +++ b/tests/src/Mod/Part/App/FeatureFillet.cpp @@ -28,11 +28,11 @@ protected: _boxes[1]->Length.setValue(1); _boxes[1]->Width.setValue(2); _boxes[1]->Height.setValue(3); - _fused = dynamic_cast(_doc->addObject("Part::Fuse")); + _fused = _doc->addObject(); _fused->Base.setValue(_boxes[0]); _fused->Tool.setValue(_boxes[1]); _fused->execute(); - _fillet = dynamic_cast(_doc->addObject("Part::Fillet")); + _fillet = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeatureMirroring.cpp b/tests/src/Mod/Part/App/FeatureMirroring.cpp index 8e999b7785..abd8177c4d 100644 --- a/tests/src/Mod/Part/App/FeatureMirroring.cpp +++ b/tests/src/Mod/Part/App/FeatureMirroring.cpp @@ -21,7 +21,7 @@ protected: void SetUp() override { createTestDoc(); - _mirror = dynamic_cast(_doc->addObject("Part::Mirroring")); + _mirror = _doc->addObject(); _mirror->Source.setValue(_boxes[0]); _mirror->Base.setValue(1, 0, 0); _mirror->execute(); @@ -61,7 +61,7 @@ TEST_F(FeatureMirroringTest, testYMirrorWithExistingElementMap) { // Arrange Part::Fuse* _fuse = nullptr; // NOLINT Can't be private in a test framework - _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); + _fuse = _doc->addObject(); _fuse->Base.setValue(_boxes[0]); _fuse->Tool.setValue(_boxes[1]); // Act diff --git a/tests/src/Mod/Part/App/FeatureOffset.cpp b/tests/src/Mod/Part/App/FeatureOffset.cpp index 5d9f61fdad..7642c16d41 100644 --- a/tests/src/Mod/Part/App/FeatureOffset.cpp +++ b/tests/src/Mod/Part/App/FeatureOffset.cpp @@ -21,7 +21,7 @@ protected: void SetUp() override { createTestDoc(); - _offset = dynamic_cast(_doc->addObject("Part::Offset")); + _offset = _doc->addObject(); _offset->Source.setValue(_boxes[0]); _offset->Value.setValue(1); _offset->Join.setValue((int)JoinType::intersection); @@ -52,7 +52,7 @@ TEST_F(FeatureOffsetTest, testOffset3DWithExistingElementMap) { // Arrange Part::Fuse* _fuse = nullptr; // NOLINT Can't be private in a test framework - _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); + _fuse = _doc->addObject(); _fuse->Base.setValue(_boxes[0]); _fuse->Tool.setValue(_boxes[1]); _fuse->Refine.setValue(true); @@ -76,8 +76,8 @@ TEST_F(FeatureOffsetTest, testOffset3DWithExistingElementMap) TEST_F(FeatureOffsetTest, testOffset2D) { // Arrange - Part::Offset2D* _offset2 = dynamic_cast(_doc->addObject("Part::Offset2D")); - Part::Plane* _pln = dynamic_cast(_doc->addObject("Part::Plane")); + Part::Offset2D* _offset2 = _doc->addObject(); + Part::Plane* _pln = _doc->addObject(); _pln->Length.setValue(2); _pln->Width.setValue(3); _offset2->Source.setValue(_pln); diff --git a/tests/src/Mod/Part/App/FeaturePartBoolean.cpp b/tests/src/Mod/Part/App/FeaturePartBoolean.cpp index 074b1dc9a1..d9548e2091 100644 --- a/tests/src/Mod/Part/App/FeaturePartBoolean.cpp +++ b/tests/src/Mod/Part/App/FeaturePartBoolean.cpp @@ -19,7 +19,7 @@ protected: void SetUp() override { // createTestDoc(); - // _boolean = dynamic_cast(_doc->addObject("Part::Boolean")); + // _boolean = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeaturePartCommon.cpp b/tests/src/Mod/Part/App/FeaturePartCommon.cpp index 65c986cc93..0e2cc3a639 100644 --- a/tests/src/Mod/Part/App/FeaturePartCommon.cpp +++ b/tests/src/Mod/Part/App/FeaturePartCommon.cpp @@ -19,7 +19,7 @@ protected: void SetUp() override { createTestDoc(); - _common = dynamic_cast(_doc->addObject("Part::Common")); + _common = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeaturePartCut.cpp b/tests/src/Mod/Part/App/FeaturePartCut.cpp index f0c42ac92c..9f52671250 100644 --- a/tests/src/Mod/Part/App/FeaturePartCut.cpp +++ b/tests/src/Mod/Part/App/FeaturePartCut.cpp @@ -18,7 +18,7 @@ protected: void SetUp() override { createTestDoc(); - _cut = dynamic_cast(_doc->addObject("Part::Cut")); + _cut = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/FeaturePartFuse.cpp b/tests/src/Mod/Part/App/FeaturePartFuse.cpp index cf7e53a395..b95806b807 100644 --- a/tests/src/Mod/Part/App/FeaturePartFuse.cpp +++ b/tests/src/Mod/Part/App/FeaturePartFuse.cpp @@ -20,8 +20,8 @@ protected: void SetUp() override { createTestDoc(); - _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); - _multiFuse = dynamic_cast(_doc->addObject("Part::MultiFuse")); + _fuse = _doc->addObject(); + _multiFuse = _doc->addObject(); } void TearDown() override @@ -58,7 +58,7 @@ TEST_F(FeaturePartFuseTest, testCompound) { // Arrange Part::Compound* _compound = nullptr; - _compound = dynamic_cast(_doc->addObject("Part::Compound")); + _compound = _doc->addObject(); _compound->Links.setValues({_boxes[0], _boxes[1]}); _multiFuse->Shapes.setValues({_compound}); @@ -85,7 +85,7 @@ TEST_F(FeaturePartFuseTest, testRecursiveCompound) Part::Compound* _compound[3] = {nullptr}; int t; for (t = 0; t < 3; t++) { - _compound[t] = dynamic_cast(_doc->addObject("Part::Compound")); + _compound[t] = _doc->addObject(); } _compound[0]->Links.setValues({_boxes[0], _boxes[1]}); _compound[1]->Links.setValues({_compound[0]}); diff --git a/tests/src/Mod/Part/App/FeatureRevolution.cpp b/tests/src/Mod/Part/App/FeatureRevolution.cpp index 99abb7ea46..38eeafa562 100644 --- a/tests/src/Mod/Part/App/FeatureRevolution.cpp +++ b/tests/src/Mod/Part/App/FeatureRevolution.cpp @@ -25,7 +25,7 @@ protected: void SetUp() override { createTestDoc(); - _revolution = dynamic_cast(_doc->addObject("Part::Revolution")); + _revolution = _doc->addObject(); PartTestHelpers::rectangle(len, wid, "Rect1"); _revolution->Source.setValue(_doc->getObjects().back()); _revolution->Axis.setValue(0, 1, 0); @@ -95,7 +95,7 @@ TEST_F(FeatureRevolutionTest, testAxisLink) { // Arrange BRepBuilderAPI_MakeEdge e1(gp_Pnt(0, 0, 0), gp_Pnt(0, 0, ext1)); - auto edge = dynamic_cast(_doc->addObject("Part::Feature", "Edge")); + auto edge = _doc->addObject("Edge"); edge->Shape.setValue(e1); _revolution->AxisLink.setValue(edge); // double puckVolume = wid * wid * M_PI * len; // Area is PIr2; apply height diff --git a/tests/src/Mod/Part/App/FuzzyBoolean.cpp b/tests/src/Mod/Part/App/FuzzyBoolean.cpp index 95c4e5d7b6..7a3192f50d 100644 --- a/tests/src/Mod/Part/App/FuzzyBoolean.cpp +++ b/tests/src/Mod/Part/App/FuzzyBoolean.cpp @@ -22,10 +22,10 @@ protected: { createTestDoc(); std::string testPath = App::Application::getHomePath() + "/tests/brepfiles/"; - _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); - _cylinder1 = dynamic_cast(_doc->addObject("Part::ImportBrep")); + _fuse = _doc->addObject(); + _cylinder1 = _doc->addObject(); _cylinder1->FileName.setValue(testPath + "cylinder1.brep"); - _helix1 = dynamic_cast(_doc->addObject("Part::ImportBrep")); + _helix1 = _doc->addObject(); _helix1->FileName.setValue(testPath + "helix1.brep"); // Load diff --git a/tests/src/Mod/Part/App/PartFeature.cpp b/tests/src/Mod/Part/App/PartFeature.cpp index 8ae03c2224..db20e801df 100644 --- a/tests/src/Mod/Part/App/PartFeature.cpp +++ b/tests/src/Mod/Part/App/PartFeature.cpp @@ -24,7 +24,7 @@ protected: void SetUp() override { createTestDoc(); - _common = dynamic_cast(_doc->addObject("Part::Common")); + _common = _doc->addObject(); } void TearDown() override diff --git a/tests/src/Mod/Part/App/PartFeatures.cpp b/tests/src/Mod/Part/App/PartFeatures.cpp index f631f76d66..550a478356 100644 --- a/tests/src/Mod/Part/App/PartFeatures.cpp +++ b/tests/src/Mod/Part/App/PartFeatures.cpp @@ -30,8 +30,8 @@ protected: TEST_F(PartFeaturesTest, testRuledSurface) { // Arrange - auto _edge1 = dynamic_cast(_doc->addObject("Part::Line")); - auto _edge2 = dynamic_cast(_doc->addObject("Part::Line")); + auto _edge1 = _doc->addObject(); + auto _edge2 = _doc->addObject(); _edge1->X1.setValue(0); _edge1->Y1.setValue(0); _edge1->Z1.setValue(0); @@ -44,7 +44,7 @@ TEST_F(PartFeaturesTest, testRuledSurface) _edge2->X2.setValue(2); _edge2->Y2.setValue(2); _edge2->Z2.setValue(0); - auto _ruled = dynamic_cast(_doc->addObject("Part::RuledSurface")); + auto _ruled = _doc->addObject(); _ruled->Curve1.setValue(_edge1); _ruled->Curve2.setValue(_edge2); // Act @@ -65,14 +65,14 @@ TEST_F(PartFeaturesTest, testRuledSurface) TEST_F(PartFeaturesTest, testLoft) { // Arrange - auto _plane1 = dynamic_cast(_doc->addObject("Part::Plane")); + auto _plane1 = _doc->addObject(); _plane1->Length.setValue(4); _plane1->Width.setValue(4); - auto _plane2 = dynamic_cast(_doc->addObject("Part::Plane")); + auto _plane2 = _doc->addObject(); _plane2->Length.setValue(4); _plane2->Width.setValue(4); _plane2->Placement.setValue(Base::Placement(Base::Vector3d(0, 0, 2), Base::Rotation())); - auto _loft = dynamic_cast(_doc->addObject("Part::Loft")); + auto _loft = _doc->addObject(); _loft->Sections.setValues({_plane1, _plane2}); _loft->Solid.setValue((true)); // Act @@ -93,17 +93,17 @@ TEST_F(PartFeaturesTest, testLoft) TEST_F(PartFeaturesTest, testSweep) { // Arrange - auto _edge1 = dynamic_cast(_doc->addObject("Part::Line")); + auto _edge1 = _doc->addObject(); _edge1->X1.setValue(0); _edge1->Y1.setValue(0); _edge1->Z1.setValue(0); _edge1->X2.setValue(0); _edge1->Y2.setValue(0); _edge1->Z2.setValue(3); - auto _plane1 = dynamic_cast(_doc->addObject("Part::Plane")); + auto _plane1 = _doc->addObject(); _plane1->Length.setValue(4); _plane1->Width.setValue(4); - auto _sweep = dynamic_cast(_doc->addObject("Part::Sweep")); + auto _sweep = _doc->addObject(); _sweep->Sections.setValues({_plane1}); _sweep->Spine.setValue(_edge1); // Act @@ -124,7 +124,7 @@ TEST_F(PartFeaturesTest, testSweep) TEST_F(PartFeaturesTest, testThickness) { // Arrange - auto _thickness = dynamic_cast(_doc->addObject("Part::Thickness")); + auto _thickness = _doc->addObject(); _thickness->Faces.setValue(_boxes[0], {"Face1"}); _thickness->Value.setValue(0.25); _thickness->Join.setValue("Intersection"); @@ -146,12 +146,12 @@ TEST_F(PartFeaturesTest, testThickness) TEST_F(PartFeaturesTest, testRefine) { // Arrange - auto _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); + auto _fuse = _doc->addObject(); _fuse->Base.setValue(_boxes[0]); _fuse->Tool.setValue(_boxes[3]); _fuse->execute(); Part::TopoShape fusedts = _fuse->Shape.getShape(); - auto _refine = dynamic_cast(_doc->addObject("Part::Refine")); + auto _refine = _doc->addObject(); _refine->Source.setValue(_fuse); // Act _refine->execute(); @@ -175,7 +175,7 @@ TEST_F(PartFeaturesTest, testRefine) TEST_F(PartFeaturesTest, testReverse) { // Arrange - auto _reverse = dynamic_cast(_doc->addObject("Part::Reverse")); + auto _reverse = _doc->addObject(); _reverse->Source.setValue(_boxes[0]); // Act _reverse->execute(); diff --git a/tests/src/Mod/Part/App/PartTestHelpers.cpp b/tests/src/Mod/Part/App/PartTestHelpers.cpp index a97de3c0e8..392240f4fb 100644 --- a/tests/src/Mod/Part/App/PartTestHelpers.cpp +++ b/tests/src/Mod/Part/App/PartTestHelpers.cpp @@ -44,7 +44,7 @@ void PartTestHelperClass::createTestDoc() Base::Vector3d(0, 2 - minimalDistance, 0)}; for (unsigned i = 0; i < _boxes.size(); i++) { - auto box = _boxes[i] = dynamic_cast(_doc->addObject("Part::Box")); // NOLINT + auto box = _boxes[i] = _doc->addObject(); // NOLINT box->Length.setValue(1); box->Width.setValue(2); box->Height.setValue(3); diff --git a/tests/src/Mod/Part/App/PropertyTopoShape.cpp b/tests/src/Mod/Part/App/PropertyTopoShape.cpp index a6464c3b25..be33e28c1d 100644 --- a/tests/src/Mod/Part/App/PropertyTopoShape.cpp +++ b/tests/src/Mod/Part/App/PropertyTopoShape.cpp @@ -23,7 +23,7 @@ protected: void SetUp() override { createTestDoc(); - _common = dynamic_cast(_doc->addObject("Part::Common")); + _common = _doc->addObject(); _common->Base.setValue(_boxes[0]); _common->Tool.setValue(_boxes[1]); _common->execute(); // We should now have an elementMap with 26 entries. diff --git a/tests/src/Mod/Part/App/TopoShapeMakeElementRefine.cpp b/tests/src/Mod/Part/App/TopoShapeMakeElementRefine.cpp index 6331ceb09a..14e048c2d1 100644 --- a/tests/src/Mod/Part/App/TopoShapeMakeElementRefine.cpp +++ b/tests/src/Mod/Part/App/TopoShapeMakeElementRefine.cpp @@ -29,7 +29,7 @@ TEST_F(FeaturePartMakeElementRefineTest, makeElementRefineBoxes) { // Arrange auto _doc = App::GetApplication().getActiveDocument(); - auto _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); + auto _fuse = _doc->addObject(); _fuse->Base.setValue(_boxes[0]); _fuse->Tool.setValue(_boxes[3]); // Act diff --git a/tests/src/Mod/PartDesign/App/DatumPlane.cpp b/tests/src/Mod/PartDesign/App/DatumPlane.cpp index a7c6c9cf15..3c65129c49 100644 --- a/tests/src/Mod/PartDesign/App/DatumPlane.cpp +++ b/tests/src/Mod/PartDesign/App/DatumPlane.cpp @@ -22,7 +22,7 @@ protected: { _docName = App::GetApplication().getUniqueDocumentName("test"); _doc = App::GetApplication().newDocument(_docName.c_str(), "testUser"); - _body = dynamic_cast(_doc->addObject("PartDesign::Body")); + _body = _doc->addObject(); } void TearDown() override @@ -48,7 +48,7 @@ private: TEST_F(DatumPlaneTest, attachDatumPlane) { - auto datumPlane = getDocument()->addObject("PartDesign::Plane", "Plane"); + auto datumPlane = getDocument()->addObject("Plane"); ASSERT_TRUE(datumPlane); getBody()->addObject(datumPlane); auto origin = getBody()->getOrigin(); diff --git a/tests/src/Mod/PartDesign/App/Pad.cpp b/tests/src/Mod/PartDesign/App/Pad.cpp index a4bd4af4f4..69eff9f416 100644 --- a/tests/src/Mod/PartDesign/App/Pad.cpp +++ b/tests/src/Mod/PartDesign/App/Pad.cpp @@ -23,9 +23,8 @@ protected: void SetUp() override { _doc = App::GetApplication().newDocument("Pad_test", "testUser"); - _body = dynamic_cast(_doc->addObject("PartDesign::Body")); - _sketch = dynamic_cast( - _doc->addObject("Sketcher::SketchObject", "Sketch")); + _body = _doc->addObject(); + _sketch = _doc->addObject("Sketch"); _body->addObject(_sketch); _sketch->AttachmentSupport.setValue(_doc->getObject("XY_Plane"), ""); @@ -69,7 +68,7 @@ TEST_F(PadTest, TestMidPlaneTwoLength) doc->recompute(); - auto pad = dynamic_cast(doc->addObject("PartDesign::Pad", "Pad")); + auto pad = doc->addObject("Pad"); body->addObject(pad); pad->Profile.setValue(sketch, {""}); pad->Direction.setValue(0.0, 0.0, 1.0); diff --git a/tests/src/Mod/PartDesign/App/ShapeBinder.cpp b/tests/src/Mod/PartDesign/App/ShapeBinder.cpp index 52768ae160..e3105faa8b 100644 --- a/tests/src/Mod/PartDesign/App/ShapeBinder.cpp +++ b/tests/src/Mod/PartDesign/App/ShapeBinder.cpp @@ -23,8 +23,8 @@ protected: { _docName = App::GetApplication().getUniqueDocumentName("test"); _doc = App::GetApplication().newDocument(_docName.c_str(), "testUser"); - _body = dynamic_cast(_doc->addObject("PartDesign::Body")); // NOLINT - _box = dynamic_cast(_doc->addObject("Part::Box")); // NOLINT + _body = _doc->addObject(); + _box = _doc->addObject(); _box->Length.setValue(1); _box->Width.setValue(2); _box->Height.setValue(3); @@ -32,10 +32,8 @@ protected: Base::Placement(Base::Vector3d(), Base::Rotation(), Base::Vector3d())); // NOLINT // _body->addObject(_box); // Invalid, Part::Features can't go in a PartDesign::Body, // but we can bind them. - _binder = dynamic_cast( - _doc->addObject("PartDesign::ShapeBinder", "ShapeBinderFoo")); // NOLINT - _subbinder = dynamic_cast( - _doc->addObject("PartDesign::SubShapeBinder", "SubShapeBinderBar")); // NOLINT + _binder = _doc->addObject("ShapeBinderFoo"); + _subbinder = _doc->addObject("SubShapeBinderBar"); _binder->Shape.setValue(_box->Shape.getShape()); _subbinder->setLinks({{_box, {"Face1", "Face2"}}}, false); _body->addObject(_binder); diff --git a/tests/src/Mod/Sketcher/App/SketchObject.cpp b/tests/src/Mod/Sketcher/App/SketchObject.cpp index 30e4432387..603ec299e9 100644 --- a/tests/src/Mod/Sketcher/App/SketchObject.cpp +++ b/tests/src/Mod/Sketcher/App/SketchObject.cpp @@ -12,6 +12,7 @@ using namespace SketcherTestHelpers; + TEST_F(SketchObjectTest, createSketchObject) // NOLINT { // Arrange From edb4817872053fc887be4d3b8b03dec662436fe6 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Sun, 9 Feb 2025 14:09:56 +0100 Subject: [PATCH 08/11] Mod: Use new addObject(...) that requires additional changes --- src/App/OriginGroupExtension.cpp | 2 +- src/Mod/CAM/App/AppPathPy.cpp | 8 +-- src/Mod/Fem/App/AppFemPy.cpp | 3 +- src/Mod/Fem/App/FemVTKTools.cpp | 2 +- src/Mod/Measure/Gui/TaskMeasure.cpp | 17 +++--- src/Mod/Mesh/Gui/Segmentation.cpp | 3 +- src/Mod/Mesh/Gui/SegmentationBestFit.cpp | 3 +- src/Mod/Mesh/Gui/ViewProvider.cpp | 2 +- src/Mod/Part/Gui/DlgProjectionOnSurface.cpp | 3 +- src/Mod/Part/Gui/SectionCutting.cpp | 9 +-- src/Mod/Points/App/AppPointsPy.cpp | 7 +-- src/Mod/ReverseEngineering/Gui/Command.cpp | 3 +- .../ReverseEngineering/Gui/Segmentation.cpp | 3 +- .../Gui/SegmentationManual.cpp | 3 +- src/Mod/Sketcher/App/AppSketcherPy.cpp | 4 +- src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp | 4 +- src/Mod/Spreadsheet/Gui/Command.cpp | 5 +- src/Mod/TechDraw/App/DrawProjGroup.cpp | 58 +++++++++---------- .../TechDraw/Gui/TaskSurfaceFinishSymbols.cpp | 3 +- 19 files changed, 60 insertions(+), 82 deletions(-) diff --git a/src/App/OriginGroupExtension.cpp b/src/App/OriginGroupExtension.cpp index e709e38a1d..5b8a9a0163 100644 --- a/src/App/OriginGroupExtension.cpp +++ b/src/App/OriginGroupExtension.cpp @@ -158,7 +158,7 @@ App::DocumentObjectExecReturn* OriginGroupExtension::extensionExecute() App::DocumentObject* OriginGroupExtension::getLocalizedOrigin(App::Document* doc) { - App::DocumentObject* originObject = doc->addObject("App::Origin", "Origin"); + auto* originObject = doc->addObject("Origin"); QByteArray byteArray = tr("Origin").toUtf8(); originObject->Label.setValue(byteArray.constData()); return originObject; diff --git a/src/Mod/CAM/App/AppPathPy.cpp b/src/Mod/CAM/App/AppPathPy.cpp index ac3f14c2a4..5239ca7632 100644 --- a/src/Mod/CAM/App/AppPathPy.cpp +++ b/src/Mod/CAM/App/AppPathPy.cpp @@ -228,8 +228,7 @@ private: std::string gcode = buffer.str(); Path::Toolpath path; path.setFromGCode(gcode); - Path::Feature* object = static_cast( - pcDoc->addObject("Path::Feature", file.fileNamePure().c_str())); + auto* object = pcDoc->addObject(file.fileNamePure().c_str()); object->Path.setValue(path); pcDoc->recompute(); } @@ -254,9 +253,8 @@ private: if (!pcDoc) { pcDoc = App::GetApplication().newDocument(); } - Path::PathPy* pPath = static_cast(pcObj); - Path::Feature* pcFeature = - static_cast(pcDoc->addObject("Path::Feature", name)); + auto* pPath = static_cast(pcObj); + auto* pcFeature = pcDoc->addObject(name); Path::Toolpath* pa = pPath->getToolpathPtr(); if (!pa) { throw Py::Exception(PyExc_ReferenceError, "object doesn't reference a valid path"); diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index 232fe7a62d..b758250e02 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -168,8 +168,7 @@ private: #ifdef FC_USE_VTK if (FemPostPipeline::canRead(file)) { - FemPostPipeline* pcFeature = static_cast( - pcDoc->addObject("Fem::FemPostPipeline", file.fileNamePure().c_str())); + auto* pcFeature = pcDoc->addObject(file.fileNamePure().c_str()); pcFeature->Label.setValue(file.fileNamePure().c_str()); pcFeature->read(file); diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index f976c25251..ff9550584c 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -619,7 +619,7 @@ App::DocumentObject* FemVTKTools::readResult(const char* filename, App::Document } } - App::DocumentObject* mesh = pcDoc->addObject("Fem::FemMeshObject", "ResultMesh"); + auto* mesh = pcDoc->addObject("ResultMesh"); std::unique_ptr fmesh(new FemMesh()); importVTKMesh(dataset, fmesh.get()); static_cast(mesh->getPropertyByName("FemMesh"))->setValuePtr(fmesh.release()); diff --git a/src/Mod/Measure/Gui/TaskMeasure.cpp b/src/Mod/Measure/Gui/TaskMeasure.cpp index 9ed4d88ec0..f8dab48655 100644 --- a/src/Mod/Measure/Gui/TaskMeasure.cpp +++ b/src/Mod/Measure/Gui/TaskMeasure.cpp @@ -219,13 +219,12 @@ Measure::MeasureBase* TaskMeasure::createObject(const App::MeasureType* measureT auto pyMeasureClass = measureType->pythonClass; // Create a MeasurePython instance - auto featurePython = doc->addObject("Measure::MeasurePython", measureType->label.c_str()); - _mMeasureObject = dynamic_cast(featurePython); + _mMeasureObject = doc->addObject(measureType->label.c_str()); // Create an instance of the pyMeasureClass, the classe's initializer sets the object as // proxy Py::Tuple args(1); - args.setItem(0, Py::asObject(featurePython->getPyObject())); + args.setItem(0, Py::asObject(_mMeasureObject->getPyObject())); PyObject* result = PyObject_CallObject(pyMeasureClass, args.ptr()); Py_XDECREF(result); } @@ -249,8 +248,7 @@ void TaskMeasure::update() App::DocumentObject* sub = ob->getSubObject(sel.SubName); // Resolve App::Link - if (sub->isDerivedFrom()) { - auto link = static_cast(sub); + if (auto link = Base::freecad_dynamic_cast(sub)) { sub = link->getLinkedObject(true); } @@ -341,7 +339,7 @@ void TaskMeasure::initViewObject() dynamic_cast(viewObject)->positionAnno(_mMeasureObject); // Set the ShowDelta Property if it exists on the measurements view object - auto* prop = dynamic_cast(viewObject->getPropertyByName("ShowDelta")); + auto* prop = viewObject->getPropertyByName("ShowDelta"); setDeltaPossible(prop != nullptr); if (prop) { prop->setValue(showDelta->isChecked()); @@ -370,10 +368,9 @@ void TaskMeasure::ensureGroup(Measure::MeasureBase* measurement) if (!obj || !obj->isValid() || !obj->isDerivedFrom()) { - obj = doc->addObject("App::DocumentObjectGroup", - measurementGroupName, - true, - "MeasureGui::ViewProviderMeasureGroup"); + obj = doc->addObject(measurementGroupName, + true, + "MeasureGui::ViewProviderMeasureGroup"); } auto group = static_cast(obj); diff --git a/src/Mod/Mesh/Gui/Segmentation.cpp b/src/Mod/Mesh/Gui/Segmentation.cpp index fd6c1d2ca2..2170290c6d 100644 --- a/src/Mod/Mesh/Gui/Segmentation.cpp +++ b/src/Mod/Mesh/Gui/Segmentation.cpp @@ -120,8 +120,7 @@ void Segmentation::accept() std::string internalname = "Segments_"; internalname += myMesh->getNameInDocument(); - App::DocumentObjectGroup* group = static_cast( - document->addObject("App::DocumentObjectGroup", internalname.c_str())); + auto* group = document->addObject(internalname.c_str()); std::string labelname = "Segments "; labelname += myMesh->Label.getValue(); group->Label.setValue(labelname); diff --git a/src/Mod/Mesh/Gui/SegmentationBestFit.cpp b/src/Mod/Mesh/Gui/SegmentationBestFit.cpp index c3a020238a..22b85df072 100644 --- a/src/Mod/Mesh/Gui/SegmentationBestFit.cpp +++ b/src/Mod/Mesh/Gui/SegmentationBestFit.cpp @@ -505,8 +505,7 @@ void SegmentationBestFit::accept() std::string internalname = "Segments_"; internalname += myMesh->getNameInDocument(); - App::DocumentObjectGroup* group = static_cast( - document->addObject("App::DocumentObjectGroup", internalname.c_str())); + auto* group = document->addObject(internalname.c_str()); std::string labelname = "Segments "; labelname += myMesh->Label.getValue(); group->Label.setValue(labelname); diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 923073307a..dde4802bb6 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -1630,7 +1630,7 @@ void ViewProviderMesh::splitMesh(const MeshCore::MeshKernel& toolMesh, removeFacets(indices); auto doc = App::GetApplication().getActiveDocument(); const char* name = pcObject->getNameInDocument(); - auto splitMesh = dynamic_cast(doc->addObject("Mesh::Feature", name)); + auto splitMesh = doc->addObject(name); // Note: deletes also kernel splitMesh->Mesh.setValuePtr(kernel); getObject()->purgeTouched(); diff --git a/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp b/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp index 1bf794f2b6..1a9d35660a 100644 --- a/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp +++ b/src/Mod/Part/Gui/DlgProjectionOnSurface.cpp @@ -1556,8 +1556,7 @@ TaskProjectOnSurface::TaskProjectOnSurface(App::Document* doc) { setDocumentName(doc->getName()); doc->openTransaction(QT_TRANSLATE_NOOP("Command", "Project on surface")); - auto obj = doc->addObject("Part::ProjectOnSurface", "Projection"); - auto feature = dynamic_cast(obj); + auto feature = doc->addObject("Projection"); widget = new DlgProjectOnSurface(feature); taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("Part_ProjectionOnSurface"), widget->windowTitle(), true, nullptr); diff --git a/src/Mod/Part/Gui/SectionCutting.cpp b/src/Mod/Part/Gui/SectionCutting.cpp index bf7d5c2e12..e1ec8b856c 100644 --- a/src/Mod/Part/Gui/SectionCutting.cpp +++ b/src/Mod/Part/Gui/SectionCutting.cpp @@ -1019,13 +1019,10 @@ std::vector createLinks(App::Document* doc, const std::vec // if the object is part of an App::Part container, // the link needs to get the container placement - auto parents = itCuts->getInList(); - if (!parents.empty()) { + if (auto parents = itCuts->getInList(); !parents.empty()) { for (auto parent : parents) { if (auto pcPartParent = dynamic_cast(parent)) { - auto placement = Base::freecad_dynamic_cast( - pcPartParent->getPropertyByName("Placement")); - if (placement) { + if (auto placement = pcPartParent->getPropertyByName("Placement")) { pcLink->Placement.setValue(placement->getValue()); } } @@ -2421,7 +2418,7 @@ App::DocumentObject* SectionCut::createBooleanFragments( Part::Compound* SectionCut::createCompound(const std::vector& links, int transparency) { - auto CutCompoundPart = dynamic_cast(doc->addObject("Part::Compound", CompoundName)); + auto CutCompoundPart = doc->addObject(CompoundName); if (!CutCompoundPart) { throw Base::RuntimeError((std::string("SectionCut error: ") + std::string(CompoundName) + std::string(" could not be added\n")).c_str()); diff --git a/src/Mod/Points/App/AppPointsPy.cpp b/src/Mod/Points/App/AppPointsPy.cpp index 677c3059c4..fb6aa8cbde 100644 --- a/src/Mod/Points/App/AppPointsPy.cpp +++ b/src/Mod/Points/App/AppPointsPy.cpp @@ -295,8 +295,7 @@ private: pcFeature->purgeTouched(); } else { - Points::Feature* pcFeature = static_cast( - pcDoc->addObject("Points::Feature", file.fileNamePure().c_str())); + auto* pcFeature = pcDoc->addObject(file.fileNamePure().c_str()); pcFeature->Points.setValue(reader->getPoints()); pcDoc->recomputeFeature(pcFeature); pcFeature->purgeTouched(); @@ -413,8 +412,8 @@ private: if (!pcDoc) { pcDoc = App::GetApplication().newDocument(); } - PointsPy* pPoints = static_cast(pcObj); - Points::Feature* pcFeature = pcDoc->addObject(name); + auto* pPoints = static_cast(pcObj); + auto* pcFeature = pcDoc->addObject(name); // copy the data pcFeature->Points.setValue(*(pPoints->getPointKernelPtr())); return Py::asObject(pcFeature->getPyObject()); diff --git a/src/Mod/ReverseEngineering/Gui/Command.cpp b/src/Mod/ReverseEngineering/Gui/Command.cpp index ef03de7103..ed92c81b48 100644 --- a/src/Mod/ReverseEngineering/Gui/Command.cpp +++ b/src/Mod/ReverseEngineering/Gui/Command.cpp @@ -497,8 +497,7 @@ void CmdSegmentationFromComponents::activated(int) for (auto it : sel) { std::string internalname = "Segments_"; internalname += it->getNameInDocument(); - App::DocumentObjectGroup* group = static_cast( - doc->addObject("App::DocumentObjectGroup", internalname.c_str())); + auto* group = doc->addObject(internalname.c_str()); std::string labelname = "Segments "; labelname += it->Label.getValue(); group->Label.setValue(labelname); diff --git a/src/Mod/ReverseEngineering/Gui/Segmentation.cpp b/src/Mod/ReverseEngineering/Gui/Segmentation.cpp index a2046d3aae..54ab2b9d49 100644 --- a/src/Mod/ReverseEngineering/Gui/Segmentation.cpp +++ b/src/Mod/ReverseEngineering/Gui/Segmentation.cpp @@ -138,8 +138,7 @@ void Segmentation::accept() std::string internalname = "Segments_"; internalname += myMesh->getNameInDocument(); - App::DocumentObjectGroup* group = static_cast( - document->addObject("App::DocumentObjectGroup", internalname.c_str())); + auto* group = document->addObject(internalname.c_str()); std::string labelname = "Segments "; labelname += myMesh->Label.getValue(); group->Label.setValue(labelname); diff --git a/src/Mod/ReverseEngineering/Gui/SegmentationManual.cpp b/src/Mod/ReverseEngineering/Gui/SegmentationManual.cpp index b50e70cd10..55b7d376cb 100644 --- a/src/Mod/ReverseEngineering/Gui/SegmentationManual.cpp +++ b/src/Mod/ReverseEngineering/Gui/SegmentationManual.cpp @@ -295,8 +295,7 @@ void SegmentationManual::createSegment() algo.GetFacetsFlag(facets, MeshCore::MeshFacet::SELECTED); std::unique_ptr segment(mesh.meshFromSegment(facets)); - Mesh::Feature* feaSegm = - static_cast(adoc->addObject("Mesh::Feature", "Segment")); + auto* feaSegm = adoc->addObject("Segment"); Mesh::MeshObject* feaMesh = feaSegm->Mesh.startEditing(); feaMesh->swap(*segment); feaMesh->clearFacetSelection(); diff --git a/src/Mod/Sketcher/App/AppSketcherPy.cpp b/src/Mod/Sketcher/App/AppSketcherPy.cpp index 05eac05d99..00a6d937cb 100644 --- a/src/Mod/Sketcher/App/AppSketcherPy.cpp +++ b/src/Mod/Sketcher/App/AppSketcherPy.cpp @@ -95,8 +95,8 @@ private: } if (file.hasExtension("skf")) { - Sketcher::SketchObjectSF* pcFeature = static_cast( - pcDoc->addObject("Sketcher::SketchObjectSF", file.fileNamePure().c_str())); + auto filename = file.fileNamePure().c_str(); + auto* pcFeature = pcDoc->addObject(filename); pcFeature->SketchFlatFile.setValue(EncodedName.c_str()); pcDoc->recompute(); diff --git a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp index 1225f09123..3da6814815 100644 --- a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp +++ b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp @@ -69,8 +69,8 @@ private: { try { Base::FileInfo file(Name); - Spreadsheet::Sheet* pcSheet = static_cast( - pcDoc->addObject("Spreadsheet::Sheet", file.fileNamePure().c_str())); + auto filename = file.fileNamePure().c_str(); + auto* pcSheet = pcDoc->addObject(filename); pcSheet->importFromFile(Name, '\t', '"', '\\'); pcSheet->execute(); diff --git a/src/Mod/Spreadsheet/Gui/Command.cpp b/src/Mod/Spreadsheet/Gui/Command.cpp index b16e547755..edc1a4ecb8 100644 --- a/src/Mod/Spreadsheet/Gui/Command.cpp +++ b/src/Mod/Spreadsheet/Gui/Command.cpp @@ -200,9 +200,8 @@ void CmdSpreadsheetImport::activated(int iMsg) &selectedFilter); if (!fileName.isEmpty()) { std::string FeatName = getUniqueObjectName("Spreadsheet"); - Sheet* sheet = freecad_dynamic_cast( - App::GetApplication().getActiveDocument()->addObject("Spreadsheet::Sheet", - FeatName.c_str())); + auto* doc = App::GetApplication().getActiveDocument(); + Sheet* sheet = doc->addObject(FeatName.c_str()); if (sheet) { char delim, quote, escape; std::string errMsg = "Import"; diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 67994b22e4..6cc158927e 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -463,43 +463,39 @@ App::DocumentObject* DrawProjGroup::addProjection(const char* viewProjType) if (checkViewProjType(viewProjType) && !hasProjection(viewProjType)) { std::string FeatName = getDocument()->getUniqueObjectName("ProjItem"); - auto docObj(getDocument()->addObject("TechDraw::DrawProjGroupItem",//add to Document - FeatName.c_str())); - view = dynamic_cast(docObj); - if (!view && docObj) { + view = getDocument()->addObject(FeatName.c_str()); + if (!view) { //should never happen that we create a DPGI that isn't a DPGI!! Base::Console().Error("PROBLEM - DPG::addProjection - created a non DPGI! %s / %s\n", getNameInDocument(), viewProjType); throw Base::TypeError("Error: new projection is not a DPGI!"); } - if (view) {//coverity CID 151722 - // the label must be set before the view is added - view->Label.setValue(viewProjType); - // somewhere deep in DocumentObject, duplicate Labels have a numeric suffix applied, - // so we need to wait until that happens before building the translated label - view->translateLabel("DrawProjGroupItem", viewProjType, view->Label.getValue()); - addView(view);//from DrawViewCollection - view->Source.setValues(Source.getValues()); - view->XSource.setValues(XSource.getValues()); + // the label must be set before the view is added + view->Label.setValue(viewProjType); + // somewhere deep in DocumentObject, duplicate Labels have a numeric suffix applied, + // so we need to wait until that happens before building the translated label + view->translateLabel("DrawProjGroupItem", viewProjType, view->Label.getValue()); + addView(view);//from DrawViewCollection + view->Source.setValues(Source.getValues()); + view->XSource.setValues(XSource.getValues()); - // the Scale is already set by DrawView - view->Type.setValue(viewProjType); - if (strcmp(viewProjType, "Front") != 0) {//not Front! - vecs = getDirsFromFront(view); - view->Direction.setValue(vecs.first); - view->XDirection.setValue(vecs.second); - view->recomputeFeature(); - } - else {//Front - Anchor.setValue(view); - Anchor.purgeTouched(); - requestPaint();//make sure the group object is on the Gui page - view->LockPosition.setValue( - true);//lock "Front" position within DPG (note not Page!). - view->LockPosition.setStatus(App::Property::ReadOnly, - true);//Front should stay locked. - view->LockPosition.purgeTouched(); - } + // the Scale is already set by DrawView + view->Type.setValue(viewProjType); + if (strcmp(viewProjType, "Front") != 0) {//not Front! + vecs = getDirsFromFront(view); + view->Direction.setValue(vecs.first); + view->XDirection.setValue(vecs.second); + view->recomputeFeature(); + } + else {//Front + Anchor.setValue(view); + Anchor.purgeTouched(); + requestPaint();//make sure the group object is on the Gui page + view->LockPosition.setValue( + true);//lock "Front" position within DPG (note not Page!). + view->LockPosition.setStatus(App::Property::ReadOnly, + true);//Front should stay locked. + view->LockPosition.purgeTouched(); } } return view; diff --git a/src/Mod/TechDraw/Gui/TaskSurfaceFinishSymbols.cpp b/src/Mod/TechDraw/Gui/TaskSurfaceFinishSymbols.cpp index c61dd520ed..671a9dfc6e 100644 --- a/src/Mod/TechDraw/Gui/TaskSurfaceFinishSymbols.cpp +++ b/src/Mod/TechDraw/Gui/TaskSurfaceFinishSymbols.cpp @@ -397,8 +397,7 @@ bool TaskSurfaceFinishSymbols::accept() { Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Surface Finish Symbols")); App::Document *doc = Application::Instance->activeDocument()->getDocument(); - App::DocumentObject *docObject = doc->addObject("TechDraw::DrawViewSymbol", "SurfaceSymbol"); - TechDraw::DrawViewSymbol *surfaceSymbol = dynamic_cast(docObject); + auto* surfaceSymbol = doc->addObject("SurfaceSymbol"); surfaceSymbol->Symbol.setValue(completeSymbol()); surfaceSymbol->Rotation.setValue(ui->leAngle->text().toDouble()); From b99c1eae70bdf9753b20013b32f8271577957aa3 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Wed, 22 Jan 2025 20:16:51 +0100 Subject: [PATCH 09/11] App: Add GroupExtension::addObject(...) --- src/App/GroupExtension.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/App/GroupExtension.h b/src/App/GroupExtension.h index 4130023d23..8fa14f3eed 100644 --- a/src/App/GroupExtension.h +++ b/src/App/GroupExtension.h @@ -51,6 +51,11 @@ public: * append it to this group as well. */ virtual DocumentObject* addObject(const char* sType, const char* pObjectName); + /** Adds an object of \a T with \a pObjectName to the document this group belongs to and + * append it to this group as well. + */ + template + T* addObject(const char* pObjectName); /* Adds the object \a obj to this group. Returns all objects that have been added. */ virtual std::vector addObject(DocumentObject* obj); @@ -151,6 +156,13 @@ private: }; +template +T* GroupExtension::addObject(const char* pObjectName) +{ + static_assert(std::is_base_of::value, "T must be derived from DocumentObject"); + return static_cast(addObject(T::getClassName(), pObjectName)); +} + template class GroupExtensionPythonT: public ExtensionT { From 2107e603041b8e41dd23d4327e51a61738259147 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Wed, 22 Jan 2025 20:18:19 +0100 Subject: [PATCH 10/11] Mod: Use new GroupExtension::addObject(...) --- src/Mod/Fem/Gui/Command.cpp | 2 +- src/Mod/Mesh/Gui/Segmentation.cpp | 3 +-- src/Mod/Mesh/Gui/SegmentationBestFit.cpp | 3 +-- src/Mod/Mesh/Gui/ViewProviderCurvature.cpp | 3 +-- src/Mod/ReverseEngineering/Gui/Command.cpp | 3 +-- tests/src/Mod/Assembly/App/AssemblyObject.cpp | 3 +-- 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 610c3839c2..06fd5222a0 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -2755,7 +2755,7 @@ void CmdFemPostPipelineFromResult::activated(int) // create the pipeline object openCommand(QT_TRANSLATE_NOOP("Command", "Create pipeline from result")); if (foundAnalysis) { - pcAnalysis->addObject("Fem::FemPostPipeline", FeatName.c_str()); + pcAnalysis->addObject(FeatName.c_str()); } else { doCommand(Doc, diff --git a/src/Mod/Mesh/Gui/Segmentation.cpp b/src/Mod/Mesh/Gui/Segmentation.cpp index 2170290c6d..235ecd43d4 100644 --- a/src/Mod/Mesh/Gui/Segmentation.cpp +++ b/src/Mod/Mesh/Gui/Segmentation.cpp @@ -128,8 +128,7 @@ void Segmentation::accept() const std::vector& data = it->GetSegments(); for (const auto& jt : data) { Mesh::MeshObject* segment = mesh->meshFromSegment(jt); - Mesh::Feature* feaSegm = - static_cast(group->addObject("Mesh::Feature", "Segment")); + auto* feaSegm = group->addObject("Segment"); Mesh::MeshObject* feaMesh = feaSegm->Mesh.startEditing(); feaMesh->swap(*segment); feaSegm->Mesh.finishEditing(); diff --git a/src/Mod/Mesh/Gui/SegmentationBestFit.cpp b/src/Mod/Mesh/Gui/SegmentationBestFit.cpp index 22b85df072..4b9a59c718 100644 --- a/src/Mod/Mesh/Gui/SegmentationBestFit.cpp +++ b/src/Mod/Mesh/Gui/SegmentationBestFit.cpp @@ -513,8 +513,7 @@ void SegmentationBestFit::accept() const std::vector& data = it->GetSegments(); for (const auto& jt : data) { Mesh::MeshObject* segment = mesh->meshFromSegment(jt); - Mesh::Feature* feaSegm = - static_cast(group->addObject("Mesh::Feature", "Segment")); + auto* feaSegm = group->addObject("Segment"); Mesh::MeshObject* feaMesh = feaSegm->Mesh.startEditing(); feaMesh->swap(*segment); feaSegm->Mesh.finishEditing(); diff --git a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp index 7c3e18e4e4..db9768a15a 100644 --- a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp +++ b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp @@ -483,8 +483,7 @@ public: group = doc->addObject(internalname.c_str()); } - auto anno = dynamic_cast( - group->addObject("App::AnnotationLabel", internalname.c_str())); + auto anno = group->addObject(internalname.c_str()); QStringList lines = s.split(QLatin1String("\n")); std::vector text; for (const auto& line : lines) { diff --git a/src/Mod/ReverseEngineering/Gui/Command.cpp b/src/Mod/ReverseEngineering/Gui/Command.cpp index ed92c81b48..2b33f81ac8 100644 --- a/src/Mod/ReverseEngineering/Gui/Command.cpp +++ b/src/Mod/ReverseEngineering/Gui/Command.cpp @@ -506,8 +506,7 @@ void CmdSegmentationFromComponents::activated(int) std::vector> comps = mesh.getComponents(); for (const auto& jt : comps) { std::unique_ptr segment(mesh.meshFromSegment(jt)); - Mesh::Feature* feaSegm = - static_cast(group->addObject("Mesh::Feature", "Segment")); + auto* feaSegm = group->addObject("Segment"); Mesh::MeshObject* feaMesh = feaSegm->Mesh.startEditing(); feaMesh->swap(*segment); feaSegm->Mesh.finishEditing(); diff --git a/tests/src/Mod/Assembly/App/AssemblyObject.cpp b/tests/src/Mod/Assembly/App/AssemblyObject.cpp index 27e59c68b2..fb5a901442 100644 --- a/tests/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/tests/src/Mod/Assembly/App/AssemblyObject.cpp @@ -25,8 +25,7 @@ protected: _docName = App::GetApplication().getUniqueDocumentName("test"); auto _doc = App::GetApplication().newDocument(_docName.c_str(), "testUser"); _assemblyObj = _doc->addObject(); - _jointGroupObj = static_cast( - _assemblyObj->addObject("Assembly::JointGroup", "jointGroupTest")); + _jointGroupObj = _assemblyObj->addObject("jointGroupTest"); } void TearDown() override From 4b63d65ffabd16dc398f837e7eb959b947781ff6 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Mon, 27 Jan 2025 22:21:14 +0100 Subject: [PATCH 11/11] PD: Light refactoring of TaskFeaturePick::makeCopy --- src/Mod/PartDesign/Gui/TaskFeaturePick.cpp | 67 +++++++++------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp b/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp index 12144e2a23..10dbe8c322 100644 --- a/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp +++ b/src/Mod/PartDesign/Gui/TaskFeaturePick.cpp @@ -29,6 +29,8 @@ #include #endif +#include + #include #include #include @@ -351,9 +353,9 @@ TaskFeaturePick::makeCopy(App::DocumentObject* obj, std::string sub, bool indepe // we do know that the created instance is a document object, as obj is one. But we do not // know which exact type - auto name = std::string("Copy") + std::string(obj->getNameInDocument()); - copy = App::GetApplication().getActiveDocument()->addObject(obj->getTypeId().getName(), - name.c_str()); + auto* doc = App::GetApplication().getActiveDocument(); + const auto name = fmt::format("Copy{}", obj->getNameInDocument()); + copy = doc->addObject(obj->getTypeId().getName(), name.c_str()); // copy over all properties std::vector props; @@ -387,35 +389,23 @@ TaskFeaturePick::makeCopy(App::DocumentObject* obj, std::string sub, bool indepe // we are a independent copy, therefore no external geometry was copied. WE therefore // can delete all constraints - if (obj->isDerivedFrom()) { - static_cast(copy)->delConstraintsToExternal(); + if (auto* sketchObj = Base::freecad_dynamic_cast(obj)) { + sketchObj->delConstraintsToExternal(); } } } else { - std::string name; - if (!independent) { - name = std::string("Reference"); - } - else { - name = std::string("Copy"); - } - name += std::string(obj->getNameInDocument()); - - std::string entity; - if (!sub.empty()) { - entity = sub; - } + const std::string name = (!independent ? std::string("Reference") : std::string("Copy")) + + obj->getNameInDocument(); + const std::string entity = sub; Part::PropertyPartShape* shapeProp = nullptr; // TODO Replace it with commands (2015-09-11, Fat-Zer) if (obj->isDerivedFrom()) { - copy = App::GetApplication().getActiveDocument()->addObject(obj->getTypeId().getName(), - name.c_str()); - - assert(copy->isDerivedFrom()); + auto* doc = App::GetApplication().getActiveDocument(); + copy = doc->addObject(name.c_str()); // we need to reference the individual datums and make again datums. This is important // as datum adjust their size dependent on the part size, hence simply copying the shape @@ -453,43 +443,38 @@ TaskFeaturePick::makeCopy(App::DocumentObject* obj, std::string sub, bool indepe else if (obj->is() || obj->isDerivedFrom()) { - copy = App::GetApplication().getActiveDocument()->addObject("PartDesign::ShapeBinder", - name.c_str()); - + auto* doc = App::GetApplication().getActiveDocument(); + auto* shapeBinderObj = doc->addObject(name.c_str()); if (!independent) { - static_cast(copy)->Support.setValue(obj, entity.c_str()); + shapeBinderObj->Support.setValue(obj, entity.c_str()); } else { - shapeProp = &static_cast(copy)->Shape; + shapeProp = &shapeBinderObj->Shape; } + copy = shapeBinderObj; } else if (obj->isDerivedFrom() || obj->isDerivedFrom()) { - copy = App::GetApplication().getActiveDocument()->addObject("PartDesign::ShapeBinder", - name.c_str()); - + auto* doc = App::GetApplication().getActiveDocument(); + auto* shapeBinderObj = doc->addObject(name.c_str()); if (!independent) { - static_cast(copy)->Support.setValue(obj, entity.c_str()); + shapeBinderObj->Support.setValue(obj, entity.c_str()); } else { - App::GeoFeature* geo = static_cast(obj); std::vector subvalues; subvalues.push_back(entity); Part::TopoShape shape = - PartDesign::ShapeBinder::buildShapeFromReferences(geo, subvalues); - static_cast(copy)->Shape.setValue(shape); + PartDesign::ShapeBinder::buildShapeFromReferences(shapeBinderObj, subvalues); + shapeBinderObj->Shape.setValue(shape); } + copy = shapeBinderObj; } if (independent && shapeProp) { - if (entity.empty()) { - shapeProp->setValue(static_cast(obj)->Shape.getValue()); - } - else { - shapeProp->setValue( - static_cast(obj)->Shape.getShape().getSubShape(entity.c_str())); - } + auto* featureObj = static_cast(obj); + shapeProp->setValue(entity.empty() ? featureObj->Shape.getValue() + : featureObj->Shape.getShape().getSubShape(entity.c_str())); } }