Files
create/src/Mod/PartDesign/App/FeatureAddSub.cpp
2024-12-02 10:57:30 -06:00

157 lines
5.0 KiB
C++

/***************************************************************************
* Copyright (c) 2011 Juergen Riegel <FreeCAD@juergen-riegel.net> *
* *
* 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 <Standard_Failure.hxx>
#endif
#include <App/FeaturePythonPyImp.h>
#include <Mod/Part/App/modelRefine.h>
#include "FeatureAddSub.h"
#include "FeaturePy.h"
using namespace PartDesign;
namespace PartDesign {
extern bool getPDRefineModelParameter();
PROPERTY_SOURCE(PartDesign::FeatureAddSub, PartDesign::Feature)
FeatureAddSub::FeatureAddSub()
{
ADD_PROPERTY(AddSubShape,(TopoDS_Shape()));
ADD_PROPERTY_TYPE(Refine,(0),"Part Design",(App::PropertyType)(App::Prop_None),"Refine shape (clean up redundant edges) after adding/subtracting");
this->Refine.setValue(getPDRefineModelParameter());
}
FeatureAddSub::Type FeatureAddSub::getAddSubType()
{
return addSubType;
}
short FeatureAddSub::mustExecute() const
{
if (Refine.isTouched())
return 1;
return PartDesign::Feature::mustExecute();
}
bool FeatureAddSub::onlyHasToRefine() const
{
if( ! Refine.isTouched()){
return false;
}
if (rawShape.isNull()){
return false;
}
std::vector<App::Property*> propList;
getPropertyList(propList);
for (auto prop : propList){
if (prop != &Refine
/*&& prop != &SuppressedShape*/
&& prop->isTouched()){
return false;
}
}
return true;
}
TopoShape FeatureAddSub::refineShapeIfActive(const TopoShape& oldShape, const RefineErrorPolicy onError) const
{
if (this->Refine.getValue()) {
TopoShape shape(oldShape);
// this->fixShape(shape); // Todo: Not clear that this is required
try{
return shape.makeElementRefine();
}
catch (Standard_Failure& err) {
if(onError == RefineErrorPolicy::Warn){
Base::Console().Warning((std::string("Refine failed: ") + err.GetMessageString()).c_str());
} else {
throw;
}
}
}
return oldShape;
}
void FeatureAddSub::getAddSubShape(Part::TopoShape &addShape, Part::TopoShape &subShape)
{
if (addSubType == Additive)
addShape = AddSubShape.getShape();
else if (addSubType == Subtractive)
subShape = AddSubShape.getShape();
}
}
namespace App {
/// @cond DOXERR
PROPERTY_SOURCE_TEMPLATE(PartDesign::FeatureAddSubPython, PartDesign::FeatureAddSub)
template<> const char* PartDesign::FeatureAddSubPython::getViewProviderName() const {
return "PartDesignGui::ViewProviderPython";
}
template<> PyObject* PartDesign::FeatureAddSubPython::getPyObject() {
if (PythonObject.is(Py::_None())) {
// ref counter is set to 1
PythonObject = Py::Object(new FeaturePythonPyT<PartDesign::FeaturePy>(this),true);
}
return Py::new_reference_to(PythonObject);
}
/// @endcond
// explicit template instantiation
template class PartDesignExport FeaturePythonT<PartDesign::FeatureAddSub>;
}
namespace PartDesign {
PROPERTY_SOURCE(PartDesign::FeatureAdditivePython, PartDesign::FeatureAddSubPython)
FeatureAdditivePython::FeatureAdditivePython()
{
addSubType = Additive;
}
FeatureAdditivePython::~FeatureAdditivePython() = default;
PROPERTY_SOURCE(PartDesign::FeatureSubtractivePython, PartDesign::FeatureAddSubPython)
FeatureSubtractivePython::FeatureSubtractivePython()
{
addSubType = Subtractive;
}
FeatureSubtractivePython::~FeatureSubtractivePython() = default;
}