ON_Brep* MakeTwistedCube(ON_TextLog& error_log) { ON_3dPoint point[8] = { ON_3dPoint( 0.0, 0.0, 11.0), // Point A ON_3dPoint(10.0, 0.0, 12.0), // Point B ON_3dPoint(10.0, 8.0, 13.0), // Point C ON_3dPoint( 0.0, 6.0, 12.0), // Point D ON_3dPoint( 1.0, 2.0, 0.0), // Point E ON_3dPoint(10.0, 0.0, 0.0), // Point F ON_3dPoint(10.0, 7.0, -1.0), // Point G ON_3dPoint( 0.0, 6.0, 0.0), // Point H }; ON_Brep* brep = new ON_Brep(); // create eight vertices located at the eight points for (int i = 0; i < 8; i++) { ON_BrepVertex& v = brep->NewVertex(point[i]); v.m_tolerance = 0.0; // this example uses exact tolerance... reference // ON_BrepVertex for definition of non-exact data } // create 3d curve geometry - the orientations are arbitrarily // chosen so that the end vertices are in alphabetical order brep->m_C3.Append(TwistedCubeEdgeCurve(point[A], point[B])); // AB brep->m_C3.Append(TwistedCubeEdgeCurve(point[B], point[C])); // BC brep->m_C3.Append(TwistedCubeEdgeCurve(point[C], point[D])); // CD brep->m_C3.Append(TwistedCubeEdgeCurve(point[A], point[D])); // AD brep->m_C3.Append(TwistedCubeEdgeCurve(point[E], point[F])); // EF brep->m_C3.Append(TwistedCubeEdgeCurve(point[F], point[G])); // FG brep->m_C3.Append(TwistedCubeEdgeCurve(point[G], point[H])); // GH brep->m_C3.Append(TwistedCubeEdgeCurve(point[E], point[H])); // EH brep->m_C3.Append(TwistedCubeEdgeCurve(point[A], point[E])); // AE brep->m_C3.Append(TwistedCubeEdgeCurve(point[B], point[F])); // BF brep->m_C3.Append(TwistedCubeEdgeCurve(point[C], point[G])); // CG brep->m_C3.Append(TwistedCubeEdgeCurve(point[D], point[H])); // DH // create the 12 edges the connect the corners MakeTwistedCubeEdges( *brep ); // create the 3d surface geometry. the orientations are arbitrary so // some normals point into the cube and other point out... not sure why brep->m_S.Append(TwistedCubeSideSurface(point[A], point[B], point[C], point[D])); brep->m_S.Append(TwistedCubeSideSurface(point[B], point[F], point[G], point[C])); brep->m_S.Append(TwistedCubeSideSurface(point[F], point[E], point[H], point[G])); brep->m_S.Append(TwistedCubeSideSurface(point[E], point[A], point[D], point[H])); brep->m_S.Append(TwistedCubeSideSurface(point[E], point[F], point[B], point[A])); brep->m_S.Append(TwistedCubeSideSurface(point[D], point[C], point[G], point[H])); // create the faces MakeTwistedCubeFaces(*brep); if (!brep->IsValid()) { error_log.Print("Twisted cube b-rep is not valid!\n"); delete brep; brep = NULL; } return brep; }
static ON_Brep* MakeTwistedCube( ON_TextLog& error_log ) { // This example demonstrates how to construct a ON_Brep // with the topology shown below. // // // H-------e6-------G // / /| // / | / | // / e7 / e5 // / | / | // / e10 | // / | / | // e11 E- - e4- -/- - - F // / / / // / / / / // D---------e2-----C e9 // | / | / // | e8 | / // e3 / e1 / // | | / // | / | / // | |/ // A-------e0-------B // // ON_3dPoint point[8] = { ON_3dPoint( 0.0, 0.0, 0.0 ), // point A = geometry for vertex 0 ON_3dPoint( 10.0, 0.0, 0.0 ), // point B = geometry for vertex 1 ON_3dPoint( 10.0, 8.0, -1.0 ), // point C = geometry for vertex 2 ON_3dPoint( 0.0, 6.0, 0.0 ), // point D = geometry for vertex 3 ON_3dPoint( 1.0, 2.0, 11.0 ), // point E = geometry for vertex 4 ON_3dPoint( 10.0, 0.0, 12.0 ), // point F = geometry for vertex 5 ON_3dPoint( 10.0, 7.0, 13.0 ), // point G = geometry for vertex 6 ON_3dPoint( 0.0, 6.0, 12.0 ) // point H = geometry for vertex 7 }; ON_Brep* brep = new ON_Brep(); // create eight vertices located at the eight points int vi; for ( vi = 0; vi < 8; vi++ ) { ON_BrepVertex& v = brep->NewVertex(point[vi]); v.m_tolerance = 0.0; // this simple example is exact - for models with // non-exact data, set tolerance as explained in // definition of ON_BrepVertex. } // Create 3d curve geometry - the orientations are arbitrarily chosen // so that the end vertices are in alphabetical order. brep->m_C3.Append( TwistedCubeEdgeCurve( point[A], point[B] ) ); // line AB brep->m_C3.Append( TwistedCubeEdgeCurve( point[B], point[C] ) ); // line BC brep->m_C3.Append( TwistedCubeEdgeCurve( point[C], point[D] ) ); // line CD brep->m_C3.Append( TwistedCubeEdgeCurve( point[A], point[D] ) ); // line AD brep->m_C3.Append( TwistedCubeEdgeCurve( point[E], point[F] ) ); // line EF brep->m_C3.Append( TwistedCubeEdgeCurve( point[F], point[G] ) ); // line FG brep->m_C3.Append( TwistedCubeEdgeCurve( point[G], point[H] ) ); // line GH brep->m_C3.Append( TwistedCubeEdgeCurve( point[E], point[H] ) ); // line EH brep->m_C3.Append( TwistedCubeEdgeCurve( point[A], point[E] ) ); // line AE brep->m_C3.Append( TwistedCubeEdgeCurve( point[B], point[F] ) ); // line BF brep->m_C3.Append( TwistedCubeEdgeCurve( point[C], point[G] ) ); // line CG brep->m_C3.Append( TwistedCubeEdgeCurve( point[D], point[H] ) ); // line DH // Create the 12 edges that connect the corners of the cube. MakeTwistedCubeEdges( *brep ); // Create 3d surface geometry - the orientations are arbitrarily chosen so // that some normals point into the cube and others point out of the cube. brep->m_S.Append( TwistedCubeSideSurface( point[A], point[B], point[C], point[D] ) ); // ABCD brep->m_S.Append( TwistedCubeSideSurface( point[B], point[C], point[G], point[F] ) ); // BCGF brep->m_S.Append( TwistedCubeSideSurface( point[C], point[D], point[H], point[G] ) ); // CDHG brep->m_S.Append( TwistedCubeSideSurface( point[A], point[D], point[H], point[E] ) ); // ADHE brep->m_S.Append( TwistedCubeSideSurface( point[A], point[B], point[F], point[E] ) ); // ABFE brep->m_S.Append( TwistedCubeSideSurface( point[E], point[F], point[G], point[H] ) ); // EFGH // Create the CRhinoBrepFaces MakeTwistedCubeFaces( *brep ); if ( !brep->IsValid() ) { error_log.Print("Twisted cube b-rep is not valid.\n"); delete brep; brep = NULL; } //ON_BOOL32 bIsManifold; //ON_BOOL32 bHasBoundary; //ON_BOOL32 b = brep->IsManifold( &bIsManifold,&bHasBoundary ); return brep; }