+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
// File: GeomAPI_AISObject.cpp
// Created: 25 Jun 2014
// Author: Artem ZHIDKOV
#include <BRepBndLib.hxx>
#include <AIS_InteractiveObject.hxx>
+#include <AIS_InteractiveContext.hxx>
#include <AIS_LengthDimension.hxx>
#include <AIS_ParallelRelation.hxx>
#include <AIS_PerpendicularRelation.hxx>
#include <AIS_RadiusDimension.hxx>
#include <AIS_Shape.hxx>
#include <AIS_FixRelation.hxx>
+#include <Prs3d_PointAspect.hxx>
+
+#include <Graphic3d_AspectLine3d.hxx>
const double tolerance = 1e-7;
{
}
+GeomAPI_AISObject::~GeomAPI_AISObject()
+{
+ if (!empty()) {
+ // This is necessary for correct deletion of Handle entity.
+ // Without this Handle does not decremented counter to 0
+ Handle(AIS_InteractiveObject) *anAIS = implPtr<Handle(AIS_InteractiveObject)>();
+ anAIS->Nullify();
+ }
+}
+
+
void GeomAPI_AISObject::createShape(std::shared_ptr<GeomAPI_Shape> theShape)
{
const TopoDS_Shape& aTDS =
aShapeAIS->Set(aTDS);
aShapeAIS->Redisplay(Standard_True);
}
- } else
- setImpl(new Handle(AIS_InteractiveObject)(new AIS_Shape(aTDS)));
+ } else {
+ // Set default point as a '+' symbol
+ Handle(AIS_Shape) aShape = new AIS_Shape(aTDS);
+ Handle(Prs3d_Drawer) aDrawer = aShape->Attributes();
+ if (aDrawer->HasOwnPointAspect())
+ aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
+ else
+ aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.));
+ setImpl(new Handle(AIS_InteractiveObject)(aShape));
+ }
}
void GeomAPI_AISObject::createDistance(std::shared_ptr<GeomAPI_Pnt> theStartPoint,
Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
anAspect->MakeArrows3d(Standard_False);
- anAspect->MakeText3d(false);
+ anAspect->MakeText3d(Standard_False);
anAspect->TextAspect()->SetHeight(CONSTRAINT_TEXT_HEIGHT);
- anAspect->MakeTextShaded(false);
+ anAspect->MakeTextShaded(Standard_True);
anAspect->ArrowAspect()->SetLength(theDistance / 10.);
aDimAIS->DimensionAspect()->MakeUnitsDisplayed(false);
aDimAIS->SetDimensionAspect(anAspect);
}
}
-
-
void GeomAPI_AISObject::setColor(const int& theColor)
{
Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
if (anAIS.IsNull())
return;
Quantity_Color aColor((Quantity_NameOfColor) theColor);
- anAIS->SetColor(aColor);
Handle(AIS_Dimension) aDimAIS = Handle(AIS_Dimension)::DownCast(anAIS);
if (!aDimAIS.IsNull()) {
aDimAIS->DimensionAspect()->SetCommonColor(aColor);
}
+ Handle(AIS_InteractiveContext) aContext = anAIS->GetContext();
+ aContext->SetColor(anAIS, aColor, false);
}
-void GeomAPI_AISObject::setWidth(const double& theWidth)
+bool GeomAPI_AISObject::setWidth(const double& theWidth)
{
+ bool isChanged = false;
Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
- if (anAIS.IsNull())
- return;
- anAIS->SetWidth(theWidth);
+ if (!anAIS.IsNull()) {
+ isChanged = anAIS->Width() != theWidth;
+ if (isChanged)
+ anAIS->SetWidth(theWidth);
+ }
+ return isChanged;
}
-void GeomAPI_AISObject::setColor(int theR, int theG, int theB)
+bool GeomAPI_AISObject::setColor(int theR, int theG, int theB)
{
Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
if (anAIS.IsNull())
- return;
+ return false;
Quantity_Color aColor(theR / 255., theG / 255., theB / 255., Quantity_TOC_RGB);
- anAIS->SetColor(aColor);
+ Quantity_Color aCurrentColor;
+ anAIS->Color(aCurrentColor);
+ // do not set the same color to the presentation
+ if (aColor.IsEqual(aCurrentColor))
+ return false;
+
Handle(AIS_Dimension) aDimAIS = Handle(AIS_Dimension)::DownCast(anAIS);
if (!aDimAIS.IsNull()) {
aDimAIS->DimensionAspect()->SetCommonColor(aColor);
}
+ Handle(AIS_InteractiveContext) aContext = anAIS->GetContext();
+ aContext->SetColor(anAIS, aColor, false);
+ return true;
+}
+
+void GeomAPI_AISObject::getColor(int& theR, int& theG, int& theB)
+{
+ Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+ if (anAIS.IsNull())
+ return;
+
+ Quantity_Color aColor = anAIS->Color();
+ theR = (int)(aColor.Red()*255.);
+ theG = (int)(aColor.Green()*255.);
+ theB = (int)(aColor.Blue()*255.);
}
bool GeomAPI_AISObject::empty() const
return false;
}
+int GeomAPI_AISObject::getShapeType() const
+{
+ Handle(AIS_InteractiveObject) anAIS = const_cast<GeomAPI_AISObject*>(this)
+ ->impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull()) {
+ Handle(AIS_Shape) aAISShape = Handle(AIS_Shape)::DownCast(anAIS);
+ if (!aAISShape.IsNull()) {
+ const TopoDS_Shape aShape = aAISShape->Shape();
+ if (!aShape.IsNull())
+ return aShape.ShapeType();
+ }
+ }
+ return -1;
+}
+
+void GeomAPI_AISObject::setPointMarker(int theType, double theScale)
+{
+ Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull()) {
+ Handle(Prs3d_Drawer) aDrawer = anAIS->Attributes();
+ if (aDrawer->HasOwnPointAspect()) {
+ Handle(Prs3d_PointAspect) aPA = aDrawer->PointAspect();
+ aPA->SetTypeOfMarker((Aspect_TypeOfMarker)theType);
+ aPA->SetScale(theScale);
+ } else {
+ Quantity_NameOfColor aCol = Quantity_NOC_YELLOW;
+ aDrawer->SetPointAspect(new Prs3d_PointAspect((Aspect_TypeOfMarker)theType, aCol, theScale));
+ }
+ }
+}
+
+bool GeomAPI_AISObject::setLineStyle(int theStyle)
+{
+ bool isChanged = false;
+ Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull()) {
+ Handle(Prs3d_Drawer) aDrawer = anAIS->Attributes();
+ Handle(Prs3d_LineAspect) aLineAspect;
+
+ Aspect_TypeOfLine aType = (Aspect_TypeOfLine)theStyle;
+ if (aDrawer->HasOwnLineAspect()) {
+ aLineAspect = aDrawer->LineAspect();
+ }
+ if (aDrawer->HasOwnWireAspect()) {
+ aLineAspect = aDrawer->WireAspect();
+ }
+ Quantity_Color aCurrentColor;
+ Aspect_TypeOfLine aCurrentType;
+ Standard_Real aCurrentWidth;
+ aLineAspect->Aspect()->Values(aCurrentColor, aCurrentType, aCurrentWidth);
+ isChanged = aType != aCurrentType;
+ if (isChanged) {
+ aLineAspect->SetTypeOfLine(aType);
+ }
+ }
+ return isChanged;
+}
+
+bool GeomAPI_AISObject::setTransparensy(double theVal)
+{
+ bool isChanged = false;
+ Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull()) {
+ Handle(AIS_InteractiveContext) aContext = anAIS->GetContext();
+ if (!aContext.IsNull()) {
+ double aCurrentValue = anAIS->Transparency();
+ isChanged = aCurrentValue != theVal;
+ if (isChanged)
+ aContext->SetTransparency(anAIS, theVal, false);
+ } else {
+ anAIS->SetTransparency(theVal);
+ }
+ }
+ return isChanged;
+}