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
/////////////////////////////////////////////////////////////////////////////// 
// 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_GETORUS_H
#define OD_GETORUS_H /*!DOM*/
 
#include "OdPlatform.h"
#include "Ge/GeSurface.h"
#include "Ge/GeCircArc3d.h"
 
#include "TD_PackPush.h"
 
/** \details
    This class represents toroidal segments.
 
    \remarks
    The torus is surface generated by revolving a circular arc
    about an axis of symmetry, where the plane of the circular arc 
    contains the axis of symmetry
 
    The torus is located in space by its center, which is a point on the axis of symmetry.  
 
    The center of the circular arc is at a distance of majorRadius from
    the center of the torus. The radius of the circular arc is the
    minorRadius.
 
    Parameter U is the longitude (about the axis of symmetry), which for a closed torus defaults
    to the range [-OdaPI, OdaPI).  Zero corresponds to the refAxis (which is
    a vector orthogonal to the axis of symmetry).  Applying the right
    hand rule along the symmetric axis defines the increasing direction
    for U.
 
    Parameter v parameterizes the circular tube, which
    for a closed circle defaults to the range [-OdaPI, OdaPI).  Applying the
    right hand rule along the refAxis X-axisOfSymmetry defines the
    increasing direction for v.
 
    The torus is periodic in U, v with a period of Oda2PI.
    [umin, umax] x [vmin, vmax] defines a four sided toroidal patch bounded
    by four circular arcs. Following constraints apply to the definition
    of a toroidal patch.
 
    * umin < umax and |umin - umax| <= Oda2PI.
    * vmin < vmax and |vmin - vmax| <= Oda2PI
 
    Library: TD_Ge
 
   <group OdGe_Classes>
 
   <link ge_OdGeTorus.html, Working with Toruses>
*/
class GE_TOOLKIT_EXPORT OdGeTorus : public OdGeSurface
{
public:
 
  /** 
    \param majorRadius [in] The major *radius* of this *torus*.
    \param minorRadius [in] The minor *radius* of this *torus*.
    \param center [in] The origin of the this *torus*.
    \param axisOfSymmetry [in] Axis of symmetry (rotation).
    \param refAxis [in] defines thegle 0 about the axis of symmetry.
    \param startAngleU [in] Start angle about the axis of symmetry.
    \param endAngleU [in] End angle about the axis of symmetry.
    \param startAngleV [in] Start angle about the tube.
    \param endAngleV [in] End angle about the tube.
    \param source [in] Object to be cloned.
  */
  OdGeTorus();
  OdGeTorus(
    double majorRadius, 
    double minorRadius,
    const OdGePoint3d& center, 
    const OdGeVector3d& axisOfSymmetry);
  OdGeTorus(
    double majorRadius, 
    double minorRadius,
    const OdGePoint3d& center, 
    const OdGeVector3d& axisOfSymmetry,
    const OdGeVector3d& refAxis,
    double startAngleU, 
    double endAngleU,
    double startAngleV, 
    double endAngleV);
  OdGeTorus(
    const OdGeTorus& source);
 
  // Geometric properties.
  //
 
  /** \details
    Returns the major radius of this torus.
  */
   double majorRadius() const;
 
  /** \details
    Returns the minor radius of this torus.
  */
   double minorRadius() const;
 
  /** \details
    Returns the start and end angles about about the axis of symmetry.
 
    \param startAngleU [out]  Receives the angle about the axis of symmetry.
    \param endAngleU [out]  Receives the end angle about the axis of symmetry.
  */
   void getAnglesInU(
    double& startAngleU, 
    double& endAngleU) const;
 
  /** \details
    Returns the start and end angles about about the tube.
 
    \param startAngleV [out]  Receives the start angle about the tube.
    \param endAngleV [out]  Receives the end angle about the tube.
  */
   void getAnglesInV(
    double& startAngleV, 
    double& endAngleV) const;
 
  /** \details
    Returns the center of this torus.
  */
   OdGePoint3d center() const;
 
  /** \details
    Returns the Axis of symmetry (rotation).
  */
   OdGeVector3d axisOfSymmetry() const;
 
  /** \details
    Returns the reference axis.
  */
   OdGeVector3d refAxis() const;
 
  /** \details
    Returns true if and only if the normal to this surface
    is pointing outward.
  */
   bool isOuterNormal() const;
 
  /** \details
    Sets the major radius of this torus.
 
    \param majorRadius [in]  The major radius of this torus.
  */
   OdGeTorus& setMajorRadius(
    double radius);
 
  /** \details
    Sets the minor radius of this torus.
 
    \param minorRadius [in]  The minor radius of this torus.
  */
   OdGeTorus& setMinorRadius(
    double radius);
 
