File: GOCAD_io_plugin.cpp

package info (click to toggle)
cgal 6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 144,912 kB
  • sloc: cpp: 810,858; ansic: 208,477; sh: 493; python: 411; makefile: 286; javascript: 174
file content (130 lines) | stat: -rw-r--r-- 3,560 bytes parent folder | download | duplicates (2)
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"