1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

Compare commits

..

7 Commits

Author SHA1 Message Date
mzernova
a425f3ade1 # Check circles nb 2024-09-06 11:50:36 +01:00
mzernova
9b6c641484 # fix cone with holes 2024-09-06 11:50:35 +01:00
Vitaut Tryputsin
8c3471161b #fix cone 2024-09-06 11:50:35 +01:00
mzernova
cacbe65d83 # Add test for cone 2024-09-06 11:50:34 +01:00
mzernova
603a391e9c # Fix cone 2024-09-06 11:50:34 +01:00
mzernova
780f2278a1 # Remarks from @vtryputs 2024-09-06 11:50:33 +01:00
mzernova
75a1e08b63 0033664: Visualization - Selection does not work for simple shape
Fixed direction calculation for Select3D_SensitiveCylinder created from Geom_CylindricalSurface
2024-09-06 11:50:33 +01:00

View File

@@ -565,10 +565,9 @@ void StdSelect_BRepSelectionTool::GetEdgeSensitive (const TopoDS_Shape& theShape
//function : getCylinderCircles
//purpose :
//=======================================================================
static NCollection_Array1<gp_Circ> getCylinderCircles (const TopoDS_Face& theHollowCylinder, Standard_Size& theNumCircles)
static NCollection_Sequence<gp_Circ> getCylinderCircles (const TopoDS_Face& theHollowCylinder)
{
NCollection_Array1<gp_Circ> aCircles (1, 2);
theNumCircles = 0;
NCollection_Sequence<gp_Circ> aCircles;
Standard_Integer aLinesNb = 0;
TopExp_Explorer anEdgeExp;
@@ -581,17 +580,11 @@ static NCollection_Array1<gp_Circ> getCylinderCircles (const TopoDS_Face& theHol
if (anAdaptor.GetType() == GeomAbs_Circle
&& BRep_Tool::IsClosed (anEdge))
{
theNumCircles++;
aCircles[theNumCircles] = anAdaptor.Circle();
aCircles.Append (anAdaptor.Circle());
}
else if (anAdaptor.GetType() != GeomAbs_Line || aLinesNb > 4)
{
theNumCircles = 0;
return NCollection_Array1<gp_Circ>();
}
if (theNumCircles == 2)
{
break;
return NCollection_Sequence<gp_Circ>();
}
}
@@ -644,9 +637,8 @@ Standard_Boolean StdSelect_BRepSelectionTool::GetSensitiveForFace (const TopoDS_
}
else if (Handle(Geom_ConicalSurface) aGeomCone = Handle(Geom_ConicalSurface)::DownCast (aSurf))
{
Standard_Size aNumCircles;
NCollection_Array1<gp_Circ> aCircles = getCylinderCircles (theFace, aNumCircles);
if (aNumCircles > 0 && aNumCircles < 3)
NCollection_Sequence<gp_Circ> aCircles = getCylinderCircles (theFace);
if (aCircles.Size() > 0 && aCircles.Size() < 3)
{
const gp_Cone aCone = BRepAdaptor_Surface (theFace).Cone();
@@ -654,7 +646,7 @@ Standard_Boolean StdSelect_BRepSelectionTool::GetSensitiveForFace (const TopoDS_
Standard_Real aRad1;
Standard_Real aRad2;
Standard_Real aHeight;
if (aNumCircles == 1)
if (aCircles.Size() == 1)
{
aRad1 = 0.0;
aRad2 = aCircles.First().Radius();
@@ -663,14 +655,14 @@ Standard_Boolean StdSelect_BRepSelectionTool::GetSensitiveForFace (const TopoDS_
}
else
{
aRad1 = aCircles.First().Radius();
aRad2 = aCircles.Last().Radius();
aHeight = aCircles.First().Location().Distance (aCircles.Last().Location());
const gp_Pnt aPos = aCircles.First().Location();
const gp_Dir aDirection (aCircles.Last().Location().XYZ() - aPos.XYZ());
aTrsf.SetTransformation (gp_Ax3(aPos, aDirection), gp::XOY());
const gp_Circ& aFirstCircle = aCircles.First();
const gp_Circ& aLastCircle = aCircles.Last();
const gp_Circ& aSmallerCircle = (aFirstCircle.Radius() < aLastCircle.Radius()) ? aFirstCircle : aLastCircle;
const gp_Circ& aLargerCircle = (aFirstCircle.Radius() > aLastCircle.Radius()) ? aFirstCircle : aLastCircle;
aRad1 = aSmallerCircle.Radius();
aRad2 = aLargerCircle.Radius();
aTrsf.SetTranslationPart (aSmallerCircle.Location().XYZ());
}
Handle(Select3D_SensitiveCylinder) aSensSCyl = new Select3D_SensitiveCylinder (theOwner, aRad1, aRad2, aHeight, aTrsf, true);
@@ -680,9 +672,8 @@ Standard_Boolean StdSelect_BRepSelectionTool::GetSensitiveForFace (const TopoDS_
}
else if (Handle(Geom_CylindricalSurface) aGeomCyl = Handle(Geom_CylindricalSurface)::DownCast (aSurf))
{
Standard_Size aNumCircles;
NCollection_Array1<gp_Circ> aCircles = getCylinderCircles (theFace, aNumCircles);
if (aNumCircles == 2)
NCollection_Sequence<gp_Circ> aCircles = getCylinderCircles (theFace);
if (aCircles.Size() == 2)
{
const gp_Cylinder aCyl = BRepAdaptor_Surface (theFace).Cylinder();