  /** \details
    Sets the start and end angles about about the axis of symmetry.
 
    \param startAngleU [in]  Start angle about the axis of symmetry.
    \param endAngleU [in]  End angle about the axis of symmetry.
  */
   OdGeTorus& setAnglesInU(
    double startAngleU, 
    double endAngleU);
 
  /** \details
    Sets the start and end angles about about the tube.
 
    \param startAngleV [in]  Start angle about the tube.
    \param endAngleV [in]  End angle about the tube.
  */
   OdGeTorus& setAnglesInV(
    double startAngleV, 
    double endAngleV);
 
  /** \details
    Sets the parameters for this torus according to the arguments. 
 
    \param majorRadius [in]  The major radius of this torus.
    \param minorRadius [in]  The minor radius of this torus.
    \param center [in]  The origin of the this torus.
    \param axisOfSymmetry [in]  Axis of symmetry (rotation).
    \param refAxis [in]  defines thegle 0 about the axis of symmetry.
    \param startAngleU [in]  Start angle about the axis of symmetry.
    \param endAngleU [in]  End angle about the axis of symmetry.
    \param startAngleV [in]  Start angle about the tube.
    \param endAngleV [in]  End angle about the tube.
    \remarks
    Returns a reference to this torus.
  */
   OdGeTorus& set(
    double majorRadius, 
    double minorRadius,
    const OdGePoint3d& center,
    const OdGeVector3d& axisOfSymmetry);
   OdGeTorus& set(
    double majorRadius, 
    double minorRadius,
    const OdGePoint3d&  center,
    const OdGeVector3d& axisOfSymmetry,
    const OdGeVector3d& refAxis,
    double startAngleU, 
    double endAngleU,
    double startAngleV, 
    double endAngleV);
 
  OdGeTorus& operator =(
    const OdGeTorus& torus);
 
  /** \details
    Returns True if the torus intersects with the specified
    line entity, and returns the number of intersections and the
    points of intersection.
 
    \param lineEnt [in]  Any 3D line entity.
    \param numInt [out]  Receives the number of intersections.
    \param p1 [out]  Receives the first intersection point.
    \param p2 [out]  Receives the second intersection point.
    \param p3 [out]  Receives the third intersection point.
    \param p4 [out]  Receives the fourth intersection point.
    \param tol [in]  Geometric tolerance.
 
    \remarks
    * p1 is valid if and only if numInt > 0.
    * p2 is valid if and only if numInt > 1.
    * p3 is valid if and only if numInt > 2.
    * p4 is valid if and only if numInt > 3.
  */
   bool intersectWith(
    const OdGeLinearEnt3d& linEnt, 
    int& numInt,
    OdGePoint3d& p1, 
    OdGePoint3d& p2,
    OdGePoint3d& p3, 
    OdGePoint3d& p4,
    const OdGeTol& tol = OdGeContext::gTol) const;
 
  // Shape Classification Functions
 
  /** \details
    Returns true if and only if (majorRadius < 0) and (|majorRadius| < minorRadius), producing
    a solid with points along the axis of symmetry.
 
    \remarks
    Exactly one of the following functions will be true for a given torus:
 
    * isApple() 
    * isDoughnut() 
    * isLemon() 
    * isVortex()
  */
   bool isLemon() const;
 
  /** \details
    Returns true if and only if (0 < majorRadius < minorRadius), creating a solid with dimples at the
    axis of symmetry.
 
    \remarks
    Exactly one of the following functions will be true for a given torus:
    * isApple() 
    * isDoughnut() 
    * isLemon() 
    * isVortex()
  */
   bool isApple() const;
 
  /** \details
    Returns true if and only if (minorRadius == majorRadius), producing a donut.
    with a zero-radius hole.
 
    \remarks
    Exactly one of the following functions will be true for a given torus:
    * isApple() 
    * isDoughnut() 
    * isLemon() 
    * isVortex()
  */
   bool isVortex() const;
 
  /** \details
    Returns true if and only if (minorRadius <  majorRadius), creating a solid with a hole in the middle.
 
    \remarks
    Exactly one of the following functions will be true for a given torus:
    * isApple() 
    * isDoughnut() 
    * isLemon() 
    * isVortex()
  */
   bool isDoughnut() const;
 
  /** \details
    Returns true if and only if (minorRadius <= 0) OR (majorRadius <= -minorRadius) 
  */
   bool isDegenerate() const;
 
  /** \details
    Returns true if and only if there is a hole in the torus.
 
    \remarks
    Returns true if and only if |majorRadius| > |minorRadius| + 1e-10
  */
   bool isHollow() const;
 
  //////////////////////////////////////////////////////////////////////////
 
};
 
#include "TD_PackPop.h"
 
#endif // OD_GETORUS_H