#include <gp_Pnt2d.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_AspectLine3d.hxx>
+#include <Graphic3d_ArrayOfTriangles.hxx>
+#include <Graphic3d_ArrayOfSegments.hxx>
#include <Graphic3d_Group.hxx>
#include <Graphic3d_StructureManager.hxx>
#include <Graphic3d_Texture2Dmanual.hxx>
#include <PrsMgr_PresentationManager3d.hxx>
#include <Standard_ErrorHandler.hxx>
#include <StdPrs_ShadedShape.hxx>
-#include <StdPrs_ToolShadedShape.hxx>
-#include <StdPrs_WFDeflectionShape.hxx>
+#include <StdPrs_ToolTriangulatedShape.hxx>
+#include <StdPrs_WFShape.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Iterator.hxx>
-IMPLEMENT_STANDARD_HANDLE (AIS_ColoredDrawer, Prs3d_Drawer)
-IMPLEMENT_STANDARD_RTTIEXT(AIS_ColoredDrawer, Prs3d_Drawer)
+IMPLEMENT_STANDARD_RTTIEXT(AIS_ColoredShape,AIS_Shape)
+IMPLEMENT_STANDARD_RTTIEXT(AIS_ColoredDrawer,Prs3d_Drawer)
-IMPLEMENT_STANDARD_HANDLE (AIS_ColoredShape, AIS_Shape)
-IMPLEMENT_STANDARD_RTTIEXT(AIS_ColoredShape, AIS_Shape)
+namespace
+{
+ //! Collect all sub-compounds into map.
+ static void collectSubCompounds (TopTools_MapOfShape& theMap,
+ const TopoDS_Shape& theShape)
+ {
+ for (TopoDS_Iterator aChildIter (theShape); aChildIter.More(); aChildIter.Next())
+ {
+ const TopoDS_Shape& aShape = aChildIter.Value();
+ if (aShape.ShapeType() == TopAbs_COMPOUND
+ && theMap.Add (aShape))
+ {
+ collectSubCompounds (theMap, theShape);
+ }
+ }
+ }
+}
//=======================================================================
//function : AIS_ColoredShape
hasOwnColor = Standard_True;
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
- for (DataMapOfShapeColor::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
+ for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnColor())
myOwnWidth = theLineWidth;
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
- for (DataMapOfShapeColor::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
+ for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnWidth())
myTransparency = theValue;
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
- for (DataMapOfShapeColor::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
+ for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(Prs3d_Drawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnShadingAspect())
//myOwnMaterial = theMaterial;
hasOwnMaterial = Standard_True;
LoadRecomputable (AIS_Shaded);
- for (DataMapOfShapeColor::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
+ for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
//if (aDrawer->HasOwnMaterial()) continue;
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode)
{
- thePrs->Clear();
+ if (myshape.IsNull())
+ {
+ return;
+ }
+
if (IsInfinite())
{
thePrs->SetInfiniteState (Standard_True);
if (myDrawer->IsAutoTriangulation())
{
// compute mesh for entire shape beforehand to ensure consistency and optimizations (parallelization)
- Standard_Real anAnglePrev, anAngleNew, aCoeffPrev, aCoeffNew;
- Standard_Boolean isOwnDeviationAngle = OwnDeviationAngle (anAngleNew, anAnglePrev);
- Standard_Boolean isOwnDeviationCoefficient = OwnDeviationCoefficient(aCoeffNew, aCoeffPrev);
- if ((isOwnDeviationAngle && Abs (anAngleNew - anAnglePrev) > Precision::Angular())
- || (isOwnDeviationCoefficient && Abs (aCoeffNew - aCoeffPrev) > Precision::Confusion()))
- {
- BRepTools::Clean (myshape);
- }
+ StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (myshape, myDrawer, Standard_True);
+
// After this call if type of deflection is relative
// computed deflection coefficient is stored as absolute.
- StdPrs_ShadedShape::Tessellate (myshape, myDrawer);
+ Standard_Boolean wasRecomputed = StdPrs_ToolTriangulatedShape::Tessellate (myshape, myDrawer);
+
+ // Set to update wireframe presentation on triangulation.
+ if (myDrawer->IsoOnTriangulation() && wasRecomputed)
+ {
+ SetToUpdate (AIS_WireFrame);
+ }
}
}
else // WireFrame mode
{
+ StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (myshape, myDrawer, Standard_True);
+
// After this call if type of deflection is relative
// computed deflection coefficient is stored as absolute.
Prs3d::GetDeflection (myshape, myDrawer);
}
- TopoDS_Compound anOpened, aClosed;
- BRep_Builder aBuilder;
- aBuilder.MakeCompound (aClosed);
- aBuilder.MakeCompound (anOpened);
- if (theMode == AIS_Shaded && myshape.ShapeType() <= TopAbs_SOLID)
- {
- StdPrs_ShadedShape::ExploreSolids (myshape, aBuilder, aClosed, anOpened, Standard_False);
- }
- else
- {
- aBuilder.Add (anOpened, myshape);
- }
-
- // myShapeColors + anOpened --> array[TopAbs_ShapeEnum] of map of color-to-compound
- DataMapOfShapeCompd aDispatchedOpened [(size_t)TopAbs_SHAPE];
- dispatchColors (anOpened, myShapeColors, aDispatchedOpened);
- addShapesWithCustomProps (thePrs, aDispatchedOpened, theMode, StdPrs_Volume_Opened);
-
- if (theMode == AIS_Shaded)
+ // Extract myShapeColors map (KeyshapeColored -> Color)
+ // to subshapes map (Subshape -> Color).
+ // This needed when colored shape is not part of BaseShape
+ // (but subshapes are) and actually container for subshapes.
+ AIS_DataMapOfShapeDrawer aSubshapeDrawerMap;
{
- if (isShapeEntirelyVisible())
+ // unroll compounds specified for grouping sub-shapes with the same style
+ // (e.g. the compounds that are not a part of the main shape)
+ TopTools_MapOfShape aMapOfOwnCompounds;
+ if (myshape.ShapeType() == TopAbs_COMPOUND)
{
- // myShapeColors + aClosed --> array[TopAbs_ShapeEnum] of map of color-to-compound
- DataMapOfShapeCompd aDispatchedClosed [(size_t)TopAbs_SHAPE];
- dispatchColors (aClosed, myShapeColors, aDispatchedClosed);
- addShapesWithCustomProps (thePrs, aDispatchedClosed, theMode, StdPrs_Volume_Closed);
+ aMapOfOwnCompounds.Add (myshape);
+ collectSubCompounds (aMapOfOwnCompounds, myshape);
}
- else
+ for (AIS_DataMapOfShapeDrawer::Iterator aKeyShapeIter (myShapeColors);
+ aKeyShapeIter.More(); aKeyShapeIter.Next())
{
- for (TopoDS_Iterator aSolidIter (aClosed); aSolidIter.More(); aSolidIter.Next())
+ const TopoDS_Shape& aKeyShape = aKeyShapeIter.Key();
+ if (aKeyShape.ShapeType() != TopAbs_COMPOUND
+ || aMapOfOwnCompounds.Contains (aKeyShape))
{
- DataMapOfShapeCompd aDispatchedClosed [(size_t)TopAbs_SHAPE];
- dispatchColors (aSolidIter.Value(), myShapeColors, aDispatchedClosed);
- addShapesWithCustomProps (thePrs, aDispatchedClosed, theMode,
- isShapeEntirelyVisible (aDispatchedClosed) ? StdPrs_Volume_Closed : StdPrs_Volume_Opened);
+ continue;
+ }
+
+ for (TopoDS_Iterator aChildIter (aKeyShape); aChildIter.More(); aChildIter.Next())
+ {
+ const TopoDS_Shape& aShape = aChildIter.Value();
+ if (!myShapeColors.IsBound (aShape))
+ {
+ bindSubShapes (aSubshapeDrawerMap, aShape, aKeyShapeIter.Value());
+ }
}
}
+
+ // assign other sub-shapes with styles
+ for (AIS_DataMapOfShapeDrawer::Iterator aKeyShapeIter (myShapeColors);
+ aKeyShapeIter.More(); aKeyShapeIter.Next())
+ {
+ const TopoDS_Shape& aKeyShape = aKeyShapeIter.Key();
+ if (myshape == aKeyShape
+ || (aKeyShape.ShapeType() == TopAbs_COMPOUND
+ && !aMapOfOwnCompounds.Contains (aKeyShape)))
+ {
+ continue;
+ }
+
+ bindSubShapes (aSubshapeDrawerMap, aKeyShape, aKeyShapeIter.Value());
+ }
}
+
+ Handle(AIS_ColoredDrawer) aBaseDrawer;
+ myShapeColors.Find (myshape, aBaseDrawer);
+
+ // myShapeColors + anOpened --> array[TopAbs_ShapeEnum] of map of color-to-compound
+ DataMapOfDrawerCompd aDispatchedOpened[(size_t)TopAbs_SHAPE];
+ DataMapOfDrawerCompd aDispatchedClosed;
+ dispatchColors (aBaseDrawer, myshape,
+ aSubshapeDrawerMap, TopAbs_COMPOUND, Standard_False,
+ aDispatchedOpened, theMode == AIS_Shaded ? aDispatchedClosed : aDispatchedOpened[TopAbs_FACE]);
+ addShapesWithCustomProps (thePrs, aDispatchedOpened, aDispatchedClosed, theMode);
}
//=======================================================================
//purpose :
//=======================================================================
void AIS_ColoredShape::addShapesWithCustomProps (const Handle(Prs3d_Presentation)& thePrs,
- DataMapOfShapeCompd* theDispatched,
- const Standard_Integer theMode,
- const StdPrs_Volume theVolume)
+ const DataMapOfDrawerCompd* theDrawerOpenedShapePerType,
+ const DataMapOfDrawerCompd& theDrawerClosedFaces,
+ const Standard_Integer theMode)
{
- Handle(AIS_ColoredDrawer) aCustomDrawer;
- for (size_t aShType = 0; aShType < (size_t )TopAbs_SHAPE; ++aShType)
- {
- DataMapOfShapeCompd& aKeyshapeDrawshapeMap = theDispatched[aShType];
- for (DataMapOfShapeCompd::Iterator aMapIter (aKeyshapeDrawshapeMap);
+ Handle(Graphic3d_Group) anOpenGroup, aClosedGroup;
+ for (size_t aShType = 0; aShType <= (size_t )TopAbs_SHAPE; ++aShType)
+ {
+ const Standard_Boolean isClosed = aShType == TopAbs_SHAPE;
+ Handle(Graphic3d_Group)& aShadedGroup = isClosed ? aClosedGroup : anOpenGroup;
+ const DataMapOfDrawerCompd& aDrawerShapeMap = isClosed
+ ? theDrawerClosedFaces
+ : theDrawerOpenedShapePerType[aShType];
+ for (DataMapOfDrawerCompd::Iterator aMapIter (aDrawerShapeMap);
aMapIter.More(); aMapIter.Next())
{
- const TopoDS_Shape& aShapeKey = aMapIter.Key(); // key shape with detailed color or a base shape
+ const Handle(AIS_ColoredDrawer)& aCustomDrawer = aMapIter.Key();
const TopoDS_Compound& aShapeDraw = aMapIter.Value(); // compound of subshapes with <aShType> type
Handle(Prs3d_Drawer) aDrawer;
- if (myShapeColors.Find (aShapeKey, aCustomDrawer))
+ if (!aCustomDrawer.IsNull())
{
aDrawer = aCustomDrawer;
if (aCustomDrawer->IsHidden())
&& aShapeDraw.ShapeType() <= TopAbs_FACE
&& !IsInfinite())
{
- StdPrs_ShadedShape::Add (thePrs, aShapeDraw, aDrawer, theVolume);
+ // add wireframe presentation for isolated edges and vertices
+ StdPrs_ShadedShape::AddWireframeForFreeElements (thePrs, aShapeDraw, aDrawer);
+
+ // add special wireframe presentation for faces without triangulation
+ StdPrs_ShadedShape::AddWireframeForFacesWithoutTriangles (thePrs, aShapeDraw, aDrawer);
+
+ Handle(Graphic3d_ArrayOfTriangles) aTriangles = StdPrs_ShadedShape::FillTriangles (aShapeDraw);
+ if (!aTriangles.IsNull())
+ {
+ if (aShadedGroup.IsNull())
+ {
+ aShadedGroup = Prs3d_Root::NewGroup (thePrs);
+ aShadedGroup->SetClosed (isClosed);
+ }
+ aShadedGroup->SetPrimitivesAspect (aDrawer->ShadingAspect()->Aspect());
+ aShadedGroup->AddPrimitiveArray (aTriangles);
+ }
+
+ if (aDrawer->FaceBoundaryDraw())
+ {
+ Handle(Graphic3d_ArrayOfSegments) aBndSegments = StdPrs_ShadedShape::FillFaceBoundaries (aShapeDraw);
+ if (!aBndSegments.IsNull())
+ {
+ if (aShadedGroup.IsNull())
+ {
+ aShadedGroup = Prs3d_Root::NewGroup (thePrs);
+ aShadedGroup->SetClosed (isClosed);
+ }
+
+ Handle(Graphic3d_AspectLine3d) aBoundaryAspect = aDrawer->FaceBoundaryAspect()->Aspect();
+ aShadedGroup->SetPrimitivesAspect (aBoundaryAspect);
+ aShadedGroup->AddPrimitiveArray (aBndSegments);
+ }
+ }
}
else
{
- StdPrs_WFDeflectionShape::Add (thePrs, aShapeDraw, aDrawer);
+ StdPrs_WFShape::Add (thePrs, aShapeDraw, aDrawer);
}
aDrawer->SetTypeOfDeflection (aPrevType);
}
//function : dispatchColors
//purpose :
//=======================================================================
-Standard_Boolean AIS_ColoredShape::dispatchColors (const TopoDS_Shape& theBaseKey,
- const TopoDS_Shape& theSubshapeToParse,
- const DataMapOfShapeShape& theSubshapeKeyshapeMap,
- const TopAbs_ShapeEnum theParentType,
- DataMapOfShapeCompd* theTypeKeyshapeDrawshapeArray)
+Standard_Boolean AIS_ColoredShape::dispatchColors (const Handle(AIS_ColoredDrawer)& theParentDrawer,
+ const TopoDS_Shape& theShapeToParse,
+ const AIS_DataMapOfShapeDrawer& theShapeDrawerMap,
+ const TopAbs_ShapeEnum theParentType,
+ const Standard_Boolean theIsParentClosed,
+ DataMapOfDrawerCompd* theDrawerOpenedShapePerType,
+ DataMapOfDrawerCompd& theDrawerClosedFaces)
{
- TopAbs_ShapeEnum aShType = theSubshapeToParse.ShapeType();
- if (aShType == TopAbs_SHAPE)
+ const TopAbs_ShapeEnum aShapeType = theShapeToParse.ShapeType();
+ if (aShapeType == TopAbs_SHAPE)
{
return Standard_False;
}
// check own setting of current shape
- TopoDS_Shape aKeyShape = theBaseKey;
- Standard_Boolean isOverriden = theSubshapeKeyshapeMap.Find (theSubshapeToParse, aKeyShape);
+ Handle(AIS_ColoredDrawer) aDrawer = theParentDrawer;
+ const Standard_Boolean isOverriden = theShapeDrawerMap.Find (theShapeToParse, aDrawer);
+ if (isOverriden
+ && aDrawer->IsHidden())
+ {
+ return Standard_True;
+ }
+
+ // handle compounds, solids and shells
+ Standard_Boolean isSubOverride = Standard_False;
+ if (aShapeType <= TopAbs_SHELL)
+ {
+ // detect parts of closed solids
+ Standard_Boolean isClosedShell = theParentType == TopAbs_SOLID
+ && aShapeType == TopAbs_SHELL
+ && BRep_Tool::IsClosed (theShapeToParse)
+ && StdPrs_ToolTriangulatedShape::IsTriangulated (theShapeToParse);
+ if (isClosedShell)
+ {
+ for (TopoDS_Iterator aFaceIter (theShapeToParse); aFaceIter.More(); aFaceIter.Next())
+ {
+ const TopoDS_Shape& aFace = aFaceIter.Value();
+ Handle(AIS_ColoredDrawer) aFaceDrawer;
+ if (aFace.ShapeType() == TopAbs_FACE
+ && theShapeDrawerMap.Find (aFace, aFaceDrawer)
+ && aFaceDrawer->IsHidden())
+ {
+ isClosedShell = Standard_False;
+ break;
+ }
+ }
+ }
+
+ for (TopoDS_Iterator aSubShapeIter (theShapeToParse); aSubShapeIter.More(); aSubShapeIter.Next())
+ {
+ const TopoDS_Shape& aSubShape = aSubShapeIter.Value();
+ if (dispatchColors (aDrawer, aSubShape,
+ theShapeDrawerMap, aShapeType,
+ isClosedShell,
+ theDrawerOpenedShapePerType,
+ theDrawerClosedFaces))
+ {
+ isSubOverride = Standard_True;
+ }
+ }
+ return isOverriden || isSubOverride;
+ }
// iterate on sub-shapes
BRep_Builder aBBuilder;
- TopoDS_Shape aShapeCopy = theSubshapeToParse.EmptyCopied();
- aShapeCopy.Closed (theSubshapeToParse.Closed());
- Standard_Boolean isSubOverride = Standard_False;
+ TopoDS_Shape aShapeCopy = theShapeToParse.EmptyCopied();
+ aShapeCopy.Closed (theShapeToParse.Closed());
Standard_Integer nbDef = 0;
- for (TopoDS_Iterator it (theSubshapeToParse); it.More(); it.Next())
- {
- if (dispatchColors (theBaseKey, it.Value(),
- theSubshapeKeyshapeMap, aShType,
- theTypeKeyshapeDrawshapeArray))
+ for (TopoDS_Iterator aSubShapeIter (theShapeToParse); aSubShapeIter.More(); aSubShapeIter.Next())
+ {
+ const TopoDS_Shape& aSubShape = aSubShapeIter.Value();
+ if (dispatchColors (aDrawer, aSubShape,
+ theShapeDrawerMap, aShapeType,
+ theIsParentClosed,
+ theDrawerOpenedShapePerType,
+ theDrawerClosedFaces))
{
isSubOverride = Standard_True;
}
else
{
- aBBuilder.Add (aShapeCopy, it.Value());
+ aBBuilder.Add (aShapeCopy, aSubShape);
++nbDef;
}
}
- if (aShType == TopAbs_FACE || !isSubOverride)
+ if (aShapeType == TopAbs_FACE || !isSubOverride)
{
- aShapeCopy = theSubshapeToParse;
+ aShapeCopy = theShapeToParse;
}
else if (nbDef == 0)
{
if (isOverriden
|| (isSubOverride && theParentType != TopAbs_WIRE // avoid drawing edges when vertex color is overridden
&& theParentType != TopAbs_FACE) // avoid drawing edges of the same color as face
- || (theParentType == TopAbs_SHAPE && !(isOverriden || isSubOverride))) // bind original shape to default color
+ || (theParentType <= TopAbs_SHELL && !(isOverriden || isSubOverride))) // bind original shape to default color
{
TopoDS_Compound aCompound;
- DataMapOfShapeCompd& aKeyshapeDrawshapeMap = theTypeKeyshapeDrawshapeArray[(size_t )aShType];
- if (!aKeyshapeDrawshapeMap.FindFromKey (aKeyShape, aCompound))
+ DataMapOfDrawerCompd& aDrawerShapeMap = theIsParentClosed
+ && aShapeType == TopAbs_FACE
+ ? theDrawerClosedFaces
+ : theDrawerOpenedShapePerType[(size_t)aShapeType];
+ if (!aDrawerShapeMap.FindFromKey (aDrawer, aCompound))
{
aBBuilder.MakeCompound (aCompound);
- aKeyshapeDrawshapeMap.Add (aKeyShape, aCompound);
+ aDrawerShapeMap.Add (aDrawer, aCompound);
}
aBBuilder.Add (aCompound, aShapeCopy);
}
return isOverriden || isSubOverride;
}
-//! Function to check if specified compound is sub-shape of another one
-inline Standard_Boolean isFirstCmpContainSecondOne (const TopoDS_Shape& theFirstCmp,
- const TopoDS_Shape& theSecondCmp)
-{
- if (theFirstCmp.ShapeType() != TopAbs_COMPOUND
- || theSecondCmp.ShapeType() != TopAbs_COMPOUND)
- {
- return Standard_False;
- }
-
- for (TopoDS_Iterator aFirstCmpIter (theFirstCmp); aFirstCmpIter.More(); aFirstCmpIter.Next())
- {
- if (aFirstCmpIter.Value().ShapeType() != TopAbs_COMPOUND)
- {
- continue;
- }
- else if (aFirstCmpIter.Value() == theSecondCmp
- || isFirstCmpContainSecondOne (aFirstCmpIter.Value(), theSecondCmp))
- {
- return Standard_True;
- }
- }
- return Standard_False;
-}
-
-//=======================================================================
-//function : dispatchColors
-//purpose :
-//=======================================================================
-void AIS_ColoredShape::dispatchColors (const TopoDS_Shape& theBaseShape,
- const DataMapOfShapeColor& theKeyshapeColorMap,
- DataMapOfShapeCompd* theTypeKeyshapeDrawshapeArray)
-{
- // Extract <theShapeColors> map (KeyshapeColored -> Color)
- // to subshapes map (Subshape -> KeyshapeColored).
- // This needed when colored shape is not part of <theBaseShape>
- // (but subshapes are) and actually container for subshapes.
- DataMapOfShapeShape aSubshapeKeyshapeMap;
- for (DataMapOfShapeColor::Iterator aKeyShapeIter (theKeyshapeColorMap);
- aKeyShapeIter.More(); aKeyShapeIter.Next())
- {
- const TopoDS_Shape& aKeyShape = aKeyShapeIter.Key();
- bindSubShapes (aSubshapeKeyshapeMap, theBaseShape, aKeyShape, aKeyShape);
- }
-
- // Fill the array of maps per shape type
- dispatchColors (theBaseShape, theBaseShape,
- aSubshapeKeyshapeMap, TopAbs_SHAPE,
- theTypeKeyshapeDrawshapeArray);
-}
-
-//=======================================================================
-//function : isShapeEntirelyVisible
-//purpose :
-//=======================================================================
-Standard_Boolean AIS_ColoredShape::isShapeEntirelyVisible (DataMapOfShapeCompd* theDispatched) const
-{
- Handle(AIS_ColoredDrawer) aCustomDrawer;
- for (size_t aShType = (size_t )TopAbs_COMPOUND; aShType <= (size_t )TopAbs_FACE; ++aShType)
- {
- const DataMapOfShapeCompd& aKeyshapeDrawshapeMap = theDispatched[aShType];
- for (DataMapOfShapeCompd::Iterator aMapIter (aKeyshapeDrawshapeMap); aMapIter.More(); aMapIter.Next())
- {
- if (myShapeColors.Find (aMapIter.Key(), aCustomDrawer)
- && !aCustomDrawer.IsNull()
- && aCustomDrawer->IsHidden())
- {
- return Standard_False;
- }
- }
- }
- return Standard_True;
-}
-
//=======================================================================
//function : isShapeEntirelyVisible
//purpose :
//=======================================================================
Standard_Boolean AIS_ColoredShape::isShapeEntirelyVisible() const
{
- for (DataMapOfShapeColor::Iterator aMapIter (myShapeColors); aMapIter.More(); aMapIter.Next())
+ for (AIS_DataMapOfShapeDrawer::Iterator aMapIter (myShapeColors); aMapIter.More(); aMapIter.Next())
{
if (aMapIter.Value()->IsHidden())
{
//function : bindSubShapes
//purpose :
//=======================================================================
-void AIS_ColoredShape::bindSubShapes (DataMapOfShapeShape& theSubshapeKeyshapeMap,
- const TopoDS_Shape& theBaseShape,
- const TopoDS_Shape& theShapeWithColor,
- const TopoDS_Shape& theColorKeyShape)
+void AIS_ColoredShape::bindSubShapes (AIS_DataMapOfShapeDrawer& theShapeDrawerMap,
+ const TopoDS_Shape& theKeyShape,
+ const Handle(AIS_ColoredDrawer)& theDrawer)
{
- TopAbs_ShapeEnum aShapeWithColorType = theShapeWithColor.ShapeType();
+ TopAbs_ShapeEnum aShapeWithColorType = theKeyShape.ShapeType();
if (aShapeWithColorType == TopAbs_COMPOUND)
{
- if (isFirstCmpContainSecondOne (theBaseShape, theShapeWithColor))
- {
- if (!theSubshapeKeyshapeMap.IsBound (theShapeWithColor))
- {
- theSubshapeKeyshapeMap.Bind (theShapeWithColor, theColorKeyShape);
- }
- }
- else
- {
- for (TopoDS_Iterator aSubShapeIter (theShapeWithColor); aSubShapeIter.More(); aSubShapeIter.Next())
- {
- bindSubShapes (theSubshapeKeyshapeMap, theBaseShape, aSubShapeIter.Value(), theColorKeyShape);
- }
- }
+ theShapeDrawerMap.Bind (theKeyShape, theDrawer);
}
else if (aShapeWithColorType == TopAbs_SOLID || aShapeWithColorType == TopAbs_SHELL)
{
- for (TopExp_Explorer anExp (theShapeWithColor, TopAbs_FACE); anExp.More(); anExp.Next())
+ for (TopExp_Explorer anExp (theKeyShape, TopAbs_FACE); anExp.More(); anExp.Next())
{
- if (!theSubshapeKeyshapeMap.IsBound (anExp.Current()))
+ if (!theShapeDrawerMap.IsBound (anExp.Current()))
{
- theSubshapeKeyshapeMap.Bind (anExp.Current(), theColorKeyShape);
+ theShapeDrawerMap.Bind (anExp.Current(), theDrawer);
}
}
}
else if (aShapeWithColorType == TopAbs_WIRE)
{
- for (TopExp_Explorer anExp (theShapeWithColor, TopAbs_EDGE); anExp.More(); anExp.Next())
+ for (TopExp_Explorer anExp (theKeyShape, TopAbs_EDGE); anExp.More(); anExp.Next())
{
- if (!theSubshapeKeyshapeMap.IsBound (anExp.Current()))
+ if (!theShapeDrawerMap.IsBound (anExp.Current()))
{
- theSubshapeKeyshapeMap.Bind (anExp.Current(), theColorKeyShape);
+ theShapeDrawerMap.Bind (anExp.Current(), theDrawer);
}
}
}
// higher priority than the color of "compound" shape (wire is a
// compound of edges, shell is a compound of faces) that contains
// this single shape.
- theSubshapeKeyshapeMap.Bind (theShapeWithColor, theColorKeyShape);
+ theShapeDrawerMap.Bind (theKeyShape, theDrawer);
}
}
-