zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
 
 
 
#ifndef OD_DBCURVE_H
#define OD_DBCURVE_H
 
#include "TD_PackPush.h"
 
#include "DbEntity.h"
 
class OdDbSpline;
typedef OdSmartPtr<OdDbSpline> OdDbSplinePtr;
 
class OdDbCurveImpl;
class OdDbCurve;
 
/** \details
This template class is a specialization of the OdSmartPtr class for OdDbCurve object pointers.
*/
typedef OdSmartPtr<OdDbCurve> OdDbCurvePtr;
/** \details
    The class is the base class for all OdDb curves.
 
    Library: TD_Db
 
    <group OdDb_Classes>
*/
class TOOLKIT_EXPORT OdDbCurve : public OdDbEntity
{
public:
  ODDB_DECLARE_MEMBERS(OdDbCurve);
 
  OdDbCurve();
 
  /** \details
    Returns true if and only if this Curve object is closed.
  */
  virtual bool isClosed() const;
 
  /** \details
    Returns true if and only if this Curve object is periodic.
  */
  virtual bool isPeriodic() const;
 
  /** \details
    Returns the parameter corresponding to the start point of this Curve object.
 
    \param startParam [out]  Receives the start parameter.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getStartParam(
    double& startParam) const = 0;
 
  /** \details
    Returns the parameter corresponding to the end point of this Curve object.
 
    \param endParam [out]  Receives the end parameter.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getEndParam(
    double& endParam) const = 0;
 
  /** \details
    Returns the WCS start point of this Curve object.
 
    \param startPoint [out]  Receives the start point.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getStartPoint(
    OdGePoint3d& startPoint) const = 0;
 
  /** \details
    Returns the WCS end point of this Curve object.
 
    \param endPoint [out]  Receives the end point.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getEndPoint(
    OdGePoint3d& endPoint) const = 0;
 
  /** \details
    Returns the WCS point on this Curve object corresponding to the specified parameter.
    
    \param param [in]  Parameter specifying point.
    \param pointOnCurve [out]  Receives the point on this Curve object.
    
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
      virtual OdResult getPointAtParam(
    double param, 
    OdGePoint3d& pointOnCurve) const = 0;
 
  /** \details
    Returns the parameter corresponding to the specified WCS point on this Curve object.
 
    \param param [out]  Receives the parameter corresponding to pointOnCurve.
    \param pointOnCurve [in]  Point to be evaluated.
    
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
      virtual OdResult getParamAtPoint(
    const OdGePoint3d& pointOnCurve, 
    double& param) const = 0;
 
  /** \details
    Returns the distance along this Curve object from its start point to the point specified by param.
    
    \param param [in]  Parameter specifying point.
    \param dist [out]  Receives the distance. 
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getDistAtParam (
    double param, 
    double& dist) const = 0;
 
  /** \details
    Returns the parameter corresponding to the point a specified distance 
    along this Curve object from its start point.
    
    \param param [out]  Receives the parameter.
    \param dist [in]  Distance along the curve. 
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getParamAtDist (
    double dist, 
    double& param) const = 0;
 
  /** \details
    Returns the distance along this Curve object from its start point to the specified WCS point.
    
    \param pointOnCurve [in]  Point on the curve.
    \param dist [out]  Receives the distance. 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getDistAtPoint (
    const OdGePoint3d& pointOnCurve, 
    double& dist)const;
 
  /** \details
    Returns the WCS point a specified distance along this Curve object from its start point.
    
    \param pointOnCurve [out]  Receives the point.
    \param dist [in]  Distance along the curve. 
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getPointAtDist (
    double dist, 
    OdGePoint3d& pointOnCurve) const;
  
  /** \details
    Returns the first derivative of this Curve object at the specified WCS point.
    
    \param param [in]  Parameter specifying point.
    \param pointOnCurve [in]  Point on the curve.
    \param firstDeriv [out]  Receives the first derivative. 
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getFirstDeriv (
    double param,
    OdGeVector3d& firstDeriv) const = 0;
 
  virtual OdResult getFirstDeriv (
    const OdGePoint3d& pointOnCurve,
    OdGeVector3d& firstDeriv) const;
 
  /** \details
    Returns the second derivative of this Curve object at the specified point.
    
    \param param [in]  Parameter specifying point.
    \param pointOnCurve [in]  Point on the curve.
    \param secondDeriv [out]  Receives the first derivative. 
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getSecondDeriv (
    double param,
    OdGeVector3d& secondDeriv) const;
 
  virtual OdResult getSecondDeriv (
    const OdGePoint3d& pointOnCurve,
    OdGeVector3d& secondDeriv) const;
 
  /** \details
    Returns the point on this Curve object closest to the given point.
    
    \param givenPoint [in]  Given point.
    \param pointOnCurve [out]  Receives the closed point on this Curve object.
    \param extend [in]  Extends this Curve object if and only if true.
    \param normal [in]  Normal to the projection plane.
    
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
    
    If normal is specified, this Curve object is projected onto the plane
    defined by givenPoint and normal, finds the closest point on
    the projected curve to givenPoint, and projects said closest
    point back onto the plane of this Curve object. It is this point
    that is returned as pointOnCurve. 
  */
  virtual OdResult getClosestPointTo(
    const OdGePoint3d& givenPoint,
    OdGePoint3d& pointOnCurve, 
    bool extend = false) const;
 
