X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_ViewerFilters.cpp;h=70b885f451047bdd8fe1d487169c19824e0a2443;hb=f64cb187ce9ab2190d8eff7c9be7dcfffc4242a0;hp=03d24a4693071b58352a3828cabaca3ca25f6a16;hpb=15ba08856f0c39d49e92d37bcd97d1f6ec40c577;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_ViewerFilters.cpp b/src/ModuleBase/ModuleBase_ViewerFilters.cpp index 03d24a469..70b885f45 100644 --- a/src/ModuleBase/ModuleBase_ViewerFilters.cpp +++ b/src/ModuleBase/ModuleBase_ViewerFilters.cpp @@ -1,9 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ModuleBase_ViewerFilters.cpp -// Created: 07 Okt 2014 -// Author: Vitaly SMETANNIKOV - +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "ModuleBase_ViewerFilters.h" #include "ModuleBase_IWorkshop.h" @@ -87,7 +99,10 @@ Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk( if (myPlane.get()) { aValid = Standard_False; - if (theOwner->HasSelectable()) { + // selectable may be empty if the object is selected in Object Browser and is not visualized + // in the viewer(virtual owner is created for this case) + //if (theOwner->HasSelectable()) + { gp_Pln aPlane = myPlane->impl(); Handle(StdSelect_BRepOwner) aShapeOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner); if (!aShapeOwner.IsNull() && aShapeOwner->HasShape()) { @@ -112,50 +127,37 @@ Standard_Boolean ModuleBase_ShapeInPlaneFilter::IsOk( break; } } else { - // Check Trihedron sub-objects - Handle(SelectMgr_SelectableObject) aSelObj = theOwner->Selectable(); - Handle(Standard_Type) aType = aSelObj->DynamicType(); -#ifdef BEFORE_TRIHEDRON_PATCH - if (aType == STANDARD_TYPE(AIS_Axis)) { - Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(aSelObj); - gp_Lin aLine = aAxis->Component()->Lin(); - return aPlane.Contains(aLine, Precision::Confusion(), Precision::Angular()); - - } else if (aType == STANDARD_TYPE(AIS_Point)) { - Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(aSelObj); - return aPlane.Distance(aPoint->Component()->Pnt()) < Precision::Confusion(); - - } else if (aType == STANDARD_TYPE(AIS_Plane)) { - Handle(AIS_Plane) aAisPlane = Handle(AIS_Plane)::DownCast(aSelObj); - gp_Pln aPln = aAisPlane->Component()->Pln(); - return aPlane.Distance(aPln) < Precision::Confusion(); - } -#else - if (aType == STANDARD_TYPE(AIS_Trihedron)) { - Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aSelObj); - Handle(AIS_TrihedronOwner) aTrOwner = Handle(AIS_TrihedronOwner)::DownCast(theOwner); - if (!aTrOwner.IsNull()) - { - const Prs3d_DatumParts& aPart = aTrOwner->DatumPart(); - if (aPart >= Prs3d_DP_XAxis && aPart <= Prs3d_DP_ZAxis) - { - Handle(Prs3d_Drawer) aDrawer = aTrihedron->Attributes(); - Handle(Prs3d_DatumAspect) aDatumAspect = aDrawer->DatumAspect(); - Handle(Graphic3d_ArrayOfPrimitives) aPrimitives = - aDatumAspect->ArrayOfPrimitives(aPart); - Standard_Real aX1, anY1, aZ1, aX2, anY2, aZ2; - aPrimitives->Vertice(1, aX1, anY1, aZ1); - aPrimitives->Vertice(2, aX2, anY2, aZ2); - gp_Pnt aPnt1(aX1, anY1, aZ1); - gp_Pnt aPnt2(aX2, anY2, aZ2); - gp_Lin aLine(aPnt1, gp_Dir(gp_Vec(aPnt1, aPnt2))); - return aPlane.Contains(aLine, Precision::Confusion(), Precision::Angular()); + if (theOwner->HasSelectable()) { + // Check Trihedron sub-objects + Handle(SelectMgr_SelectableObject) aSelObj = theOwner->Selectable(); + Handle(Standard_Type) aType = aSelObj->DynamicType(); + if (aType == STANDARD_TYPE(AIS_Trihedron)) { + Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aSelObj); + Handle(AIS_TrihedronOwner) aTrOwner = Handle(AIS_TrihedronOwner)::DownCast(theOwner); + if (!aTrOwner.IsNull()) { + const Prs3d_DatumParts& aPart = aTrOwner->DatumPart(); + if (aPart >= Prs3d_DP_XAxis && aPart <= Prs3d_DP_ZAxis) { + gp_Ax2 anAxis = aTrihedron->Component()->Ax2(); + gp_Dir aDir; + switch (aPart) { + case Prs3d_DP_XAxis: + aDir = anAxis.XDirection(); + break; + case Prs3d_DP_YAxis: + aDir = anAxis.YDirection(); + break; + case Prs3d_DP_ZAxis: + aDir = anAxis.Direction(); + break; + } + gp_Lin aLine(aTrihedron->Component()->Location(), aDir); + return aPlane.Contains(aLine, Precision::Confusion(), Precision::Angular()); + } } } + // This is not object controlled by the filter + aValid = Standard_True; } -#endif - // This is not object controlled by the filter - aValid = Standard_True; } } }