mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-02-19 04:53:06 +05:00
Fix for issue 21992
This commit is contained in:
parent
0636efd36c
commit
3a8ba583ab
@ -134,91 +134,16 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const
|
|||||||
for (; It.More(); It.Next()) {
|
for (; It.More(); It.Next()) {
|
||||||
Scurrent = It.Value();
|
Scurrent = It.Value();
|
||||||
if (Scurrent.ShapeType() != TopAbs_EDGE) {
|
if (Scurrent.ShapeType() != TopAbs_EDGE) {
|
||||||
Handle(Geom_BSplineCurve) newC;
|
TopoDS_Edge NewEdge;
|
||||||
if (Scurrent.ShapeType() == TopAbs_WIRE) {
|
if (Scurrent.ShapeType() == TopAbs_WIRE)
|
||||||
TColgp_SequenceOfPnt PntSeq;
|
{
|
||||||
// collect points
|
const TopoDS_Wire& CurWire = TopoDS::Wire(Scurrent);
|
||||||
for (Ex.Init(Scurrent, TopAbs_EDGE); Ex.More(); Ex.Next()) {
|
NewEdge = BRepAlgo::ConcatenateWireC0(CurWire);
|
||||||
TopoDS_Edge E = TopoDS::Edge(Ex.Current());
|
|
||||||
if (BRep_Tool::Degenerated(E)) continue;
|
|
||||||
C = BRep_Tool::Curve(E, First, Last);
|
|
||||||
if( E.Orientation() == TopAbs_REVERSED ) {
|
|
||||||
C->Reverse();
|
|
||||||
}
|
|
||||||
Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C);
|
|
||||||
while( !tc.IsNull() ) {
|
|
||||||
C = tc->BasisCurve();
|
|
||||||
tc = Handle(Geom_TrimmedCurve)::DownCast(C);
|
|
||||||
}
|
|
||||||
int nbp = 10;
|
|
||||||
if( C->IsKind(STANDARD_TYPE(Geom_Line)) ) {
|
|
||||||
nbp = 4;
|
|
||||||
}
|
|
||||||
else if( C->IsKind(STANDARD_TYPE(Geom_Circle)) ||
|
|
||||||
C->IsKind(STANDARD_TYPE(Geom_Ellipse)) ) {
|
|
||||||
nbp = (int)25*fabs(Last-First)/(2.*M_PI);
|
|
||||||
}
|
|
||||||
else if( C->IsKind(STANDARD_TYPE(Geom_BezierCurve)) ) {
|
|
||||||
Handle(Geom_BezierCurve) C3d = Handle(Geom_BezierCurve)::DownCast(C);
|
|
||||||
nbp = C3d->NbPoles();
|
|
||||||
}
|
|
||||||
else if( C->IsKind(STANDARD_TYPE(Geom_BSplineCurve)) ) {
|
|
||||||
Handle(Geom_BSplineCurve) C3d = Handle(Geom_BSplineCurve)::DownCast(C);
|
|
||||||
nbp = C3d->NbPoles();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
}
|
|
||||||
if( nbp<4 ) nbp = 4;
|
|
||||||
double dp = (Last-First)/(nbp-1);
|
|
||||||
for(int i=1; i<nbp; i++) {
|
|
||||||
gp_Pnt P;
|
|
||||||
C->D0(First+dp*(i-1),P);
|
|
||||||
PntSeq.Append(P);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// add last point
|
|
||||||
gp_Pnt P;
|
|
||||||
C->D0(Last,P);
|
|
||||||
PntSeq.Append(P);
|
|
||||||
// create BSpline
|
|
||||||
if(PntSeq.Length()>1) {
|
|
||||||
TColgp_Array1OfPnt Pnts(1,PntSeq.Length());
|
|
||||||
// check orientation of wire
|
|
||||||
if( Scurrent.Orientation() == TopAbs_REVERSED ) {
|
|
||||||
for(int i=1; i<=PntSeq.Length(); i++) {
|
|
||||||
Pnts.SetValue(PntSeq.Length()-i+1,PntSeq.Value(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(int i=1; i<=PntSeq.Length(); i++) {
|
|
||||||
Pnts.SetValue(i,PntSeq.Value(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GeomAPI_PointsToBSpline PTB (Pnts);
|
|
||||||
newC = Handle(Geom_BSplineCurve)::DownCast(PTB.Curve());
|
|
||||||
// set periodic flag if curve is closed
|
|
||||||
//if( newC->IsClosed() ) {
|
|
||||||
// newC->SetPeriodic();
|
|
||||||
//}
|
|
||||||
// create edge
|
|
||||||
double fp = newC->FirstParameter();
|
|
||||||
double lp = newC->FirstParameter();
|
|
||||||
gp_Pnt PF,PL;
|
|
||||||
newC->D0(fp,PF);
|
|
||||||
newC->D0(lp,PL);
|
|
||||||
TopoDS_Vertex VF,VL;
|
|
||||||
B.MakeVertex(VF,PF,1.e-7);
|
|
||||||
B.MakeVertex(VL,PL,1.e-7);
|
|
||||||
TopoDS_Edge newE;
|
|
||||||
B.MakeEdge(newE,newC,1.e-7);
|
|
||||||
B.Add(newE,VF);
|
|
||||||
B.Add(newE,VL.Reversed());
|
|
||||||
Scurrent = newE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (newC.IsNull()) {
|
if (NewEdge.IsNull()) {
|
||||||
Standard_ConstructionError::Raise("The argument compound must contain only edges");
|
Standard_ConstructionError::Raise("The argument compound must contain only edges");
|
||||||
}
|
}
|
||||||
|
Scurrent = NewEdge;
|
||||||
}
|
}
|
||||||
B.Add(aComp,Scurrent);
|
B.Add(aComp,Scurrent);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user