Salome HOME
add XAO import and modify export
[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 <SalomeApp_Application.h>
26 #include <SalomeApp_Study.h>
27 #include <LightApp_SelectionMgr.h>
28
29 #include <QLabel>
30 #include <QLineEdit>
31 #include <QButtonGroup>
32 #include <QListWidget>
33 #include <QFileDialog>
34 #include <QMap>
35 //#include <ui_ImportExportGUI_1Sel1LineEdit2ListWidget_QTD.h>
36
37 // OCCT Includes
38 #include <TopoDS_Shape.hxx>
39 #include <TopoDS.hxx>
40 #include <TopExp.hxx>
41 #include <TColStd_IndexedMapOfInteger.hxx>
42 #include <TopTools_IndexedMapOfShape.hxx>
43
44 #include <GEOMImpl_Types.hxx>
45 #include "ImportExportGUI_ExportXAODlg.h"
46 //#include "ImportExportGUI_Widgets.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
188     initName(tr("GEOM_EXPORTXAO"));
189     SelectionIntoArgument();
190 }
191
192 //=================================================================================
193 // function : processObject()
194 // purpose  : Fill dialog fields in accordance with myObj
195 //=================================================================================
196 void ImportExportGUI_ExportXAODlg::processObject()
197 {
198     lstGroups->clear();
199     lstFields->clear();
200     m_groups.clear();
201     m_fields.clear();
202
203     if (m_mainObj->_is_nil())
204     {
205         ledShape->setText("");
206     }
207     else
208     {
209         ledShape->setText(GEOMBase::GetName(m_mainObj));
210         GEOM::GEOM_IShapesOperations_var shapeOp = getGeomEngine()->GetIShapesOperations(getStudyId());
211
212         // add groups names
213         GEOM::ListOfGO_var groups = shapeOp->GetExistingSubObjects(m_mainObj, true);
214         for (int i = 0, n = groups->length(); i < n; i++)
215         {
216             QListWidgetItem* item = new QListWidgetItem();
217             item->setData(Qt::UserRole, QVariant(i));
218             item->setText(GEOMBase::GetName(groups[i]));
219             lstGroups->addItem(item);
220             m_groups.append(GEOM::GeomObjPtr(groups[i].in()));
221         }
222         lstGroups->sortItems(Qt::AscendingOrder);
223
224         // TODO: add fields
225     }
226 }
227
228 //=================================================================================
229 // function : ClickOnOk()
230 // purpose  :
231 //=================================================================================
232 void ImportExportGUI_ExportXAODlg::ClickOnOk()
233 {
234     if (ClickOnApply())
235         ClickOnCancel();
236 }
237
238 //=================================================================================
239 // function : ClickOnApply()
240 // purpose  :
241 //=================================================================================
242 bool ImportExportGUI_ExportXAODlg::ClickOnApply()
243 {
244     if (!onAccept())
245         return false;
246
247     initName();
248
249     return true;
250 }
251
252 //=================================================================================
253 // function : SelectionIntoArgument()
254 // purpose  : Called when selection as changed or other case
255 //=================================================================================
256 void ImportExportGUI_ExportXAODlg::SelectionIntoArgument()
257 {
258     m_mainObj = GEOM::GEOM_Object::_nil();
259
260     LightApp_SelectionMgr* selMgr = myGeomGUI->getApp()->selectionMgr();
261     SALOME_ListIO selList;
262     selMgr->selectedObjects(selList);
263
264     if (selList.Extent() == 1)
265     {
266         m_mainObj = GEOMBase::ConvertIOinGEOMObject(selList.First());
267     }
268
269     processObject();
270 }
271
272 //=================================================================================
273 // function : SetEditCurrentArgument()
274 // purpose  :
275 //=================================================================================
276 void ImportExportGUI_ExportXAODlg::SetEditCurrentArgument()
277 {
278     ledShape->setFocus();
279     myEditCurrentArgument = ledShape;
280     SelectionIntoArgument();
281 }
282
283 //=================================================================================
284 // function : btnFileSelectClicked()
285 // purpose  :
286 //=================================================================================
287 void ImportExportGUI_ExportXAODlg::btnFileSelectClicked()
288 {
289     QString selFile = QFileDialog::getSaveFileName(this, tr("GEOM_SELECT_EXPORT_XAO"),
290             QString(), tr("XAO_FILES"));
291     if (!selFile.isEmpty())
292     {
293         ledFileName->setText(selFile);
294     }
295 }
296
297 //=================================================================================
298 // function : ActivateThisDialog()
299 // purpose  :
300 //=================================================================================
301 void ImportExportGUI_ExportXAODlg::ActivateThisDialog()
302 {
303     GEOMBase_Skeleton::ActivateThisDialog();
304 }
305
306 //=================================================================================
307 // function : enterEvent [REDEFINED]
308 // purpose  :
309 //=================================================================================
310 void ImportExportGUI_ExportXAODlg::enterEvent(QEvent*)
311 {
312     if (!mainFrame()->GroupConstructors->isEnabled())
313         ActivateThisDialog();
314 }
315
316 //=================================================================================
317 // function : createOperation
318 // purpose  :
319 //=================================================================================
320 GEOM::GEOM_IOperations_ptr ImportExportGUI_ExportXAODlg::createOperation()
321 {
322     return getGeomEngine()->GetIImportExportOperations(getStudyId());
323 }
324
325 //=================================================================================
326 // function : isValid
327 // purpose  :
328 //=================================================================================
329 bool ImportExportGUI_ExportXAODlg::isValid(QString& msg)
330 {
331     // check shape
332     if (ledShape->text().isEmpty())
333         return false;
334
335     // check file name
336     if (ledFileName->text().isEmpty())
337         return false;
338
339     return true;
340 }
341
342 //=================================================================================
343 // function : execute
344 // purpose  :
345 //=================================================================================
346 bool ImportExportGUI_ExportXAODlg::execute(ObjectList& objects)
347 {
348     bool res = false;
349
350     QString author = ledAuthor->text();
351     QString fileName = ledFileName->text();
352
353     // get selected groups
354     QList<QListWidgetItem*> selGroups = lstGroups->selectedItems();
355     GEOM::ListOfGO_var groups = new GEOM::ListOfGO();
356     groups->length(selGroups.count());
357     int i = 0;
358     for (QList<QListWidgetItem*>::iterator it = selGroups.begin(); it != selGroups.end(); ++it)
359     {
360         QListWidgetItem* item = (*it);
361         int index = item->data(Qt::UserRole).toInt();
362         groups[i++] = m_groups[index].copy();
363     }
364
365     // get selected fields
366     QList<QListWidgetItem*> selFields = lstFields->selectedItems();
367     GEOM::ListOfGO_var fields = new GEOM::ListOfGO();
368     fields->length(m_fields.count());
369     for (QList<QListWidgetItem*>::iterator it = selFields.begin(); it != selFields.end(); ++it)
370     {
371         QListWidgetItem* item = (*it);
372         int index = item->data(Qt::UserRole).toInt();
373         fields[i++] = m_fields[index].copy();
374     }
375
376     // call engine function
377     GEOM::GEOM_IImportExportOperations_var ieOp = GEOM::GEOM_IImportExportOperations::_narrow(getOperation());
378     res = ieOp->ExportXAO(m_mainObj, groups, fields,
379             author.toStdString().c_str(),
380             fileName.toStdString().c_str());
381
382     return res;
383 }