-using namespace std;
-#include "GEOMImpl_ShapeDriver.hxx"
-#include "GEOMImpl_IShapes.hxx"
-#include "GEOMImpl_IShapesOperations.hxx"
-#include "GEOMImpl_Types.hxx"
-#include "GEOM_Function.hxx"
+#include <Standard_Stream.hxx>
+
+#include <GEOMImpl_ShapeDriver.hxx>
+#include <GEOMImpl_IShapes.hxx>
+#include <GEOMImpl_IShapesOperations.hxx>
+#include <GEOMImpl_Types.hxx>
+#include <GEOMImpl_Block6Explorer.hxx>
+
+#include <GEOM_Function.hxx>
+
+// OCCT Includes
+#include <ShapeFix_Wire.hxx>
#include <BRep_Tool.hxx>
#include <BRep_Builder.hxx>
#include <BRepAlgo_FaceRestrictor.hxx>
-#include <BRepAlgo_Sewing.hxx>
+#include <BRepBuilderAPI_Sewing.hxx>
#include <BRepBuilderAPI_Copy.hxx>
#include <BRepTools_Quilt.hxx>
#include <BRepCheck.hxx>
#include <BRepCheck_Shell.hxx>
#include <BRepClass3d_SolidClassifier.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
-#include <BRepBuilderAPI_MakeFace.hxx>
#include <TopAbs.hxx>
#include <TopoDS.hxx>
Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
unsigned int ind, nbshapes = aShapes->Length();
- // add edges
+ TopoDS_Wire aWire;
+ B.MakeWire(aWire);
BRepBuilderAPI_MakeWire MW;
+ bool isMWDone = true;
+
+ // add edges
for (ind = 1; ind <= nbshapes; ind++) {
Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind));
TopoDS_Shape aShape_i = aRefShape->GetValue();
if (aShape_i.IsNull()) {
Standard_NullObject::Raise("Shape for wire construction is null");
}
- if (aShape_i.ShapeType() == TopAbs_EDGE)
- MW.Add(TopoDS::Edge(aShape_i));
- else if (aShape_i.ShapeType() == TopAbs_WIRE)
- MW.Add(TopoDS::Wire(aShape_i));
- else
+ if (aShape_i.ShapeType() == TopAbs_EDGE) {
+ B.Add(aWire, TopoDS::Edge(aShape_i));
+ MW.Add(TopoDS::Edge(aShape_i));
+ } else if (aShape_i.ShapeType() == TopAbs_WIRE) {
+ B.Add(aWire, TopoDS::Wire(aShape_i));
+ MW.Add(TopoDS::Wire(aShape_i));
+ } else {
Standard_TypeMismatch::Raise
("Shape for wire construction is neither an edge nor a wire");
+ }
+ if (!MW.IsDone()) {
+ // check status after each edge/wire addition, because the final status
+ // can be OK even in case, when some edges/wires was not accepted.
+ isMWDone = false;
+ }
}
- if (!MW.IsDone()) {
- Standard_ConstructionError::Raise("Wire construction failed");
+ if (isMWDone) {
+ aShape = MW;
+ } else {
+ // fix edges order
+ Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire;
+ aFW->Load(aWire);
+ aFW->FixReorder();
+
+ if (aFW->StatusReorder(ShapeExtend_FAIL1)) {
+ Standard_ConstructionError::Raise("Wire construction failed: several loops detected");
+ } else if (aFW->StatusReorder(ShapeExtend_FAIL)) {
+ Standard_ConstructionError::Raise("Wire construction failed");
+ } else if (aFW->StatusReorder(ShapeExtend_DONE2)) {
+ Standard_ConstructionError::Raise("Wire construction failed: some gaps detected");
+ } else {
+ }
+ aShape = aFW->WireAPIMake();
}
- aShape = MW;
} else if (aType == FACE_WIRE) {
Handle(GEOM_Function) aRefBase = aCI.GetBase();
("Shape for face construction is null or not a wire");
}
TopoDS_Wire W = TopoDS::Wire(aShapeBase);
- BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar());
- if (!MF.IsDone()) {
+ //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar());
+ //if (!MF.IsDone()) {
+ // Standard_ConstructionError::Raise("Face construction failed");
+ //}
+ //aShape = MF.Shape();
+ GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), aShape);
+ if (aShape.IsNull()) {
Standard_ConstructionError::Raise("Face construction failed");
}
- aShape = MF.Shape();
} else if (aType == FACE_WIRES) {
Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
+ int nbshapes = aShapes->Length();
+ if (nbshapes < 1) {
+ Standard_ConstructionError::Raise("No wires given");
+ }
// first wire
Handle(GEOM_Function) aRefWire = Handle(GEOM_Function)::DownCast(aShapes->Value(1));
TopoDS_Wire W = TopoDS::Wire(aWire);
// basic face
- BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar());
- if (!MF.IsDone()) {
+ //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar());
+ //if (!MF.IsDone()) {
+ // Standard_ConstructionError::Raise("Face construction failed");
+ //}
+ //TopoDS_Shape FFace = MF.Shape();
+ TopoDS_Shape FFace;
+ GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), FFace);
+ if (FFace.IsNull()) {
Standard_ConstructionError::Raise("Face construction failed");
}
- TopoDS_Shape FFace = MF.Shape();
- if (!FFace.IsNull()) {
- unsigned int ind, nbshapes = aShapes->Length();
- if (nbshapes == 1) {
- aShape = FFace;
-
- } else if (nbshapes >= 2) {
- TopoDS_Compound C;
- BRep_Builder aBuilder;
- aBuilder.MakeCompound(C);
- BRepAlgo_FaceRestrictor FR;
-
- TopAbs_Orientation OriF = FFace.Orientation();
- TopoDS_Shape aLocalS = FFace.Oriented(TopAbs_FORWARD);
- FR.Init(TopoDS::Face(aLocalS), Standard_False, Standard_True);
-
- for (ind = 1; ind <= nbshapes; ind++) {
- Handle(GEOM_Function) aRefWire_i =
- Handle(GEOM_Function)::DownCast(aShapes->Value(ind));
- TopoDS_Shape aWire_i = aRefWire_i->GetValue();
- if (aWire_i.IsNull() || aWire_i.ShapeType() != TopAbs_WIRE) {
- Standard_NullObject::Raise("Shape for face construction is null or not a wire");
- }
-
- FR.Add(TopoDS::Wire(aWire_i));
- }
-
- FR.Perform();
-
- if (FR.IsDone()) {
- int k = 0;
- TopoDS_Shape aFace;
- for (; FR.More(); FR.Next()) {
- aFace = FR.Current().Oriented(OriF);
- aBuilder.Add(C, aFace);
- k++;
- }
- if (k == 1) {
- aShape = aFace;
- } else {
- aShape = C;
- }
- }
+
+ if (nbshapes == 1) {
+ aShape = FFace;
+
+ } else {
+ TopoDS_Compound C;
+ BRep_Builder aBuilder;
+ aBuilder.MakeCompound(C);
+ BRepAlgo_FaceRestrictor FR;
+
+ TopAbs_Orientation OriF = FFace.Orientation();
+ TopoDS_Shape aLocalS = FFace.Oriented(TopAbs_FORWARD);
+ FR.Init(TopoDS::Face(aLocalS), Standard_False, Standard_True);
+
+ for (int ind = 1; ind <= nbshapes; ind++) {
+ Handle(GEOM_Function) aRefWire_i =
+ Handle(GEOM_Function)::DownCast(aShapes->Value(ind));
+ TopoDS_Shape aWire_i = aRefWire_i->GetValue();
+ if (aWire_i.IsNull() || aWire_i.ShapeType() != TopAbs_WIRE) {
+ Standard_NullObject::Raise("Shape for face construction is null or not a wire");
+ }
+
+ FR.Add(TopoDS::Wire(aWire_i));
+ }
+
+ FR.Perform();
+
+ if (FR.IsDone()) {
+ int k = 0;
+ TopoDS_Shape aFace;
+ for (; FR.More(); FR.Next()) {
+ aFace = FR.Current().Oriented(OriF);
+ aBuilder.Add(C, aFace);
+ k++;
+ }
+ if (k == 1) {
+ aShape = aFace;
+ } else {
+ aShape = C;
+ }
}
}
} else if (aType == SHELL_FACES) {
unsigned int ind, nbshapes = aShapes->Length();
// add faces
- BRepAlgo_Sewing aSewing(Precision::Confusion()*10.0);
+ BRepBuilderAPI_Sewing aSewing(Precision::Confusion()*10.0);
for (ind = 1; ind <= nbshapes; ind++) {
Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind));
TopoDS_Shape aShape_i = aRefShape->GetValue();
unsigned int ind, nbshapes = aShapes->Length();
Standard_Integer ish = 0;
TopoDS_Solid Sol;
- TopoDS_Compound Res;
- B.MakeCompound(Res);
+ B.MakeSolid(Sol);
// add shapes
for (ind = 1; ind <= nbshapes; ind++) {
Standard_NullObject::Raise("Shell for solid construction is null");
}
if (aShapeShell.ShapeType() == TopAbs_SHELL) {
- B.MakeSolid(Sol);
B.Add(Sol, aShapeShell);
- BRepClass3d_SolidClassifier SC (Sol);
- SC.PerformInfinitePoint(Precision::Confusion());
- if (SC.State() == TopAbs_IN) {
- B.MakeSolid(Sol);
- B.Add(Sol, aShapeShell.Reversed());
- }
- B.Add(Res, Sol);
ish++;
}
}
- if (ish == 1) aShape = Sol;
- else aShape = Res;
+ if ( ish == 0 ) return 0;
+ BRepClass3d_SolidClassifier SC (Sol);
+ SC.PerformInfinitePoint(Precision::Confusion());
+ switch (SC.State()) {
+ case TopAbs_IN:
+ aShape = Sol.Reversed(); break;
+ case TopAbs_OUT:
+ aShape = Sol; break;
+ default: // not closed shell?
+ return 0;
+ }
} else if (aType == COMPOUND_SHAPES) {
Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
if (aShape_i.IsNull()) {
Standard_NullObject::Raise("Shape for reverse is null");
}
-
+
BRepBuilderAPI_Copy Copy(aShape_i);
if( Copy.IsDone() ) {
TopoDS_Shape tds = Copy.Shape();
tds.Orientation(TopAbs_FORWARD) ;
aShape = tds;
- }
+ }
}
if (aShape.IsNull()) return 0;