Salome HOME
import and export XAO with Fields
[modules/geom.git] / src / ImportExportGUI / ImportExportGUI_ExportXAODlg.cxx
1 //  Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  This library is free software; you can redistribute it and/or
4 //  modify it under the terms of the GNU Lesser General Public
5 //  License as published by the Free Software Foundation; either
6 //  version 2.1 of the License.
7 //
8 //  This library is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 //  Lesser General Public License for more details.
12 //
13 //  You should have received a copy of the GNU Lesser General Public
14 //  License along with this library; if not, write to the Free Software
15 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18
19 #include <DlgRef.h>
20 #include <GeometryGUI.h>
21 #include <GEOMBase.h>
22
23 #include <SUIT_Session.h>
24 #include <SUIT_ResourceMgr.h>
25 #include <SUIT_OverrideCursor.h>
26 #include <SalomeApp_Application.h>
27 #include <SalomeApp_Study.h>
28 #include <SalomeApp_Tools.h>
29 #include <LightApp_SelectionMgr.h>
30
31 #include <QLabel>
32 #include <QLineEdit>
33 #include <QButtonGroup>
34 #include <QListWidget>
35 #include <QFileDialog>
36 #include <QMap>
37
38 // OCCT Includes
39 #include <TopoDS_Shape.hxx>
40 #include <TopoDS.hxx>
41 #include <TopExp.hxx>
42 #include <TColStd_IndexedMapOfInteger.hxx>
43 #include <TopTools_IndexedMapOfShape.hxx>
44
45 #include <GEOMImpl_Types.hxx>
46 #include "ImportExportGUI_ExportXAODlg.h"
47
48 //=================================================================================
49 // Constructor
50 //=================================================================================
51 ImportExportGUI_ExportXAODlg::ImportExportGUI_ExportXAODlg(GeometryGUI* geometryGUI, QWidget* parent)
52 :
53         GEOMBase_Skeleton(geometryGUI, parent, false)
54 {
55     m_mainObj = GEOM::GEOM_Object::_nil();
56
57     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
58     QPixmap imageOp(resMgr->loadPixmap("GEOM", tr("ICON_DLG_EXPORTXAO")));
59     QPixmap iconSelect(resMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
60
61     setWindowTitle(tr("GEOM_EXPORTXAO_TITLE"));
62
63     /***************************************************************/
64     mainFrame()->GroupConstructors->setTitle(tr("GEOM_EXPORTXAO_TITLE"));
65     mainFrame()->RadioButton1->setIcon(imageOp);
66     mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
67     mainFrame()->RadioButton2->close();
68     mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
69     mainFrame()->RadioButton3->close();
70
71     // hide name
72     mainFrame()->GroupBoxName->hide();
73
74     //****************************
75     // Selection Group box
76     QGroupBox* gbxExport = new QGroupBox(parent);
77
78     QGridLayout* gridLayoutExport = new QGridLayout(gbxExport);
79 #ifndef Q_OS_MAC
80     gridLayoutExport->setSpacing(6);
81     gridLayoutExport->setContentsMargins(9, 9, 9, 9);
82 #endif
83     gridLayoutExport->setObjectName(QString::fromUtf8("gridLayoutExport"));
84
85     // Line 0
86     QLabel* lblShape = new QLabel(tr("GEOM_EXPORTXAO_EXPORTINGSHAPE"), gbxExport);
87     btnShapeSelect = new QPushButton(gbxExport);
88     btnShapeSelect->setIcon(iconSelect);
89     ledShape = new QLineEdit(gbxExport);
90     ledShape->setMinimumSize(QSize(100, 0));
91
92     int line = 0, col = 0;
93     gridLayoutExport->addWidget(lblShape, line, col++, 1, 1);
94     gridLayoutExport->addWidget(btnShapeSelect, line, col++, 1, 1);
95     gridLayoutExport->addWidget(ledShape, line, col++, 1, 1);
96
97     // Line 1
98     QLabel* lblFileName = new QLabel(tr("GEOM_EXPORTXAO_FILENAME"), gbxExport);
99     btnFileSelect = new QPushButton(gbxExport);
100     ledFileName = new QLineEdit(gbxExport);
101     btnFileSelect->setText("...");
102
103     line++; col = 0;
104     gridLayoutExport->addWidget(lblFileName, line, col++, 1, 1);
105     gridLayoutExport->addWidget(btnFileSelect, line, col++, 1, 1);
106     gridLayoutExport->addWidget(ledFileName, line, col++, 1, 1);
107
108     // Line 2
109     QLabel* lblAuthor = new QLabel(tr("GEOM_EXPORTXAO_AUTHOR"), gbxExport);
110     ledAuthor = new QLineEdit(gbxExport);
111
112     line++; col = 0;
113     gridLayoutExport->addWidget(lblAuthor, line, col++, 2, 1);
114     col++; // span
115     gridLayoutExport->addWidget(ledAuthor, line, col++, 1, 1);
116
117     //****************************
118     // Filter Group box
119     QGroupBox* gbxFilter = new QGroupBox(parent);
120
121     QGridLayout* gridLayoutFilter = new QGridLayout(gbxFilter);
122 #ifndef Q_OS_MAC
123     gridLayoutFilter->setSpacing(6);
124     gridLayoutFilter->setContentsMargins(9, 9, 9, 9);
125 #endif
126     gridLayoutFilter->setObjectName(QString::fromUtf8("gbxFilter"));
127
128     // Line 0
129     QLabel* lblGroups = new QLabel(tr("GEOM_EXPORTXAO_LGROUPS"), gbxFilter);
130     QLabel* lblFields = new QLabel(tr("GEOM_EXPORTXAO_LFIELDS"), gbxFilter);
131
132     line = 0, col = 0;
133     gridLayoutFilter->addWidget(lblGroups, line, col++, 1, 1);
134     gridLayoutFilter->addWidget(lblFields, line, col++, 1, 1);
135
136     // Line 1
137     lstGroups = new QListWidget(gbxFilter);
138     lstGroups->setSelectionMode(QAbstractItemView::ExtendedSelection);
139     lstFields = new QListWidget(gbxFilter);
140     lstFields->setSelectionMode(QAbstractItemView::ExtendedSelection);
141
142     line++; col = 0;
143     gridLayoutFilter->addWidget(lstGroups, line, col++, 1, 1);
144     gridLayoutFilter->addWidget(lstFields, line, col++, 1, 1);
145
146     //****************************
147     QVBoxLayout* layout = new QVBoxLayout(centralWidget());
148     layout->setMargin(0);
149     layout->setSpacing(6);
150     layout->addWidget(gbxExport);
151     layout->addWidget(gbxFilter);
152
153     // set help
154     setHelpFileName("create_exportxao_page.html");
155
156     Init();
157 }
158
159 //=================================================================================
160 // Destructor
161 //=================================================================================
162 ImportExportGUI_ExportXAODlg::~ImportExportGUI_ExportXAODlg()
163 {
164     // no need to delete child widgets, Qt does it all for us
165 }
166
167 //=================================================================================
168 // function : Init()
169 // purpose  :
170 //=================================================================================
171 void ImportExportGUI_ExportXAODlg::Init()
172 {
173     // Get setting of step value from file configuration
174     m_groups.clear();
175     m_fields.clear();
176
177     // Signal/slot connections
178     connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
179     connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
180
181     connect(btnShapeSelect, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
182     connect(((SalomeApp_Application*) (SUIT_Session::session()->activeApplication()))->selectionMgr(),
183             SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
184
185     connect(btnFileSelect, SIGNAL(clicked()), this, SLOT(btnFileSelectClicked()));
186
187     initName(tr("GEOM_EXPORTXAO"));
188     SelectionIntoArgument();
189 }
190
191 //=================================================================================
192 // function : processObject()
193 // purpose  : Fill dialog fields in accordance with myObj
194 //=================================================================================
195 void ImportExportGUI_ExportXAODlg::processObject()
196 {
197     lstGroups->clear();
198     lstFields->clear();
199     m_groups.clear();
200     m_fields.clear();
201
202     if (m_mainObj->_is_nil())
203     {
204         ledShape->setText("");
205     }
206     else
207     {
208         ledShape->setText(GEOMBase::GetName(m_mainObj));
209         GEOM::GEOM_IShapesOperations_var shapeOp = getGeomEngine()->GetIShapesOperations(getStudyId());
210
211         // add groups names
212         GEOM::ListOfGO_var groups = shapeOp->GetExistingSubObjects(m_mainObj, true);
213         for (int i = 0, n = groups->length(); i < n; i++)
214         {
215             QListWidgetItem* item = new QListWidgetItem();
216             item->setData(Qt::UserRole, QVariant(i));
217             item->setText(GEOMBase::GetName(groups[i]));
218             lstGroups->addItem(item);
219             item->setSelected(true);
220             m_groups.append(GEOM::GeomObjPtr(groups[i].in()));
221         }
222         lstGroups->sortItems(Qt::AscendingOrder);
223
224         // add fields
225         GEOM::GEOM_IFieldOperations_var fieldOp = getGeomEngine()->GetIFieldOperations(getStudyId());
226
227         GEOM::ListOfFields_var fields = fieldOp->GetFields(m_mainObj);
228         for (int i = 0, n = fields->length(); i < n; i++)
229         {
230             QListWidgetItem* item = new QListWidgetItem();
231             item->setData(Qt::UserRole, QVariant(i));
232             item->setText(fields[i]->GetName());
233             lstFields->addItem(item);
234             item->setSelected(true);
235             m_fields.append(GEOM::GeomFieldPtr(fields[i].in()));
236         }
237         lstFields->sortItems(Qt::AscendingOrder);
238     }
239 }
240
241 //=================================================================================
242 // function : ClickOnOk()
243 // purpose  :
244 //=================================================================================
245 void ImportExportGUI_ExportXAODlg::ClickOnOk()
246 {
247     setIsApplyAndClose(true);
248     if (ClickOnApply())
249         ClickOnCancel();
250     setIsApplyAndClose(false);
251 }
252
253 //=================================================================================
254 // function : ClickOnApply()
255 // purpose  :
256 //=================================================================================
257 bool ImportExportGUI_ExportXAODlg::ClickOnApply()
258 {
259     if (!isApplyAndClose())
260     {
261         setIsDisableBrowsing(true);
262         setIsDisplayResult(false);
263     }
264
265     QString msg;
266     if (!isValid(msg))
267     {
268         showError(msg);
269         return false;
270     }
271     SUIT_OverrideCursor wc;
272     SUIT_Session::session()->activeApplication()->putInfo("");
273
274     try
275     {
276         if (openCommand())
277             if (!execute(/*isApplyAndClose()*/))
278             {
279                 abortCommand();
280                 showError();
281                 return false;
282             }
283     }
284     catch (const SALOME::SALOME_Exception& e)
285     {
286         SalomeApp_Tools::QtCatchCorbaException(e);
287         abortCommand();
288         return false;
289     }
290     commitCommand();
291
292     if (!isApplyAndClose())
293     {
294         setIsDisableBrowsing(false);
295         setIsDisplayResult(true);
296     }
297
298     processObject();
299
300     return true;
301 }
302
303 //=================================================================================
304 // function : SelectionIntoArgument()
305 // purpose  : Called when selection as changed or other case
306 //=================================================================================
307 void ImportExportGUI_ExportXAODlg::SelectionIntoArgument()
308 {
309     m_mainObj = GEOM::GEOM_Object::_nil();
310
311     LightApp_SelectionMgr* selMgr = myGeomGUI->getApp()->selectionMgr();
312     SALOME_ListIO selList;
313     selMgr->selectedObjects(selList);
314
315     if (selList.Extent() == 1)
316     {
317         m_mainObj = GEOMBase::ConvertIOinGEOMObject(selList.First());
318     }
319
320     processObject();
321 }
322
323 //=================================================================================
324 // function : SetEditCurrentArgument()
325 // purpose  :
326 //=================================================================================
327 void ImportExportGUI_ExportXAODlg::SetEditCurrentArgument()
328 {
329     ledShape->setFocus();
330     myEditCurrentArgument = ledShape;
331     SelectionIntoArgument();
332 }
333
334 //=================================================================================
335 // function : btnFileSelectClicked()
336 // purpose  :
337 //=================================================================================
338 void ImportExportGUI_ExportXAODlg::btnFileSelectClicked()
339 {
340     QString selFile = QFileDialog::getSaveFileName(this, tr("GEOM_SELECT_EXPORT_XAO"),
341             QString(), tr("XAO_FILES"));
342     if (!selFile.isEmpty())
343     {
344         ledFileName->setText(selFile);
345     }
346 }
347
348 //=================================================================================
349 // function : ActivateThisDialog()
350 // purpose  :
351 //=================================================================================
352 void ImportExportGUI_ExportXAODlg::ActivateThisDialog()
353 {
354     GEOMBase_Skeleton::ActivateThisDialog();
355 }
356
357 //=================================================================================
358 // function : enterEvent [REDEFINED]
359 // purpose  :
360 //=================================================================================
361 void ImportExportGUI_ExportXAODlg::enterEvent(QEvent*)
362 {
363     if (!mainFrame()->GroupConstructors->isEnabled())
364         ActivateThisDialog();
365 }
366
367 //=================================================================================
368 // function : createOperation
369 // purpose  :
370 //=================================================================================
371 GEOM::GEOM_IOperations_ptr ImportExportGUI_ExportXAODlg::createOperation()
372 {
373     return getGeomEngine()->GetIInsertOperations(getStudyId());
374 }
375
376 //=================================================================================
377 // function : isValid
378 // purpose  :
379 //=================================================================================
380 bool ImportExportGUI_ExportXAODlg::isValid(QString& msg)
381 {
382     // check shape
383     if (ledShape->text().isEmpty())
384         return false;
385
386     // check file name
387     if (ledFileName->text().isEmpty())
388         return false;
389
390     return true;
391 }
392
393 //=================================================================================
394 // function : execute
395 // purpose  :
396 //=================================================================================
397 bool ImportExportGUI_ExportXAODlg::execute()
398 {
399     bool res = false;
400
401     QString author = ledAuthor->text();
402     QString fileName = ledFileName->text();
403
404     // get selected groups
405     QList<QListWidgetItem*> selGroups = lstGroups->selectedItems();
406     GEOM::ListOfGO_var groups = new GEOM::ListOfGO();
407     groups->length(selGroups.count());
408     int i = 0;
409     for (QList<QListWidgetItem*>::iterator it = selGroups.begin(); it != selGroups.end(); ++it)
410     {
411         QListWidgetItem* item = (*it);
412         int index = item->data(Qt::UserRole).toInt();
413         groups[i++] = m_groups[index].copy();
414     }
415
416     // get selected fields
417     QList<QListWidgetItem*> selFields = lstFields->selectedItems();
418     GEOM::ListOfFields_var fields = new GEOM::ListOfFields();
419     fields->length(m_fields.count());
420     i = 0;
421     for (QList<QListWidgetItem*>::iterator it = selFields.begin(); it != selFields.end(); ++it)
422     {
423         QListWidgetItem* item = (*it);
424         int index = item->data(Qt::UserRole).toInt();
425         fields[i++] = m_fields[index].copy();
426     }
427
428     // call engine function
429     GEOM::GEOM_IInsertOperations_var ieOp = GEOM::GEOM_IInsertOperations::_narrow(getOperation());
430     res = ieOp->ExportXAO(m_mainObj, groups, fields,
431                           author.toStdString().c_str(),
432                           fileName.toStdString().c_str());
433
434     return res;
435 }