How to create 3d version of trapezoid

Hi,

 

I have this piece of code to create 3D version of trapezoid (a cuboid with two different heights). 

 

TopoDS_Compound aRes;

BRep_Builder aBuilder;

aBuilder.MakeCompound (aRes);

 

// Face 1 (Pointing towards negative x-axis)

gp_Pnt p1(-2.5, -2.5, -2.5);

gp_Pnt p2(-2.5, -2.5, 2.5);

gp_Pnt p3(-2.5, 2.5, 2.5);

gp_Pnt p4(-2.5, 2.5, -2.5);

Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(p1, p2);

Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(p2, p3);

Handle(Geom_TrimmedCurve) aSegment3 = GC_MakeSegment(p3, p4);

Handle(Geom_TrimmedCurve) aSegment4 = GC_MakeSegment(p4, p1);

TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aSegment1);

TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(aSegment2);

TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(aSegment3);

TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge(aSegment4);

TopoDS_Wire aWire1 = BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3, anEdge4);

TopoDS_Face face1 = BRepBuilderAPI_MakeFace(aWire1);

aBuilder.Add (aRes, aWire1);

aBuilder.Add (aRes, face1);

 

// Face 2 (Pointing towards positive x-axis)

gp_Pnt p5(2.5, -5, -2.5);

gp_Pnt p6(2.5, 5, -2.5);

gp_Pnt p7(2.5, 5, 2.5);

gp_Pnt p8(2.5, -5, 2.5);

Handle(Geom_TrimmedCurve) aSegment5 = GC_MakeSegment(p5, p6);

Handle(Geom_TrimmedCurve) aSegment6 = GC_MakeSegment(p6, p7);

Handle(Geom_TrimmedCurve) aSegment7 = GC_MakeSegment(p7, p8);

Handle(Geom_TrimmedCurve) aSegment8 = GC_MakeSegment(p8, p5);

TopoDS_Edge anEdge5 = BRepBuilderAPI_MakeEdge(aSegment5);

TopoDS_Edge anEdge6 = BRepBuilderAPI_MakeEdge(aSegment6);

TopoDS_Edge anEdge7 = BRepBuilderAPI_MakeEdge(aSegment7);

TopoDS_Edge anEdge8 = BRepBuilderAPI_MakeEdge(aSegment8);

TopoDS_Wire aWire2 = BRepBuilderAPI_MakeWire(anEdge5, anEdge6, anEdge7, anEdge8);

TopoDS_Face face2 = BRepBuilderAPI_MakeFace(aWire2);

aBuilder.Add (aRes, aWire2);

aBuilder.Add (aRes, face2);

 

// Face 3 (Pointing towards negative y-axis)

gp_Pnt p9(-2.5, -2.5, -2.5);

gp_Pnt p10(2.5, -5, -2.5);

gp_Pnt p11(2.5, -5, 2.5);

gp_Pnt p12(-2.5, -2.5, 2.5);

Handle(Geom_TrimmedCurve) aSegment9 = GC_MakeSegment(p9, p10);

Handle(Geom_TrimmedCurve) aSegment10 = GC_MakeSegment(p10, p11);

Handle(Geom_TrimmedCurve) aSegment11 = GC_MakeSegment(p11, p12);

Handle(Geom_TrimmedCurve) aSegment12 = GC_MakeSegment(p12, p9);

TopoDS_Edge anEdge9 = BRepBuilderAPI_MakeEdge(aSegment9);

TopoDS_Edge anEdge10 = BRepBuilderAPI_MakeEdge(aSegment10);

TopoDS_Edge anEdge11 = BRepBuilderAPI_MakeEdge(aSegment11);

TopoDS_Edge anEdge12 = BRepBuilderAPI_MakeEdge(aSegment12);

TopoDS_Wire aWire3 = BRepBuilderAPI_MakeWire(anEdge9, anEdge10, anEdge11, anEdge12);

TopoDS_Face face3 = BRepBuilderAPI_MakeFace(aWire3);

aBuilder.Add (aRes, aWire3);

aBuilder.Add (aRes, face3);

 

// Face 4 (Pointing towards positive y-axis)

gp_Pnt p13(-2.5, 2.5, -2.5);

gp_Pnt p14(2.5, 5, -2.5);

gp_Pnt p15(2.5, 5, 2.5);

gp_Pnt p16(-2.5, 2.5, 2.5);

Handle(Geom_TrimmedCurve) aSegment13 = GC_MakeSegment(p13, p14);

Handle(Geom_TrimmedCurve) aSegment14 = GC_MakeSegment(p14, p15);

Handle(Geom_TrimmedCurve) aSegment15 = GC_MakeSegment(p15, p16);

Handle(Geom_TrimmedCurve) aSegment16 = GC_MakeSegment(p16, p13);

TopoDS_Edge anEdge13 = BRepBuilderAPI_MakeEdge(aSegment13);

TopoDS_Edge anEdge14 = BRepBuilderAPI_MakeEdge(aSegment14);

TopoDS_Edge anEdge15 = BRepBuilderAPI_MakeEdge(aSegment15);

TopoDS_Edge anEdge16 = BRepBuilderAPI_MakeEdge(aSegment16);

