Skip to content

Commit

Permalink
Surface: add command to create surface from sections
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Sep 26, 2020
1 parent 7616153 commit 3a8a6aa
Show file tree
Hide file tree
Showing 13 changed files with 1,015 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/Mod/Part/App/BSplineSurfacePyImp.cpp
Expand Up @@ -1514,6 +1514,7 @@ PyObject* BSplineSurfacePy::buildFromPolesMultsKnots(PyObject *args, PyObject *k

/*!
* \code
import math
c = Part.Circle()
c.Radius=50
c = c.trim(0, math.pi)
Expand Down
2 changes: 2 additions & 0 deletions src/Mod/Surface/App/AppSurface.cpp
Expand Up @@ -33,6 +33,7 @@
#include "FeatureCut.h"
#include "FeatureGeomFillSurface.h"
#include "FeatureExtend.h"
#include "FeatureSections.h"

#include <Base/Interpreter.h>
#include <Base/Parameter.h>
Expand Down Expand Up @@ -80,6 +81,7 @@ PyMOD_INIT_FUNC(Surface)
Surface::Cut ::init();
Surface::GeomFillSurface ::init();
Surface::Extend ::init();
Surface::Sections ::init();

PyMOD_Return(mod);
}
2 changes: 2 additions & 0 deletions src/Mod/Surface/App/CMakeLists.txt
Expand Up @@ -27,6 +27,8 @@ SET(Surface_SRCS
FeatureGeomFillSurface.h
FeatureFilling.cpp
FeatureFilling.h
FeatureSections.cpp
FeatureSections.h
FeatureSewing.cpp
FeatureSewing.h
FeatureCut.cpp
Expand Down
103 changes: 103 additions & 0 deletions src/Mod/Surface/App/FeatureSections.cpp
@@ -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;
}
54 changes: 54 additions & 0 deletions src/Mod/Surface/App/FeatureSections.h
@@ -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
1 change: 1 addition & 0 deletions src/Mod/Surface/App/PreCompiled.h
Expand Up @@ -61,6 +61,7 @@

//opencascade
#include "OpenCascadeAll.h"
#include <GeomFill_NSections.hxx>

#endif //_PreComp_

Expand Down
2 changes: 2 additions & 0 deletions src/Mod/Surface/Gui/AppSurfaceGui.cpp
Expand Up @@ -36,6 +36,7 @@
#include "Workbench.h"
#include "TaskGeomFillSurface.h"
#include "TaskFilling.h"
#include "TaskSections.h"

// use a different name to CreateCommand()
void CreateSurfaceCommands(void);
Expand Down Expand Up @@ -79,6 +80,7 @@ PyMOD_INIT_FUNC(SurfaceGui)
SurfaceGui::Workbench::init();
SurfaceGui::ViewProviderGeomFillSurface ::init();
SurfaceGui::ViewProviderFilling ::init();
SurfaceGui::ViewProviderSections ::init();

// SurfaceGui::ViewProviderCut::init();

Expand Down
4 changes: 4 additions & 0 deletions src/Mod/Surface/Gui/CMakeLists.txt
Expand Up @@ -28,6 +28,7 @@ set(SurfaceGui_MOC_HDRS
TaskFillingUnbound.h
TaskFillingVertex.h
TaskGeomFillSurface.h
TaskSections.h
)
fc_wrap_cpp(SurfaceGui_MOC_SRCS ${SurfaceGui_MOC_HDRS})
SOURCE_GROUP("Moc" FILES ${SurfaceGui_MOC_SRCS})
Expand All @@ -43,6 +44,7 @@ SET(SurfaceGui_UIC_SRCS
TaskFillingUnbound.ui
TaskFillingVertex.ui
TaskGeomFillSurface.ui
TaskSections.ui
)

if (BUILD_QT5)
Expand All @@ -62,6 +64,8 @@ SET(SurfaceGui_SRCS
TaskFillingVertex.h
TaskGeomFillSurface.cpp
TaskGeomFillSurface.h
TaskSections.cpp
TaskSections.h
AppSurfaceGui.cpp
Command.cpp
PreCompiled.cpp
Expand Down
30 changes: 30 additions & 0 deletions src/Mod/Surface/Gui/Command.cpp
Expand Up @@ -261,6 +261,35 @@ bool CmdSurfaceExtendFace::isActive(void)
return Gui::Selection().countObjectsOfType(Part::Feature::getClassTypeId()) == 1;
}

DEF_STD_CMD_A(CmdSurfaceSections)

CmdSurfaceSections::CmdSurfaceSections()
:Command("Surface_Sections")
{
sAppModule = "Surface";
sGroup = QT_TR_NOOP("Surface");
sMenuText = QT_TR_NOOP("Sections...");
sToolTipText = QT_TR_NOOP("Creates a surface from a series of section curves");
sStatusTip = QT_TR_NOOP("Creates a surface from a series of section curves");
sWhatsThis = "Surface_Sections";
//sPixmap = "Surface_Sections";
}

void CmdSurfaceSections::activated(int iMsg)
{
Q_UNUSED(iMsg);
std::string FeatName = getUniqueObjectName("Surface");

openCommand("Create surface");
doCommand(Doc, "App.ActiveDocument.addObject(\"Surface::Sections\",\"%s\")", FeatName.c_str());
doCommand(Doc, "Gui.ActiveDocument.setEdit('%s',0)", FeatName.c_str());
}

bool CmdSurfaceSections::isActive(void)
{
return hasActiveDocument();
}

void CreateSurfaceCommands(void)
{
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
Expand All @@ -270,4 +299,5 @@ void CreateSurfaceCommands(void)
rcCmdMgr.addCommand(new CmdSurfaceGeomFillSurface());
rcCmdMgr.addCommand(new CmdSurfaceCurveOnMesh());
rcCmdMgr.addCommand(new CmdSurfaceExtendFace());
rcCmdMgr.addCommand(new CmdSurfaceSections());
}

0 comments on commit 3a8a6aa

Please sign in to comment.