static void WriteSolids(std::wofstream &ofs) { std::set<int> stock_ids; wxGetApp().m_program->Stocks()->GetSolidIds(stock_ids); for(std::set<int>::iterator It = stock_ids.begin(); It != stock_ids.end(); It++) { int id = *It; HeeksObj* object = wxGetApp().GetIDObject(SolidType, id); if(object) { CBox box; object->GetBox(box); ofs<<"voxelcut.set_current_color("<<object->GetColor()->COLORREF_color()<<")\n"; double c[3]; box.Centre(c); ofs<<"toolpath.coords.add_block("<<c[0]<<", "<<c[1]<<", "<<box.MinZ()<<", "<<box.Width()<<", "<<box.Height()<<", "<<box.Depth()<<")\n"; } } }
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(); }