TopoDS_Wire aWire4 = BRepBuilderAPI_MakeWire(anEdge13, anEdge14, anEdge15, anEdge16);

TopoDS_Face face4 = BRepBuilderAPI_MakeFace(aWire4);

aBuilder.Add (aRes, aWire4);

aBuilder.Add (aRes, face4);

 

// Face 5 (Pointing towards negative z-axis)

gp_Pnt p17(-2.5, -2.5, -2.5);

gp_Pnt p18(-2.5, 2.5, -2.5);

gp_Pnt p19(2.5, 5, -2.5);

gp_Pnt p20(2.5, -5, -2.5);

Handle(Geom_TrimmedCurve) aSegment17 = GC_MakeSegment(p17, p18);

Handle(Geom_TrimmedCurve) aSegment18 = GC_MakeSegment(p18, p19);

Handle(Geom_TrimmedCurve) aSegment19 = GC_MakeSegment(p19, p20);

Handle(Geom_TrimmedCurve) aSegment20 = GC_MakeSegment(p20, p17);

TopoDS_Edge anEdge17 = BRepBuilderAPI_MakeEdge(aSegment17);

TopoDS_Edge anEdge18 = BRepBuilderAPI_MakeEdge(aSegment18);

TopoDS_Edge anEdge19 = BRepBuilderAPI_MakeEdge(aSegment19);

TopoDS_Edge anEdge20 = BRepBuilderAPI_MakeEdge(aSegment20);

TopoDS_Wire aWire5 = BRepBuilderAPI_MakeWire(anEdge17, anEdge18, anEdge19, anEdge20);

TopoDS_Face face5 = BRepBuilderAPI_MakeFace(aWire5);

aBuilder.Add (aRes, aWire5);

aBuilder.Add (aRes, face5);

 

// Face 6 (Pointing towards positive z-axis)

gp_Pnt p21(-2.5, -2.5, 2.5);

gp_Pnt p22(-2.5, 2.5, 2.5);

gp_Pnt p23(2.5, 5, 2.5);

gp_Pnt p24(2.5, -5, 2.5);

Handle(Geom_TrimmedCurve) aSegment21 = GC_MakeSegment(p21, p22);

Handle(Geom_TrimmedCurve) aSegment22 = GC_MakeSegment(p22, p23);

Handle(Geom_TrimmedCurve) aSegment23 = GC_MakeSegment(p23, p24);

Handle(Geom_TrimmedCurve) aSegment24 = GC_MakeSegment(p24, p21);

TopoDS_Edge anEdge21 = BRepBuilderAPI_MakeEdge(aSegment21);

TopoDS_Edge anEdge22 = BRepBuilderAPI_MakeEdge(aSegment22);

TopoDS_Edge anEdge23 = BRepBuilderAPI_MakeEdge(aSegment23);

TopoDS_Edge anEdge24 = BRepBuilderAPI_MakeEdge(aSegment24);

TopoDS_Wire aWire6 = BRepBuilderAPI_MakeWire(anEdge21, anEdge22, anEdge23, anEdge24);

TopoDS_Face face6 = BRepBuilderAPI_MakeFace(aWire6);

aBuilder.Add (aRes, aWire6);

aBuilder.Add (aRes, face6);

 

I also have a box/cuboid object

gp_Pnt b2p1(0, 0, -1);

gp_Pnt b2p2(2, 2, 1);

TopoDS_Shape S1 = BRepPrimAPI_MakeBox(b2p1, b2p2);

 

This code crashes when it executes this statement

 

TopoDS_Shape fusedObject = BRepAlgoAPI_Fuse(S1, aRes);

 

What is it that I am doing wrong? Can experts help me out to perform Fuse operation of these two different versions of 3D objects?

 

Thanks

Rakesh Patil's picture

Hi,

It is crashing in Initialize function:

0   libTKBRep.7.0.0.dylib     0x0000000109ccb8fc TopoDS_Iterator::Initialize(TopoDS_Shape const&, unsigned int, unsigned int) + 92
1   fff.OccTest                       0x000000010992fb0e TopoDS_Iterator::TopoDS_Iterator(TopoDS_Shape const&, unsigned int, unsigned int) + 110 (TopoDS_Iterator.lxx:36)
2   fff.OccTest                       0x000000010992c509 TopoDS_Iterator::TopoDS_Iterator(TopoDS_Shape const&, unsigned int, unsigned int) + 41 (TopoDS_Iterator.lxx:37)
3   fff.OccTest                       0x0000000109928180 MainWindow::MakeBottle() + 9088 (mainwindow.cpp:241)
4   fff.OccTest                       0x0000000109925db7 MainWindow::MainWindow(QWidget*) + 167 (mainwindow.cpp:49)
5   fff.OccTest                       0x000000010992a81d MainWindow::MainWindow(QWidget*) + 29 (mainwindow.cpp:50)
6   fff.OccTest                       0x0000000109925c43 main + 67 (main.cpp:7)
7   fff.OccTest                       0x0000000109925bf4 start + 52

Thanks

Rakesh Patil's picture

Hi,

What might have gone wrong? I changed the orientation of the faces by inserting points in counter clock wise across all faces. Hoping this would solve, but it did not.

Please guide with some references/pointers.

Thanks