void AreaSupport::generateSupportAreas(SliceDataStorage& storage, unsigned int layer_count, CommandSocket* commandSocket) { // initialization of supportAreasPerLayer for (unsigned int layer_idx = 0; layer_idx < layer_count ; layer_idx++) storage.support.supportLayers.emplace_back(); for(unsigned int mesh_idx = 0; mesh_idx < storage.meshes.size(); mesh_idx++) { SliceMeshStorage& mesh = storage.meshes[mesh_idx]; std::vector<Polygons> supportAreas; supportAreas.resize(layer_count, Polygons()); generateSupportAreas(storage, mesh_idx, layer_count, supportAreas, commandSocket); if (mesh.getSettingBoolean("support_roof_enable")) { generateSupportRoofs(storage, supportAreas, layer_count, mesh.getSettingInMicrons("layer_height"), mesh.getSettingInMicrons("support_roof_height"), commandSocket); } else { for (unsigned int layer_idx = 0; layer_idx < layer_count ; layer_idx++) { storage.support.supportLayers[layer_idx].supportAreas.add(supportAreas[layer_idx]); } } } for (unsigned int layer_idx = 0; layer_idx < layer_count ; layer_idx++) { storage.support.supportLayers[layer_idx].supportAreas = storage.support.supportLayers[layer_idx].supportAreas.unionPolygons(); } storage.support.generated = true; }
void AreaSupport::generateSupportAreas(SliceDataStorage& storage, unsigned int layer_count) { int max_layer_nr_support_mesh_filled; for (max_layer_nr_support_mesh_filled = storage.support.supportLayers.size() - 1; max_layer_nr_support_mesh_filled >= 0; max_layer_nr_support_mesh_filled--) { const SupportLayer& support_layer = storage.support.supportLayers[max_layer_nr_support_mesh_filled]; if (support_layer.supportAreas.size() > 0) { break; } } storage.support.layer_nr_max_filled_layer = std::max(storage.support.layer_nr_max_filled_layer, max_layer_nr_support_mesh_filled); for (int layer_nr = 0; layer_nr < max_layer_nr_support_mesh_filled; layer_nr++) { SupportLayer& support_layer = storage.support.supportLayers[max_layer_nr_support_mesh_filled]; support_layer.support_mesh = support_layer.support_mesh.unionPolygons(); } // initialization of supportAreasPerLayer if (layer_count > storage.support.supportLayers.size()) { // there might alsready be anti_overhang_area data in the supportLayers storage.support.supportLayers.resize(layer_count); } for (unsigned int mesh_idx = 0; mesh_idx < storage.meshes.size(); mesh_idx++) { SliceMeshStorage& mesh = storage.meshes[mesh_idx]; if (mesh.getSettingBoolean("infill_mesh") || mesh.getSettingBoolean("anti_overhang_mesh")) { continue; } std::vector<Polygons> supportAreas; supportAreas.resize(layer_count, Polygons()); generateSupportAreas(storage, mesh_idx, layer_count, supportAreas); if (mesh.getSettingBoolean("support_interface_enable")) { generateSupportInterface(storage, mesh, supportAreas, layer_count); } else { for (unsigned int layer_idx = 0; layer_idx < layer_count ; layer_idx++) { storage.support.supportLayers[layer_idx].supportAreas.add(supportAreas[layer_idx]); } } } for (unsigned int layer_idx = 0; layer_idx < layer_count ; layer_idx++) { Polygons& support_areas = storage.support.supportLayers[layer_idx].supportAreas; support_areas = support_areas.unionPolygons(); } }
void FffPolygonGenerator::slices2polygons(SliceDataStorage& storage, TimeKeeper& time_keeper) { if (commandSocket) commandSocket->beginSendSlicedObject(); // const unsigned int total_layers = storage.meshes.at(0).layers.size(); //layerparts2HTML(storage, "output/output.html"); for(unsigned int layer_number = 0; layer_number < total_layers; layer_number++) { processInsets(storage, layer_number); Progress::messageProgress(Progress::Stage::INSET, layer_number+1, total_layers, commandSocket); } removeEmptyFirstLayers(storage, getSettingInMicrons("layer_height"), total_layers); if (total_layers < 1) { log("Stopping process because there are no layers.\n"); return; } processOozeShield(storage, total_layers); Progress::messageProgressStage(Progress::Stage::SUPPORT, &time_keeper, commandSocket); for(SliceMeshStorage& mesh : storage.meshes) { generateSupportAreas(storage, &mesh, total_layers, commandSocket); for (unsigned int layer_idx = 0; layer_idx < total_layers; layer_idx++) { Polygons& support = storage.support.supportLayers[layer_idx].supportAreas; sendPolygons(SupportType, layer_idx, support, getSettingInMicrons("support_line_width")); } } if (getSettingBoolean("support_roof_enable")) { generateSupportRoofs(storage, commandSocket, getSettingInMicrons("layer_height"), getSettingInMicrons("support_roof_height")); } Progress::messageProgressStage(Progress::Stage::SKIN, &time_keeper, commandSocket); for(unsigned int layer_number = 0; layer_number < total_layers; layer_number++) { if (!getSettingBoolean("magic_spiralize") || static_cast<int>(layer_number) < getSettingAsCount("bottom_layers")) //Only generate up/downskin and infill for the first X layers when spiralize is choosen. { processSkins(storage, layer_number); } Progress::messageProgress(Progress::Stage::SKIN, layer_number+1, total_layers, commandSocket); } for(unsigned int layer_number = total_layers-1; layer_number > 0; layer_number--) { for(SliceMeshStorage& mesh : storage.meshes) combineSparseLayers(layer_number, mesh, mesh.settings->getSettingAsCount("fill_sparse_combine")); } processWipeTower(storage, total_layers); processDraftShield(storage, total_layers); processPlatformAdhesion(storage); }