X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_AISObject.cpp;h=8a3852baaf49ccff4263c87bdf511a44d6f71c16;hb=bdbfb368d71ed11cc0391354a7d86c880cd94949;hp=74c1e1344d81dc480eccc437576e87e86785fb4d;hpb=42d8ecf39798c037945ca4bb9073d8dc31c53008;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_AISObject.cpp b/src/GeomAPI/GeomAPI_AISObject.cpp index 74c1e1344..8a3852baa 100644 --- a/src/GeomAPI/GeomAPI_AISObject.cpp +++ b/src/GeomAPI/GeomAPI_AISObject.cpp @@ -44,7 +44,7 @@ GeomAPI_AISObject::GeomAPI_AISObject() GeomAPI_AISObject::~GeomAPI_AISObject() { if (!empty()) { - // This is necessary for correct deletion of Handle entity. + // This is necessary for correct deletion of Handle entity. // Without this Handle does not decremented counter to 0 Handle(AIS_InteractiveObject) *anAIS = implPtr(); anAIS->Nullify(); @@ -75,7 +75,7 @@ void GeomAPI_AISObject::createShape(std::shared_ptr theShape) // Set default point as a '+' symbol Handle(AIS_Shape) aShape = new AIS_Shape(aTDS); Handle(Prs3d_Drawer) aDrawer = aShape->Attributes(); - if (aDrawer->HasOwnPointAspect()) + if (aDrawer->HasOwnPointAspect()) aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS); else aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.)); @@ -181,7 +181,7 @@ void GeomAPI_AISObject::createRadius(std::shared_ptr theCircle, // TODO: a bug in AIS_RadiusDimension: // The anchor point can't be myCirc.Location() - an exception is raised. // But we need exactly this case... - // We want to show a radius dimension starting from the circle centre and + // We want to show a radius dimension starting from the circle centre and // ending at the user-defined point. // Also, if anchor point coincides with myP2, the radius dimension is not displayed at all. std::shared_ptr anAnchor = theCircle->project(theFlyoutPoint); @@ -316,7 +316,10 @@ void GeomAPI_AISObject::setColor(const int& theColor) aDimAIS->DimensionAspect()->SetCommonColor(aColor); } Handle(AIS_InteractiveContext) aContext = anAIS->GetContext(); - aContext->SetColor(anAIS, aColor, false); + if (!aContext.IsNull()) + aContext->SetColor(anAIS, aColor, false); + else + anAIS->SetColor(aColor); } double GeomAPI_AISObject::width() @@ -358,7 +361,10 @@ bool GeomAPI_AISObject::setColor(int theR, int theG, int theB) aDimAIS->DimensionAspect()->SetCommonColor(aColor); } Handle(AIS_InteractiveContext) aContext = anAIS->GetContext(); - aContext->SetColor(anAIS, aColor, false); + if (!aContext.IsNull()) + aContext->SetColor(anAIS, aColor, false); + else + anAIS->SetColor(aColor); return true; } @@ -379,13 +385,20 @@ bool GeomAPI_AISObject::setDeflection(const double theDeflection) bool isModified = false; Handle(AIS_InteractiveObject) anAIS = impl(); if (!anAIS.IsNull()) { - Handle(Prs3d_Drawer) aDrawer = anAIS->Attributes(); - if (fabs(aDrawer->DeviationCoefficient() - theDeflection) > Precision::Confusion()) { - aDrawer->SetDeviationCoefficient(theDeflection); - isModified = true; + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); + if (!anAISShape.IsNull()) { + Standard_Real aCoefficient, aPreviousCoefficient; + anAISShape->OwnDeviationCoefficient(aCoefficient, aPreviousCoefficient); + if (fabs(aCoefficient-theDeflection) > Precision::Confusion()) { + isModified = true; + anAISShape->SetOwnDeviationCoefficient(theDeflection); + // redisplay is necessary here to update presentation in all modes + // Standard True flag. Displayer uses Standard False flag. If it will be changed in + // displayer, redisplay here will not be necessary. But performance should be checked. + anAISShape->Redisplay(Standard_True); + } } } - return isModified; } @@ -457,13 +470,13 @@ bool GeomAPI_AISObject::setLineStyle(int theStyle) 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); + if (!aLineAspect.IsNull()) { + Handle(Graphic3d_AspectLine3d) aGraphicAspect = aLineAspect->Aspect(); + Aspect_TypeOfLine aCurrentType = aGraphicAspect->Type(); + isChanged = aType != aCurrentType; + if (isChanged) { + aLineAspect->SetTypeOfLine(aType); + } } } return isChanged;