OGS
SHPImportDialog.cpp
Go to the documentation of this file.
1 
15 #include "SHPImportDialog.h"
16 
17 #include <QDialogButtonBox>
18 #include <QFileInfo>
19 #include <QLabel>
20 #include <QLineEdit>
21 #include <QRadioButton>
22 #include <QVBoxLayout>
23 
25 #include "Base/OGSError.h"
26 #include "GeoLib/GEOObjects.h"
27 
28 SHPImportDialog::SHPImportDialog(std::string filename,
29  GeoLib::GEOObjects& geo_objects,
30  std::string const& gmsh_path,
31  QDialog* parent)
32  : QDialog(parent),
33  _buttonBox(nullptr),
34  _layout(nullptr),
35  _shpContentLabel(nullptr),
36  _nameLabel(nullptr),
37  _listName(new QLineEdit()),
38  _choice1(nullptr),
39  _choice2(nullptr),
40  _filename(std::move(filename)),
41  _fileType(0),
42  _shpInterface(new FileIO::SHPInterface(geo_objects)),
43  _gmsh_path(gmsh_path)
44 {
45  setupDialog();
46  show();
47 }
48 
50 {
51  delete _shpInterface;
52  delete _buttonBox;
53  delete _listName;
54  delete _choice1;
55  delete _choice2;
56  delete _shpContentLabel;
57  delete _nameLabel;
58  delete _layout;
59 }
60 
62 {
63  _layout = new QGridLayout(this);
64  int shpType = 0;
65  int numberOfEntities = 0;
66  QString type = "";
67 
68  setWindowTitle("Import SHP File");
69 
70  if (_shpInterface->readSHPInfo(_filename, shpType, numberOfEntities))
71  {
72  if ((shpType - 1) % 10 == 0)
73  {
74  type = "points";
75  }
76  if ((shpType - 3) % 10 == 0)
77  {
78  type = "polylines";
79  }
80  if ((shpType - 5) % 10 == 0)
81  {
82  type = "polygons";
83  }
84  if ((shpType - 8) % 10 == 0)
85  {
86  type = "multipoints";
87  }
88  if (shpType == 31)
89  {
90  type = "TIN elements";
91  }
92 
94  new QLabel("The selected file contains " +
95  QString::number(numberOfEntities) + " " + type,
96  this);
97  _nameLabel = new QLabel("List Name: ", this);
98 
99  QFileInfo fi(QString::fromStdString(_filename));
100  _listName->setText(fi.baseName());
101 
102  if ((shpType - 1) % 10 == 0 && shpType != 31) // Points
103  {
104  _choice1 = new QRadioButton("Read as Geometry Points");
105  _choice2 = new QRadioButton("Read as Station Points");
106  _choice1->toggle(); // default choice
107  _layout->addWidget(_shpContentLabel);
108  _layout->addWidget(_choice1);
109  _layout->addWidget(_choice2);
110  _layout->addWidget(_nameLabel);
111  _layout->addWidget(_listName);
112  _fileType = 1;
113  }
114  else if ((shpType - 3) % 10 == 0 ||
115  (shpType - 5) % 10 == 0) // Polylines
116  {
117  _choice1 = new QRadioButton("Read Polylines only");
118  _choice2 = new QRadioButton("Read Polylines/Surfaces");
119  if ((shpType - 3) % 10 == 0)
120  {
121  _choice2->setDisabled(true); // disable polygon-choice if file
122  // contains only polylines
123  }
124  _choice1->toggle(); // default choice
125  _layout->addWidget(_shpContentLabel);
126  _layout->addWidget(_choice1);
127  _layout->addWidget(_choice2);
128  _layout->addWidget(_nameLabel);
129  _layout->addWidget(_listName);
130  _fileType = 2;
131  }
132  else
133  {
134  _nameLabel->setText(
135  "This element type is currently not supported.");
136  _layout->addWidget(_shpContentLabel);
137  _layout->addWidget(_nameLabel);
138  }
139 
140  _buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |
141  QDialogButtonBox::Cancel);
142  connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
143  connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
144  _layout->addWidget(_buttonBox);
145 
146  setLayout(_layout);
147  }
148  else
149  {
150  OGSError::box("Error reading shapefile!");
151  }
152 }
153 
155 {
156  QString list_name(_listName->text());
157  if (list_name.compare("") == 0)
158  {
159  OGSError::box("Please insert a name for the data in this file.");
160  return;
161  }
162 
163  if (_fileType == 1 && _choice1->isChecked())
164  {
167  list_name.toStdString(), _gmsh_path);
168  }
169  if (_fileType == 1 && _choice2->isChecked())
170  {
173  list_name.toStdString(), _gmsh_path);
174  }
175  if (_fileType == 2 && _choice1->isChecked())
176  {
179  list_name.toStdString(), _gmsh_path);
180  }
181  if (_fileType == 2 && _choice2->isChecked())
182  {
185  list_name.toStdString(), _gmsh_path);
186  }
187  emit shpLoaded(list_name);
188 
189  this->done(QDialog::Accepted);
190 }
191 
193 {
194  this->done(QDialog::Rejected);
195 }
Definition of the GEOObjects class.
Definition of the OGSError class.
Definition of the SHPImportDialog class.
Implementation of the SHPInterface class.
static bool readSHPInfo(const std::string &filename, int &shapeType, int &numberOfEntities)
Reads the header of the shape file.
void readSHPFile(const std::string &filename, OGSType choice, const std::string &listName, std::string const &gmsh_path)
Reads data from the shape file.
Container class for geometric objects.
Definition: GEOObjects.h:61
static void box(const QString &e)
Definition: OGSError.cpp:23
void accept() override
Instructions if the OK-Button has been pressed.
QGridLayout * _layout
QRadioButton * _choice2
void reject() override
Instructions if the Cancel-Button has been pressed.
void shpLoaded(QString)
void setupDialog()
The buttons used in this dialog.
QLineEdit * _listName
QRadioButton * _choice1
QLabel * _shpContentLabel
std::string _filename
~SHPImportDialog() override
SHPImportDialog(std::string filename, GeoLib::GEOObjects &geo_objects, std::string const &gmsh_path, QDialog *parent=nullptr)
Constructor.
QDialogButtonBox * _buttonBox
FileIO::SHPInterface * _shpInterface
std::string const _gmsh_path