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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include "Scene_polygon_soup_item.h"
#include "Scene_surface_mesh_item.h"
#include "Kernel_type.h"
#include "Scene.h"
#include "SMesh_type.h"
#include <CGAL/Timer.h>
#include <CGAL/Three/CGAL_Lab_io_plugin_interface.h>
#include <CGAL/Three/CGAL_Lab_plugin_interface.h>
#include <CGAL/Three/CGAL_Lab_plugin_helper.h>
#include <CGAL/Three/Three.h>
#include <CGAL/boost/graph/io.h>
#include <QColor>
#include <QMainWindow>
#include <fstream>
using namespace CGAL::Three;
class CGAL_Lab_gocad_plugin :
public QObject,
public CGAL_Lab_io_plugin_interface
{
Q_OBJECT
Q_INTERFACES(CGAL::Three::CGAL_Lab_io_plugin_interface)
Q_PLUGIN_METADATA(IID "com.geometryfactory.CGALLab.IOPluginInterface/1.90" FILE "gocad_io_plugin.json")
public:
QString nameFilters() const;
QString name() const { return "gocad_plugin"; }
bool canLoad(QFileInfo) const;
QList<Scene_item*> load(QFileInfo fileinfo, bool& ok, bool add_to_scene=true);
bool canSave(const CGAL::Three::Scene_item*);
bool save(QFileInfo fileinfo, QList<CGAL::Three::Scene_item*>& );
};
QString CGAL_Lab_gocad_plugin::nameFilters() const {
return "GOCAD files (*.ts)";
}
bool CGAL_Lab_gocad_plugin::canLoad(QFileInfo) const {
return true;
}
QList<Scene_item*>
CGAL_Lab_gocad_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) {
// Open file
std::ifstream in(fileinfo.filePath().toUtf8());
if(!in) {
std::cerr << "Error! Cannot open file " << (const char*)fileinfo.filePath().toUtf8() << std::endl;
ok = false;
return QList<Scene_item*>();
}
in.close();
CGAL::Timer t;
t.start();
// Try to read GOCAD file in a surface_mesh
Scene_surface_mesh_item* item = new Scene_surface_mesh_item(new SMesh());
if(fileinfo.size() == 0)
{
CGAL::Three::Three::warning( tr("The file you are trying to load is empty."));
ok = true;
if(add_to_scene)
CGAL::Three::Three::scene()->addItem(item);
return QList<Scene_item*>()<<item;
}
SMesh& P = * const_cast<SMesh*>(item->polyhedron());
std::pair<std::string,std::string> name_and_color;
if(! CGAL::IO::read_GOCAD(in, name_and_color, P))
{
std::cerr << "Error: Invalid polyhedron" << std::endl;
delete item;
ok = false;
return QList<Scene_item*>();
}
t.stop();
std::cerr << "Reading took " << t.time() << " sec." << std::endl;
if(name_and_color.first.size() == 0){
item->setName(fileinfo.completeBaseName());
} else {
item->setName(name_and_color.first.c_str());
}
QColor qcolor(name_and_color.second.c_str());
if(qcolor.isValid())
{
item->setColor(qcolor);
}
item->invalidateOpenGLBuffers();
ok = true;
if(add_to_scene)
CGAL::Three::Three::scene()->addItem(item);
return QList<Scene_item*>()<<item;
}
bool CGAL_Lab_gocad_plugin::canSave(const CGAL::Three::Scene_item* item)
{
// This plugin supports polyhedrons
return qobject_cast<const Scene_surface_mesh_item*>(item);
}
bool CGAL_Lab_gocad_plugin::
save(QFileInfo fileinfo,QList<CGAL::Three::Scene_item*>& items)
{
Scene_item* item = items.front();
// This plugin supports polyhedrons
const Scene_surface_mesh_item* sm_item =
qobject_cast<const Scene_surface_mesh_item*>(item);
if(!sm_item)
return false;
std::ofstream out(fileinfo.filePath().toUtf8());
out.precision (std::numeric_limits<double>::digits10 + 2);
SMesh* poly = const_cast<SMesh*>(sm_item->polyhedron());
CGAL::IO::write_GOCAD(out, qPrintable(fileinfo.completeBaseName()), *poly);
items.pop_front();
return true;
}
#include "GOCAD_io_plugin.moc"
|