1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/*****************************************************************************
* $CAMITK_LICENCE_BEGIN$
*
* CamiTK - Computer Assisted Medical Intervention ToolKit
* (c) 2001-2025 Univ. Grenoble Alpes, CNRS, Grenoble INP - UGA, TIMC, 38000 Grenoble, France
*
* Visit http://camitk.imag.fr for more information
*
* This file is part of CamiTK.
*
* CamiTK is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* CamiTK is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with CamiTK. If not, see <http://www.gnu.org/licenses/>.
*
* $CAMITK_LICENCE_END$
****************************************************************************/
#include "OffComponent.h"
#include "OffExtension.h"
//-- Qt
#include <QFileInfo>
//-- VTK
#include <vtkCellType.h>
#include <vtkCell.h>
//-- CamiTK
#include <Log.h>
using namespace camitk;
// --------------- getName -------------------
QString OffExtension::getName() const {
return "Off Component";
}
// --------------- getDescription -------------------
QString OffExtension::getDescription() const {
return tr("OFF <em>.off</em> files in <b>CamiTK</b> <br>(c) Univ. Grenoble Alpes");
}
// --------------- getFileExtensions -------------------
QStringList OffExtension::getFileExtensions() const {
QStringList ext;
ext << "off";
return ext;
}
// --------------- open -------------------
camitk::Component* OffExtension::open(const QString& fileName) {
return new OffComponent(fileName);
}
// --------------- save -------------------
bool OffExtension::save(Component* component) const {
vtkSmartPointer<vtkPointSet> ps = component->getPointSet();
if (ps == nullptr || ps->GetNumberOfPoints() == 0 || ps->GetNumberOfCells() == 0) {
CAMITK_WARNING(tr("Save as Off: the selected component does not have any points or cells. This is an invalid mesh."))
return false;
}
QString baseFilename = QFileInfo(component->getFileName()).absolutePath() + "/" + QFileInfo(component->getFileName()).completeBaseName();
QString offFilename = baseFilename + ".off";
std::ofstream offFile(offFilename.toUtf8());
double xyz[3];
offFile << "OFF" << endl;
// write the number of points, cells and edges
offFile << ps->GetPoints()->GetNumberOfPoints() << " " << ps->GetNumberOfCells() << " " << ps->GetNumberOfElements(vtkPointSet::EDGE) << endl;
// list the points
for (int i = 0; i < ps->GetPoints()->GetNumberOfPoints(); i++) {
ps->GetPoints()->GetPoint(i, xyz);
// write atom
offFile << xyz[0] << " " << xyz[1] << " " << xyz[2] << endl;
}
for (vtkIdType i = 0; i < ps->GetNumberOfCells() ; i++) {
switch (ps->GetCell(i)->GetCellType()) {
case VTK_TRIANGLE :
offFile << "3 ";
for (vtkIdType j = 0; j < ps->GetCell(i)->GetNumberOfPoints(); j++) {
offFile << ps->GetCell(i)->GetPointId(j) << " ";
}
offFile << endl;
break;
case VTK_QUAD :
offFile << "4 ";
for (vtkIdType j = 0; j < ps->GetCell(i)->GetNumberOfPoints(); j++) {
offFile << ps->GetCell(i)->GetPointId(j) << " ";
}
offFile << endl;
break;
default:
CAMITK_ERROR("Unsupported cell type (only triangles and quads are supported). Aborting.")
return false;
break;
}
}
offFile.close();
// if it was not stop up to here, everything went fine
return true;
}
|