Salome HOME
Delete key regression corrections: in previous implementation sketch entities did...
[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())
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     // when the feature can not be visualized in the module, the operation preview should not
109     // be visualized also
110     if (anOperationPrs->hasShapes() && myWorkshop->module()->canDisplayObject(myFeature)) {
111       // set color here because it can be changed in preferences
112       Quantity_Color aShapeColor = getShapeColor(theFlag);
113       anOperationPrs->setShapeColor(aShapeColor);
114
115       PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
116       XGUI_Workshop* aWorkshop = workshop();
117       aWorkshop->displayer()->displayAIS(myPresentations[theFlag], false/*load object in selection*/,
118                                          theUpdateViewer);
119       aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId());
120       isModified = true;
121     }
122   }
123   else {
124     // when the feature can not be visualized in the module, the operation preview should not
125     // be visualized also
126     if (!anOperationPrs->hasShapes() || !myWorkshop->module()->canDisplayObject(myFeature)) {
127       erasePresentation(theFlag, theUpdateViewer);
128       isModified = true;
129     }
130     else {
131       anOperationPrs->Redisplay();
132       isModified = true;
133       if (theUpdateViewer)
134         workshop()->displayer()->updateViewer();
135     }
136   }
137   return isModified;
138 }
139
140 void PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
141                                           const bool theUpdateViewer)
142 {
143   XGUI_Workshop* aWorkshop = workshop();
144   aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer);
145 }
146
147 void PartSet_CustomPrs::clearPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
148 {
149   Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(theFlag);
150   if (!anOperationPrs.IsNull())
151     anOperationPrs.Nullify();
152 }
153
154 Handle(PartSet_OperationPrs) PartSet_CustomPrs::getPresentation(
155                                          const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
156 {
157   Handle(PartSet_OperationPrs) aPresentation;
158
159   if (myPresentations.contains(theFlag)) {
160     AISObjectPtr anOperationPrs = myPresentations[theFlag];
161     if (!anOperationPrs.get())
162       initPresentation(theFlag);
163     Handle(AIS_InteractiveObject) anAISIO = anOperationPrs->impl<Handle(AIS_InteractiveObject)>();
164     aPresentation = Handle(PartSet_OperationPrs)::DownCast(anAISIO);
165   }
166   return aPresentation;
167 }
168
169 bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject,
170                                   const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
171                                   const bool theUpdateViewer)
172 {
173 #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
174   return false;
175 #endif
176   return displayPresentation(theFlag, theUpdateViewer);
177 }
178
179 void PartSet_CustomPrs::clearPrs()
180 {
181   clearPresentation(ModuleBase_IModule::CustomizeArguments);
182   clearPresentation(ModuleBase_IModule::CustomizeResults);
183   clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects);
184 }
185
186 void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
187 {
188   AISObjectPtr anOperationPrs = AISObjectPtr(new GeomAPI_AISObject());
189   Handle(PartSet_OperationPrs) anAISPrs = new PartSet_OperationPrs(myWorkshop);
190   anOperationPrs->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
191   if (theFlag == ModuleBase_IModule::CustomizeArguments ||
192       theFlag == ModuleBase_IModule::CustomizeResults) {
193     anOperationPrs->setPointMarker(5, 2.);
194     anOperationPrs->setWidth(1);
195   }
196   else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects)
197     anAISPrs->useAISWidth();
198
199   if (anOperationPrs.get())
200     myPresentations[theFlag] = anOperationPrs;
201 }
202
203 Quantity_Color PartSet_CustomPrs::getShapeColor(
204                                   const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag)
205 {
206   Quantity_Color aColor;
207   switch(theFlag) {
208     case ModuleBase_IModule::CustomizeArguments:
209       aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color",
210                                        OPERATION_PARAMETER_COLOR());
211     break;
212     case ModuleBase_IModule::CustomizeResults:
213       aColor = ModuleBase_Tools::color("Visualization", "operation_result_color",
214                                        OPERATION_RESULT_COLOR());
215     break;
216     case ModuleBase_IModule::CustomizeHighlightedObjects:
217       aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color",
218                                        OPERATION_HIGHLIGHT_COLOR());
219     break;
220     default:
221     break;
222   }
223   return aColor;
224 }
225
226 XGUI_Workshop* PartSet_CustomPrs::workshop() const
227 {
228   XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myWorkshop);
229   return aConnector->workshop();
230 }