]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
22888: EDF 10437 GEOM: Dimensions improvements
authorakl <alexander.kovalev@opencascade.com>
Tue, 19 May 2015 08:15:20 +0000 (12:15 +0400)
committerakl <alexander.kovalev@opencascade.com>
Tue, 19 May 2015 08:15:20 +0000 (12:15 +0400)
14 files changed:
resources/CMakeLists.txt
resources/SalomeApp.xml.in
resources/Y14.5M-2009.ttf [new file with mode: 0644]
src/GEOMGUI/CMakeLists.txt
src/GEOMGUI/GEOMGUI_TextTreeWdg.cxx [new file with mode: 0644]
src/GEOMGUI/GEOMGUI_TextTreeWdg.h [new file with mode: 0644]
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GEOM_msg_fr.ts
src/GEOMGUI/GEOM_msg_ja.ts
src/GEOMGUI/GeometryGUI.cxx
src/GEOMGUI/GeometryGUI.h
src/MeasureGUI/MeasureGUI_CreateDimensionDlg.cxx
src/MeasureGUI/MeasureGUI_ManageDimensionsDlg.cxx

index cef2c42f2976d4ba54acafd65e34099d2858125e..44d86e7bc11cb47a801ed72da73ecbbfcc3e465d 100755 (executable)
@@ -35,6 +35,7 @@ SET( _res_files
   GEOM.config
   GEOMDS_Resources
   ShHealing
+  Y14.5M-2009.ttf
   3dsketch.png
   isoline.png
   isoline_v.png
index 84f53783c7e224fbc70819938ccc5890a03848b2..8e83fdbc2fe8e69c3afd42f3091eb9b90b70b317 100644 (file)
     <!-- Dimension presentation properties -->
     <parameter name="dimensions_color"          value="#ffffff" />
     <parameter name="dimensions_line_width"     value="1" />
-    <parameter name="dimensions_font_height"    value="10" />
+    <parameter name="dimensions_font"           value="Y14.5M-2009,14" />
     <parameter name="dimensions_arrow_length"   value="5" />
     <parameter name="dimensions_show_units"     value="0" />
     <parameter name="dimensions_length_units"   value="m" />
     <parameter name="dimensions_angle_units"    value="deg" />
-       <parameter name="dimensions_default_flyout" value="20" />
+    <parameter name="dimensions_default_flyout" value="20" />
+    <parameter name="dimensions_use_text3d"     value="0" />
 
     <!-- Scalar bar for field step presentation -->
     <parameter name="scalar_bar_x_position"   value="0.05" />
diff --git a/resources/Y14.5M-2009.ttf b/resources/Y14.5M-2009.ttf
new file mode 100644 (file)
index 0000000..1f1ca19
Binary files /dev/null and b/resources/Y14.5M-2009.ttf differ
index 211156716d5258f3f50994f9c608b09834c22584..c5e9e928f19b0d34ec243cdea90f3e10542158c0 100755 (executable)
@@ -76,12 +76,14 @@ SET(GEOMGUI_HEADERS
   GEOMGUI_Selection.h
   GEOM_GEOMGUI.hxx
   GEOMGUI_CreationInfoWdg.h
+  GEOMGUI_TextTreeWdg.h
   GEOMGUI_DimensionProperty.h
   )
 
 # header files / to be processed by moc
 SET(_moc_HEADERS 
   GEOMGUI_CreationInfoWdg.h
+  GEOMGUI_TextTreeWdg.h
   GeometryGUI.h
   )
 
@@ -114,6 +116,7 @@ SET(GEOMGUI_SOURCES
   GEOMGUI_OCCSelector.cxx
   GEOMGUI_Selection.cxx
   GEOMGUI_CreationInfoWdg.cxx
+  GEOMGUI_TextTreeWdg.cxx
   GEOMGUI_DimensionProperty.cxx
   ${_moc_SOURCES}
   ${_rcc_SOURCES}
diff --git a/src/GEOMGUI/GEOMGUI_TextTreeWdg.cxx b/src/GEOMGUI/GEOMGUI_TextTreeWdg.cxx
new file mode 100644 (file)
index 0000000..2c00a3b
--- /dev/null
@@ -0,0 +1,421 @@
+// Copyright (C) 2015  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
+//
+// File      : GEOMGUI_TextTreeWdg.cxx
+// Author    : Alexander KOVALEV (akl)
+
+#include "GEOMGUI_TextTreeWdg.h"
+
+#include "GEOMGUI_DimensionProperty.h"
+#include "GeometryGUI.h"
+#include "GeometryGUI_Operations.h"
+#include <GEOM_Constants.h>
+#include <GEOMUtils.hxx>
+
+// GUI includes
+#include <LightApp_Module.h>
+#include <SalomeApp_Application.h>
+#include <SalomeApp_Study.h>
+#include <SUIT_Desktop.h>
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_DataBrowser.h>
+
+// Qt includes
+#include <QAction>
+#include <QMenu>
+#include <QString>
+#include <QLabel>
+#include <QLineEdit>
+#include <QTreeWidget>
+#include <QHeaderView>
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QHash>
+
+GEOMGUI_TextTreeWdg::GEOMGUI_TextTreeWdg( SalomeApp_Application* app )
+  : myDisplayer(NULL)
+{
+  myStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+  myDisplayer = GEOM_Displayer( myStudy );
+
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  myVisibleIcon = QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_VISIBLE" ) ) );
+  myInvisibleIcon = QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_INVISIBLE" ) ) );
+
+  setWindowTitle( tr( "TEXT_TREE_VIEW_TITLE" ) );
+  setObjectName( "geomTextTreeWdg" );
+
+  setRootIsDecorated( true );
+  setSelectionMode( QAbstractItemView::ExtendedSelection );
+  setAllColumnsShowFocus( true );
+  setUniformRowHeights( true );
+
+  QStringList columnNames;
+  columnNames << tr("TEXT_TREE_VIEW_NAME") << "";
+  QTreeWidgetItem * headerItem = new QTreeWidgetItem( columnNames );
+  headerItem->setIcon( 1, myVisibleIcon );
+  setHeaderItem ( headerItem ); 
+  header()->moveSection( 1, 0 );
+  header()->setResizeMode( 1, QHeaderView::ResizeToContents );
+
+  QStringList rootNames;
+  rootNames << tr("GEOM_DIMENSIONS") << "";
+  myDimensionsItem = new QTreeWidgetItem( this, rootNames );
+  myDimensionsItem->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
+  addTopLevelItem( myDimensionsItem );
+
+  // get a free dockable window id
+  myWindowID = 11;
+  while( app->dockWindow( myWindowID ))
+    ++myWindowID;
+  ++myWindowID;
+
+  createActions();
+  setContextMenuPolicy( Qt::CustomContextMenu );
+  connect( this, SIGNAL( customContextMenuRequested(const QPoint&) ),
+          this, SLOT( showContextMenu(const QPoint&) ) );
+
+  connect( myStudy, SIGNAL( objVisibilityChanged( QString, Qtx::VisibilityState ) ), 
+          this, SLOT( updateVisibilityColumn( QString, Qtx::VisibilityState ) ) );
+  connect( app->objectBrowser(), SIGNAL( updated() ), this, SLOT( updateTree() ) );
+  GeometryGUI* aGeomGUI = dynamic_cast<GeometryGUI*>( app->module( "Geometry" ) );
+  connect( aGeomGUI, SIGNAL( DimensionsUpdated( const QString& ) ), this, SLOT( updateBranch( const QString& ) ) );
+  connect( this, SIGNAL( itemClicked( QTreeWidgetItem*, int) ), 
+          this, SLOT( onItemClicked( QTreeWidgetItem*, int ) ) );
+
+}
+
+GEOMGUI_TextTreeWdg::~GEOMGUI_TextTreeWdg()
+{
+  //std::cout<<"~GEOMGUI_TextTreeWdg"<<std::endl;
+}
+
+//=================================================================================
+// function : createActions
+// purpose  : Create context popup menu actions.
+//=================================================================================
+void GEOMGUI_TextTreeWdg::createActions()
+{
+  QAction* a = new QAction( tr( "MEN_DISPLAY" ), this );
+  a->setIcon( myVisibleIcon );
+  myActions.insert( GEOMOp::OpShow, a );
+  
+  QAction* b = new QAction( tr( "MEN_ERASE" ), this );
+  b->setIcon( myInvisibleIcon );
+  myActions.insert( GEOMOp::OpHide, b );
+}
+
+//=================================================================================
+// function : updateTree
+// purpose  :
+//=================================================================================
+void GEOMGUI_TextTreeWdg::updateTree()
+{
+  myStudy = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
+  _PTR(Study) aDSStudy = myStudy->studyDS();
+  if ( aDSStudy ) {
+    _PTR(SComponent) SC ( aDSStudy->FindComponent( "GEOM" ) );
+    if ( SC ) {
+      _PTR(ChildIterator) anIter ( aDSStudy->NewChildIterator( SC ) );
+      anIter->InitEx( true );
+      QList<QString> objEntries = myObjects.keys();
+      while( anIter->More() ) {
+       _PTR(SObject) valSO ( anIter->Value() );
+       _PTR(SObject) refSO;
+       if ( !valSO->ReferencedObject( refSO ) ) {
+         // update tree of object's dimensions
+         QString anEntry = valSO->GetID().c_str();
+         updateBranch( anEntry );
+         objEntries.removeAll( anEntry );
+       }
+       anIter->Next();
+      }
+      foreach (QString entry, objEntries) {
+       removeBranch( entry, true );
+      }
+    }
+  }
+}
+  
+//=================================================================================
+// function : updateBranch
+// purpose  :
+//=================================================================================
+void GEOMGUI_TextTreeWdg::updateBranch( const QString& theEntry )
+{
+  myStudy = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
+  if ( myStudy ) {
+    _PTR(Study) aStudyDS = myStudy->studyDS();
+    if ( aStudyDS ) {
+      _PTR(SObject) obj( aStudyDS->FindObjectID( theEntry.toStdString() ) );
+      QString aName = obj->GetName().c_str();
+  
+      GEOMGUI_DimensionProperty aProp;
+      aProp.LoadFromAttribute( myStudy, theEntry.toStdString() );
+      int nbProps = aProp.GetNumber();
+
+      QTreeWidgetItem* objectItem = itemFromEntry( theEntry );
+      if ( objectItem ) {
+       removeBranch( theEntry, nbProps > 0 ? false : true );
+      }
+      QStringList itemName;
+      if ( nbProps > 0 ) {
+       itemName << aName << "";
+       if ( !objectItem ) {
+         objectItem = new QTreeWidgetItem( myDimensionsItem, itemName );
+         objectItem->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
+         objectItem->setData( 1, Qt::UserRole, theEntry );
+         myDimensionsItem->addChild( objectItem );
+         myObjects.insert( theEntry, objectItem );
+         if ( myDimensionsItem->childCount() == 1 )
+           myDimensionsItem->setExpanded( true );
+       }
+       bool isDisplayed = myDisplayer.IsDisplayed( theEntry );
+       // read dimension records from property
+       for ( int anIt = 0; anIt < aProp.GetNumber(); ++anIt )
+         {
+           QString aName  = aProp.GetName( anIt );
+           bool isVisible = aProp.IsVisible( anIt );
+
+           QTreeWidgetItem* anItem = new QTreeWidgetItem;
+           anItem->setText( 0, aName );
+           //  if ( isDisplayed )
+           anItem->setIcon( 1, isVisible ? myVisibleIcon : myInvisibleIcon );
+           anItem->setData( 0, Qt::UserRole, anIt );
+           anItem->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
+           objectItem->addChild( anItem ); 
+         }
+      }
+    }
+  }
+}
+
+//=================================================================================
+// function : removeBranch
+// purpose  :
+//=================================================================================
+void GEOMGUI_TextTreeWdg::removeBranch( const QString& theEntry, bool force )
+{
+  QTreeWidgetItem* objectItem = itemFromEntry( theEntry );
+  if ( !objectItem )
+    return;
+  qDeleteAll( objectItem->takeChildren() );
+  if ( force ) {
+    myDimensionsItem->removeChild( objectItem );
+    myObjects.remove( theEntry );
+  }
+}
+
+//=================================================================================
+// function : onItemClicked()
+// purpose  : called when tree item was clicked
+//=================================================================================
+void GEOMGUI_TextTreeWdg::onItemClicked( QTreeWidgetItem* theItem, int theColumn )
+{
+  if( theColumn != 1 || theItem->icon( 1 ).isNull() || theItem->isDisabled() )
+    return;
+  
+  std::string anEntry = entryFromItem( theItem->parent() ).toStdString();
+  int aDimIndex = idFromItem( theItem );
+  GEOMGUI_DimensionProperty aProp;
+  aProp.LoadFromAttribute( myStudy, anEntry );
+  if ( aProp.IsVisible( aDimIndex ) ) {
+    aProp.SetVisible( aDimIndex, false );
+    theItem->setIcon( 1, myInvisibleIcon );
+  } else {
+    aProp.SetVisible( aDimIndex, true );
+    theItem->setIcon( 1, myVisibleIcon );
+  }
+  aProp.SaveToAttribute( myStudy, anEntry );
+  redisplay( anEntry.c_str() );
+}
+
+//=================================================================================
+// function : idFromItem
+// purpose  :
+//=================================================================================
+int GEOMGUI_TextTreeWdg::idFromItem( QTreeWidgetItem* theItem )
+{
+  if ( !theItem )
+    return -1;
+
+  bool isIdOK = false;
+  const int anId = theItem->data( 0, Qt::UserRole ).toInt( &isIdOK );
+
+  return isIdOK ? anId : -1;
+}
+
+//=================================================================================
+// function : entryFromItem
+// purpose  :
+//=================================================================================
+QString GEOMGUI_TextTreeWdg::entryFromItem( QTreeWidgetItem* theShapeItem )
+{
+  if ( !theShapeItem )
+    return "";
+
+  return theShapeItem->data( 1, Qt::UserRole ).toString();
+}
+
+//=================================================================================
+// function : itemFromEntry
+// purpose  :
+//=================================================================================
+QTreeWidgetItem* GEOMGUI_TextTreeWdg::itemFromEntry( QString theEntry )
+{
+  if ( theEntry.isEmpty() )
+    return 0;
+
+  return myObjects.value( theEntry, 0 );
+}
+
+//=================================================================================
+// function : updateVisibilityColumn
+// purpose  : Update icons of dimension items.
+//=================================================================================
+void GEOMGUI_TextTreeWdg::updateVisibilityColumn( QString theEntry, Qtx::VisibilityState theState )
+{
+  QTreeWidgetItem* anItem = itemFromEntry( theEntry );
+  if ( !anItem )
+    return;
+  anItem->setDisabled( theState != Qtx::ShownState );
+  QTreeWidgetItem* aChildItem;
+  GEOMGUI_DimensionProperty aProp;
+  for ( int i=0; i < anItem->childCount(); i++ ) {
+    aChildItem = anItem->child( i );
+    if ( theState == Qtx::ShownState ) {
+      aProp.LoadFromAttribute( myStudy, theEntry.toStdString() );
+      if ( aProp.GetNumber() == 0 )
+       continue;
+      aChildItem->setIcon( 1, aProp.IsVisible( idFromItem( aChildItem ) ) ? myVisibleIcon : myInvisibleIcon );
+      aChildItem->setDisabled( false );
+    } else {
+      aChildItem->setIcon( 1, QIcon() );
+      aChildItem->setDisabled( true );
+    }
+  }
+}
+
+//=================================================================================
+// function : showContextMenu
+// purpose  : 
+//=================================================================================
+void GEOMGUI_TextTreeWdg::showContextMenu( const QPoint& pos )
+{
+  if ( selectedItems().isEmpty() )
+    return;
+  QMenu aMenu;
+  aMenu.addAction( myActions[GEOMOp::OpShow] );
+  aMenu.addAction( myActions[GEOMOp::OpHide] );
+  if ( selectedItems().count() == 1 ) {
+    QTreeWidgetItem* anItem = selectedItems().first();
+    QString anEntry = entryFromItem( anItem->parent() );
+    if ( !anEntry.isEmpty() ) {
+      GEOMGUI_DimensionProperty aProp;
+      aProp.LoadFromAttribute( myStudy, anEntry.toStdString() );
+      if ( aProp.GetNumber() == 0 )
+       return;
+      aMenu.clear();
+      if ( aProp.IsVisible( idFromItem( anItem ) ) )
+       aMenu.addAction( myActions[GEOMOp::OpHide] );
+      else
+       aMenu.addAction( myActions[GEOMOp::OpShow] );
+    }
+  }
+  QAction* selPopupItem = aMenu.exec( viewport()->mapToGlobal(pos) );
+  if ( selPopupItem == myActions[GEOMOp::OpShow] )
+    setVisibility( true );
+  else if ( selPopupItem == myActions[GEOMOp::OpHide] )
+    setVisibility( false );
+}
+
+//=================================================================================
+// function : setVisibility
+// purpose  : 
+//=================================================================================
+void GEOMGUI_TextTreeWdg::setVisibility( bool theVisibility )
+{
+  if ( myDimensionsItem->isSelected() ) {
+    // set visibility for all dimensions
+    QTreeWidgetItem* anItem;
+    foreach ( QString entry, myObjects.keys() ) {
+      anItem = itemFromEntry( entry );
+      if ( !anItem->isDisabled() )
+       setShapeDimensionsVisibility( entry, theVisibility );
+    }
+    return;
+  }
+  foreach ( QTreeWidgetItem* item, selectedItems() ) {
+    if ( item->isDisabled() || item->parent()->isSelected() )
+      continue;
+    QString anEntry = entryFromItem( item );
+    if ( !anEntry.isEmpty() ) {
+      // it is a shape item
+      setShapeDimensionsVisibility( anEntry, theVisibility );
+    } else {
+      // it is a dimension item
+      anEntry = entryFromItem( item->parent() );
+      setDimensionVisibility( anEntry, item, theVisibility );
+    }
+  }
+}
+
+//=================================================================================
+// function : setShapeDimensionsVisibility
+// purpose  : 
+//=================================================================================
+void GEOMGUI_TextTreeWdg::setShapeDimensionsVisibility( QString theEntry, bool theVisibility )
+{
+  QTreeWidgetItem* anItem = itemFromEntry( theEntry );
+  QTreeWidgetItem* aChildItem;
+  for ( int i=0; i < anItem->childCount(); i++ ) {
+    aChildItem = anItem->child( i );
+    setDimensionVisibility( theEntry, aChildItem, theVisibility );
+  }
+  redisplay( theEntry );
+}
+
+//=================================================================================
+// function : setDimensionVisibility
+// purpose  : 
+//=================================================================================
+void GEOMGUI_TextTreeWdg::setDimensionVisibility( QString theEntry, QTreeWidgetItem* theDimItem, bool theVisibility )
+{
+  GEOMGUI_DimensionProperty aProp;
+  aProp.LoadFromAttribute( myStudy, theEntry.toStdString() );
+  int aDimIndex = idFromItem( theDimItem );
+  if ( aProp.GetNumber() == 0  || aProp.IsVisible( aDimIndex ) == theVisibility )
+    return;;
+  aProp.SetVisible( aDimIndex, theVisibility );
+  aProp.SaveToAttribute( myStudy, theEntry.toStdString() );
+
+  theDimItem->setIcon( 1, theVisibility ? myVisibleIcon : myInvisibleIcon );
+  redisplay( theEntry );
+}
+
+//=================================================================================
+// function : redisplay
+// purpose  : 
+//=================================================================================
+void GEOMGUI_TextTreeWdg::redisplay( QString theEntry )
+{
+  Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( theEntry.toLatin1().constData(), "GEOM", "TEMP_IO" );
+  myDisplayer.Redisplay( io );
+}
diff --git a/src/GEOMGUI/GEOMGUI_TextTreeWdg.h b/src/GEOMGUI/GEOMGUI_TextTreeWdg.h
new file mode 100644 (file)
index 0000000..689a21a
--- /dev/null
@@ -0,0 +1,89 @@
+// Copyright (C) 2015  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
+//
+
+#ifndef GEOMGUI_TEXTTREEWDG_H
+#define GEOMGUI_TEXTTREEWDG_H
+
+#include "GEOM_GEOMGUI.hxx"
+#include "GEOM_Displayer.h"
+
+#include <QTreeWidget>
+#include <QHash>
+
+#include <SALOMEDSClient.hxx>
+
+class QLabel;
+class QLineEdit;
+class QString;
+class QTreeWidgetItem;
+class SalomeApp_Application;
+class SalomeApp_Study;
+
+/*!
+ * \brief Tree view contains Dimension and Annotation text items:
+ *  - text visibility in OCC viewer
+ *  - text object name
+ */
+class GEOMGUI_EXPORT GEOMGUI_TextTreeWdg : public QTreeWidget
+{
+  Q_OBJECT
+
+ public:
+  GEOMGUI_TextTreeWdg( SalomeApp_Application* app );
+  ~GEOMGUI_TextTreeWdg();
+
+  int getWinID() { return myWindowID; }
+
+  void                          removeBranch( const QString& theEntry, 
+                                             bool force = true );
+  int                           idFromItem( QTreeWidgetItem* theItem );
+  QString                       entryFromItem( QTreeWidgetItem* theShapeItem );
+  QTreeWidgetItem*              itemFromEntry( QString theEntry );
+  void                          setShapeDimensionsVisibility( QString theEntry, bool theVisibility );
+  void                          setDimensionVisibility( QString theEntry, QTreeWidgetItem* theDimItem, bool theVisibility );
+
+protected:
+  void                          createActions();
+  void                          redisplay( QString theEntry );
+
+ public slots:
+  void                          updateTree();
+  void                          updateBranch( const QString& theEntry );
+
+private slots:
+  void                          onItemClicked(QTreeWidgetItem*, int );
+  void                          updateVisibilityColumn( QString theEntry, Qtx::VisibilityState theState );
+  void                          setVisibility( bool visibility );
+  void                          showContextMenu( const QPoint& pos );
+
+ private:
+
+  int                           myWindowID;
+
+  QIcon                         myVisibleIcon;
+  QIcon                         myInvisibleIcon;
+  QHash<QString, QTreeWidgetItem*> myObjects;
+  SalomeApp_Study*              myStudy;
+  QTreeWidgetItem*              myDimensionsItem;
+  GEOM_Displayer                myDisplayer;
+
+  QMap<int, QAction*>           myActions;   //!< menu actions list
+
+};
+#endif
index 205e9db757d3655cfc148e5a2548d17fdeea4068..3166ac20a98e47b4ab47eb70e11be71fb4de214c 100644 (file)
@@ -1234,11 +1234,12 @@ void GEOM_Displayer::updateDimensions( const Handle(SALOME_InteractiveObject)& t
 
   QColor  aQColor       = aResMgr->colorValue  ( "Geometry", "dimensions_color", QColor( 0, 255, 0 ) );
   int     aLineWidth    = aResMgr->integerValue( "Geometry", "dimensions_line_width", 1 );
-  double  aFontHeight   = aResMgr->doubleValue ( "Geometry", "dimensions_font_height", 10 );
+  QFont   aFont         = aResMgr->fontValue   ( "Geometry", "dimensions_font", QFont("Y14.5M-2009", 14) );
   double  anArrowLength = aResMgr->doubleValue ( "Geometry", "dimensions_arrow_length", 5 );
   bool    isUnitsShown  = aResMgr->booleanValue( "Geometry", "dimensions_show_units", false );
   QString aUnitsLength  = aResMgr->stringValue ( "Geometry", "dimensions_length_units", "m" );
   QString aUnitsAngle   = aResMgr->stringValue ( "Geometry", "dimensions_angle_units", "deg" );
+  bool    aUseText3d    = aResMgr->booleanValue( "Geometry", "dimensions_use_text3d", false );
 
   // restore dimension presentation from saved attribute or property data
   AIS_ListOfInteractive aRestoredDimensions;
@@ -1304,10 +1305,12 @@ void GEOM_Displayer::updateDimensions( const Handle(SALOME_InteractiveObject)& t
 
     aStyle->SetCommonColor( aColor );
     aStyle->MakeUnitsDisplayed( (Standard_Boolean) isUnitsShown );
-    aStyle->MakeText3d( Standard_True );
+    aStyle->MakeText3d( aUseText3d );
     aStyle->MakeTextShaded( Standard_True );
-    aStyle->SetExtensionSize( aFontHeight * 0.5 );
-    aStyle->TextAspect()->SetHeight( aFontHeight );
+    int fsize = aFont.pixelSize() != -1 ? aFont.pixelSize() : aFont.pointSize();
+    aStyle->SetExtensionSize( fsize * 0.5 );
+    aStyle->TextAspect()->SetFont( aFont.family().toLatin1().data() );
+    aStyle->TextAspect()->SetHeight( fsize );
     aStyle->ArrowAspect()->SetLength( anArrowLength );
     aStyle->LineAspect()->SetWidth( aLineWidth );
     aStyle->SetTextHorizontalPosition( aPrs->DimensionAspect()->TextHorizontalPosition() );
index c67b290feba7362eab118cbb672ec97516e3bdab..9e13e729b97177cb197c7ddfba1271fcda91ca52 100644 (file)
@@ -3453,8 +3453,8 @@ Please, select face, shell or solid and try again</translation>
         <translation>Line width</translation>
     </message>
     <message>
-        <source>PREF_DIMENSIONS_FONT_HEIGHT</source>
-        <translation>Font height</translation>
+        <source>PREF_DIMENSIONS_FONT</source>
+        <translation>Font</translation>
     </message>
     <message>
         <source>PREF_DIMENSIONS_ARROW_LENGTH</source>
@@ -3476,6 +3476,10 @@ Please, select face, shell or solid and try again</translation>
         <source>PREF_DIMENSIONS_SHOW_UNITS</source>
         <translation>Show units of measurement</translation>
     </message>
+    <message>
+        <source>PREF_DIMENSIONS_USE_TEXT3D</source>
+        <translation>Use 3D text</translation>
+    </message>
     <message>
         <source>PREF_HIDE_INPUT_OBJECT</source>
         <translation>Hide input objects from the viewer</translation>
@@ -7238,6 +7242,17 @@ Do you want to create new material?</translation>
         <translation>(No info available)</translation>
     </message>
 </context>
+<context>
+    <name>GEOMGUI_TextTreeWdg</name>
+    <message>
+        <source>TEXT_TREE_VIEW_TITLE</source>
+        <translation>Text</translation>
+    </message>
+    <message>
+        <source>TEXT_TREE_VIEW_NAME</source>
+        <translation>Name</translation>
+    </message>
+</context>
 <context>
     <name>EntityGUI_IsolineDlg</name>
     <message>
index 0ab7e34fc6dc1e8b2abcb8073cf1d230dd29b27c..54b86aee7abbd293d7c8511f5da5d2704b259d36 100644 (file)
@@ -3401,8 +3401,8 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <translation>Epaisseur de la ligne</translation>
     </message>
     <message>
-        <source>PREF_DIMENSIONS_FONT_HEIGHT</source>
-        <translation>Taille de police</translation>
+        <source>PREF_DIMENSIONS_FONT</source>
+        <translation type="unfinished">Font</translation>
     </message>
     <message>
         <source>PREF_DIMENSIONS_ARROW_LENGTH</source>
@@ -3424,6 +3424,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
         <source>PREF_DIMENSIONS_SHOW_UNITS</source>
         <translation>Afficher les unités</translation>
     </message>
+    <message>
+        <source>PREF_DIMENSIONS_USE_TEXT3D</source>
+        <translation type="unfinished">Use 3D text</translation>
+    </message>
     <message>
         <source>PREF_HIDE_INPUT_OBJECT</source>
         <translation type="unfinished">Hide input objects from the viewer</translation>
@@ -7171,6 +7175,17 @@ Voulez-vous en créer un nouveau ?</translation>
         <translation>(aucune information disponible)</translation>
     </message>
 </context>
+<context>
+    <name>GEOMGUI_TextTreeWdg</name>
+    <message>
+        <source>TEXT_TREE_VIEW_TITLE</source>
+        <translation type="unfinished">Text</translation>
+    </message>
+    <message>
+        <source>TEXT_TREE_VIEW_NAME</source>
+        <translation type="unfinished">Name</translation>
+    </message>
+</context>
 <context>
     <name>EntityGUI_IsolineDlg</name>
     <message>
index 75807fcc71114f00d3a01419d14e22bd597b0ea7..5f181fa6e1237c139277da9f90b8c2577fe50db1 100644 (file)
       <translation>線幅</translation>
     </message>
     <message>
-      <source>PREF_DIMENSIONS_FONT_HEIGHT</source>
-      <translation>フォント高さ</translation>
+        <source>PREF_DIMENSIONS_FONT</source>
+        <translation type="unfinished">Font</translation>
     </message>
     <message>
       <source>PREF_DIMENSIONS_ARROW_LENGTH</source>
       <translation>測定単位の表示</translation>
     </message>
     <message>
-        <source>PREF_HIDE_INPUT_OBJECT</source>
-        <translation type="unfinished">Hide input objects from the viewer</translation>
+      <source>PREF_DIMENSIONS_USE_TEXT3D</source>
+      <translation type="unfinished">Use 3D text</translation>
+    </message>
+    <message>
+      <source>PREF_HIDE_INPUT_OBJECT</source>
+      <translation type="unfinished">Hide input objects from the viewer</translation>
     </message>
     <message>
       <source>PREF_ISOS</source>
       <translation>(有効情報なし)</translation>
     </message>
   </context>
+  <context>
+    <name>GEOMGUI_TextTreeWdg</name>
+    <message>
+        <source>TEXT_TREE_VIEW_TITLE</source>
+        <translation type="unfinished">Text</translation>
+    </message>
+    <message>
+        <source>TEXT_TREE_VIEW_NAME</source>
+        <translation type="unfinished">Name</translation>
+    </message>
+  </context>
   <context>
     <name>EntityGUI_IsolineDlg</name>
     <message>
index 25832ed53cda0cb3bb6b5bcfcf6ac99176873049..ffe4ee97f4022bb421b19b89dd9794054274ffb0 100644 (file)
@@ -33,6 +33,7 @@
 #include "GEOMGUI_OCCSelector.h"
 #include "GEOMGUI_Selection.h"
 #include "GEOMGUI_CreationInfoWdg.h"
+#include "GEOMGUI_TextTreeWdg.h"
 #include "GEOMGUI_DimensionProperty.h"
 #include "GEOM_Constants.h"
 #include "GEOM_Displayer.h"
@@ -86,6 +87,7 @@
 #include <SALOMEDS_SObject.hxx>
 
 #include <Basics_OCCTVersion.hxx>
+#include <QtxFontEdit.h>
 
 // External includes
 #include <QDir>
@@ -97,6 +99,7 @@
 #include <QString>
 #include <QPainter>
 #include <QSignalMapper>
+#include <QFontDatabase>
 
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 #include <NCollection_DataMap.hxx>
 
 #include <TColStd_HArray1OfByte.hxx>
+#include <TColStd_SequenceOfHAsciiString.hxx>
 
 #include <utilities.h>
 
 #include <Standard_Failure.hxx>
 #include <Standard_ErrorHandler.hxx>
 
+#include <Font_SystemFont.hxx>
+#include <Font_FontMgr.hxx>
+#include <TCollection_HAsciiString.hxx>
+
 #include "GEOM_version.h"
 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
 
@@ -218,6 +226,7 @@ GeometryGUI::GeometryGUI() :
   myLocalSelectionMode = GEOM_ALLOBJECTS;
 
   myCreationInfoWdg = 0;
+  myTextTreeWdg = 0;
 
   connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
 
@@ -1783,6 +1792,11 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
 
+  if ( !myTextTreeWdg )
+    myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() );
+  getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg );
+  getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
+
   //NPAL 19674
   SALOME_ListIO selected;
   sm->selectedObjects( selected );
@@ -1844,8 +1858,15 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study )
 
   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
-  getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
-  myCreationInfoWdg = 0;
+  if ( myCreationInfoWdg ) {
+    getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
+    myCreationInfoWdg = 0;
+  }
+  if ( myTextTreeWdg ) {
+    getApp()->removeDockWindow( myTextTreeWdg->getWinID() );
+    disconnect( application(), 0, myTextTreeWdg, 0 );
+    myTextTreeWdg = 0;
+  }
 
   EmitSignalCloseAllDialogs();
 
@@ -1903,6 +1924,8 @@ void GeometryGUI::windows( QMap<int, int>& mappa ) const
   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
   if ( myCreationInfoWdg )
     mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
+  if ( myTextTreeWdg )
+    mappa.insert( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
 }
 
 void GeometryGUI::viewManagers( QStringList& lst ) const
@@ -2237,6 +2260,8 @@ void GeometryGUI::OnSetMaterial(const QString& theName)
 
 void GeometryGUI::createPreferences()
 {
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+
   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
 
   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
@@ -2333,12 +2358,36 @@ void GeometryGUI::createPreferences()
   setPreferenceProperty( aDimLineWidthId, "min", 1 );
   setPreferenceProperty( aDimLineWidthId, "max", 5 );
 
-  int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId,
-                                        LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" );
-
-  setPreferenceProperty( aDimFontHeightId, "min", 1e-9 );
-  setPreferenceProperty( aDimFontHeightId, "max", 1e+9 );
-  setPreferenceProperty( aDimFontHeightId, "precision", 9 );
+  int aDimFontId = addPreference( tr( "PREF_DIMENSIONS_FONT" ), aDimGroupId, LightApp_Preferences::Font, "Geometry", "dimensions_font" );
+
+  int f = QtxFontEdit::Family | QtxFontEdit::Size;
+  setPreferenceProperty( aDimFontId, "features", f );
+  setPreferenceProperty( aDimFontId, "mode", QtxFontEdit::Custom );
+
+  Handle(Font_FontMgr) fmgr = Font_FontMgr::GetInstance();
+  QString aFontFile = "";
+  resMgr->value("resources", "GEOM", aFontFile);
+  aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf";
+  // add enginier font into combobox
+  int fontID = QFontDatabase::addApplicationFont( aFontFile );
+  Handle(Font_SystemFont) sf = new Font_SystemFont( 
+    new TCollection_HAsciiString("Y14.5M-2009"), 
+    Font_FA_Regular, 
+    new TCollection_HAsciiString(aFontFile.toLatin1().data()) );
+  // register font in OCC font manager
+  fmgr->RegisterFont( sf, Standard_False );
+
+  // get list of supported fonts by OCC
+  QStringList anOCCFonts;
+  TColStd_SequenceOfHAsciiString theFontsNames;
+  fmgr->GetAvailableFontsNames( theFontsNames );
+  for(Standard_Integer i=1; i<=theFontsNames.Length(); i++) {
+    Handle(TCollection_HAsciiString) str = theFontsNames(i);
+    anOCCFonts << str->ToCString();
+  }
+  anOCCFonts.removeDuplicates();
+  // set the supported fonts into combobox to use its only
+  setPreferenceProperty( aDimFontId, "fonts", anOCCFonts );
 
   int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
                                        LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
@@ -2353,9 +2402,6 @@ void GeometryGUI::createPreferences()
   int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
                                    LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
 
-  addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
-                 LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
-
   QStringList aListOfLengthUnits;
   aListOfLengthUnits << "m";
   aListOfLengthUnits << "cm";
@@ -2370,6 +2416,9 @@ void GeometryGUI::createPreferences()
   setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
   setPreferenceProperty( anAngUnitsId,   "strings", aListOfAngUnits );
 
+  addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
+                 LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
+
   int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
                                      LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
 
@@ -2377,6 +2426,9 @@ void GeometryGUI::createPreferences()
   setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
   setPreferenceProperty( aDimDefFlyout, "precision", 9 );
 
+  addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId,
+                 LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" );
+
   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
   setPreferenceProperty( isoGroup, "columns", 2 );
   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
@@ -2483,7 +2535,6 @@ void GeometryGUI::createPreferences()
   QList<QVariant> aMarkerTypeIndicesList;
   QList<QVariant> aMarkerTypeIconsList;
 
-  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
@@ -2645,11 +2696,12 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
     }
     else if ( param == QString("dimensions_color")        ||
               param == QString("dimensions_line_width")   ||
-              param == QString("dimensions_font_height")  ||
+              param == QString("dimensions_font")         ||
               param == QString("dimensions_arrow_length") ||
               param == QString("dimensions_show_units")   ||
               param == QString("dimensions_length_units") ||
               param == QString("dimensions_angle_units")  ||
+              param == QString("dimensions_use_text3d")  ||
               param == QString("label_color") )
     {
       SalomeApp_Application* anApp = getApp();
@@ -3468,3 +3520,8 @@ void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* wher
   // update Object browser
   getApp()->updateObjectBrowser( false );
 }
+
+void GeometryGUI::emitDimensionsUpdated( QString entry )
+{
+  emit DimensionsUpdated( entry );
+}
index 53d314ed127faf41f8ec5e36d1bfedf9fb8b0ef1..f0abf2da2244d5ba81cfdd3985a19d45769d5dbb 100644 (file)
@@ -64,6 +64,7 @@ class LightApp_Selection;
 class SUIT_ViewManager;
 class SalomeApp_Study;
 class GEOMGUI_CreationInfoWdg;
+class GEOMGUI_TextTreeWdg;
 
 //=================================================================================
 // class    : GeometryGUI
@@ -148,6 +149,8 @@ public:
                                            SUIT_DataObject* where,
                                            const int row, Qt::DropAction action );
 
