+
+ bool isNewSection = !isPrevious || isPrevClosed || anIsEdgeClosed || prevSectType != aSectionType;
+ //DEBTRACE(isNewSection <<": " << !isPrevious << " " << isPrevClosed << " " << anIsEdgeClosed << " " << (prevSectType != aSectionType));
+
+ HYDROData_PolylineXY::PointsList aPointsList;
+ if (!isNewSection)
+ {
+ aPointsList = prevPointList;
+ }
+
+ if( aSectionType == HYDROData_PolylineXY::SECTION_POLYLINE )
+ {
+ //DEBTRACE("SECTION_POLYLINE");
+ Handle(Geom_Line) aGeomLine = Handle(Geom_Line)::DownCast( anEdgeGeomCurve );
+
+ gp_Pnt aFirstPoint, aLastPoint;
+ aGeomLine->D0( aFirst, aFirstPoint );
+ aGeomLine->D0( aLast, aLastPoint );
+ HYDROData_PolylineXY::Point aSectFirstPoint( aFirstPoint.X(), aFirstPoint.Y() );
+ HYDROData_PolylineXY::Point aSectLastPoint( aLastPoint.X(), aLastPoint.Y() );
+ if (!isNewSection)
+ {
+ if (aSectFirstPoint == prevPointList.Last())
+ {
+ //DEBTRACE("points shared: a");//aPointsList.Append( aSectFirstPoint );
+ aPointsList.Append( aSectLastPoint );
+ }
+ else if (aSectLastPoint == prevPointList.Last())
+ {
+ //DEBTRACE("points shared: b");//aPointsList.Append( aSectLastPoint );
+ aPointsList.Append( aSectFirstPoint );
+ }
+ else if (aSectFirstPoint == prevPointList.First())
+ {
+ //DEBTRACE("points shared: c");//aPointsList.Prepend( aSectFirstPoint );
+ aPointsList.Prepend( aSectLastPoint );
+ }
+ else if (aSectLastPoint == prevPointList.First())
+ {
+ //DEBTRACE("points shared: d");//aPointsList.Prepend( aSectLastPoint );
+ aPointsList.Prepend( aSectFirstPoint );
+ }
+ else
+ {
+ //DEBTRACE("no point shared")
+ isNewSection = true; // no point shared, new section
+ aPointsList.Clear();
+ aPointsList.Append( aSectFirstPoint );
+ aPointsList.Append( aSectLastPoint );
+ }
+ }
+ else
+ {
+ //DEBTRACE("new section");
+ aPointsList.Append( aSectFirstPoint );
+ aPointsList.Append( aSectLastPoint );
+ }
+ }
+ else // aSectionType == HYDROData_PolylineXY::SECTION_SPLINE
+ {
+ //DEBTRACE("SECTION_SPLINE");
+ isNewSection = true;
+ aPointsList.Clear();
+
+ BRepAdaptor_Curve anAdaptorCurve(theEdge);
+ if (theOldPolyline.IsNull()) // --- no previous polyline: build a set of points from scratch for the spline
+ {
+ GCPnts_QuasiUniformDeflection aDiscrete(anAdaptorCurve, theDeflection);
+
+ int aNbPoints = aDiscrete.NbPoints();
+
+ // Decrease the number of imported poles because of last one
+ // pole is the closing point which are the start point
+ if (anIsEdgeClosed)
+ aNbPoints--;
+
+ for (int i = 1; i <= aNbPoints; ++i)
+ {
+ const gp_Pnt& aPoint = aDiscrete.Value(i);
+ HYDROData_PolylineXY::Point aSectPoint(aPoint.X(), aPoint.Y());
+ aPointsList.Append(aSectPoint);
+ }
+
+ gp_Pnt endPts[] = {gp_Pnt(aPointsList.First().X(),aPointsList.First().Y(), 0),
+ gp_Pnt(aPointsList.Last().X(),aPointsList.Last().Y(), 0) };
+ //DEBTRACE("curve start: "<< endPts[0].X() << " " << endPts[0].Y());
+ //DEBTRACE("curve end: "<< endPts[1].X() << " " << endPts[1].Y());
+ }
+ else // --- split of a previous polyline: try to retrieve old sets of points and add intersection points
+ {
+ const gp_Pnt aEndPs[] = { anAdaptorCurve.Value(anAdaptorCurve.FirstParameter()).XYZ(),
+ anAdaptorCurve.Value(anAdaptorCurve.LastParameter()).XYZ() };
+ double midPar = (anAdaptorCurve.LastParameter() + anAdaptorCurve.FirstParameter())/2;
+ gp_Pnt midPnt;
+ anAdaptorCurve.D0(midPar, midPnt);
+ //DEBTRACE("curve first point: " << aEndPs[0].X() << " " << aEndPs[0].Y() << " " << aEndPs[0].Z());
+ //DEBTRACE("curve last point: " << aEndPs[1].X() << " " << aEndPs[1].Y() << " " << aEndPs[1].Z());
+ //DEBTRACE("curve mid point: " << midPnt.X() << " " << midPnt.Y() << " " << midPnt.Z());
+
+ std::vector<TopoDS_Wire> aCurves;
+ HYDROData_PolylineOperator::GetWires(theOldPolyline, aCurves);
+
+ int nbSections = theOldPolyline->NbSections();
+ //DEBTRACE("nbSections: "<< nbSections << ", nbCurves: " << aCurves.size() );
+ for (int isec = 0; isec < nbSections; isec++)
+ {
+ //DEBTRACE("section: "<< isec);
+ bool isOldSectionclosed = theOldPolyline->IsClosedSection(isec);
+ TopoDS_Wire aWire = aCurves[isec]; // we suppose sections and wires are in the same order
+ TopExp_Explorer anExp(aWire, TopAbs_EDGE);
+ TopoDS_Edge anEdge = TopoDS::Edge(anExp.Current()); // the first is OK: only one normally with splines
+ BRepAdaptor_Curve adaptorOldCurve(anEdge);
+ double pfirst = adaptorOldCurve.FirstParameter();
+ double plast = adaptorOldCurve.LastParameter();
+ //DEBTRACE("previous curve first last : "<< pfirst << " " << plast);
+ double p[3] = {-1, -1};
+ double d0= ProjectPointToCurve(aEndPs[0].XYZ(), adaptorOldCurve,p[0]);
+ double d1= ProjectPointToCurve(aEndPs[1].XYZ(), adaptorOldCurve,p[1]);
+ double d2= ProjectPointToCurve(midPnt.XYZ(), adaptorOldCurve, p[2]);
+ //DEBTRACE("d0: "<<d0<<" d1: "<<d1<<" d2: "<<d2<<" p0: "<<p[0]<<" p1: "<<p[1]<<" p2: "<<p[2]);
+ if ((d0 < 1.e-3) && (d1 < 1.e-3) && (d2 < 1.e-3)) // we got the good old curve (and the good section)
+ {
+ double pmin = p[0];
+ double pmax = p[1];
+ bool forward = true;
+ //DEBTRACE("isOldSectionclosed: " << isOldSectionclosed);
+ if (!isOldSectionclosed) // no need to check first and last points on an open curve
+ {
+ if (pmin > pmax)
+ {
+ pmin = p[1];
+ pmax = p[0];
+ forward = false;
+ }
+ }
+ else // old section closed: check if we use first or last points...
+ {
+ if((pmin < pmax) && ((abs(pmin - pfirst)> 1.e-3) && (abs(pmax - plast) >1.e-3))) // internal points forward
+ forward = true;
+ else if ((pmin > pmax) && ((abs(pmin - plast)> 1.e-3) && (abs(pmax - pfirst) >1.e-3))) // internal points reverse
+ {
+ pmin = p[1];
+ pmax = p[0];
+ forward = false;
+ }
+ else if ((abs(pmin - plast) <1.e-3) && (p[2] < pmax)) // forward, replace pmin par pfirst
+ pmin = pfirst;
+ else if ((abs(pmin - plast) <1.e-3) && (p[2] > pmax)) // reverse
+ {
+ pmin = p[1];
+ pmax = p[0];
+ forward = false;
+ }
+ else if ((abs(pmax - pfirst) <1.e-3) && (p[2] < pmin)) // reverse
+ {
+ pmin = p[1];
+ pmax = p[0];
+ forward = false;
+ }
+ else if ((abs(pmax - pfirst) <1.e-3) && (p[2] > pmin)) // forward, replace pmax par plast
+ pmax = plast;
+ }
+ //DEBTRACE("forward: "<< forward << " pmin " << pmin << " pmax " << pmax);
+ HYDROData_PolylineXY::Point aFirstPoint, aLastPoint;
+ if (forward)
+ {
+ aFirstPoint = HYDROData_PolylineXY::Point(aEndPs[0].X(), aEndPs[0].Y());
+ aLastPoint = HYDROData_PolylineXY::Point(aEndPs[1].X(), aEndPs[1].Y());
+ }
+ else
+ {
+ aFirstPoint = HYDROData_PolylineXY::Point(aEndPs[1].X(), aEndPs[1].Y());
+ aLastPoint = HYDROData_PolylineXY::Point(aEndPs[0].X(), aEndPs[0].Y());
+ }
+ aPointsList.Append(aFirstPoint);
+
+ HYDROData_PolylineXY::PointsList aSectPoints = theOldPolyline->GetPoints(isec, false);
+ int nbPoints = aSectPoints.Length();
+ //DEBTRACE("nbPoints " << nbPoints);
+ if (forward)
+ for (int i=1; i<=nbPoints; i++)
+ {
+ HYDROData_PolylineXY::Point aPoint = aSectPoints.Value(i);
+ gp_XYZ p(aPoint.X(), aPoint.Y(), 0);
+ double param =-1;
+ double d = ProjectPointToCurve(p, adaptorOldCurve, param);
+ if ((param > pmin) && (param < pmax))
+ {
+ //DEBTRACE("param: " << param);
+ aPointsList.Append(aPoint);
+ }
+ }
+ else
+ for (int i=nbPoints; i>0; i--)
+ {
+ HYDROData_PolylineXY::Point aPoint = aSectPoints.Value(i);
+ gp_XYZ p(aPoint.X(), aPoint.Y(), 0);
+ double param =-1;
+ double d = ProjectPointToCurve(p, adaptorOldCurve, param);
+ if ((param > pmin) && (param < pmax))
+ {
+ //DEBTRACE("param: " << param);
+ aPointsList.Append(aPoint);
+ }
+ }
+
+ aPointsList.Append(aLastPoint);
+ }
+
+ }
+ }
+ }
+
+ if ( aPointsList.IsEmpty() )
+ return false;
+
+ TCollection_AsciiString aSectName = getUniqueSectionName( theSectNames );
+ if (isNewSection)
+ {
+ //DEBTRACE("isNewSection");
+ theSectNames.Append( aSectName );
+ theSectTypes.Append( aSectionType );
+ theSectClosures.Append( anIsEdgeClosed );
+ theSectPoints.Append( aPointsList );
+ }
+ else
+ {
+ //DEBTRACE("sameSection");
+ theSectPoints.SetValue(theSectPoints.Length(), aPointsList);
+ }
+
+ return true;
+}
+
+bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape,
+ bool IsInterpolationAllowed,
+ const Handle( HYDROData_PolylineXY )& theOldPolyline,
+ bool IsClosureAllowed,
+ double theDeviation )
+{
+ //DEBTRACE("ImportShape");
+ if ( theShape.IsNull() )
+ return false;
+
+ //std::string brepName = this->GetName().toStdString();
+ //brepName += ".brep";
+ //BRepTools::Write( theShape, brepName.c_str() );
+
+ RemoveSections();
+
+ bool anIsCanBeImported = false;
+
+ NCollection_Sequence<TCollection_AsciiString> aSectNames;
+ NCollection_Sequence<SectionType> aSectTypes;
+ NCollection_Sequence<bool> aSectClosures;
+ NCollection_Sequence<PointsList> aSectPoints;
+
+ if ( theShape.ShapeType() == TopAbs_EDGE )
+ {
+ //DEBTRACE("TopAbs_EDGE");
+ TopoDS_Edge anEdge = TopoDS::Edge( theShape );
+// anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes,
+// aSectClosures, aSectPoints, true, IsInterpolationAllowed, theDeviation );
+ anIsCanBeImported = convertEdgesToSections( anEdge, aSectNames, aSectTypes, aSectClosures,
+ aSectPoints, IsClosureAllowed, IsInterpolationAllowed,
+ theDeviation, theOldPolyline );