]> SALOME platform Git repositories - modules/geom.git/blobdiff - src/XAOPlugin/XAOPlugin_ExportDlg.cxx
Salome HOME
0022616: [CEA 1038] Improve the quality of stl and vtk exports
[modules/geom.git] / src / XAOPlugin / XAOPlugin_ExportDlg.cxx
diff --git a/src/XAOPlugin/XAOPlugin_ExportDlg.cxx b/src/XAOPlugin/XAOPlugin_ExportDlg.cxx
new file mode 100644 (file)
index 0000000..01e570f
--- /dev/null
@@ -0,0 +1,456 @@
+// Copyright (C) 2013-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// internal includes
+#include "XAOPlugin_ExportDlg.h"
+#include "XAOPlugin_IOperations_i.hh"
+
+// GUI includes
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_OverrideCursor.h>
+#include <SUIT_FileDlg.h>
+
+#include <SalomeApp_Application.h>
+#include <SalomeApp_Study.h>
+#include <SalomeApp_Tools.h>
+#include <LightApp_SelectionMgr.h>
+
+// GEOM includes
+#include "GeometryGUI.h"
+#include "GEOMBase.h"
+#include "GEOMImpl_Types.hxx"
+
+// OCCT Includes
+#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <TopExp.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+
+// QT includes
+#include <QLabel>
+#include <QLineEdit>
+#include <QButtonGroup>
+#include <QListWidget>
+#include <QFileDialog>
+#include <QGroupBox>
+#include <QRadioButton>
+#include <QGridLayout>
+#include <QPushButton>
+#include <QMap>
+
+//=================================================================================
+// Constructor
+//=================================================================================
+XAOPlugin_ExportDlg::XAOPlugin_ExportDlg(GeometryGUI* geometryGUI, QWidget* parent)
+:
+        GEOMBase_Skeleton(geometryGUI, parent, false)
+{
+  m_mainObj = GEOM::GEOM_Object::_nil();
+
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  QPixmap imageOp(resMgr->loadPixmap("GEOM", tr("XAOPLUGIN_EXPORT_ICON")));
+  QPixmap iconSelect(resMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
+
+  setWindowTitle(tr("XAOPLUGIN_EXPORT_TITLE"));
+
+  /***************************************************************/
+  mainFrame()->GroupConstructors->setTitle(tr("XAOPLUGIN_EXPORT_TITLE"));
+  mainFrame()->RadioButton1->setIcon(imageOp);
+  mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton2->close();
+  mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton3->close();
+
+  // hide name
+  mainFrame()->GroupBoxName->hide();
+
+  //****************************
+  // Selection Group box
+  QGroupBox* gbxExport = new QGroupBox(parent);
+
+  QGridLayout* gridLayoutExport = new QGridLayout(gbxExport);
+#ifndef Q_OS_MAC
+  gridLayoutExport->setSpacing(6);
+  gridLayoutExport->setContentsMargins(9, 9, 9, 9);
+#endif
+  gridLayoutExport->setObjectName(QString::fromUtf8("gridLayoutExport"));
+
+  // Line 0
+  QLabel* lblShape = new QLabel(tr("XAOPLUGIN_EXPORT_INGSHAPE"), gbxExport);
+  btnShapeSelect = new QPushButton(gbxExport);
+  btnShapeSelect->setIcon(iconSelect);
+  ledShape = new QLineEdit(gbxExport);
+  ledShape->setMinimumSize(QSize(100, 0));
+
+  int line = 0, col = 0;
+  gridLayoutExport->addWidget(lblShape, line, col++, 1, 1);
+  gridLayoutExport->addWidget(btnShapeSelect, line, col++, 1, 1);
+  gridLayoutExport->addWidget(ledShape, line, col++, 1, 1);
+
+  // Line 1
+  QLabel* lblFileName = new QLabel(tr("XAOPLUGIN_EXPORT_FILENAME"), gbxExport);
+  btnFileSelect = new QPushButton(gbxExport);
+  ledFileName = new QLineEdit(gbxExport);
+  btnFileSelect->setText("...");
+
+  line++; col = 0;
+  gridLayoutExport->addWidget(lblFileName, line, col++, 1, 1);
+  gridLayoutExport->addWidget(btnFileSelect, line, col++, 1, 1);
+  gridLayoutExport->addWidget(ledFileName, line, col++, 1, 1);
+
+  // Line 2
+  QLabel* lblAuthor = new QLabel(tr("XAOPLUGIN_EXPORT_AUTHOR"), gbxExport);
+  ledAuthor = new QLineEdit(gbxExport);
+
+  line++; col = 0;
+  gridLayoutExport->addWidget(lblAuthor, line, col++, 2, 1);
+  col++; // span
+  gridLayoutExport->addWidget(ledAuthor, line, col++, 1, 1);
+
+  //****************************
+  // Filter Group box
+  QGroupBox* gbxFilter = new QGroupBox(parent);
+
+  QGridLayout* gridLayoutFilter = new QGridLayout(gbxFilter);
+#ifndef Q_OS_MAC
+  gridLayoutFilter->setSpacing(6);
+  gridLayoutFilter->setContentsMargins(9, 9, 9, 9);
+#endif
+  gridLayoutFilter->setObjectName(QString::fromUtf8("gbxFilter"));
+
+  // Line 0
+  QLabel* lblGroups = new QLabel(tr("XAOPLUGIN_EXPORT_LGROUPS"), gbxFilter);
+  QLabel* lblFields = new QLabel(tr("XAOPLUGIN_EXPORT_LFIELDS"), gbxFilter);
+
+  line = 0, col = 0;
+  gridLayoutFilter->addWidget(lblGroups, line, col++, 1, 1);
+  gridLayoutFilter->addWidget(lblFields, line, col++, 1, 1);
+
+  // Line 1
+  lstGroups = new QListWidget(gbxFilter);
+  lstGroups->setSelectionMode(QAbstractItemView::NoSelection);
+  lstFields = new QListWidget(gbxFilter);
+  lstFields->setSelectionMode(QAbstractItemView::NoSelection);
+
+  line++; col = 0;
+  gridLayoutFilter->addWidget(lstGroups, line, col++, 1, 1);
+  gridLayoutFilter->addWidget(lstFields, line, col++, 1, 1);
+
+  //****************************
+  QVBoxLayout* layout = new QVBoxLayout(centralWidget());
+  layout->setMargin(0);
+  layout->setSpacing(6);
+  layout->addWidget(gbxExport);
+  layout->addWidget(gbxFilter);
+
+  // set help
+  setHelpFileName("xao_format_page.html");
+
+  Init();
+}
+
+//=================================================================================
+// Destructor
+//=================================================================================
+XAOPlugin_ExportDlg::~XAOPlugin_ExportDlg()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
+
+//=================================================================================
+// function : Init()
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::Init()
+{
+  // Get setting of step value from file configuration
+  m_groups.clear();
+  m_fields.clear();
+
+  // Signal/slot connections
+  connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
+  connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
+
+  connect(btnShapeSelect, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(((SalomeApp_Application*) (SUIT_Session::session()->activeApplication()))->selectionMgr(),
+          SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+
+  connect(btnFileSelect, SIGNAL(clicked()), this, SLOT(btnFileSelectClicked()));
+
+  initName(tr("XAOPLUGIN_EXPORTXAO"));
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : processObject()
+// purpose  : Fill dialog fields in accordance with myObj
+//=================================================================================
+void XAOPlugin_ExportDlg::processObject()
+{
+  lstGroups->clear();
+  lstFields->clear();
+  m_groups.clear();
+  m_fields.clear();
+
+  if (m_mainObj->_is_nil())
+  {
+    ledShape->setText("");
+  }
+  else
+  {
+    ledShape->setText(GEOMBase::GetName(m_mainObj));
+    GEOM::GEOM_IShapesOperations_var shapeOp = getGeomEngine()->GetIShapesOperations(getStudyId());
+
+    // add groups names
+    GEOM::ListOfGO_var groups = shapeOp->GetExistingSubObjects(m_mainObj, true);
+    for (int i = 0, n = groups->length(); i < n; i++)
+    {
+      QListWidgetItem* item = new QListWidgetItem();
+      item->setData(Qt::UserRole, QVariant(i));
+      item->setText(GEOMBase::GetName(groups[i]));
+      item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
+      item->setCheckState(Qt::Checked);
+      lstGroups->addItem(item);
+      m_groups.append(GEOM::GeomObjPtr(groups[i].in()));
+    }
+    lstGroups->sortItems(Qt::AscendingOrder);
+
+    // add fields
+    GEOM::GEOM_IFieldOperations_var fieldOp = getGeomEngine()->GetIFieldOperations(getStudyId());
+
+    GEOM::ListOfFields_var fields = fieldOp->GetFields(m_mainObj);
+    for (int i = 0, n = fields->length(); i < n; i++)
+    {
+      QListWidgetItem* item = new QListWidgetItem();
+      item->setData(Qt::UserRole, QVariant(i));
+      item->setText(fields[i]->GetName());
+      item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
+      item->setCheckState(Qt::Checked);
+      lstFields->addItem(item);
+      m_fields.append(GEOM::GeomFieldPtr(fields[i].in()));
+    }
+    lstFields->sortItems(Qt::AscendingOrder);
+  }
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::ClickOnOk()
+{
+  setIsApplyAndClose(true);
+  if (ClickOnApply())
+    ClickOnCancel();
+  setIsApplyAndClose(false);
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool XAOPlugin_ExportDlg::ClickOnApply()
+{
+  if (!isApplyAndClose())
+  {
+    setIsDisableBrowsing(true);
+    setIsDisplayResult(false);
+  }
+
+  QString msg;
+  if (!isValid(msg))
+  {
+    showError(msg);
+    return false;
+  }
+  SUIT_OverrideCursor wc;
+  SUIT_Session::session()->activeApplication()->putInfo("");
+
+  try
+  {
+    if (openCommand())
+      if (!execute())
+      {
+        abortCommand();
+        showError();
+        return false;
+      }
+  }
+  catch (const SALOME::SALOME_Exception& e)
+  {
+    SalomeApp_Tools::QtCatchCorbaException(e);
+    abortCommand();
+    return false;
+  }
+  commitCommand();
+
+  if (!isApplyAndClose())
+  {
+    setIsDisableBrowsing(false);
+    setIsDisplayResult(true);
+  }
+
+  processObject();
+  return true;
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose  : Called when selection as changed or other case
+//=================================================================================
+void XAOPlugin_ExportDlg::SelectionIntoArgument()
+{
+  m_mainObj = GEOM::GEOM_Object::_nil();
+  LightApp_SelectionMgr* selMgr = myGeomGUI->getApp()->selectionMgr();
+  SALOME_ListIO selList;
+  selMgr->selectedObjects(selList);
+
+  if (selList.Extent() == 1)
+  {
+    m_mainObj = GEOMBase::ConvertIOinGEOMObject(selList.First());
+  }
+
+  processObject();
+}
+
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::SetEditCurrentArgument()
+{
+  ledShape->setFocus();
+  myEditCurrentArgument = ledShape;
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : btnFileSelectClicked()
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::btnFileSelectClicked()
+{
+  QString file = SUIT_FileDlg::getFileName(this, ledFileName->text(), 
+                                           tr("XAOPLUGIN_FILES"),
+                                           tr("XAOPLUGIN_EXPORT_SELECT"), false);
+  if ( !file.isEmpty() )
+    ledFileName->setText( file );
+}
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::ActivateThisDialog()
+{
+  GEOMBase_Skeleton::ActivateThisDialog();
+}
+
+//=================================================================================
+// function : enterEvent [REDEFINED]
+// purpose  :
+//=================================================================================
+void XAOPlugin_ExportDlg::enterEvent(QEvent*)
+{
+  if (!mainFrame()->GroupConstructors->isEnabled())
+    ActivateThisDialog();
+}
+
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr XAOPlugin_ExportDlg::createOperation()
+{
+  return getGeomEngine()->GetPluginOperations( getStudyId(), "XAOPluginEngine" );
+}
+
+//=================================================================================
+// function : isValid
+// purpose  :
+//=================================================================================
+bool XAOPlugin_ExportDlg::isValid(QString& msg)
+{
+  // check shape
+  if (ledShape->text().isEmpty())
+    return false;
+
+  // check file name
+  if (ledFileName->text().isEmpty())
+    return false;
+
+  return true;
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+bool XAOPlugin_ExportDlg::execute()
+{
+  bool res = false;
+
+  QString author = ledAuthor->text();
+  QString fileName = ledFileName->text();
+
+  // get selected groups
+  QList<QListWidgetItem*> selGroups;
+  for (int j = 0; j < lstGroups->count(); ++j)
+  {
+    if (lstGroups->item(j)->checkState() == Qt::Checked)
+      selGroups.append(lstGroups->item(j));
+  }
+
+  GEOM::ListOfGO_var groups = new GEOM::ListOfGO();
+  groups->length(selGroups.count());
+  int i = 0;
+  for (QList<QListWidgetItem*>::iterator it = selGroups.begin(); it != selGroups.end(); ++it)
+  {
+    QListWidgetItem* item = (*it);
+    int index = item->data(Qt::UserRole).toInt();
+    groups[i++] = m_groups[index].copy();
+  }
+
+  // get selected fields
+  QList<QListWidgetItem*> selFields;
+  for (int j = 0; j < lstFields->count(); ++j)
+  {
+    if (lstFields->item(j)->checkState() == Qt::Checked)
+      selFields.append(lstFields->item(j));
+  }
+
+  GEOM::ListOfFields_var fields = new GEOM::ListOfFields();
+  fields->length(selFields.count());
+  i = 0;
+  for (QList<QListWidgetItem*>::iterator it = selFields.begin(); it != selFields.end(); ++it)
+  {
+    QListWidgetItem* item = (*it);
+    int index = item->data(Qt::UserRole).toInt();
+    fields[i++] = m_fields[index].copy();
+  }
+
+  // call engine function
+  GEOM::IXAOOperations_var aXAOOp = GEOM::IXAOOperations::_narrow( getOperation() );
+  res = aXAOOp->ExportXAO(m_mainObj, groups, fields,
+                          author.toStdString().c_str(),
+                          fileName.toStdString().c_str());
+  return res;
+}