]> SALOME platform Git repositories - modules/geom.git/blob - src/EntityGUI/EntityGUI.cxx
Salome HOME
4234a8477415a9d9a98bd3bca83bda3962a680b2
[modules/geom.git] / src / EntityGUI / EntityGUI.cxx
1 //  GEOM GEOMGUI : GUI for Geometry component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
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. 
10 // 
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. 
15 // 
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 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : EntityGUI.cxx
25 //  Author : Damien COQUERET
26 //  Module : GEOM
27 //  $Header: 
28
29 using namespace std;
30 #include "EntityGUI.h"
31
32 #include "QAD_RightFrame.h"
33 #include "OCCViewer_Viewer3d.h"
34 #include "VTKViewer_ViewFrame.h"
35 #include "GEOM_AssemblyBuilder.h"
36 #include "SALOMEGUI_ImportOperation.h"
37 #include "SALOMEGUI_QtCatchCorbaException.hxx"
38
39 #include <BRepTools_WireExplorer.hxx>
40 #include <TopoDS_Wire.hxx>
41 #include <TopoDS_Compound.hxx>
42 #include <BRep_Tool.hxx>
43 #include <BRep_Builder.hxx>
44 #include <TopExp.hxx>
45 #include <TopExp_Explorer.hxx>
46 #include <Geom_Circle.hxx>
47 #include <Precision.hxx>
48
49 #include "DisplayGUI.h"
50 #include "EntityGUI_SubShapeDlg.h"   // Method SUBSHAPE
51
52 //=======================================================================
53 // function : EntityGUI()
54 // purpose  : Constructor
55 //=======================================================================
56 EntityGUI::EntityGUI() :
57   QObject()
58 {
59   myGeomBase = new GEOMBase();
60   myGeomGUI = GEOMContext::GetGeomGUI();
61   myGeom = myGeomGUI->myComponentGeom;
62 }
63
64
65 //=======================================================================
66 // function : ~EntityGUI()
67 // purpose  : Destructor
68 //=======================================================================
69 EntityGUI::~EntityGUI()
70 {
71 }
72
73
74 //=======================================================================
75 // function : OnGUIEvent()
76 // purpose  : 
77 //=======================================================================
78 bool EntityGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent)
79 {
80   EntityGUI* myEntityGUI = new EntityGUI();
81   myEntityGUI->myGeomGUI->EmitSignalDeactivateDialog();
82   SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
83
84   QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
85
86   switch (theCommandID)
87     {
88     case 404: // SKETCHER
89       {
90         ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->onViewTop(); // DCQ : 28/02/2002
91         
92         OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
93
94         myEntityGUI->myGeomGUI->GetSketcher() = Sketch(v3d->getViewer3d());
95         myEntityGUI->myGeomGUI->myState = 2;
96
97         Mb->setItemChecked(4052, false);
98         Mb->setItemChecked(4053, false);
99
100         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(LENGTH_PARAMETER, Mb->isItemChecked(4061));
101         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(ANGLE_PARAMETER, Mb->isItemChecked(4062));
102         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(RADIUS_PARAMETER, Mb->isItemChecked(4063));
103         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(XVALUE_PARAMETER, Mb->isItemChecked(4064));
104         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(YVALUE_PARAMETER, Mb->isItemChecked(4065));
105         
106         myEntityGUI->myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
107         break;
108       }
109     case 4041: // SKETCH Segment
110       {
111         myEntityGUI->myGeomGUI->GetSketcher().ChangeMode(SEGMENT);
112         break;
113       }
114     case 4042: // SKETCH Arc
115       {
116         myEntityGUI->myGeomGUI->GetSketcher().ChangeMode(ARC_CHORD);
117         break;
118       }
119     case 4043: // SKETCH Set Angle
120       {
121         myEntityGUI->OnSketchSetAngle();
122         break;
123       }
124     case 4044: // SKETCH Set X
125       {
126         myEntityGUI->OnSketchSetx();
127         break;
128       }
129     case 4045: // SKETCH Set Y
130       {
131         myEntityGUI->OnSketchSety();
132         break;
133       }
134     case 4046: // SKETCH Delete
135       {
136         myEntityGUI->OnSketchDelete();
137         break;
138       }
139     case 4047: // SKETCH End
140       {
141         myEntityGUI->OnSketchEnd();
142         break;
143       }
144     case 4048: // SKETCH Close
145       {
146         myEntityGUI->OnSketchClose();
147         break;
148       }
149     case 4051: // sketcher Set Plane
150       {
151         //TO DO
152         break;
153       }
154     case 4052: // sketcher TANGENT
155       { 
156         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
157         if(Mb->isItemChecked(theCommandID) == true) 
158           myEntityGUI->myGeomGUI->GetSketcher().SetTransitionStatus(TANGENT);
159         else
160           myEntityGUI->myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
161
162         Mb->setItemChecked(4053, false);
163         break;
164       }
165     case 4053: // sketcher PERPENDICULAR
166       {
167         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
168         if(Mb->isItemChecked(theCommandID) == true) 
169           myEntityGUI->myGeomGUI->GetSketcher().SetTransitionStatus(PERPENDICULAR);
170         else 
171           myEntityGUI->myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
172         
173         Mb->setItemChecked(4052, false);
174         break;
175       }
176     case 4061: // SKETCH OptionsOnofflengthdimension
177       {
178         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
179         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(LENGTH_PARAMETER, Mb->isItemChecked(theCommandID));
180         break;
181       }
182     case 4062: // SKETCH OptionsOnoffangledimension
183       {
184         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
185         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(ANGLE_PARAMETER, Mb->isItemChecked(theCommandID));
186         break;
187       }
188     case 4063: // SKETCH OptionsOnoffradiusdimension
189       {
190         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
191         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(RADIUS_PARAMETER, Mb->isItemChecked(theCommandID));
192         break;
193       }
194     case 4064: // SKETCH OptionsOnoffxdimension
195       {
196         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
197         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(XVALUE_PARAMETER, Mb->isItemChecked(theCommandID));
198         break;
199       }
200     case 4065: // SKETCH OptionsOnoffydimension
201       {
202         Mb->setItemChecked(theCommandID, !Mb->isItemChecked(theCommandID));
203         myEntityGUI->myGeomGUI->GetSketcher().SetParameterVisibility(YVALUE_PARAMETER, Mb->isItemChecked(theCommandID));
204         break;
205       }
206     case 407: // EXPLODE : use ic
207       {
208         Handle(AIS_InteractiveContext) ic;
209         if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) {
210           OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
211           ic = v3d->getAISContext();
212         }
213         EntityGUI_SubShapeDlg *aDlg = new EntityGUI_SubShapeDlg(parent, "", myEntityGUI, Sel, ic);
214         break ;
215       }
216     default:
217       {
218         parent->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID));
219         break;
220       }
221     }
222   return true;
223 }
224
225
226 //=======================================================================
227 // function : OnSketchSetAngle()
228 // purpose  : 
229 //=======================================================================
230 void EntityGUI::OnSketchSetAngle()
231 {
232   Standard_Real anAngle = myGeomGUI->GetSketcher().GetSegmentAngle()/PI180;
233   Sketch::fitInResol(anAngle); 
234   Standard_Boolean res = false;
235   QString Value = QString("%1").arg(anAngle);
236   anAngle = myGeomBase->Parameter(res, Value, tr("GEOM_MEN_ANGLE"), tr("GEOM_MEN_ENTER_ANGLE"),
237                       -180.0, +180.0, 6) * PI180;
238
239   if(res) {
240     myGeomGUI->GetSketcher().SetSegmentAngle(anAngle);
241     QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
242     Mb->setItemChecked(4052, false);
243     Mb->setItemChecked(4053, false);
244   }
245   return;
246 }
247
248
249 //=======================================================================
250 // function : OnSketchSetx()
251 // purpose  : 
252 //=======================================================================
253 void EntityGUI::OnSketchSetx()
254 {
255   Standard_Boolean res = false;
256   double X = myGeomBase->Parameter(res, "0.", tr("GEOM_MEN_X"), tr("GEOM_MEN_SKETCHER_X"),
257                        2.0 * Precision::Confusion(), 1E6, 6);
258   if(res)
259     myGeomGUI->GetSketcher().SetXDimension(X);
260   QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
261   Mb->setItemChecked(4052, false);
262   Mb->setItemChecked(4053, false);
263   return;
264 }
265
266
267 //=======================================================================
268 // function : OnSketchSety()
269 // purpose  : 
270 //=======================================================================
271 void EntityGUI::OnSketchSety()
272 {
273   Standard_Boolean res = false;
274   double Y = myGeomBase->Parameter(res, "0.", tr("GEOM_MEN_Y"), tr("GEOM_MEN_SKETCHER_Y"), 2.0 * Precision::Confusion(), 1E6, 6);
275   if(res)
276     myGeomGUI->GetSketcher().SetYDimension(Y);
277   QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
278   Mb->setItemChecked(4052, false);
279   Mb->setItemChecked(4053, false);
280   return;
281 }
282
283
284 //=======================================================================
285 // function : OnSketchDelete()
286 // purpose  : 
287 //=======================================================================
288 void EntityGUI::OnSketchDelete()
289 {
290   if(myGeomGUI->GetSketcher().GetmyEdgesNumber() == 1) {
291     QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
292     Mb->setItemEnabled(405, false);  // SKETCH CONTRAINTS
293     myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
294   }
295
296   if(myGeomGUI->GetSketcher().Delete())
297     myGeomGUI->myState = -1;
298   return;
299 }
300
301
302 //=======================================================================
303 // function : OnSketchClose()
304 // purpose  : 
305 //=======================================================================
306 void EntityGUI::OnSketchClose()
307 {
308   OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
309   Handle(AIS_InteractiveContext) myContext = v3d->getAISContext();
310
311   TopoDS_Wire W = myGeomGUI->GetSketcher().Close();
312   if(!W.IsNull()) {
313     GEOM::GEOM_Gen::ListOfIOR_var listShapes = new GEOM::GEOM_Gen::ListOfIOR;
314     listShapes->length(0);
315     unsigned int i = 0;
316
317     BRepTools_WireExplorer Ex(W);
318     while(Ex.More()) {
319       TopoDS_Edge E = Ex.Current();
320       gp_Pnt pt1, pt2;
321
322       pt1 = BRep_Tool::Pnt(TopExp::FirstVertex(E));
323       pt2 = BRep_Tool::Pnt(TopExp::LastVertex(E));
324
325       gp_Pnt CenterPoint;
326       Handle(Geom_Curve) Curve;
327       Handle(Geom_Circle) Circle;
328       gp_Circ Circ;
329       Standard_Real First,Last;
330
331       Curve = BRep_Tool::Curve(E,First,Last);
332       if(Curve->IsKind(STANDARD_TYPE(Geom_Circle))) {
333         Circle = Handle(Geom_Circle)::DownCast(Curve); // pointer on geom_circ
334         Circ = Circle->Circ();                         // gp_Circ
335         
336         Curve->D0((First + Last) / 2., CenterPoint);
337
338         GEOM::PointStruct pI = myGeom->MakePointStruct(pt1.X(), pt1.Y(), pt1.Z());
339         GEOM::PointStruct pC = myGeom->MakePointStruct(CenterPoint.X(), CenterPoint.Y(), CenterPoint.Z());
340         GEOM::PointStruct pE = myGeom->MakePointStruct(pt2.X(), pt2.Y(), pt2.Z());
341
342         GEOM::GEOM_Shape_var arc;
343
344         try {
345           arc = myGeom->MakeArc(pI, pC, pE);
346         }
347         catch (const SALOME::SALOME_Exception& S_ex) {
348           QtCatchCorbaException(S_ex);
349         }
350
351         listShapes->length(i+1);
352         listShapes[i] = strdup(arc->Name());
353         i++;   
354       }
355       else {
356         GEOM::PointStruct pI = myGeom->MakePointStruct(pt1.X(), pt1.Y(), pt1.Z());
357         GEOM::PointStruct pE = myGeom->MakePointStruct(pt2.X(), pt2.Y(), pt2.Z());
358         GEOM::GEOM_Shape_var segment;
359
360         try {
361           segment = myGeom->MakeEdge(pI,pE);
362         }       
363         catch (const SALOME::SALOME_Exception& S_ex) {
364           QtCatchCorbaException(S_ex);
365         }
366
367         listShapes->length(i+1);
368         listShapes[i] = strdup(segment->Name());
369         i++;
370       }
371       Ex.Next();
372     }
373     GEOM::GEOM_Shape_var Wire = myGeom->MakeWire(listShapes);
374     TopoDS_Shape S = myGeomGUI->GetShapeReader().GetShape(myGeom, Wire);
375     Standard_CString type;
376     myGeomBase->GetShapeTypeString(S,type);
377     Wire->NameType(type);
378
379     if(myGeomBase->Display(Wire))
380       QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_DONE"));
381   }
382   myGeomGUI->myState = -1;
383   QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
384   Mb->setItemEnabled(405, false);  // SKETCH CONTRAINTS
385   myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
386   return;
387 }
388
389
390 //=======================================================================
391 // function : OnSketchEnd()
392 // purpose  : 
393 //=======================================================================
394 void EntityGUI::OnSketchEnd()
395 {
396   OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
397   Handle (AIS_InteractiveContext) myContext = v3d->getAISContext();
398
399   TopoDS_Wire W = myGeomGUI->GetSketcher().End();
400   if(!W.IsNull()) {
401     GEOM::GEOM_Gen::ListOfIOR_var listShapes = new GEOM::GEOM_Gen::ListOfIOR;
402     listShapes->length(0);
403     unsigned int i = 0;
404
405     BRepTools_WireExplorer Ex(W);
406     while(Ex.More()) {
407       TopoDS_Edge E = TopoDS::Edge(Ex.Current());
408       
409       gp_Pnt pt1, pt2;
410       pt1 = BRep_Tool::Pnt(TopExp::FirstVertex(E));
411       pt2 = BRep_Tool::Pnt(TopExp::LastVertex(E));
412
413       gp_Pnt CenterPoint;
414       Handle(Geom_Curve) Curve;
415       Handle(Geom_Circle) Circle;
416       gp_Circ Circ;
417       Standard_Real First,Last;
418       
419       Curve = BRep_Tool::Curve(E,First,Last);
420       if(Curve->IsKind(STANDARD_TYPE(Geom_Circle))) {
421         Circle = Handle(Geom_Circle)::DownCast(Curve); // pointer on geom_circ
422         Circ = Circle->Circ();                         // gp_Circ
423         
424         Curve->D0((First + Last) / 2., CenterPoint);
425
426         GEOM::PointStruct pI = myGeom->MakePointStruct(pt1.X(), pt1.Y(), pt1.Z());
427         GEOM::PointStruct pC = myGeom->MakePointStruct(CenterPoint.X(), CenterPoint.Y(), CenterPoint.Z());
428         GEOM::PointStruct pE = myGeom->MakePointStruct(pt2.X(), pt2.Y(), pt2.Z());
429
430         GEOM::GEOM_Shape_var arc;
431
432         try {
433           arc = myGeom->MakeArc(pI, pC, pE);
434         }
435         catch (const SALOME::SALOME_Exception& S_ex) {
436           QtCatchCorbaException(S_ex);
437         }
438                 
439         listShapes->length(i+1);
440         listShapes[i] = strdup(arc->Name());
441         i++;   
442       } else {
443         GEOM::PointStruct pI = myGeom->MakePointStruct(pt1.X(), pt1.Y(), pt1.Z());
444         GEOM::PointStruct pE = myGeom->MakePointStruct(pt2.X(), pt2.Y(), pt2.Z());
445         GEOM::GEOM_Shape_var segment;
446         
447         try {
448           segment = myGeom->MakeEdge(pI,pE);
449         }
450         catch (const SALOME::SALOME_Exception& S_ex) {
451           QtCatchCorbaException(S_ex);
452         }
453         
454         listShapes->length(i+1);
455         listShapes[i] = strdup(segment->Name());
456         i++;
457       }
458       Ex.Next();
459     }
460
461     GEOM::GEOM_Shape_var Wire = myGeom->MakeWire(listShapes);
462     TopoDS_Shape S = myGeomGUI->GetShapeReader().GetShape(myGeom, Wire);
463     Standard_CString type;
464     myGeomBase->GetShapeTypeString(S,type);
465     Wire->NameType(type);
466
467     if(myGeomBase->Display(Wire))
468       QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_DONE"));
469   }
470   myGeomGUI->myState = -1;
471   QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar();
472   Mb->setItemEnabled(405, false);  // SKETCH CONTRAINTS
473   myGeomGUI->GetSketcher().SetTransitionStatus(NOCONSTRAINT);
474   return;
475 }
476
477
478 //=====================================================================================
479 // function : SObjectExist()
480 // purpose  :
481 //=====================================================================================
482 bool EntityGUI::SObjectExist(SALOMEDS::SObject_ptr theFatherObject, const char* IOR)
483 {
484   SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
485   SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(theFatherObject);
486   SALOMEDS::SObject_var RefSO;
487   SALOMEDS::GenericAttribute_var anAttr;
488   SALOMEDS::AttributeIOR_var anIOR;
489   for(; it->More();it->Next()) {
490     SALOMEDS::SObject_var SO= it->Value();
491     if(SO->FindAttribute(anAttr, "AttributeIOR")) {
492       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
493       if(strcmp( anIOR->Value(), IOR ) == 0)
494         return true;
495     }
496     if(SO->ReferencedObject(RefSO)) {
497       if(RefSO->FindAttribute(anAttr, "AttributeIOR")) {
498         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
499         if(strcmp(anIOR->Value(), IOR) == 0)
500           return true;
501       }
502     }
503   }
504   return false;
505 }
506
507
508 //=====================================================================================
509 // function : OnSubShapeGetAll()
510 // purpose  : Explode a shape in all sub shapes with a SubShapeType
511 //=====================================================================================
512 bool EntityGUI::OnSubShapeGetAll(const TopoDS_Shape& ShapeTopo, const char* ShapeTopoIOR, const int SubShapeType)
513 {
514   SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
515   SALOMEDS::SObject_var theObj = aStudy->FindObjectIOR(ShapeTopoIOR);
516   if(theObj->_is_nil()) {
517     QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
518     return false;
519   }
520
521   SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
522   SALOMEDS::SObject_var fatherSF = aStudy->FindObjectID(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->entry());
523   SALOMEDS::GenericAttribute_var anAttr;
524   SALOMEDS::AttributeName_var aName;
525   SALOMEDS::AttributeIOR_var anIOR;
526   SALOMEDS::AttributePixMap_var aPixmap;
527
528   /* We create a sub object for each sub shape as attribute of the main object  */
529   /* Each sub object contains list (length=1) containing its index in the main shape */
530   GEOM::GEOM_Shape_var aShape = myGeom->GetIORFromString(ShapeTopoIOR);
531   GEOM::GEOM_Gen::ListOfGeomShapes_var listGeomShapes = new GEOM::GEOM_Gen::ListOfGeomShapes;
532   GEOM::GEOM_Shape_var aResult;
533   
534   try {
535     listGeomShapes = myGeom->SubShapeAll(aShape, SubShapeType);
536     if(listGeomShapes->length() < 1) {
537       QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_ABORT"));
538       return false;
539     }
540   }
541   catch(const SALOME::SALOME_Exception& S_ex) {
542     QtCatchCorbaException(S_ex);
543   }
544   
545   /* open transaction */
546   QAD_Operation* op = new SALOMEGUI_ImportOperation(QAD_Application::getDesktop()->getActiveStudy());
547   op->start();
548   
549   TopoDS_Shape mainTopo = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape);
550   TopoDS_Shape mainShape;
551   bool main = false;
552   while(!main) {
553     if(aShape->IsMainShape()) {
554       mainShape = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape);
555       main = true;
556     } 
557     else
558       aShape = myGeom->GetIORFromString(aShape->MainName());
559   }
560   
561   /* Loop on each sub shape created */
562   /* int i = 1 ; /* index for the nameType */  
563   for(int j=0; j<listGeomShapes->length(); j++) {
564     /* Get each sub shape extracted CORBA and OCC */
565     aResult = listGeomShapes[j] ;    
566     TopoDS_Shape S = myGeomGUI->GetShapeReader().GetShape(myGeom, aResult);
567     
568     if (S.IsNull()) {
569       QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_ABORT"));
570       return false;
571     }
572     
573     /* Set the nameType of sub shape */
574     char* nameG = (char *)malloc(20);
575     Standard_CString Type;
576     if(myGeomBase->GetShapeTypeString(S, Type)) {
577       aResult->NameType(Type);
578       sprintf(nameG, "%s_%d", Type, myGeomBase->GetIndex(S, mainShape, SubShapeType));
579     } 
580     else {
581       aResult->NameType(tr("GEOM_SHAPE"));
582       sprintf(nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->GetNbGeom()++);
583     }
584     SALOMEDS::SObject_var SO = aStudy->FindObjectIOR(aResult->Name());
585
586     bool allreadyexist = false;
587           
588     if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) {
589       OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
590       Handle (AIS_InteractiveContext) ic = v3d->getAISContext();
591       
592       Handle(GEOM_AISShape) result = new GEOM_AISShape(S, nameG);      
593       Handle(GEOM_InteractiveObject) IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM");
594       
595       MESSAGE ("SO->_is_nil() " << SO->_is_nil())
596
597       if(SO->_is_nil()) {
598         SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj);
599         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
600         aName = SALOMEDS::AttributeName::_narrow(anAttr);
601         aName->SetValue(nameG);
602         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
603         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
604         anIOR->SetValue(aResult->Name());
605
606         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap");
607         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
608         MESSAGE(" Type " << S.ShapeType())
609         if (S.ShapeType() == TopAbs_COMPOUND)
610           aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND");
611         else if(S.ShapeType() == TopAbs_COMPSOLID)
612           aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID");
613         else if(S.ShapeType() == TopAbs_SOLID)
614           aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID");
615         else if(S.ShapeType() == TopAbs_SHELL)
616           aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL");
617         else if(S.ShapeType() == TopAbs_FACE)
618           aPixmap->SetPixMap("ICON_OBJBROWSER_FACE");
619         else if(S.ShapeType() == TopAbs_WIRE)
620           aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE");
621         else if(S.ShapeType() == TopAbs_EDGE)
622           aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE");
623         else if(S.ShapeType() == TopAbs_VERTEX)
624           aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX");
625
626         MESSAGE(" aPixmap->GetPixMap " << aPixmap->GetPixMap())
627
628         SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF);
629         aStudyBuilder->Addreference(newObj1, newObj);
630         IO->setEntry(newObj->GetID());
631
632         aResult->StudyShapeId(newObj->GetID());
633       }
634       else {
635         allreadyexist = true;
636         if(!this->SObjectExist(theObj, aResult->Name())) {
637           SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj);
638           aStudyBuilder->Addreference(newObj1, SO);
639           IO->setEntry(SO->GetID());
640           aResult->StudyShapeId(SO->GetID());
641         }
642       }
643       
644       result->setIO(IO);
645       result->setName(nameG);
646       if(!allreadyexist)
647         ic->Display(result);
648       
649     }
650     else if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK) {
651       VTKViewer_RenderWindowInteractor* myRenderInter= ((VTKViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRWInteractor();
652       
653       int themode = myRenderInter->GetDisplayMode();
654       vtkRenderer *theRenderer = ((VTKViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
655       vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
656       
657       Handle(GEOM_InteractiveObject) IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM");
658       
659       if(SO->_is_nil()) {
660         SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj);
661         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
662         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
663         anIOR->SetValue(aResult->Name());
664         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
665         aName = SALOMEDS::AttributeName::_narrow(anAttr);
666         aName->SetValue(nameG);
667         
668         anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap");
669         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
670         if(S.ShapeType() == TopAbs_COMPOUND)
671           aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND");
672         else if(S.ShapeType() == TopAbs_COMPSOLID)
673           aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID");
674         else if(S.ShapeType() == TopAbs_SOLID)
675           aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID");
676         else if(S.ShapeType() == TopAbs_SHELL)
677           aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL");
678         else if(S.ShapeType() == TopAbs_FACE)
679           aPixmap->SetPixMap("ICON_OBJBROWSER_FACE");
680         else if(S.ShapeType() == TopAbs_WIRE)
681           aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE");
682         else if(S.ShapeType() == TopAbs_EDGE)
683           aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE");
684         else if(S.ShapeType() == TopAbs_VERTEX)
685           aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX");
686
687         SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF);
688         aStudyBuilder->Addreference(newObj1, newObj);
689         IO->setEntry(newObj->GetID());
690       }
691       else {
692         allreadyexist = true;
693         if(!this->SObjectExist(theObj, aResult->Name())) {
694           SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj);
695           aStudyBuilder->Addreference(newObj1, SO);
696           IO->setEntry(SO->GetID());
697         }
698       }
699       
700       if(!allreadyexist) {
701         vtkActorCollection* theActors = GEOM_AssemblyBuilder::BuildActors(S,0,themode,Standard_True);
702         theActors->InitTraversal();
703         vtkActor* anActor = (vtkActor*)theActors->GetNextActor();
704         while(!(anActor==NULL)) {
705           GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor);
706           GActor->setIO(IO);
707           GActor->setName(nameG);
708           theRenderer->AddActor(GActor);
709           renWin->Render();
710           anActor = (vtkActor*)theActors->GetNextActor();
711         }
712       }
713     }
714   }
715
716   /* commit transaction */
717   op->finish();
718
719   QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser();
720   QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_READY"));
721   return true;
722 }
723
724
725 //=====================================================================================
726 // function : OnSubShapeGetSelected()
727 // purpose  :
728 //=====================================================================================
729 bool EntityGUI::OnSubShapeGetSelected(const TopoDS_Shape& ShapeTopo, const char* ShapeTopoIOR, const int SubShapeType, Standard_Integer& aLocalContextId, bool& myUseLocalContext)
730 {
731   //* Test the type of viewer */
732   if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC)
733     return false;
734
735   SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
736   SALOMEDS::SObject_var theObj = aStudy->FindObjectIOR(ShapeTopoIOR);
737   if(theObj->_is_nil()) {
738     QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
739     return false;
740   }
741
742   OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer();
743   Handle(AIS_InteractiveContext) ic = v3d->getAISContext();
744   
745   if( myUseLocalContext == false ) {
746     /* local context is from DialogBox */
747     MESSAGE("Error : No local context opened for sub shapes method" << endl ) ;
748     return false ;
749   }
750
751   GEOM::GEOM_Shape_var aShape  = myGeom->GetIORFromString( ShapeTopoIOR );
752   TopoDS_Shape mainTopo = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape);
753
754   TopoDS_Shape mainShape;
755   bool main = false;
756   while(!main) {
757     if(aShape->IsMainShape()) {
758       mainShape = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape);
759       main = true;
760     }
761     else
762       aShape = myGeom->GetIORFromString(aShape->MainName());
763   }
764
765   GEOM::GEOM_Shape::ListOfSubShapeID_var ListOfID = new GEOM::GEOM_Shape::ListOfSubShapeID;
766   ic->InitSelected();
767   int nbSelected = ic->NbSelected();
768   ListOfID->length(nbSelected);
769   
770   TopoDS_Compound compound;
771   ic->InitSelected(); /* to init again */ 
772   BRep_Builder B;
773   B.MakeCompound(compound);
774
775   int i = 0;
776   /* We create a unique compound containing all the sub shapes selected by user as attribute of the main shape */
777   /* the compound is homogenous by selection */
778   while(ic->MoreSelected()) {
779     int index = myGeomBase->GetIndex(ic->SelectedShape(), mainShape, SubShapeType);
780     ListOfID[i] = index;
781     B.Add(compound, ic->SelectedShape());
782     i++;
783     ic->NextSelected();
784   }
785  
786   /* Test if user has selected sub shapes */
787   if(ListOfID->length() < 1)
788     return false;
789
790   GEOM::GEOM_Shape_var aResult;
791   try {
792     aResult = myGeom->SubShape(aShape, SubShapeType, ListOfID);
793   }
794   catch (const SALOME::SALOME_Exception& S_ex) {
795     QtCatchCorbaException(S_ex);
796   }
797
798   /* local context from DialogBox */
799   ic->CloseLocalContext(aLocalContextId);
800   myUseLocalContext = false ;
801
802   char* nameG = (char *)malloc(20);
803   Standard_CString Type;
804
805   Handle(GEOM_AISShape) result; 
806   Handle(GEOM_InteractiveObject) IO;
807
808   if(nbSelected == 1) {
809     TopExp_Explorer Exp (compound, TopAbs_ShapeEnum(SubShapeType));
810     if(Exp.More()) {
811       if(myGeomBase->GetShapeTypeString(Exp.Current(),Type)) {
812         aResult->NameType(Type);
813         sprintf (nameG, "%s_%d", Type, myGeomBase->GetIndex( Exp.Current(), mainTopo, SubShapeType));
814       } 
815       else {
816         aResult->NameType(tr("GEOM_SHAPE"));
817         sprintf (nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->GetNbGeom()++);
818       }
819       result = new GEOM_AISShape(Exp.Current(), nameG);
820       IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM");
821     }
822   }
823   else {
824     if ( myGeomBase->GetShapeTypeString(compound,Type)) {
825       aResult->NameType(Type);
826       sprintf (nameG, "%s_%d", Type, myGeomGUI->GetNbGeom()++);
827     } else {
828       aResult->NameType(tr("GEOM_SHAPE"));
829       sprintf (nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->GetNbGeom()++);
830     }
831     result = new GEOM_AISShape(compound, nameG);
832     IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM");
833   }
834   
835   SALOMEDS::SObject_var SO = aStudy->FindObjectIOR(aResult->Name());
836   
837   /* open transaction */
838   QAD_Operation* op = new SALOMEGUI_ImportOperation(QAD_Application::getDesktop()->getActiveStudy());
839   op->start();
840   
841   SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
842   SALOMEDS::SObject_var fatherSF = aStudy->FindObjectID(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->entry());
843   SALOMEDS::GenericAttribute_var anAttr;
844   SALOMEDS::AttributeName_var aName;
845   SALOMEDS::AttributeIOR_var anIOR;
846   SALOMEDS::AttributePixMap_var aPixmap;
847  
848   bool allreadyexist = false;
849
850   if(SO->_is_nil()) {
851     SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj);
852     anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR");
853     anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
854     anIOR->SetValue(aResult->Name());
855     anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
856     aName = SALOMEDS::AttributeName::_narrow(anAttr);
857     aName->SetValue(result->getName());
858     
859     anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap");
860     aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
861     if(result->Shape().ShapeType() == TopAbs_COMPOUND)
862       aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND");
863     else if(result->Shape().ShapeType() == TopAbs_COMPSOLID)
864       aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID");
865     else if(result->Shape().ShapeType() == TopAbs_SOLID)
866       aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID");
867     else if(result->Shape().ShapeType() == TopAbs_SHELL)
868       aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL");
869     else if(result->Shape().ShapeType() == TopAbs_FACE)
870       aPixmap->SetPixMap("ICON_OBJBROWSER_FACE");
871     else if(result->Shape().ShapeType() == TopAbs_WIRE)
872       aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE");
873     else if(result->Shape().ShapeType() == TopAbs_EDGE)
874       aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE");
875     else if(result->Shape().ShapeType() == TopAbs_VERTEX)
876       aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX");
877
878     SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF);
879     aStudyBuilder->Addreference(newObj1, newObj);
880     
881     IO->setEntry(newObj->GetID());
882     aResult->StudyShapeId(newObj->GetID());
883   } 
884   else {
885     allreadyexist = true;
886     if(!this->SObjectExist(theObj, aResult->Name())) {
887       SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj);
888       aStudyBuilder->Addreference(newObj1, SO);
889     
890       IO->setEntry(SO->GetID());
891       aResult->StudyShapeId(SO->GetID());
892     }
893   }
894   
895   /* commit transaction */
896   op->finish();
897   
898   result->setIO(IO);
899   result->setName(nameG);
900
901   if(!allreadyexist)
902     ic->Display(result);
903
904   DisplayGUI* myDisplayGUI = new DisplayGUI();
905   myDisplayGUI->OnDisplayAll(true);
906
907   QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser();
908   QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_READY"));
909   return true;
910 }
911
912
913 //=====================================================================================
914 // EXPORTED METHODS
915 //=====================================================================================
916 extern "C"
917 {
918   bool OnGUIEvent(int theCommandID, QAD_Desktop* parent)
919   {return EntityGUI::OnGUIEvent(theCommandID, parent);}
920 }