157 lines
5.0 KiB
C++
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;
|
|
|
|
}
|