+  void                        emitDimensionsUpdated( QString entry );
+
 public slots:
   virtual bool                deactivateModule( SUIT_Study* );
   virtual bool                activateModule( SUIT_Study* );
@@ -176,6 +179,7 @@ signals :
   void                        SignalDefaultStepValueChanged( double newVal );
   void                        SignalDependencyTreeParamChanged( const QString&, const QString& );
   void                        SignalDependencyTreeRenameObject( const QString& );
+  void                        DimensionsUpdated( const QString& );
 
 protected:
   virtual LightApp_Selection* createSelection() const;
@@ -224,6 +228,8 @@ private:
 
   GEOMGUI_CreationInfoWdg*    myCreationInfoWdg;
   
+  GEOMGUI_TextTreeWdg*       myTextTreeWdg;
+  
   SALOME_ListIO               myTopLevelIOList;               
 
   friend class DisplayGUI;
index 2576676b22cbebdb342cbe54df4fb91ea203afbc..45ef0135f56583e60dd216e26ed812e43a135322 100644 (file)
@@ -495,12 +495,13 @@ Handle(AIS_Dimension) MeasureGUI_CreateDimensionDlg::CreateDimension()
 
   QColor  aQColor       = aResMgr->colorValue  ( "Geometry", "dimensions_color", QColor( 0, 255, 0 ) );
   int     aLineWidth    = aResMgr->integerValue( "Geometry", "dimensions_line_width", 1 );
