From 84c5d22ccb35b45f09b54d093a6f5ee7ba9a4418 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 5 Apr 2021 13:05:59 +0200 Subject: [PATCH] Part: implement Prism as extension --- src/Mod/Part/App/AppPart.cpp | 3 ++ src/Mod/Part/App/CMakeLists.txt | 2 + src/Mod/Part/App/PrismExtension.cpp | 79 +++++++++++++++++++++++++++++ src/Mod/Part/App/PrismExtension.h | 55 ++++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 src/Mod/Part/App/PrismExtension.cpp create mode 100644 src/Mod/Part/App/PrismExtension.h diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 8fe6ca350ba6..903e9e8e8fa5 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -147,6 +147,7 @@ #include "DatumFeature.h" #include "Attacher.h" #include "AttachExtension.h" +#include "PrismExtension.h" #include "FaceMaker.h" #include "FaceMakerCheese.h" #include "FaceMakerBullseye.h" @@ -346,6 +347,8 @@ PyMOD_INIT_FUNC(Part) Part::AttachExtension ::init(); Part::AttachExtensionPython ::init(); + Part::PrismExtension ::init(); + Part::Feature ::init(); Part::FeatureExt ::init(); Part::BodyBase ::init(); diff --git a/src/Mod/Part/App/CMakeLists.txt b/src/Mod/Part/App/CMakeLists.txt index 9adfcf8e3fcf..67478980de7c 100644 --- a/src/Mod/Part/App/CMakeLists.txt +++ b/src/Mod/Part/App/CMakeLists.txt @@ -188,6 +188,8 @@ SET(Features_SRCS DatumFeature.h AttachExtension.h AttachExtension.cpp + PrismExtension.cpp + PrismExtension.h ) SOURCE_GROUP("Features" FILES ${Features_SRCS}) diff --git a/src/Mod/Part/App/PrismExtension.cpp b/src/Mod/Part/App/PrismExtension.cpp new file mode 100644 index 000000000000..e6b020442c10 --- /dev/null +++ b/src/Mod/Part/App/PrismExtension.cpp @@ -0,0 +1,79 @@ +/*************************************************************************** + * Copyright (c) 2021 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#include "PreCompiled.h" +#ifndef _PreComp_ +# include +#endif + +#include "PrismExtension.h" +#include + + +using namespace Part; + +EXTENSION_PROPERTY_SOURCE(Part::PrismExtension, App::DocumentObjectExtension) + +PrismExtension::PrismExtension() +{ + EXTENSION_ADD_PROPERTY_TYPE(FirstAngle, (0.0f), "Prism", App::Prop_None, "Angle in first direction"); + EXTENSION_ADD_PROPERTY_TYPE(SecondAngle, (0.0f), "Prism", App::Prop_None, "Angle in second direction"); + + static const App::PropertyQuantityConstraint::Constraints angleConstraint = { -89.99999, 89.99999, 1.0 }; + FirstAngle.setConstraints(&angleConstraint); + SecondAngle.setConstraints(&angleConstraint); + + initExtensionType(PrismExtension::getExtensionClassTypeId()); +} + +PrismExtension::~PrismExtension() +{ +} + +short int PrismExtension::extensionMustExecute() +{ + if (FirstAngle.isTouched()) + return 1; + if (SecondAngle.isTouched()) + return 1; + return DocumentObjectExtension::extensionMustExecute(); +} + +App::DocumentObjectExecReturn *PrismExtension::extensionExecute() +{ + return App::DocumentObjectExtension::extensionExecute(); +} + +void PrismExtension::extensionOnChanged(const App::Property* prop) +{ + App::DocumentObjectExtension::extensionOnChanged(prop); +} + +TopoDS_Shape PrismExtension::makePrism(double height, const TopoDS_Face& face) const +{ + // the direction vector for the prism is the height for z and the given angle + BRepPrimAPI_MakePrism mkPrism(face, + gp_Vec(height * tan(Base::toRadians(FirstAngle.getValue())), + height * tan(Base::toRadians(SecondAngle.getValue())), + height)); + return mkPrism.Shape(); +} diff --git a/src/Mod/Part/App/PrismExtension.h b/src/Mod/Part/App/PrismExtension.h new file mode 100644 index 000000000000..42294ddde3dc --- /dev/null +++ b/src/Mod/Part/App/PrismExtension.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (c) 2021 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#ifndef PART_PRISM_EXTENSION_H +#define PART_PRISM_EXTENSION_H + +#include +#include +#include + +namespace Part +{ + +class PartExport PrismExtension : public App::DocumentObjectExtension +{ + EXTENSION_PROPERTY_HEADER(Part::PrismExtension); +public: + PrismExtension(); + virtual ~PrismExtension(); + + + App::PropertyAngle FirstAngle; + App::PropertyAngle SecondAngle; + + TopoDS_Shape makePrism(double height, const TopoDS_Face& face) const; + + virtual short int extensionMustExecute(void); + virtual App::DocumentObjectExecReturn *extensionExecute(void); + +protected: + virtual void extensionOnChanged(const App::Property* /*prop*/); +}; + +} // namespace Part + +#endif // PART_PRISM_EXTENSION_H