  virtual OdResult getClosestPointTo(
    const OdGePoint3d& givenPoint,
    const OdGeVector3d& normal,
    OdGePoint3d& pointOnCurve, 
    bool extend = false) const;
  
 
  /** \details
    Returns OdDbSpline approximation of this Curve object.    
    \param spline [out]  Receives a SmartPointer to the OdDbSpline.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getSpline (
    OdDbSplinePtr* spline) const;
 
  /** \details
    Extends this Curve object to the specified WCS point.
    
    \param param [in]  Parameter specifying point.
    \param toPoint [in]  Point to which to extend.
    \param extendStart [in]  True to extend start of curve, false to extend end of curve.
 
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult extend(
    double param);
  
  virtual OdResult 
    extend(bool extendStart,
    const OdGePoint3d& toPoint);
 
  /** \details
    Returns the area of this Curve object.
 
    \param area [out]  Receives the area.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getArea(
    double& area) const;
  
  /** \details
    Creates a curve by projecting this Curve object onto the specified plane
    along its normal.
    
    \param projPlane [in]  Projection plane.
    \param pProjCurve [out]  Receives a SmartPointer to the projected curve.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getOrthoProjectedCurve(const OdGePlane& projPlane,
    OdDbCurvePtr* pProjCurve) const;
 
  /** \details
    Creates a curve by projecting this Curve object onto the specified plane
    along the specified direction.
    
    \param projPlane [in]  Projection plane.
    \param projDirection [in]  Projection direction.
    \param pProjCurve [out]  Receives a SmartPointer to the projected curve.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
  */
  virtual OdResult getProjectedCurve(const OdGePlane& projPlane,
    const OdGeVector3d& projDirection, OdDbCurvePtr* pProjCurve) const;
 
  /** \details
    Creates a set of curves representing the offsetting of this Curve object by the specified distance.
    \param offsetDistance [in]  Offset distance.
    \param offsetCurves [out]  Receives an array of SmartPointers to the offset curves.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
    \note
    Pointers to all new curves are appended to the offsetCurves array.
  */
  virtual OdResult getOffsetCurves(double offsetDistance,  
    OdRxObjectPtrArray& offsetCurves) const;
 
  /** \details
    Creates a set of curves representing the offsetting of this Curve object by the specified distance in a
    plane with the specified normal.
    \param offsetDistance [in]  Offset distance.
    \param offsetCurves [out]  Receives an array of SmartPointers to the offset curves.
    \param normal [in]  Normal of the plane.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
    \note
    Pointers to all new curves are appended to the offsetCurves array.
  */
  virtual OdResult getOffsetCurvesGivenPlaneNormal(
    const OdGeVector3d& normal, double offsetDistance,
    OdRxObjectPtrArray& offsetCurves) const;          
 
  /** \details
    Creates a set of curves representing this splitting of this Curve object at the specified (parametric) points. 
    \param params [in]  Array of curve parameters defining the segments.
    \param points [in]  Array of points defining the segments.
    \param curveSegments [out]  Receives an array of SmartPointers to the curves segments.
    \remarks
    Returns eOk if successful, or an appropriate error code if not.
    \note
    Pointers to all new curves are appended to the curveSegments array.
  */
  virtual OdResult getSplitCurves (const OdGeDoubleArray& params,
    OdRxObjectPtrArray& curveSegments) const;
 
  virtual OdResult getSplitCurves (const OdGePoint3dArray& points,
    OdRxObjectPtrArray& curveSegments) const;
 
  virtual OdResult reverseCurve();
 
  /** \details
    Returns an OdGeCurve3d that is geometrically identical to this OdDbCurve.
    \param pGeCurve [out]  Receives a pointer to an OdGeCurve3d object that is geometrically identical to this OdDbCurve.
    The caller of this function is responsible for deleting this OdGeCurve3d object.
    \param tol [in] Optional tolerance.
    \returns
    Returns eOk if successful.
  */
  virtual OdResult  getOdGeCurve ( OdGeCurve3d*& pGeCurve, const OdGeTol& tol = OdGeContext::gTol ) const;
 
 
  /** \details
    Takes an OdGeCurve3d and returns an OdDbCurve that is geometrically identical to the OdGeCurve3d.
    \param geCurve [in]  Reference to an OdGeCurve3d.
    \param pDbCurve [out]  Receives a pointer to an OdDbCurve object that is geometrically identical to geCurve.
    The caller of this function is responsible for deleting this OdDbCurve object or adding it to the database.
    \param normal [in] Optional normal vector. If this parameter is supplied then it must be a valid vector that 
    is perpendicular to the input geCurve, and this vector will become the normal vector of the output pDbCurve.
    If this parameter is not supplied, then this function will compute the normal vector itself.
    \param tol [in] Optional tolerance
    \returns
    Returns eOk if successful.
  */
  static OdResult  createFromOdGeCurve ( const OdGeCurve3d& geCurve, OdDbCurve*& pDbCurve,
                                                               OdGeVector3d *normal = NULL,
                                                               const OdGeTol& tol = OdGeContext::gTol );
 
  /** \details
    Takes an OdGeCurve3d and sets this OdDbCurve to be geometrically identical to the OdGeCurve3d.
    \param geCurve [in]  reference to an OdGeCurve3d.
    \param normal [in]  Optional normal vector. If this parameter is supplied then it must be a valid vector that 
    is perpendicular to the input geCurve, and this vector will become the normal vector of the output pDbCurve.
    If this parameter is not supplied, then this function will compute the normal vector itself.
    \param tol [in] Optional tolerance.
    \returns
    Returns eOk if successful.
  */
  virtual OdResult  setFromOdGeCurve ( const OdGeCurve3d& geCurve,
                                                            OdGeVector3d *normal = NULL,
                                                            const OdGeTol& tol = OdGeContext::gTol );
 
};
 
#include "TD_PackPop.h"
 
#endif