]> SALOME platform Git repositories - modules/visu.git/blob - src/VISUGUI/VisuGUI_StreamLinesDlg.cxx
Salome HOME
NRI : Merge from V1_2.
[modules/visu.git] / src / VISUGUI / VisuGUI_StreamLinesDlg.cxx
1 //  VISU VISUGUI : GUI of VISU component
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : VisuGUI_StreamLinesDlg.cxx
8 //  Author : Vitaly SMETANNIKOV
9 //  Module : VISU
10
11 #include "VisuGUI_StreamLinesDlg.h"
12 #include <limits.h>
13 #include <qlayout.h>
14 #include <qgroupbox.h>
15 #include <qcolordialog.h>
16 #include "QAD_Application.h"
17 #include "QAD_Desktop.h"
18 #include "QAD_Config.h"
19 #include "VisuGUI.h"
20 #include "SALOME_Selection.h"
21
22
23 extern VisuGUI *visuGUI;
24
25 VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg()
26     : QDialog( QAD_Application::getDesktop(), "VisuGUI_StreamLinesDlg", false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
27 {
28   setCaption("Stream lines Preferences");
29   setSizeGripEnabled( TRUE );
30
31   QGridLayout* TopLayout = new QGridLayout( this ); 
32   TopLayout->setSpacing( 6 );
33   TopLayout->setMargin( 11 );
34
35   // Source box
36   QGroupBox* aSourceBox = new QGroupBox(tr("Source"), this);
37   aSourceBox->setColumnLayout(0, Qt::Vertical);
38   QGridLayout* aSrcLayout = new QGridLayout( aSourceBox->layout() ); 
39   aSrcLayout->setSpacing( 6 );
40   aSrcLayout->setMargin( 0 );
41   
42   myUseSrcChk = new QCheckBox(tr("Use source presentation"), aSourceBox);
43   aSrcLayout->addMultiCellWidget(myUseSrcChk, 0, 0, 0, 1);
44
45   mySrcCombo = new QComboBox(aSourceBox);
46   mySrcCombo->setEnabled(myUseSrcChk->isChecked());
47
48   // Find All prs obj
49   QAD_Study* aActiveStudy =  VisuGUI::GetActiveStudy();
50   SALOME_Selection* aSel = SALOME_Selection::Selection( aActiveStudy->getSelection() );
51   if( aSel->IObjectCount() > 0 ) {
52     Handle(SALOME_InteractiveObject) aIO = aSel->firstIObject();
53     if (aIO->hasEntry()){
54       SALOMEDS::SObject_var aSObject = VisuGUI::GetStudyDocument()->FindObjectID(aIO->getEntry());
55       SALOMEDS::SComponent_var aComp = aSObject->GetFatherComponent();
56       SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( aComp );
57
58       for (aIter->InitEx(true); aIter->More(); aIter->Next() ) {
59         SALOMEDS::SObject_var aChildSObj = aIter->Value();
60         CORBA::Object_var aChildObject = VISU::SObjectToObject( aChildSObj );
61         if(!CORBA::is_nil( aChildObject ) ) {
62           VISU::Prs3d_var aPrsObj = VISU::Prs3d::_narrow( aChildObject );
63           if( !CORBA::is_nil( aPrsObj ) ) {
64             if (aPrsObj->GetType() != VISU::TSTREAMLINES) {
65               SALOMEDS::GenericAttribute_var anAttr;
66               if ( aChildSObj->FindAttribute(anAttr, "AttributeName") ) {           
67                 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
68                 mySrcCombo->insertItem(QString(aName->Value()));
69                 myPrsList.append(aPrsObj);
70               }
71             }
72           }
73         }
74       }
75     }
76   }  
77
78   connect(myUseSrcChk, SIGNAL(toggled(bool)), mySrcCombo, SLOT(setEnabled(bool)));
79   aSrcLayout->addMultiCellWidget(mySrcCombo, 1, 1, 0, 1);
80
81   QLabel* aPercentLbl = new QLabel( tr( "Used points (0..1)" ), aSourceBox);
82   aSrcLayout->addWidget(aPercentLbl, 2, 0);
83
84   myPntPercent = new QAD_SpinBoxDbl( aSourceBox, 0, 1, 0.1);
85   aSrcLayout->addWidget(myPntPercent, 2, 1);
86
87   TopLayout->addMultiCellWidget(aSourceBox, 0, 0, 0, 1);
88
89
90   QLabel* aStepLenLbl = new QLabel( tr( "Step Length" ), this);
91   TopLayout->addWidget(aStepLenLbl, 1, 0);
92   myStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1);
93   myStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
94   TopLayout->addWidget(myStepLen, 1, 1);
95
96   QLabel* aIntegStepLenLbl = new QLabel( tr( "Integration Step" ), this);
97   TopLayout->addWidget(aIntegStepLenLbl, 2, 0);
98   myIntegStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1);
99   myIntegStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
100   TopLayout->addWidget(myIntegStepLen, 2, 1);
101   
102   QLabel* aPropagationLbl = new QLabel( tr( "Propagation Time" ), this);
103   TopLayout->addWidget(aPropagationLbl, 3, 0);
104   myPropTime = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 1);
105   myPropTime->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
106   TopLayout->addWidget(myPropTime, 3, 1);
107
108   connect(myPropTime, SIGNAL(valueChanged(double)), this, SLOT(PropagationTimeChanged(double)));
109   
110   QLabel* aDirLbl = new QLabel( tr( "Direction" ), this);
111   TopLayout->addWidget(aDirLbl, 4, 0);
112   myDirCombo = new QComboBox(this);
113   myDirCombo->insertItem("Forward");
114   myDirCombo->insertItem("Backward");
115   myDirCombo->insertItem("Both");
116   TopLayout->addWidget(myDirCombo, 4, 1);
117
118   myUseScalar = new QCheckBox( tr( "Magnitude coloring" ), this, "UseMagn" );
119   connect( myUseScalar, SIGNAL( clicked() ), this, SLOT( enableSetColor() ) );
120   TopLayout->addWidget(myUseScalar, 5, 0);
121
122   SelColor = new QPushButton( tr( "Use Color" ), this, "SelColor" );
123   connect( SelColor,     SIGNAL( clicked() ), this, SLOT( setVColor() ) );
124   TopLayout->addWidget( SelColor, 5, 1);
125  
126   QGroupBox* aGroupButtons = new QGroupBox( this, "GroupButtons" );
127   aGroupButtons->setColumnLayout(0, Qt::Vertical );
128   aGroupButtons->layout()->setSpacing( 0 );
129   aGroupButtons->layout()->setMargin( 0 );
130   
131   QGridLayout* aGroupButtonsLayout = new QGridLayout( aGroupButtons->layout() );
132   aGroupButtonsLayout->setAlignment( Qt::AlignTop );
133   aGroupButtonsLayout->setSpacing( 6 );
134   aGroupButtonsLayout->setMargin( 11 );
135
136   QPushButton* aOkBtn = new QPushButton( tr( "&OK" ), aGroupButtons, "buttonOk" );
137   aOkBtn->setAutoDefault( TRUE );
138   aOkBtn->setDefault( TRUE );
139   aGroupButtonsLayout->addWidget( aOkBtn, 0, 0 );
140   aGroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
141
142   QPushButton* aCancelBtn = new QPushButton( tr( "&Cancel" ) , aGroupButtons, "buttonCancel" );
143   aCancelBtn->setAutoDefault( TRUE );
144   aGroupButtonsLayout->addWidget( aCancelBtn, 0, 2 );
145   connect( aOkBtn,     SIGNAL( clicked() ), this, SLOT( accept() ) );
146   connect( aCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
147   TopLayout->addMultiCellWidget( aGroupButtons, 6, 6, 0, 1 );
148   enableSetColor();
149 }
150
151
152
153 void VisuGUI_StreamLinesDlg::initFromPrsObject(VISU::StreamLines_i* thePrs) {
154   myStepLen->setValue(thePrs->GetStepLength());
155   myIntegStepLen->setValue(thePrs->GetIntegrationStep());
156   myPropTime->setValue(thePrs->GetPropagationTime());
157   switch (thePrs->GetDirection()) {
158   case VISU::StreamLines::FORWARD:
159     myDirCombo->setCurrentItem(0);
160     break;
161   case VISU::StreamLines::BACKWARD:
162     myDirCombo->setCurrentItem(1);
163     break;
164   case VISU::StreamLines::BOTH:
165     myDirCombo->setCurrentItem(2);
166   }
167   myUseScalar->setChecked(thePrs->isColored());
168   myPntPercent->setValue(thePrs->GetUsedPoints());
169
170   myUseSrcChk->setChecked(false);
171   QString aSrcEntry = thePrs->GetSourceEntry();
172   if (!aSrcEntry.isEmpty()) {
173     for (int i = 0; i < myPrsList.count(); i++) {
174       VISU::Prs3d_i* aPrs = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(myPrsList[i]));
175       if (aSrcEntry == aPrs->GetEntry()) {
176         myUseSrcChk->setChecked(true);
177         mySrcCombo->setCurrentItem(i);
178         break;
179       }
180     }
181   }
182
183   SALOMEDS::Color anOldColor = thePrs->GetColor();
184   QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B));
185   setColor(aColor);
186   enableSetColor();
187
188   myIntegStepLen->setMaxValue(thePrs->GetMaxIntegrationStep());
189   myIntegStepLen->setMinValue(thePrs->GetMinIntegrationStep());
190   myStepLen->setMaxValue(myPropTime->value());
191   myStepLen->setMinValue(myPropTime->value()/10000.);
192 }
193
194
195
196 void VisuGUI_StreamLinesDlg::storeToPrsObject(VISU::StreamLines_i* thePrs) {
197   thePrs->SetStepLength(myStepLen->value());
198   thePrs->SetIntegrationStep(myIntegStepLen->value());
199   thePrs->SetPropagationTime(myPropTime->value());
200   switch (myDirCombo->currentItem()) {
201   case 0:
202     thePrs->SetDirection(VISU::StreamLines::FORWARD);
203     break;
204   case 1:
205     thePrs->SetDirection(VISU::StreamLines::BACKWARD);
206     break;
207   case 2:
208     thePrs->SetDirection(VISU::StreamLines::BOTH);
209   }
210   thePrs->setColored(myUseScalar->isChecked());
211   if(!thePrs->isColored()){
212     SALOMEDS::Color aColor;
213     aColor.R = myColor.red()/255.;
214     aColor.G = myColor.green()/255.;
215     aColor.B = myColor.blue()/255.;
216     thePrs->SetColor(aColor);
217   }
218   if (myUseSrcChk->isChecked() && (myPrsList.count() > 0)) {
219     thePrs->SetSource(myPrsList[mySrcCombo->currentItem()]);
220   } else 
221     thePrs->SetSource(VISU::Prs3d::_nil());
222   thePrs->SetUsedPoints(myPntPercent->value());
223 }
224
225 /*!
226   Sets color
227 */
228 void VisuGUI_StreamLinesDlg::setColor( QColor color )
229 {
230   myColor = color;
231   SelColor->setPaletteBackgroundColor(myColor);
232 }
233
234
235 /*!
236   Called when "Select Color" buttonx clicked
237 */
238 void VisuGUI_StreamLinesDlg::setVColor()
239 {
240   QColor cnew = QColorDialog::getColor( myColor, this );
241   if ( cnew.isValid() )
242     setColor( cnew );
243 }
244
245
246 /*!
247   Enbled/disables magnitude coloring
248 */
249 void VisuGUI_StreamLinesDlg::enableMagnColor( bool enable )
250 {
251   myUseScalar->setEnabled( enable );
252   enableSetColor();
253 }
254
255 /*!
256   Called when "Magnitude Coloring" check box clicked
257 */
258 void VisuGUI_StreamLinesDlg::enableSetColor()
259 {
260   SelColor->setEnabled(!myUseScalar->isChecked() );
261 }
262
263 void VisuGUI_StreamLinesDlg::PropagationTimeChanged(double theValue) {
264   myStepLen->setMaxValue(theValue);
265   myStepLen->setMinValue(theValue/1000000.);
266 }
267