// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//
//
// Module : GEOM
// $Header$
-using namespace std;
/*!
\class GEOM_AISShape GEOM_AISShape.hxx
\brief ....
// Open CASCADE Includes
#include <AIS_Drawer.hxx>
+#include <AIS_InteractiveContext.hxx>
+#include <Graphic3d_AspectFillArea3d.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_IsoAspect.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <StdSelect_BRepOwner.hxx>
+#include <SelectMgr_IndexedMapOfOwner.hxx>
+#include <SelectMgr_Selection.hxx>
#include <StdSelect_DisplayMode.hxx>
#include <StdPrs_WFShape.hxx>
#include <StdPrs_ShadedShape.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <TColStd_ListOfInteger.hxx>
+#include <TopExp.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
-#include <Graphic3d_AspectFillArea3d.hxx>
+using namespace std;
-GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape,
- const Standard_CString aName): SALOME_AISShape(shape)
+static void getEntityOwners( const Handle(AIS_InteractiveObject)& theObj,
+ const Handle(AIS_InteractiveContext)& theIC,
+ SelectMgr_IndexedMapOfOwner& theMap )
{
- myIO = NULL;
- myName = new char [strlen(aName)+1];
- strcpy( myName, aName);
+ if ( theObj.IsNull() || theIC.IsNull() )
+ return;
+
+ TColStd_ListOfInteger modes;
+ theIC->ActivatedModes( theObj, modes );
+
+ TColStd_ListIteratorOfListOfInteger itr( modes );
+ for (; itr.More(); itr.Next() ) {
+ int m = itr.Value();
+ if ( !theObj->HasSelection( m ) )
+ continue;
+
+ Handle(SelectMgr_Selection) sel = theObj->Selection( m );
+ for ( sel->Init(); sel->More(); sel->Next() ) {
+ Handle(SelectBasics_SensitiveEntity) entity = sel->Sensitive();
+ if ( entity.IsNull() )
+ continue;
+
+ Handle(SelectMgr_EntityOwner) owner =
+ Handle(SelectMgr_EntityOwner)::DownCast(entity->OwnerId());
+ if ( !owner.IsNull() )
+ theMap.Add( owner );
+ }
+ }
+}
+
+static void indicesToOwners( const TColStd_IndexedMapOfInteger& aIndexMap,
+ const TopoDS_Shape& aMainShape,
+ const SelectMgr_IndexedMapOfOwner& anAllMap,
+ SelectMgr_IndexedMapOfOwner& aToHiliteMap )
+{
+ TopTools_IndexedMapOfShape aMapOfShapes;
+ TopExp::MapShapes(aMainShape, aMapOfShapes);
+
+ for ( Standard_Integer i = 1, n = anAllMap.Extent(); i <= n; i++ ) {
+ Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(anAllMap( i ));
+ if ( anOwner.IsNull() || !anOwner->HasShape() )
+ continue;
+
+ const TopoDS_Shape& aSubShape = anOwner->Shape();
+ Standard_Integer aSubShapeId = aMapOfShapes.FindIndex( aSubShape );
+ if ( !aSubShapeId || !aIndexMap.Contains( aSubShapeId ) )
+ continue;
+
+ if ( !aToHiliteMap.Contains( anOwner ) )
+ aToHiliteMap.Add( anOwner );
+ }
+}
+
+GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape,
+ const Standard_CString aName)
+ : SALOME_AISShape(shape), myName(aName)
+{
myShadingColor = Quantity_Color( Quantity_NOC_GOLDENROD );
}
void GEOM_AISShape::setIO(const Handle(SALOME_InteractiveObject)& io){
- myIO = io;
+ SetOwner( io );
}
Handle(SALOME_InteractiveObject) GEOM_AISShape::getIO(){
- return myIO;
+ Handle(SALOME_InteractiveObject) IO;
+ if ( !GetOwner().IsNull() )
+ IO = Handle(SALOME_InteractiveObject)::DownCast( GetOwner() );
+ return IO;
}
Standard_Boolean GEOM_AISShape::hasIO(){
- return !( myIO == NULL ) ;
+ return !getIO().IsNull();
}
void GEOM_AISShape::setName(const Standard_CString aName)
{
- myName = new char [strlen(aName)+1];
- strcpy( myName, aName);
+ myName = aName;
- if ( hasIO() )
- myIO->setName(aName);
+ Handle(SALOME_InteractiveObject) IO = getIO();
+ if ( !IO.IsNull() )
+ IO->setName(aName);
}
Standard_CString GEOM_AISShape::getName(){
- return myName;
+ return myName.ToCString();
}
void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
myDrawer->ShadingAspect()->Aspect()->SetDistinguishOn();
Graphic3d_MaterialAspect aMatAspect;
- aMatAspect.SetAmbient( 1 );
- aMatAspect.SetDiffuse( 0 );
- aMatAspect.SetEmissive( 0 );
- aMatAspect.SetShininess(1 );
- aMatAspect.SetSpecular( 0 );
+ aMatAspect.SetAmbient( 0.5 );
+ aMatAspect.SetDiffuse( 0.5 );
+ aMatAspect.SetEmissive( 0.5 );
+ aMatAspect.SetShininess(0.5 );
+ aMatAspect.SetSpecular( 0.5 );
myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(aMatAspect);
myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Graphic3d_NOM_JADE);
//a4bis->SetInteriorColor(myShadingColor);
myDrawer->ShadingAspect()->SetColor(myShadingColor);
- StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer);
+ // PAL12113: AIS_Shape::Compute() works correctly with shapes containing no faces
+ //StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer);
+ AIS_Shape::Compute(aPresentationManager, aPrs, aMode);
break;
}
}
{
myShadingColor = aCol;
}
+
+void GEOM_AISShape::highlightSubShapes(const TColStd_IndexedMapOfInteger& aIndexMap,
+ const Standard_Boolean aHighlight )
+{
+ Handle(AIS_InteractiveObject) anObj = this;
+ Handle(AIS_InteractiveContext) anIC = GetContext();
+ if ( anIC.IsNull() || !anIC->HasOpenedContext() )
+ return;
+
+ Standard_Boolean isAutoHilight = anIC->AutomaticHilight();
+ anIC->SetAutomaticHilight( false );
+
+ anIC->ClearSelected( false );
+
+ if ( aHighlight ) {
+ SelectMgr_IndexedMapOfOwner anAllMap, aToHiliteMap;
+
+ // Get entity owners for all activated selection modes
+ getEntityOwners( anObj, anIC, anAllMap );
+
+ // Convert <aIndexMap> into the map of owners to highlight/unhighlight
+ indicesToOwners( aIndexMap, Shape(), anAllMap, aToHiliteMap );
+
+
+ for ( Standard_Integer i = 1, n = aToHiliteMap.Extent(); i <= n; i++ )
+ anIC->AddOrRemoveSelected( aToHiliteMap( i ), false );
+ }
+
+ anIC->SetAutomaticHilight( isAutoHilight );
+ anIC->HilightSelected( false );
+}