[cgma-dev] r2657 - cgm/trunk/geom/OCC
Tim Tautges
tautges at mcs.anl.gov
Wed Feb 25 13:50:04 CST 2009
That was fast... thanks!
- tim
jiangtao_ma at yahoo.com wrote:
> Author: janehu
> Date: 2009-02-25 13:39:48 -0600 (Wed, 25 Feb 2009)
> New Revision: 2657
>
> Modified:
> cgm/trunk/geom/OCC/OCCModifyEngine.cpp
> Log:
> Added prism for sides number not equal to 4, haven't tested it yet.
>
> Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp
> ===================================================================
> --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2009-02-24 18:00:34 UTC (rev 2656)
> +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2009-02-25 19:39:48 UTC (rev 2657)
> @@ -30,10 +30,12 @@
> #include "BRepBuilderAPI_TransitionMode.hxx"
> #include "BRepBuilderAPI_MakeWire.hxx"
> #include "BRepPrimAPI_MakeHalfSpace.hxx"
> +#include "BRepBuilderAPI_MakePolygon.hxx"
> #include "BRepBndLib.hxx"
> #include "IntersectionTool.hpp"
> #include "TopoDS_Shape.hxx"
> #include "TopAbs_Orientation.hxx"
> +#include "TopOpeBRep_Point2d.hxx"
> #include "TColgp_Array1OfPnt.hxx"
> #include "GC_MakeArcOfCircle.hxx"
> #include "GC_MakeCircle.hxx"
> @@ -1323,13 +1325,76 @@
> double minor) const
> {
> //currently OCC only support 4 sided prism
> - if (sides != 4)
> + if(major <= 0. || minor <= 0. || (major - minor) <= -TOL)
> {
> - PRINT_ERROR("Option not supported for OCC based geometry.\n");
> - return (BodySM*) NULL;
> + PRINT_ERROR("Major and minor radii must be greater than zero.\n");
> + return (BodySM*)NULL;
> }
>
> - return brick(2 * major, 2 * minor, height);
> + if (sides == 4)
> + return brick(2 * major, 2 * minor, height);
> +
> + DLIList<gp_Pnt> point_list;
> + double theta = 360.0/sides;
> + for(int n =1 ; n < sides; n++)
> + {
> + double angle = theta * n;
> + gp_Pnt v(-major * cos(angle), -major * sin(angle), -height/2.0);
> + point_list.append(v);
> + }
> +
> + TopoDS_Edge new_edge;
> + BRepBuilderAPI_MakePolygon poly_maker;
> + gp_Dir main_dir(0.0, 0.0, 1.0);
> + if (fabs(major - minor) < TOL)
> + {
> + Handle(Geom_Circle) curve_ptr;
> + gp_Pnt center = gp_Pnt( 0.0, 0.0, -height/2.0);
> + curve_ptr = GC_MakeCircle(center,main_dir, major);
> + new_edge = BRepBuilderAPI_MakeEdge(curve_ptr);
> + gp_Pnt v(0, -major, -height/2.0);
> + point_list.append(v);
> + for (int i = 0; i <sides; i++)
> + poly_maker.Add(point_list[i]);
> + poly_maker.Close();
> + }
> + else
> + {
> + gp_Pnt center(0.0, 0.0, -height/2.0);
> + gp_Dir x_dir(0.0, 1.0, 0.0);
> + gp_Ax2 Axis(center, main_dir, x_dir);
> + Handle(Geom_Curve) curve_ptr = GC_MakeEllipse(Axis, major, minor);
> + TopoDS_Edge new_edge = BRepBuilderAPI_MakeEdge(curve_ptr);
> + gp_Pnt v(0, -minor, -height/2.0);
> + gp_Pln plane(center, main_dir);
> + TopoDS_Face face = BRepBuilderAPI_MakeFace(plane);
> + for(int i = 0; i < (sides-1); i++)
> + {
> + curve_ptr = GC_MakeSegment(center, point_list[i]);
> + TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(curve_ptr);
> + TopOpeBRep_EdgesIntersector intersector;
> + intersector.SetFaces(face,face);
> + intersector.Perform(new_edge, edge);
> + assert(intersector.NbPoints() == 1);
> + TopOpeBRep_Point2d point2d = intersector.Point();
> + gp_Pnt new_v = point2d.Value();
> + poly_maker.Add(new_v);
> + }
> + poly_maker.Add(v);
> + poly_maker.Close();
> + }
> +
> + TopoDS_Wire wire = poly_maker.Wire();
> + TopoDS_Face base = BRepBuilderAPI_MakeFace(wire, Standard_True);
> + gp_Vec norm(main_dir);
> + BRepSweep_Prism swept(base, norm);
> + TopoDS_Shape new_shape = swept.Shape();
> + DLIList<TopologyBridge*> tbs;
> + tbs += OCCQueryEngine::instance()->populate_topology_bridge(new_shape);
> + assert(tbs.size() == 1);
> +
> + BodySM* bodysm = CAST_TO(tbs.get(), BodySM);
> + return bodysm;
> }
>
> //===============================================================================
>
>
--
================================================================
"You will keep in perfect peace him whose mind is
steadfast, because he trusts in you." Isaiah 26:3
Tim Tautges Argonne National Laboratory
(tautges at mcs.anl.gov) (telecommuting from UW-Madison)
phone: (608) 263-8485 1500 Engineering Dr.
fax: (608) 263-4499 Madison, WI 53706
More information about the cgma-dev
mailing list