Fields are listed in the order they appear in the file, using the codes of the
field types table (p pointer,
d int, c char, v vector, f double,
l logical, n short, u byte, i interval,
h hvec). “Pointer0” means the pointer may be null; a plain “pointer” may not.
A “chain” of nodes is doubly linked and null-terminated. Content follows the UGS “Parasolid
XT Format Reference” of October 2006, restated here (see the
source note). Parametric forms are given as the
reference writes them.
Common fields
Every curve node
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Integer unique to the curve in the part |
| attributes_groups | p | Attributes and groups associated with the curve |
| owner | p | Topological owner: an edge, fin, body, assembly or world |
| next | p | Next curve in the geometry chain |
| previous | p | Previous curve in the chain |
| geometric_owner | p | Geometric owner node, see below |
| sense | c | + or - |
Every surface node
The same seven fields, in the same order, with owner being a face, body, assembly or world.
Senses
The natural tangent of a curve is in the direction of increasing parameter, and the natural normal of a surface is the cross product of ∂P/∂u and ∂P/∂v. In the file, the edge and curve orientation is the curve’s sense field. The face and surface orientation is made from the face’s and the surface’s sense fields: the face normal is parallel to the surface’s natural normal if neither or both senses are positive.
GEOMETRIC_OWNER
Geometry that depends on other geometry points back to it through a doubly linked ring of GEOMETRIC_OWNER nodes. The dependants are: an intersection curve (two surfaces), an SP-curve (its surface), a trimmed curve (its basis curve), a blended edge (two supporting surfaces, two blend-boundary surfaces and a spine curve), an offset surface (its surface), a swept surface (its section curve) and a spun surface (its profile curve). The 2D B-curve of an SP-curve is not a dependant in this sense.
| Field | Type | Meaning |
|---|---|---|
| owner | p | The referencing geometry |
| next | p | Next in the ring of owners that refer to the same geometry |
| previous | p | Previous in the ring |
| shared_geometry | p | The referenced (dependent) geometry |
Curves
In each table, the fields after the common seven are shown.
| Node (type number) | Further fields | Meaning |
|---|---|---|
| LINE (30) | pvec : v; direction : v | R(t) = P + tD. A point on the line and a unit direction |
| CIRCLE (31) | centre : v; normal : v; x_axis : v; radius : f | R(t) = C + r·X·cos t + r·Y·sin t. Y is the cross product of the normal and x_axis. The normal and x_axis are unit vectors |
| ELLIPSE (32) | centre : v; normal : v; x_axis : v; major_radius : f; minor_radius : f | R(t) = C + a·X·cos t + b·Y·sin t. x_axis is the major axis; Y is normal × x_axis |
| B_CURVE | nurbs : p; data : p | A NURBS curve, see below |
| INTERSECTION (38) | surface[2] : p; chart : p; start : p; end : p | One branch of a surface–surface intersection, see below |
| TRIMMED_CURVE | basis_curve : p; point_1 : v; point_2 : v; parm_1 : f; parm_2 : f | A bounded portion of the basis curve. point_1 and parm_1 correspond, as do point_2 and parm_2. Used mostly on the fins of tolerant edges, where the points lie exactly on the basis curve and within tolerance of the vertices. Its sense is positive |
| SP_CURVE | surface : p; b_curve : p; original : p; tolerance_to_original : f | The 3D curve got by embedding a 2D B-curve in the parameter space of a surface. The 2D B-curve must be rational with vertex dimension 3 or non-rational with dimension 2. original and tolerance_to_original are not used |
| PE_CURVE | type : c; data : p; tf : p; internal_geom[] : p | Foreign (parametrically evaluated) geometry: type is E for external or I for internal, data points to an EXT_PE_DATA or INT_PE_DATA node, tf is an optional transform. Applications that do not use foreign geometry never meet it |
B_CURVE data
NURBS_CURVE node:
| Field | Type | Meaning |
|---|---|---|
| degree | n | Degree of the curve |
| n_vertices | d | Number of control vertices (poles) |
| vertex_dim | n | Doubles per control vertex |
| n_knots | d | Number of distinct knots |
| knot_type | u | See the knot type table |
| periodic | l | True if periodic |
| closed | l | True if closed |
| rational | l | True if rational |
| curve_form | u | Shape of the curve, if special: see below |
| bspline_vertices | p | A BSPLINE_VERTICES node: an array of n_vertices × vertex_dim doubles |
| knot_mult | p | A KNOT_MULT node: an array of shorts, the multiplicity of each distinct knot |
| knots | p | A KNOT_SET node: an array of doubles, the distinct knot values |
The expanded knot vector, in which a knot of multiplicity m appears m times, has n_vertices + degree + 1 values. Knots must not decrease. Multiplicity may be as high as the degree in the interior and degree + 1 at the first and last knot. The curve is fully defined from knot index degree to the last knot index minus degree. A rational curve stores its weights with the vertices as an extra dimension: for a curve in 3D space vertex_dim is 4, the x, y and z values are multiplied by the vertex’s weight and the fourth value is the weight. A periodic curve must also be closed; a closed non-periodic curve needs only positional continuity and cannot be attached to topology.
CURVE_DATA node (the B_CURVE’s data field, auxiliary and optional):
self_int : u, and analytic_form : p, which if not null points to a HELIX_CU_FORM node:
axis_pt : v; axis_dir : v; point : v; hand : c (+ right-handed, -
left-handed); turns : i (the extent relative to the point, e.g. [0 10]); pitch : f
(distance along the axis in one turn); tol : f (accuracy of the fit).
| Value | knot_type | Meaning |
|---|---|---|
| 1 | unset | Unknown |
| 2 | non_uniform | Known to be not special |
| 3 | uniform | All knots multiplicity one, equally spaced |
| 4 | quasi_uniform | Uniform apart from Bezier ends |
| 5 | piecewise_bezier | Internal multiplicity of order − 1 |
| 6 | bezier_ends | First and last knots have multiplicity equal to the order; nothing else is special |
| Value | curve_form |
|---|---|
| 1 | unset (not known) |
| 2 | arbitrary (no particular shape) |
| 3 | polyline |
| 4 | circular arc |
| 5 | elliptic arc |
| 6 | parabolic arc |
| 7 | hyperbolic arc |
| Value | self_int |
|---|---|
| 1 | unset: not checked |
| 2 | no self-intersections: passed checks |
| 3 | self-intersects: failed checks |
| 4 | checked OK in an old version (Parasolid 5 or earlier, not since) |
Intersection curves
An intersection curve is stored as its two surfaces, an ordered chart of points along it and two limits. The tangent at a point is the cross product of the surface normals there, taking the surface senses into account. Points where that cross product vanishes, or where a surface is degenerate, are terminators; a curve has none in its interior.
CHART node: Base_parameter : f; Base_scale : f; Chart_count : d; Chordal_error : f (may be null); Angular_error : f (may be null); Parameter_error[2] : f (always null, null); Hvec[] : h (the points). Only the position of each hvec is written, though the structure also holds the surface parameters u[2] and v[2], the tangent and the curve parameter t.
LIMIT node: type : c; hvec[] : h.
| Limit type | Meaning | hvecs |
|---|---|---|
H | Help: an arbitrary point on a closed intersection curve | 1 |
T | Terminator: a singular point; the first hvec is the exact singularity, the second a point on the wanted branch a small distance away, which is the one that appears in the chart | 2 |
L | Limit: an artificial end on an otherwise unbounded branch | 1 |
B | Spine boundary: the end of a degenerate rolling ball blend; not used by intersection curves | (not stated) |
The curve’s parameterisation is derived from the chart: with chart points Pi, tangents Ti, chord lengths Ci = |Pi+1 − Pi|, cos ai = Ti·(Pi+1 − Pi) and cos bi = Ti·(Pi − Pi−1) (with the chords normalised), take f0 = Base_scale, fi = (cos bi / cos ai) fi−1, t0 = Base_parameter and ti = ti−1 + Ci−1 fi−1. The reference states the normalisation only implicitly. A point between chart points is parameterised by projecting onto the tangent line at the previous chart point, and the fi make the parameterisation C1.
Surfaces
| Node (type number) | Further fields | Meaning |
|---|---|---|
| PLANE (50) | pvec : v; normal : v; x_axis : v | R(u,v) = P + uX + vY. Normal and x_axis are unit vectors; Y is normal × x_axis |
| CYLINDER (51) | pvec : v; axis : v; radius : f; x_axis : v | Point on the axis, unit axis, radius, unit X axis |
| CONE (52) | pvec : v; axis : v; radius : f; sin_half_angle : f; cos_half_angle : f; x_axis : v | Half of a mathematical cone: the axis points away from the half in use. R(u,v) = P − vA + (X cos u + Y sin u)(r + v tan a). The radius is the radius at pvec; Y = A × X |
| SPHERE (53) | centre : v; radius : f; axis : v; x_axis : v | R(u,v) = C + (X cos u + Y sin u) r cos v + r A sin v |
| TORUS (54) | centre : v; axis : v; major_radius : f; minor_radius : f; x_axis : v | R(u,v) = C + (X cos u + Y sin u)(a + b cos v) + b A sin v. a is the major and b the minor radius. If a > b it is a doughnut; if 0 < a ≤ b, an apple (the outer part of a self-intersecting torus; a = b is an osculating apple); if a < 0 and |a| < b, a lemon (the inner part). a = 0 cannot be a torus, it is a sphere |
| BLENDED_EDGE (56) | blend_type : c; surface[2] : p; spine : p; range[2] : f; thumb_weight[2] : f; boundary[2] : p; start : p; end : p | Rolling ball blend, see below |
| BLEND_BOUND (59) | boundary : n; blend : p | A construction surface marking where a blend becomes tangent to its supporting surface. Only the index of the supporting surface and the blend are stored: the supporting surface is blend.surface[1 − boundary] |
| OFFSET_SURF (60) | check : c; true_offset : l; surface : p; offset : f; scale : f | The underlying surface moved along its normal (allowing for sense) by the signed offset, keeping its parameterisation. true_offset is not used, scale is internal and may be null. check is V valid, I invalid or U unchecked. The offset may not be within the modeller’s linear resolution of zero, the offset surface’s sense must equal the underlying surface’s, and two offsets may not share an underlying surface |
| SWEPT_SURF (67) | section : p; sweep : v; scale : f | R(u,v) = C(u) + vD, where C is the section curve (not an intersection or trimmed curve) and D the unit sweep direction. scale is internal |
| SPUN_SURF (68) | profile : p; base : v; axis : v; start : v; end : v; start_param : f; end_param : f; x_axis : v; scale : f | A profile curve spun about an axis (point base, unit direction axis). start and end are positions where the profile crosses the axis, and start_param and end_param the corresponding curve parameters; they bound the u range (a null value means infinite). x_axis is set when the profile lies in a plane containing the axis, and otherwise null. The profile may not be an intersection or trimmed curve |
| PE_SURF | type : c; data : p; tf : p; internal_geom[] : p | Foreign geometry, as for PE_CURVE. The only internal PE surface is the offset PE surface (geom_type 2) |
| B_SURFACE | nurbs : p; data : p | A NURBS surface, see below |
For a spun surface the reference writes the field comments “at low u” and “at low v” for start and end, then “high u” for end_param; treat start and end as the low and high u degeneracies.
Blended edge
R(u,v) = C(u) + r X(u) cos(v a(u)) + r Y(u) sin(v a(u)), where C is the spine curve, r the blend radius, X and Y unit vectors normal to the spine’s tangent and a the angle the boundary points subtend at the spine. u comes from the spine; v is 0 on the first surface’s blend boundary and 1 on the second’s (the other way round if the spine’s sense is negative).
- blend_type:
Rrolling ball,Ecliff edge. - range: offsets applied to the supporting surfaces. For a rolling ball blend the spine is the intersection of the two surfaces offset by their range entries, each along the natural normal times the range, times −1 if the surface sense is negative.
- thumb_weight is always (1, 1) and boundary always (0, 0) in the reference.
- For a cliff edge, one supporting surface is a blended edge of range (0, 0) whose spine is the cliff edge curve; its type is
R. - start and end are LIMIT nodes (type
L) used only when the spine is periodic but the blended edge curve has terminators, to give the extent of the spine.
B_SURFACE data
NURBS_SURF node:
| Field | Type | Meaning |
|---|---|---|
| u_periodic, v_periodic | l, l | Periodic in u, in v |
| u_degree, v_degree | n, n | Degrees |
| n_u_vertices, n_v_vertices | d, d | Control vertices in each direction |
| u_knot_type, v_knot_type | u, u | As the curve knot types |
| n_u_knots, n_v_knots | d, d | Distinct knots in each direction |
| rational | l | True if rational |
| u_closed, v_closed | l, l | Closed in u, in v |
| surface_form | u | Shape, if special (below) |
| vertex_dim | n | Doubles per control vertex |
| bspline_vertices | p | Control vertices (a BSPLINE_VERTICES node) |
| u_knot_mult, v_knot_mult | p, p | KNOT_MULT nodes |
| u_knots, v_knots | p, p | KNOT_SET nodes |
| Value | surface_form | Value | surface_form |
|---|---|---|---|
| 1 | unset | 7 | toroidal |
| 2 | arbitrary | 8 | surface of revolution |
| 3 | planar | 9 | ruled |
| 4 | cylindrical | 10 | quadric |
| 5 | conical | 11 | swept |
| 6 | spherical |
SURFACE_DATA node (data, auxiliary, optional and recommended to be set only by
Parasolid): original_uint : i; original_vint : i; extended_uint : i; extended_vint : i;
self_int : u; original_u_start, original_u_end, original_v_start, original_v_end,
extended_u_start, extended_u_end, extended_v_start, extended_v_end : c;
analytic_form_type, swept_form_type, spun_form_type, blend_form_type : c;
analytic_form, swept_form, spun_form, blend_form : p. The original and extended intervals
record a B-surface extended by Parasolid, explicitly by adding rows or columns of control
points, or implicitly (the nurbs data unchanged, out-of-range evaluation allowed). The
character fields describe each boundary: D degenerate, P periodic,
B bounded, C closed but not periodic, and ? for unset,
which is what the extended fields hold if the surface was not extended (with null
extended intervals). The swept, spun and blend forms are for future use and must be
? and null. If analytic_form is not null it points to a HELIX_SU_FORM node and
analytic_form_type is H: axis_pt : v; axis_dir : v; hand : c; turns : i;
pitch : f; gap : f (always zero for now); tol : f. The v parameter increases along the axis.
Point and transform
| Node (type number) | Fields | Meaning |
|---|---|---|
| POINT (29) | node_id : d; attributes_groups : p; owner : p; next : p; previous : p; pvec : v | The schema line is 29 POINT; Point; 1 6 0. owner is a vertex, body, assembly or world |
| TRANSFORM | node_id : d; owner : p; next : p; previous : p; rotation_matrix : f[9]; translation_vector : v; scale : f; flag : (byte per the table, an int in the struct); perspective_vector : v | x′ = (R·x + T) × scale. The owner is an instance or the world. perspective_vector is always the null vector |
| Flag bit | Name | Set when |
|---|---|---|
| 00001 | translation | the translation vector is non-zero |
| 00010 | rotation | the rotation matrix is not the identity |
| 00100 | scaling | the scale is not 1.0 |
| 01000 | reflection | the determinant of the rotation matrix is negative |
| 10000 | general affine | the rotation matrix is not a rigid rotation |
Not confirmed on this page
- Node type numbers for CYLINDER onwards are those the reference tabulates, paired by position in its table; the table’s extracted columns are mixed, so CHART (40), LIMIT (41), BSPLINE_VERTICES (45), PLANE (50), CYLINDER (51), CONE (52), SPHERE (53), TORUS (54), BLENDED_EDGE (56), BLEND_BOUND (59), OFFSET_SURF (60), SWEPT_SURF (67) and SPUN_SURF (68) should be checked against a real file. The numbers of B_CURVE, B_SURFACE, SP_CURVE, TRIMMED_CURVE, PE_CURVE, PE_SURF, NURBS_CURVE, NURBS_SURF, CURVE_DATA, SURFACE_DATA, KNOT_MULT, KNOT_SET, GEOMETRIC_OWNER, EXT_PE_DATA, INT_PE_DATA, KEY and TRANSFORM are not given here.
- The shape of PE (foreign) data, KEY nodes and the EXT_PE_DATA contents beyond their field names.
Sources
- Parasolid XT Format Reference, October 2006 – UGS Corp.; the Geometry chapter