1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/XCAFPrs/XCAFPrs_AISObject.cxx
luz paz 4551e1be75 0031939: Coding - correction of spelling errors in comments [part 8]
Fix various typos

Fixed via codespell v2.1.dev
2021-02-03 18:31:42 +03:00

334 lines
12 KiB
C++

// Created on: 2000-08-11
// Created by: Andrey BETENEV
// Copyright (c) 2000-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <XCAFPrs_AISObject.hxx>
#include <AIS_DisplayMode.hxx>
#include <BRep_Builder.hxx>
#include <BRepBndLib.hxx>
#include <gp_Pnt.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <Graphic3d_Texture2Dmanual.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_DimensionAspect.hxx>
#include <Prs3d_IsoAspect.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <Prs3d_Text.hxx>
#include <TDataStd_Name.hxx>
#include <TDF_LabelSequence.hxx>
#include <TPrsStd_AISPresentation.hxx>
#include <TopoDS_Iterator.hxx>
#include <XCAFDoc_ShapeTool.hxx>
#include <XCAFPrs.hxx>
#include <XCAFPrs_IndexedDataMapOfShapeStyle.hxx>
#include <XCAFPrs_DataMapIteratorOfIndexedDataMapOfShapeStyle.hxx>
#include <XCAFPrs_Style.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XCAFPrs_AISObject,AIS_ColoredShape)
//=======================================================================
//function : XCAFPrs_AISObject
//purpose :
//=======================================================================
XCAFPrs_AISObject::XCAFPrs_AISObject (const TDF_Label& theLabel)
: AIS_ColoredShape(TopoDS_Shape()),
myToSyncStyles (Standard_True)
{
// define plastic material by default for proper color reproduction
setMaterial (myDrawer, Graphic3d_NameOfMaterial_Plastified, Standard_False, Standard_False);
hasOwnMaterial = Standard_True;
myLabel = theLabel;
}
//=======================================================================
//function : DisplayText
//purpose :
//=======================================================================
static void DisplayText (const TDF_Label& aLabel,
const Handle(Prs3d_Presentation)& aPrs,
const Handle(Prs3d_TextAspect)& anAspect,
const TopLoc_Location& aLocation)
{
// first label itself
Handle (TDataStd_Name) aName;
if (aLabel.FindAttribute (TDataStd_Name::GetID(), aName)) {
TopoDS_Shape aShape;
if (XCAFDoc_ShapeTool::GetShape (aLabel, aShape)) {
// find the position to display as middle of the bounding box
aShape.Move (aLocation);
Bnd_Box aBox;
BRepBndLib::Add (aShape, aBox);
if ( ! aBox.IsVoid() )
{
Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
aBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
gp_Pnt aPnt (0.5 * (aXmin + aXmax), 0.5 * (aYmin + aYmax), 0.5 * (aZmin + aZmax));
Prs3d_Text::Draw (aPrs->CurrentGroup(), anAspect, aName->Get(), aPnt);
}
}
}
TDF_LabelSequence seq;
// attributes of subshapes
if (XCAFDoc_ShapeTool::GetSubShapes (aLabel, seq)) {
Standard_Integer i = 1;
for (i = 1; i <= seq.Length(); i++) {
TDF_Label aL = seq.Value (i);
DisplayText (aL, aPrs, anAspect, aLocation); //suppose that subshapes do not contain locations
}
}
// attributes of components
seq.Clear();
if (XCAFDoc_ShapeTool::GetComponents (aLabel, seq)) {
Standard_Integer i = 1;
for (i = 1; i <= seq.Length(); i++) {
TDF_Label aL = seq.Value (i);
DisplayText (aL, aPrs, anAspect, aLocation);
TDF_Label aRefLabel;
// attributes of references
TopLoc_Location aLoc = XCAFDoc_ShapeTool::GetLocation (aL);
if (XCAFDoc_ShapeTool::GetReferredShape (aL, aRefLabel)) {
DisplayText (aRefLabel, aPrs, anAspect, aLoc);
}
}
}
}
//=======================================================================
//function : DispatchStyles
//purpose :
//=======================================================================
void XCAFPrs_AISObject::DispatchStyles (const Standard_Boolean theToSyncStyles)
{
myToSyncStyles = theToSyncStyles;
myShapeColors.Clear();
TopoDS_Shape aShape;
if (!XCAFDoc_ShapeTool::GetShape (myLabel, aShape) || aShape.IsNull())
{
Set (TopoDS_Shape());
return;
}
Set (aShape);
// Collecting information on colored subshapes
TopLoc_Location aLoc;
XCAFPrs_IndexedDataMapOfShapeStyle aSettings;
XCAFPrs::CollectStyleSettings (myLabel, aLoc, aSettings);
// Getting default colors
XCAFPrs_Style aDefStyle;
DefaultStyle (aDefStyle);
setStyleToDrawer (myDrawer, aDefStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
// collect sub-shapes with the same style into compounds
BRep_Builder aBuilder;
NCollection_IndexedDataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style> aStyleGroups;
for (XCAFPrs_DataMapIteratorOfIndexedDataMapOfShapeStyle aStyledShapeIter (aSettings);
aStyledShapeIter.More(); aStyledShapeIter.Next())
{
TopoDS_Compound aComp;
if (aStyleGroups.FindFromKey (aStyledShapeIter.Value(), aComp))
{
aBuilder.Add (aComp, aStyledShapeIter.Key());
continue;
}
aBuilder.MakeCompound (aComp);
aBuilder.Add (aComp, aStyledShapeIter.Key());
TopoDS_Compound* aMapShape = aStyleGroups.ChangeSeek (aStyledShapeIter.Value());
if (aMapShape == NULL)
aStyleGroups.Add (aStyledShapeIter.Value(), aComp);
else
*aMapShape = aComp;
}
aSettings.Clear();
// assign custom aspects
for (NCollection_IndexedDataMap<XCAFPrs_Style, TopoDS_Compound, XCAFPrs_Style>::Iterator aStyleGroupIter (aStyleGroups);
aStyleGroupIter.More(); aStyleGroupIter.Next())
{
const TopoDS_Compound& aComp = aStyleGroupIter.Value();
TopoDS_Iterator aShapeIter (aComp);
TopoDS_Shape aShapeCur = aShapeIter.Value();
aShapeIter.Next();
if (aShapeIter.More())
{
aShapeCur = aComp;
}
Handle(AIS_ColoredDrawer) aDrawer = new AIS_ColoredDrawer (myDrawer);
myShapeColors.Bind (aShapeCur, aDrawer);
const XCAFPrs_Style& aStyle = aStyleGroupIter.Key();
aDrawer->SetHidden (!aStyle.IsVisible());
if (!aStyle.Material().IsNull()
&& !aStyle.Material()->IsEmpty())
{
aDrawer->SetOwnMaterial();
}
if (aStyle.IsSetColorSurf()
|| aStyle.IsSetColorCurv())
{
aDrawer->SetOwnColor (Quantity_Color());
}
setStyleToDrawer (aDrawer, aStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
}
aStyleGroups.Clear();
}
//=======================================================================
//function : Compute
//purpose :
//=======================================================================
void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode)
{
// update shape and sub-shapes styles only on first compute, or on first recompute
if (myToSyncStyles)
{
Standard_Boolean toMapStyles = myToSyncStyles;
for (PrsMgr_Presentations::Iterator aPrsIter (myPresentations); aPrsIter.More(); aPrsIter.Next())
{
if (aPrsIter.Value() != thePrs
&& !aPrsIter.Value()->MustBeUpdated())
{
toMapStyles = Standard_False;
break;
}
}
if (toMapStyles)
{
DispatchStyles (Standard_True);
}
}
if (myshape.IsNull())
{
return;
}
if (myshape.ShapeType() == TopAbs_COMPOUND)
{
if (myshape.NbChildren() == 0)
{
return;
}
}
AIS_ColoredShape::Compute (thePresentationManager, thePrs, theMode);
if (XCAFPrs::GetViewNameMode())
{
// Displaying Name attributes
thePrs->SetDisplayPriority (10);
DisplayText (myLabel, thePrs, Attributes()->DimensionAspect()->TextAspect(), TopLoc_Location());//no location
}
}
//=======================================================================
//function : setStyleToDrawer
//purpose :
//=======================================================================
void XCAFPrs_AISObject::setStyleToDrawer (const Handle(Prs3d_Drawer)& theDrawer,
const XCAFPrs_Style& theStyle,
const XCAFPrs_Style& theDefStyle,
const Graphic3d_MaterialAspect& theDefMaterial)
{
theDrawer->SetupOwnShadingAspect();
theDrawer->SetOwnLineAspects();
Quantity_ColorRGBA aSurfColor = theDefStyle.GetColorSurfRGBA();
Quantity_Color aCurvColor = theDefStyle.GetColorCurv();
Graphic3d_MaterialAspect aMaterial = theDefMaterial;
const Handle(XCAFDoc_VisMaterial)& anXMat = !theStyle.Material().IsNull() ? theStyle.Material() : theDefStyle.Material();
if (!anXMat.IsNull()
&& !anXMat->IsEmpty())
{
anXMat->FillAspect (theDrawer->ShadingAspect()->Aspect());
aMaterial = theDrawer->ShadingAspect()->Aspect()->FrontMaterial();
aSurfColor = Quantity_ColorRGBA (aMaterial.Color(), aMaterial.Alpha());
aCurvColor = aMaterial.Color();
}
if (theStyle.IsSetColorSurf())
{
aSurfColor = theStyle.GetColorSurfRGBA();
aMaterial.SetColor (aSurfColor.GetRGB());
aMaterial.SetAlpha (aSurfColor.Alpha());
}
if (theStyle.IsSetColorCurv())
{
aCurvColor = theStyle.GetColorCurv();
}
theDrawer->UnFreeBoundaryAspect()->SetColor (aCurvColor);
theDrawer->FreeBoundaryAspect()->SetColor (aCurvColor);
theDrawer->WireAspect()->SetColor (aCurvColor);
theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aSurfColor);
theDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
theDrawer->UIsoAspect()->SetColor (aSurfColor.GetRGB());
theDrawer->VIsoAspect()->SetColor (aSurfColor.GetRGB());
}
//=======================================================================
//function : DefaultStyle
//purpose : DefaultStyle() can be redefined by subclasses in order to set custom default style
//=======================================================================
void XCAFPrs_AISObject::DefaultStyle (XCAFPrs_Style& theStyle) const
{
theStyle.SetColorSurf (Quantity_NOC_WHITE);
theStyle.SetColorCurv (Quantity_NOC_WHITE);
}
// =======================================================================
// function : SetMaterial
// purpose :
// =======================================================================
void XCAFPrs_AISObject::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
{
XCAFPrs_Style aDefStyle;
DefaultStyle (aDefStyle);
setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
setStyleToDrawer (myDrawer, aDefStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnMaterial())
{
continue;
}
if (aDrawer->HasOwnShadingAspect())
{
// take current color
const Quantity_ColorRGBA aSurfColor = aDrawer->ShadingAspect()->Aspect()->InteriorColorRGBA();
Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
aMaterial.SetColor (aSurfColor.GetRGB());
aMaterial.SetAlpha (aSurfColor.Alpha());
aDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aSurfColor);
aDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
}
}
SynchronizeAspects();
}