Improve ruled surface feature
This commit is contained in:
parent
fad26c93a5
commit
d07fc16268
|
@ -24,6 +24,10 @@
|
||||||
#include "PreCompiled.h"
|
#include "PreCompiled.h"
|
||||||
#ifndef _PreComp_
|
#ifndef _PreComp_
|
||||||
# include <BRepFill.hxx>
|
# include <BRepFill.hxx>
|
||||||
|
# include <BRepAdaptor_Curve.hxx>
|
||||||
|
# include <BRepAdaptor_HCurve.hxx>
|
||||||
|
# include <BRepAdaptor_CompCurve.hxx>
|
||||||
|
# include <BRepAdaptor_HCompCurve.hxx>
|
||||||
# include <TopoDS.hxx>
|
# include <TopoDS.hxx>
|
||||||
# include <TopoDS_Face.hxx>
|
# include <TopoDS_Face.hxx>
|
||||||
# include <TopoDS_Shell.hxx>
|
# include <TopoDS_Shell.hxx>
|
||||||
|
@ -32,7 +36,9 @@
|
||||||
# include <ShapeAnalysis.hxx>
|
# include <ShapeAnalysis.hxx>
|
||||||
# include <TopTools_ListIteratorOfListOfShape.hxx>
|
# include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
# include <TopExp_Explorer.hxx>
|
# include <TopExp_Explorer.hxx>
|
||||||
|
# include <TopoDS.hxx>
|
||||||
# include <Precision.hxx>
|
# include <Precision.hxx>
|
||||||
|
# include <Handle_Adaptor3d_HCurve.hxx>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,10 +49,14 @@ using namespace Part;
|
||||||
|
|
||||||
PROPERTY_SOURCE(Part::RuledSurface, Part::Feature)
|
PROPERTY_SOURCE(Part::RuledSurface, Part::Feature)
|
||||||
|
|
||||||
|
const char* RuledSurface::OrientationEnums[] = {"Automatic","Forward","Reversed",NULL};
|
||||||
|
|
||||||
RuledSurface::RuledSurface()
|
RuledSurface::RuledSurface()
|
||||||
{
|
{
|
||||||
ADD_PROPERTY_TYPE(Curve1,(0),"Ruled Surface",App::Prop_None,"Curve of ruled surface");
|
ADD_PROPERTY_TYPE(Curve1,(0),"Ruled Surface",App::Prop_None,"Curve of ruled surface");
|
||||||
ADD_PROPERTY_TYPE(Curve2,(0),"Ruled Surface",App::Prop_None,"Curve of ruled surface");
|
ADD_PROPERTY_TYPE(Curve2,(0),"Ruled Surface",App::Prop_None,"Curve of ruled surface");
|
||||||
|
ADD_PROPERTY_TYPE(Orientation,((long)0),"Ruled Surface",App::Prop_None,"Orientation of ruled surface");
|
||||||
|
Orientation.setEnums(OrientationEnums);
|
||||||
}
|
}
|
||||||
|
|
||||||
short RuledSurface::mustExecute() const
|
short RuledSurface::mustExecute() const
|
||||||
|
@ -55,6 +65,8 @@ short RuledSurface::mustExecute() const
|
||||||
return 1;
|
return 1;
|
||||||
if (Curve2.isTouched())
|
if (Curve2.isTouched())
|
||||||
return 1;
|
return 1;
|
||||||
|
if (Orientation.isTouched())
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +121,60 @@ App::DocumentObjectExecReturn *RuledSurface::execute(void)
|
||||||
|
|
||||||
if (curve1.IsNull() || curve2.IsNull())
|
if (curve1.IsNull() || curve2.IsNull())
|
||||||
return new App::DocumentObjectExecReturn("Linked shapes are empty.");
|
return new App::DocumentObjectExecReturn("Linked shapes are empty.");
|
||||||
|
|
||||||
|
if (Orientation.getValue() == 0) {
|
||||||
|
// Automatic
|
||||||
|
Handle_Adaptor3d_HCurve a1;
|
||||||
|
Handle_Adaptor3d_HCurve a2;
|
||||||
|
if (curve1.ShapeType() == TopAbs_EDGE && curve2.ShapeType() == TopAbs_EDGE) {
|
||||||
|
BRepAdaptor_Curve adapt1(TopoDS::Edge(curve1));
|
||||||
|
BRepAdaptor_Curve adapt2(TopoDS::Edge(curve2));
|
||||||
|
a1 = new BRepAdaptor_HCurve(adapt1);
|
||||||
|
a2 = new BRepAdaptor_HCurve(adapt2);
|
||||||
|
}
|
||||||
|
else if (curve1.ShapeType() == TopAbs_WIRE && curve2.ShapeType() == TopAbs_WIRE) {
|
||||||
|
BRepAdaptor_CompCurve adapt1(TopoDS::Wire(curve1));
|
||||||
|
BRepAdaptor_CompCurve adapt2(TopoDS::Wire(curve2));
|
||||||
|
a1 = new BRepAdaptor_HCompCurve(adapt1);
|
||||||
|
a2 = new BRepAdaptor_HCompCurve(adapt2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!a1.IsNull() && !a2.IsNull()) {
|
||||||
|
// get end points of 1st curve
|
||||||
|
gp_Pnt p1 = a1->Value(a1->FirstParameter());
|
||||||
|
gp_Pnt p2 = a1->Value(a1->LastParameter());
|
||||||
|
if (curve1.Orientation() == TopAbs_REVERSED) {
|
||||||
|
std::swap(p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get end points of 2nd curve
|
||||||
|
gp_Pnt p3 = a2->Value(a2->FirstParameter());
|
||||||
|
gp_Pnt p4 = a2->Value(a2->LastParameter());
|
||||||
|
if (curve2.Orientation() == TopAbs_REVERSED) {
|
||||||
|
std::swap(p3, p4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form two triangles (P1,P2,P3) and (P4,P3,P2) and check their normals.
|
||||||
|
// If the dot product is negative then it's assumed that the resulting face
|
||||||
|
// is twisted, hence the 2nd edge is reversed.
|
||||||
|
gp_Vec v1(p1, p2);
|
||||||
|
gp_Vec v2(p1, p3);
|
||||||
|
gp_Vec n1 = v1.Crossed(v2);
|
||||||
|
|
||||||
|
gp_Vec v3(p4, p3);
|
||||||
|
gp_Vec v4(p4, p2);
|
||||||
|
gp_Vec n2 = v3.Crossed(v4);
|
||||||
|
|
||||||
|
if (n1.Dot(n2) < 0) {
|
||||||
|
curve2.Reverse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Orientation.getValue() == 2) {
|
||||||
|
// Reverse
|
||||||
|
curve2.Reverse();
|
||||||
|
}
|
||||||
|
|
||||||
if (curve1.ShapeType() == TopAbs_EDGE && curve2.ShapeType() == TopAbs_EDGE) {
|
if (curve1.ShapeType() == TopAbs_EDGE && curve2.ShapeType() == TopAbs_EDGE) {
|
||||||
TopoDS_Face face = BRepFill::Face(TopoDS::Edge(curve1), TopoDS::Edge(curve2));
|
TopoDS_Face face = BRepFill::Face(TopoDS::Edge(curve1), TopoDS::Edge(curve2));
|
||||||
this->Shape.setValue(face);
|
this->Shape.setValue(face);
|
||||||
|
|
|
@ -38,6 +38,7 @@ class RuledSurface : public Part::Feature
|
||||||
public:
|
public:
|
||||||
RuledSurface();
|
RuledSurface();
|
||||||
|
|
||||||
|
App::PropertyEnumeration Orientation;
|
||||||
App::PropertyLinkSub Curve1;
|
App::PropertyLinkSub Curve1;
|
||||||
App::PropertyLinkSub Curve2;
|
App::PropertyLinkSub Curve2;
|
||||||
|
|
||||||
|
@ -53,6 +54,9 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onChanged (const App::Property* prop);
|
void onChanged (const App::Property* prop);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const char* OrientationEnums[];
|
||||||
};
|
};
|
||||||
|
|
||||||
class Loft : public Part::Feature
|
class Loft : public Part::Feature
|
||||||
|
|
Loading…
Reference in New Issue
Block a user