Salome HOME
Imrove multi-selector control to provide items multi-selection. Activate/deactivate...
[modules/shaper.git] / src / PartSet / PartSet_CustomPrs.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        PartSet_CustomPrs.cpp
4 // Created:     30 Jun 2015
5 // Author:      Natalia ERMOLAEVA
6
7 #include <PartSet_CustomPrs.h>
8 #include <PartSet_Module.h>
9 #include "PartSet_OperationPrs.h"
10
11 #include <XGUI_ModuleConnector.h>
12 #include <XGUI_Workshop.h>
13 #include <XGUI_Displayer.h>
14
15 #include <ModuleBase_IWorkshop.h>
16 #include <ModuleBase_IViewer.h>
17 #include <ModuleBase_Tools.h>
18
19 #include <Config_PropManager.h>
20
21 #include <AIS_InteractiveContext.hxx>
22 #include <AIS_InteractiveObject.hxx>
23 #include <Prs3d_PointAspect.hxx>
24
25 //#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
26
27 PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop)
28   : myWorkshop(theWorkshop), myFeature(FeaturePtr())
29 {
30   initPresentation(ModuleBase_IModule::CustomizeArguments);
31   initPresentation(ModuleBase_IModule::CustomizeResults);
32   initPresentation(ModuleBase_IModule::CustomizeHighlightedObjects);
33
34   myIsActive[ModuleBase_IModule::CustomizeArguments] = false;
35   myIsActive[ModuleBase_IModule::CustomizeResults] = false;
36   myIsActive[ModuleBase_IModule::CustomizeHighlightedObjects] = false;
37 }
38
39 bool PartSet_CustomPrs::isActive(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
40 {
41   return myIsActive[theFlag];
42 }
43
44 bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature,
45                                  const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
46                                  const bool theUpdateViewer)
47 {
48 #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
49   return false;
50 #endif
51
52   myIsActive[theFlag] = true;
53   myFeature = theFeature;
54
55   bool isModified = false;
56   if (theFeature.get()) {
57     displayPresentation(ModuleBase_IModule::CustomizeArguments, theUpdateViewer);
58     displayPresentation(ModuleBase_IModule::CustomizeResults, theUpdateViewer);
59     displayPresentation(ModuleBase_IModule::CustomizeHighlightedObjects, theUpdateViewer);
60     isModified = true;
61   }
62   return isModified;
63 }
64
65 bool PartSet_CustomPrs::deactivate(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
66                                    const bool theUpdateViewer)
67 {
68   myIsActive[theFlag] = false;
69   bool isModified = false;
70
71   erasePresentation(ModuleBase_IModule::CustomizeArguments, theUpdateViewer);
72   erasePresentation(ModuleBase_IModule::CustomizeResults, theUpdateViewer);
73   erasePresentation(ModuleBase_IModule::CustomizeHighlightedObjects, theUpdateViewer);
74   isModified = true;
75
76   return isModified;
77 }
78
79 bool PartSet_CustomPrs::displayPresentation(
80                                   const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
81                                   const bool theUpdateViewer)
82 {
83   bool isModified = false;
84
85   // update the AIS objects content
86   Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(theFlag);
87   // do nothing if the feature can not be displayed [is moved from presentation, to be checked]
88   if (!myFeature.get() || !myWorkshop->module()->canDisplayObject(myFeature))
89     return isModified;
90
91   switch (theFlag) {
92     case ModuleBase_IModule::CustomizeArguments:
93       PartSet_OperationPrs::getFeatureShapes(myFeature, myWorkshop, anOperationPrs->featureShapes());
94       break;
95     case ModuleBase_IModule::CustomizeResults:
96       PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, anOperationPrs->featureShapes());
97       break;
98     case ModuleBase_IModule::CustomizeHighlightedObjects:
99       PartSet_OperationPrs::getHighlightedShapes(myWorkshop, anOperationPrs->featureShapes());
100       break;
101     default:
102       return isModified;
103   }
104
105   // redisplay AIS objects
106   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
107   if (!aContext.IsNull() && !aContext->IsDisplayed(anOperationPrs)) {
108     if (anOperationPrs->hasShapes()) {
109       // set color here because it can be changed in preferences
110       Quantity_Color aShapeColor = getShapeColor(theFlag);
111       anOperationPrs->setShapeColor(aShapeColor);
112
113       PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
114       XGUI_Workshop* aWorkshop = workshop();
115       aWorkshop->displayer()->displayAIS(myPresentations[theFlag], false/*load object in selection*/,
116                                          theUpdateViewer);
117       aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId());
118       isModified = true;
119     }
120   }
121   else {
122     if (!anOperationPrs->hasShapes()) {
123       erasePresentation(theFlag, theUpdateViewer);
124       isModified = true;
125     }
126     else {
127       anOperationPrs->Redisplay();
128       isModified = true;
129       if (theUpdateViewer)
130         workshop()->displayer()->updateViewer();
131     }
132   }
133   return isModified;
134 }
135
136 void PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
137                                           const bool theUpdateViewer)
138 {
139   XGUI_Workshop* aWorkshop = workshop();
140   aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer);
141 }
142
143 void PartSet_CustomPrs::clearPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
144 {
145   Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(theFlag);
146   if (!anOperationPrs.IsNull())
147     anOperationPrs.Nullify();
148 }
149
150 Handle(PartSet_OperationPrs) PartSet_CustomPrs::getPresentation(
151                                          const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
152 {
153   Handle(PartSet_OperationPrs) aPresentation;
154
155   if (myPresentations.contains(theFlag)) {
156     AISObjectPtr anOperationPrs = myPresentations[theFlag];
157     if (!anOperationPrs.get())
158       initPresentation(theFlag);
159     Handle(AIS_InteractiveObject) anAISIO = anOperationPrs->impl<Handle(AIS_InteractiveObject)>();
160     aPresentation = Handle(PartSet_OperationPrs)::DownCast(anAISIO);
161   }
162   return aPresentation;
163 }
164
165 bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject,
166                                   const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
167                                   const bool theUpdateViewer)
168 {
169 #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
170   return false;
171 #endif
172   return displayPresentation(theFlag, theUpdateViewer);
173 }
174
175 void PartSet_CustomPrs::clearPrs()
176 {
177   clearPresentation(ModuleBase_IModule::CustomizeArguments);
178   clearPresentation(ModuleBase_IModule::CustomizeResults);
179   clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects);
180 }
181
182 void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
183 {
184   AISObjectPtr anOperationPrs = AISObjectPtr(new GeomAPI_AISObject());
185   Handle(PartSet_OperationPrs) anAISPrs = new PartSet_OperationPrs(myWorkshop);
186   anOperationPrs->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
187   if (theFlag == ModuleBase_IModule::CustomizeArguments ||
188       theFlag == ModuleBase_IModule::CustomizeResults) {
189     anOperationPrs->setPointMarker(5, 2.);
190     anOperationPrs->setWidth(1);
191   }
192   else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects)
193     anAISPrs->useAISWidth();
194
195   if (anOperationPrs.get())
196     myPresentations[theFlag] = anOperationPrs;
197 }
198
199 Quantity_Color PartSet_CustomPrs::getShapeColor(
200                                   const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
201 {
202   Quantity_Color aColor;
203   switch(theFlag) {
204     case ModuleBase_IModule::CustomizeArguments:
205       aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color",
206                                        OPERATION_PARAMETER_COLOR());
207     break;
208     case ModuleBase_IModule::CustomizeResults:
209       aColor = ModuleBase_Tools::color("Visualization", "operation_result_color",
210                                        OPERATION_RESULT_COLOR());
211     break;
212     case ModuleBase_IModule::CustomizeHighlightedObjects:
213       aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color",
214                                        OPERATION_HIGHLIGHT_COLOR());
215     break;
216     default:
217     break;
218   }
219   return aColor;
220 }
221
222 XGUI_Workshop* PartSet_CustomPrs::workshop() const
223 {
224   XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myWorkshop);
225   return aConnector->workshop();
226 }