Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Surface: add command to create surface from sections
- Loading branch information
Showing
13 changed files
with
1,015 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/*************************************************************************** | ||
* Copyright (c) 2020 Werner Mayer <wmayer[at]users.sourceforge.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 <BRepAdaptor_Curve.hxx> | ||
#include <BRepBuilderAPI_MakeFace.hxx> | ||
#include <Geom_BSplineSurface.hxx> | ||
#include <Geom_TrimmedCurve.hxx> | ||
#include <GeomAdaptor_Curve.hxx> | ||
#include <GeomFill_NSections.hxx> | ||
#include <TopLoc_Location.hxx> | ||
#include <TopoDS.hxx> | ||
#include <TopoDS_Face.hxx> | ||
#include <Precision.hxx> | ||
#include <Standard_Version.hxx> | ||
#endif | ||
|
||
#include "FeatureSections.h" | ||
#include <Base/Tools.h> | ||
#include <Base/Exception.h> | ||
|
||
using namespace Surface; | ||
|
||
PROPERTY_SOURCE(Surface::Sections, Part::Spline) | ||
|
||
Sections::Sections() | ||
{ | ||
ADD_PROPERTY_TYPE(NSections,(nullptr), "Sections", App::Prop_None, "Section curves"); | ||
NSections.setScope(App::LinkScope::Global); | ||
} | ||
|
||
Sections::~Sections() | ||
{ | ||
} | ||
|
||
App::DocumentObjectExecReturn *Sections::execute(void) | ||
{ | ||
TColGeom_SequenceOfCurve curveSeq; | ||
auto edge_obj = NSections.getValues(); | ||
auto edge_sub = NSections.getSubValues(); | ||
if (edge_obj.size() == edge_sub.size()) { | ||
for (std::size_t index = 0; index < edge_obj.size(); index++) { | ||
// get the part object | ||
App::DocumentObject* obj = edge_obj[index]; | ||
const std::string& sub = edge_sub[index]; | ||
if (obj && obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { | ||
// get the sub-edge of the part's shape | ||
const Part::TopoShape& shape = static_cast<Part::Feature*>(obj)->Shape.getShape(); | ||
TopoDS_Shape edge = shape.getSubShape(sub.c_str()); | ||
if (!edge.IsNull() && edge.ShapeType() == TopAbs_EDGE) { | ||
BRepAdaptor_Curve curve_adapt(TopoDS::Edge(edge)); | ||
const TopLoc_Location& loc = edge.Location(); | ||
Handle(Geom_TrimmedCurve) hCurve = new Geom_TrimmedCurve(curve_adapt.Curve().Curve(), | ||
curve_adapt.FirstParameter(), | ||
curve_adapt.LastParameter()); | ||
if (!loc.IsIdentity()) { | ||
hCurve->Transform(loc.Transformation()); | ||
} | ||
curveSeq.Append(hCurve); | ||
} | ||
} | ||
} | ||
} | ||
|
||
if (curveSeq.Length() < 2) | ||
return new App::DocumentObjectExecReturn("At least two sections are required."); | ||
|
||
GeomFill_NSections fillOp(curveSeq); | ||
fillOp.ComputeSurface(); | ||
|
||
Handle(Geom_BSplineSurface) aSurf = fillOp.BSplineSurface(); | ||
if (aSurf.IsNull()) | ||
return new App::DocumentObjectExecReturn("Failed to create surface from sections."); | ||
|
||
BRepBuilderAPI_MakeFace mkFace(aSurf | ||
#if OCC_VERSION_HEX >= 0x060502 | ||
, Precision::Confusion() | ||
#endif | ||
); | ||
|
||
Shape.setValue(mkFace.Face()); | ||
return StdReturn; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/*************************************************************************** | ||
* Copyright (c) 2020 Werner Mayer <wmayer[at]users.sourceforge.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 * | ||
* * | ||
***************************************************************************/ | ||
|
||
#ifndef SURFACE_FEATURESECTIONS_H | ||
#define SURFACE_FEATURESECTIONS_H | ||
|
||
#include <App/PropertyStandard.h> | ||
#include <App/PropertyUnits.h> | ||
#include <App/PropertyLinks.h> | ||
#include <Mod/Part/App/FeaturePartSpline.h> | ||
|
||
namespace Surface | ||
{ | ||
|
||
class SurfaceExport Sections : public Part::Spline | ||
{ | ||
PROPERTY_HEADER_WITH_OVERRIDE(Surface::Sections); | ||
|
||
public: | ||
Sections(); | ||
~Sections(); | ||
|
||
App::PropertyLinkSubList NSections; | ||
|
||
// recalculate the feature | ||
App::DocumentObjectExecReturn *execute(void) override; | ||
/// returns the type name of the view provider | ||
const char* getViewProviderName(void) const override { | ||
return "SurfaceGui::ViewProviderSections"; | ||
} | ||
}; | ||
|
||
}//Namespace Surface | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,6 +61,7 @@ | |
|
||
//opencascade | ||
#include "OpenCascadeAll.h" | ||
#include <GeomFill_NSections.hxx> | ||
|
||
#endif //_PreComp_ | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.