+ ResultBodyPtr aResOwner = ModelAPI_Tools::bodyOwner(myResult);
+ SetAutoHilight(aResOwner.get() == NULL);
+
+ myHiddenSubShapesDrawer = new AIS_ColoredDrawer (myDrawer);
+ Handle(Prs3d_ShadingAspect) aShadingAspect = new Prs3d_ShadingAspect();
+ aShadingAspect->SetMaterial(Graphic3d_NOM_BRASS); //default value of context material
+ myHiddenSubShapesDrawer->SetShadingAspect(aShadingAspect);
+
+ ModuleBase_Tools::setPointBallHighlighting(this);
+
+ // Define colors for wireframe mode
+ setEdgesDefaultColor();
+}
+
+//********************************************************************
+void ModuleBase_ResultPrs::setAdditionalSelectionPriority(const int thePriority)
+{
+ myAdditionalSelectionPriority = thePriority;
+}
+
+//********************************************************************
+void ModuleBase_ResultPrs::SetColor (const Quantity_Color& theColor)
+{
+ ViewerData_AISShape::SetColor(theColor);
+ myHiddenSubShapesDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
+ setEdgesDefaultColor();
+}
+
+void ModuleBase_ResultPrs::setEdgesDefaultColor()
+{
+ AttributeIntArrayPtr aColorAttr = myResult->data()->intArray(ModelAPI_Result::COLOR_ID());
+ bool aHasColor = aColorAttr.get() && aColorAttr->isInitialized();
+
+ if (!aHasColor) {
+ Handle(Prs3d_Drawer) aDrawer = Attributes();
+ Handle(Prs3d_LineAspect) anAspect; // = aDrawer->LineAspect();
+ //anAspect->SetColor(Quantity_NOC_YELLOW);
+ //aDrawer->SetLineAspect(anAspect);
+
+ // - unfree boundaries color
+ anAspect = aDrawer->UnFreeBoundaryAspect();
+ anAspect->SetColor(Quantity_NOC_YELLOW);
+ aDrawer->SetUnFreeBoundaryAspect(anAspect);
+ aDrawer->SetUnFreeBoundaryDraw(true);
+
+ // - free boundaries color
+ anAspect = aDrawer->FreeBoundaryAspect();
+ anAspect->SetColor(Quantity_NOC_GREEN);
+ aDrawer->SetFreeBoundaryAspect(anAspect);
+ aDrawer->SetFreeBoundaryDraw(true);
+
+ // - standalone edges color
+ anAspect = aDrawer->WireAspect();
+ anAspect->SetColor(Quantity_NOC_RED);
+ aDrawer->SetWireAspect(anAspect);
+ }
+}
+
+
+//********************************************************************
+bool ModuleBase_ResultPrs::setSubShapeHidden(const NCollection_List<TopoDS_Shape>& theShapes)
+{
+ bool isModified = false;
+
+ TopoDS_Compound aCompound;
+ BRep_Builder aBBuilder;
+ aBBuilder.MakeCompound (aCompound);
+ // restore hidden shapes if there are not the shapes in parameter container
+ NCollection_List<TopoDS_Shape> aVisibleSubShapes;
+ for (NCollection_List<TopoDS_Shape>::Iterator aHiddenIt(myHiddenSubShapes); aHiddenIt.More();
+ aHiddenIt.Next()) {
+ if (!theShapes.Contains(aHiddenIt.Value()))
+ aVisibleSubShapes.Append(aHiddenIt.Value());
+ else
+ aBBuilder.Add (aCompound, aHiddenIt.Value());
+ }
+ isModified = !aVisibleSubShapes.IsEmpty();
+ for (NCollection_List<TopoDS_Shape>::Iterator aVisibleIt(aVisibleSubShapes); aVisibleIt.More();
+ aVisibleIt.Next())
+ myHiddenSubShapes.Remove(aVisibleIt.Value());
+
+ // append hidden shapes into internal container if there are not these shapes
+ for (NCollection_List<TopoDS_Shape>::Iterator aShapeIt(theShapes); aShapeIt.More();
+ aShapeIt.Next())
+ {
+ if (aShapeIt.Value().ShapeType() != TopAbs_FACE) // only face shape can be hidden
+ continue;
+
+ if (!myHiddenSubShapes.Contains(aShapeIt.Value())) {
+ myHiddenSubShapes.Append(aShapeIt.Value());
+ aBBuilder.Add (aCompound, aShapeIt.Value());
+ isModified = true;
+ }
+ }
+ myHiddenCompound = aCompound;
+ return isModified;
+}
+
+//********************************************************************
+bool ModuleBase_ResultPrs::isSubShapeHidden(const TopoDS_Shape& theShape)
+{
+ if (theShape.IsNull() || theShape.ShapeType() != TopAbs_FACE) // only face shape can be hidden
+ return false;
+
+ // orientation of parameter shape(come from selection) may be wrong, check isEqual() to be sure
+ for (NCollection_List<TopoDS_Shape>::Iterator aShapeIt(myHiddenSubShapes); aShapeIt.More();
+ aShapeIt.Next())
+ {
+ if (theShape.IsSame(aShapeIt.Value()))
+ return true;
+ }
+
+ return true;