void CopyGridLevel(MultiGrid& srcMG, Grid& destGrid, ISubsetHandler& srcSH, ISubsetHandler& destSH, int lvl, TAPos aPos) { Grid::VertexAttachmentAccessor<TAPos> aaPos(destGrid, aPos); Grid::VertexAttachmentAccessor<TAPos> aaSrcPos(srcMG, aPos); GridObjectCollection goc = srcMG.get_grid_objects(); AVertex aNewVrt; srcMG.attach_to_vertices(aNewVrt); Grid::VertexAttachmentAccessor<AVertex> aaNewVrt(srcMG, aNewVrt); for(int si = destSH.num_subsets(); si < srcSH.num_subsets(); ++si) { destSH.subset_info(si) = srcSH.subset_info(si); } for(VertexIterator vrtIter = goc.begin<Vertex>(lvl); vrtIter != goc.end<Vertex>(lvl); ++vrtIter) { Vertex* srcVrt = *vrtIter; Vertex* destVrt = *destGrid.create_by_cloning(srcVrt); aaNewVrt[srcVrt] = destVrt; aaPos[destVrt] = aaSrcPos[srcVrt]; destSH.assign_subset(destVrt, srcSH.get_subset_index(srcVrt)); } CopyGridLevelElements<Edge>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); CopyGridLevelElements<Face>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); CopyGridLevelElements<Volume>(srcMG, destGrid, srcSH, destSH, lvl, aNewVrt); srcMG.detach_from_vertices(aNewVrt); }
bool SaveGridHierarchyTransformed(MultiGrid& mg, ISubsetHandler& sh, const char* filename, number offset) { PROFILE_FUNC_GROUP("grid"); APosition aPos; // uses auto-attach Grid::AttachmentAccessor<Vertex, APosition> aaPos(mg, aPos, true); // copy the existing position to aPos. We take care of dimension differences. // Note: if the method was implemented for domains, this could be implemented // in a nicer way. if(mg.has_vertex_attachment(aPosition)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition, aPos); else if(mg.has_vertex_attachment(aPosition2)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition2, aPos); else if(mg.has_vertex_attachment(aPosition1)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition1, aPos); // iterate through all vertices and apply an offset depending on their level. for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ for(VertexIterator iter = mg.begin<Vertex>(lvl); iter != mg.end<Vertex>(lvl); ++iter) { aaPos[*iter].z() += (number)lvl * offset; } } // finally save the grid bool writeSuccess = SaveGridToFile(mg, sh, filename, aPos); // clean up mg.detach_from_vertices(aPos); return writeSuccess; }
bool SaveSurfaceViewTransformed(MultiGrid& mg, const SurfaceView& sv, const char* filename, number offset) { PROFILE_FUNC_GROUP("grid"); APosition aPos; // uses auto-attach Grid::AttachmentAccessor<Vertex, APosition> aaPos(mg, aPos, true); // copy the existing position to aPos. We take care of dimension differences. // Note: if the method was implemented for domains, this could be implemented // in a nicer way. if(mg.has_vertex_attachment(aPosition)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition, aPos); else if(mg.has_vertex_attachment(aPosition2)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition2, aPos); else if(mg.has_vertex_attachment(aPosition1)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition1, aPos); // iterate through all vertices and apply an offset depending on their level. for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ for(VertexIterator iter = mg.begin<Vertex>(lvl); iter != mg.end<Vertex>(lvl); ++iter) { aaPos[*iter].z() += (number)lvl * offset; } } // create a subset handler which holds different subsets for the different interface types SubsetHandler sh(mg); AssignSubsetsBySurfaceViewState<Vertex>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Edge>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Face>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Volume>(sh, sv, mg); AssignSubsetColors(sh); EraseEmptySubsets(sh); // finally save the grid bool writeSuccess = SaveGridToFile(mg, sh, filename, aPos); // clean up mg.detach_from_vertices(aPos); return writeSuccess; }