[cgma-dev] r1634 - cgm/trunk/geom/OCC
janehu at mcs.anl.gov
janehu at mcs.anl.gov
Tue Mar 4 14:27:12 CST 2008
Author: janehu
Date: 2008-03-04 14:27:10 -0600 (Tue, 04 Mar 2008)
New Revision: 1634
Modified:
cgm/trunk/geom/OCC/OCCModifyEngine.cpp
Log:
Added planar_sheet, torus, cylinder for modifyengine, there's no simple way as in ACIS to make elliptical or polygon based cone shape, looking for ways to solve the geometry calculation problem.
Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-03-04 18:18:07 UTC (rev 1633)
+++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-03-04 20:27:10 UTC (rev 1634)
@@ -38,6 +38,10 @@
#include "GC_MakeTrimmedCylinder.hxx"
#include "Geom_BezierCurve.hxx"
#include "Handle_Geom_Plane.hxx"
+#include "BRepPrimAPI_MakePrism.hxx"
+#include "BRepPrimAPI_MakeCone.hxx"
+#include "BRepPrimAPI_MakeTorus.hxx"
+#include "GC_MakeEllipse.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include "BRepAdaptor_Surface.hxx"
#include "BRepBuilderAPI_MakeFace.hxx"
@@ -658,6 +662,8 @@
TopoDS_Edge* topo_edge = NULL;
//check no intersections of the TopoDS_Edge's.
+ //need to check that no intersection in the middle of the curves not at
+ //vertices.
for ( int i = 0 ; i < curve_list.size()-1 ; i++ )
{
for(int j = i+1; j < curve_list.size(); j ++)
@@ -1127,7 +1133,8 @@
CubitVector left_corner = center - 0.5 * extension;
gp_Pnt left_point(left_corner.x(), left_corner.y(), left_corner.z());
gp_Dir main_dir(axes[2].x(), axes[2].y(), axes[2].z());
- gp_Ax2 Axis(left_point, main_dir);
+ gp_Dir x_dir(axes[0].x(), axes[0].y(), axes[0].z());
+ gp_Ax2 Axis(left_point, main_dir, x_dir);
TopoDS_Solid S = BRepPrimAPI_MakeBox( Axis, extension.x(), extension.y(),
extension.z());
@@ -1142,26 +1149,26 @@
//===============================================================================
// Function : prism
// Member Type: PUBLIC
-// Description: create a prism with facets
-// Author : John Fowler
-// Date : 10/02
+// Description: create an OCC prism
+// Author : Jane Hu
+// Date : 03/08
//===============================================================================
-BodySM* OCCModifyEngine::prism( double /*height*/, int /*sides*/, double /*major*/,
- double /*minor*/) const
+BodySM* OCCModifyEngine::prism( double height, int sides, double major,
+ double minor) const
{
- PRINT_ERROR("Option not supported for mesh based geometry.\n");
+
return (BodySM*) NULL;
}
//===============================================================================
// Function : pyramid
// Member Type: PUBLIC
-// Description: create a pyramid with facets
+// Description: create an OCC pyramid
// Author : John Fowler
// Date : 10/02
//===============================================================================
-BodySM* OCCModifyEngine::pyramid( double /*height*/, int /*sides*/, double /*major*/,
- double /*minor*/, double /*top*/) const
+BodySM* OCCModifyEngine::pyramid( double height, int sides, double major,
+ double minor, double top) const
{
PRINT_ERROR("Option not supported for mesh based geometry.\n");
return (BodySM*) NULL;
@@ -1170,43 +1177,119 @@
//===============================================================================
// Function : cylinder
// Member Type: PUBLIC
-// Description: create a cylinder with facets
-// Author : John Fowler
-// Date : 10/02
+// Description: create an OCC cylinder, its base shape can be ellipse with
+// r1, r2 while r3 = 0; or it can be a cone with r1,
+// r3 while r2 = 0.
+// Author : Jane Hu
+// Date : 03/08
//===============================================================================
BodySM* OCCModifyEngine::cylinder( double hi, double r1, double r2, double r3 ) const
{
- PRINT_ERROR("Option not supported for mesh based geometry.\n");
- return (BodySM*) NULL;
+ if(r2 > 0 && r3 > 0)
+ {
+ PRINT_WARNING("Can not make elliptical cone for OCC engine.\n");
+ return (BodySM*) NULL;
+ }
+
+ TopoDS_Solid S;
+ if(r3 == 0)//elliptical cylinder
+ {
+ gp_Pnt center(0.0, 0.0, 0.0);
+ gp_Dir main_dir(0.0, 0.0, 1.0);
+ gp_Dir x_dir(1.0, 0.0, 0.0);
+ gp_Ax2 Axis(center, main_dir, x_dir);
+ Handle(Geom_Curve) curve_ptr = GC_MakeEllipse(Axis, r1, r2);
+ TopoDS_Edge new_edge = BRepBuilderAPI_MakeEdge(curve_ptr);
+ BRepBuilderAPI_MakeWire aWire(new_edge);
+
+ TopoDS_Wire test_Wire = aWire.Wire();
+
+ BRepBuilderAPI_MakeFace made_face(test_Wire);
+
+ if (!made_face.IsDone())
+ {
+ PRINT_ERROR("In OCCModifyEngine::cylinder\n"
+ " Cannot create elliptical surface for given radii.\n");
+ return (BodySM *)NULL;
+ }
+ TopoDS_Face test_face = made_face.Face();
+ gp_Vec V(0.0, 0.0, hi);
+ TopoDS_Shape S1 = BRepPrimAPI_MakePrism(test_face, V);
+ S = TopoDS::Solid(S1);
+ }
+
+ else // cone
+ S = BRepPrimAPI_MakeCone(r1, r3, hi);
+
+ Lump* lump = OCCQueryEngine::instance()->populate_topology_bridge(S,
+ CUBIT_TRUE);
+
+ if (lump == NULL)
+ return (BodySM*)NULL;
+
+ return CAST_TO(lump, OCCLump)->body();
}
//===============================================================================
// Function : torus
// Member Type: PUBLIC
-// Description: create a torus with facets
-// Author : John Fowler
-// Date : 10/02
+// Description: create an OCC torus
+// Author : Jane Hu
+// Date : 03/08
//===============================================================================
BodySM* OCCModifyEngine::torus( double r1, double r2 ) const
{
- PRINT_ERROR("Option not supported for mesh based geometry.\n");
- return (BodySM*) NULL;
+ if (r1 <= 0 || r2 <= 0)
+ return (BodySM*) NULL;
+
+ TopoDS_Solid S = BRepPrimAPI_MakeTorus(r1, r2);
+
+ Lump* lump = OCCQueryEngine::instance()->populate_topology_bridge(S,
+ CUBIT_TRUE);
+
+ if (lump == NULL)
+ return (BodySM*)NULL;
+
+ return CAST_TO(lump, OCCLump)->body();
}
//===============================================================================
// Function : planar_sheet
// Member Type: PUBLIC
-// Description: create a planar_sheet with facets
-// Author : John Fowler
-// Date : 10/02
+// Description: create an OCC planar_sheet with four vectors.
+// Author : Jane Hu
+// Date : 03/08
//===============================================================================
-BodySM* OCCModifyEngine::planar_sheet ( const CubitVector& /*p1*/,
- const CubitVector& /*p2*/,
- const CubitVector& /*p3*/,
- const CubitVector& /*p4*/ ) const
+BodySM* OCCModifyEngine::planar_sheet ( const CubitVector& p1,
+ const CubitVector& p2,
+ const CubitVector& p3,
+ const CubitVector& p4) const
{
- PRINT_ERROR("Option not supported for mesh based geometry.\n");
- return (BodySM*) NULL;
+ Point* point1 = make_Point(p1);
+ Point* point2 = make_Point(p2);
+ Point* point3 = make_Point(p3);
+ Point* point4 = make_Point(p4);
+ Curve * curve1 = make_Curve( point1, point2);
+ if (curve1 == NULL)
+ return (BodySM*) NULL;
+ Curve * curve2 = make_Curve( point2, point3);
+ if (curve2 == NULL)
+ return (BodySM*) NULL;
+ Curve * curve3 = make_Curve( point3, point4);
+ if (curve3 == NULL)
+ return (BodySM*) NULL;
+ Curve * curve4 = make_Curve( point4, point1);
+ if (curve4 == NULL)
+ return (BodySM*) NULL;
+ DLIList<Curve*> curves;
+ curves.append(curve1);
+ curves.append(curve2);
+ curves.append(curve3);
+ curves.append(curve4);
+ Surface* surface = make_Surface(PLANE_SURFACE_TYPE, curves);
+ if (surface == NULL)
+ return (BodySM*) NULL;
+ return CAST_TO(surface,OCCSurface)->my_body();
}
//===============================================================================
More information about the cgma-dev
mailing list