diff --git a/src/meshlabplugins/filter_slice/filter_slice.cpp b/src/meshlabplugins/filter_slice/filter_slice.cpp index 65854e035..8edd33b08 100644 --- a/src/meshlabplugins/filter_slice/filter_slice.cpp +++ b/src/meshlabplugins/filter_slice/filter_slice.cpp @@ -265,22 +265,21 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich vcg::tri::UpdateTopology::FaceFace(base->cm); vcg::tri::UpdateNormals::PerVertexPerFace(base->cm); - MeshModel *slice1= new MeshModel(); + MeshModel *slice1= m.addNewMesh("slice"); //m.meshList.push_back(slice1); - QString layername; - slice1->setFileName("slice"); // mesh name + QString layername; slice1->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); vcg::tri::UpdateSelection::VertexFromQualityRange(base->cm,VERTEX_LEFT,VERTEX_LEFT); vcg::tri::UpdateSelection::FaceFromVertexLoose(base->cm); createSlice(base,slice1); vcg::tri::UpdateFlags::FaceBorderFromNone(slice1->cm); - MeshModel* cap= new MeshModel(); - m.meshList.push_back(cap); - cap->setFileName("plane"); // mesh name + MeshModel* cap= m.addNewMesh("plane"); + //m.meshList.push_back(cap); cap->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); capHole(slice1,cap); - delete slice1; + //delete slice1; + m.delMesh(slice1); vcg::tri::UpdateTopology::FaceFace(cap->cm); vcg::tri::UpdateNormals::PerVertexPerFace(cap->cm); vcg::tri::UpdateBounding::Box(cap->cm); @@ -296,7 +295,7 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich if(parlst.getBool("capBase")) { - MeshModel* cap= new MeshModel(); + MeshModel* cap= m.addNewMesh("slices"); capHole(m.mm(),cap); tri::Append::Mesh(m.mm()->cm, cap->cm); m.mm()->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); @@ -372,10 +371,11 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich vcg::tri::UpdateTopology::FaceFace(base->cm); vcg::tri::UpdateNormals::PerVertexPerFace(base->cm); - MeshModel *slice1= new MeshModel(); - m.meshList.push_back(slice1); QString layername; layername.sprintf("slice_%d-%d.ply",i,i+1); + MeshModel *slice1= m.addNewMesh(qPrintable(layername)); + //m.meshList.push_back(slice1); + slice1->setFileName(layername); // mesh name slice1->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); vcg::tri::UpdateSelection::VertexFromQualityRange(base->cm,VERTEX_LEFT,VERTEX_LEFT); @@ -386,20 +386,21 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich createSlice(base,slice1); vcg::tri::UpdateFlags::FaceBorderFromNone(slice1->cm); - MeshModel* cap= new MeshModel(); - m.meshList.push_back(cap); layername.sprintf("plane_%d.ply",i+1); + MeshModel* cap= m.addNewMesh(qPrintable(layername)); + //m.meshList.push_back(cap); + cap->setFileName(layername); // mesh name cap->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); capHole(slice1,cap); if (eps!=0) { - MeshModel* dup= new MeshModel(); - m.meshList.push_back(dup); layername.sprintf("plane_%d_extruded.ply",i+1); + MeshModel* dup= m.addNewMesh(qPrintable(layername)); + //m.meshList.push_back(dup); dup->setFileName(layername); // mesh name dup->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); - extrude(cap, dup, eps, planeAxis); + extrude(&m,cap, dup, eps, planeAxis); } if (hidePlanes) cap->visible=false; @@ -410,9 +411,9 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich vcg::tri::UpdateNormals::PerVertexPerFace(slice1->cm); vcg::tri::UpdateBounding::Box(slice1->cm); - MeshModel* slice2= new MeshModel(); - m.meshList.push_back(slice2); layername.sprintf("slice_%d-%d.ply",i+1,i+2); + MeshModel* slice2= m.addNewMesh(qPrintable(layername)); + //m.meshList.push_back(slice2); slice2->setFileName(layername); // mesh name slice2->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); vcg::tri::UpdateSelection::VertexFromQualityRange(base->cm,VERTEX_RIGHT,VERTEX_RIGHT); @@ -468,7 +469,7 @@ bool ExtraFilter_SlicePlugin::applyFilter(QAction *filter, MeshDocument &m, Rich return true; } -void ExtraFilter_SlicePlugin::extrude(MeshModel* orig, MeshModel* dest, float eps, Point3f planeAxis) +void ExtraFilter_SlicePlugin::extrude(MeshDocument* doc,MeshModel* orig, MeshModel* dest, float eps, Point3f planeAxis) { tri::Append::Mesh(dest->cm, orig->cm); tri::UpdateTopology::FaceFace(dest->cm); @@ -505,7 +506,7 @@ void ExtraFilter_SlicePlugin::extrude(MeshModel* orig, MeshModel* dest, float ep } if (nv<2) return; //I have at least 3 vertexes - MeshModel* tempMesh= new MeshModel(); + MeshModel* tempMesh= doc->addNewMesh("temp mesh"); tri::Append::Mesh(tempMesh->cm, orig->cm); for (int i=0;icm.vert.size();i++) tempMesh->cm.vert[i].P()+=planeAxis*eps/2; @@ -513,7 +514,7 @@ void ExtraFilter_SlicePlugin::extrude(MeshModel* orig, MeshModel* dest, float ep tri::Append::Mesh(dest->cm, tempMesh->cm); delete tempMesh; //create the new mesh and the triangulation between the clones - tempMesh= new MeshModel(); + tempMesh=doc->addNewMesh("temp mesh 2"); CMeshO::VertexIterator vi=vcg::tri::Allocator::AddVertices(tempMesh->cm,2*nv); //I have at least 6 vertexes @@ -592,7 +593,7 @@ bool ExtraFilter_SlicePlugin::autoDialog(QAction *action) void ExtraFilter_SlicePlugin::createSlice(MeshModel* currentMesh, MeshModel* destMesh) { - tri::Append::Mesh(destMesh->cm, currentMesh->cm, true); + tri::Append::Mesh(destMesh->cm, currentMesh->cm/*, true*/); tri::UpdateTopology::FaceFace(destMesh->cm); tri::UpdateBounding::Box(destMesh->cm); // updates bounding box destMesh->cm.Tr = currentMesh->cm.Tr; // copy transformation diff --git a/src/meshlabplugins/filter_slice/filter_slice.h b/src/meshlabplugins/filter_slice/filter_slice.h index aeb716f6c..f76fdc766 100644 --- a/src/meshlabplugins/filter_slice/filter_slice.h +++ b/src/meshlabplugins/filter_slice/filter_slice.h @@ -77,7 +77,7 @@ public: virtual int getRequirements(QAction *){return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER | MeshModel::MM_VERTFLAG | MeshModel::MM_VERTMARK | MeshModel::MM_VERTCOORD;} static void capHole(MeshModel* orig, MeshModel* dest, int capDir=CAP_CW); - static void extrude(MeshModel* orig, MeshModel* dest, float eps, vcg::Point3f planeAxis); + static void extrude(MeshDocument* doc,MeshModel* orig, MeshModel* dest, float eps, vcg::Point3f planeAxis); private: SVGProperties pr; void createSlice(MeshModel* orig,MeshModel* dest); diff --git a/src/meshlabplugins/filter_slice/kdtree.h b/src/meshlabplugins/filter_slice/kdtree.h index 1cffa4247..f7f2da843 100644 --- a/src/meshlabplugins/filter_slice/kdtree.h +++ b/src/meshlabplugins/filter_slice/kdtree.h @@ -115,12 +115,10 @@ class KDTree - - MeshModel *slice1= new MeshModel(); - m->meshList.push_back(slice1); - QString layername; - layername=name+"L.ply"; - slice1->setFileName(layername); // mesh name + QString layername; + layername=name+"L.ply"; + MeshModel *slice1= m->addNewMesh(qPrintable(layername)); + m->meshList.push_back(slice1); // mesh name slice1->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); vcg::tri::UpdateSelection::VertexFromQualityRange(mm->cm,VERTEX_LEFT,VERTEX_LEFT); vcg::tri::UpdateSelection::FaceFromVertexLoose(mm->cm); @@ -132,32 +130,29 @@ class KDTree tri::UpdateBounding::Box(slice1->cm); // updates bounding box slice1->cm.Tr = (mm->cm).Tr; // copy transformation vcg::tri::UpdateFlags::FaceBorderFromNone(slice1->cm); - MeshModel* cap= new MeshModel(); - m->meshList.push_back(cap); layername=name+"_slice.ply"; - cap->setFileName(layername); + MeshModel* cap= m->addNewMesh(qPrintable(layername)); + m->meshList.push_back(cap); cap->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); ExtraFilter_SlicePlugin::capHole(slice1,cap); if (eps!=0) { - MeshModel* dup= new MeshModel(); - m->meshList.push_back(dup); layername=name+"_extr.ply"; - dup->setFileName(layername); // mesh name + MeshModel* dup = m->addNewMesh(qPrintable(layername)); + m->meshList.push_back(dup); dup->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); - ExtraFilter_SlicePlugin::extrude(cap, dup, eps, planeAxis); + ExtraFilter_SlicePlugin::extrude(m,cap, dup, eps, planeAxis); } tri::Append::Mesh(slice1->cm, cap->cm); tri::Clean::RemoveDuplicateVertex(slice1->cm); vcg::tri::UpdateTopology::FaceFace(slice1->cm); vcg::tri::UpdateNormals::PerVertexPerFace(slice1->cm); - - MeshModel* slice2= new MeshModel(); - m->meshList.push_back(slice2); layername=name+"R.ply"; - slice2->setFileName(layername); // mesh name + MeshModel* slice2= m->addNewMesh(qPrintable(layername)); + m->meshList.push_back(slice2); + slice2->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); vcg::tri::UpdateSelection::VertexFromQualityRange(mm->cm,VERTEX_RIGHT,VERTEX_RIGHT); vcg::tri::UpdateSelection::FaceFromVertexLoose(mm->cm);