void CEdge::Blend(double radius, bool chamfer_not_fillet){ try{ CShape* body = GetParentBody(); if(body){ if(chamfer_not_fillet) { BRepFilletAPI_MakeChamfer chamfer(body->Shape()); for(std::list<CFace*>::iterator It = m_faces.begin(); It != m_faces.end(); It++) { CFace* face = *It; chamfer.Add(radius, m_topods_edge, TopoDS::Face(face->Face())); } TopoDS_Shape new_shape = chamfer.Shape(); wxGetApp().AddUndoably(new CSolid(*((TopoDS_Solid*)(&new_shape)), _("Solid with edge chamfer"), *(body->GetColor()), body->GetOpacity()), NULL, NULL); } else { BRepFilletAPI_MakeFillet fillet(body->Shape()); fillet.Add(radius, m_topods_edge); TopoDS_Shape new_shape = fillet.Shape(); wxGetApp().AddUndoably(new CSolid(*((TopoDS_Solid*)(&new_shape)), _("Solid with edge blend"), *(body->GetColor()), body->GetOpacity()), NULL, NULL); } wxGetApp().DeleteUndoably(body); } } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); wxMessageBox(wxString(chamfer_not_fillet ?_("Error making fillet"):_("Error making fillet")) + _T(": ") + Ctt(e->GetMessageString())); } catch(...) { wxMessageBox(chamfer_not_fillet ? _("A fatal error happened during Chamfer"):_("A fatal error happened during Blend")); } }// end Blend function
void CShape::FilletOrChamferEdges(std::list<HeeksObj*> &list, double radius, bool chamfer_not_fillet) { // make a map with a list of edges for each solid std::map< HeeksObj*, std::list< HeeksObj* > > solid_edge_map; for(std::list<HeeksObj*>::const_iterator It = list.begin(); It != list.end(); It++){ HeeksObj* edge = *It; if(edge->GetType() == EdgeType) { HeeksObj* solid = edge->HEEKSOBJ_OWNER->HEEKSOBJ_OWNER; if(solid && solid->GetType() == SolidType) { std::map< HeeksObj*, std::list< HeeksObj* > >::iterator FindIt = solid_edge_map.find(solid); if(FindIt == solid_edge_map.end()) { std::list< HeeksObj* > empty_list; solid_edge_map.insert( make_pair(solid, empty_list) ); FindIt = solid_edge_map.find(solid); } std::list< HeeksObj* > &list = FindIt->second; list.push_back(edge); } } } // do each solid for(std::map< HeeksObj*, std::list< HeeksObj* > >::iterator It = solid_edge_map.begin(); It != solid_edge_map.end(); It++) { HeeksObj* solid = It->first; std::list< HeeksObj* > &list = It->second; try{ if(chamfer_not_fillet) { BRepFilletAPI_MakeChamfer chamfer(((CShape*)solid)->Shape()); for(std::list< HeeksObj* >::iterator It2 = list.begin(); It2 != list.end(); It2++) { CEdge* edge = (CEdge*)(*It2); for(CFace* face = (CFace*)(edge->GetFirstFace()); face; face = (CFace*)(edge->GetNextFace())) { chamfer.Add(radius, TopoDS::Edge(edge->Edge()), TopoDS::Face(face->Face())); } } TopoDS_Shape new_shape = chamfer.Shape(); wxGetApp().Add(new CSolid(*((TopoDS_Solid*)(&new_shape)), _("Solid with edge blend"), *(solid->GetColor()), ((CShape*)solid)->m_opacity), NULL); wxGetApp().Remove(solid); } else { BRepFilletAPI_MakeFillet fillet(((CShape*)solid)->Shape()); for(std::list< HeeksObj* >::iterator It2 = list.begin(); It2 != list.end(); It2++) { fillet.Add(radius, TopoDS::Edge(((CEdge*)(*It2))->Edge())); } TopoDS_Shape new_shape = fillet.Shape(); wxGetApp().Add(new CSolid(*((TopoDS_Solid*)(&new_shape)), _("Solid with edge blend"), *(solid->GetColor()), ((CShape*)solid)->m_opacity), NULL); wxGetApp().Remove(solid); } } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); wxMessageBox(wxString(_("Error making fillet")) + _T(": ") + Ctt(e->GetMessageString())); } catch(...) { wxMessageBox(_("A fatal error happened during Blend")); } } wxGetApp().Repaint(); }