-  double  aFontHeight   = aResMgr->doubleValue ( "Geometry", "dimensions_font_height", 10 );
+  QFont   aFont         = aResMgr->fontValue   ( "Geometry", "dimensions_font", QFont("Y14.5M-2009", 14) );
   double  anArrowLength = aResMgr->doubleValue ( "Geometry", "dimensions_arrow_length", 5 );
   double  aDefFlyout    = aResMgr->doubleValue ( "Geometry", "dimensions_default_flyout", 20 );
   bool    isUnitsShown  = aResMgr->booleanValue( "Geometry", "dimensions_show_units", false );
   QString aUnitsLength  = aResMgr->stringValue ( "Geometry", "dimensions_length_units", "m" );
   QString aUnitsAngle   = aResMgr->stringValue ( "Geometry", "dimensions_angle_units", "deg" );
+  bool    aUseText3d    = aResMgr->booleanValue( "Geometry", "dimensions_use_text3d", false );
 
   OCCViewer_ViewWindow* anActiveView = NULL;
 
@@ -610,10 +611,12 @@ Handle(AIS_Dimension) MeasureGUI_CreateDimensionDlg::CreateDimension()
 
   aStyle->SetCommonColor( aColor );
   aStyle->MakeUnitsDisplayed( (Standard_Boolean) isUnitsShown );
