1 // Created on: 1996-04-03 2 // Created by: Stagiaire Frederic CALOONE 3 // Copyright (c) 1996-1999 Matra Datavision 4 // Copyright (c) 1999-2014 OPEN CASCADE SAS 5 // 6 // This file is part of Open CASCADE Technology software library. 7 // 8 // This library is free software; you can redistribute it and/or modify it under 9 // the terms of the GNU Lesser General Public License version 2.1 as published 10 // by the Free Software Foundation, with special exception defined in the file 11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 12 // distribution for complete text of the license and disclaimer of any warranty. 13 // 14 // Alternatively, this file may be used under the terms of Open CASCADE 15 // commercial license or contractual agreement. 16 17 #ifndef _GeomPlate_BuildPlateSurface_HeaderFile 18 #define _GeomPlate_BuildPlateSurface_HeaderFile 19 20 #include <Standard.hxx> 21 #include <Standard_DefineAlloc.hxx> 22 #include <Standard_Handle.hxx> 23 24 #include <GeomPlate_HSequenceOfCurveConstraint.hxx> 25 #include <GeomPlate_HArray1OfSequenceOfReal.hxx> 26 #include <GeomPlate_HSequenceOfPointConstraint.hxx> 27 #include <Plate_Plate.hxx> 28 #include <Standard_Boolean.hxx> 29 #include <TColStd_HArray1OfInteger.hxx> 30 #include <Standard_Integer.hxx> 31 #include <Standard_Real.hxx> 32 #include <Extrema_ExtPS.hxx> 33 #include <GeomPlate_HArray1OfHCurve.hxx> 34 #include <TColgp_SequenceOfXY.hxx> 35 #include <TColgp_SequenceOfXYZ.hxx> 36 #include <TColGeom2d_HArray1OfCurve.hxx> 37 #include <TColStd_HArray1OfReal.hxx> 38 class Geom_Surface; 39 class GeomPlate_Surface; 40 class Standard_ConstructionError; 41 class Standard_RangeError; 42 class GeomPlate_CurveConstraint; 43 class GeomPlate_PointConstraint; 44 class gp_Pnt2d; 45 class gp_Pnt; 46 class Geom2d_Curve; 47 class Adaptor3d_HCurve; 48 class Adaptor2d_HCurve2d; 49 class Message_ProgressIndicator; 50 51 52 53 //! This class provides an algorithm for constructing such a plate surface that 54 //! it conforms to given curve and/or point constraints. 55 //! The algorithm accepts or constructs an initial surface 56 //! and looks for a deformation of it satisfying the 57 //! constraints and minimizing energy input. 58 //! A BuildPlateSurface object provides a framework for: 59 //! - defining or setting constraints 60 //! - implementing the construction algorithm 61 //! - consulting the result. 62 class GeomPlate_BuildPlateSurface 63 { 64 public: 65 66 DEFINE_STANDARD_ALLOC 67 68 69 //! Constructor compatible with the old version 70 //! with this constructor the constraint are given in a Array of Curve on Surface 71 //! The array NbPoints contains the number of points for each constraint. 72 //! The Array Tang contains the order of constraint for each Constraint: The possible values for this 73 //! order has to be -1 , 0 , 1 , 2 . Order i means constraint Gi. 74 //! NbIter is the maximum number of iteration to optimise the number of points for resolution 75 //! Degree is the degree of resolution for Plate 76 //! Tol2d is the tolerance used to test if two points of different constraint are identical in the 77 //! parametric space of the initial surface 78 //! Tol3d is used to test if two identical points in the 2d space are identical in 3d space 79 //! TolAng is used to compare the angle between normal of two identical points in the 2d space 80 //! Raises ConstructionError; 81 Standard_EXPORT GeomPlate_BuildPlateSurface(const Handle(TColStd_HArray1OfInteger)& NPoints, const Handle(GeomPlate_HArray1OfHCurve)& TabCurve, const Handle(TColStd_HArray1OfInteger)& Tang, const Standard_Integer Degree, const Standard_Integer NbIter = 3, const Standard_Real Tol2d = 0.00001, const Standard_Real Tol3d = 0.0001, const Standard_Real TolAng = 0.01, const Standard_Real TolCurv = 0.1, const Standard_Boolean Anisotropie = Standard_False); 82 83 Standard_EXPORT GeomPlate_BuildPlateSurface(const Handle(Geom_Surface)& Surf, const Standard_Integer Degree = 3, const Standard_Integer NbPtsOnCur = 10, const Standard_Integer NbIter = 3, const Standard_Real Tol2d = 0.00001, const Standard_Real Tol3d = 0.0001, const Standard_Real TolAng = 0.01, const Standard_Real TolCurv = 0.1, const Standard_Boolean Anisotropie = Standard_False); 84 85 //! Initializes the BuildPlateSurface framework for 86 //! deforming plate surfaces using curve and point 87 //! constraints. You use the first constructor if you have 88 //! an initial surface to work with at construction time. If 89 //! not, you use the second. You can add one later by 90 //! using the method LoadInitSurface. If no initial 91 //! surface is loaded, one will automatically be computed. 92 //! The curve and point constraints will be defined by 93 //! using the method Add. 94 //! Before the call to the algorithm, the curve constraints 95 //! will be transformed into sequences of discrete points. 96 //! Each curve defined as a constraint will be given the 97 //! value of NbPtsOnCur as the average number of points on it. 98 //! Several arguments serve to improve performance of 99 //! the algorithm. NbIter, for example, expresses the 100 //! number of iterations allowed and is used to control the 101 //! duration of computation. To optimize resolution, 102 //! Degree will have the default value of 3. 103 //! The surface generated must respect several tolerance values: 104 //! - 2d tolerance given by Tol2d, with a default value of 0.00001 105 //! - 3d tolerance expressed by Tol3d, with a default value of 0.0001 106 //! - angular tolerance given by TolAng, with a default 107 //! value of 0.01, defining the greatest angle allowed 108 //! between the constraint and the target surface. 109 //! Exceptions 110 //! Standard_ConstructionError if NbIter is less than 1 or Degree is less than 3. 111 Standard_EXPORT GeomPlate_BuildPlateSurface(const Standard_Integer Degree = 3, const Standard_Integer NbPtsOnCur = 10, const Standard_Integer NbIter = 3, const Standard_Real Tol2d = 0.00001, const Standard_Real Tol3d = 0.0001, const Standard_Real TolAng = 0.01, const Standard_Real TolCurv = 0.1, const Standard_Boolean Anisotropie = Standard_False); 112 113 //! Resets all constraints 114 Standard_EXPORT void Init(); 115 116 //! Loads the initial Surface 117 Standard_EXPORT void LoadInitSurface (const Handle(Geom_Surface)& Surf); 118 119 //! Adds the linear constraint cont. 120 Standard_EXPORT void Add (const Handle(GeomPlate_CurveConstraint)& Cont); 121 122 Standard_EXPORT void SetNbBounds (const Standard_Integer NbBounds); 123 124 //! Adds the point constraint cont. 125 Standard_EXPORT void Add (const Handle(GeomPlate_PointConstraint)& Cont); 126 127 128 //! Calls the algorithm and computes the plate surface using 129 //! the loaded constraints. If no initial surface is given, the 130 //! algorithm automatically computes one. 131 //! Exceptions 132 //! Standard_RangeError if the value of the constraint is 133 //! null or if plate is not done. 134 Standard_EXPORT void Perform(const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); 135 136 //! returns the CurveConstraints of order order 137 Standard_EXPORT Handle(GeomPlate_CurveConstraint) CurveConstraint (const Standard_Integer order) const; 138 139 //! returns the PointConstraint of order order 140 Standard_EXPORT Handle(GeomPlate_PointConstraint) PointConstraint (const Standard_Integer order) const; 141 142 Standard_EXPORT void Disc2dContour (const Standard_Integer nbp, TColgp_SequenceOfXY& Seq2d); 143 144 Standard_EXPORT void Disc3dContour (const Standard_Integer nbp, const Standard_Integer iordre, TColgp_SequenceOfXYZ& Seq3d); 145 146 147 //! Tests whether computation of the plate has been completed. 148 Standard_EXPORT Standard_Boolean IsDone() const; 149 150 151 //! Returns the result of the computation. This surface can 152 //! then be used by GeomPlate_MakeApprox for 153 //! converting the resulting surface into a BSpline. 154 Standard_EXPORT Handle(GeomPlate_Surface) Surface() const; 155 156 //! Returns the initial surface 157 Standard_EXPORT Handle(Geom_Surface) SurfInit() const; 158 159 160 //! Allows you to ensure that the array of curves returned by 161 //! Curves2d has the correct orientation. Returns the 162 //! orientation of the curves in the the array returned by 163 //! Curves2d. Computation changes the orientation of 164 //! these curves. Consequently, this method returns the 165 //! orientation prior to computation. 166 Standard_EXPORT Handle(TColStd_HArray1OfInteger) Sense() const; 167 168 169 //! Extracts the array of curves on the plate surface which 170 //! correspond to the curve constraints set in Add. 171 Standard_EXPORT Handle(TColGeom2d_HArray1OfCurve) Curves2d() const; 172 173 174 //! Returns the order of the curves in the array returned by 175 //! Curves2d. Computation changes this order. 176 //! Consequently, this method returns the order of the 177 //! curves prior to computation. 178 Standard_EXPORT Handle(TColStd_HArray1OfInteger) Order() const; 179 180 //! Returns the max distance betwen the result and the constraints 181 Standard_EXPORT Standard_Real G0Error() const; 182 183 //! Returns the max angle betwen the result and the constraints 184 Standard_EXPORT Standard_Real G1Error() const; 185 186 //! Returns the max difference of curvature betwen the result and the constraints 187 Standard_EXPORT Standard_Real G2Error() const; 188 189 //! Returns the max distance between the result and the constraint Index 190 Standard_EXPORT Standard_Real G0Error (const Standard_Integer Index); 191 192 //! Returns the max angle between the result and the constraint Index 193 Standard_EXPORT Standard_Real G1Error (const Standard_Integer Index); 194 195 //! Returns the max difference of curvature between the result and the constraint Index 196 Standard_EXPORT Standard_Real G2Error (const Standard_Integer Index); 197 198 199 200 201 protected: 202 203 204 205 206 207 private: 208 209 210 //! Evaluates the distance, the angle between normals, and the "courbure" 211 //! on middle points of contraints an corresponding points on the GeomPlate_Surface 212 //! the results are given for a curve c 213 Standard_EXPORT void EcartContraintesMil (const Standard_Integer c, Handle(TColStd_HArray1OfReal)& d, Handle(TColStd_HArray1OfReal)& an, Handle(TColStd_HArray1OfReal)& courb); 214 215 Standard_EXPORT gp_Pnt2d ProjectPoint (const gp_Pnt& P); 216 217 Standard_EXPORT Handle(Geom2d_Curve) ProjectCurve (const Handle(Adaptor3d_HCurve)& Curv); 218 219 Standard_EXPORT Handle(Adaptor2d_HCurve2d) ProjectedCurve (Handle(Adaptor3d_HCurve)& Curv); 220 221 Standard_EXPORT void ComputeSurfInit(const Handle(Message_ProgressIndicator) & aProgress); 222 223 Standard_EXPORT void Intersect (Handle(GeomPlate_HArray1OfSequenceOfReal)& PntInter, Handle(GeomPlate_HArray1OfSequenceOfReal)& PntG1G1); 224 225 Standard_EXPORT void Discretise (const Handle(GeomPlate_HArray1OfSequenceOfReal)& PntInter, const Handle(GeomPlate_HArray1OfSequenceOfReal)& PntG1G1); 226 227 Standard_EXPORT void LoadCurve (const Standard_Integer NbBoucle, const Standard_Integer OrderMax = 2); 228 229 Standard_EXPORT void LoadPoint (const Standard_Integer NbBoucle, const Standard_Integer OrderMax = 2); 230 231 Standard_EXPORT void CalculNbPtsInit(); 232 233 Standard_EXPORT Standard_Boolean VerifSurface (const Standard_Integer NbLoop); 234 235 Standard_EXPORT void VerifPoints (Standard_Real& dist, Standard_Real& ang, Standard_Real& curv) const; 236 237 Standard_EXPORT Standard_Boolean CourbeJointive (const Standard_Real tolerance); 238 239 Standard_EXPORT Standard_Real ComputeAnisotropie() const; 240 241 Standard_EXPORT Standard_Boolean IsOrderG1() const; 242 243 244 Handle(GeomPlate_HSequenceOfCurveConstraint) myLinCont; 245 Handle(GeomPlate_HArray1OfSequenceOfReal) myParCont; 246 Handle(GeomPlate_HArray1OfSequenceOfReal) myPlateCont; 247 Handle(GeomPlate_HSequenceOfPointConstraint) myPntCont; 248 Handle(Geom_Surface) mySurfInit; 249 Handle(Geom_Surface) myPlanarSurfInit; 250 Handle(GeomPlate_Surface) myGeomPlateSurface; 251 Plate_Plate myPlate; 252 Plate_Plate myPrevPlate; 253 Standard_Boolean myAnisotropie; 254 Handle(TColStd_HArray1OfInteger) mySense; 255 Standard_Integer myDegree; 256 Handle(TColStd_HArray1OfInteger) myInitOrder; 257 Standard_Real myG0Error; 258 Standard_Real myG1Error; 259 Standard_Real myG2Error; 260 Standard_Integer myNbPtsOnCur; 261 Standard_Boolean mySurfInitIsGive; 262 Standard_Integer myNbIter; 263 Extrema_ExtPS myProj; 264 Standard_Real myTol2d; 265 Standard_Real myTol3d; 266 Standard_Real myTolAng; 267 Standard_Real myTolU; 268 Standard_Real myTolV; 269 Standard_Integer myNbBounds; 270 Standard_Boolean myIsLinear; 271 Standard_Boolean myFree; 272 273 274 }; 275 276 277 278 279 280 281 282 #endif // _GeomPlate_BuildPlateSurface_HeaderFile 283