Implementation improvements and refactoring in PlaneOfWire() function.
BRepLib_FindSurface findPlanarSurf;
Handle(Geom_Surface) S;
TopLoc_Location L;
BRepLib_FindSurface findPlanarSurf;
Handle(Geom_Surface) S;
TopLoc_Location L;
- BRepGProp::LinearProperties(W,GP);
- gp_Pnt Bary = GP.CentreOfMass();
+ gp_Pnt Bary;
+ Standard_Boolean isBaryDefined = Standard_False;
// shielding for particular cases : only one edge circle or ellipse
// on a closed wire !
// shielding for particular cases : only one edge circle or ellipse
// on a closed wire !
- Standard_Integer nbEdges = 0;
- BRepTools_WireExplorer anExp;
- anExp.Init(W);
Standard_Boolean wClosed = W.Closed();
Standard_Boolean wClosed = W.Closed();
// it is checked if the vertices are the same.
TopoDS_Vertex V1, V2;
TopExp::Vertices(W,V1,V2);
if ( V1.IsSame(V2)) wClosed = Standard_True;
}
// it is checked if the vertices are the same.
TopoDS_Vertex V1, V2;
TopExp::Vertices(W,V1,V2);
if ( V1.IsSame(V2)) wClosed = Standard_True;
}
- TopoDS_Edge Edge = TopoDS::Edge(anExp.Current());
- Standard_Real first, last;
- Handle(Geom_Curve) curv = BRep_Tool::Curve(Edge, first, last);
- if (wClosed) {
- GeomAdaptor_Curve AdC;
- AdC.Load(curv);
- for(; anExp.More(); anExp.Next()) {
+
+ if (wClosed)
+ {
+ Standard_Integer nbEdges = 0;
+ TopoDS_Iterator anIter;
+ anIter.Initialize(W);
+ for(; anIter.More(); anIter.Next())
+
+ if(nbEdges == 1)
+ {
+ GeomAdaptor_Curve AdC;
+ Standard_Real first, last;
+ anIter.Initialize(W);
+ AdC.Load(BRep_Tool::Curve(TopoDS::Edge(anIter.Value()), first, last));
+
+ if (AdC.GetType() == GeomAbs_Circle)
+ {
+ Bary = AdC.Circle().Location();
+ isBaryDefined = Standard_True;
+ }
+
+ if (AdC.GetType() == GeomAbs_Ellipse)
+ {
+ Bary = AdC.Ellipse().Location();
+ isBaryDefined = Standard_True;
+ }
- if ( nbEdges==1 && AdC.GetType() == GeomAbs_Circle ) {
- Bary = AdC.Circle().Location();
- }
- if ( nbEdges==1 && AdC.GetType() == GeomAbs_Ellipse ) {
- Bary = AdC.Ellipse().Location();
- }
+ }
+
+ if (!isBaryDefined)
+ {
+ BRepGProp::LinearProperties(W,GP);
+ Bary = GP.CentreOfMass();
}
findPlanarSurf.Init(W, -1, Standard_True);
}
findPlanarSurf.Init(W, -1, Standard_True);
- if ( findPlanarSurf.Found()) {
+ if ( findPlanarSurf.Found())
+ {
S = findPlanarSurf.Surface();
L = findPlanarSurf.Location();
if (!L.IsIdentity()) S = Handle(Geom_Surface)::
S = findPlanarSurf.Surface();
L = findPlanarSurf.Location();
if (!L.IsIdentity()) S = Handle(Geom_Surface)::
P = (Handle(Geom_Plane)::DownCast(S))->Pln();
P.SetLocation(Bary);
}
P = (Handle(Geom_Plane)::DownCast(S))->Pln();
P.SetLocation(Bary);
}
// wire not plane !
GProp_PrincipalProps Pp = GP.PrincipalProperties();
gp_Vec Vec;
// wire not plane !
GProp_PrincipalProps Pp = GP.PrincipalProperties();
gp_Vec Vec;
Pp.RadiusOfGyration(R1,R2,R3);
Standard_Real RMax = Max(Max(R1,R2),R3);
if ( ( Abs(RMax-R1)<Tol && Abs(RMax-R2)<Tol )
Pp.RadiusOfGyration(R1,R2,R3);
Standard_Real RMax = Max(Max(R1,R2),R3);
if ( ( Abs(RMax-R1)<Tol && Abs(RMax-R2)<Tol )
- || ( Abs(RMax-R1)<Tol && Abs(RMax-R3)<Tol )
- || ( Abs(RMax-R2)<Tol && Abs(RMax-R3)<Tol ) )
+ || ( Abs(RMax-R1)<Tol && Abs(RMax-R3)<Tol )
+ || ( Abs(RMax-R2)<Tol && Abs(RMax-R3)<Tol ) )
isplane = Standard_False;
isplane = Standard_False;
- else {
- if (R1>=R2 && R1>=R3) {
- Vec = Pp.FirstAxisOfInertia();
+ else
+ {
+ if (R1>=R2 && R1>=R3)
+ {
+ Vec = Pp.FirstAxisOfInertia();
- else if (R2>=R1 && R2>=R3) {
- Vec = Pp.SecondAxisOfInertia();
+ else if (R2>=R1 && R2>=R3)
+ {
+ Vec = Pp.SecondAxisOfInertia();
- else if (R3>=R1 && R3>=R2) {
- Vec = Pp.ThirdAxisOfInertia();
+ else if (R3>=R1 && R3>=R2)
+ {
+ Vec = Pp.ThirdAxisOfInertia();
- if (R3<=R2 && R3<=R1) {
- Vec = Pp.ThirdAxisOfInertia();
+ if (R3<=R2 && R3<=R1)
+ {
+ Vec = Pp.ThirdAxisOfInertia();
- else if (R2<=R1 && R2<=R3) {
- Vec = Pp.SecondAxisOfInertia();
+ else if (R2<=R1 && R2<=R3)
+ {
+ Vec = Pp.SecondAxisOfInertia();
- else if (R1<=R2 && R1<=R3) {
- Vec = Pp.FirstAxisOfInertia();
+ else if (R1<=R2 && R1<=R3)
+ {
+ Vec = Pp.FirstAxisOfInertia();
}
gp_Dir XDir(Vec);
gp_Ax3 repere(Bary,NDir,XDir);
}
gp_Dir XDir(Vec);
gp_Ax3 repere(Bary,NDir,XDir);