-  aStyle->MakeText3d( Standard_True );
+  aStyle->MakeText3d( aUseText3d );
   aStyle->MakeTextShaded( Standard_True );
-  aStyle->SetExtensionSize( aFontHeight * 0.5 );
-  aStyle->TextAspect()->SetHeight( aFontHeight );
+  int fsize = aFont.pixelSize() != -1 ? aFont.pixelSize() : aFont.pointSize();
+  aStyle->SetExtensionSize( fsize * 0.5 );
+  aStyle->TextAspect()->SetFont( aFont.family().toLatin1().data() );
+  aStyle->TextAspect()->SetHeight( fsize );
   aStyle->ArrowAspect()->SetLength( anArrowLength );
   aStyle->LineAspect()->SetWidth( aLineWidth );
 
index 7dfda2db95897fbbd6dd1bf4d0129ff464bc664c..370204f943b527def41a9b8ff8f2fef79723f211 100644 (file)
@@ -29,6 +29,7 @@
 #include "MeasureGUI_DimensionFilter.h"
 
 #include <GEOMGUI_DimensionProperty.h>
+#include <GEOMGUI_TextTreeWdg.h>
 #include <GEOMUtils.hxx>
 #include <GEOMGUI_OCCSelector.h>
 #include <GEOM_AISDimension.hxx>
@@ -771,6 +772,8 @@ bool MeasureGUI_ManageDimensionsDlg::ClickOnApply()
 
   mySavedPropertyState.SaveToAttribute( aStudy, myEditObject->GetStudyEntry() );
 
+  myGeomGUI->emitDimensionsUpdated( QString( myEditObject->GetStudyEntry() ) );
+
   return true;
 }
 
@@ -807,6 +810,8 @@ void MeasureGUI_ManageDimensionsDlg::OnFinish()
                              QVariant() );
 
   redisplay( myEditObject.get() );
+  
+  myGeomGUI->emitDimensionsUpdated( QString( myEditObject->GetStudyEntry() ) );
 }
 
 //=================================================================================