PNamedShape CTiglAbstractGeometricComponent::GetMirroredLoft(void) { if (mySymmetryAxis == TIGL_NO_SYMMETRY) { PNamedShape nullShape; nullShape.reset(); return nullShape; } gp_Ax2 mirrorPlane; if (mySymmetryAxis == TIGL_X_Z_PLANE) { mirrorPlane = gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0.,1.,0.)); } else if (mySymmetryAxis == TIGL_X_Y_PLANE) { mirrorPlane = gp_Ax2(gp_Pnt(0,0,0),gp_Dir(0.,0.,1.)); } else if (mySymmetryAxis == TIGL_Y_Z_PLANE) { mirrorPlane = gp_Ax2(gp_Pnt(0,0,0),gp_Dir(1.,0.,0.)); } gp_Trsf theTransformation; theTransformation.SetMirror(mirrorPlane); BRepBuilderAPI_Transform myBRepTransformation(GetLoft()->Shape(), theTransformation); std::string mirrorName = GetLoft()->Name(); mirrorName += "M"; std::string mirrorShortName = GetLoft()->ShortName(); mirrorShortName += "M"; TopoDS_Shape mirroredShape = myBRepTransformation.Shape(); PNamedShape mirroredPNamedShape(new CNamedShape(*GetLoft())); mirroredPNamedShape->SetShape(mirroredShape); mirroredPNamedShape->SetName(mirrorName.c_str()); mirroredPNamedShape->SetShortName(mirrorShortName.c_str()); return mirroredPNamedShape; }
void line_arc_line(double tooth_angle) { double gap = gap_width(); double radius = gap/3; double clearance = gear_for_point->GetClearanceMM(); double line_length = clearance - radius; if(line_length < 0.0) { line_length = 0.0; radius = clearance; } gp_Pnt p1, p2, p1B, p2B; get_clearance_points(p1, p2, tooth_angle, 0.0); get_clearance_points(p1B, p2B, tooth_angle, line_length); gp_Pnt pm = mid_point(tooth_angle, line_length); gp_Circ c(gp_Ax2(pm, gp_Dir(0, 0, -1)), radius); if(line_length >= wxGetApp().m_geom_tol) sketch_for_gear->Add(new HLine(p1, p1B, &wxGetApp().current_color), NULL); double mid_span_line_length = gap - 2*radius; if(mid_span_line_length >= wxGetApp().m_geom_tol) { gp_Vec v(p1, p2); v.Normalize(); gp_Pnt p1C, p2C; get_clearance_points(p1C, p2C, tooth_angle, clearance); gp_Pnt two_arc_p1 = gp_Pnt(p1C.XYZ() + v.XYZ() * radius); gp_Pnt two_arc_p2 = gp_Pnt(two_arc_p1.XYZ() + v.XYZ() * mid_span_line_length); gp_Pnt pm1 = gp_Pnt(p1B.XYZ() + v.XYZ() * radius); gp_Pnt pm2 = gp_Pnt(pm1.XYZ() + v.XYZ() * mid_span_line_length); gp_Circ c1(gp_Ax2(pm1, gp_Dir(0, 0, -1)), radius); gp_Circ c2(gp_Ax2(pm2, gp_Dir(0, 0, -1)), radius); sketch_for_gear->Add(new HArc(p1B, two_arc_p1, c1, &wxGetApp().current_color), NULL); sketch_for_gear->Add(new HLine(two_arc_p1, two_arc_p2, &wxGetApp().current_color), NULL); sketch_for_gear->Add(new HArc(two_arc_p2, p2B, c2, &wxGetApp().current_color), NULL); } else { sketch_for_gear->Add(new HArc(p1B, p2B, c, &wxGetApp().current_color), NULL); } if(line_length >= wxGetApp().m_geom_tol) sketch_for_gear->Add(new HLine(p2B, p2, &wxGetApp().current_color), NULL); spline_points_for_gear.clear(); spline_points_for_gear.push_back(p2); }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcEllipseProfileDef* l, TopoDS_Shape& face) { double rx = l->SemiAxis1() * getValue(GV_LENGTH_UNIT); double ry = l->SemiAxis2() * getValue(GV_LENGTH_UNIT); if ( rx < ALMOST_ZERO || ry < ALMOST_ZERO ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } const bool rotated = ry > rx; gp_Trsf2d trsf; convert(l->Position(),trsf); gp_Ax2 ax = gp_Ax2(); if (rotated) { ax.Rotate(ax.Axis(), M_PI / 2.); std::swap(rx, ry); } ax.Transform(trsf); BRepBuilderAPI_MakeWire w; Handle(Geom_Ellipse) ellipse = new Geom_Ellipse(ax, rx, ry); TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(ellipse); w.Add(edge); TopoDS_Face f; bool success = convert_wire_to_face(w, f); if (success) face = f; return success; }
void CCuboid::SetFromXMLElement(TiXmlElement* pElem) { double l[3] = {0, 0, 0}; double d[3] = {0, 0, 1}; double x[3] = {1, 0, 0}; for(TiXmlAttribute* a = pElem->FirstAttribute(); a; a = a->Next()) { std::string name(a->Name()); if(name == "lx") {l[0] = a->DoubleValue();} else if(name == "ly"){l[1] = a->DoubleValue();} else if(name == "lz"){l[2] = a->DoubleValue();} else if(name == "dx"){d[0] = a->DoubleValue();} else if(name == "dy"){d[1] = a->DoubleValue();} else if(name == "dz"){d[2] = a->DoubleValue();} else if(name == "xx"){x[0] = a->DoubleValue();} else if(name == "xy"){x[1] = a->DoubleValue();} else if(name == "xz"){x[2] = a->DoubleValue();} else if(name == "wx"){m_x = a->DoubleValue();} else if(name == "wy"){m_y = a->DoubleValue();} else if(name == "wz"){m_z = a->DoubleValue();} } m_pos = gp_Ax2(make_point(l), make_vector(d), make_vector(x)); CSolid::SetFromXMLElement(pElem); }
void CCylinder::SetFromXMLElement(TiXmlElement* pElem) { // get the attributes double l[3] = {0, 0, 0}; double d[3] = {0, 0, 1}; double x[3] = {1, 0, 0}; for(TiXmlAttribute* a = pElem->FirstAttribute(); a; a = a->Next()) { std::string name(a->Name()); if(name == "lx") {l[0] = a->DoubleValue();} else if(name == "ly"){l[1] = a->DoubleValue();} else if(name == "lz"){l[2] = a->DoubleValue();} else if(name == "dx"){d[0] = a->DoubleValue();} else if(name == "dy"){d[1] = a->DoubleValue();} else if(name == "dz"){d[2] = a->DoubleValue();} else if(name == "xx"){x[0] = a->DoubleValue();} else if(name == "xy"){x[1] = a->DoubleValue();} else if(name == "xz"){x[2] = a->DoubleValue();} else if(name == "r"){m_radius = a->DoubleValue();} else if(name == "h"){m_height = a->DoubleValue();} } m_pos = gp_Ax2(make_point(l), make_vector(d), make_vector(x)); CSolid::SetFromXMLElement(pElem); }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcCircleHollowProfileDef* l, TopoDS_Shape& face) { const double r = l->Radius() * getValue(GV_LENGTH_UNIT); const double t = l->WallThickness() * getValue(GV_LENGTH_UNIT); if ( r == 0.0f || t == 0.0f ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } gp_Trsf2d trsf2d; bool has_position = true; #ifdef USE_IFC4 has_position = l->hasPosition(); #endif if (has_position) { IfcGeom::Kernel::convert(l->Position(), trsf2d); } gp_Ax2 ax = gp_Ax2().Transformed(trsf2d); BRepBuilderAPI_MakeWire outer; Handle(Geom_Circle) outerCircle = new Geom_Circle(ax, r); outer.Add(BRepBuilderAPI_MakeEdge(outerCircle)); BRepBuilderAPI_MakeFace mf(outer.Wire(), false); BRepBuilderAPI_MakeWire inner; Handle(Geom_Circle) innerCirlce = new Geom_Circle(ax, r-t); inner.Add(BRepBuilderAPI_MakeEdge(innerCirlce)); mf.Add(inner); ShapeFix_Shape sfs(mf.Face()); sfs.Perform(); face = TopoDS::Face(sfs.Shape()); return true; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcCircleProfileDef* l, TopoDS_Shape& face) { const double r = l->Radius() * getValue(GV_LENGTH_UNIT); if ( r == 0.0f ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } gp_Trsf2d trsf2d; bool has_position = true; #ifdef USE_IFC4 has_position = l->hasPosition(); #endif if (has_position) { IfcGeom::Kernel::convert(l->Position(), trsf2d); } gp_Ax2 ax = gp_Ax2().Transformed(trsf2d); Handle(Geom_Circle) circle = new Geom_Circle(ax, r); TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(circle); BRepBuilderAPI_MakeWire w; w.Add(edge); TopoDS_Face f; bool success = convert_wire_to_face(w, f); if (success) face = f; return success; }
void Run(){ gp_Vec v(line_for_tool->A->m_p, line_for_tool->B->m_p); CCone* new_object = new CCone(gp_Ax2(line_for_tool->A->m_p, v), 2.0, 1.0, v.Magnitude(), _("Cone"), HeeksColor(240, 240, 191), 1.0f); wxGetApp().CreateUndoPoint(); wxGetApp().Add(new_object,NULL); wxGetApp().Changed(); }
void occQt::makeRevol() { gp_Ax1 anAxis; // revol a vertex result is an edge. anAxis.SetLocation(gp_Pnt(0.0, 70.0, 0.0)); TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(2.0, 70.0, 0.0)); TopoDS_Shape aRevolVertex = BRepPrimAPI_MakeRevol(aVertex, anAxis); Handle_AIS_Shape anAisRevolVertex = new AIS_Shape(aRevolVertex); // revol an edge result is a face. anAxis.SetLocation(gp_Pnt(8.0, 70.0, 0.0)); TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Pnt(6.0, 70.0, 0.0), gp_Pnt(6.0, 70.0, 5.0)); TopoDS_Shape aRevolEdge = BRepPrimAPI_MakeRevol(anEdge, anAxis); Handle_AIS_Shape anAisRevolEdge = new AIS_Shape(aRevolEdge); // revol a wire result is a shell. anAxis.SetLocation(gp_Pnt(20.0, 70.0, 0.0)); anAxis.SetDirection(gp::DY()); TopoDS_Edge aCircleEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(gp_Pnt(15.0, 70.0, 0.0), gp::DZ()), 1.5)); TopoDS_Wire aCircleWire = BRepBuilderAPI_MakeWire(aCircleEdge); TopoDS_Shape aRevolCircle = BRepPrimAPI_MakeRevol(aCircleWire, anAxis, M_PI_2); Handle_AIS_Shape anAisRevolCircle = new AIS_Shape(aRevolCircle); // revol a face result is a solid. anAxis.SetLocation(gp_Pnt(30.0, 70.0, 0.0)); anAxis.SetDirection(gp::DY()); TopoDS_Edge aEllipseEdge = BRepBuilderAPI_MakeEdge(gp_Elips(gp_Ax2(gp_Pnt(25.0, 70.0, 0.0), gp::DZ()), 3.0, 2.0)); TopoDS_Wire aEllipseWire = BRepBuilderAPI_MakeWire(aEllipseEdge); TopoDS_Face aEllipseFace = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()), aEllipseWire); TopoDS_Shape aRevolEllipse = BRepPrimAPI_MakeRevol(aEllipseFace, anAxis, M_PI_4); Handle_AIS_Shape anAisRevolEllipse = new AIS_Shape(aRevolEllipse); anAisRevolVertex->SetColor(Quantity_NOC_LIMEGREEN); anAisRevolEdge->SetColor(Quantity_NOC_LINEN); anAisRevolCircle->SetColor(Quantity_NOC_MAGENTA1); anAisRevolEllipse->SetColor(Quantity_NOC_MAROON); mContext->Display(anAisRevolVertex); mContext->Display(anAisRevolEdge); mContext->Display(anAisRevolCircle); mContext->Display(anAisRevolEllipse); }
bool CFace::GetClosestPoint(const gp_Pnt &pos, gp_Pnt &closest_pnt)const{ BRepPrimAPI_MakeBox cuboid(gp_Ax2(pos, gp_Vec(1, 0, 0), gp_Vec(0, 1, 0)), 0.0001, 0.0001, 0.0001); BRepExtrema_DistShapeShape extrema(m_topods_face, cuboid.Shape()); if(extrema.Perform() != Standard_True)return false; closest_pnt = extrema.PointOnShape1(1); return true; }
void HeeksDxfRead::OnReadEllipse(const double* c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool dir) { gp_Dir up(0, 0, 1); if(!dir)up = -up; gp_Pnt pc = make_point(c); gp_Elips ellipse(gp_Ax2(pc, up), major_radius, minor_radius); ellipse.Rotate(gp_Ax1(pc,up),rotation); HEllipse* new_object = new HEllipse(ellipse, start_angle, end_angle, ActiveColorPtr(m_aci)); AddObject(new_object); }
static TopoDS_Solid MakeCylinder(const gp_Ax2& pos, double radius, double height) { gp_Ax2 pos2 = pos; if(height<0) { pos2 = gp_Ax2(pos.Location(), -(pos.Direction())); height = fabs(height); } return BRepPrimAPI_MakeCylinder(pos2, radius, height); }
void HeeksDxfRead::OnReadCircle(const double* s, const double* c, bool dir, bool hidden) { gp_Pnt p0 = make_point(s); //gp_Pnt p1 = make_point(e); gp_Dir up(0, 0, 1); if(!dir)up = -up; gp_Pnt pc = make_point(c); gp_Circ circle(gp_Ax2(pc, up), p0.Distance(pc)); HCircle* new_object = new HCircle(circle, hidden ? (&hidden_color) : ActiveColorPtr(m_aci)); if (m_thickness != 0.0) { new_object->m_thickness = m_thickness; for (int i = 0; i < 3; i++)new_object->m_extrusion_vector[i] = m_extrusion_vector[i]; } AddObject(new_object); }
bool CShape::GetExtents(double* extents, const double* orig, const double* xdir, const double* ydir, const double* zdir) { gp_Pnt p_orig(0, 0, 0); if(orig)p_orig = gp_Pnt(orig[0], orig[1], orig[2]); gp_Vec v_x(1, 0, 0); if(xdir)v_x = gp_Vec(xdir[0], xdir[1], xdir[2]); gp_Vec v_y(0, 1, 0); if(ydir)v_y = gp_Vec(ydir[0], ydir[1], ydir[2]); gp_Vec v_z(0, 0, 1); if(zdir)v_z = gp_Vec(zdir[0], zdir[1], zdir[2]); BRepPrimAPI_MakeBox cuboid_plus_x(gp_Ax2(gp_Pnt(p_orig.XYZ() + 2000000 * v_x.XYZ() + (-1000000) * v_z.XYZ() + (-1000000) * v_y.XYZ()), v_x, v_y), 1000000, 1000000, 1000000); BRepPrimAPI_MakeBox cuboid_minus_x(gp_Ax2(gp_Pnt(p_orig.XYZ() + (-2000000) * v_x.XYZ() + (-1000000) * v_z.XYZ() + (-1000000) * v_y.XYZ()), -v_x, v_z), 1000000, 1000000, 1000000); BRepPrimAPI_MakeBox cuboid_plus_y(gp_Ax2(gp_Pnt(p_orig.XYZ() + 2000000 * v_y.XYZ() + (-1000000) * v_z.XYZ() + (-1000000) * v_x.XYZ()), v_y, v_z), 1000000, 1000000, 1000000); BRepPrimAPI_MakeBox cuboid_minus_y(gp_Ax2(gp_Pnt(p_orig.XYZ() + (-2000000) * v_y.XYZ() + (-1000000) * v_z.XYZ() + (-1000000) * v_x.XYZ()), -v_y, v_x), 1000000, 1000000, 1000000); BRepPrimAPI_MakeBox cuboid_plus_z(gp_Ax2(gp_Pnt(p_orig.XYZ() + 2000000 * v_z.XYZ() + (-1000000) * v_x.XYZ() + (-1000000) * v_y.XYZ()), v_z, v_x), 1000000, 1000000, 1000000); BRepPrimAPI_MakeBox cuboid_minus_z(gp_Ax2(gp_Pnt(p_orig.XYZ() + (-2000000) * v_z.XYZ() + (-1000000) * v_x.XYZ() + (-1000000) * v_y.XYZ()), -v_z, v_y), 1000000, 1000000, 1000000); gp_Vec v_orig(p_orig.XYZ()); TopoDS_Solid shape[6] = { cuboid_minus_x, cuboid_minus_y, cuboid_minus_z, cuboid_plus_x, cuboid_plus_y, cuboid_plus_z }; gp_Vec vector[6] = { v_x, v_y, v_z, v_x, v_y, v_z }; for(int i = 0; i<6; i++){ BRepExtrema_DistShapeShape extrema(m_shape, shape[i]); extrema.Perform(); gp_Pnt p = extrema.PointOnShape1(1); gp_Vec v(p.XYZ()); double dp = v * vector[i]; double dp_o = v_orig * vector[i]; extents[i] = dp - dp_o; } return true; }
// static member function HeeksObj* HGear::ReadFromXMLElement(TiXmlElement* element) { HGear* new_object = new HGear(); element->Attribute("num_teeth", &new_object->m_num_teeth); element->Attribute("module", &new_object->m_module); element->Attribute("addendum_offset", &new_object->m_addendum_offset); element->Attribute("addendum_multiplier", &new_object->m_addendum_multiplier); element->Attribute("dedendum_multiplier", &new_object->m_dedendum_multiplier); element->Attribute("pressure_angle", &new_object->m_pressure_angle); element->Attribute("tip_relief", &new_object->m_tip_relief); element->Attribute("depth", &new_object->m_depth); element->Attribute("cone_half_angle", &new_object->m_cone_half_angle); element->Attribute("drawn_angle", &new_object->m_angle); double l[3] = {0.0, 0.0, 0.0}; double d[3] = {0.0, 0.0, 1.0}; double x[3] = {1.0, 0.0, 0.0}; element->Attribute("lx", &l[0]); element->Attribute("ly", &l[1]); element->Attribute("lz", &l[2]); element->Attribute("dx", &d[0]); element->Attribute("dy", &d[1]); element->Attribute("dz", &d[2]); element->Attribute("xx", &x[0]); element->Attribute("xy", &x[1]); element->Attribute("xz", &x[2]); new_object->m_pos = gp_Ax2(gp_Pnt(l[0], l[1], l[2]), gp_Dir(d[0], d[1], d[2]), gp_Dir(x[0], x[1], x[2])); new_object->ReadBaseXML(element); return new_object; }
void occQt::makeLoft() { // bottom wire. TopoDS_Edge aCircleEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(gp_Pnt(0.0, 80.0, 0.0), gp::DZ()), 1.5)); TopoDS_Wire aCircleWire = BRepBuilderAPI_MakeWire(aCircleEdge); // top wire. BRepBuilderAPI_MakePolygon aPolygon; aPolygon.Add(gp_Pnt(-3.0, 77.0, 6.0)); aPolygon.Add(gp_Pnt(3.0, 77.0, 6.0)); aPolygon.Add(gp_Pnt(3.0, 83.0, 6.0)); aPolygon.Add(gp_Pnt(-3.0, 83.0, 6.0)); aPolygon.Close(); BRepOffsetAPI_ThruSections aShellGenerator; BRepOffsetAPI_ThruSections aSolidGenerator(true); aShellGenerator.AddWire(aCircleWire); aShellGenerator.AddWire(aPolygon.Wire()); aSolidGenerator.AddWire(aCircleWire); aSolidGenerator.AddWire(aPolygon.Wire()); // translate the solid. gp_Trsf aTrsf; aTrsf.SetTranslation(gp_Vec(18.0, 0.0, 0.0)); BRepBuilderAPI_Transform aTransform(aSolidGenerator.Shape(), aTrsf); Handle_AIS_Shape anAisShell = new AIS_Shape(aShellGenerator.Shape()); Handle_AIS_Shape anAisSolid = new AIS_Shape(aTransform.Shape()); anAisShell->SetColor(Quantity_NOC_OLIVEDRAB); anAisSolid->SetColor(Quantity_NOC_PEACHPUFF); mContext->Display(anAisShell); mContext->Display(anAisSolid); }
CCuboid::CCuboid(const gp_Ax2& pos, double x, double y, double z, const wxChar* title, const HeeksColor& col, float opacity) :CSolid(BRepPrimAPI_MakeBox(gp_Ax2(pos.Location().XYZ() + gp_XYZ((x < 0) ? x:0.0, (y < 0) ? y:0.0, (z < 0) ? z:0.0), pos.Direction(), pos.XDirection()), fabs(x), fabs(y), fabs(z)), title, col, opacity) , m_pos(pos), m_x(x), m_y(y), m_z(z) { }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_EllipseDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IEllipse aCI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; if (aType == ELLIPSE_PNT_VEC_RR) { // Center gp_Pnt aP = gp::Origin(); Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); if (!aRefPoint.IsNull()) { TopoDS_Shape aShapePnt = aRefPoint->GetValue(); if (aShapePnt.ShapeType() != TopAbs_VERTEX) { Standard_ConstructionError::Raise ("Ellipse creation aborted: invalid center argument, must be a point"); } aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); } // Normal gp_Vec aV = gp::DZ(); Handle(GEOM_Function) aRefVector = aCI.GetVector(); if (!aRefVector.IsNull()) { TopoDS_Shape aShapeVec = aRefVector->GetValue(); if (aShapeVec.ShapeType() != TopAbs_EDGE) { Standard_ConstructionError::Raise ("Ellipse creation aborted: invalid normal vector argument, must be a vector or an edge"); } TopoDS_Edge anE = TopoDS::Edge(aShapeVec); TopoDS_Vertex V1, V2; TopExp::Vertices(anE, V1, V2, Standard_True); if (!V1.IsNull() && !V2.IsNull()) { aV = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); if (aV.Magnitude() < gp::Resolution()) { Standard_ConstructionError::Raise ("Ellipse creation aborted: normal vector of zero length is given"); } } } // Axes gp_Ax2 anAxes (aP, aV); // Main Axis vector Handle(GEOM_Function) aRefVectorMaj = aCI.GetVectorMajor(); if (!aRefVectorMaj.IsNull()) { TopoDS_Shape aShapeVec = aRefVectorMaj->GetValue(); if (aShapeVec.ShapeType() != TopAbs_EDGE) { Standard_ConstructionError::Raise ("Ellipse creation aborted: invalid major axis vector argument, must be a vector or an edge"); } TopoDS_Edge anE = TopoDS::Edge(aShapeVec); TopoDS_Vertex V1, V2; TopExp::Vertices(anE, V1, V2, Standard_True); if (!V1.IsNull() && !V2.IsNull()) { gp_Vec aVM (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); if (aVM.Magnitude() < gp::Resolution()) { Standard_ConstructionError::Raise ("Ellipse creation aborted: major axis vector of zero length is given"); } if (aV.IsParallel(aVM, Precision::Angular())) { Standard_ConstructionError::Raise ("Ellipse creation aborted: normal and major axis vectors are parallel"); } // Axes defined with main axis vector anAxes = gp_Ax2 (aP, aV, aVM); } } // Radiuses double radiusMaj = aCI.GetRMajor(); double radiusMin = aCI.GetRMinor(); if ( radiusMaj < radiusMin ) Standard_ConstructionError::Raise ("Ellipse creation aborted: a major radius is less that a minor one"); if ( radiusMin < 0.0 ) Standard_ConstructionError::Raise ("Ellipse creation aborted: raduis must be positive"); // Ellipse gp_Elips anEll (anAxes, radiusMaj, radiusMin); aShape = BRepBuilderAPI_MakeEdge(anEll).Edge(); } else if(aType == ELLIPSE_THREE_PNT) { Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); Handle(GEOM_Function) aRefPMajor = aCI.GetPMajor(); Handle(GEOM_Function) aRefPMinor = aCI.GetPMinor(); TopoDS_Shape aShCenter = aRefPoint->GetValue(); TopoDS_Shape aShMajor = aRefPMajor->GetValue(); TopoDS_Shape aShMinor = aRefPMinor->GetValue(); if (aShCenter.ShapeType() == TopAbs_VERTEX && aShMajor.ShapeType() == TopAbs_VERTEX && aShMinor.ShapeType() == TopAbs_VERTEX ) { gp_Pnt aCenter = BRep_Tool::Pnt(TopoDS::Vertex(aShCenter)); gp_Pnt aMajor = BRep_Tool::Pnt(TopoDS::Vertex(aShMajor)); gp_Pnt aMinor = BRep_Tool::Pnt(TopoDS::Vertex(aShMinor)); GC_MakeEllipse aEllipse( aMajor, aMinor, aCenter ); if (!aEllipse.IsDone()) { StdFail_NotDone::Raise("Ellipse operation can not be performed on the given vertices"); } Handle_Geom_TrimmedCurve aCurve = new Geom_TrimmedCurve(aEllipse.Value(), .0, 2*PI, Standard_True); aShape = BRepBuilderAPI_MakeEdge( aCurve ).Edge(); } } else { } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcSweptDiskSolid* l, TopoDS_Shape& shape) { TopoDS_Wire wire, section1, section2; bool hasInnerRadius = l->hasInnerRadius(); if (!convert_wire(l->Directrix(), wire)) { return false; } gp_Ax2 directrix; { gp_Pnt directrix_origin; gp_Vec directrix_tangent; TopExp_Explorer exp(wire, TopAbs_EDGE); TopoDS_Edge edge = TopoDS::Edge(exp.Current()); double u0, u1; Handle(Geom_Curve) crv = BRep_Tool::Curve(edge, u0, u1); crv->D1(u0, directrix_origin, directrix_tangent); directrix = gp_Ax2(directrix_origin, directrix_tangent); } const double r1 = l->Radius() * getValue(GV_LENGTH_UNIT); Handle(Geom_Circle) circle = new Geom_Circle(directrix, r1); section1 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(circle)); if (hasInnerRadius) { const double r2 = l->InnerRadius() * getValue(GV_LENGTH_UNIT); if (r2 < getValue(GV_PRECISION)) { // Subtraction of pipes with small radii is unstable. hasInnerRadius = false; } else { Handle(Geom_Circle) circle = new Geom_Circle(directrix, r2); section2 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(circle)); } } // NB: Note that StartParam and EndParam param are ignored and the assumption is // made that the parametric range over which to be swept matches the IfcCurve in // its entirety. // NB2: Contrary to IfcSurfaceCurveSweptAreaSolid the transition mode has been // set to create round corners as this has proven to work better with the types // of directrices encountered, which do not necessarily conform to a surface. { BRepOffsetAPI_MakePipeShell builder(wire); builder.Add(section1); builder.SetTransitionMode(BRepBuilderAPI_RoundCorner); builder.Build(); builder.MakeSolid(); shape = builder.Shape(); } if (hasInnerRadius) { BRepOffsetAPI_MakePipeShell builder(wire); builder.Add(section2); builder.SetTransitionMode(BRepBuilderAPI_RoundCorner); builder.Build(); builder.MakeSolid(); TopoDS_Shape inner = builder.Shape(); BRepAlgoAPI_Cut brep_cut(shape, inner); bool is_valid = false; if (brep_cut.IsDone()) { TopoDS_Shape result = brep_cut; ShapeFix_Shape fix(result); fix.Perform(); result = fix.Shape(); is_valid = BRepCheck_Analyzer(result).IsValid() != 0; if (is_valid) { shape = result; } } if (!is_valid) { Logger::Message(Logger::LOG_WARNING, "Failed to subtract inner radius void for:", l->entity); } } return true; }