1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESHGUI.cxx
25 // Author : Nicolas REJNERI
31 #include "SMESHGUI_AddHypothesisDlg.h"
32 #include "SMESHGUI_AddAlgorithmDlg.h"
33 #include "SMESHGUI_InitMeshDlg.h"
34 #include "SMESHGUI_LocalLengthDlg.h"
35 #include "SMESHGUI_NbSegmentsDlg.h"
36 #include "SMESHGUI_AddSubMeshDlg.h"
37 #include "SMESHGUI_NodesDlg.h"
38 #include "SMESHGUI_TransparencyDlg.h"
39 #include "SMESHGUI_RemoveNodesDlg.h"
40 #include "SMESHGUI_RemoveElementsDlg.h"
41 #include "SMESHGUI_MeshInfosDlg.h"
42 #include "SMESHGUI_Preferences_ColorDlg.h"
43 #include "SMESHGUI_MaxElementAreaDlg.h"
44 #include "SMESHGUI_MaxElementVolumeDlg.h"
45 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
46 #include "SMESHGUI_EditScalarBarDlg.h"
47 #include "SMESHGUI_aParameterDlg.h"
48 #include "SMESHGUI_ComputeScalarValue.h"
49 #include "SMESHGUI_MoveNodesDlg.h"
50 #include "SMESHGUI_OrientationElementsDlg.h"
51 #include "SMESHGUI_DiagonalInversionDlg.h"
52 #include "SMESHGUI_EdgesConnectivityDlg.h"
53 #include "SMESHGUI_AddFaceDlg.h"
54 #include "SMESHGUI_AddEdgeDlg.h"
55 #include "SMESHGUI_AddVolumeDlg.h"
56 #include "SMESHGUI_EditHypothesesDlg.h"
58 #include "SMESH_Grid.h"
61 #include "Utils_ORB_INIT.hxx"
62 #include "Utils_SINGLETON.hxx"
65 #include "QAD_Tools.h"
66 #include "QAD_Config.h"
67 #include "QAD_Settings.h"
68 #include "QAD_RightFrame.h"
69 #include "QAD_MessageBox.h"
70 #include "QAD_Resource.h"
71 #include "QAD_FileDlg.h"
72 #include "SALOMEGUI_Desktop.h"
73 #include "SALOMEGUI_NameDlg.h"
75 #include "OCCViewer_ViewPort.h"
76 #include "OCCViewer_ViewPort3d.h"
77 #include "OCCViewer_Viewer3d.h"
79 #include "GEOM_Client.hxx"
80 #include "GEOM_InteractiveObject.hxx"
82 #include "SALOME_NamingService.hxx"
83 #include "SALOME_ListIteratorOfListIO.hxx"
84 #include "SALOME_InteractiveObject.hxx"
86 #include "SALOMEGUI_ImportOperation.h"
87 #include "SALOMEGUI_QtCatchCorbaException.hxx"
88 #include "utilities.h"
90 #include "SMDS_Mesh.hxx"
91 #include "SMESHDS_Document.hxx"
92 #include "Document_Reader.h"
93 #include "Document_Writer.h"
94 #include "Mesh_Reader.h"
95 #include "Mesh_Writer.h"
97 #include "DriverDAT_R_SMESHDS_Document.h"
98 #include "DriverMED_R_SMESHDS_Document.h"
99 #include "DriverUNV_R_SMESHDS_Document.h"
100 #include "DriverDAT_W_SMESHDS_Document.h"
101 #include "DriverMED_W_SMESHDS_Document.h"
102 #include "DriverUNV_W_SMESHDS_Document.h"
103 #include "DriverDAT_R_SMESHDS_Mesh.h"
104 #include "DriverMED_R_SMESHDS_Mesh.h"
105 #include "DriverUNV_R_SMESHDS_Mesh.h"
106 #include "DriverDAT_W_SMESHDS_Mesh.h"
107 #include "DriverMED_W_SMESHDS_Mesh.h"
108 #include "DriverUNV_W_SMESHDS_Mesh.h"
111 #define INCLUDE_MENUITEM_DEF
112 #include <qapplication.h>
113 #include <qlineedit.h>
114 #include <qmenudata.h>
115 #include <qmenubar.h>
116 #include <qpopupmenu.h>
119 #include <qcheckbox.h>
120 #include <qcolordialog.h>
121 #include <qmessagebox.h>
122 #include <qspinbox.h>
126 #include <qradiobutton.h>
129 #include "VTKViewer_Common.h"
130 #include "VTKViewer_ViewFrame.h"
131 #include <vtkLegendBoxActor.h>
132 #include <vtkFeatureEdges.h>
133 #include <vtkDoubleArray.h>
135 // Open CASCADE Includes
136 #include <gp_Pnt.hxx>
137 #include <gp_Vec.hxx>
139 static GEOM_Client ShapeReader;
140 static SMESHGUI *smeshGUI = 0;
141 static CORBA::ORB_var _orb;
143 //=============================================================================
147 //=============================================================================
148 class CustomItem:public QCustomMenuItem
151 CustomItem(const QString & s, const QFont & f):string(s), font(f)
158 void paint(QPainter * p, const QColorGroup & /*cg */ , bool /*act */ ,
159 bool /*enabled */ , int x, int y, int w, int h)
162 p->drawText(x, y, w, h,
163 AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string);
168 return QFontMetrics(font).
169 size(AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string);
176 //=============================================================================
180 //=============================================================================
181 SMESHGUI::SMESHGUI():
186 //=============================================================================
190 //=============================================================================
191 SMESHGUI::~SMESHGUI()
195 //=============================================================================
199 //=============================================================================
200 SMESHGUI *SMESHGUI::GetSMESHGUI()
205 //=============================================================================
209 //=============================================================================
210 SMESHGUI *SMESHGUI::GetOrCreateSMESHGUI(QAD_Desktop * desktop)
215 smeshGUI = new SMESHGUI;
216 smeshGUI->myActiveDialogBox = 0;
217 smeshGUI->myState = -1;
218 smeshGUI->myDesktop = desktop;
219 smeshGUI->myActiveStudy = desktop->getActiveStudy();
221 Engines::Component_var comp =
222 desktop->getEngine("FactoryServer", "SMESH");
223 smeshGUI->myComponentMesh = SMESH::SMESH_Gen::_narrow(comp);
225 Engines::Component_var comp1 =
226 desktop->getEngine("FactoryServer", "GEOM");
227 smeshGUI->myComponentGeom = GEOM::GEOM_Gen::_narrow(comp1);
229 /* GetCurrentStudy */
230 smeshGUI->myStudyId = smeshGUI->myActiveStudy->getStudyId();
232 smeshGUI->myComponentGeom->GetCurrentStudy(smeshGUI->myStudyId);
233 // smeshGUI->myComponentGeom->NbLabels();
235 smeshGUI->myStudy = smeshGUI->myActiveStudy->getStudyDocument();
237 smeshGUI->myStudyAPI =
238 SMESHGUI_StudyAPI(smeshGUI->myStudy, smeshGUI->myComponentMesh);
240 smeshGUI->myDocument = new SMESHDS_Document(1); //NBU
242 smeshGUI->mySimulationActors = vtkActorCollection::New();
243 smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
247 /* study may have changed */
248 smeshGUI->myActiveStudy = desktop->getActiveStudy();
249 smeshGUI->myStudyAPI.Update(smeshGUI->myComponentMesh);
252 /* Automatic Update */
253 if (desktop->menuBar()->isItemChecked(1001))
254 smeshGUI->myAutomaticUpdate = true;
256 smeshGUI->myAutomaticUpdate = false;
261 //=============================================================================
265 //=============================================================================
266 void SMESHGUI::SetState(int aState)
268 this->myState = aState;
272 //=============================================================================
276 //=============================================================================
277 void SMESHGUI::ResetState()
283 //=============================================================================
287 //=============================================================================
288 void SMESHGUI::EmitSignalDeactivateDialog()
290 emit this->SignalDeactivateActiveDialog();
294 //=============================================================================
298 //=============================================================================
299 void SMESHGUI::EmitSignalCloseAllDialogs()
301 emit this->SignalCloseAllDialogs();
305 //=============================================================================
309 //=============================================================================
310 QDialog *SMESHGUI::GetActiveDialogBox()
312 return this->myActiveDialogBox;
315 //=============================================================================
319 //=============================================================================
320 void SMESHGUI::SetActiveDialogBox(QDialog * aDlg)
322 this->myActiveDialogBox = (QDialog *) aDlg;
326 //=============================================================================
330 //=============================================================================
331 QAD_Study *SMESHGUI::GetActiveStudy()
333 return this->myActiveStudy;
336 //=============================================================================
340 //=============================================================================
341 SALOMEDS::Study_ptr SMESHGUI::GetStudy()
343 return SALOMEDS::Study::_narrow(myStudy);
346 //=============================================================================
350 //=============================================================================
351 SMESHGUI_StudyAPI SMESHGUI::GetStudyAPI()
356 //=============================================================================
360 //=============================================================================
361 QAD_Desktop *SMESHGUI::GetDesktop()
363 return this->myDesktop;
366 //=============================================================================
370 //=============================================================================
371 vtkScalarBarActor *SMESHGUI::GetScalarBar()
373 vtkRenderer *aRenderer =
374 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
375 getRightFrame()->getViewFrame())->getRenderer();
376 vtkActor2DCollection *actor2DList = aRenderer->GetActors2D();
377 actor2DList->InitTraversal();
378 vtkActor2D *aActor2d = actor2DList->GetNextActor2D();
379 while (aActor2d != NULL)
381 if (aActor2d->IsA("vtkScalarBarActor"))
382 return vtkScalarBarActor::SafeDownCast(aActor2d);
383 actor2DList->GetNextActor2D();
388 //=============================================================================
392 //=============================================================================
393 void SMESHGUI::activeStudyChanged(QAD_Desktop * parent)
395 MESSAGE("SMESHGUI::activeStudyChanged init.")
396 /* Create or retrieve an object SMESHGUI */
397 SMESHGUI::GetOrCreateSMESHGUI(parent);
400 smeshGUI->EmitSignalCloseAllDialogs();
401 MESSAGE("Active study changed : SMESHGUI nullified" << endl);
405 //smeshGUI->SetSettings( parent ); //DCQ : Pb. Multi-Etudes
406 MESSAGE("SMESHGUI::activeStudyChanged done.") return;
409 //=============================================================================
413 //=============================================================================
414 bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y)
416 /* Here the position is on the bottom right corner - 10 */
417 aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
418 QAD_Desktop *PP = QAD_Application::getDesktop();
419 x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10);
420 y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10);
424 //=============================================================================
428 //=============================================================================
429 void SMESHGUI::EraseSimulationActors()
431 if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK)
433 vtkRenderer *theRenderer =
434 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
435 getRightFrame()->getViewFrame())->getRenderer();
436 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
438 if (mySimulationActors != NULL)
441 mySimulationActors->InitTraversal();
442 vtkActor *ac = mySimulationActors->GetNextActor();
443 while (!(ac == NULL))
445 theRenderer->RemoveActor(ac);
446 ac = mySimulationActors->GetNextActor();
448 mySimulationActors->RemoveAllItems();
450 if (mySimulationActors2D != NULL)
452 mySimulationActors2D->InitTraversal();
453 vtkActor2D *ac = mySimulationActors2D->GetNextActor2D();
454 while (!(ac == NULL))
456 theRenderer->RemoveActor2D(ac);
457 ac = mySimulationActors2D->GetNextActor2D();
459 mySimulationActors2D->RemoveAllItems();
465 //=============================================================================
469 //=============================================================================
470 SMESH::SMESH_Mesh_ptr SMESHGUI::InitMesh(GEOM::GEOM_Shape_ptr aShape,
475 if (!myComponentMesh->_is_nil() && !aShape->_is_nil())
477 SMESH::SMESH_Mesh_var aMesh =
478 myComponentMesh->Init(myComponentGeom, myStudyId, aShape);
480 if (!aMesh->_is_nil())
482 SALOMEDS::SObject_var SM = myStudyAPI.AddNewMesh(aMesh);
483 myStudyAPI.SetName(SM, NameMesh);
485 // GEOM::GEOM_Shape has non-empty StudyShapeId only after AddInStudy operation,
486 // not after loading from file, so let's use more reliable way to retrieve SObject
487 Standard_CString ShapeIOR = _orb->object_to_string(aShape);
488 SALOMEDS::SObject_var SObject =
489 myStudy->FindObjectIOR(ShapeIOR);
490 if (!SObject->_is_nil() && !SM->_is_nil())
492 myStudyAPI.SetShape(SM, SObject);
494 return SMESH::SMESH_Mesh::_narrow(aMesh);
498 catch(const SALOME::SALOME_Exception & S_ex)
500 QtCatchCorbaException(S_ex);
502 myActiveStudy->updateObjBrowser(true);
503 return SMESH::SMESH_Mesh::_nil();
506 //=============================================================================
510 //=============================================================================
511 SMESH::SMESH_subMesh_ptr SMESHGUI::AddSubMesh(SMESH::SMESH_Mesh_ptr aMesh,
512 GEOM::GEOM_Shape_ptr aShape, QString NameMesh)
516 SMESH::SMESH_subMesh_var aSubMesh = aMesh->GetElementsOnShape(aShape);
517 SALOMEDS::SObject_var SO_Mesh = myStudyAPI.FindMesh(aMesh);
518 Standard_CString ShapeIOR = _orb->object_to_string(aShape);
519 SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectIOR(ShapeIOR);
521 if (!SO_GeomShape->_is_nil() && !SO_Mesh->_is_nil() &&
522 !aSubMesh->_is_nil() && !aMesh->_is_nil())
524 SALOMEDS::SObject_var SO =
525 myStudyAPI.AddSubMeshOnShape(SO_Mesh, SO_GeomShape, aSubMesh,
526 aShape->ShapeType());
527 myStudyAPI.SetName(SO, NameMesh);
529 SMESH_Actor *amesh = SMESH_Actor::New();
530 Handle(SALOME_InteractiveObject) IO =
531 new SALOME_InteractiveObject(SO->GetID(), "MESH",
534 amesh->setName(strdup(NameMesh));
535 DisplayActor(amesh, false);
536 return SMESH::SMESH_subMesh::_narrow(aSubMesh);
539 catch(const SALOME::SALOME_Exception & S_ex)
541 QtCatchCorbaException(S_ex);
543 myActiveStudy->updateObjBrowser(true);
544 return SMESH::SMESH_subMesh::_nil();
547 //=============================================================================
551 //=============================================================================
552 SMESH::SMESH_Hypothesis_ptr SMESHGUI::CreateHypothesis(QString TypeHypothesis,
553 QString NameHypothesis)
555 SMESH::SMESH_Hypothesis_var Hyp;
558 Hyp = myComponentMesh->CreateHypothesis(TypeHypothesis, myStudyId);
561 SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewHypothesis(Hyp);
562 myStudyAPI.SetName(SHyp, NameHypothesis);
565 catch(const SALOME::SALOME_Exception & S_ex)
567 QtCatchCorbaException(S_ex);
570 return SMESH::SMESH_Hypothesis::_narrow(Hyp);
573 //=============================================================================
577 //=============================================================================
578 void SMESHGUI::AddHypothesisOnMesh(SMESH::SMESH_Mesh_ptr aMesh,
579 SMESH::SMESH_Hypothesis_ptr aHyp)
581 if (!aMesh->_is_nil())
583 QApplication::setOverrideCursor(Qt::waitCursor);
584 SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh);
585 GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SM);
588 bool res = aMesh->AddHypothesis(aShape, aHyp);
591 SALOMEDS::SObject_var SH =
592 myStudyAPI.FindHypothesisOrAlgorithms(aHyp);
593 if (!SM->_is_nil() && !SH->_is_nil())
595 myStudyAPI.SetHypothesis(SM, SH);
596 myStudyAPI.ModifiedMesh(SM, false);
598 QApplication::restoreOverrideCursor();
602 QApplication::restoreOverrideCursor();
603 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
604 tr("SMESH_WRN_WARNING"),
605 tr("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"),
606 tr("SMESH_BUT_YES"));
609 catch(const SALOME::SALOME_Exception & S_ex)
611 QtCatchCorbaException(S_ex);
614 myActiveStudy->updateObjBrowser(true);
615 QApplication::restoreOverrideCursor();
618 //=============================================================================
622 //=============================================================================
624 RemoveHypothesisOrAlgorithmOnMesh(const Handle(SALOME_InteractiveObject) &
627 if (IObject->hasReference())
629 SMESH::SMESH_Hypothesis_var anHyp;
630 SALOMEDS::SObject_var SO_Hypothesis =
631 smeshGUI->myStudy->FindObjectID(IObject->getEntry());
632 SALOMEDS::GenericAttribute_var anAttr;
633 SALOMEDS::AttributeIOR_var anIOR;
635 if (!SO_Hypothesis->_is_nil())
637 QApplication::setOverrideCursor(Qt::waitCursor);
638 if (SO_Hypothesis->FindAttribute(anAttr, "AttributeIOR"))
640 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
642 SMESH::SMESH_Hypothesis::_narrow(_orb->
643 string_to_object(anIOR->Value()));
646 SALOMEDS::SObject_var SO_Applied_Hypothesis =
647 smeshGUI->myStudy->FindObjectID(IObject->getReference());
648 if (!SO_Applied_Hypothesis->_is_nil())
650 SALOMEDS::SObject_var MorSM =
651 smeshGUI->myStudyAPI.
652 GetMeshOrSubmesh(SO_Applied_Hypothesis);
653 if (!MorSM->_is_nil())
655 smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false);
657 GEOM::GEOM_Shape_var aShape =
658 smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM);
659 if (!aShape->_is_nil())
661 if (MorSM->FindAttribute(anAttr, "AttributeIOR"))
663 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
664 SMESH::SMESH_Mesh_var aMesh =
665 SMESH::SMESH_Mesh::_narrow(_orb->
666 string_to_object(anIOR->Value()));
667 SMESH::SMESH_subMesh_var aSubMesh =
668 SMESH::SMESH_subMesh::_narrow(_orb->
669 string_to_object(anIOR->Value()));
670 if (!aMesh->_is_nil())
673 aMesh->RemoveHypothesis(aShape, anHyp);
676 QApplication::restoreOverrideCursor();
677 QAD_MessageBox::warn1(QAD_Application::
678 getDesktop(), tr("SMESH_WRN_WARNING"),
679 tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"),
680 tr("SMESH_BUT_YES"));
683 else if (!aSubMesh->_is_nil())
685 aMesh = aSubMesh->GetFather();
686 if (!aMesh->_is_nil())
689 aMesh->RemoveHypothesis(aShape, anHyp);
692 QApplication::restoreOverrideCursor();
693 QAD_MessageBox::warn1(QAD_Application::
695 tr("SMESH_WRN_WARNING"),
696 tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"),
697 tr("SMESH_BUT_YES"));
701 if (myAutomaticUpdate)
703 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
711 smeshGUI->ChangeRepresentation(Mesh,
712 Mesh->getDisplayMode());
718 smeshGUI->myStudyAPI.UnSetHypothesis(SO_Applied_Hypothesis);
722 else if (IObject->hasEntry())
724 MESSAGE("IObject entry " << IObject->getEntry())}
725 QApplication::restoreOverrideCursor();
728 //=============================================================================
732 //=============================================================================
733 void SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh(SALOMEDS::SObject_ptr MorSM,
734 SMESH::SMESH_Hypothesis_ptr anHyp)
736 SALOMEDS::SObject_var AHR, aRef;
737 SALOMEDS::GenericAttribute_var anAttr;
738 SALOMEDS::AttributeIOR_var anIOR;
740 if (!MorSM->_is_nil())
742 GEOM::GEOM_Shape_var aShape =
743 smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM);
744 if (!aShape->_is_nil())
746 if (MorSM->FindAttribute(anAttr, "AttributeIOR"))
748 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
749 SMESH::SMESH_Mesh_var aMesh =
750 SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->
752 SMESH::SMESH_subMesh_var aSubMesh =
753 SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->
755 if (!aMesh->_is_nil())
757 bool res = aMesh->RemoveHypothesis(aShape, anHyp);
760 QApplication::restoreOverrideCursor();
761 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
762 tr("SMESH_WRN_WARNING"),
763 tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"),
764 tr("SMESH_BUT_YES"));
767 else if (!aSubMesh->_is_nil())
769 aMesh = aSubMesh->GetFather();
770 if (!aMesh->_is_nil())
772 bool res = aMesh->RemoveHypothesis(aShape, anHyp);
775 QApplication::restoreOverrideCursor();
776 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
777 tr("SMESH_WRN_WARNING"),
778 tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"),
779 tr("SMESH_BUT_YES"));
783 if (myAutomaticUpdate)
785 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
793 // smeshGUI->ChangeRepresentation( Mesh, Mesh->getDisplayMode() );
799 if (MorSM->FindSubObject(2, AHR))
801 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR);
802 for (; it->More(); it->Next())
804 SALOMEDS::SObject_var Obj = it->Value();
805 if (Obj->ReferencedObject(aRef))
807 if (aRef->FindAttribute(anAttr, "AttributeIOR"))
809 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
810 if (strcmp(anIOR->Value(),
811 _orb->object_to_string(anHyp)) == 0)
813 smeshGUI->myStudyAPI.UnSetHypothesis(Obj);
820 if (MorSM->FindSubObject(3, AHR))
822 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR);
823 for (; it->More(); it->Next())
825 SALOMEDS::SObject_var Obj = it->Value();
826 if (Obj->ReferencedObject(aRef))
828 if (aRef->FindAttribute(anAttr, "AttributeIOR"))
830 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
831 if (strcmp(anIOR->Value(),
832 _orb->object_to_string(anHyp)) == 0)
834 smeshGUI->myStudyAPI.UnSetAlgorithm(Obj);
841 smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false);
843 QApplication::restoreOverrideCursor();
846 //=============================================================================
850 //=============================================================================
851 void SMESHGUI::AddAlgorithmOnMesh(SMESH::SMESH_Mesh_ptr aMesh,
852 SMESH::SMESH_Hypothesis_ptr aHyp)
854 if (!aMesh->_is_nil())
856 QApplication::setOverrideCursor(Qt::waitCursor);
857 SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh);
858 GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SM);
861 bool res = aMesh->AddHypothesis(aShape, aHyp);
864 SALOMEDS::SObject_var SH =
865 myStudyAPI.FindHypothesisOrAlgorithms(aHyp);
866 if (!SM->_is_nil() && !SH->_is_nil())
868 myStudyAPI.SetAlgorithms(SM, SH);
869 myStudyAPI.ModifiedMesh(SM, false);
874 QApplication::restoreOverrideCursor();
875 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
876 tr("SMESH_WRN_WARNING"),
877 tr("SMESH_WRN_ALGORITHM_ALREADYEXIST"),
878 tr("SMESH_BUT_YES"));
881 catch(const SALOME::SALOME_Exception & S_ex)
883 QtCatchCorbaException(S_ex);
886 myActiveStudy->updateObjBrowser(true);
887 QApplication::restoreOverrideCursor();
890 //=============================================================================
894 //=============================================================================
895 void SMESHGUI::AddHypothesisOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh,
896 SMESH::SMESH_Hypothesis_ptr aHyp)
898 if (!aSubMesh->_is_nil())
900 QApplication::setOverrideCursor(Qt::waitCursor);
903 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
904 SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh(aSubMesh);
905 GEOM::GEOM_Shape_var aShape =
906 myStudyAPI.GetShapeOnMeshOrSubMesh(SsubM);
907 if (!aMesh->_is_nil())
909 bool res = aMesh->AddHypothesis(aShape, aHyp);
912 SALOMEDS::SObject_var SH =
913 myStudyAPI.FindHypothesisOrAlgorithms(aHyp);
914 if (!SsubM->_is_nil() && !SH->_is_nil())
916 myStudyAPI.SetHypothesis(SsubM, SH);
917 myStudyAPI.ModifiedMesh(SsubM, false);
922 QApplication::restoreOverrideCursor();
923 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
924 tr("SMESH_WRN_WARNING"),
925 tr("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"),
926 tr("SMESH_BUT_YES"));
930 catch(const SALOME::SALOME_Exception & S_ex)
932 QtCatchCorbaException(S_ex);
935 myActiveStudy->updateObjBrowser(true);
936 QApplication::restoreOverrideCursor();
939 //=============================================================================
943 //=============================================================================
944 void SMESHGUI::AddAlgorithmOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh,
945 SMESH::SMESH_Hypothesis_ptr aHyp)
947 if (!aSubMesh->_is_nil())
949 QApplication::setOverrideCursor(Qt::waitCursor);
952 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
953 SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh(aSubMesh);
954 GEOM::GEOM_Shape_var aShape =
955 myStudyAPI.GetShapeOnMeshOrSubMesh(SsubM);
956 if (!aMesh->_is_nil())
958 bool res = aMesh->AddHypothesis(aShape, aHyp);
961 SALOMEDS::SObject_var SH =
962 myStudyAPI.FindHypothesisOrAlgorithms(aHyp);
963 if (!SsubM->_is_nil() && !SH->_is_nil())
965 myStudyAPI.SetAlgorithms(SsubM, SH);
966 myStudyAPI.ModifiedMesh(SsubM, false);
971 QApplication::restoreOverrideCursor();
972 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
973 tr("SMESH_WRN_WARNING"),
974 tr("SMESH_WRN_ALGORITHM_ALREADYEXIST"),
975 tr("SMESH_BUT_YES"));
979 catch(const SALOME::SALOME_Exception & S_ex)
981 QtCatchCorbaException(S_ex);
984 myActiveStudy->updateObjBrowser(true);
985 QApplication::restoreOverrideCursor();
988 //=============================================================================
992 //=============================================================================
993 void SMESHGUI::CreateAlgorithm(QString TypeAlgo, QString NameAlgo)
995 SMESH::SMESH_Hypothesis_var Hyp;
998 if (TypeAlgo.compare("Regular_1D") == 0)
999 Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId);
1000 else if (TypeAlgo.compare("MEFISTO_2D") == 0)
1001 Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId);
1002 else if (TypeAlgo.compare("Quadrangle_2D") == 0)
1003 Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId);
1004 else if (TypeAlgo.compare("Hexa_3D") == 0)
1005 Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId);
1006 else if (TypeAlgo.compare("NETGEN_3D") == 0)
1007 Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId);
1009 if (!Hyp->_is_nil())
1011 SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewAlgorithms(Hyp);
1012 myStudyAPI.SetName(SHyp, NameAlgo);
1015 catch(const SALOME::SALOME_Exception & S_ex)
1017 QtCatchCorbaException(S_ex);
1019 myActiveStudy->updateObjBrowser(true);
1022 //=============================================================================
1026 //=============================================================================
1027 void SMESHGUI::CreateLocalLength(QString TypeHypothesis, QString NameHypothesis,
1030 QApplication::setOverrideCursor(Qt::waitCursor);
1033 SMESH::SMESH_Hypothesis_var Hyp =
1034 SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis,
1036 SMESH::SMESH_LocalLength_var LL =
1037 SMESH::SMESH_LocalLength::_narrow(Hyp);
1039 LL->SetLength(Length);
1041 catch(const SALOME::SALOME_Exception & S_ex)
1043 QtCatchCorbaException(S_ex);
1045 myActiveStudy->updateObjBrowser(true);
1046 QApplication::restoreOverrideCursor();
1049 //=============================================================================
1053 //=============================================================================
1054 void SMESHGUI::CreateMaxElementArea(QString TypeHypothesis,
1055 QString NameHypothesis, double MaxArea)
1057 QApplication::setOverrideCursor(Qt::waitCursor);
1060 SMESH::SMESH_Hypothesis_var Hyp =
1061 SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis,
1063 SMESH::SMESH_MaxElementArea_var MaxElArea =
1064 SMESH::SMESH_MaxElementArea::_narrow(Hyp);
1065 if (!MaxElArea->_is_nil())
1066 MaxElArea->SetMaxElementArea(MaxArea);
1068 catch(SALOME::SALOME_Exception & S_ex)
1070 QtCatchCorbaException(S_ex);
1073 myActiveStudy->updateObjBrowser(true);
1074 QApplication::restoreOverrideCursor();
1077 //=============================================================================
1081 //=============================================================================
1082 void SMESHGUI::CreateMaxElementVolume(QString TypeHypothesis,
1083 QString NameHypothesis, double MaxVolume)
1085 QApplication::setOverrideCursor(Qt::waitCursor);
1088 SMESH::SMESH_Hypothesis_var Hyp =
1089 SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis,
1091 SMESH::SMESH_MaxElementVolume_var MaxElVolume =
1092 SMESH::SMESH_MaxElementVolume::_narrow(Hyp);
1093 if (!MaxElVolume->_is_nil())
1094 MaxElVolume->SetMaxElementVolume(MaxVolume);
1096 catch(const SALOME::SALOME_Exception & S_ex)
1098 QtCatchCorbaException(S_ex);
1100 myActiveStudy->updateObjBrowser(true);
1101 QApplication::restoreOverrideCursor();
1104 //=============================================================================
1108 //=============================================================================
1109 void SMESHGUI::CreateNbSegments(QString TypeHypothesis, QString NameHypothesis,
1112 QApplication::setOverrideCursor(Qt::waitCursor);
1115 SMESH::SMESH_Hypothesis_var Hyp =
1116 SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis,
1118 SMESH::SMESH_NumberOfSegments_var NbS =
1119 SMESH::SMESH_NumberOfSegments::_narrow(Hyp);
1120 if (!NbS->_is_nil())
1121 NbS->SetNumberOfSegments(nbSegments);
1123 catch(const SALOME::SALOME_Exception & S_ex)
1125 QtCatchCorbaException(S_ex);
1127 myActiveStudy->updateObjBrowser(true);
1128 QApplication::restoreOverrideCursor();
1131 //=============================================================================
1135 //=============================================================================
1136 int SMESHGUI::GetNameOfSelectedIObjects(SALOME_Selection * Sel, QString & aName)
1138 int nbSel = Sel->IObjectCount();
1141 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1142 aName = IObject->getName();
1146 aName = tr("SMESH_OBJECTS_SELECTED").arg(nbSel);
1151 //=============================================================================
1155 //=============================================================================
1156 int SMESHGUI::GetNameOfSelectedNodes(SALOME_Selection * Sel, QString & aName)
1159 int nbSel = Sel->IObjectCount();
1162 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1163 if (!IObject->hasEntry())
1166 Standard_Boolean res;
1167 SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true);
1171 TColStd_MapOfInteger MapIndex;
1172 Sel->GetIndex(IObject, MapIndex);
1173 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
1175 nbNodes = MapIndex.Extent();
1176 for (; ite.More(); ite.Next())
1179 aName + QString("%1").arg(ac->GetIdSMESHDSNode(ite.Key())) +
1190 //=============================================================================
1194 //=============================================================================
1195 int SMESHGUI::GetNameOfSelectedElements(SALOME_Selection * Sel, QString & aName)
1198 int nbSel = Sel->IObjectCount();
1201 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1202 if (!IObject->hasEntry())
1205 Standard_Boolean res;
1206 SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true);
1210 TColStd_MapOfInteger MapIndex;
1211 Sel->GetIndex(IObject, MapIndex);
1212 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
1214 nbElements = MapIndex.Extent();
1215 MESSAGE("GetNameOfSelectedElements(): number = " << nbElements);
1216 for (; ite.More(); ite.Next())
1218 int idVTK = ite.Key();
1219 MESSAGE("GetNameOfSelectedElements(): VTK Id = " << idVTK);
1221 aName + QString("%1").arg(ac->GetIdSMESHDSElement(idVTK)) + " ";
1231 //=============================================================================
1235 //=============================================================================
1236 int SMESHGUI::GetNameOfSelectedEdges(SALOME_Selection * Sel, QString & aName)
1239 int nbSel = Sel->IObjectCount();
1242 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1243 if (!IObject->hasEntry())
1246 Standard_Boolean res;
1247 SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true);
1251 TColStd_MapOfInteger MapIndex;
1252 Sel->GetIndex(IObject, MapIndex);
1253 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
1255 nbElements = MapIndex.Extent();
1256 for (; ite.More(); ite.Next())
1258 aName = aName + QString("%1").arg(ite.Key()) + " ";
1268 //=============================================================================
1272 //=============================================================================
1273 SMESH_Actor *SMESHGUI::FindActorByEntry(QString entry,
1274 Standard_Boolean & testResult, bool onlyInActiveView)
1276 int nbSf = myActiveStudy->getStudyFramesCount();
1277 for (int i = 0; i < nbSf; i++)
1279 QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i);
1280 if (sf->getTypeView() == VIEW_VTK)
1282 vtkRenderer *Renderer =
1283 ((VTKViewer_ViewFrame *) sf->getRightFrame()->getViewFrame())->
1285 vtkActorCollection *theActors = Renderer->GetActors();
1286 theActors->InitTraversal();
1287 vtkActor *ac = theActors->GetNextActor();
1288 while (!(ac == NULL))
1290 if (ac->IsA("SMESH_Actor"))
1292 SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac);
1293 if (anActor->hasIO())
1295 Handle(SALOME_InteractiveObject) IO = anActor->getIO();
1296 if (strcmp(IO->getEntry(), entry) == 0)
1298 if (onlyInActiveView)
1300 if (sf == myActiveStudy->getActiveStudyFrame())
1314 ac = theActors->GetNextActor();
1319 MESSAGE(" Actor Not Found ") testResult = false;
1320 return SMESH_Actor::New();
1323 //=============================================================================
1327 //=============================================================================
1328 SMESH_Actor *SMESHGUI::FindActor(SMESH::SMESH_Mesh_ptr aMesh,
1329 Standard_Boolean & testResult, bool onlyInActiveView)
1331 SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh);
1334 MESSAGE(" Actor Not Found ") testResult = false;
1335 return SMESH_Actor::New();
1338 return FindActorByEntry(SM->GetID(), testResult, onlyInActiveView);
1341 //=============================================================================
1345 //=============================================================================
1346 SMESH::SMESH_Mesh_ptr SMESHGUI::
1347 ConvertIOinMesh(const Handle(SALOME_InteractiveObject) & IO,
1348 Standard_Boolean & testResult)
1350 SMESH::SMESH_Mesh_var aMesh;
1356 SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry());
1357 SALOMEDS::GenericAttribute_var anAttr;
1358 SALOMEDS::AttributeIOR_var anIOR;
1359 if (!obj->_is_nil())
1361 if (obj->FindAttribute(anAttr, "AttributeIOR"))
1363 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1365 SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->
1367 if (!aMesh->_is_nil())
1370 return SMESH::SMESH_Mesh::_duplicate(aMesh);
1375 return SMESH::SMESH_Mesh::_nil();
1378 //=============================================================================
1382 //=============================================================================
1383 SMESH::SMESH_subMesh_ptr SMESHGUI::
1384 ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject) & IO,
1385 Standard_Boolean & testResult)
1387 SMESH::SMESH_subMesh_var aSubMesh;
1393 SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry());
1394 SALOMEDS::GenericAttribute_var anAttr;
1395 SALOMEDS::AttributeIOR_var anIOR;
1396 if (!obj->_is_nil())
1398 if (obj->FindAttribute(anAttr, "AttributeIOR"))
1400 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1402 SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->
1404 if (!aSubMesh->_is_nil())
1407 return SMESH::SMESH_subMesh::_duplicate(aSubMesh);
1412 return SMESH::SMESH_subMesh::_nil();
1415 //=============================================================================
1419 //=============================================================================
1420 SMESH::SMESH_Hypothesis_ptr SMESHGUI::
1421 ConvertIOinSMESHHypothesis(const Handle(SALOME_InteractiveObject) & IO,
1422 Standard_Boolean & testResult)
1424 SMESH::SMESH_Hypothesis_var aHyp;
1430 SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry());
1431 SALOMEDS::GenericAttribute_var anAttr;
1432 SALOMEDS::AttributeIOR_var anIOR;
1433 if (!obj->_is_nil())
1435 if (obj->FindAttribute(anAttr, "AttributeIOR"))
1437 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1439 SMESH::SMESH_Hypothesis::_narrow(_orb->
1440 string_to_object(anIOR->Value()));
1441 if (!aHyp->_is_nil())
1444 return SMESH::SMESH_Hypothesis::_duplicate(aHyp);
1449 return SMESH::SMESH_Hypothesis::_nil();
1452 //=============================================================================
1456 //=============================================================================
1457 GEOM::GEOM_Shape_ptr SMESHGUI::
1458 ConvertIOinGEOMShape(const Handle(SALOME_InteractiveObject) & IO,
1459 Standard_Boolean & testResult)
1461 GEOM::GEOM_Shape_var aShape;
1467 SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry());
1468 SALOMEDS::GenericAttribute_var anAttr;
1469 SALOMEDS::AttributeIOR_var anIOR;
1470 if (!obj->_is_nil())
1472 if (obj->FindAttribute(anAttr, "AttributeIOR"))
1474 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1475 aShape = myComponentGeom->GetIORFromString(anIOR->Value());
1476 if (!aShape->_is_nil())
1479 return GEOM::GEOM_Shape::_duplicate(aShape);
1484 return GEOM::GEOM_Shape::_nil();
1487 //=============================================================================
1491 //=============================================================================
1492 void SMESHGUI::SetViewMode(int commandId)
1494 SALOME_Selection *Sel =
1495 SALOME_Selection::Selection(myActiveStudy->getSelection());
1496 int nbSel = Sel->IObjectCount();
1499 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
1500 for (; It.More(); It.Next())
1502 Handle(SALOME_InteractiveObject) IObject = It.Value();
1503 if (IObject->hasEntry())
1505 Standard_Boolean res;
1507 FindActorByEntry(IObject->getEntry(), res, true);
1514 ChangeRepresentation(ac, 0);
1519 ChangeRepresentation(ac, 1);
1524 ChangeRepresentation(ac, 2);
1529 ChangeRepresentation(ac, 3);
1536 if (commandId == 1133)
1538 ChangeRepresentation(SMESH_Actor::New(), 4);
1543 //=============================================================================
1547 //=============================================================================
1548 void SMESHGUI::ChangeRepresentation(SMESH_Actor * ac, int type)
1550 if (ac->DataSource == NULL && type != 4)
1555 if (ac->getMapper() == NULL)
1564 QApplication::setOverrideCursor(Qt::waitCursor);
1565 if (ac->getDisplayMode() == 2)
1567 bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899
1568 vtkDataSetMapper *meshMapper =
1569 (vtkDataSetMapper *) (ac->getMapper());
1570 meshMapper->SetInput(ac->DataSource);
1571 meshMapper->SetScalarVisibility(isColored); //SAL3899
1573 ac->setDisplayMode(0);
1574 ac->GetProperty()->SetRepresentationToWireframe();
1575 // ac->SetActorProperty( ac->GetProperty() );
1576 QApplication::restoreOverrideCursor();
1581 QApplication::setOverrideCursor(Qt::waitCursor);
1582 if (ac->getDisplayMode() == 2)
1584 bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899
1585 vtkDataSetMapper *meshMapper =
1586 (vtkDataSetMapper *) (ac->getMapper());
1587 meshMapper->SetInput(ac->DataSource);
1588 meshMapper->SetScalarVisibility(isColored); //SAL3899
1590 ac->setDisplayMode(1);
1591 ac->GetProperty()->SetRepresentationToSurface();
1592 QApplication::restoreOverrideCursor();
1593 // ac->SetActorProperty( ac->GetProperty() );
1598 // if (!(ac->getDisplayMode()==2)) {
1599 // ChangeRepresentation(ac, 1);
1600 QApplication::setOverrideCursor(Qt::waitCursor);
1601 ac->setDisplayMode(2);
1602 bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899
1603 vtkDataSetMapper *meshMapper = (vtkDataSetMapper *) (ac->getMapper());
1604 vtkShrinkFilter *shrink = vtkShrinkFilter::New();
1605 shrink->SetInput(ac->DataSource);
1606 shrink->SetShrinkFactor(ac->GetShrinkFactor());
1608 meshMapper->SetInput(shrink->GetOutput());
1609 meshMapper->SetScalarVisibility(isColored); //SAL3899
1610 ac->SetMapper(meshMapper);
1611 QApplication::restoreOverrideCursor();
1619 float backfacecolor[3];
1621 ac->GetColor(color[0], color[1], color[2]);
1622 // QColor c(color[0]*255,color[1]*255,color[2]*255);
1623 int c0 = int (color[0] * 255);
1624 int c1 = int (color[1] * 255);
1625 int c2 = int (color[2] * 255);
1626 QColor c(c0, c1, c2);
1627 ac->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]);
1628 // QColor e(edgecolor[0]*255,edgecolor[1]*255,edgecolor[2]*255);
1629 c0 = int (edgecolor[0] * 255);
1630 c1 = int (edgecolor[1] * 255);
1631 c2 = int (edgecolor[2] * 255);
1632 QColor e(c0, c1, c2);
1633 ac->GetBackfaceProperty()->GetColor(backfacecolor);
1634 // QColor b(backfacecolor[0]*255,backfacecolor[1]*255,backfacecolor[2]*255);
1635 c0 = int (backfacecolor[0] * 255);
1636 c1 = int (backfacecolor[1] * 255);
1637 c2 = int (backfacecolor[2] * 255);
1638 QColor b(c0, c1, c2);
1639 ac->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]);
1640 // QColor n(nodecolor[0]*255, nodecolor[1]*255, nodecolor[2]*255 ) ;
1641 c0 = int (nodecolor[0] * 255);
1642 c1 = int (nodecolor[1] * 255);
1643 c2 = int (nodecolor[2] * 255);
1644 QColor n(c0, c1, c2);
1646 int Edgewidth = (int)ac->EdgeDevice->GetProperty()->GetLineWidth();
1649 int intValue = ac->GetNodeSize();
1650 float Shrink = ac->GetShrinkFactor();
1652 SMESHGUI_Preferences_ColorDlg *aDlg =
1653 new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(),
1655 aDlg->SetColor(1, c);
1656 aDlg->SetColor(2, e);
1657 aDlg->SetColor(3, n);
1658 aDlg->SetColor(4, b);
1659 aDlg->SetIntValue(1, Edgewidth);
1660 aDlg->SetIntValue(2, intValue);
1661 aDlg->SetIntValue(3, int (Shrink * 100.));
1665 QApplication::setOverrideCursor(Qt::waitCursor);
1666 QColor color = aDlg->GetColor(1);
1667 QColor edgecolor = aDlg->GetColor(2);
1668 QColor nodecolor = aDlg->GetColor(3);
1669 QColor backfacecolor = aDlg->GetColor(4);
1670 /* actor color and backface color */
1671 ac->GetProperty()->SetColor(float (color.red()) / 255.,
1672 float (color.green()) / 255., float (color.blue()) / 255.);
1673 ac->SetColor(float (color.red()) / 255.,
1674 float (color.green()) / 255., float (color.blue()) / 255.);
1675 ac->GetBackfaceProperty()->SetColor(float (backfacecolor.red()) /
1676 255., float (backfacecolor.green()) / 255.,
1677 float (backfacecolor.blue()) / 255.);
1680 ac->EdgeDevice->GetProperty()->SetColor(float (edgecolor.red()) /
1681 255., float (edgecolor.green()) / 255.,
1682 float (edgecolor.blue()) / 255.);
1683 ac->EdgeShrinkDevice->GetProperty()->SetColor(float (edgecolor.
1684 red()) / 255., float (edgecolor.green()) / 255.,
1685 float (edgecolor.blue()) / 255.);
1686 ac->SetEdgeColor(float (edgecolor.red()) / 255.,
1687 float (edgecolor.green()) / 255.,
1688 float (edgecolor.blue()) / 255.);
1690 /* Shrink factor and size edges */
1691 ac->SetShrinkFactor(aDlg->GetIntValue(3) / 100.);
1692 ac->EdgeDevice->GetProperty()->SetLineWidth(aDlg->GetIntValue(1));
1693 ac->EdgeShrinkDevice->GetProperty()->SetLineWidth(aDlg->
1696 /* Nodes color and size */
1697 ac->SetNodeColor(float (nodecolor.red()) / 255.,
1698 float (nodecolor.green()) / 255.,
1699 float (nodecolor.blue()) / 255.);
1700 ac->SetNodeSize(aDlg->GetIntValue(2));
1702 if (ac->getDisplayMode() == 2)
1704 bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899
1705 vtkDataSetMapper *meshMapper =
1706 (vtkDataSetMapper *) (ac->getMapper());
1707 meshMapper->SetInput(ac->DataSource);
1708 vtkShrinkFilter *shrink = vtkShrinkFilter::New();
1709 shrink->SetInput(meshMapper->GetInput());
1710 shrink->SetShrinkFactor(ac->GetShrinkFactor());
1712 meshMapper->SetInput(shrink->GetOutput());
1713 meshMapper->SetScalarVisibility(isColored); //SAL3899
1714 ac->SetMapper(meshMapper);
1718 QApplication::restoreOverrideCursor();
1723 EmitSignalDeactivateDialog();
1724 SALOME_Selection *Sel =
1725 SALOME_Selection::Selection(myActiveStudy->getSelection());
1726 SMESHGUI_TransparencyDlg *aDlg =
1727 new SMESHGUI_TransparencyDlg(QAD_Application::getDesktop(), "",
1733 QApplication::setOverrideCursor(Qt::waitCursor);
1734 ac->GetProperty()->SetRepresentationToPoints();
1735 QApplication::restoreOverrideCursor();
1740 QApplication::setOverrideCursor(Qt::waitCursor);
1741 if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK)
1743 vtkRenderer *theRenderer =
1744 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
1745 getRightFrame()->getViewFrame())->getRenderer();
1746 theRenderer->Render();
1748 QApplication::restoreOverrideCursor();
1751 //=============================================================================
1755 //=============================================================================
1756 void SMESHGUI::UpdateView()
1758 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
1761 vtkRenderer *theRenderer =
1762 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
1763 getRightFrame()->getViewFrame())->getRenderer();
1764 theRenderer->Render();
1767 //=============================================================================
1771 //=============================================================================
1772 void SMESHGUI::DisplayActor(SMESH_Actor * ac, bool visibility)
1774 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
1777 MESSAGE("DisplayActor(): DataSource = " << ac->DataSource);
1779 vtkRenderer *theRenderer =
1780 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
1781 getRightFrame()->getViewFrame())->getRenderer();
1782 vtkActorCollection *theActors = theRenderer->GetActors();
1783 theActors->InitTraversal();
1784 if (theActors->IsItemPresent(ac) == 0)
1786 vtkProperty *prop = vtkProperty::New();
1787 prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed").
1789 QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat() /
1791 QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat() /
1794 prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize").
1796 prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth").
1798 ac->SetProperty(prop);
1799 ac->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed").
1801 QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat() /
1803 QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat() /
1806 // prop->BackfaceCullingOn();
1807 vtkProperty *backprop = vtkProperty::New();
1808 backprop->SetColor(QAD_CONFIG->
1809 getSetting("SMESH:SettingsBackFaceColorRed").toFloat() / 255.,
1810 QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen").
1812 QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue").
1814 ac->SetBackfaceProperty(backprop);
1817 QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff").toInt();
1820 ac->SetShrinkFactor(intValue / 100.);
1822 ac->GetMapper()->SetResolveCoincidentTopologyToShiftZBuffer();
1823 ac->GetMapper()->SetResolveCoincidentTopologyZShift(0.02);
1825 QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode");
1826 if (DisplayMode.compare("Wireframe") == 0)
1828 ac->setDisplayMode(0);
1829 ChangeRepresentation(ac, 0);
1831 else if (DisplayMode.compare("Shading") == 0)
1833 ac->setDisplayMode(1);
1834 ChangeRepresentation(ac, 1);
1836 else if (DisplayMode.compare("Shrink") == 0)
1838 ac->setDisplayMode(2);
1839 ChangeRepresentation(ac, 2);
1841 theRenderer->AddActor(ac);
1845 if (ac->GetMapper())
1846 ac->GetMapper()->Update();
1849 // if ( visibility )
1850 ac->SetVisibility(visibility);
1851 // ac->VisibilityOn();
1853 // ac->VisibilityOff();
1855 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
1859 //=============================================================================
1863 //=============================================================================
1864 void SMESHGUI::EraseActor(SMESH_Actor * ac)
1866 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
1869 vtkRenderer *theRenderer =
1870 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
1871 getRightFrame()->getViewFrame())->getRenderer();
1873 //NRI- : 02/12/2002 : Fixed bugId 882
1874 // ac->EdgeDevice->VisibilityOff();
1875 // ac->EdgeShrinkDevice->VisibilityOff();
1876 // ac->VisibilityOff();
1877 ac->SetVisibility(false);
1879 theRenderer->Render();
1882 //=============================================================================
1886 //=============================================================================
1887 bool SMESHGUI::AddActorInSelection(SMESH_Actor * ac)
1889 SALOME_Selection *Sel =
1890 SALOME_Selection::Selection(myActiveStudy->getSelection());
1891 Sel->ClearIObjects();
1893 return Sel->AddIObject(ac->getIO());
1898 //=============================================================================
1902 //=============================================================================
1903 QString SMESHGUI::CheckHomogeneousSelection()
1905 SALOME_Selection *Sel =
1906 SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection());
1909 SALOME_ListIteratorOfListIO Itinit(Sel->StoredIObjects());
1910 for (; Itinit.More(); Itinit.Next())
1912 List.Append(Itinit.Value());
1915 QString RefType = CheckTypeObject(Sel->firstIObject());
1916 SALOME_ListIteratorOfListIO It(List);
1917 for (; It.More(); It.Next())
1919 Handle(SALOME_InteractiveObject) IObject = It.Value();
1920 QString Type = CheckTypeObject(IObject);
1921 if (Type.compare(RefType) != 0)
1922 return "Heterogeneous Selection";
1925 Sel->ClearIObjects();
1926 SALOME_ListIteratorOfListIO It1(List);
1927 for (; It1.More(); It1.Next())
1929 int res = Sel->AddIObject(It1.Value());
1931 myActiveStudy->highlight(It1.Value(), false);
1933 myActiveStudy->highlight(It1.Value(), true);
1938 //=============================================================================
1942 //=============================================================================
1943 QString SMESHGUI::CheckTypeObject(const Handle(SALOME_InteractiveObject) & IO)
1945 SALOMEDS::SObject_var sobj =
1946 smeshGUI->myActiveStudy->getStudyDocument()->FindObjectID(IO->
1948 if (!sobj->_is_nil())
1950 SALOMEDS::SComponent_var scomp = sobj->GetFatherComponent();
1951 if (strcmp(scomp->GetID(), IO->getEntry()) == 0)
1952 { // component is selected
1957 SALOME_Selection *Sel =
1958 SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection());
1959 Sel->ClearIObjects();
1961 Handle(SMESH_TypeFilter) aHypFilter = new SMESH_TypeFilter(HYPOTHESIS);
1962 Handle(SMESH_TypeFilter) anAlgoFilter = new SMESH_TypeFilter(ALGORITHM);
1963 Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter(MESH);
1964 Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter(SUBMESH);
1965 Handle(SMESH_TypeFilter) aMeshOrSubMeshFilter =
1966 new SMESH_TypeFilter(MESHorSUBMESH);
1967 Handle(SMESH_TypeFilter) aSubMeshVextexFilter =
1968 new SMESH_TypeFilter(SUBMESH_VERTEX);
1969 Handle(SMESH_TypeFilter) aSubMeshEdgeFilter =
1970 new SMESH_TypeFilter(SUBMESH_EDGE);
1971 Handle(SMESH_TypeFilter) aSubMeshFaceFilter =
1972 new SMESH_TypeFilter(SUBMESH_FACE);
1973 Handle(SMESH_TypeFilter) aSubMeshSolidFilter =
1974 new SMESH_TypeFilter(SUBMESH_SOLID);
1975 Handle(SMESH_TypeFilter) aSubMeshCompoundFilter =
1976 new SMESH_TypeFilter(SUBMESH_COMPOUND);
1978 Sel->AddFilter(aHypFilter);
1979 if (Sel->AddIObject(IO) != -1)
1981 Sel->ClearFilters();
1982 return "Hypothesis";
1985 Sel->ClearFilters();
1986 Sel->AddFilter(anAlgoFilter);
1987 if (Sel->AddIObject(IO) != -1)
1989 Sel->ClearFilters();
1993 Sel->ClearFilters();
1994 Sel->AddFilter(aMeshFilter);
1995 if (Sel->AddIObject(IO) != -1)
1997 Sel->ClearFilters();
2001 Sel->ClearFilters();
2002 Sel->AddFilter(aSubMeshFilter);
2003 if (Sel->AddIObject(IO) != -1)
2005 Sel->ClearFilters();
2009 Sel->ClearFilters();
2010 Sel->AddFilter(aSubMeshVextexFilter);
2011 if (Sel->AddIObject(IO) != -1)
2013 Sel->ClearFilters();
2014 return "SubMeshVertex";
2017 Sel->ClearFilters();
2018 Sel->AddFilter(aSubMeshEdgeFilter);
2019 if (Sel->AddIObject(IO) != -1)
2021 Sel->ClearFilters();
2022 return "SubMeshEdge";
2025 Sel->ClearFilters();
2026 Sel->AddFilter(aSubMeshFaceFilter);
2027 if (Sel->AddIObject(IO) != -1)
2029 Sel->ClearFilters();
2030 return "SubMeshFace";
2033 Sel->ClearFilters();
2034 Sel->AddFilter(aSubMeshSolidFilter);
2035 if (Sel->AddIObject(IO) != -1)
2037 Sel->ClearFilters();
2038 return "SubMeshSolid";
2041 Sel->ClearFilters();
2042 Sel->AddFilter(aSubMeshCompoundFilter);
2043 if (Sel->AddIObject(IO) != -1)
2045 Sel->ClearFilters();
2046 return "SubMeshCompound";
2049 Sel->ClearFilters();
2050 Sel->AddIObject(IO);
2054 //=============================================================================
2058 //=============================================================================
2059 bool SMESHGUI::OnGUIEvent(int theCommandID, QAD_Desktop * parent)
2061 /* Create or retrieve an object SMESHGUI */
2062 SMESHGUI::GetOrCreateSMESHGUI(parent);
2064 // NRI : Temporary added
2065 if (smeshGUI->myStudy->GetProperties()->IsLocked())
2071 // QAD_Viewer3d* v3d;
2072 OCCViewer_Viewer3d *v3d;
2074 Handle(AIS_InteractiveContext) ic;
2075 vtkRenderer *Renderer;
2076 vtkRenderWindow *RenWin;
2078 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2082 ((OCCViewer_ViewFrame *) smeshGUI->myActiveStudy->
2083 getActiveStudyFrame()->getRightFrame()->getViewFrame())->
2085 ic = v3d->getAISContext();
2087 else if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2091 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
2092 getActiveStudyFrame()->getRightFrame()->getViewFrame())->
2094 RenWin = Renderer->GetRenderWindow();
2097 switch (theCommandID)
2100 smeshGUI->OnEditDelete();
2107 Import_Document(parent, theCommandID); //NBU
2108 //Import_Mesh(parent,theCommandID);
2112 case 122: // EXPORT MED
2116 Export_Mesh(parent, theCommandID);
2120 case 200: // SCALAR BAR
2122 smeshGUI->DisplayScalarBar(false);
2127 SMESHGUI_EditScalarBarDlg *aDlg =
2128 new SMESHGUI_EditScalarBarDlg(parent, "", false);
2134 smeshGUI->DisplayScalarBar(true);
2138 case 1133: // DISPLAY MODE : WireFrame, Surface, Shrink
2144 smeshGUI->SetViewMode(theCommandID);
2156 SALOME_Selection *Sel =
2157 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2159 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2163 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
2164 for (; It.More(); It.Next())
2166 Handle(SALOME_InteractiveObject) IOS = It.Value();
2167 if (IOS->hasEntry())
2169 Standard_Boolean res;
2171 smeshGUI->FindActorByEntry(IOS->getEntry(), res, true);
2173 smeshGUI->EraseActor(ac);
2177 Sel->ClearIObjects();
2178 smeshGUI->myActiveStudy->updateObjBrowser(true);
2181 case 301: // DISPLAY
2183 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2187 QApplication::setOverrideCursor(Qt::waitCursor);
2188 SALOMEDS::SObject_var fatherSF =
2189 smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy->
2190 getActiveStudyFrame()->entry());
2192 SALOME_Selection *Sel =
2193 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2195 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
2197 for (; It.More(); It.Next())
2199 Handle(SALOME_InteractiveObject) IObject = It.Value();
2200 if (IObject->hasEntry())
2202 Standard_Boolean res;
2204 smeshGUI->FindActorByEntry(IObject->getEntry(), res,
2208 smeshGUI->DisplayActor(ac, true);
2209 smeshGUI->DisplayEdges(ac);
2210 smeshGUI->ChangeRepresentation(ac,
2211 ac->getDisplayMode());
2215 QApplication::restoreOverrideCursor();
2220 case 302: // DISPLAY ONLY
2222 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2225 QApplication::setOverrideCursor(Qt::waitCursor);
2226 vtkActorCollection *theActors = Renderer->GetActors();
2227 theActors->InitTraversal();
2228 vtkActor *ac = theActors->GetNextActor();
2229 while (!(ac == NULL))
2231 if (ac->IsA("SMESH_Actor"))
2233 SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac);
2234 if (!anActor->isHighlighted())
2236 //anActor->VisibilityOff();
2237 //NRI- : 02/12/2002 : Fixed bugId 882
2238 // anActor->EdgeDevice->VisibilityOff();
2239 // anActor->EdgeShrinkDevice->VisibilityOff();
2240 anActor->SetVisibility(false);
2243 ac = theActors->GetNextActor();
2246 // Display selection
2247 SALOMEDS::SObject_var fatherSF =
2248 smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy->
2249 getActiveStudyFrame()->entry());
2251 SALOME_Selection *Sel =
2252 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2254 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
2256 for (; It.More(); It.Next())
2258 Handle(SALOME_InteractiveObject) IObject = It.Value();
2259 SALOMEDS::SObject_var obj =
2260 smeshGUI->myStudy->FindObjectID(IObject->getEntry());
2262 VTKViewer_RenderWindowInteractor *myRenderInter =
2263 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
2264 getActiveStudyFrame()->getRightFrame()->getViewFrame())->
2266 // vtkQGLRenderWindowInteractor* myRenderInter= smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getVTKView()->getRWInteractor();
2268 if (myRenderInter->isInViewer(IObject))
2270 if (IObject->hasEntry())
2272 Standard_Boolean res;
2274 smeshGUI->FindActorByEntry(IObject->getEntry(), res,
2278 smeshGUI->DisplayActor(ac, true);
2279 smeshGUI->DisplayEdges(ac);
2280 smeshGUI->ChangeRepresentation(ac,
2281 ac->getDisplayMode());
2286 smeshGUI->myActiveStudy->updateObjBrowser(true);
2287 QApplication::restoreOverrideCursor();
2294 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2297 smeshGUI->EmitSignalDeactivateDialog();
2298 SALOME_Selection *Sel =
2299 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2301 Sel->ClearIObjects();
2302 smeshGUI->myDesktop->SetSelectionMode(1, true);
2303 parent->menuBar()->setItemChecked(9010, false);
2304 parent->menuBar()->setItemChecked(9011, false);
2305 smeshGUI->ViewNodes();
2306 SMESHGUI_NodesDlg *aDlg = new SMESHGUI_NodesDlg(parent, "", Sel);
2310 QApplication::restoreOverrideCursor();
2311 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2312 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2313 tr("SMESH_BUT_YES"));
2318 case 405: // MOVE NODE
2320 smeshGUI->myDesktop->SetSelectionMode(1, true);
2321 SALOME_Selection *Sel =
2322 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2324 SMESHGUI_MoveNodesDlg *aDlg =
2325 new SMESHGUI_MoveNodesDlg(parent, "", Sel);
2329 case 701: // COMPUTE MESH
2331 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2334 SALOME_Selection *Sel =
2335 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2337 int nbSel = Sel->IObjectCount();
2340 QApplication::restoreOverrideCursor();
2344 SMESH::SMESH_Mesh_var aM;
2345 SMESH::SMESH_subMesh_var aSubM;
2346 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
2347 if (IObject->hasEntry())
2349 SALOMEDS::SObject_var aMorSM =
2350 smeshGUI->myStudy->FindObjectID(IObject->getEntry());
2351 SALOMEDS::GenericAttribute_var anAttr;
2352 SALOMEDS::AttributeIOR_var anIOR;
2353 if (!aMorSM->_is_nil())
2355 if (aMorSM->FindAttribute(anAttr, "AttributeIOR"))
2357 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
2358 MESSAGE("SMESHGUI::OnGUIEvent - Compute mesh : IOR = "
2359 << anIOR->Value())CORBA::Object_var cobj;
2362 cobj = _orb->string_to_object(anIOR->Value());
2363 if (CORBA::is_nil(cobj))
2366 ("SMESHGUI::OnGUIEvent - Compute mesh : nil object")}
2368 catch(CORBA::COMM_FAILURE & ex)
2371 ("SMESHGUI::OnGUIEvent - Compute mesh : exception (1)")}
2372 aM = SMESH::SMESH_Mesh::_narrow(cobj);
2373 //aM = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
2375 SMESH::SMESH_subMesh::_narrow(_orb->
2376 string_to_object(anIOR->Value()));
2379 GEOM::GEOM_Shape_var refShape =
2380 smeshGUI->myStudyAPI.
2381 GetShapeOnMeshOrSubMesh(aMorSM);
2382 if (!refShape->_is_nil())
2385 smeshGUI->myComponentMesh->
2386 IsReadyToCompute(aM, refShape);
2389 QApplication::restoreOverrideCursor();
2390 QAD_MessageBox::warn1(QAD_Application::
2391 getDesktop(), tr("SMESH_WRN_WARNING"),
2392 tr("SMESH_WRN_MISSING_PARAMETERS"),
2393 tr("SMESH_BUT_YES"));
2398 smeshGUI->myComponentMesh->Compute(aM,
2400 smeshGUI->myStudyAPI.ModifiedMesh(aMorSM,
2402 // TO Do : change icon of all submeshes
2404 catch(const SALOME::SALOME_Exception & S_ex)
2406 QtCatchCorbaException(S_ex);
2410 else if (!aSubM->_is_nil())
2412 aM = aSubM->GetFather();
2413 GEOM::GEOM_Shape_var refShape =
2414 smeshGUI->myStudyAPI.
2415 GetShapeOnMeshOrSubMesh(aMorSM);
2416 if (!refShape->_is_nil())
2419 smeshGUI->myComponentMesh->
2420 IsReadyToCompute(aM, refShape);
2423 QApplication::restoreOverrideCursor();
2424 QAD_MessageBox::warn1(QAD_Application::
2425 getDesktop(), tr("SMESH_WRN_WARNING"),
2426 tr("SMESH_WRN_MISSING_PARAMETERS"),
2427 tr("SMESH_BUT_YES"));
2432 smeshGUI->myComponentMesh->Compute(aM,
2434 smeshGUI->myStudyAPI.ModifiedMesh(aMorSM,
2436 // TO Do : change icon of all submeshes
2438 catch(const SALOME::SALOME_Exception & S_ex)
2440 QtCatchCorbaException(S_ex);
2448 // Check whether the actor for the mesh exists at least in one view
2449 Standard_Boolean res;
2451 smeshGUI->FindActorByEntry(IObject->getEntry(), res, false);
2453 smeshGUI->InitActor(aM);
2456 // Check whether the actor belongs to the active view
2457 VTKViewer_RenderWindowInteractor *rwInter =
2458 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
2459 getActiveStudyFrame()->getRightFrame()->getViewFrame())->
2462 // The actor belongs to inactive view -> create a copy and add it in the active view
2463 if (!rwInter->isInViewer(IObject))
2465 SMESH_Actor *acCopy = SMESH_Actor::New();
2466 acCopy->ShallowCopy(ac);
2468 smeshGUI->DisplayActor(acCopy, false);
2472 if (smeshGUI->myAutomaticUpdate)
2474 SMESH_Actor *Mesh = smeshGUI->ReadScript(aM);
2480 smeshGUI->DisplayActor(Mesh, true);
2481 smeshGUI->DisplayEdges(Mesh, true);
2482 smeshGUI->ChangeRepresentation(Mesh,
2483 Mesh->getDisplayMode());
2489 QApplication::restoreOverrideCursor();
2490 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2491 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2492 tr("SMESH_BUT_YES"));
2494 QApplication::restoreOverrideCursor();
2498 case 702: // ADD SUB MESH
2500 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2503 smeshGUI->EmitSignalDeactivateDialog();
2504 SALOME_Selection *Sel =
2505 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2507 SMESHGUI_AddSubMeshDlg *aDlg =
2508 new SMESHGUI_AddSubMeshDlg(parent, "", Sel);
2512 QApplication::restoreOverrideCursor();
2513 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2514 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2515 tr("SMESH_BUT_YES"));
2520 case 703: // INIT MESH
2522 smeshGUI->EmitSignalDeactivateDialog();
2523 SALOME_Selection *Sel =
2524 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2526 SMESHGUI_InitMeshDlg *aDlg = new SMESHGUI_InitMeshDlg(parent, "", Sel);
2530 case 704: // EDIT Hypothesis
2532 smeshGUI->EmitSignalDeactivateDialog();
2533 SALOME_Selection *Sel =
2534 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2536 SMESHGUI_EditHypothesesDlg *aDlg =
2537 new SMESHGUI_EditHypothesesDlg(parent, "", Sel);
2541 case 705: // EDIT Global Hypothesis
2543 smeshGUI->EmitSignalDeactivateDialog();
2544 SALOME_Selection *Sel =
2545 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2547 SMESHGUI_EditHypothesesDlg *aDlg =
2548 new SMESHGUI_EditHypothesesDlg(parent, "", Sel);
2552 case 706: // EDIT Local Hypothesis
2554 smeshGUI->EmitSignalDeactivateDialog();
2555 SALOME_Selection *Sel =
2556 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2558 SMESHGUI_EditHypothesesDlg *aDlg =
2559 new SMESHGUI_EditHypothesesDlg(parent, "", Sel);
2563 case 806: // ORIENTATION ELEMENTS
2565 smeshGUI->EmitSignalDeactivateDialog();
2566 SALOME_Selection *Sel =
2567 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2569 smeshGUI->myDesktop->SetSelectionMode(3, true);
2570 SMESHGUI_OrientationElementsDlg *aDlg =
2571 new SMESHGUI_OrientationElementsDlg(parent, "", Sel);
2575 case 807: // DIAGONAL INVERSION
2577 smeshGUI->EmitSignalDeactivateDialog();
2578 SALOME_Selection *Sel =
2579 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2581 Sel->ClearIObjects();
2582 smeshGUI->myDesktop->SetSelectionMode(2, true);
2583 SMESHGUI_DiagonalInversionDlg *aDlg =
2584 new SMESHGUI_DiagonalInversionDlg(parent, "", Sel);
2588 case 900: // MESH INFOS
2590 smeshGUI->EmitSignalDeactivateDialog();
2591 SALOME_Selection *Sel =
2592 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2594 SMESHGUI_MeshInfosDlg *aDlg =
2595 new SMESHGUI_MeshInfosDlg(parent, "", Sel);
2599 case 1001: // AUTOMATIC UPDATE PREFERENCES
2601 parent->menuBar()->setItemChecked(1001,
2602 !parent->menuBar()->isItemChecked(1001));
2603 if (parent->menuBar()->isItemChecked(1001))
2605 QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "true");
2606 smeshGUI->myAutomaticUpdate = true;
2610 QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "false");
2611 smeshGUI->myAutomaticUpdate = false;
2616 case 1003: // MESH PREFERENCES
2618 smeshGUI->SetDisplaySettings();
2624 QString Bold = QAD_CONFIG->getSetting("ScalarBar:Bold");
2625 QString Italic = QAD_CONFIG->getSetting("ScalarBar:Italic");
2626 QString Shadow = QAD_CONFIG->getSetting("ScalarBar:Shadow");
2627 QString FontFamily = QAD_CONFIG->getSetting("ScalarBar:FontFamily");
2628 QString Orientation = QAD_CONFIG->getSetting("ScalarBar:Orientation");
2629 float Width = QAD_CONFIG->getSetting("ScalarBar:Width").toFloat();
2630 float Height = QAD_CONFIG->getSetting("ScalarBar:Height").toFloat();
2631 int NumberOfLabels =
2632 QAD_CONFIG->getSetting("ScalarBar:NumberOfLabels").toInt();
2633 int NumberOfColors =
2634 QAD_CONFIG->getSetting("ScalarBar:NumberOfColors").toInt();
2640 if (NumberOfLabels == 0)
2642 if (NumberOfColors == 0)
2643 NumberOfColors = 64;
2645 SMESHGUI_Preferences_ScalarBarDlg *aDlg =
2646 new SMESHGUI_Preferences_ScalarBarDlg(parent, "", true);
2648 if (Bold.compare("true") == 0)
2649 aDlg->Bold->setChecked(true);
2651 aDlg->Bold->setChecked(false);
2652 if (Italic.compare("true") == 0)
2653 aDlg->Italic->setChecked(true);
2655 aDlg->Italic->setChecked(false);
2656 if (Shadow.compare("true") == 0)
2657 aDlg->Shadow->setChecked(true);
2659 aDlg->Shadow->setChecked(false);
2661 if (Orientation.compare("Horizontal") == 0)
2662 aDlg->RadioHoriz->setChecked(true);
2664 aDlg->RadioVert->setChecked(true);
2666 int NbItems = aDlg->ComboBox1->count();
2668 aDlg->ComboBox1->setCurrentItem(i);
2671 if (FontFamily.compare(aDlg->ComboBox1->text(i)) == 0)
2672 aDlg->ComboBox1->setCurrentItem(i);
2676 aDlg->LineEditWidth->setText(QString("%1").arg(Width));
2677 aDlg->LineEditHeight->setText(QString("%1").arg(Height));
2679 aDlg->SpinBoxLabels->setValue(NumberOfLabels);
2680 aDlg->SpinBoxColors->setValue(NumberOfColors);
2685 if (aDlg->RadioHoriz->isChecked())
2686 Orientation = "Horizontal";
2688 Orientation = "Vertical";
2689 if (aDlg->Bold->isChecked())
2693 if (aDlg->Italic->isChecked())
2697 if (aDlg->Shadow->isChecked())
2702 FontFamily = aDlg->ComboBox1->currentText();
2703 Width = aDlg->LineEditWidth->text().toFloat();
2704 Height = aDlg->LineEditHeight->text().toFloat();
2705 NumberOfColors = aDlg->SpinBoxColors->text().toInt();
2706 NumberOfLabels = aDlg->SpinBoxLabels->text().toInt();
2708 vtkScalarBarActor *aScalarBar = smeshGUI->GetScalarBar();
2709 if (aScalarBar != NULL)
2711 smeshGUI->SetSettingsScalarBar(aScalarBar, Bold, Italic, Shadow,
2712 FontFamily, Orientation,
2713 Width, Height, NumberOfColors, NumberOfLabels);
2716 QAD_CONFIG->addSetting("ScalarBar:Bold", Bold);
2717 QAD_CONFIG->addSetting("ScalarBar:Italic", Italic);
2718 QAD_CONFIG->addSetting("ScalarBar:Shadow", Shadow);
2719 QAD_CONFIG->addSetting("ScalarBar:FontFamily", FontFamily);
2720 QAD_CONFIG->addSetting("ScalarBar:Orientation", Orientation);
2721 QAD_CONFIG->addSetting("ScalarBar:Width", Width);
2722 QAD_CONFIG->addSetting("ScalarBar:Height", Height);
2723 QAD_CONFIG->addSetting("ScalarBar:NumberOfLabels", NumberOfLabels);
2724 QAD_CONFIG->addSetting("ScalarBar:NumberOfColors", NumberOfColors);
2729 case 1100: // EDIT HYPOTHESIS
2731 SALOME_Selection *Sel =
2732 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2734 int nbSel = Sel->IObjectCount();
2738 Standard_Boolean res;
2739 SMESH::SMESH_Hypothesis_var Hyp =
2740 smeshGUI->ConvertIOinSMESHHypothesis(Sel->firstIObject(), res);
2742 /* Look for all mesh objects that have this hupothesis affected in order to flag as ModifiedMesh */
2743 /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects */
2744 /* Warning : however by internal mechanism all subMeshes icons are changed ! */
2745 SALOMEDS::Study::ListOfSObject_var listSOmesh =
2746 smeshGUI->GetMeshesUsingAlgoOrHypothesis(Hyp);
2750 QString Name = Hyp->GetName();
2752 if (Name.compare("LocalLength") == 0)
2754 SMESH::SMESH_LocalLength_var LL =
2755 SMESH::SMESH_LocalLength::_narrow(Hyp);
2756 double beforeLength = LL->GetLength();
2757 double Length = smeshGUI->Parameter(res,
2759 tr("SMESH_LOCAL_LENGTH_HYPOTHESIS"),
2762 if (res && Length != beforeLength)
2764 LL->SetLength(Length);
2765 for (int i = 0; i < listSOmesh->length(); i++)
2767 smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i],
2774 else if (Name.compare("NumberOfSegments") == 0)
2776 SMESH::SMESH_NumberOfSegments_var NOS =
2777 SMESH::SMESH_NumberOfSegments::_narrow(Hyp);
2778 int beforeNbSeg = NOS->GetNumberOfSegments();
2779 int NbSeg = smeshGUI->Parameter(res,
2781 tr("SMESH_NB_SEGMENTS_HYPOTHESIS"),
2785 if (res && NbSeg != beforeNbSeg)
2787 NOS->SetNumberOfSegments(NbSeg);
2788 for (int i = 0; i < listSOmesh->length(); i++)
2790 SALOMEDS::SObject_var SO = listSOmesh[i];
2791 smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i],
2798 else if (Name.compare("MaxElementArea") == 0)
2800 SMESH::SMESH_MaxElementArea_var MEA =
2801 SMESH::SMESH_MaxElementArea::_narrow(Hyp);
2802 double beforeMaxArea = MEA->GetMaxElementArea();
2803 double MaxArea = smeshGUI->Parameter(res,
2805 tr("SMESH_MAX_ELEMENT_AREA_HYPOTHESIS"),
2808 if (res && MaxArea != beforeMaxArea)
2810 MEA->SetMaxElementArea(MaxArea);
2811 for (int i = 0; i < listSOmesh->length(); i++)
2813 smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i],
2820 else if (Name.compare("MaxElementVolume") == 0)
2822 SMESH::SMESH_MaxElementVolume_var MEV =
2823 SMESH::SMESH_MaxElementVolume::_narrow(Hyp);
2824 double beforeMaxVolume = MEV->GetMaxElementVolume();
2825 double MaxVolume = smeshGUI->Parameter(res,
2827 tr("SMESH_MAX_ELEMENT_VOLUME_HYPOTHESIS"),
2830 if (res && MaxVolume != beforeMaxVolume)
2832 MEV->SetMaxElementVolume(MaxVolume);
2833 for (int i = 0; i < listSOmesh->length(); i++)
2835 smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i],
2842 else if (Name.compare("Regular_1D") == 0)
2845 else if (Name.compare("MEFISTO_2D") == 0)
2857 case 1101: // RENAME
2859 SALOME_Selection *Sel =
2860 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2862 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
2863 for (; It.More(); It.Next())
2865 Handle(SALOME_InteractiveObject) IObject = It.Value();
2867 SALOMEDS::SObject_var obj =
2868 smeshGUI->myStudy->FindObjectID(IObject->getEntry());
2869 SALOMEDS::GenericAttribute_var anAttr;
2870 SALOMEDS::AttributeName_var aName;
2871 if (!obj->_is_nil())
2873 if (obj->FindAttribute(anAttr, "AttributeName"))
2875 aName = SALOMEDS::AttributeName::_narrow(anAttr);
2876 QString newName = QString(aName->Value());
2878 SALOMEGUI_NameDlg::getName(QAD_Application::
2879 getDesktop(), newName);
2880 if (!newName.isEmpty())
2882 QApplication::setOverrideCursor(Qt::waitCursor);
2883 smeshGUI->myActiveStudy->renameIObject(IObject,
2886 QApplication::restoreOverrideCursor();
2893 case 1102: // REMOVE HYPOTHESIS / ALGORITHMS
2895 QApplication::setOverrideCursor(Qt::waitCursor);
2896 SALOME_Selection *Sel =
2897 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2899 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
2900 for (int i = 0; It.More(); It.Next(), i++)
2902 Handle(SALOME_InteractiveObject) IObject = It.Value();
2903 smeshGUI->RemoveHypothesisOrAlgorithmOnMesh(IObject);
2905 Sel->ClearIObjects();
2906 smeshGUI->myActiveStudy->updateObjBrowser(true);
2907 QApplication::restoreOverrideCursor();
2911 case 401: // GEOM::EDGE
2913 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2916 smeshGUI->EmitSignalDeactivateDialog();
2917 SALOME_Selection *Sel =
2918 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2920 Sel->ClearIObjects();
2921 smeshGUI->myDesktop->SetSelectionMode(1, true);
2922 parent->menuBar()->setItemChecked(9010, false);
2923 parent->menuBar()->setItemChecked(9011, false);
2924 smeshGUI->ViewNodes();
2925 SMESHGUI_AddEdgeDlg *aDlg =
2926 new SMESHGUI_AddEdgeDlg(parent, "", Sel);
2930 QApplication::restoreOverrideCursor();
2931 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2932 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2933 tr("SMESH_BUT_YES"));
2937 case 4021: // TRIANGLE
2939 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2942 smeshGUI->EmitSignalDeactivateDialog();
2943 SALOME_Selection *Sel =
2944 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2946 Sel->ClearIObjects();
2947 smeshGUI->myDesktop->SetSelectionMode(1, true);
2948 parent->menuBar()->setItemChecked(9010, false);
2949 parent->menuBar()->setItemChecked(9011, false);
2950 smeshGUI->ViewNodes();
2951 SMESHGUI_AddFaceDlg *aDlg =
2952 new SMESHGUI_AddFaceDlg(parent, "", Sel, 3);
2956 QApplication::restoreOverrideCursor();
2957 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2958 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2959 tr("SMESH_BUT_YES"));
2965 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2968 smeshGUI->EmitSignalDeactivateDialog();
2969 SALOME_Selection *Sel =
2970 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2972 Sel->ClearIObjects();
2973 smeshGUI->myDesktop->SetSelectionMode(1, true);
2974 parent->menuBar()->setItemChecked(9010, false);
2975 parent->menuBar()->setItemChecked(9011, false);
2976 smeshGUI->ViewNodes();
2977 SMESHGUI_AddFaceDlg *aDlg =
2978 new SMESHGUI_AddFaceDlg(parent, "", Sel, 4);
2982 QApplication::restoreOverrideCursor();
2983 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
2984 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2985 tr("SMESH_BUT_YES"));
2991 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
2994 smeshGUI->EmitSignalDeactivateDialog();
2995 SALOME_Selection *Sel =
2996 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
2998 Sel->ClearIObjects();
2999 smeshGUI->myDesktop->SetSelectionMode(1, true);
3000 parent->menuBar()->setItemChecked(9010, false);
3001 parent->menuBar()->setItemChecked(9011, false);
3002 smeshGUI->ViewNodes();
3003 SMESHGUI_AddVolumeDlg *aDlg =
3004 new SMESHGUI_AddVolumeDlg(parent, "", Sel, 4);
3008 QApplication::restoreOverrideCursor();
3009 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
3010 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
3011 tr("SMESH_BUT_YES"));
3017 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
3020 smeshGUI->EmitSignalDeactivateDialog();
3021 SALOME_Selection *Sel =
3022 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3024 Sel->ClearIObjects();
3025 smeshGUI->myDesktop->SetSelectionMode(1, true);
3026 parent->menuBar()->setItemChecked(9010, false);
3027 parent->menuBar()->setItemChecked(9011, false);
3028 smeshGUI->ViewNodes();
3029 SMESHGUI_AddVolumeDlg *aDlg =
3030 new SMESHGUI_AddVolumeDlg(parent, "", Sel, 8);
3034 QApplication::restoreOverrideCursor();
3035 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
3036 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
3037 tr("SMESH_BUT_YES"));
3042 case 4041: // REMOVES NODES
3044 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
3047 smeshGUI->EmitSignalDeactivateDialog();
3048 SALOME_Selection *Sel =
3049 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3051 Sel->ClearIObjects();
3052 smeshGUI->myDesktop->SetSelectionMode(1, true);
3053 parent->menuBar()->setItemChecked(9010, false);
3054 parent->menuBar()->setItemChecked(9011, false);
3055 smeshGUI->ViewNodes();
3056 SMESHGUI_RemoveNodesDlg *aDlg =
3057 new SMESHGUI_RemoveNodesDlg(parent, "", Sel);
3061 QApplication::restoreOverrideCursor();
3062 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
3063 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
3064 tr("SMESH_BUT_YES"));
3068 case 4042: // REMOVES ELEMENTS
3070 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
3073 smeshGUI->EmitSignalDeactivateDialog();
3074 SALOME_Selection *Sel =
3075 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3077 Sel->ClearIObjects();
3078 smeshGUI->myDesktop->SetSelectionMode(3, true);
3079 SMESHGUI_RemoveElementsDlg *aDlg =
3080 new SMESHGUI_RemoveElementsDlg(parent, "", Sel);
3084 QApplication::restoreOverrideCursor();
3085 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
3086 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
3087 tr("SMESH_BUT_YES"));
3092 case 5000: // HYPOTHESIS - ALGO
3094 smeshGUI->CreateAlgorithm("Regular_1D", "Wire Discretisation");
3099 smeshGUI->CreateAlgorithm("MEFISTO_2D", "Triangle (Mefisto)");
3104 smeshGUI->CreateAlgorithm("Quadrangle_2D", "Quadrangle (Mapping)");
3109 smeshGUI->CreateAlgorithm("Hexa_3D", "Hexahedron (i,j,k)");
3114 smeshGUI->CreateAlgorithm("NETGEN_3D", "Tetrahedron (Netgen)");
3118 case 5030: // HYPOTHESIS - LOCAL LENGTH
3120 smeshGUI->EmitSignalDeactivateDialog();
3121 SALOME_Selection *Sel =
3122 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3124 SMESHGUI_LocalLengthDlg *aDlg = new SMESHGUI_LocalLengthDlg(parent, "");
3127 case 5031: // HYPOTHESIS - NB SEGMENTS
3129 smeshGUI->EmitSignalDeactivateDialog();
3130 SALOME_Selection *Sel =
3131 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3133 SMESHGUI_NbSegmentsDlg *aDlg = new SMESHGUI_NbSegmentsDlg(parent, "");
3137 case 5032: // HYPOTHESIS - MAX ELEMENT AREA
3139 smeshGUI->EmitSignalDeactivateDialog();
3140 SALOME_Selection *Sel =
3141 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3143 SMESHGUI_MaxElementAreaDlg *aDlg =
3144 new SMESHGUI_MaxElementAreaDlg(parent, "");
3148 case 5033: // HYPOTHESIS - MAX ELEMENT VOLUME
3150 smeshGUI->EmitSignalDeactivateDialog();
3151 SALOME_Selection *Sel =
3152 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3154 SMESHGUI_MaxElementVolumeDlg *aDlg =
3155 new SMESHGUI_MaxElementVolumeDlg(parent, "");
3159 case 5034: // HYPOTHESIS - LENGTH FROM EDGES
3161 SMESH::SMESH_Hypothesis_var Hyp;
3164 Hyp = smeshGUI->myComponentMesh->CreateHypothesis("LengthFromEdges", smeshGUI->myStudyId);
3166 if (!Hyp->_is_nil())
3168 SALOMEDS::SObject_var SHyp = smeshGUI->myStudyAPI.AddNewHypothesis(Hyp);
3169 smeshGUI->myStudyAPI.SetName(SHyp, "LengthFromEdges");
3172 catch(const SALOME::SALOME_Exception & S_ex)
3174 QtCatchCorbaException(S_ex);
3176 smeshGUI->myActiveStudy->updateObjBrowser(true);
3181 case 6016: // CONTROLS
3189 SALOME_Selection *Sel =
3190 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3192 int nbSel = Sel->IObjectCount();
3195 smeshGUI->Control(theCommandID);
3201 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
3204 SALOME_Selection *Sel =
3205 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3207 SMESHGUI_EdgesConnectivityDlg *Dlg =
3208 new SMESHGUI_EdgesConnectivityDlg(parent, "", Sel);
3212 QApplication::restoreOverrideCursor();
3213 QAD_MessageBox::warn1(QAD_Application::getDesktop(),
3214 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
3215 tr("SMESH_BUT_YES"));
3222 if (!parent->menuBar()->isItemChecked(9010))
3224 QApplication::setOverrideCursor(Qt::waitCursor);
3225 parent->menuBar()->setItemChecked(9011, false);
3227 smeshGUI->EraseSimulationActors();
3228 smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
3230 SALOME_Selection *Sel =
3231 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3233 int nbSel = Sel->IObjectCount();
3236 Standard_Boolean res;
3237 SMESH_Actor *MeshActor =
3238 smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(),
3242 parent->menuBar()->setItemChecked(9010,
3243 !parent->menuBar()->isItemChecked(9010));
3245 // It's necessary to display SMDS IDs instead of VTK ones, so
3246 // vtkIdFilter is unacceptable here. We have to do it manually :(
3247 vtkUnstructuredGrid *ptGrid = vtkUnstructuredGrid::New();
3248 ptGrid->CopyStructure(MeshActor->DataSource);
3250 int numPts = MeshActor->DataSource->GetNumberOfPoints();
3252 // Loop over points and generate ids
3253 vtkIntArray *ptIds = vtkIntArray::New();
3254 ptIds->SetNumberOfValues(numPts);
3256 for (int id = 0; id < numPts; id++)
3258 int idSMDS = MeshActor->GetIdSMESHDSNode(id);
3259 ptIds->SetValue(id, idSMDS);
3262 // mpv porting vtk4.2.2
3263 // vtkScalars* newScalars = vtkScalars::New();
3264 // newScalars->SetData(ptIds);
3265 // ptGrid->GetPointData()->SetScalars(newScalars);
3266 ptGrid->GetPointData()->SetScalars(ptIds);
3267 // newScalars->Delete();
3271 vtkMaskPoints *mask = vtkMaskPoints::New();
3272 mask->SetInput(ptGrid);
3273 mask->SetOnRatio(1);
3274 // mask->SetMaximumNumberOfPoints( 50 );
3275 // mask->RandomModeOn();
3277 vtkSelectVisiblePoints *visPts =
3278 vtkSelectVisiblePoints::New();
3279 visPts->SetInput(mask->GetOutput());
3280 visPts->SetRenderer(((VTKViewer_ViewFrame *) smeshGUI->
3281 myActiveStudy->getActiveStudyFrame()->
3282 getRightFrame()->getViewFrame())->getRenderer());
3283 //visPts->SetSelectInvisible(1);
3284 visPts->SelectInvisibleOff();
3285 visPts->SetTolerance(0.1);
3287 vtkLabeledDataMapper *ldm = vtkLabeledDataMapper::New();
3288 ldm->SetInput(visPts->GetOutput());
3289 ldm->SetLabelFormat("%g");
3290 ldm->SetLabelModeToLabelScalars();
3291 //ldm->SetLabelModeToLabelFieldData();
3293 ldm->SetFontFamilyToTimes();
3294 ldm->SetFontSize(6 * parent->font().pointSize() / 5);
3299 vtkActor2D *pointLabels = vtkActor2D::New();
3300 pointLabels->SetMapper(ldm);
3301 pointLabels->GetProperty()->SetColor(0, 1, 0);
3305 smeshGUI->mySimulationActors2D->AddItem(pointLabels);
3306 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
3307 getActiveStudyFrame()->getRightFrame()->
3308 getViewFrame())->getRenderer()->AddActor2D(pointLabels);
3314 QApplication::setOverrideCursor(Qt::waitCursor);
3315 parent->menuBar()->setItemChecked(9010,
3316 !parent->menuBar()->isItemChecked(9010));
3317 smeshGUI->EraseSimulationActors();
3318 smeshGUI->ScalarVisibilityOff();
3320 QApplication::restoreOverrideCursor();
3325 if (!parent->menuBar()->isItemChecked(9011))
3327 QApplication::setOverrideCursor(Qt::waitCursor);
3328 parent->menuBar()->setItemChecked(9010, false);
3330 smeshGUI->EraseSimulationActors();
3331 smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
3333 SALOME_Selection *Sel =
3334 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
3336 int nbSel = Sel->IObjectCount();
3339 Standard_Boolean res;
3340 SMESH_Actor *MeshActor =
3341 smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(),
3345 parent->menuBar()->setItemChecked(9011,
3346 !parent->menuBar()->isItemChecked(9011));
3348 // It's necessary to display SMDS IDs instead of VTK ones, so
3349 // vtkIdFilter is unacceptable here. We have to do it manually :(
3350 vtkUnstructuredGrid *elGrid = vtkUnstructuredGrid::New();
3351 elGrid->CopyStructure(MeshActor->DataSource);
3353 int numCells = MeshActor->DataSource->GetNumberOfCells();
3355 // Loop over points and generate ids
3356 vtkIntArray *cellIds = vtkIntArray::New();
3357 cellIds->SetNumberOfValues(numCells);
3359 for (int id = 0; id < numCells; id++)
3361 int idSMDS = MeshActor->GetIdSMESHDSElement(id);
3362 cellIds->SetValue(id, idSMDS);
3365 // mpv porting vk4.2.2
3366 // vtkScalars* newScalars = vtkScalars::New();
3367 // newScalars->SetData(cellIds);
3368 elGrid->GetCellData()->SetScalars(cellIds);
3369 // elGrid->GetCellData()->SetScalars(newScalars);
3370 // newScalars->Delete();
3375 vtkCellCenters *cc = vtkCellCenters::New();
3376 cc->SetInput(elGrid);
3378 vtkSelectVisiblePoints *visCells =
3379 vtkSelectVisiblePoints::New();
3380 visCells->SetInput(cc->GetOutput());
3381 visCells->SetRenderer(((VTKViewer_ViewFrame *) smeshGUI->
3382 myActiveStudy->getActiveStudyFrame()->
3383 getRightFrame()->getViewFrame())->getRenderer());
3384 visCells->SelectInvisibleOff();
3385 visCells->SetTolerance(0.1);
3386 // visCells->SetSelectInvisible(1);
3388 vtkLabeledDataMapper *ldm = vtkLabeledDataMapper::New();
3389 ldm->SetInput(visCells->GetOutput());
3390 ldm->SetLabelFormat("%g");
3391 ldm->SetLabelModeToLabelScalars();
3393 ldm->SetFontFamilyToTimes();
3394 ldm->SetFontSize(6 * parent->font().pointSize() / 5);
3399 vtkActor2D *cellLabels = vtkActor2D::New();
3400 cellLabels->SetMapper(ldm);
3401 cellLabels->GetProperty()->SetColor(1, 0, 0);
3406 smeshGUI->mySimulationActors2D->AddItem(cellLabels);
3407 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
3408 getActiveStudyFrame()->getRightFrame()->
3409 getViewFrame())->getRenderer()->AddActor2D(cellLabels);
3415 QApplication::setOverrideCursor(Qt::waitCursor);
3416 parent->menuBar()->setItemChecked(9011,
3417 !parent->menuBar()->isItemChecked(9011));
3418 smeshGUI->EraseSimulationActors();
3419 smeshGUI->ScalarVisibilityOff();
3421 QApplication::restoreOverrideCursor();
3425 case 10001: // DISPLAY MODE PREFERENCE
3427 parent->menuBar()->setItemChecked(10001,
3428 !parent->menuBar()->isItemChecked(10001));
3429 parent->menuBar()->setItemChecked(10002, false);
3430 parent->menuBar()->setItemChecked(10003, false);
3431 QAD_CONFIG->addSetting("SMESH:DisplayMode", "Wireframe");
3436 parent->menuBar()->setItemChecked(10002,
3437 !parent->menuBar()->isItemChecked(10002));
3438 parent->menuBar()->setItemChecked(10001, false);
3439 parent->menuBar()->setItemChecked(10003, false);
3440 QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading");
3445 parent->menuBar()->setItemChecked(10003,
3446 !parent->menuBar()->isItemChecked(10003));
3447 parent->menuBar()->setItemChecked(10002, false);
3448 parent->menuBar()->setItemChecked(10001, false);
3449 QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shrink");
3455 smeshGUI->myActiveStudy->updateObjBrowser(true);
3459 //=============================================================================
3460 /*! function : GetMeshesUsingAlgoOrHypothesis()
3461 * purpose : return a list of Study objects (mesh kind) that have 'AlgoOrHyp' affected.
3462 * : However is supposed here that father of father of an hypothesis is a Mesh Object.
3464 //=============================================================================
3465 SALOMEDS::Study::ListOfSObject *
3466 SMESHGUI::GetMeshesUsingAlgoOrHypothesis(SMESH::
3467 SMESH_Hypothesis_ptr AlgoOrHyp)
3469 SALOMEDS::Study::ListOfSObject_var listSOmesh =
3470 new SALOMEDS::Study::ListOfSObject;
3471 listSOmesh->length(0);
3472 unsigned int index = 0;
3473 if (!AlgoOrHyp->_is_nil())
3475 SALOMEDS::SObject_var SO_Hypothesis =
3476 smeshGUI->GetStudyAPI().FindHypothesisOrAlgorithms(AlgoOrHyp);
3477 if (!SO_Hypothesis->_is_nil())
3479 SALOMEDS::Study::ListOfSObject_var listSO =
3480 smeshGUI->myStudy->FindDependances(SO_Hypothesis);
3481 for (unsigned int i = 0; i < listSO->length(); i++)
3483 SALOMEDS::SObject_var SO = listSO[i];
3486 SALOMEDS::SObject_var SOfatherFather =
3487 SO->GetFather()->GetFather();
3488 if (!SOfatherFather->_is_nil())
3491 listSOmesh->length(index);
3492 listSOmesh[index - 1] = SOfatherFather;
3498 return listSOmesh._retn();
3501 //=============================================================================
3505 //=============================================================================
3506 void SMESHGUI::Import_Mesh(QAD_Desktop * parent, int theCommandID)
3510 Mesh_Reader *myReader;
3512 if (theCommandID == 113)
3514 filter = tr("MED files (*.med)");
3515 myExtension = string("MED");
3516 myReader = new DriverMED_R_SMESHDS_Mesh;
3518 else if (theCommandID == 112)
3520 filter = tr("IDEAS files (*.unv)");
3521 myExtension = string("UNV");
3523 else if (theCommandID == 111)
3525 filter = tr("DAT files (*.dat)");
3526 myExtension = string("MED");
3527 myReader = new DriverDAT_R_SMESHDS_Mesh;
3530 QString filename = QAD_FileDlg::getFileName(parent,
3535 if (!filename.isEmpty())
3537 QApplication::setOverrideCursor(Qt::waitCursor);
3538 string myClass = string("SMESHDS_Mesh");
3539 // Mesh_Reader* myReader = SMESHDriver::GetMeshReader(myExtension, myClass);
3541 int myMeshId = (smeshGUI->myDocument)->NewMesh();
3542 SMDS_Mesh *myMesh = (smeshGUI->myDocument)->GetMesh(myMeshId);
3544 myReader->SetFile(string(filename.latin1()));
3545 myReader->SetMesh(myMesh);
3546 myReader->SetMeshId(myMeshId);
3549 QApplication::restoreOverrideCursor();
3553 //=============================================================================
3557 //=============================================================================
3558 void SMESHGUI::Export_Mesh(QAD_Desktop * parent, int theCommandID)
3560 SALOME_Selection *Sel =
3561 SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection());
3562 int nbSel = Sel->IObjectCount();
3565 Standard_Boolean res;
3566 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
3567 SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh(IObject, res);
3570 if (theCommandID == 122)
3572 QString filename = QAD_FileDlg::getFileName(parent,
3574 tr("MED files (*.med)"),
3577 if (!filename.isEmpty())
3579 QApplication::setOverrideCursor(Qt::waitCursor);
3580 aMesh->ExportMED(filename.latin1());
3581 QApplication::restoreOverrideCursor();
3584 else if (theCommandID == 121)
3586 QString filename = QAD_FileDlg::getFileName(parent,
3588 tr("DAT files (*.dat)"),
3591 if (!filename.isEmpty())
3593 QApplication::setOverrideCursor(Qt::waitCursor);
3594 aMesh->ExportDAT(filename.latin1());
3595 QApplication::restoreOverrideCursor();
3598 else if (theCommandID == 123)
3600 QString filename = QAD_FileDlg::getFileName(parent,
3602 tr("IDEAS files (*.unv)"),
3605 if (!filename.isEmpty())
3607 QApplication::setOverrideCursor(Qt::waitCursor);
3608 aMesh->ExportUNV(filename.latin1());
3609 QApplication::restoreOverrideCursor();
3612 aMesh->ExportDAT(filename.latin1());
3614 QApplication::restoreOverrideCursor();
3616 if (IObject->hasEntry())
3619 SALOMEDS::SObject_var SO =
3620 smeshGUI->myStudy->FindObjectID(IObject->getEntry());
3621 SALOMEDS::GenericAttribute_var anAttr;
3622 SALOMEDS::AttributeComment_var aFileName;
3623 SALOMEDS::StudyBuilder_var aStudyBuilder =
3624 smeshGUI->myStudy->NewBuilder();
3626 aStudyBuilder->FindOrCreateAttribute(SO,
3627 "AttributeComment");
3628 aFileName = SALOMEDS::AttributeComment::_narrow(anAttr);
3629 aFileName->SetValue(filename.latin1());
3636 //=============================================================================
3640 //=============================================================================
3641 void SMESHGUI::Import_Document(QAD_Desktop * parent, int theCommandID)
3645 Document_Reader *myReader;
3647 if (theCommandID == 113)
3649 filter = tr("MED files (*.med)");
3650 myExtension = string("MED");
3651 myReader = new DriverMED_R_SMESHDS_Document;
3653 else if (theCommandID == 112)
3655 filter = tr("IDEAS files (*.unv)");
3656 myExtension = string("UNV");
3657 myReader = new DriverUNV_R_SMESHDS_Document;
3659 else if (theCommandID == 111)
3661 filter = tr("DAT files (*.dat)");
3662 myExtension = string("DAT");
3663 myReader = new DriverDAT_R_SMESHDS_Document;
3666 QString filename = QAD_FileDlg::getFileName(parent,
3669 tr("Import document"),
3671 if (!filename.isEmpty())
3673 QApplication::setOverrideCursor(Qt::waitCursor);
3674 string myClass = string("SMESHDS_Document");
3675 // Document_Reader* myReader = SMESHDriver::GetDocumentReader(myExtension, myClass);
3676 SMESHDS_Document *newDocument = new SMESHDS_Document(1);
3678 myReader->SetFile(string(filename.latin1()));
3679 myReader->SetDocument(smeshGUI->myDocument);
3681 QApplication::restoreOverrideCursor();
3685 void SMESHGUI::Export_Document(QAD_Desktop * parent, int theCommandID)
3688 Document_Writer *myWriter;
3691 if (theCommandID == 122)
3693 filter = tr("MED files (*.med)");
3694 myExtension = string("MED");
3695 myWriter = new DriverMED_W_SMESHDS_Document;
3697 else if (theCommandID == 121)
3699 filter = tr("DAT files (*.dat)");
3700 myExtension = string("DAT");
3701 myWriter = new DriverDAT_W_SMESHDS_Document;
3703 else if (theCommandID == 123)
3705 filter = tr("IDEAS files (*.unv)");
3706 myExtension = string("UNV");
3707 myWriter = new DriverUNV_W_SMESHDS_Document;
3710 QString filename = QAD_FileDlg::getFileName(parent,
3713 tr("Export document"),
3715 if (!filename.isEmpty())
3717 QApplication::setOverrideCursor(Qt::waitCursor);
3718 string myClass = string("SMESHDS_Document");
3719 //Document_Writer* myWriter = SMESHDriver::GetDocumentWriter(myExtension, myClass);
3721 myWriter->SetFile(string(filename.latin1()));
3722 myWriter->SetDocument(smeshGUI->myDocument);
3724 //StudyContextStruct* myStudyContext = _impl.GetStudyContext(myStudyId);
3725 //Handle(SMESHDS_Document) myDocument = myStudyContext->myDocument;
3726 //myWriter->SetDocument(myDocument);
3729 QApplication::restoreOverrideCursor();
3733 //=============================================================================
3737 //=============================================================================
3738 bool SMESHGUI::OnMousePress(QMouseEvent * pe, QAD_Desktop * parent,
3739 QAD_StudyFrame * studyFrame)
3741 SMESHGUI::GetOrCreateSMESHGUI(parent);
3745 //=============================================================================
3749 //=============================================================================
3750 bool SMESHGUI::OnMouseMove(QMouseEvent * pe, QAD_Desktop * parent,
3751 QAD_StudyFrame * studyFrame)
3753 SMESHGUI::GetOrCreateSMESHGUI(parent);
3758 //=============================================================================
3762 //=============================================================================
3763 bool SMESHGUI::OnKeyPress(QKeyEvent * pe, QAD_Desktop * parent,
3764 QAD_StudyFrame * studyFrame)
3766 SMESHGUI::GetOrCreateSMESHGUI(parent);
3771 //=============================================================================
3775 //=============================================================================
3776 bool SMESHGUI::SetSettings(QAD_Desktop * parent)
3778 SMESHGUI::GetOrCreateSMESHGUI(parent);
3781 QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode");
3782 if (DisplayMode.compare("") == 0)
3784 DisplayMode = "Shading";
3785 QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading");
3788 if (DisplayMode.compare("Wireframe") == 0)
3790 parent->menuBar()->setItemChecked(10003, false);
3791 parent->menuBar()->setItemChecked(10002, false);
3792 parent->menuBar()->setItemChecked(10001, true);
3794 else if (DisplayMode.compare("Shading") == 0)
3796 parent->menuBar()->setItemChecked(10003, false);
3797 parent->menuBar()->setItemChecked(10002, true);
3798 parent->menuBar()->setItemChecked(10001, false);
3800 else if (DisplayMode.compare("Shrink") == 0)
3802 parent->menuBar()->setItemChecked(10003, true);
3803 parent->menuBar()->setItemChecked(10002, false);
3804 parent->menuBar()->setItemChecked(10001, false);
3807 /* Automatic Update */
3808 QString AutoUpdate = QAD_CONFIG->getSetting("SMESH:AutomaticUpdate");
3809 if (AutoUpdate.compare("true") == 0)
3811 parent->menuBar()->setItemChecked(1001, true);
3812 smeshGUI->myAutomaticUpdate = true;
3816 parent->menuBar()->setItemChecked(1001, false);
3817 smeshGUI->myAutomaticUpdate = false;
3821 parent->menuBar()->setItemEnabled(11, false); // IMPORT
3826 //=============================================================================
3830 //=============================================================================
3831 void SMESHGUI::DefinePopup(QString & theContext, QString & theParent,
3832 QString & theObject)
3834 /* Create or retrieve an object SMESHGUI */
3835 SMESHGUI::GetOrCreateSMESHGUI(QAD_Application::getDesktop());
3837 // NRI : Temporary added
3838 // if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) {
3839 // theObject = "NothingSelected";
3840 // theContext = "NothingSelected";
3844 SALOME_Selection *Sel =
3845 SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection());
3846 int nbSel = Sel->IObjectCount();
3849 if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() ==
3852 vtkScalarBarActor *aScalarBar = smeshGUI->GetScalarBar();
3853 if ((aScalarBar != NULL) && (aScalarBar->GetVisibility() == 1))
3855 theObject = "ScalarBar";
3860 theObject = "NothingSelected";
3861 theContext = "NothingSelected";
3866 theObject = "NothingSelected";
3867 theContext = "NothingSelected";
3870 else if (nbSel == 1)
3872 theObject = smeshGUI->CheckTypeObject(Sel->firstIObject());
3877 theObject = smeshGUI->CheckHomogeneousSelection();
3882 //=============================================================================
3886 //=============================================================================
3887 bool SMESHGUI::CustomPopup(QAD_Desktop * parent,
3889 const QString & theContext,
3890 const QString & theParent, const QString & theObject)
3892 // Popup should be customized for any viewer since some meaningless commands may be present in the popup
3893 //if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) //Test du type de viewer true=OCC false=VTK
3895 /* Create or retrieve an object SMESHGUI */
3896 SMESHGUI::GetOrCreateSMESHGUI(parent);
3898 // NRI : Temporary added
3899 // if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) {
3904 SALOME_Selection *Sel =
3905 SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection());
3906 QAD_StudyFrame *studyFrame = smeshGUI->myActiveStudy->getActiveStudyFrame();
3907 int nbSel = Sel->IObjectCount();
3911 if (studyFrame->getTypeView() != VIEW_VTK)
3915 else if (nbSel == 1)
3917 QString parentComp =
3918 ((SALOMEGUI_Desktop *) parent)->getComponentFromSelection();
3919 // First check type of active viewer (VTK required)
3920 if ( /*studyFrame->getTypeView() != VIEW_VTK || */ parentComp !=
3921 parent->getActiveComponent())
3923 //MESSAGE("CustomPopup(): VTK viewer required, removing all SMESH-specific popup menu items")
3926 int id = popup->idAt(0);
3927 if (id <= QAD_TopLabel_Popup_ID)
3928 popup->removeItemAt(0);
3932 if (theObject.compare("Component") == 0)
3934 popup->removeItem(QAD_DisplayOnly_Popup_ID);
3939 // Remove common popup items for Submesh, Hypothesis and Algorithm
3940 if (theObject.compare("SubMesh") == 0 ||
3941 theObject.compare("Hypothesis") == 0 ||
3942 theObject.compare("Algorithm") == 0)
3944 popup->removeItem(QAD_Display_Popup_ID);
3945 popup->removeItem(QAD_DisplayOnly_Popup_ID);
3946 popup->removeItem(QAD_Erase_Popup_ID);
3947 int id = popup->idAt(popup->count() - 1); // last item
3948 if (id < 0 && id != -1)
3949 popup->removeItem(id); // separator
3952 if (theObject.compare("Component") == 0)
3954 popup->removeItem(QAD_DisplayOnly_Popup_ID);
3958 int id = QAD_TopLabel_Popup_ID; //popup->idAt(0);
3959 QFont f = QApplication::font();
3962 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
3964 if (theParent.compare("Viewer") == 0)
3966 if (popup->idAt(0) == id)
3968 popup->removeItem(id);
3969 popup->insertItem(new CustomItem(QString(IObject->getName()),
3973 Standard_Boolean res;
3975 smeshGUI->FindActorByEntry(IObject->getEntry(), res, false);
3976 if (res && studyFrame->getTypeView() == VIEW_VTK)
3978 VTKViewer_RenderWindowInteractor *myRenderInter =
3979 ((VTKViewer_ViewFrame *) studyFrame->getRightFrame()->
3980 getViewFrame())->getRWInteractor();
3981 if (myRenderInter->isVisible(IObject))
3983 popup->removeItem(QAD_Display_Popup_ID);
3987 popup->removeItem(QAD_Erase_Popup_ID);
3992 popup->removeItem(QAD_Erase_Popup_ID);
3994 { // mesh not computed -> can't display it
3995 popup->removeItem(QAD_Display_Popup_ID);
3996 popup->removeItem(QAD_DisplayOnly_Popup_ID);
3997 popup->removeItemAt(popup->count() - 1); //separator
4001 else if (theParent.compare("ObjectBrowser") == 0)
4003 if (theObject.compare("Mesh") == 0 ||
4004 theObject.compare("SubMesh") == 0 ||
4005 theObject.compare("Hypothesis") == 0 ||
4006 theObject.compare("Algorithm") == 0)
4008 popup->removeItemAt(0);
4012 if (popup->idAt(0) == id)
4014 popup->removeItem(id);
4015 popup->removeItemAt(0); //separator
4019 Standard_Boolean res;
4021 smeshGUI->FindActorByEntry(IObject->getEntry(), res, false);
4022 if (res && studyFrame->getTypeView() == VIEW_VTK)
4024 VTKViewer_RenderWindowInteractor *myRenderInter =
4025 ((VTKViewer_ViewFrame *) studyFrame->getRightFrame()->
4026 getViewFrame())->getRWInteractor();
4027 if (myRenderInter->isVisible(IObject))
4029 popup->removeItem(QAD_Display_Popup_ID);
4033 popup->removeItem(QAD_Erase_Popup_ID);
4038 if (theObject.compare("Mesh") == 0 ||
4039 theObject.compare("SubMesh") == 0 ||
4040 theObject.compare("Hypothesis") == 0 ||
4041 theObject.compare("Algorithm") == 0)
4046 popup->removeItem(QAD_Erase_Popup_ID);
4048 { // mesh not computed -> can't display it
4049 popup->removeItem(QAD_Display_Popup_ID);
4050 popup->removeItem(QAD_DisplayOnly_Popup_ID);
4051 popup->removeItemAt(popup->count() - 1); //separator
4059 QString parentComp =
4060 ((SALOMEGUI_Desktop *) parent)->getComponentFromSelection();
4061 QAD_StudyFrame *studyFrame =
4062 smeshGUI->myActiveStudy->getActiveStudyFrame();
4063 if ( /*studyFrame->getTypeView() != VIEW_VTK || */ parentComp !=
4064 parent->getActiveComponent())
4066 //MESSAGE("CustomPopup(): VTK viewer required, removing all SMESH-specific popup menu items")
4069 int id = popup->idAt(0);
4070 if (id <= QAD_TopLabel_Popup_ID && id != -1)
4071 popup->removeItemAt(0);
4075 if (parentComp.isNull())
4076 { // objects from several components are selected
4077 popup->removeItem(QAD_DisplayOnly_Popup_ID);
4078 popup->removeItem(QAD_Display_Popup_ID);
4079 popup->removeItem(QAD_Erase_Popup_ID);
4080 int id = popup->idAt(popup->count() - 1); // last item
4081 if (id < 0 && id != -1)
4082 popup->removeItem(id); // separator
4087 QString type = smeshGUI->CheckHomogeneousSelection();
4088 if (type.compare("Heterogeneous Selection") != 0)
4090 int id = QAD_TopLabel_Popup_ID; //popup->idAt(0);
4091 QFont f = QApplication::font();
4093 popup->removeItem(id);
4094 popup->insertItem(new CustomItem(QString("%1 ").arg(nbSel) + type +
4095 " (s) ", f), id, 0);
4101 //=============================================================================
4102 /*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
4103 * Purpose: ensures that the actor for the given <theIO> exists in the active VTK view
4105 //=============================================================================
4106 void SMESHGUI::BuildPresentation(const Handle(SALOME_InteractiveObject) & theIO)
4108 /* Create or retrieve an object SMESHGUI */
4109 SMESHGUI::GetOrCreateSMESHGUI(QAD_Application::getDesktop());
4111 QAD_StudyFrame *activeFrame =
4112 smeshGUI->myActiveStudy->getActiveStudyFrame();
4113 if (activeFrame->getTypeView() == VIEW_VTK)
4116 SALOMEDS::SObject_var fatherSF =
4117 smeshGUI->myStudy->FindObjectID(activeFrame->entry());
4119 SALOME_Selection *Sel =
4120 SALOME_Selection::Selection(smeshGUI->myActiveStudy->
4122 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
4124 // for(;It.More();It.Next()) {
4125 // Handle(SALOME_InteractiveObject) IObject = It.Value();
4126 Handle(SALOME_InteractiveObject) IObject = theIO;
4127 if (IObject->hasEntry())
4129 // Look for the actor in all views
4130 Standard_Boolean res;
4132 smeshGUI->FindActorByEntry(IObject->getEntry(), res, false);
4134 // Actor not found at all -> mesh is not computed -> do nothing!!!
4137 /*SMESH::SMESH_Mesh_var aM;
4138 * SALOMEDS::SObject_var aMorSM = smeshGUI->myStudy->FindObjectID( IObject->getEntry() );
4139 * SALOMEDS::SObject_var father = aMorSM->GetFather();
4140 * SALOMEDS::SObject_var fatherComp = aMorSM->GetFatherComponent();
4142 * // Non-displayable objects (Hypo, Algo) have tags < 3 or have a father different from component
4143 * if (aMorSM->Tag() < 3 || strcmp(father->GetID(), fatherComp->GetID()) != 0)
4146 * SALOMEDS::GenericAttribute_var anAttr;
4147 * SALOMEDS::AttributeIOR_var anIOR;
4148 * if ( !aMorSM->_is_nil() ) {
4149 * if (aMorSM->FindAttribute(anAttr, "AttributeIOR") ) {
4150 * anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
4151 * aM = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
4155 * if (!aM->_is_nil()) {
4156 * smeshGUI->InitActor(aM);
4157 * ac = smeshGUI->ReadScript(aM);
4161 * smeshGUI->DisplayActor( ac, true );
4162 * smeshGUI->DisplayEdges( ac );
4163 * smeshGUI->ChangeRepresentation( ac, ac->getDisplayMode() );
4168 { // The actor exists in some view
4169 // Check whether the actor belongs to the active view
4170 VTKViewer_RenderWindowInteractor *rwInter =
4171 ((VTKViewer_ViewFrame *) activeFrame->getRightFrame()->
4172 getViewFrame())->getRWInteractor();
4174 // The actor belongs to inactive view -> create a copy and display it in the active view
4175 if (!rwInter->isInViewer(IObject))
4177 if(ac->GetMapper()==NULL)
4179 SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh(theIO, res);
4180 ac=smeshGUI->ReadScript(aMesh);
4182 SMESH_Actor *acCopy = SMESH_Actor::New();
4183 acCopy->ShallowCopy(ac);
4186 smeshGUI->DisplayActor(ac, false);
4187 smeshGUI->DisplayEdges(ac);
4188 smeshGUI->ChangeRepresentation(ac, ac->getDisplayMode());
4196 ("BuildPresentation() must not be called while non-VTK view is active")}
4199 //=============================================================================
4203 //=============================================================================
4204 void SMESHGUI::setOrb()
4208 ORB_INIT & init = *SINGLETON_ < ORB_INIT >::Instance();
4209 ASSERT(SINGLETON_ < ORB_INIT >::IsAlreadyExisting());
4213 INFOS("internal error : orb not found");
4216 ASSERT(!CORBA::is_nil(_orb));
4219 //=============================================================================
4223 //=============================================================================
4224 SMESH_Actor *SMESHGUI::ReadScript(SMESH::SMESH_Mesh_ptr aMesh)
4226 SMESH_Actor *MeshActor;
4227 if (!aMesh->_is_nil())
4229 Standard_Boolean result;
4230 MeshActor = FindActor(aMesh, result, false);
4233 SMESH::log_array_var aSeq = aMesh->GetLog(true);
4235 if (aSeq->length() == 0)
4237 MESSAGE("ReadScript(): log is empty") return MeshActor;
4240 for (unsigned int ind = 0; ind < aSeq->length(); ind++)
4242 switch (aSeq[ind].commandType)
4244 case SMESH::ADD_NODE:
4246 AddNodes(MeshActor, aSeq[ind].number, aSeq[ind].coords,
4250 case SMESH::ADD_EDGE:
4252 // AddEdges( MeshActor, aSeq[ind].number, aSeq[ind].coords, aSeq[ind].indexes );
4255 case SMESH::ADD_TRIANGLE:
4257 AddTriangles(MeshActor, aSeq[ind].number, aSeq[ind].coords,
4261 case SMESH::ADD_QUADRANGLE:
4263 AddQuadrangles(MeshActor, aSeq[ind].number,
4264 aSeq[ind].coords, aSeq[ind].indexes);
4267 case SMESH::ADD_TETRAHEDRON:
4269 AddTetras(MeshActor, aSeq[ind].number, aSeq[ind].coords,
4273 case SMESH::ADD_PYRAMID:
4277 case SMESH::ADD_PRISM:
4281 case SMESH::ADD_HEXAHEDRON:
4283 AddHexaedres(MeshActor, aSeq[ind].number, aSeq[ind].coords,
4287 case SMESH::REMOVE_NODE:
4289 RemoveNodes(MeshActor, aSeq[ind].number, aSeq[ind].coords,
4293 case SMESH::REMOVE_ELEMENT:
4295 RemoveElements(MeshActor, aSeq[ind].number,
4296 aSeq[ind].coords, aSeq[ind].indexes);
4307 //=============================================================================
4311 //=============================================================================
4312 void SMESHGUI::Dump(SMESH_Actor * Mactor)
4314 vtkUnstructuredGrid *ugrid =
4315 vtkUnstructuredGrid::SafeDownCast(Mactor->DataSource);
4316 vtkPoints *Pts = ugrid->GetPoints();
4317 int nbPts = Pts->GetNumberOfPoints();
4318 int nbCells = ugrid->GetNumberOfCells();
4322 In = fopen("/tmp/dumpMesh", "w+");
4323 fprintf(In, "%d %d\n", nbPts, nbCells);
4324 for (int i = 0; i < nbPts; i++)
4326 float *p = ugrid->GetPoint(i);
4327 fprintf(In, "%d %e %e %e\n", i, p[0], p[1], p[2]);
4330 for (int i = 0; i < nbCells; i++)
4332 fprintf(In, "%d %d", i, ugrid->GetCell(i)->GetCellType());
4333 vtkIdList *Id = ugrid->GetCell(i)->GetPointIds();
4334 for (j = 0; j < Id->GetNumberOfIds(); j++)
4336 fprintf(In, " %d", Id->GetId(j));
4343 //=============================================================================
4347 //=============================================================================
4348 void SMESHGUI::AddNodes(SMESH_Actor * Mactor, int number,
4349 const SMESH::double_array & coords, const SMESH::long_array & indexes)
4351 QApplication::setOverrideCursor(Qt::waitCursor);
4352 if (Mactor->GetMapper() == NULL)
4354 vtkPoints *Pts = vtkPoints::New();
4355 SMESH_Grid *ugrid = SMESH_Grid::New();
4363 Pts->InsertNextPoint(coords[j - 1], coords[j], coords[j + 1]);
4364 //Mactor->AddNode( indexes[i-1], idVTK );
4365 ugrid->AddNode(indexes[i - 1], idVTK);
4369 //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::New();
4370 ugrid->SetPoints(Pts);
4371 vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New();
4372 PtsMapper->SetInput(ugrid);
4373 Mactor->DataSource = PtsMapper->GetInput();
4374 Mactor->SetMapper(PtsMapper);
4378 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
4379 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
4385 ugrid->GetPoints()->InsertNextPoint(coords[j - 1], coords[j],
4387 ugrid->AddNode(indexes[i - 1], idVTK);
4391 vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New();
4392 PtsMapper->SetInput(ugrid);
4393 Mactor->DataSource = PtsMapper->GetInput();
4394 Mactor->SetMapper(PtsMapper);
4396 QApplication::restoreOverrideCursor();
4399 //=============================================================================
4403 //=============================================================================
4404 void SMESHGUI::AddNode(SMESH_Actor * Mactor, int idnode, float x, float y,
4407 QApplication::setOverrideCursor(Qt::waitCursor);
4408 MESSAGE("SMESHGUI::AddNode " << idnode << " : " << x << ";" << y << ";" <<
4409 z) if (Mactor->GetMapper() == NULL)
4411 vtkPoints *Pts = vtkPoints::New();
4412 int idVTK = Pts->InsertNextPoint(x, y, z);
4413 //Mactor->AddNode( idnode, idVTK );
4414 //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::New();
4415 SMESH_Grid *ugrid = SMESH_Grid::New();
4417 ugrid->AddNode(idnode, idVTK);
4418 ugrid->SetPoints(Pts);
4419 vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New();
4420 PtsMapper->SetInput(ugrid);
4421 Mactor->DataSource = PtsMapper->GetInput();
4422 Mactor->SetMapper(PtsMapper);
4426 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
4427 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
4428 int idVTK = ugrid->GetPoints()->InsertNextPoint(x, y, z);
4429 //Mactor->AddNode( idnode, idVTK );
4430 ugrid->AddNode(idnode, idVTK);
4431 vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New();
4432 PtsMapper->SetInput(ugrid);
4433 Mactor->DataSource = PtsMapper->GetInput();
4434 Mactor->SetMapper(PtsMapper);
4436 QApplication::restoreOverrideCursor();
4439 //=============================================================================
4443 //=============================================================================
4444 void SMESHGUI::RemoveNode(SMESH_Actor * Mactor, int idnode)
4446 MESSAGE(" OLD RemoveNode method ")
4447 // int id = Mactor->GetIdVTKNode( idnode );
4448 // MESSAGE ( " RemoveNode id VTK " << id )
4449 // if ( Mactor->GetMapper() != NULL ) {
4450 // vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
4451 // vtkUnstructuredGrid* newUgrid = vtkUnstructuredGrid::New();
4452 // vtkPoints *Pts = ugrid->GetPoints();
4453 // vtkPoints *newPts = vtkPoints::New();
4454 // int nbPts = Pts->GetNumberOfPoints();
4455 // bool findPt = false;
4456 // for ( int i = 0; i < nbPts; i++ ) {
4459 // newPts->InsertPoint(i, Pts->GetPoint(i) );
4461 // newPts->InsertPoint(i-1, Pts->GetPoint(i) );
4464 // Mactor->RemoveNode( idnode );
4467 // newUgrid->SetPoints(newPts);
4468 // int nbCells = ugrid->GetNumberOfCells();
4469 // for ( int i = 0; i < nbCells; i++ ) {
4470 // vtkIdList *Ids = ugrid->GetCell(i)->GetPointIds();
4471 // vtkIdList *newIds = vtkIdList::New();
4472 // int nbIds = Ids->GetNumberOfIds();
4473 // newIds->SetNumberOfIds(nbIds);
4474 // for ( int j = 0; j < nbIds; j++ ) {
4475 // int theid = Ids->GetId(j);
4476 // if ( theid > id ) {
4477 // newIds->SetId( j, theid-1 );
4479 // newIds->SetId( j, theid );
4481 // int idSMDSel = Mactor->GetIdSMESHDSElement( i );
4482 // Mactor->RemoveElement( idSMDSel, false );
4483 // int idVTKel = newUgrid->InsertNextCell( ugrid->GetCell(i)->GetCellType(), newIds );
4484 // Mactor->AddElement( idSMDSel, idVTKel );
4486 // vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
4487 // Mapper->SetInput( newUgrid );
4488 // Mactor->DataSource = Mapper->GetInput();
4489 // Mactor->SetMapper(Mapper);
4494 //=============================================================================
4498 //=============================================================================
4499 void SMESHGUI::RemoveNodes(SMESH_Actor * Mactor, int number,
4500 const SMESH::double_array & coords, const SMESH::long_array & indexes)
4502 QApplication::setOverrideCursor(Qt::waitCursor);
4506 Mactor->RemoveNode(indexes[i - 1]);
4510 TColStd_DataMapOfIntegerInteger newMapVTKNodes;
4511 TColStd_DataMapOfIntegerInteger newMapSMESHDSNodes;
4512 TColStd_DataMapOfIntegerInteger MapOldNodesToNewNodes;
4514 if (Mactor->GetMapper() != NULL)
4516 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
4517 SMESH_Grid *newUgrid = SMESH_Grid::New();
4518 newUgrid->CopyMaps(ugrid);
4520 vtkPoints *Pts = ugrid->GetPoints();
4521 vtkPoints *newPts = vtkPoints::New();
4522 int nbPts = Pts->GetNumberOfPoints();
4524 for (int i = 0; i < nbPts; i++)
4526 int idSMESHDSNode = Mactor->GetIdSMESHDSNode(i);
4527 if (idSMESHDSNode != -1)
4529 newPts->InsertPoint(j, Pts->GetPoint(i));
4531 newMapVTKNodes.Bind(j, idSMESHDSNode);
4532 newMapSMESHDSNodes.Bind(idSMESHDSNode, j);
4534 MapOldNodesToNewNodes.Bind(i, j);
4539 newUgrid->SetIdsVTKNode(newMapVTKNodes);
4540 newUgrid->SetIdsSMESHDSNode(newMapSMESHDSNodes);
4541 newUgrid->SetPoints(newPts);
4543 TColStd_DataMapOfIntegerInteger newMapElementSMDStoVTK;
4544 TColStd_DataMapOfIntegerInteger newMapElementVTKtoSMDS;
4546 int nbCells = ugrid->GetNumberOfCells();
4547 for (int i = 0; i < nbCells; i++)
4549 vtkIdList *Ids = ugrid->GetCell(i)->GetPointIds();
4550 vtkIdList *newIds = vtkIdList::New();
4551 int nbIds = Ids->GetNumberOfIds();
4552 newIds->SetNumberOfIds(nbIds);
4554 for (int j = 0; j < nbIds; j++)
4556 int theid = Ids->GetId(j);
4557 if (MapOldNodesToNewNodes.IsBound(theid))
4559 newIds->SetId(j, MapOldNodesToNewNodes.Find(theid));
4568 // Filtering out cells based on non-existing nodes
4571 int idSMDSel = Mactor->GetIdSMESHDSElement(i);
4573 newUgrid->InsertNextCell(ugrid->GetCell(i)->GetCellType(),
4576 newMapElementSMDStoVTK.Bind(idSMDSel, idVTKel);
4577 newMapElementVTKtoSMDS.Bind(idVTKel, idSMDSel);
4581 newUgrid->SetIdsVTKElement(newMapElementVTKtoSMDS);
4582 newUgrid->SetIdsSMESHDSElement(newMapElementSMDStoVTK);
4584 // Copy new data to the old DatSource: keep the single DataSource for all actors
4585 ugrid->DeepCopy(newUgrid);
4587 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
4588 Mapper->SetInput(ugrid);
4589 Mactor->SetMapper(Mapper);
4591 // Commented to avoid multiple viewer updates when called by ReadScript()
4595 QApplication::restoreOverrideCursor();
4598 //=============================================================================
4602 //=============================================================================
4603 void SMESHGUI::RemoveNodes(SMESH::SMESH_Mesh_ptr aMesh,
4604 const TColStd_MapOfInteger & MapIndex)
4606 QApplication::setOverrideCursor(Qt::waitCursor);
4607 Standard_Boolean result;
4608 SMESH_Actor *ac = FindActor(aMesh, result, true);
4611 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
4612 anArrayOfIdeces->length(MapIndex.Extent());
4613 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
4615 for (; ite.More(); ite.Next())
4617 // MESSAGE ( " RemoveNode : id " << ac->GetIdSMESHDSNode(ite.Key()) )
4618 anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key());
4621 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
4622 aMeshEditor->RemoveNodes(anArrayOfIdeces);
4625 if (myAutomaticUpdate)
4627 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
4630 smeshGUI->DisplayActor(Mesh);
4631 smeshGUI->DisplayEdges(Mesh);
4632 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
4633 AddActorInSelection(Mesh);
4636 QApplication::restoreOverrideCursor();
4639 //=============================================================================
4643 //=============================================================================
4644 void SMESHGUI::RemoveElement(SMESH_Actor * Mactor, int idelement)
4646 MESSAGE(" OLD RemoveElement method ")
4647 // int id = Mactor->GetIdVTKElement( idelement );
4648 // MESSAGE ( " RemoveElement id VTK : " << id )
4649 // if ( Mactor->GetMapper() != NULL ) {
4650 // vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
4651 // vtkUnstructuredGrid* newUgrid = vtkUnstructuredGrid::New();
4652 // int nbCells = ugrid->GetNumberOfCells();
4653 // for ( int i = 0; i < nbCells; i++ ) {
4655 // newUgrid->InsertNextCell( ugrid->GetCell(i)->GetCellType(),
4656 // ugrid->GetCell(i)->GetPointIds() );
4658 // Mactor->RemoveElement( idelement );
4660 // newUgrid->SetPoints(ugrid->GetPoints());
4661 // vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
4662 // Mapper->SetInput( newUgrid );
4663 // Mactor->DataSource = Mapper->GetInput();
4664 // Mactor->SetMapper(Mapper);
4669 //=============================================================================
4673 //=============================================================================
4674 void SMESHGUI::RemoveElements(SMESH_Actor * Mactor, int number,
4675 const SMESH::double_array & coords, const SMESH::long_array & indexes)
4677 QApplication::setOverrideCursor(Qt::waitCursor);
4681 Mactor->RemoveElement(indexes[i - 1]);
4684 TColStd_DataMapOfIntegerInteger newMapElementSMDStoVTK;
4685 TColStd_DataMapOfIntegerInteger newMapElementVTKtoSMDS;
4687 if (Mactor->GetMapper() != NULL)
4689 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
4690 SMESH_Grid *newUgrid = SMESH_Grid::New();
4691 newUgrid->CopyMaps(ugrid);
4693 int nbCells = ugrid->GetNumberOfCells();
4694 for (int i = 0; i < nbCells; i++)
4696 int idSMESHDSElement = Mactor->GetIdSMESHDSElement(i);
4697 if (idSMESHDSElement != -1)
4700 newUgrid->InsertNextCell(ugrid->GetCell(i)->GetCellType(),
4701 ugrid->GetCell(i)->GetPointIds());
4702 newMapElementSMDStoVTK.Bind(idSMESHDSElement, newId);
4703 newMapElementVTKtoSMDS.Bind(newId, idSMESHDSElement);
4707 newUgrid->SetIdsVTKElement(newMapElementVTKtoSMDS);
4708 newUgrid->SetIdsSMESHDSElement(newMapElementSMDStoVTK);
4710 newUgrid->SetPoints(ugrid->GetPoints());
4712 // Copy new data to the old DatSource: keep the single DataSource for all actors
4713 ugrid->DeepCopy(newUgrid);
4715 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
4716 Mapper->SetInput(ugrid);
4717 Mactor->SetMapper(Mapper);
4719 // Commented to avoid multiple viewer updates when called by ReadScript()
4722 QApplication::restoreOverrideCursor();
4725 //=============================================================================
4729 //=============================================================================
4730 void SMESHGUI::RemoveElements(SMESH::SMESH_Mesh_ptr aMesh,
4731 const TColStd_MapOfInteger & MapIndex)
4733 QApplication::setOverrideCursor(Qt::waitCursor);
4734 Standard_Boolean result;
4735 SMESH_Actor *ac = FindActor(aMesh, result, true);
4738 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
4739 anArrayOfIdeces->length(MapIndex.Extent());
4740 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
4742 for (; ite.More(); ite.Next())
4744 // MESSAGE ( " RemoveElement : id " << ite.Key() << "," << ac->GetIdSMESHDSElement(ite.Key()) )
4745 anArrayOfIdeces[i] = ac->GetIdSMESHDSElement(ite.Key());
4749 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
4750 aMeshEditor->RemoveElements(anArrayOfIdeces);
4753 if (myAutomaticUpdate)
4755 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
4758 smeshGUI->DisplayActor(Mesh);
4759 smeshGUI->DisplayEdges(Mesh);
4760 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
4761 AddActorInSelection(Mesh);
4767 QApplication::restoreOverrideCursor();
4770 //=============================================================================
4774 //=============================================================================
4775 void SMESHGUI::OrientationElements(SMESH::SMESH_Mesh_ptr aMesh,
4776 const TColStd_MapOfInteger & MapIndex)
4778 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
4781 vtkRenderer *theRenderer =
4782 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
4783 getRightFrame()->getViewFrame())->getRenderer();
4784 Standard_Boolean result;
4785 SMESH_Actor *ac = FindActor(aMesh, result, true);
4788 //vtkUnstructuredGrid* UGrid = vtkUnstructuredGrid::New();
4789 SMESH_Grid *UGrid = SMESH_Grid::New();
4790 SMESH_Grid *oldGrid = SMESH_Grid::SafeDownCast(ac->DataSource);
4791 UGrid->CopyMaps(oldGrid);
4793 vtkGeometryFilter *gf = vtkGeometryFilter::New();
4794 gf->SetInput(ac->DataSource);
4796 vtkPolyDataMapper *Mapper = vtkPolyDataMapper::New();
4797 Mapper->SetInput(gf->GetOutput());
4800 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
4801 for (; ite.More(); ite.Next())
4803 Mapper->GetInput()->ReverseCell(ite.Key());
4806 UGrid->SetPoints(Mapper->GetInput()->GetPoints());
4807 int nbCells = Mapper->GetInput()->GetNumberOfCells();
4808 for (int i = 0; i < nbCells; i++)
4810 UGrid->InsertNextCell(Mapper->GetInput()->GetCellType(i),
4811 Mapper->GetInput()->GetCell(i)->GetPointIds());
4814 // Copy new data to the old DatSource: keep the single DataSource for all actors
4815 oldGrid->DeepCopy(UGrid);
4817 vtkDataSetMapper *NewMapper = vtkDataSetMapper::New();
4818 //NewMapper->SetInput( UGrid );
4819 NewMapper->SetInput(oldGrid);
4820 NewMapper->Update();
4822 //ac->DataSource = NewMapper->GetInput();
4823 ac->SetMapper(NewMapper);
4825 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
4827 QApplication::restoreOverrideCursor();
4830 //=============================================================================
4834 //=============================================================================
4835 void SMESHGUI::DiagonalInversion(SMESH::SMESH_Mesh_ptr aMesh,
4836 const TColStd_MapOfInteger & MapIndex)
4838 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
4841 QApplication::setOverrideCursor(Qt::waitCursor);
4842 vtkRenderer *theRenderer =
4843 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
4844 getRightFrame()->getViewFrame())->getRenderer();
4845 Standard_Boolean result;
4847 SMESH_Actor *ac = FindActor(aMesh, result, true);
4850 //vtkUnstructuredGrid* UGrid = vtkUnstructuredGrid::New();
4851 SMESH_Grid *UGrid = SMESH_Grid::New();
4852 vtkGeometryFilter *gf = vtkGeometryFilter::New();
4853 gf->SetInput(ac->DataSource);
4855 vtkExtractEdges *edges = vtkExtractEdges::New();
4856 edges->SetInput(ac->DataSource);
4858 vtkPolyDataMapper *Mapper = vtkPolyDataMapper::New();
4859 Mapper->SetInput(edges->GetOutput());
4862 int nb = Mapper->GetInput()->GetNumberOfCells();
4863 //MESSAGE ( "nb : " << nb )
4865 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
4866 for (; ite.More(); ite.Next())
4868 vtkCell *StartEdge = Mapper->GetInput()->GetCell(ite.Key());
4869 //MESSAGE( "DCQ : Edge Id = " << ite.Key())
4870 int CellType = StartEdge->GetCellType();
4871 //MESSAGE( "DCQ : Cell Type = " << CellType)
4872 int nbPoints = StartEdge->GetNumberOfPoints();
4874 //MESSAGE( "DCQ : Nb Point = " << nbPoints)
4877 vtkUnstructuredGrid *StartUGrid =
4878 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
4880 vtkIdList *IdCells = vtkIdList::New();
4881 vtkIdList *IdPoints = StartEdge->GetPointIds();
4885 Mapper->GetInput()->GetPoints()->GetPoint(IdPoints->GetId(0),
4887 Mapper->GetInput()->GetPoints()->GetPoint(IdPoints->GetId(1),
4890 int idp1 = StartUGrid->FindPoint(p1);
4891 int idp2 = StartUGrid->FindPoint(p2);
4893 StartUGrid->GetPointCells(idp1, IdCells);
4895 //MESSAGE ( " pt 0 : " << IdPoints->GetId(0) )
4896 //MESSAGE ( " pt 1 : " << IdPoints->GetId(1) )
4898 //MESSAGE ( " pt 0 : " << idp1 )
4899 //MESSAGE ( " pt 1 : " << idp2 )
4901 vtkIdList *IdPts = vtkIdList::New();
4902 if (IdCells->GetNumberOfIds() >= 2)
4904 int nbCells = IdCells->GetNumberOfIds();
4905 //MESSAGE ( " nbCells : " << nbCells )
4906 for (int j = 0; j < nbCells; j++)
4908 StartUGrid->GetCellPoints(IdCells->GetId(j), IdPts);
4909 if (IdPts->IsId(idp2) == -1)
4911 IdCells->DeleteId(IdCells->GetId(j));
4915 //MESSAGE ( " IdCells " << IdCells->GetNumberOfIds() )
4917 vtkIdList *IdPts0 = vtkIdList::New();
4918 vtkIdList *IdPts1 = vtkIdList::New();
4920 if (IdCells->GetNumberOfIds() == 2)
4922 StartUGrid->GetCellPoints(IdCells->GetId(0), IdPts0);
4923 StartUGrid->GetCellPoints(IdCells->GetId(1), IdPts1);
4926 TColStd_MapOfInteger EndMapIndex;
4927 for (int j = 0; j < 3; j++)
4929 if (IdPts0->GetId(j) != idp1 &&
4930 IdPts0->GetId(j) != idp2)
4932 EndMapIndex.Add(IdPts0->GetId(j));
4934 if (IdPts1->GetId(j) != idp1 &&
4935 IdPts1->GetId(j) != idp2)
4937 EndMapIndex.Add(IdPts1->GetId(j));
4941 bool MyAU = myAutomaticUpdate;
4942 myAutomaticUpdate = false;
4944 EndMapIndex.Add(idp1);
4945 TColStd_MapIteratorOfMapOfInteger ite1(EndMapIndex);
4949 if (ite1.Key() == idp1)
4954 bool reverse1 = (i == 2);
4955 this->AddFace(aMesh, EndMapIndex, reverse1);
4957 EndMapIndex.Remove(idp1);
4958 EndMapIndex.Add(idp2);
4959 TColStd_MapIteratorOfMapOfInteger ite2(EndMapIndex);
4963 if (ite2.Key() == idp2)
4968 bool reverse2 = (i == 2);
4969 this->AddFace(aMesh, EndMapIndex,
4970 !(reverse1 == reverse2));
4972 myAutomaticUpdate = MyAU;
4973 //MESSAGE ( " myAutomaticUpdate = " << MyAU )
4976 TColStd_MapOfInteger StartMapIndex;
4977 StartMapIndex.Add(IdCells->GetId(0));
4978 StartMapIndex.Add(IdCells->GetId(1));
4979 this->RemoveElements(aMesh, StartMapIndex);
4987 // UGrid->SetPoints( Mapper->GetInput()->GetPoints() );
4988 // int nbCells = Mapper->GetInput()->GetNumberOfCells();
4989 // for ( int i = 0; i < nbCells; i++ ) {
4990 // UGrid->InsertNextCell( Mapper->GetInput()->GetCellType(i), Mapper->GetInput()->GetCell(i)->GetPointIds() );
4993 // vtkDataSetMapper *NewMapper = vtkDataSetMapper::New();
4994 // NewMapper->SetInput( UGrid );
4995 // NewMapper->Update();
4997 // ac->DataSource = NewMapper->GetInput();
4998 // ac->SetMapper( NewMapper );
5000 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
5002 QApplication::restoreOverrideCursor();
5005 //=============================================================================
5009 //=============================================================================
5010 void SMESHGUI::AddEdges(SMESH_Actor * Mactor, int number,
5011 const SMESH::double_array & coords, const SMESH::long_array & indexes)
5013 QApplication::setOverrideCursor(Qt::waitCursor);
5014 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5015 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5020 vtkIdList *Ids = vtkIdList::New();
5021 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j]));
5022 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1]));
5023 int id = ugrid->InsertNextCell(VTK_LINE, Ids);
5024 Mactor->AddElement(indexes[j - 1], id);
5028 vtkDataSetMapper *EdgeMapper = vtkDataSetMapper::New();
5029 EdgeMapper->SetInput(ugrid);
5030 Mactor->DataSource = EdgeMapper->GetInput();
5031 Mactor->SetMapper(EdgeMapper);
5032 QApplication::restoreOverrideCursor();
5035 //=============================================================================
5039 //=============================================================================
5040 void SMESHGUI::AddEdge(SMESH_Actor * Mactor, int idedge, int idnode1,
5043 QApplication::setOverrideCursor(Qt::waitCursor);
5044 MESSAGE("SMESHGUI::AddEdge " << idedge << " : " << idnode1 << ";" <<
5045 idnode2) vtkIdList *Ids = vtkIdList::New();
5046 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1));
5047 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2));
5049 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5050 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5051 int id = ugrid->InsertNextCell(VTK_LINE, Ids);
5052 Mactor->AddElement(idedge, id);
5054 MESSAGE(" Edge VTK id " << id)
5055 vtkDataSetMapper *EdgeMapper = vtkDataSetMapper::New();
5056 EdgeMapper->SetInput(ugrid);
5057 Mactor->DataSource = EdgeMapper->GetInput();
5058 Mactor->SetMapper(EdgeMapper);
5059 QApplication::restoreOverrideCursor();
5062 //=============================================================================
5066 //=============================================================================
5067 void SMESHGUI::AddTriangles(SMESH_Actor * Mactor, int number,
5068 const SMESH::double_array & coords, const SMESH::long_array & indexes)
5070 QApplication::setOverrideCursor(Qt::waitCursor);
5071 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5072 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5077 vtkIdList *Ids = vtkIdList::New();
5078 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j]));
5079 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1]));
5080 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2]));
5081 int id = ugrid->InsertNextCell(VTK_TRIANGLE, Ids);
5082 Mactor->AddElement(indexes[j - 1], id);
5086 vtkDataSetMapper *TriMapper = vtkDataSetMapper::New();
5087 TriMapper->SetInput(ugrid);
5088 Mactor->DataSource = TriMapper->GetInput();
5089 Mactor->SetMapper(TriMapper);
5090 QApplication::restoreOverrideCursor();
5092 void SMESHGUI::AddTriangle(SMESH_Actor * Mactor, int idtri, int idnode1,
5093 int idnode2, int idnode3)
5095 QApplication::setOverrideCursor(Qt::waitCursor);
5096 vtkIdList *Ids = vtkIdList::New();
5097 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1));
5098 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2));
5099 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3));
5101 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5102 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5103 int id = ugrid->InsertNextCell(VTK_TRIANGLE, Ids);
5104 Mactor->AddElement(idtri, id);
5106 vtkDataSetMapper *TriMapper = vtkDataSetMapper::New();
5107 TriMapper->SetInput(ugrid);
5108 Mactor->DataSource = TriMapper->GetInput();
5109 Mactor->SetMapper(TriMapper);
5110 QApplication::restoreOverrideCursor();
5113 //=============================================================================
5117 //=============================================================================
5118 void SMESHGUI::AddQuadrangles(SMESH_Actor * Mactor, int number,
5119 const SMESH::double_array & coords, const SMESH::long_array & indexes)
5121 QApplication::setOverrideCursor(Qt::waitCursor);
5122 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5123 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5128 vtkIdList *Ids = vtkIdList::New();
5129 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j]));
5130 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1]));
5131 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2]));
5132 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3]));
5133 int id = ugrid->InsertNextCell(VTK_QUAD, Ids);
5134 Mactor->AddElement(indexes[j - 1], id);
5138 vtkDataSetMapper *QuadMapper = vtkDataSetMapper::New();
5139 QuadMapper->SetInput(ugrid);
5140 Mactor->DataSource = QuadMapper->GetInput();
5141 Mactor->SetMapper(QuadMapper);
5142 QApplication::restoreOverrideCursor();
5145 //=============================================================================
5149 //=============================================================================
5150 void SMESHGUI::AddQuadrangle(SMESH_Actor * Mactor, int idquad, int idnode1,
5151 int idnode2, int idnode3, int idnode4)
5153 QApplication::setOverrideCursor(Qt::waitCursor);
5154 vtkIdList *Ids = vtkIdList::New();
5155 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1));
5156 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2));
5157 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3));
5158 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4));
5160 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5161 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5162 int id = ugrid->InsertNextCell(VTK_QUAD, Ids);
5163 Mactor->AddElement(idquad, id);
5165 vtkDataSetMapper *QuadMapper = vtkDataSetMapper::New();
5166 QuadMapper->SetInput(ugrid);
5167 Mactor->DataSource = QuadMapper->GetInput();
5168 Mactor->SetMapper(QuadMapper);
5169 QApplication::restoreOverrideCursor();
5172 //=============================================================================
5176 //=============================================================================
5177 void SMESHGUI::AddTetras(SMESH_Actor * Mactor, int number,
5178 const SMESH::double_array & coords, const SMESH::long_array & indexes)
5180 QApplication::setOverrideCursor(Qt::waitCursor);
5181 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5182 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5187 vtkIdList *Ids = vtkIdList::New();
5188 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j]));
5189 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1]));
5190 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2]));
5191 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3]));
5192 int id = ugrid->InsertNextCell(VTK_TETRA, Ids);
5193 Mactor->AddElement(indexes[j - 1], id);
5197 vtkDataSetMapper *TetraMapper = vtkDataSetMapper::New();
5198 TetraMapper->SetInput(ugrid);
5199 Mactor->DataSource = TetraMapper->GetInput();
5200 Mactor->SetMapper(TetraMapper);
5201 QApplication::restoreOverrideCursor();
5204 //=============================================================================
5208 //=============================================================================
5209 void SMESHGUI::AddTetra(SMESH_Actor * Mactor, int idtetra, int idnode1,
5210 int idnode2, int idnode3, int idnode4)
5212 QApplication::setOverrideCursor(Qt::waitCursor);
5213 MESSAGE("SMESHGUI::AddTetra " << idtetra << " : " << idnode1 << ";" <<
5214 idnode2 << ";" << idnode3 << ";" << idnode4) vtkIdList *Ids =
5216 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1));
5217 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2));
5218 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3));
5219 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4));
5221 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5222 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5223 int id = ugrid->InsertNextCell(VTK_TETRA, Ids);
5224 Mactor->AddElement(idtetra, id);
5226 MESSAGE(" Tetra VTK id " << id)
5227 vtkDataSetMapper *TetraMapper = vtkDataSetMapper::New();
5228 TetraMapper->SetInput(ugrid);
5229 Mactor->DataSource = TetraMapper->GetInput();
5230 Mactor->SetMapper(TetraMapper);
5231 QApplication::restoreOverrideCursor();
5234 //=============================================================================
5238 //=============================================================================
5239 void SMESHGUI::AddHexaedres(SMESH_Actor * Mactor, int number,
5240 const SMESH::double_array & coords, const SMESH::long_array & indexes)
5242 QApplication::setOverrideCursor(Qt::waitCursor);
5243 //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5244 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5249 vtkIdList *Ids = vtkIdList::New();
5250 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j]));
5251 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1]));
5252 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2]));
5253 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3]));
5254 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 4]));
5255 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 5]));
5256 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 6]));
5257 Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 7]));
5258 int id = ugrid->InsertNextCell(VTK_HEXAHEDRON, Ids);
5259 Mactor->AddElement(indexes[j - 1], id);
5263 vtkDataSetMapper *HexaMapper = vtkDataSetMapper::New();
5264 HexaMapper->SetInput(ugrid);
5265 Mactor->DataSource = HexaMapper->GetInput();
5266 Mactor->SetMapper(HexaMapper);
5267 QApplication::restoreOverrideCursor();
5270 //=============================================================================
5274 //=============================================================================
5275 void SMESHGUI::AddHexaedre(SMESH_Actor * Mactor, int idhexa, int idnode1,
5276 int idnode2, int idnode3, int idnode4, int idnode5, int idnode6,
5277 int idnode7, int idnode8)
5279 QApplication::setOverrideCursor(Qt::waitCursor);
5280 MESSAGE("SMESHGUI::AddHexaedre " << idhexa << " : " << idnode1 << ";" <<
5281 idnode2 << ";" << idnode3 << ";" << idnode4 << ";" << idnode5 << ";" <<
5282 idnode6 << ";" << idnode7 << ";" << idnode8) vtkIdList *Ids =
5284 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1));
5285 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2));
5286 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3));
5287 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4));
5288 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode5));
5289 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode6));
5290 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode7));
5291 Ids->InsertNextId(Mactor->GetIdVTKNode(idnode8));
5293 //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource );
5294 SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource);
5295 int id = ugrid->InsertNextCell(VTK_HEXAHEDRON, Ids);
5296 Mactor->AddElement(idhexa, id);
5298 MESSAGE(" Hexa VTK id " << id)
5299 vtkDataSetMapper *HexaMapper = vtkDataSetMapper::New();
5300 HexaMapper->SetInput(ugrid);
5301 Mactor->DataSource = HexaMapper->GetInput();
5302 Mactor->SetMapper(HexaMapper);
5303 QApplication::restoreOverrideCursor();
5306 //=====================================================================================
5308 //=====================================================================================
5311 bool OnGUIEvent(int theCommandID, QAD_Desktop * parent)
5313 return SMESHGUI::OnGUIEvent(theCommandID, parent);
5316 bool OnKeyPress(QKeyEvent * pe, QAD_Desktop * parent,
5317 QAD_StudyFrame * studyFrame)
5319 return SMESHGUI::OnKeyPress(pe, parent, studyFrame);
5322 bool OnMousePress(QMouseEvent * pe, QAD_Desktop * parent,
5323 QAD_StudyFrame * studyFrame)
5325 return SMESHGUI::OnMousePress(pe, parent, studyFrame);
5328 bool OnMouseMove(QMouseEvent * pe, QAD_Desktop * parent,
5329 QAD_StudyFrame * studyFrame)
5331 return SMESHGUI::OnMouseMove(pe, parent, studyFrame);
5334 bool SetSettings(QAD_Desktop * parent)
5336 return SMESHGUI::SetSettings(parent);
5339 bool customPopup(QAD_Desktop * parent, QPopupMenu * popup,
5340 const QString & theContext, const QString & theParent,
5341 const QString & theObject)
5343 return SMESHGUI::CustomPopup(parent, popup, theContext, theParent,
5347 void definePopup(QString & theContext, QString & theParent,
5348 QString & theObject)
5350 SMESHGUI::DefinePopup(theContext, theParent, theObject);
5353 bool activeStudyChanged(QAD_Desktop * parent)
5355 SMESHGUI::activeStudyChanged(parent);
5358 void buildPresentation(const Handle(SALOME_InteractiveObject) & theIO)
5360 SMESHGUI::BuildPresentation(theIO);
5363 void supportedViewType(int *buffer, int bufferSize)
5365 if (!buffer || !bufferSize)
5367 buffer[0] = (int)VIEW_VTK;
5372 //=============================================================================
5376 //=============================================================================
5377 void SMESHGUI::ViewNodes()
5379 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
5382 EraseSimulationActors();
5383 mySimulationActors = vtkActorCollection::New();
5384 vtkRenderer *theRenderer =
5385 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
5386 getRightFrame()->getViewFrame())->getRenderer();
5387 vtkActorCollection *theActors = theRenderer->GetActors();
5388 theActors->InitTraversal();
5389 vtkActor *ac = theActors->GetNextActor();
5390 while (!(ac == NULL))
5392 if (ac->IsA("SMESH_Actor"))
5394 SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac);
5395 if (anActor->GetVisibility() == 1)
5397 vtkGeometryFilter *gf = vtkGeometryFilter::New();
5398 gf->SetInput(anActor->DataSource);
5399 vtkMaskPoints *verts = vtkMaskPoints::New();
5400 verts->SetInput(gf->GetOutput());
5401 verts->GenerateVerticesOn();
5402 verts->SetOnRatio(1);
5404 vtkPolyDataMapper *vertMapper = vtkPolyDataMapper::New();
5405 vertMapper->SetInput(verts->GetOutput());
5406 vertMapper->ScalarVisibilityOff();
5408 vtkActor *vertActor = vtkActor::New();
5409 vertActor->SetMapper(vertMapper);
5412 anActor->GetNodeColor(r, g, b);
5413 vertActor->GetProperty()->SetColor(r, g, b);
5415 vertActor->GetProperty()->SetPointSize(anActor->GetNodeSize());
5417 vertActor->PickableOff();
5419 mySimulationActors->AddItem(vertActor);
5420 theRenderer->AddActor(vertActor);
5423 ac = theActors->GetNextActor();
5426 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
5430 //=============================================================================
5434 //=============================================================================
5435 void SMESHGUI::Control(int theCommandID)
5437 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
5440 QApplication::setOverrideCursor(Qt::waitCursor);
5441 DisplayScalarBar(false);
5443 vtkDoubleArray *scalars = vtkDoubleArray::New();
5444 scalars->SetNumberOfComponents(1);
5446 vtkDataSetMapper *meshMapper = 0;
5447 SALOME_Selection *Sel =
5448 SALOME_Selection::Selection(myActiveStudy->getSelection());
5449 int nbSel = Sel->IObjectCount();
5450 Standard_Boolean result;
5451 Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
5452 SMESH_Actor *MeshActor =
5453 FindActorByEntry(IObject->getEntry(), result, true);
5455 // Mesh may be not updated after Compute
5456 if (!MeshActor->DataSource || !MeshActor->GetMapper())
5458 QApplication::restoreOverrideCursor();
5462 vtkDataSet *aDataSet = MeshActor->DataSource;
5463 typedef double (*TScalarFun) (vtkCell * theCell);
5464 TScalarFun aScalarFun;
5468 switch (theCommandID)
5472 type = tr("SMESH_CONTROL_LENGTH_EDGES");
5473 aDataSet = MeshActor->EdgeDevice->GetMapper()->GetInput();
5474 aScalarFun = &(SMESHGUI_ComputeScalarValue::LengthEdges);
5475 MESSAGE(" init minimum length " << aDataSet->GetNumberOfCells());
5476 if (MeshActor->getDisplayMode() != 0)
5477 ChangeRepresentation(MeshActor, 1); // limitation; in Wireframe, colored edges are not visible
5482 type = tr("SMESH_CONTROL_AREA_ELEMENTS");
5483 aScalarFun = &(SMESHGUI_ComputeScalarValue::AreaElements);
5484 if (MeshActor->getDisplayMode() != 1)
5485 ChangeRepresentation(MeshActor, 1);
5490 type = tr("SMESH_CONTROL_TAPER_ELEMENTS");
5491 aScalarFun = &(SMESHGUI_ComputeScalarValue::Taper);
5496 type = tr("SMESH_CONTROL_ASPECTRATIO_ELEMENTS");
5497 aScalarFun = &(SMESHGUI_ComputeScalarValue::AspectRatio);
5498 if (MeshActor->getDisplayMode() != 1)
5499 ChangeRepresentation(MeshActor, 1);
5504 type = tr("SMESH_CONTROL_MINIMUMANGLE_ELEMENTS");
5505 aScalarFun = &(SMESHGUI_ComputeScalarValue::MinimumAngle);
5506 if (MeshActor->getDisplayMode() != 1)
5507 ChangeRepresentation(MeshActor, 1);
5512 type = tr("SMESH_CONTROL_WARP_ELEMENTS");
5513 aScalarFun = &(SMESHGUI_ComputeScalarValue::Warp);
5518 type = tr("SMESH_CONTROL_SKEW_ELEMENTS");
5519 aScalarFun = &(SMESHGUI_ComputeScalarValue::Skew);
5524 for (int i = 0, iEnd = aDataSet->GetNumberOfCells(); i < iEnd; i++)
5525 scalars->InsertTuple1(i, aScalarFun(aDataSet->GetCell(i)));
5528 scalars->GetRange(range);
5530 vtkLookupTable *wat = vtkLookupTable::New();
5531 wat->SetRange(range);
5534 scalars->SetLookupTable(wat);
5537 meshMapper = (vtkDataSetMapper *) (MeshActor->getMapper());
5538 meshMapper->SetScalarModeToUseCellData();
5539 MeshActor->DataSource->GetCellData()->SetScalars(scalars);
5540 meshMapper->SetScalarRange(range);
5541 meshMapper->ScalarVisibilityOn();
5543 vtkScalarBarActor *aScalarBar = GetScalarBar();
5544 if (aScalarBar == NULL)
5546 aScalarBar = vtkScalarBarActor::New();
5547 QString Bold = QAD_CONFIG->getSetting("ScalarBar:Bold");
5548 QString Italic = QAD_CONFIG->getSetting("ScalarBar:Italic");
5549 QString Shadow = QAD_CONFIG->getSetting("ScalarBar:Shadow");
5550 QString FontFamily = QAD_CONFIG->getSetting("ScalarBar:FontFamily");
5551 QString Orientation =
5552 QAD_CONFIG->getSetting("ScalarBar:Orientation");
5553 float Width = QAD_CONFIG->getSetting("ScalarBar:Width").toFloat();
5554 float Height = QAD_CONFIG->getSetting("ScalarBar:Height").toFloat();
5555 int NumberOfLabels =
5556 QAD_CONFIG->getSetting("ScalarBar:NumberOfLabels").toInt();
5557 int NumberOfColors =
5558 QAD_CONFIG->getSetting("ScalarBar:NumberOfColors").toInt();
5560 SetSettingsScalarBar(aScalarBar, Bold, Italic, Shadow, FontFamily,
5561 Orientation, Width, Height, NumberOfColors, NumberOfLabels);
5562 vtkRenderer *theRenderer =
5563 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
5564 getRightFrame()->getViewFrame())->getRenderer();
5565 theRenderer->AddActor2D(aScalarBar);
5567 aScalarBar->SetLookupTable(wat);
5568 aScalarBar->SetTitle(type.latin1());
5572 DisplayScalarBar(true);
5574 QApplication::restoreOverrideCursor();
5577 //=============================================================================
5581 //=============================================================================
5582 void SMESHGUI::SetSettingsScalarBar(vtkScalarBarActor * theScalarBar,
5583 QString Bold, QString Italic,
5584 QString Shadow, QString FontFamily,
5585 QString Orientation, float Width, float Height, int NbColors, int NbLabels)
5587 if (Bold.isNull() || Bold.isEmpty() || (Bold.compare("true") == 0))
5588 theScalarBar->BoldOn();
5590 theScalarBar->BoldOff();
5592 if (Italic.isNull() || Italic.isEmpty() || (Italic.compare("true") == 0))
5593 theScalarBar->ItalicOn();
5595 theScalarBar->ItalicOff();
5597 if (Shadow.isNull() || Shadow.isEmpty() || (Shadow.compare("true") == 0))
5598 theScalarBar->ShadowOn();
5600 theScalarBar->ShadowOff();
5602 if (FontFamily.compare("Arial") == 0)
5603 theScalarBar->SetFontFamilyToArial();
5604 else if (FontFamily.compare("Courier") == 0)
5605 theScalarBar->SetFontFamilyToCourier();
5606 else if (FontFamily.compare("Times") == 0)
5607 theScalarBar->SetFontFamilyToTimes();
5609 theScalarBar->SetFontFamilyToArial();
5611 if (Orientation.isNull() || Orientation.isEmpty() ||
5612 (Orientation.compare("Vertical") == 0))
5613 theScalarBar->SetOrientationToVertical();
5615 theScalarBar->SetOrientationToHorizontal();
5617 theScalarBar->SetWidth((Width == 0) ? 0.17 : Width);
5618 theScalarBar->SetHeight((Height == 0) ? 0.8 : Height);
5620 theScalarBar->SetNumberOfLabels((NbLabels == 0) ? 5 : NbLabels);
5621 theScalarBar->SetMaximumNumberOfColors((NbColors == 0) ? 64 : NbColors);
5624 //=============================================================================
5628 //=============================================================================
5629 void SMESHGUI::DisplayScalarBar(bool visibility)
5631 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
5634 vtkRenderer *theRenderer =
5635 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
5636 getRightFrame()->getViewFrame())->getRenderer();
5637 vtkScalarBarActor *aScalarBar = GetScalarBar();
5639 if (aScalarBar == NULL)
5641 MESSAGE("myScalarBar is NULL");
5646 aScalarBar->VisibilityOn();
5649 aScalarBar->VisibilityOff();
5650 //Turn off mesh coloring (influences on all views)
5651 vtkActorCollection *actorList = theRenderer->GetActors();
5652 actorList->InitTraversal();
5653 vtkActor *ac = actorList->GetNextActor();
5656 if (ac->GetMapper() != NULL)
5658 ac->GetMapper()->ScalarVisibilityOff();
5660 ac = actorList->GetNextActor();
5662 // Turn off ScalarBar in all views
5663 /*QList<QAD_StudyFrame> aFrames = myActiveStudy->getStudyFrames();
5664 * for ( QAD_StudyFrame* aFrame = aFrames.first(); aFrame; aFrame = aFrames.next() ) {
5665 * if (aFrame->getTypeView() == VIEW_VTK) {
5666 * vtkRenderer *aRenderer = ((VTKViewer_ViewFrame*) aFrame->getRightFrame()->getViewFrame())->getRenderer();
5667 * vtkActor2DCollection* actor2DList = aRenderer->GetActors2D();
5668 * actor2DList->InitTraversal();
5669 * vtkActor2D* aActor2d = actor2DList->GetNextActor2D();
5670 * while (aActor2d != NULL) {
5671 * if (aActor2d->IsA("vtkScalarBarActor")) {
5672 * aActor2d->VisibilityOff();
5675 * actor2DList->GetNextActor2D();
5680 myActiveStudy->update3dViewers();
5683 //=============================================================================
5687 //=============================================================================
5688 void SMESHGUI::UpdateScalarBar(float MinRange, float MaxRange)
5690 vtkScalarBarActor *aScalarBar = GetScalarBar();
5691 if (aScalarBar == NULL)
5693 MESSAGE("myScalarBar is NULL");
5696 DisplayScalarBar(false);
5698 aScalarBar->GetLookupTable()->SetRange(MinRange, MaxRange);
5699 vtkRenderer *aRenderer =
5700 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
5701 getRightFrame()->getViewFrame())->getRenderer();
5702 vtkActorCollection *aActorList = aRenderer->GetActors();
5703 aActorList->InitTraversal();
5704 vtkActor *aActor = aActorList->GetNextActor();
5705 while (aActor != NULL)
5707 if (aActor->IsA("SMESH_Actor"))
5709 SMESH_Actor *aMeshActor = SMESH_Actor::SafeDownCast(aActor);
5710 vtkDataSetMapper *aMeshMapper =
5711 (vtkDataSetMapper *) (aMeshActor->getMapper());
5712 if ((aMeshMapper != NULL))
5714 aMeshMapper->SetScalarRange(MinRange, MaxRange);
5715 aMeshMapper->ScalarVisibilityOn();
5718 aActor = aActorList->GetNextActor();
5720 DisplayScalarBar(true);
5723 //=============================================================================
5727 //=============================================================================
5728 void SMESHGUI::SetDisplaySettings()
5730 EmitSignalDeactivateDialog();
5731 SMESHGUI_Preferences_ColorDlg *aDlg =
5732 new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(), "");
5734 QString SCr = QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed");
5735 QString SCg = QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen");
5736 QString SCb = QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue");
5737 QColor color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
5738 aDlg->SetColor(1, color);
5740 SCr = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed");
5741 SCg = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen");
5742 SCb = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue");
5743 color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
5744 aDlg->SetColor(2, color);
5746 SCr = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorRed");
5747 SCg = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorGreen");
5748 SCb = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorBlue");
5749 color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
5750 aDlg->SetColor(3, color);
5752 QString SBr = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorRed");
5753 QString SBg = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen");
5754 QString SBb = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue");
5755 color = QColor(SBr.toInt(), SBg.toInt(), SBb.toInt());
5756 aDlg->SetColor(4, color);
5758 QString intValue = QAD_CONFIG->getSetting("SMESH:SettingsWidth");
5759 aDlg->SetIntValue(1, intValue.toInt());
5760 intValue = QAD_CONFIG->getSetting("SMESH:SettingsNodesSize");
5761 aDlg->SetIntValue(2, intValue.toInt());
5762 intValue = QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff");
5763 aDlg->SetIntValue(3, intValue.toInt());
5767 QColor colorFill = aDlg->GetColor(1);
5768 QAD_CONFIG->addSetting("SMESH:SettingsFillColorRed", colorFill.red());
5769 QAD_CONFIG->addSetting("SMESH:SettingsFillColorGreen",
5771 QAD_CONFIG->addSetting("SMESH:SettingsFillColorBlue", colorFill.blue());
5773 QColor colorOutline = aDlg->GetColor(2);
5774 QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorRed",
5775 colorOutline.red());
5776 QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorGreen",
5777 colorOutline.green());
5778 QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorBlue",
5779 colorOutline.blue());
5781 QColor colorNode = aDlg->GetColor(3);
5782 QAD_CONFIG->addSetting("SMESH:SettingsNodeColorRed", colorNode.red());
5783 QAD_CONFIG->addSetting("SMESH:SettingsNodeColorGreen",
5785 QAD_CONFIG->addSetting("SMESH:SettingsNodeColorBlue", colorNode.blue());
5787 QColor colorBackFace = aDlg->GetColor(4);
5788 QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorRed",
5789 colorBackFace.red());
5790 QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorGreen",
5791 colorBackFace.green());
5792 QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorBlue",
5793 colorBackFace.blue());
5795 int width = aDlg->GetIntValue(1);
5796 QAD_CONFIG->addSetting("SMESH:SettingsWidth", width);
5798 int nodes_size = aDlg->GetIntValue(2);
5799 QAD_CONFIG->addSetting("SMESH:SettingsNodesSize", nodes_size);
5801 int shrink_coeff = aDlg->GetIntValue(3);
5802 QAD_CONFIG->addSetting("SMESH:SettingsShrinkCoeff", shrink_coeff);
5808 //=======================================================================
5809 // function : Parameter()
5810 // purpose : return a parameter (double) from a dialog box
5812 // aValue : is a double used as a default value displayed
5813 // aLabel : is the title for aValue1
5814 // aTitle : is the main title
5815 // bottom : maximum value to be entered
5816 // top : minimum value to be entered
5817 // decimals : number of decimals
5818 //=======================================================================
5819 double SMESHGUI::Parameter(Standard_Boolean & res,
5820 const double aValue,
5823 const double bottom, const double top, const int decimals)
5825 SMESHGUI_aParameterDlg *Dialog =
5826 new SMESHGUI_aParameterDlg(QAD_Application::getDesktop(),
5829 bottom, top, decimals,
5831 Dialog->setValue(aValue);
5833 res = (Dialog->exec() == QDialog::Accepted);
5835 X = Dialog->getDblValue();
5839 //=======================================================================
5840 // function : Parameter()
5841 // purpose : return a parameter (int) from a dialog box
5843 // aValue : is a int used as a default value displayed
5844 // aLabel : is the title for aValue1
5845 // aTitle : is the main title
5846 // bottom : maximum value to be entered
5847 // top : minimum value to be entered
5848 //=======================================================================
5849 int SMESHGUI::Parameter(Standard_Boolean & res,
5851 const char *aLabel, const char *aTitle, const int bottom, const int top)
5853 SMESHGUI_aParameterDlg *Dialog =
5854 new SMESHGUI_aParameterDlg(QAD_Application::getDesktop(),
5859 Dialog->setValue(aValue);
5861 res = (Dialog->exec() == QDialog::Accepted);
5863 X = Dialog->getIntValue();
5867 //=============================================================================
5871 //=============================================================================
5872 void SMESHGUI::DisplayEdges(SMESH_Actor * ac, bool visibility)
5874 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
5876 if (ac->DataSource == NULL || ac->GetMapper() == NULL)
5879 vtkGeometryFilter *gf = vtkGeometryFilter::New();
5880 gf->SetInput(ac->DataSource);
5881 vtkFeatureEdges *edges = vtkFeatureEdges::New();
5882 edges->SetInput(gf->GetOutput());
5883 edges->BoundaryEdgesOn();
5884 edges->ManifoldEdgesOn();
5886 vtkPolyDataMapper *edgeMapper = vtkPolyDataMapper::New();
5887 edgeMapper->SetInput(edges->GetOutput());
5888 edgeMapper->ScalarVisibilityOff();
5890 vtkRenderer *theRenderer =
5891 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
5892 getRightFrame()->getViewFrame())->getRenderer();
5893 vtkActorCollection *actorList = theRenderer->GetActors();
5895 int test = actorList->IsItemPresent(ac->EdgeDevice);
5898 vtkProperty *prop = vtkProperty::New();
5899 prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed").
5901 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen").
5903 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() /
5905 prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize").
5907 prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth").
5909 ac->EdgeDevice->SetProperty(prop);
5910 ac->SetEdgeColor(QAD_CONFIG->
5911 getSetting("SMESH:SettingsOutlineColorRed").toFloat() / 255.,
5912 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen").
5914 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() /
5916 ac->EdgeDevice->SetMapper(edgeMapper);
5918 theRenderer->AddActor(ac->EdgeDevice);
5922 ac->EdgeDevice->SetMapper(edgeMapper);
5923 edgeMapper->Update();
5926 vtkShrinkFilter *shrink = vtkShrinkFilter::New();
5927 shrink->SetInput(ac->DataSource);
5928 shrink->SetShrinkFactor(ac->GetShrinkFactor());
5929 vtkGeometryFilter *Shrinkgf = vtkGeometryFilter::New();
5930 Shrinkgf->SetInput(shrink->GetOutput());
5931 vtkFeatureEdges *ShrinkEdges = vtkFeatureEdges::New();
5932 ShrinkEdges->SetInput(Shrinkgf->GetOutput());
5933 ShrinkEdges->BoundaryEdgesOn();
5934 ShrinkEdges->ManifoldEdgesOn();
5936 vtkPolyDataMapper *ShrinkEdgeMapper = vtkPolyDataMapper::New();
5937 ShrinkEdgeMapper->SetInput(ShrinkEdges->GetOutput());
5938 ShrinkEdgeMapper->ScalarVisibilityOff();
5940 test = actorList->IsItemPresent(ac->EdgeShrinkDevice);
5943 vtkProperty *prop = vtkProperty::New();
5944 prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed").
5946 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen").
5948 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() /
5950 prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize").
5952 prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth").
5954 ac->EdgeShrinkDevice->SetProperty(prop);
5955 ac->SetEdgeColor(QAD_CONFIG->
5956 getSetting("SMESH:SettingsOutlineColorRed").toFloat() / 255.,
5957 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen").
5959 QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() /
5961 ac->EdgeShrinkDevice->SetMapper(ShrinkEdgeMapper);
5963 theRenderer->AddActor(ac->EdgeShrinkDevice);
5967 ac->EdgeShrinkDevice->SetMapper(ShrinkEdgeMapper);
5968 ShrinkEdgeMapper->Update();
5971 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
5975 //=============================================================================
5979 //=============================================================================
5980 void SMESHGUI::InitActor(SMESH::SMESH_Mesh_ptr aMesh)
5982 SALOMEDS::SObject_var aSO_M = myStudyAPI.FindMesh(aMesh);
5983 SALOMEDS::GenericAttribute_var anAttr;
5984 SALOMEDS::AttributeName_var aName;
5985 if (!aSO_M->_is_nil())
5987 if (aSO_M->FindAttribute(anAttr, "AttributeName"))
5989 aName = SALOMEDS::AttributeName::_narrow(anAttr);
5990 Standard_Boolean result;
5991 SMESH_Actor *MeshActor =
5992 smeshGUI->FindActorByEntry(aSO_M->GetID(), result, true);
5995 SMESH_Actor *amesh = SMESH_Actor::New();
5996 Handle(SALOME_InteractiveObject) IO =
5997 new SALOME_InteractiveObject(aSO_M->GetID(), "MESH",
6000 amesh->setName(aName->Value());
6001 DisplayActor(amesh, false);
6007 //=============================================================================
6011 //=============================================================================
6012 void SMESHGUI::Update()
6014 if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK)
6016 vtkRenderer *theRenderer =
6017 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6018 getRightFrame()->getViewFrame())->getRenderer();
6020 SALOME_Selection *Sel =
6021 SALOME_Selection::Selection(myActiveStudy->getSelection());
6022 int nbSel = Sel->IObjectCount();
6025 vtkActorCollection *actorList = theRenderer->GetActors();
6026 actorList->InitTraversal();
6027 vtkActor *ac = actorList->GetNextActor();
6028 while (!(ac == NULL))
6030 if (ac->IsA("SMESH_Actor"))
6032 SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac);
6033 if (anActor->hasIO())
6035 Handle(SALOME_InteractiveObject) IO = anActor->getIO();
6039 ac = actorList->GetNextActor();
6044 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
6045 for (; It.More(); It.Next())
6047 Handle(SALOME_InteractiveObject) IO = It.Value();
6051 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6054 QApplication::restoreOverrideCursor();
6057 //=============================================================================
6061 //=============================================================================
6062 void SMESHGUI::Update(const Handle(SALOME_InteractiveObject) & IO)
6064 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6069 Standard_Boolean res;
6070 SMESH::SMESH_Mesh_var aMesh = ConvertIOinMesh(IO, res);
6073 SMESH_Actor *ac = FindActorByEntry(IO->getEntry(), res, false);
6076 // Check whether the actor belongs to the active view
6077 VTKViewer_RenderWindowInteractor *rwInter =
6078 ((VTKViewer_ViewFrame *) myActiveStudy->
6079 getActiveStudyFrame()->getRightFrame()->getViewFrame())->
6082 ac = ReadScript(aMesh);
6083 // The actor belongs to inactive view -> create a copy and display it in the active view
6084 if (!rwInter->isInViewer(IO))
6086 SMESH_Actor *acCopy = SMESH_Actor::New();
6087 acCopy->ShallowCopy(ac);
6098 smeshGUI->ChangeRepresentation(ac, ac->getDisplayMode());
6105 //=============================================================================
6109 //=============================================================================
6110 vtkActor *SMESHGUI::SimulationMoveNode(SMESH_Actor * Mactor, int idnode)
6112 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6115 mySimulationActors = vtkActorCollection::New();
6116 vtkRenderer *theRenderer =
6117 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6118 getRightFrame()->getViewFrame())->getRenderer();
6120 vtkUnstructuredGrid *ugrid =
6121 vtkUnstructuredGrid::SafeDownCast(Mactor->DataSource);
6122 vtkIdList *IdCells = vtkIdList::New();
6123 ugrid->GetPointCells(idnode, IdCells);
6125 vtkPoints *Pts = vtkPoints::New();
6126 Pts = ugrid->GetPoints();
6128 vtkUnstructuredGrid *ugridSimulation = vtkUnstructuredGrid::New();
6129 ugridSimulation->SetPoints(Pts);
6130 vtkIdList *IdPts = vtkIdList::New();
6131 for (int j = 0; j < IdCells->GetNumberOfIds(); j++)
6133 ugrid->GetCellPoints(IdCells->GetId(j), IdPts);
6134 ugridSimulation->InsertNextCell(ugrid->GetCellType(IdCells->GetId(j)),
6138 vtkProperty *prop = vtkProperty::New();
6139 prop->SetColor(1., 0., 0.);
6140 prop->SetRepresentationToWireframe();
6142 int Edgewidth = (int)Mactor->EdgeDevice->GetProperty()->GetLineWidth();
6145 prop->SetLineWidth(Edgewidth + 1);
6147 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6148 Mapper->SetInput(ugridSimulation);
6149 vtkActor *ac = vtkActor::New();
6150 ac->SetMapper(Mapper);
6151 ac->SetProperty(prop);
6153 ac->GetMapper()->SetResolveCoincidentTopologyToShiftZBuffer();
6154 ac->GetMapper()->SetResolveCoincidentTopologyZShift(0.02);
6156 mySimulationActors->AddItem(ac);
6157 theRenderer->AddActor(ac);
6159 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6165 //=============================================================================
6169 //=============================================================================
6170 void SMESHGUI::DisplaySimulationNode(SMESH::SMESH_Mesh_ptr aMesh, float x,
6173 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6176 EraseSimulationActors();
6177 mySimulationActors = vtkActorCollection::New();
6178 vtkRenderer *theRenderer =
6179 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6180 getRightFrame()->getViewFrame())->getRenderer();
6181 Standard_Boolean result;
6182 SMESH_Actor *ac = FindActor(aMesh, result, true);
6186 vtkUnstructuredGrid *ugrid =
6187 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6188 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6190 vtkPoints *Pts = ugrid->GetPoints();
6191 vtkPoints *newPts = vtkPoints::New();
6192 int nbPts = Pts->GetNumberOfPoints();
6193 for (int i = 0; i < nbPts; i++)
6195 newPts->InsertPoint(i, Pts->GetPoint(i));
6198 newugrid->SetPoints(newPts);
6199 newugrid->GetPoints()->InsertNextPoint(x, y, z);
6201 vtkMaskPoints *verts = vtkMaskPoints::New();
6202 verts->SetInput(newugrid);
6203 verts->SetGenerateVertices(1);
6204 verts->SetOnRatio(1);
6206 vtkPolyDataMapper *vertMapper = vtkPolyDataMapper::New();
6207 vertMapper->SetInput(verts->GetOutput());
6208 vertMapper->ScalarVisibilityOff();
6210 vtkActor *node = vtkActor::New();
6211 node->SetMapper(vertMapper);
6213 QString SCr = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorRed");
6214 QString SCg = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorGreen");
6215 QString SCb = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorBlue");
6216 QColor nodecolor(SCr.toInt(), SCg.toInt(), SCb.toInt());
6217 if (!nodecolor.isValid())
6218 // nodecolor = QColor(0.,1.,0.);
6219 nodecolor = QColor(0, 1, 0);
6221 node->GetProperty()->SetColor(float (nodecolor.red()) / 255.,
6222 float (nodecolor.green()) / 255., float (nodecolor.blue()) / 255.);
6225 QAD_CONFIG->getSetting("SMESH:SettingsNodesSize").toInt();
6229 node->GetProperty()->SetPointSize(intValue);
6231 node->VisibilityOn();
6233 mySimulationActors->AddItem(node);
6234 theRenderer->AddActor(node);
6237 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6241 //=============================================================================
6245 //=============================================================================
6246 void SMESHGUI::DisplaySimulationMoveNode(vtkActor * ac, int idnode, float x,
6249 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6252 vtkRenderer *theRenderer =
6253 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6254 getRightFrame()->getViewFrame())->getRenderer();
6255 float *pt = ac->GetMapper()->GetInput()->GetPoint(idnode);
6260 ac->GetMapper()->ImmediateModeRenderingOn();
6261 ac->GetProperty()->SetRepresentationToWireframe();
6263 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6268 //=============================================================================
6272 //=============================================================================
6273 void SMESHGUI::MoveNode(SMESH::SMESH_Mesh_ptr aMesh, int idnode, float x,
6276 Standard_Boolean result;
6278 SMESH_Actor *MeshActor = FindActor(aMesh, result, true);
6284 //=============================================================================
6288 //=============================================================================
6289 void SMESHGUI::ScalarVisibilityOff()
6291 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6294 vtkRenderer *theRenderer =
6295 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6296 getRightFrame()->getViewFrame())->getRenderer();
6297 vtkActorCollection *actorList = theRenderer->GetActors();
6299 actorList->InitTraversal();
6300 vtkActor *ac = actorList->GetNextActor();
6301 while (!(ac == NULL))
6303 if (ac->IsA("SMESH_Actor"))
6305 SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac);
6306 if (anActor->GetVisibility() == 1)
6308 vtkDataSetMapper *meshMapper =
6309 (vtkDataSetMapper *) (anActor->getMapper());
6310 meshMapper->ScalarVisibilityOff();
6311 meshMapper->SetInput(anActor->DataSource);
6312 ChangeRepresentation(anActor, anActor->getDisplayMode());
6315 ac = actorList->GetNextActor();
6318 theRenderer->Render();
6321 //=============================================================================
6325 //=============================================================================
6326 void SMESHGUI::DisplaySimulationEdge(SMESH::SMESH_Mesh_ptr aMesh,
6327 const TColStd_MapOfInteger & MapIndex)
6329 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6332 EraseSimulationActors();
6333 mySimulationActors = vtkActorCollection::New();
6334 vtkRenderer *theRenderer =
6335 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6336 getRightFrame()->getViewFrame())->getRenderer();
6337 Standard_Boolean result;
6338 SMESH_Actor *ac = FindActor(aMesh, result, true);
6341 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6345 vtkIdList *Ids = vtkIdList::New();
6346 for (; ite.More(); ite.Next())
6348 idNodes[i] = ite.Key();
6352 Ids->InsertId(0, idNodes[0]);
6353 pts[0] = idNodes[0];
6354 Ids->InsertId(1, idNodes[1]);
6355 pts[1] = idNodes[1];
6357 vtkUnstructuredGrid *ugrid =
6358 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6359 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6360 newugrid->SetPoints(ugrid->GetPoints());
6361 newugrid->InsertNextCell(VTK_LINE, 2, pts);
6363 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6364 Mapper->SetInput(newugrid);
6367 vtkActor *edge = vtkActor::New();
6368 edge->SetMapper(Mapper);
6369 edge->SetProperty(ac->GetProperty());
6370 edge->SetBackfaceProperty(ac->GetBackfaceProperty());
6371 edge->VisibilityOn();
6372 mySimulationActors->AddItem(edge);
6373 theRenderer->AddActor(edge);
6376 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6380 //=============================================================================
6384 //=============================================================================
6385 void SMESHGUI::DisplaySimulationTriangle(SMESH::SMESH_Mesh_ptr aMesh,
6386 const TColStd_MapOfInteger & MapIndex, bool reverse)
6388 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6391 EraseSimulationActors();
6392 mySimulationActors = vtkActorCollection::New();
6393 vtkRenderer *theRenderer =
6394 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6395 getRightFrame()->getViewFrame())->getRenderer();
6396 Standard_Boolean result;
6397 SMESH_Actor *ac = FindActor(aMesh, result, true);
6400 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6404 vtkIdList *Ids = vtkIdList::New();
6405 for (; ite.More(); ite.Next())
6407 idNodes[i] = ite.Key();
6413 Ids->InsertId(0, idNodes[2]);
6414 pts[0] = idNodes[2];
6415 Ids->InsertId(1, idNodes[1]);
6416 pts[1] = idNodes[1];
6417 Ids->InsertId(2, idNodes[0]);
6418 pts[2] = idNodes[0];
6422 Ids->InsertId(0, idNodes[0]);
6423 pts[0] = idNodes[0];
6424 Ids->InsertId(1, idNodes[1]);
6425 pts[1] = idNodes[1];
6426 Ids->InsertId(2, idNodes[2]);
6427 pts[2] = idNodes[2];
6429 vtkUnstructuredGrid *ugrid =
6430 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6431 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6432 newugrid->SetPoints(ugrid->GetPoints());
6433 newugrid->InsertNextCell(VTK_TRIANGLE, 3, pts);
6435 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6436 Mapper->SetInput(newugrid);
6439 vtkActor *tri = vtkActor::New();
6440 tri->SetMapper(Mapper);
6441 tri->SetProperty(ac->GetProperty());
6442 tri->SetBackfaceProperty(ac->GetBackfaceProperty());
6443 tri->VisibilityOn();
6444 mySimulationActors->AddItem(tri);
6445 theRenderer->AddActor(tri);
6448 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6452 //=============================================================================
6456 //=============================================================================
6457 void SMESHGUI::DisplaySimulationQuadrangle(SMESH::SMESH_Mesh_ptr aMesh,
6458 const TColStd_MapOfInteger & MapIndex, bool reverse)
6460 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6463 EraseSimulationActors();
6464 mySimulationActors = vtkActorCollection::New();
6465 vtkRenderer *theRenderer =
6466 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6467 getRightFrame()->getViewFrame())->getRenderer();
6468 Standard_Boolean result;
6469 SMESH_Actor *ac = FindActor(aMesh, result, true);
6471 vtkUnstructuredGrid *ugrid =
6472 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6476 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6479 vtkIdList *Ids = vtkIdList::New();
6480 for (; ite.More(); ite.Next())
6482 idNodes[i] = ite.Key();
6486 float *p0 = ugrid->GetPoint(idNodes[0]);
6487 float *p1 = ugrid->GetPoint(idNodes[1]);
6488 float *p2 = ugrid->GetPoint(idNodes[2]);
6489 float *p3 = ugrid->GetPoint(idNodes[3]);
6491 gp_Pnt P0(p0[0], p0[1], p0[2]);
6493 gp_Vec V1(P0, gp_Pnt(p1[0], p1[1], p1[2]));
6494 gp_Vec V2(P0, gp_Pnt(p2[0], p2[1], p2[2]));
6495 gp_Vec V3(P0, gp_Pnt(p3[0], p3[1], p3[2]));
6497 gp_Vec Cross1 = V1 ^ V2;
6498 gp_Vec Cross2 = V2 ^ V3;
6501 if (Cross1.Dot(Cross2) < 0)
6503 V1 = gp_Vec(P0, gp_Pnt(p2[0], p2[1], p2[2]));
6504 V2 = gp_Vec(P0, gp_Pnt(p1[0], p1[1], p1[2]));
6508 if (Cross1.Dot(Cross2) < 0)
6511 idNodes[2] = idNodes[3];
6517 idNodes[1] = idNodes[2];
6524 Ids->InsertId(0, idNodes[3]);
6525 Ids->InsertId(1, idNodes[2]);
6526 Ids->InsertId(2, idNodes[1]);
6527 Ids->InsertId(3, idNodes[0]);
6531 Ids->InsertId(0, idNodes[0]);
6532 Ids->InsertId(1, idNodes[1]);
6533 Ids->InsertId(2, idNodes[2]);
6534 Ids->InsertId(3, idNodes[3]);
6537 // vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->DataSource );
6538 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6539 newugrid->SetPoints(ugrid->GetPoints());
6540 newugrid->InsertNextCell(VTK_QUAD, Ids);
6542 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6543 Mapper->SetInput(newugrid);
6546 vtkActor *quad = vtkActor::New();
6547 quad->SetMapper(Mapper);
6548 quad->SetProperty(ac->GetProperty());
6549 quad->SetBackfaceProperty(ac->GetBackfaceProperty());
6550 quad->VisibilityOn();
6551 mySimulationActors->AddItem(quad);
6552 theRenderer->AddActor(quad);
6554 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6558 //=============================================================================
6562 //=============================================================================
6563 void SMESHGUI::DisplaySimulationTetra(SMESH::SMESH_Mesh_ptr aMesh,
6564 const TColStd_MapOfInteger & MapIndex)
6566 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6569 EraseSimulationActors();
6570 mySimulationActors = vtkActorCollection::New();
6571 vtkRenderer *theRenderer =
6572 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6573 getRightFrame()->getViewFrame())->getRenderer();
6574 Standard_Boolean result;
6575 SMESH_Actor *ac = FindActor(aMesh, result, true);
6578 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6581 vtkIdList *Ids = vtkIdList::New();
6582 for (; ite.More(); ite.Next())
6584 idNodes[i] = ite.Key();
6588 Ids->InsertId(0, idNodes[0]);
6589 Ids->InsertId(1, idNodes[1]);
6590 Ids->InsertId(2, idNodes[2]);
6591 Ids->InsertId(3, idNodes[3]);
6593 vtkUnstructuredGrid *ugrid =
6594 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6595 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6596 newugrid->SetPoints(ugrid->GetPoints());
6597 newugrid->InsertNextCell(VTK_TETRA, Ids);
6599 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6600 Mapper->SetInput(newugrid);
6603 vtkActor *tetra = vtkActor::New();
6604 tetra->SetMapper(Mapper);
6605 tetra->SetProperty(ac->GetProperty());
6606 tetra->SetBackfaceProperty(ac->GetBackfaceProperty());
6607 tetra->VisibilityOn();
6608 mySimulationActors->AddItem(tetra);
6609 theRenderer->AddActor(tetra);
6611 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6615 //=============================================================================
6619 //=============================================================================
6620 void SMESHGUI::DisplaySimulationHexa(SMESH::SMESH_Mesh_ptr aMesh,
6621 const TColStd_MapOfInteger & MapIndex)
6623 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6626 EraseSimulationActors();
6627 mySimulationActors = vtkActorCollection::New();
6628 vtkRenderer *theRenderer =
6629 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6630 getRightFrame()->getViewFrame())->getRenderer();
6631 Standard_Boolean result;
6632 SMESH_Actor *ac = FindActor(aMesh, result, true);
6635 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6638 vtkIdList *Ids = vtkIdList::New();
6639 for (; ite.More(); ite.Next())
6641 idNodes[i] = ite.Key();
6645 Ids->InsertId(0, idNodes[0]);
6646 Ids->InsertId(1, idNodes[1]);
6647 Ids->InsertId(2, idNodes[2]);
6648 Ids->InsertId(3, idNodes[3]);
6649 Ids->InsertId(4, idNodes[4]);
6650 Ids->InsertId(5, idNodes[5]);
6651 Ids->InsertId(6, idNodes[6]);
6652 Ids->InsertId(7, idNodes[7]);
6654 vtkUnstructuredGrid *ugrid =
6655 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6656 vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New();
6657 newugrid->SetPoints(ugrid->GetPoints());
6658 newugrid->InsertNextCell(VTK_HEXAHEDRON, Ids);
6660 vtkDataSetMapper *Mapper = vtkDataSetMapper::New();
6661 Mapper->SetInput(newugrid);
6664 vtkActor *hexa = vtkActor::New();
6665 hexa->SetMapper(Mapper);
6666 hexa->SetProperty(ac->GetProperty());
6667 hexa->SetBackfaceProperty(ac->GetBackfaceProperty());
6668 hexa->VisibilityOn();
6669 mySimulationActors->AddItem(hexa);
6670 theRenderer->AddActor(hexa);
6672 vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
6676 //=============================================================================
6680 //=============================================================================
6681 void SMESHGUI::AddFace(SMESH::SMESH_Mesh_ptr aMesh,
6682 const TColStd_MapOfInteger & MapIndex, bool reverse)
6684 QApplication::setOverrideCursor(Qt::waitCursor);
6685 Standard_Boolean result;
6686 SMESH_Actor *ac = FindActor(aMesh, result, true);
6689 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6690 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
6691 anArrayOfIdeces->length(MapIndex.Extent());
6694 for (; ite.More(); ite.Next())
6696 anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key());
6701 if (MapIndex.Extent() == 4)
6705 TColStd_MapIteratorOfMapOfInteger ite1(MapIndex);
6706 for (; ite1.More(); ite1.Next())
6708 idNodes[i] = ite1.Key();
6712 vtkUnstructuredGrid *ugrid =
6713 vtkUnstructuredGrid::SafeDownCast(ac->DataSource);
6714 float *p0 = ugrid->GetPoint(idNodes[0]);
6715 float *p1 = ugrid->GetPoint(idNodes[1]);
6716 float *p2 = ugrid->GetPoint(idNodes[2]);
6717 float *p3 = ugrid->GetPoint(idNodes[3]);
6719 gp_Pnt P0(p0[0], p0[1], p0[2]);
6721 gp_Vec V1(P0, gp_Pnt(p1[0], p1[1], p1[2]));
6722 gp_Vec V2(P0, gp_Pnt(p2[0], p2[1], p2[2]));
6723 gp_Vec V3(P0, gp_Pnt(p3[0], p3[1], p3[2]));
6725 gp_Vec Cross1 = V1 ^ V2;
6726 gp_Vec Cross2 = V2 ^ V3;
6728 if (Cross1.Dot(Cross2) < 0)
6731 V1 = gp_Vec(P0, gp_Pnt(p2[0], p2[1], p2[2]));
6732 V2 = gp_Vec(P0, gp_Pnt(p1[0], p1[1], p1[2]));
6736 if (Cross1.Dot(Cross2) < 0)
6738 tmp = anArrayOfIdeces[2];
6739 anArrayOfIdeces[2] = anArrayOfIdeces[3];
6740 anArrayOfIdeces[3] = tmp;
6744 tmp = anArrayOfIdeces[1];
6745 anArrayOfIdeces[1] = anArrayOfIdeces[2];
6746 anArrayOfIdeces[2] = tmp;
6754 for (i = 0; i < (MapIndex.Extent() / 2); i++)
6756 tmp = anArrayOfIdeces[i];
6757 anArrayOfIdeces[i] = anArrayOfIdeces[MapIndex.Extent() - i - 1];
6758 anArrayOfIdeces[MapIndex.Extent() - i - 1] = tmp;
6761 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
6762 aMeshEditor->AddFace(anArrayOfIdeces);
6764 if (myAutomaticUpdate)
6766 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
6769 smeshGUI->DisplayActor(Mesh);
6770 smeshGUI->DisplayEdges(Mesh);
6771 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
6772 AddActorInSelection(Mesh);
6775 QApplication::restoreOverrideCursor();
6778 //=============================================================================
6782 //=============================================================================
6783 void SMESHGUI::AddVolume(SMESH::SMESH_Mesh_ptr aMesh,
6784 const TColStd_MapOfInteger & MapIndex)
6786 QApplication::setOverrideCursor(Qt::waitCursor);
6787 Standard_Boolean result;
6788 SMESH_Actor *ac = FindActor(aMesh, result, true);
6791 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6792 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
6793 anArrayOfIdeces->length(MapIndex.Extent());
6796 for (; ite.More(); ite.Next())
6798 anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key());
6802 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
6803 aMeshEditor->AddVolume(anArrayOfIdeces);
6805 if (myAutomaticUpdate)
6807 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
6810 smeshGUI->DisplayActor(Mesh);
6811 smeshGUI->DisplayEdges(Mesh);
6812 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
6813 AddActorInSelection(Mesh);
6816 QApplication::restoreOverrideCursor();
6819 //=============================================================================
6823 //=============================================================================
6824 void SMESHGUI::AddEdge(SMESH::SMESH_Mesh_ptr aMesh,
6825 const TColStd_MapOfInteger & MapIndex)
6827 QApplication::setOverrideCursor(Qt::waitCursor);
6828 Standard_Boolean result;
6829 SMESH_Actor *ac = FindActor(aMesh, result, true);
6832 TColStd_MapIteratorOfMapOfInteger ite(MapIndex);
6833 SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
6834 anArrayOfIdeces->length(MapIndex.Extent());
6837 for (; ite.More(); ite.Next())
6839 anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key());
6843 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
6844 aMeshEditor->AddEdge(anArrayOfIdeces);
6846 if (myAutomaticUpdate)
6848 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
6851 smeshGUI->DisplayActor(Mesh);
6852 smeshGUI->DisplayEdges(Mesh);
6853 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
6854 AddActorInSelection(Mesh);
6857 QApplication::restoreOverrideCursor();
6860 //=============================================================================
6864 //=============================================================================
6865 void SMESHGUI::AddNode(SMESH::SMESH_Mesh_ptr aMesh, float x, float y, float z)
6867 QApplication::setOverrideCursor(Qt::waitCursor);
6868 Standard_Boolean result;
6869 SMESH_Actor *ac = FindActor(aMesh, result, true);
6872 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
6873 aMeshEditor->AddNode(x, y, z);
6875 if (myAutomaticUpdate)
6877 SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh);
6880 smeshGUI->DisplayActor(Mesh);
6881 smeshGUI->DisplayEdges(Mesh);
6882 smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode());
6883 AddActorInSelection(Mesh);
6887 QApplication::restoreOverrideCursor();
6890 //=============================================================================
6894 //=============================================================================
6895 void SMESHGUI::DisplayEdgesConnectivityLegendBox(vtkActor * ac)
6897 if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK)
6900 EraseSimulationActors();
6901 mySimulationActors2D = vtkActor2DCollection::New();
6903 vtkRenderer *theRenderer =
6904 ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()->
6905 getRightFrame()->getViewFrame())->getRenderer();
6907 vtkGlyphSource2D *gs2 = vtkGlyphSource2D::New();
6908 gs2->SetGlyphTypeToTriangle();
6911 vtkLegendBoxActor *legend = vtkLegendBoxActor::New();
6912 legend->GetPositionCoordinate()->SetValue(0.025, 0.025, 0.);
6913 legend->GetPosition2Coordinate()->SetValue(0.3, 0.3, 0.); //relative to Position
6915 legend->SetNumberOfEntries(4);
6916 legend->SetEntryString(0, tr("SMESH_BOUNDARYEDGES"));
6917 legend->SetEntrySymbol(0, gs2->GetOutput());
6918 legend->SetEntryColor(0, ac->GetMapper()->GetLookupTable()->GetColor(0.));
6919 legend->SetEntryString(1, tr("SMESH_MANIFOLDEDGES"));
6920 legend->SetEntrySymbol(1, gs2->GetOutput());
6921 legend->SetEntryColor(1,
6922 ac->GetMapper()->GetLookupTable()->GetColor(0.666667));
6923 legend->SetEntryString(2, tr("SMESH_NONMANIFOLDEDGES"));
6924 legend->SetEntrySymbol(2, gs2->GetOutput());
6925 legend->SetEntryColor(2,
6926 ac->GetMapper()->GetLookupTable()->GetColor(0.222222));
6927 legend->SetEntryString(3, tr("SMESH_FEATUREEDGES"));
6928 legend->SetEntrySymbol(3, gs2->GetOutput());
6929 legend->SetEntryColor(3,
6930 ac->GetMapper()->GetLookupTable()->GetColor(0.444444));
6931 legend->SetPadding(5);
6932 // legend->GetProperty()->SetColor();
6934 mySimulationActors2D->AddItem(legend);
6935 theRenderer->AddActor2D(legend);
6938 myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->
6942 //===============================================================================
6943 // function : OnEditDelete()
6945 //===============================================================================
6946 void SMESHGUI::OnEditDelete()
6948 if (QAD_MessageBox::warn2
6949 (QAD_Application::getDesktop(),
6950 tr("SMESH_WRN_WARNING"),
6951 tr("SMESH_REALLY_DELETE"),
6952 tr("SMESH_BUT_YES"), tr("SMESH_BUT_NO"), 1, 0, 0) != 1)
6955 int nbSf = myActiveStudy->getStudyFramesCount();
6957 Standard_Boolean found;
6958 SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
6959 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
6960 SALOMEDS::GenericAttribute_var anAttr;
6961 SALOMEDS::AttributeIOR_var anIOR;
6963 SALOME_Selection *Sel =
6964 SALOME_Selection::Selection(myActiveStudy->getSelection());
6965 SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
6966 for (; It.More(); It.Next())
6968 Handle(SALOME_InteractiveObject) IObject = It.Value();
6969 if (IObject->hasEntry())
6971 SALOMEDS::SObject_var SO =
6972 myStudy->FindObjectID(IObject->getEntry());
6974 /* Erase child graphical objects */
6975 SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO);
6976 for (; it->More(); it->Next())
6978 SALOMEDS::SObject_var CSO = it->Value();
6979 if (CSO->FindAttribute(anAttr, "AttributeIOR"))
6981 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
6983 for (int i = 0; i < nbSf; i++)
6985 QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i);
6986 if (sf->getTypeView() == VIEW_VTK)
6988 vtkRenderer *Renderer =
6989 ((VTKViewer_ViewFrame *) smeshGUI->
6990 myActiveStudy->getActiveStudyFrame()->
6991 getRightFrame()->getViewFrame())->getRenderer();
6993 smeshGUI->FindActorByEntry(CSO->GetID(), found,
6997 Renderer->RemoveActor(ac->EdgeDevice);
6998 Renderer->RemoveActor(ac->EdgeShrinkDevice);
6999 Renderer->RemoveActor(ac);
7006 /* Erase main graphical object */
7007 for (int i = 0; i < nbSf; i++)
7009 QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i);
7010 if (sf->getTypeView() == VIEW_VTK)
7012 vtkRenderer *Renderer =
7013 ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy->
7014 getActiveStudyFrame()->getRightFrame()->
7015 getViewFrame())->getRenderer();
7016 VTKViewer_RenderWindowInteractor *myRenderInter =
7017 ((VTKViewer_ViewFrame *) sf->getRightFrame()->
7018 getViewFrame())->getRWInteractor();
7020 smeshGUI->FindActorByEntry(IObject->getEntry(), found,
7024 Renderer->RemoveActor(ac->EdgeDevice);
7025 Renderer->RemoveActor(ac->EdgeShrinkDevice);
7027 myRenderInter->Remove(IObject);
7031 /* Erase objects in Study */
7032 SALOMEDS::SObject_var obj =
7033 myStudy->FindObjectID(IObject->getEntry());
7034 if (!obj->_is_nil())
7037 new SALOMEGUI_ImportOperation(myActiveStudy);
7039 aStudyBuilder->RemoveObject(obj);
7043 } /* IObject->hasEntry() */
7046 /* Clear any previous selection */
7047 Sel->ClearIObjects();
7048 myActiveStudy->updateObjBrowser();