Schema Definitions   

<<< Model Structure Chapters Nodes and Classes >>>

Contents

[back to top]


5.1 Underlying types

 

union CURVE_OWNER_u
     {
     struct EDGE_s                *edge;
     struct HALFEDGE_s            *halfedge;
     struct BODY_s                *body;
     struct ASSEMBLY_s            *assembly;
     struct WORLD_s               *world;
     };
typedef union CURVE_OWNER_u CURVE_OWNER;
union SURFACE_OWNER_u
     {
     struct FACE_s                *face;
     struct BODY_s                *body;
     struct ASSEMBLY_s            *assembly;
     struct WORLD_s               *world;
     };
typedef union SURFACE_OWNER_u SURFACE_OWNER;
union ATTRIB_FEAT_u
     {
     struct ATTRIBUTE_s           *attribute;
     struct FEATURE_s             *feature;
     struct MEMBER_OF_FEATURE_s   *member_of_feature;
     };
typedef union ATTRIB_FEAT_u ATTRIB_FEAT;

[back to top]


5.2 Geometry

 

union CURVE_u
     {
     struct LINE_s                *line;
     struct CIRCLE_s              *circle;
     struct ELLIPSE_s             *ellipse;
     struct INTERSECTION_s        *intersection;
     struct TRIMMED_CURVE_s       *trimmed_curve;
     struct PE_CURVE_s            *pe_curve;
     struct B_CURVE_s             *b_curve;
     struct SP_CURVE_s            *sp_curve;
     struct POLYLINE_s            *polyline;
     };
typedef union CURVE_u      CURVE;
union SURFACE_u
     {
     struct PLANE_s               *plane;
     struct CYLINDER_s            *cylinder;
     struct CONE_s                *cone;
     struct SPHERE_s              *sphere;
     struct TORUS_s               *torus;
     struct BLENDED_EDGE_s        *blended_edge;
     struct BLEND_BOUND_s         *blend_bound;
     struct OFFSET_SURF_s         *offset_surf;
     struct SWEPT_SURF_s          *swept_surf;
     struct SPUN_SURF_s           *spun_surf;
     struct PE_SURF_s             *pe_surf;
     struct B_SURFACE_s           *b_surface;
     struct MESH_s                *mesh;
     };
typedef union SURFACE_u    SURFACE;
union GEOMETRY_u
     {
     struct LATTICE_s             *lattice;
     union SURFACE_u               surface;
     union CURVE_u                 curve;
     struct POINT_s               *point;
     struct TRANSFORM_s           *transform;
     };
typedef union GEOMETRY_u GEOMETRY;

5.2.1 Curves

In the following field tables, ‘pointer0’ means a reference to another node which may be null. ‘pointer’ means a non-null reference.

All curve nodes share the following common fields:

 

Field Name

Data Type

Description

node_id

int

Integer value unique to curve in part

attributes_features

pointer0

Attributes and featuresassociated with any curve

owner

pointer0

topological owner

next

pointer0

next curve in geometry chain

previous

pointer0

previous curve in geometry chain

geometric_owner

pointer0

geometric owner node

sense

char

sense of curve “+” or “-” (see end of Geometry section)

 

struct ANY_CURVE_s              //Any Curve
    {
    int                           node_id;              // $d
    union  ATTRIB_FEAT_u          attributes_features;  // $p
    union  CURVE_OWNER_u          owner;                // $p
    union  CURVE_u                next;                 // $p
    union  CURVE_u                previous;             // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;      // $p
    char                          sense;                // $c
    };
typedef struct ANY_CURVE_s *ANY_CURVE;

5.2.1.1 Line

A straight line has a parametric representation of the form:

R(t) = P + t D

Where:

 

 

Field Name

Data Types

Description

pvec

vector

point on the line

direction

vector

direction of the line (a unit vector)

 

struct LINE_s == ANY_CURVE_s      //Straight line
    {
    int                           node_id;              // $d
    union  ATTRIB_FEAT_u          attributes_features;  // $p
    union  CURVE_OWNER_u          owner;                // $p
    union  CURVE_u                next;                 // $p
    union  CURVE_u                previous;             // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;      // $p
    char                          sense;                // $c
    vector                        pvec;                 // $v
    vector                        direction;            // $v
    };
typedef struct LINE_s       *LINE;

5.2.1.2 Circle

A circle has a parametric representation of the form:

R(t) = C + r X cos(t) + r Y sin(t)

Where:

 

 

Field Name

Data Type

Description

centre

vector

Centre of circle

normal

vector

Normal to the plane containing the circle (a unit vector)

x_axis

vector

X axis in the plane of the circle (a unit vector)

radius

double

Radius of circle

The Y axis in the definition above is the vector cross product of the normal and x_axis .

 

struct CIRCLE_s == ANY_CURVE_s    //Circle
    {
    int                           node_id;              // $d
    union  ATTRIB_FEAT_u          attributes_features;  // $p
    union  CURVE_OWNER_u          owner;                // $p
    union  CURVE_u                next;                 // $p
    union  CURVE_u                previous;             // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;      // $p
    char                          sense;                // $c
    vector                        centre;               // $v
    vector                        normal;               // $v
    vector                        x_axis;               // $v
    double                        radius;               // $f
    };
typedef struct CIRCLE_s    *CIRCLE;

5.2.1.3 Ellipse

An ellipse has a parametric representation of the form:

R(t) = C + a X cos(t) + b Y sin(t)

Where:

 

 

Field Name

Data Type

Description

centre

Vector

Centre of ellipse

normal

Vector

Normal to the plane containing the ellipse (a unit vector)

x_axis

Vector

major axis in the plane of the ellipse (a unit vector)

major_radius

Double

major radius

minor_radius

Double

minor radius

The minor axis (Y) in the definition above is the vector cross product of the normal and x_axis .

 

struct ELLIPSE_s == ANY_CURVE_s   //Ellipse
    {
    int                           node_id;              // $d
    union  ATTRIB_FEAT_u          attributes_features;  // $p
    union  CURVE_OWNER_u          owner;                // $p
    union  CURVE_u                next;                 // $p
    union  CURVE_u                previous;             // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;      // $p
    vector                        centre;               // $v
    char                          sense;                // $c
    vector                        normal;               // $v
    vector                        x_axis;               // $v
    double                        major_radius;         // $f
    double                        minor_radius;         // $f
    };
typedef struct ELLIPSE_s   *ELLIPSE;

5.2.1.4 B_CURVE (B-spline curve)

XT supports B-spline curves in full NURBS format. The mathematical description of these curves is:

 

 

KNOT VECTORS

The parameter t above is global. The user supplies an ordered set of values of t at specific points. The points are called knots and the set of values of t is called the knot vector. Each successive value in the set shall be greater than or equal to its predecessor. Where two or more such values are the same to angular resolution we say that the knots are coincident, or that the knot has multiplicity greater than 1. In this case it is best to think of the knot set as containing a null or zero length span. The principal use of coincident knots is to allow the curve to have less continuity at that point than is formally required for a spline. A curve with a knot of multiplicity equal to its degree can have a discontinuity of first derivative and hence of tangent direction. This is the highest permitted multiplicity except at the first or last knot where it can go as high as (degree+1).

In order to avoid problems associated, for example with rounding errors in the knot set, XT stores an array of distinct values and an array of integer multiplicities. This is reflected in the standard form used by the PK for input and output of B-curve data.

Most algorithms in the literature, and the following discussion refer to the expanded knot set in which a knot of multiplicity n appears explicitly n times.

THE NUMBER OF KNOTS AND VERTICES

The knot set determines a set of basis functions which are bell shaped, and non zero over a span of (degree+1) intervals. One basis function starts at each knot, and each one finishes (degree+1) knots higher. The control vectors are the coefficients applied to these basis functions in a linear sum to obtain positions on the curve. Thus it can be seen that we require the number of knots n_knots = n_vertices + degree + 1 .

THE VALID RANGE OF THE B-CURVE

So if the knot set is numbered {t0 to tn_knots-1 } it can be seen then that it is only after tdegree that sufficient (degree+1) basis functions are present for the curve to be fully defined, and that the B-curve ceases to be fully defined after tn_knots - 1 - degree.

The first degree knots and the last degree knots are known as the imaginary knots because their parameter values are outside the defined range of the B-curve.

PERIODIC B-CURVES

When the end of a B-curve meets its start sufficiently smoothly XT allows it to be defined to have periodic parameterisation. That is to say that if the valid range were from tdegree to tn_knots - 1 - degree then the difference between these values is called the period and the curve can continue to be evaluated with the same point reoccurring every period.

The minimal smoothness requirement for periodic curves in XT is tangent continuity to angular resolution, but we strongly recommend Cdegree-1, or continuity in the (degree-1)th derivative. This in turn is best achieved by repeating the first degree vertices at the end, and by matching knot intervals so that counting from the start of the defined range, tdegree, the first degree intervals between knots match the last degree intervals, and similarly matching the last degree knot intervals before the end of the defined range to the first degree intervals.

CLOSED B-CURVES

A periodic B-curve shall also be closed, but it is permitted to have a closed B-curve that is not periodic.

In this case the rules for continuity are relaxed so that only C0 or positional continuity is required between the start and end. Such closed non-periodic curves are not able to be attached to topology.

RATIONAL B-CURVE

In the rational form of the curve, each vertex is associated with a weight, which increases or decreases the effect of the vertex without changing the curve hull. To ensure that the convex hull property is retained, the curve equation is divided by a denominator which makes the coefficients of the vertices sum to one.

 

Each weight may take any positive value, and the larger the value, the greater the effect of the associated vertex. However, it is the relative sizes of the weights which is important, as may be seen from the fact that in the equation given above, all the weights may be multiplied by a constant without changing the equation.

In XT the weights are stored with the vertices by treating these as having an extra dimension. In the usual case of a curve in 3-d cartesian space this means that vertex_dim is 4, the x, y, z values are multiplied through by the corresponding weight and the 4th value is the weight itself.

 

struct B_CURVE_s == ANY_CURVE_s   //B curve
    {
    int                           node_id;              // $d
    union  ATTRIB_FEAT_u          attributes_features;  // $p
    union  CURVE_OWNER_u          owner;                // $p
    union  CURVE_u                next;                 // $p
    union  CURVE_u                previous;             // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;      // $p
    char                          sense;                // $c
    struct NURBS_CURVE_s         *nurbs;                // $p
    struct CURVE_DATA_s          *data;                 // $p
    };
typedef struct B_CURVE_s     *B_CURVE;

The data stored in the XT data for a NURBS_CURVE is

 

Field Name

Data Type

Description

degree

Short

degree of the curve

n_vertices

Int

number of control vertices (“poles”)

vertex_dim

Short

dimension of control vertices

n_knot

Int

number of distinct knots

knot_type

Byte

form of knot vector

periodic

Logical

true if curve is periodic

closed

Logical

true if curve is closed

rational

Logical

true if curve is rational

curve_form

Byte

shape of curve, if special

bspline_vertices

Pointer

control vertices node

knot_mult

Pointer

knot multiplicities node

knot

Pointer

knots node

The knot_type enum is used to describe whether or not the knot vector has a certain regular spacing or other common property:

 

typedef enum
    {
    SCH_unset = 1,             //Unknown
    SCH_non_uniform = 2,       //Known to be not special
    SCH_uniform = 3,           //Uniform knot set
    SCH_quasi_uniform = 4,     //Uniform apart from bezier ends
    SCH_piecewise_bezier = 5,  //Internal multiplicity of 
                                 order-1
    SCH_bezier_ends = 6        //Bezier ends, no other property
    }
    SCH_knot_type_t;

A uniform knot set is one where all the knots are of multiplicity one and are equally spaced. A curve has bezier ends if the first and last knots both have multiplicity ‘order’.

The curve_form enum describes the geometric shape of the curve. The parameterisation of the curve is not relevant.

 

typedef enum
    {
    SCH_unset          = 1,     //Form is not known
    SCH_arbitrary      = 2,     //Known to be of no particular 
                                  shape
    SCH_polyline       = 3,
    SCH_circular_arc   = 4,
    SCH_elliptic_arc   = 5,
    SCH_parabolic_arc  = 6,
    SCH_hyperbolic_arc = 7
    }
    SCH_curve_form_t;
struct NURBS_CURVE_s             //NURBS curve
    {
    short                          degree;              // $n
    int                            n_vertices;          // $d
    short                          vertex_dim;          // $n
    int                            n_knots;             // $d
    SCH_knot_type_t                knot_type;           // $u
    logical                        periodic;            // $l
    logical                        closed;              // $l
    logical                        rational;            // $l
    SCH_curve_form_t               curve_form;          // $u
    struct BSPLINE_VERTICES_s     *bspline_vertices;    // $p
    struct KNOT_MULT_s            *knot_mult;           // $p
    struct KNOT_SET_s             *knots;               // $p
    };
typedef struct NURBS_CURVE_s *NURBS_CURVE;

The bspline vertices node is simply an array of doubles; vertex_dim doubles together define one control vertex. Thus the length of the array is n_vertices * vertex_dim .

 

struct BSPLINE_VERTICES_s        // B-spline vertices
    {
    double                 vertices[ 1 ];               // $f[]
    };
typedef struct BSPLINE_VERTICES_s *BSPLINE_VERTICES;

The knot vector of the NURBS_CURVE is stored as an array of distinct knots and an array describing the multiplicity of each distinct knot. Hence the two nodes:

 

struct KNOT_SET_s                //Knot set
    {
    double                 knots[ 1 ];                  // $f[]
    };
typedef struct KNOT_SET_s *KNOT_SET;

and

 

struct KNOT_MULT_s               //Knot multiplicities
    {
    short                  mult[ 1 ];                   // $n[]
    };
typedef struct KNOT_MULT_s *KNOT_MULT;

The data stored in the XT data for a CURVE_DATA node is:

 

typedef enum
    {
    SCH_unset                     = 1,  //check has not been 
                                         performed
    SCH_no_self_intersections     = 2,  //passed checks
    SCH_self_intersects           = 3,  //fails checks
    SCH_checked_ok_in_old_version = 4  //see below
    }
    SCH_self_int_t;
struct CURVE_DATA_s  //curve_data
    {
    SCH_self_int_t               self_int;              // $u
    Struct HELIX_CU_FORM_s      *analytic_form          // $p
    };
typedef struct CURVE_DATA_s *CURVE_DATA;

The self-intersection enum describes whether or not the geometry has been checked for self-intersections, and whether such self-intersections were found to exist:

The SCH_checked_ok_in_old_version enum indicates that the self-intersection check has been performed by a Parasolid version 5 or earlier but not since.

If the analytic_form field is not null, it will point to a HELIX_CU_FORM node, which indicates that the curve has a helical shape, as follows:

 

struct HELIX_CU_FORM_s
    {
    vector                      axis_pt                 // $v
    vector                      axis_dir                // $v
    vector                      point                   // $v
    char                        hand                    // $c
    interval                    turns                   // $i
    double                      pitch                   // $f
    double                      tol                     // $f
    };
typedef struct HELIX_CU_FORM_s *HELIX_CU_FORM;

The axis_pt and axis_dir fields define the axis of the helix. The hand field is ‘+’ for a right-handed and ‘-’ for a left-handed helix. A representative point on the helix is at turn position zero. The turns field gives the extent of the helix relative to the point. For instance, an interval [0 10] indicates a start position at the point and an end 10 turns along the axis. Pitch is the distance travelled along the axis in one turn. Tol is the accuracy to which the owning B-curve fits this specification.

5.2.1.5 Intersection

An intersection curve is one of the branches of a surface / surface intersection. XT represents these curves exactly; the information held in an intersection curve node is sufficient to identify the particular intersection branch involved, to identify the behaviour of the curve at its ends, and to evaluate precisely at any point in the curve. Specifically, the data is:

The natural tangent to the curve at any point (i.e. in the increasing parameter direction) is given by the vector cross-product of the surface normals at that point, taking into account the senses of the surfaces.

Singular points where the cross-product of the surface normals is zero, or where one of the surfaces is degenerate, are called terminators. Intersection curves do not contain terminators in their interior. At terminators, the tangent to the curve is defined by the limit of the curve tangent as the curve parameter approaches the terminating value.

 

Field Name

Data Type

Description

surface

pointer array [2]

surfaces of intersection curve

chart

Pointer

array of hvecs on the curve - see below

start

Pointer

start limit of the curve

end

Pointer

end limit of the curve

intersection_data

Pointer

optional structure for storing additional information associated with an intersection curve

 

struct INTERSECTION_s == ANY_CURVE_s // Intersection
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  CURVE_OWNER_u          owner;               // $p
    union  CURVE_u                next;                // $p
    union  CURVE_u                previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    union  SURFACE_u             surface[ 2 ];         // $p[2]
    struct CHART_s               *chart;               // $p
    struct LIMIT_s               *start;               // $p
    struct LIMIT_s               *end;                 // $p
nolog struct INTERSECTION_DATA *intersection_data      // $p
    };
typedef struct INTERSECTION_s *INTERSECTION;

A point on an intersection curve is stored in a data structure called an hvec ( hepta-vec , or 7-vector ):

 

typedef struct hvec_s         // hepta_vec
    {
    vector          Pvec;               //position
    double          u[2];               //surface parameters
    double          v[2]; 
    vector          Tangent;            //curve tangent
    double          t;                  //curve parameter
    } hvec;

Where:

 

Note: Only the pvec part of an hvec is actually transmitted.

The chart data structure essentially describes a piecewise-linear (chordal) approximation to the true curve. As well as containing the ordered array of hvec’s defining this approximation, it contains extra information pertaining to the accuracy of the approximation:

 

struct CHART_s          //Chart
    {
    double              base_parameter;                // $f
    double              base_scale;                    // $f
    int                 chart_count;                   // $d
    double              chordal_error;                 // $f
    double              angular_error;                 // $f
    double              parameter_error[2];            // $f[2]
    hvec                hvec[ 1 ];                     // $h[]
    };
typedef struct CHART_s *CHART;

Where:

The limits of the intersection curve are stored in the following data structure:

 

struct LIMIT_s          // Limit
    {
    char                type;                          // $c
char  term_use;//$c
    hvec                hvec[ 1 ];                     // $h[]
    };
typdef struct LIMIT_s *LIMIT;

The ‘type’ field may take one of the following values

 

    const char SCH_help           =´H´;      // help hvec
    const char SCH_terminator     =´T´;      // terminator
    const char SCH_limit          =´L´;      // arbitrary limit
    const char SCH_boundary       =´B´;      // spine boundary

The ‘term_use’ field takes one of the following values

 

const char SCH_unset_char = ´?´ //generic uninvestigated value
const char SCH_first =´F´       //first item
const char SCH_second =´S´      //second item

The length of the hvec array depends on the type of the limit.

The parameterisation of the curve is given as follows. If the chart points are Pi , i = 0 to n , with parameters ti , and natural tangent vectors Ti , then define

Then at any chart point Pi the angles ai and bi are the deviations between the tangent at the chart point and the next and previous chords respectively.

Let f0 = base_scale

Then t0 = base_parameter

The factors fi are chosen so that the parameterisation is C1 . The parameter of a point between two chart points is given by projecting the point onto the chord between the previous and next chart points.

The point on the intersection curve corresponding to a given parameter is defined as follows:

(ti+1 - t) / (ti+1 - ti) Pi + (t - ti) / (ti+1 - ti) Pi+1

The plane lies through this point and is orthogonal to the chord ( Pi+1, Pi ).

The first plane contains the chord between the branch and the terminator, and the normal of the chosen intersection surface at the terminator or the curve tangent at the branch chart point if the surface normal cannot be defined. The second plane is the plane orthogonal to the chord between the branch and terminator points through the chord point as calculated above.

The intersection_data node is an optional structure for storing surface uv parameters from hvecs that are associated with an intersection curve.

 

Note: The intersection_data must match the hvecs

 

struct INTERSECTION_DATA_s          //Intersection data
    {
    SCH_intersection_uv_type_t uv_type; // $u
    double values [1]; // $f[]
    };
typedef struct INTERSECTION_DATA_s*INTERSECTION_DATA;
               inline double      *SCH_INTERSECTION_DATA_values(INTERSECTION_DATA self)
{
   return self -> values;
}
SCH_define_init_fn_m(INTERSECTION_DATA_s, self,
                     self -> uv_type = SCH_intersection_uv_none;
                     double*values   = SCH_INTERSECTION_DATA_values(self);
                         for (int i = 0; i< n_variable; ++i)
                         values [i] = null;
                    )

The intersection_data node contains an enum value and a variable length double array. The enum value specifies the uv values stored in the values array and is set based on the following:

 

typedef enum
    {
    SCH_intersection_uv_none      = 1,
    SCH_intersection_uv_first     = 2,
    SCH_intersection_uv_second    = 3,
    SCH_intersection_uv_both      = 4,
    }
    SCH_intersection_uv_type_t;
char *SCH_intersection_uv_type_sprintf

The uv values are converted to the number of parameters which are stored for each chart hvec as follows:

The variable length double array contains these parameters, and the start and end limits. The values for the start and end limits can be found in the variable length arrays in the LIMIT start, and LIMIT end fields of the INTERSECTION node.

The number of values in the double array is calculated as:

(The number of chart points + The number of terminator limits) * (The number of parameters per hvec)

For each terminator present in the array the number of values will increase by 0, 2, or 4 depending on the intersection_uv_type field. For example, if both the start and the end limits are terminators and the intersection_uv_type is set to SCH_intersection_uv_both the value will increase by 8.

The order of values in the array is as follows:

If the start limit is a terminator:

 

If the intersection_uv_type is...

The order of values in array is...

SCH_intersection_uv_first or SCH_intersection_uv_both

intersection node ->start->hvec[0].u[0]

intersection node ->start->hvec[0].v[0]

SCH_intersection_uv_second or SCH_intersection_uv_both

intersection node ->start ->hvec[0].u[1]

intersection node ->start ->hvec[0].v[1]

For each hvec in the chart:

 

If the intersection_uv_type is...

The order of values in array is...

SCH_intersection_uv_first or SCH_intersection_uv_both

intersection node->chart ->hvec[i].u[0]

intersection node->chart ->hvec[i].v[0]

SCH_intersection_uv_second or SCH_intersection_uv_both

intersection node->chart ->hvec[i].u[1]

intersection node->chart ->hvec[i].v[1]

chart hvecs are wrapped in a loop where i = 0 to the (number of chart hvecs -1).

If end limit is a terminator:

 

If the intersection_uv_type is...

The order of values in array is...

SCH_intersection_uv_first or SCH_intersection_uv_both

intersection node->end ->hvec[0].u[0]

intersection node->end ->hvec[0].v[0]

SCH_intersection_uv_second or SCH_intersection_uv_both

intersection node->end ->hvec[0].u[1]

intersection node->end ->hvec[0].v[1]

5.2.1.6 Trimmed_curve

A trimmed curve is a bounded region of another curve, referred to as its basis curve. It is defined by the basis curve and two points and their corresponding parameters. Trimmed curves are most commonly attached to fins (fins) of tolerant edges in order to specify which portion of the underlying basis curve corresponds to the tolerant edge. They are necessary since the tolerant vertices of the edge do not necessarily lie exactly on the basis curve; the ‘point’ fields of the trimmed curve lie exactly on the basis curve, and within tolerance of the relevant vertex.

The rules governing the parameter fields and points are:

In addition,

For open basis curves.

For periodic basis curves

For closed but non-periodic basis curves

The sense of a trimmed curve is positive.

 

Field name

Data type

Description

basis curve

pointer

basis curve

point_1

vector

start of trimmed portion

point_2

vector

end of trimmed portion

parm_1

double

parameter on basis curve corresponding to point_1

parm_2

double

parameter on basis curve corresponding to point_2

 

struct TRIMMED_CURVE_s == ANY_CURVE_s  //Trimmed Curve
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  CURVE_OWNER_u          owner;               // $p
    union  CURVE_u                next;                // $p
    union  CURVE_u                previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    union  CURVE_u                basis_curve;         // $p
    vector                        point_1;             // $v
    vector                        point_2;             // $v
    double                        parm_1;              // $f
    double                        parm_2;              // $f
    };
typedef struct TRIMMED_CURVE_s *TRIMMED_CURVE;

5.2.1.7 PE_CURVE (Foreign geometry curve)

Foreign geometry in XT is a type used for representing customers’ in-house proprietary data. It is also known as PE (parametrically evaluated) geometry. It can also be used internally for representing geometry connected with this data (for example, offsets of foreign surfaces). These two types of foreign geometry usage are referred to as ‘external’ and ‘internal’ PE data respectively. Internal PE-curves are not used at present.

Applications not using foreign geometry will never encounter either external or internal PE data structures at Parasolid V9 or beyond.

 

Field name

Data type

Description

type

char

whether internal or external

data

pointer

internal or external data

tf

pointer(0)

transform applied to geometry

internal geom

pointer array

reference to other related geometry

union PE_DATA_u  //PE_data_u
{
struct EXT_PE_DATA_s  *external;  //$p
struct INT_PE_DATA_s  *internal;  //$p
};
typedef union PE_DATA_u PE_DATA;

The PE internal geometry union defined below is used by internal foreign geometry only.

 

union PE_INT_GEOM_u
{
union SURFACE_u  surface;  //$p
union CURVE_u  curve;      //$p
};
typedef union PE_INT_GEOM_u PE_INT_GEOM;

 

struct PE_CURVE_s == ANY_CURVE_s  //PE_curve
{
int  node_id;                               /$d
union ATTRIB_FEAT_u  attributes_features;   //$p
union CURVE_OWNER_u  owner;                 //$p
union CURVE_u  next;                        //$p
union CURVE_u  previous;                    //$p
struct GEOMETRIC_OWNER_s  *geometric_owner; //$p
char  sense;                                //$c
char  type;                                 //$c
union PE_DATA_u  data;                      //$p
struct TRANSFORM_s  *tf;                    //$p
union PE_INT_GEOM_u  internal_geom[ 1 ];    //$p[]
};
typedef struct PE_CURVE_s *PE_CURVE;

The type of the foreign geometry (whether internal or external) is identified in the PE-curve node by means of the char ‘type’ field, taking one of the values:

 

const char SCH_external = ´E´; //external PE geometry
const char SCH_interna = ´I´; //internal PE geometry

The PE_data union is used in a PE curve or surface node to identify the internal or external evaluator corresponding to the geometry, and also holds an array of real and/or integer parameters to be passed to the evaluator. The data stored corresponds exactly to that passed to the XT routine PK_FSURF_create when the geometry is created.

 

struct EXT_PE_DATA_s //ext_PE_data
{
struct KEY_s  *key;                    //$p
struct REAL_VALUES_s  *real_array;     //$p
struct INT_VALUES_s  *int_array;       //$p
};
typedef struct EXT_PE_DATA_s *EXT_PE_DATA;

 

struct INT_PE_DATA_s // int_PE_data
{
int  geom_type;                        //$d
struct REAL_VALUES_s  *real_array;     //$p
struct INT_VALUES_s  *int_array;       //$p
};
typedef struct INT_PE_DATA_s *INT_PE_DATA;

The only internal pe type in use at the moment is the offset PE-surface, for which the geom_type is 2.

5.2.1.8 SP_CURVE

An SP-curve is the 3D curve resulting from embedding a 2D curve in the parameter space of a surface.

The 2D curve shall be a 2D B-curve; that is it shall either be a rational B-curve with a vertex dimensionality of 3, or a non-rational B-curve with a vertex dimensionality of 2.

 

Field name

Data type

Description

surface

pointer

surface

b_curve

pointer

2D B-curve

original

pointer(0)

not used

tolerance_to_original

double

not used

 

struct SP_CURVE_s == ANY_CURVE_s //SP curve
    {
    int                           node_id;                // $d
    union  ATTRIB_FEAT_u          attributes_features;    // $p
    union  CURVE_OWNER_u          owner;                  // $p
    union  CURVE_u                next;                   // $p
    union  CURVE_u                previous;               // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;        // $p
    char                          sense;                  // $c
    union  SURFACE_u              surface;                // $p
    struct B_CURVE_s             *b_curve;                // $p
    union  CURVE_u                 original;              // $p
    double                        tolerance_to_original;  // $f
    };
typedef struct SP_CURVE_s *SP_CURVE;

5.2.1.9 Polyline

A polyline describes a connected chain of linear segments. It takes the following additional field:

 

Field name

Data type

Description

data

pointer

contains the data information of the polyline.

 

struct POLYLINE_s == ANY_CURVE_s  //Polyline
{
  int                        node_id;             //$d
  union ATTRIB_FEAT_u        attributes_features; //$p
  union CURVE_OWNER_u        owner;               //$p
  union CURVE_u              next;                //$p
  union CURVE_u              previous;            //$p
  struct GEOMETRIC_OWNER_s  *geometric_owner;     //$p
  char                       sense;               //$c
  struct POLYLINE_DATA_s    *data;                //$p
};
typedef struct POLYLINE_s *POLYLINE;

The data stored in the XT data for a POLYLINE is as follows:

 

struct POLYLINE_DATA_s  //Polyline data
{
  int       n_pvecs;              //$d
  logical   closed;               //$I
  double    base_parm;            //$f
  struct    POINT_VALUES_s*pvec;  //$p
};
typedef struct POLYLINE_DATA_s*POLYLINE_DATA;

Where:

 

Field name

Data type

Description

n_pvecs

integer

number of point vectors

closed

logical

true if polyline is closed

base_parm

double

the parameter of the first pvec in the polyline

pvec

pointer

point vectors that describe the shape of the polyline

5.2.2 Surfaces

All surface nodes share the following common fields:

 

Field name

Data type

Description

node_id

int

integer value unique to surface in part

attributes_features

pointer0

attributes and features associated with surface

owner

pointer

topological owner

next

pointer0

next surface in geometry chain

previous

pointer0

previous surface in geometry chain

geometric_owner

pointer0

geometric owner node

sense

char

sense of surface: ‘+’ or ‘-’(see end of Geometry section)

 

struct ANY_SURF_s     //Any Surface
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    };
typedef struct ANY_SURF_s *ANY_SURF;

5.2.2.1 Plane

A plane has a parametric representation of the form

R(u, v) = P + uX + vY

Where:

 

 

Field name

Data type

Description

pvec

vector

point on the plane

normal

vector

normal to the plane (a unit vector)

x_axis

vector

X axis of the plane (a unit vector)

The Y axis in the definition above is the vector cross product of the normal and x_axis .

 

struct PLANE_s == ANY_SURF_s      //Plane
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    vector                        pvec;                // $v
    vector                        normal;              // $v
    vector                        x_axis;              // $v
    };
typedef struct PLANE_s *PLANE;

5.2.2.2 Cylinder

A cylinder has a parametric representation of the form:

R(u,v) = P + rXcos(u) + rYsin(u) + vA

Where:

 

 

Field name

Data type

Description

pvec

vector

point on the cylinder axis

axis

vector

direction of the cylinder axis (a unit vector)

radius

double

radius of cylinder

x_axis

vector

X axis of the cylinder (a unit vector)

The Y axis in the definition above is the vector cross product of the axis and x_axis .

 

struct CYLINDER_s == ANY_SURF_s   //Cylinder 
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    vector                        pvec;                // $v
    vector                        axis;                // $v
    double                        radius;              // $f
    vector                        x_axis;              // $v
    };
typedef struct CYLINDER_s *CYLINDER;

5.2.2.3 Cone

A cone in XT is only half of a mathematical cone. By convention, the cone axis points away from the half of the cone in use. A cone has a parametric representation of the form:

R(u, v) = P - vA + (Xcos(u) + Ysin(u))(r + vtan(a))

Where:

 

 

Note: At the PK interface, the cone axis is in the opposite direction to that stored in the XT data.

 

Field name

Data type

Description

pvec

vector

point on the cone axis

axis

vector

direction of the cone axis (a unit vector)

radius

double

radius of the cone at its pvec

sin_half_angle

double

sine of the cone’s half angle

cos_half_angle

double

cosine of the cone’s half angle

x_axis

vector

X axis of the cone (a unit vector)

The Y axis in the definition above is the vector cross product of the axis and x_axis .

 

struct CONE_s == ANY_SURF_s       //Cone
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    vector                        pvec;                // $v
    vector                        axis;                // $v
    double                        radius;              // $f
    double                        sin_half_angle;      // $f
    double                        cos_half_angle;      // $f
    vector                        x_axis;              // $v
    };
typedef struct CONE_s *CONE;

5.2.2.4 Sphere

A sphere has a parametric representation of the form:

R(u, v) = C + (Xcos(u) + Ysin(u)) rcos(v) + rAsin(v)

Where:

 

 

Field name

Data type

Description

centre

vector

centre of the sphere

radius

double

radius of the sphere

axis

vector

A axis of the sphere (a unit vector)

x_axis

vector

X axis of the sphere (a unit vector)

The Y axis of the sphere is the vector cross product of its A and X axes.

 

struct SPHERE_s == ANY_SURF_s     //Sphere
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    vector                        centre;              // $v
    double                        radius;              // $f
    vector                        axis;                // $v
    vector                        x_axis;              // $v
    };
typedef struct SPHERE_s *SPHERE;

5.2.2.5 Torus

A torus has a parametric representation of the form

R(u, v) = C + (X cos(u) + Y sin(u))(a + b cos(v)) + b A sin(v)

Where:

In XT, there are three types of torus:

Doughnut - the torus is not self-intersecting ( a > b )

Apple - the outer part of a self-intersecting torus ( a <= b, a > 0 )

Lemon - the inner part of a self-intersecting torus ( a < 0, |a| < b )

The limiting case a = b is allowed; it is called an ‘osculating apple’, but there is no ‘lemon’ surface corresponding to this case.

The limiting case a = 0 cannot be represented as a torus; this must be represented as a sphere.

 

Field name

Data type

Description

centre

vector

centre of the torus

axis

vector

axis of the torus (a unit vector)

major_radius

double

major radius

minor_radius

double

minor radius

x_axis

vector

X axis of the torus (a unit vector)

The Y axis in the definition above is the vector cross product of the axis of the torus and the x_axis .

 

struct TORUS_s == ANY_SURF_s      //Torus
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    vector                        centre;              // $v
    vector                        axis;                // $v
    double                        major_radius;        // $f
    double                        minor_radius;        // $f
    vector                        x_axis;              // $v
    };
typedef struct TORUS_s *TORUS;

5.2.2.6 Blended_edge (Rolling ball blend)

XT supports exact rolling ball blends. They have a parametric representation of the form

R(u, v) = C(u) + rX(u)cos(v a(u)) + rY(u)sin(va(u))

Where:

 

X and Y are expressed as functions of u , as their values change with u .

The spine of the rolling ball blend is the center line of the blend; i.e. the path along which the center of the ball moves.

 

Field name

Data type

Description

type

char

type of blend: ‘R’ or ‘E’

surface

pointer[2]

supporting surfaces (adjacent to original edge)

spine

pointer

spine of blend

range

double[2]

offsets to be applied to surfaces

thumb_weight

double[2]

always [1,1]

boundary

pointer0[2]

always [0, 0]

start

pointer0

Start LIMIT in certain degenerate cases

end

pointer0

End LIMIT in certain degenerate cases

 

struct BLENDED_EDGE_s == ANY_SURF_s  //Blended edge
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    char                          blend_type;          // $c
    union  SURFACE_u              surface[2];          // $p[2]
    union  CURVE_u                spine;               // $p
    double                        range[2];            // $f[2]
    double                        thumb_weight[2];     // $f[2]
    union  SURFACE_u              boundary[2];         // $p[2]
    struct LIMIT_s               *start;               // $p
    struct LIMIT_s               *end;                 // $p
    };
typedef struct BLENDED_EDGE_s *BLENDED_EDGE;

The parameterisation of the blend is as follows. The u parameter is inherited from the spine, the constant u lines being circles perpendicular to the spine curve. The v parameter is zero at the blend boundary on the first surface, and one on the blend boundary on the second surface; unless the sense of the spine curve is negative, in which case it is the other way round. The v parameter is proportional to the angle around the circle.

XT data can contain blends of the following types:

 

    const char SCH_rolling_ball = ´R´;   // rolling ball blend
    const char SCH_cliff_edge =   ´E´;   // cliff edge blend

For rolling ball blends, the spine curve will be the intersection of the two surfaces obtained by offsetting the supporting surfaces by an amount given by the respective entry in range[] . Note that the offsets to be applied may be positive or negative, and that the sense of the surface is significant; i.e. the offset vector is the natural unit surface normal, times the range, times -1 if the sense is negative.

For cliff edge blends, one of the surfaces will be a blended_edge with a range of [0,0]; its spine will be the cliff edge curve, and its supporting surfaces will be the surfaces of the faces adjacent to the cliff edge. Its type will be R .

The limit fields will only be non-null if the spine curve is periodic but the edge curve being blended has terminators - for example if the spine is elliptical but the blend degenerates. In this case the two LIMIT nodes, of type ‘L’, determine the extent of the spine.

5.2.2.7 Blend_bound (Blend boundary surface)

A blend_bound surface is a construction surface, used to define the boundary curve where a blend becomes tangential to its supporting surface. It is an implicit surface defined internally so that it intersects one of the supporting surfaces along the boundary curve. It is orthogonal to the blend and the supporting surface along this boundary curve. The supporting surface corresponding to the blend_bound is

Blend_bound -> blend.blended_edge -> surface[1-blend_bound->boundary]

Blend boundary surfaces have no parameterisation, but are defined by the distance function

f(X) = f0 (X + r1 * grad_f1 (X)) - r0

Where:

Blend boundary surfaces are most commonly referenced by the intersection curve representing the boundary curve of the blend.

The data stored in the XT data for a blend_bound is only that necessary to identify the relevant blend and supporting surface:

 

Field name

Data type

Description

boundary

short

index into supporting surface array

blend

pointer

corresponding blend surface

 

struct BLEND_BOUND_s == ANY_SURF_s  //Blend boundary
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    short                         boundary;            // $n
    union  SURFACE_u              blend;               // $p
    };
typedef struct BLEND_BOUND_s *BLEND_BOUND;

The supporting surface corresponding to the blend_bound is

Blend_bound -> blend.blended_edge -> surface[1-blend_bound->boundary]

5.2.2.8 Offset_surf

An offset surface is the result of offsetting a surface a certain distance along its normal, taking into account the surface sense. It inherits the parameterisation of this underlying surface.

 

Field name

Data type

Description

check

char

check status

true_offset

logical

not used

surface

pointer

underlying surface

offset

double

signed offset distance

scale

double

for internal use only - may be set to null

 

struct OFFSET_SURF_s == ANY_SURF_s  //Offset surface
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    char                          check;               // $c
    logical                       true_offset;         // $l
    union  SURFACE_u              surface;             // $p
    double                        offset;              // $f
    double                        scale;               // $f
    };
typedef struct OFFSET_SURF_s *OFFSET_SURF;

The offset surface is subject to the following restrictions:

The ‘check’ field may take one of the following values:

 

    const char SCH_valid      = ´V´;    // valid
    const char SCH_invalid    = ´I´;    // invalid
    const char SCH_unchecked  = ´U´;    // has not been checked

5.2.2.9 B_surface

XT supports B-spline surfaces in full NURBS format.

B-SURFACE DEFINITION

 

The B-surface definition is best thought of as an extension of the B-curve definition into two parameters, usually called u and v . Two knot sets are required and the number of control vertices is the product of the number that would be required for a curve using each knot vector. The rules for periodicity and closure given above for curves are extended to surfaces in an obvious way.

For attachment to topology a B-surface is required to have G1 continuity. That is to say that the surface normal direction shall be continuous.

XT does not support modelling with surfaces that are self-intersecting or contain cusps. Although they can be created they are not permitted to be attached to topology.

 

Field name

Data type

Description

nurbs

pointer

Geometric definition

data

pointer0

Auxiliary information

 

struct B_SURFACE_s == ANY_SURF_s  //B surface
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    struct NURBS_SURF_s          *nurbs;               // $p
    struct SURFACE_DATA_s        *data;                // $p
    };
typedef struct B_SURFACE_s *B_SURFACE;

The data stored in the XT data for a NURBS surface is:

 

Field name

Data type

Description

u_periodic

logical

true if surface is periodic in u parameter

v_periodic

logical

true if surface is periodic in v parameter

u_degree

short

u degree of the surface

v_degree

short

v degree of the surface

n_u_vertices

int

number of control vertices (‘poles’) in u direction

n_v_vertices

int

number of control vertices (‘poles’) in v direction

u_knot_type

byte

form of u knot vector - see “B-curve”

v_knot_type

byte

form of v knot vector

n_u_knots

int

number of distinct u knots

n_v_knots

int

number of distinct v knots

rational

logical

true if surface is rational

u_closed

logical

true if surface is closed in u

v_closed

logical

true if surface is closed in v

surface_form

byte

shape of surface, if special

vertex_dim

short

dimension of control vertices

bspline_vertices

pointer

control vertices (poles) node

u_knot_mult

pointer

multiplicities of u knot vector

v_knot_mult

pointer

multiplicities of v knot vector

u_knots

pointer

u knot vector

v_knots

pointer

v knot vector

The surface form enum is defined below.

 

typedef enum
    {
    SCH_unset              = 1,          //Unknown
    SCH_arbitrary          = 2,          //No particular shape
    SCH_planar             = 3,
    SCH_cylindrical        = 4,
    SCH_conical            = 5,
    SCH_spherical          = 6,
    SCH_toroidal           = 7,
    SCH_surf_of_revolution = 8,
    SCH_ruled              = 9,
    SCH_quadric            = 10,
    SCH_swept              = 11
    }
    SCH_surface_form_t;

 

struct NURBS_SURF_s               //NURBS surface
    {
    logical                       u_periodic;           // $l
    logical                       v_periodic;           // $l
    short                         u_degree;             // $n
    short                         v_degree;             // $n
    int                           n_u_vertices;         // $d
    int                           n_v_vertices;         // $d
    SCH_knot_type_t               u_knot_type;          // $u
    SCH_knot_type_t               v_knot_type;          // $u
    int                           n_u_knots;            // $d
    int                           n_v_knots;            // $d
    logical                       rational;             // $l
    logical                       u_closed;             // $l
    logical                       v_closed;             // $l
    SCH_surface_form_t            surface_form;         // $u
    short                         vertex_dim;           // $n
    struct BSPLINE_VERTICES_s    *bspline_vertices;     // $p
    struct KNOT_MULT_s           *u_knot_mult;          // $p
    struct KNOT_MULT_s           *v_knot_mult;          // $p
    struct KNOT_SET_s            *u_knots;              // $p
    struct KNOT_SET_s            *v_knots;              // $p
    };
typedef struct NURBS_SURF_s *NURBS_SURF;

The bspline_vertices , knot_set and knot_mult nodes and the knot_type enum are described in the documentation for BCURVE.

The ‘surface data’ field in a B-surface node is a structure designed to hold auxiliary or ‘derived’ data about the surface: it is not a necessary part of the definition of the B-surface. It may be null, or the majority of its individual fields may be null. It is recommended that it only be set by Parasolid.

 

struct SURFACE_DATA_s         //auxiliary surface data
    {
    interval                  original_uint;            // $i
    interval                  original_vint;            // $i
    interval                  extended_uint;            // $i
    interval                  extended_vint;            // $i
    SCH_self_int_t            self_int;                 // $u
    char                      original_u_start;         // $c
    char                      original_u_end;           // $c
    char                      original_v_start;         // $c
    char                      original_v_end;           // $c
    char                      extended_u_start;         // $c
    char                      extended_u_end;           // $c
    char                      extended_v_start;         // $c
    char                      extended_v_end;           // $c
    char                      analytic_form_type;       // $c
    char                      swept_form_type;          // $c
    char                      spun_form_type;           // $c
    char                      blend_form_type;          // $c
    void                     *analytic_form;            // $p
    void                     *swept_form;               // $p
    void                     *spun_form;                // $p
    void                     *blend_form;               // $p
    };
typedef struct SURFACE_DATA_s *SURFACE_DATA;

The ‘original_’ and ‘extended_’ parameter intervals and corresponding character fields original_u_start etc. are all connected with XT’s ability to extend B-surfaces when necessary - functionality which is commonly exploited in “local operation” algorithms for example. This is done automatically without the need for user intervention.

In cases where the required extension can be performed by adding rows or columns of control points, then the nurbs data will be modified accordingly - this is referred to as an ‘explicit’ extension. In some rational B-surface cases, explicit extension is not possible - in these cases, the surface will be ‘implicitly’ extended. When a B-surface is implicitly extended, the nurbs data is not changed, but it will be treated as being larger by allowing out-of-range evaluations on the surface. Whenever an explicit or implicit extension takes place, it is reflected in the following fields:

The character fields original_u_start etc. all refer to the status of the corresponding parameter boundary of the surface before or after an extension has taken place. For B-surfaces, the character can have one of the following values:

 

const char SCH_degenerate = ´D´;    //Degenerate edge
const char SCH_periodic   = ´P´;    //Periodic parameterization
const char SCH_bounded    = ´B´;    //Parameterization bounded
const char SCH_closed     = ´C´;    //Closed, but not periodic

The separate fields original_u_start and extended_u_start etc. are necessary because an extension may cause the corresponding parameter boundary to become degenerate.

If the surface_data node is present, then the original_u_int , original_v_int , original_u_start , original_u_end , original_v_start and original_v_end fields should be set to their appropriate values. If the surface has not been extended, the extended_u_int and extended_v_int fields should contain null, and the extended_u_start etc. Fields should contain:

const char SCH_unset_char = '?'; //generic uninvestigated value

As soon as any parameter boundary of the surface is extended, all the fields should be set, regardless of whether the corresponding boundary has been affected by the extension.

The SCH_self_int_t enum is documented in the corresponding curve_data structure under B-curve.

The swept_form_type , spun_form_type and blend_form_type characters and the corresponding pointers swept_form , spun_form and blend_form , are for future use and are not implemented in Parasolid . The character fields should be set to SCH_unset_char (‘?’) and the pointers should be set to null pointer.

If the analytic_form field is not null, it will point to a HELIX_SU_FORM node, which indicates that the surface has a helical shape. In this case the analytic_form_type field will be set to ‘H’.

 

struct HELIX_SU_FORM_s
    {
    vector                  axis_pt;                     // $v
    vector                  axis_dir;                    // $v
    char                    hand;                        // $c
    interval                turns;                       // $i
    double                  pitch;                       // $f
    double                  gap;                         // $f
    double                  tol;                         // $f
    };
typedef struct HELIX_SU_FORM_s *HELIX_SU_FORM;

The axis_pt and axis_dir fields define the axis of the helix. The hand field is ‘+’ for a right-handed and ‘-’ for a left-handed helix. The turns field gives the extent of the helix relative to the profile curve which was used to generate the surface. For instance, an interval [0 10] indicates a start position at the profile curve and an end 10 turns along the axis. Pitch is the distance travelled along the axis in one turn. Tol is the accuracy to which the owning bsurface fits this specification. Gap is for future expansion and will currently be zero. The v parameter increases in the direction of the axis.

5.2.2.10 Swept_surf

A swept surface has a parametric representation of the form:

R(u, v) = C(u) + vD

Where:

 

 

Field name

Data type

Description

section

pointer

section curve

sweep

vector

swept direction (a unit vector)

scale

double

for internal use only - may be set to null

 

struct SWEPT_SURF_s == ANY_SURF_s  //Swept surface
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    union  CURVE_u                section;             // $p
    vector                        sweep;               // $v
    double                        scale;               // $f
    };
typedef struct SWEPT_SURF_s *SWEPT_SURF;

5.2.2.11 Spun_surf

A spun surface has a parametric representation of the form:

R(u, v) = Z(u) + (C(u) - Z(u))cos(v) + A X (C(u) - Z(u)) sin(v)

Where:

 

 

Note: Z(u) = P + ((C(u) - P). A)A where P is a reference point on the axis.

 

Field name

Data type

Description

profile

pointer

profile curve

base

vector

point on spin axis

axis

vector

spin axis direction (a unit vector)

start

vector

position of degeneracy at low u (may be null)

end

vector

position of degeneracy at low v (may be null)

start_param

double

curve parameter at low u degeneracy (may be null)

end_param

double

curve parameter at high u degeneracy (may be null)

x_axis

vector

unit vector in profile plane if common with spin axis

scale

double

for internal use only - may be set to null

 

struct SPUN_SURF_s == ANY_SURF_s  //Spun surface
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_features; // $p
    union  SURFACE_OWNER_u        owner;               // $p
    union  SURFACE_u              next;                // $p
    union  SURFACE_u              previous;            // $p
    struct GEOMETRIC_OWNER_s     *geometric_owner;     // $p
    char                          sense;               // $c
    union  CURVE_u                profile;             // $p
    vector                        base;                // $v
    vector                        axis;                // $v
    vector                        start;               // $v
    vector                        end;                 // $v
    double                        start_param;         // $f
    double                        end_param;           // $f
    vector                        x_axis;              // $v
    double                        scale;               // $f
    };
typedef struct SPUN_SURF_s *SPUN_SURF;

The ‘start’ and ‘end’ vectors correspond to physical degeneracies on the spun surface caused by the profile curve crossing the spin axis at that point. The values start_param and end_param are the corresponding parameters on the curve. These parameter values define the valid range for the u parameter of the surface. If either value is null, then the valid range for u is infinite in that direction. For example, for a straight line profile curve intersecting the spin axis at the parameter t=1 , values of null for start_param and 1 for end_param would define a cone with u parameterisation(-infinity, 1].

If the profile curve lies in a plane containing the spin axis, then x_axis shall be set to a vector perpendicular to the spin axis and in the plane of the profile, pointing from the spin axis to a point on the profile curve in the valid range. If the profile curve is not planar, or its plane does not contain the spin axis, then x_axis should be set to null.

5.2.2.12 PE_surf (Foreign geometry surface)

Foreign (or ‘PE’) geometry in XT is a type used for representing customers’ in-house proprietary data. It can also be used internally for representing geometry connected with this data (for example, offset foreign surfaces). These two types of foreign geometry usage are referred to as ‘external’ and ‘internal’ respectively. The only internal PE-surface is the offset PE-surface.

Applications not using foreign geometry will never encounter either external or internal PE data structures at Parasolid V9 or beyond.

 

Field name

Data type

Description

type

char

whether internal or external

data

pointer

internal or external data

tf

pointer0

transform applied to geometry

internal geom

pointer array

reference to other related geometry

 

struct PE_SURF_s == ANY_SURF_s  //PE_surface
{
int  node_id;  //$d
union ATTRIB_FEAT_u               attributes_features;   //$p
union SURFACE_OWNER_u             owner;                 //$p
union SURFACE_u                   next;                  //$p
union SURFACE_u                   previous;              //$p
struct GEOMETRIC_OWNER_s         *geometric_owner;       //$p
char                              sense;                 //$c
char                              type;                  //$c
union PE_DATA_u                   data;                  //$p
struct TRANSFORM_s                tf;                    //$p
union PE_INT_GEOM_u               internal_geom[ 1 ];    //$p[]
};
typedef struct PE_SURF_s *PE_SURF;

The PE_DATA and PE_INT_GEOM unions are defined under ‘PE-curve’.

5.2.3 Mesh Surfaces

Each MESH surface node references a PSM_MESH node containing facet data. Meshes cannot be shared by more than one face of a body.

 

Field name

Data type

Description

mesh box

box

may contain an axis-aligned box bounding the mesh

transform

pointer0

transform applied

rcv_key

pointer0

key of XMM file containing PSM mesh data. This field is not used.

rcv_index

int

unique integer value corresponding to the index of the PSM_MESH in the POINTER_LIS_BLOCK used as the root node in the corresponding XT mesh data file, if used

psm_imesh

pointer0

a pointer to the PSM_MESH node when mesh data is embedded in the XT part or partition file

pff_imesh

pointer0

a pointer to mesh data in the internal debug format. This is for internal use only.

 

struct MESH_s == ANY_SURF_s  //Mesh
{
int                         node_id;              //$d
union  ATTRIB_FEAT_u        attributes_features;  //$p
union  SURFACE_OWNER_u      owner;                //$p
union  SURFACE_u            next;                 //$p
union  SURFACE_u            previous;             //$p
struct GEOMETRIC_OWNER_s   *geometric_owner;      //$p
char                        sense;                //$c
box                         mesh_box;             //$b
struct TRANSFORM_s         *transform;            //$p
union  MESH_KEY_u           rcv_key;              //$p
int                         rcv_index;            //$d
struct PSM_MESH_s          *psm_imesh;            //$p
struct PFF_MESH_s          *pff_imesh;            //$p
};
typedef struct MESH_s *MESH;

The rcv_key field is not used and must always be set to null pointer.

The PSM mesh data may be embedded in the XT part or partition file, or stored in an associated XT mesh data file. The definition of the PSM mesh data is identical in both cases. When PSM mesh data is stored in an associated XT mesh data file the psm_imesh field must be set to null pointer.

5.2.3.1 PSM mesh

Mesh data is stored in a PSM_MESH node, which is referenced by the MESH node.

The mesh data is described using the following fields:

 

Field Name

Data Type

Description

precision

byte

number format used to store the mesh data

owner

pointer0

mesh data owner

position_pool

pointer

array of positions. See Section 5.2.3.2

normal_pool

pointer0

array of directions stored in polar coordinates. See Section 5.2.3.4

position_indices

pointer

array of 3N indices into the position pool, where N is the number of facets. See Section 5.2.3.3

normal_type

byte

form of mesh normals

normal_indices

pointer0

array of 3N indices into the normal pool, where N is the number of facets. See Section 5.2.3.5

 

typedef enum
{
SCH_mesh_normal_none       = 1,
SCH_mesh_normal_per_vertex = 2,
SCH_mesh_normal_per_facet  = 3
}
SCH_mesh_normal_type_t;
 
typedef enum
{
SCH_mesh_precision_double  = 1,
SCH_mesh_precision_single  = 2
}
SCH_mesh_precision_t;
 
struct PSM_MESH_s  //PSM Mesh
{
SCH_mesh_precision_t        precision;  //$u
struct MESH_s              *owner;  //$p
struct VECTOR_COMB_s       *position_pool;  //p
struct VECTOR_COMB_s       *normal_pool;  //$p
struct INTEGER_COMB_s      *position_indices;  //$p
SCH_mesh_normal_type_t      normal_type;  //$u
struct INTEGER_COMB_s      *normal_indices;  //$p
};

The owner field is reserved for future use and must be set to null pointer.

The precision field is reserved for future use and must be set to 1, i.e. double precision.

The normal_type defines whether normals are stored, and if so, whether storage is on a per-facet or per-vertex basis. See Section 5.2.3.5, “Normal indices”, for more information.

5.2.3.2 Position pool

The position pool is an indexed point cloud. The vector array is stored using “comb” nodes, each of which consists of a “spine” array containing pointers to “tooth” arrays. Each tooth array contains the vector information. All the teeth have the same length, which is a power of 2. See Section 5.2.7, “Comb nodes” for more information on the VECTOR_COMB node.

5.2.3.3 Position indices

The mesh is defined by each facet specifying 3 positions from the position pool. The indices for these positions are stored in an integer comb, similar to the vector comb. See Section 5.2.7, “Comb nodes” for more information on INTEGER_COMB nodes.

5.2.3.4 Normal pool

The normal pool is an indexed cloud of normals, i.e. unit vectors. These are stored in double-precision spherical polar coordinates.

The normal pool is optional, so need not exist at all.

5.2.3.5 Normal indices

If normals are stored with the mesh they must be stored for each vertex of each facet. The type of normal storage used by the mesh data is specified by the normal_type field.

5.2.4 Lattices

Each LATTICE node references a LATTICE_DATA node containing the lattice geometry data.

 

Field name

Data type

Description

node_id

int

integer unique within part

attribute_feature

pointer0

attributes and features associated with lattice

owner

pointer0

owner

next

pointer0

next lattice in geometry chain

previous

pointer0

previous lattice in geometry chain

geometric_owner

pointer0

geometric owner node

sense

char

sense of lattice: ‘+’ or ‘-’ (see Section 5.2.8, “Curve, surface and lattice senses”)

data

pointer0

lattice geometry data

 

struct LATTICE_s                    //Lattice
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u          attributes_feature;  // $p
    union  LATTICE_OWNER_u        owner;               // $p
    struct LATTICE_s             *next;                // $p
    struct LATTICE_s             *previous;            // $p
    struct GEOMETRIC_OWNER_S     *geometric_owner;     // $p
    char                          sense;               // $c
    union  LATTICE_DATA_u         data;                // $p
    };
typedef struct LATTICE_s *LATTICE

 

union LATTICE_OWNER_u
    {
    struct BODY_s                *body; 
    struct ASSEMBLY_s            *assembly;
    struct WORLD_s               *world; 
    };
 
typedef union LATTICE_OWNER_u LATTICE_OWNER;

 

union LATTICE_DATA_u
    {
    DS_block_p_t                     any;
    struct LATTICE_DATA_IRREGULAR_s *irregular;
    };
 
typedef union LATTICE_DATA_u LATTICE_DATA;

5.2.4.1 Irregular lattice node

Lattice data is stored in a LATTICE_DATA_IRREGULAR node, which is referenced by the LATTICE node. The lattice data is described using the following fields:

 

Field name

Data type

Description

connectivity

pointer

graph of lattice. See the GRAPH_COMPACT node below for more information.

positions

pointer

array of positions

ball_type

byte

form of ball radii

ball_radius

double

constant radius for balls

ball_radii

pointer

array of variable radii for balls

ball_rod_radii

pointer

array of variable radii for rods at balls

ball_blend_type

byte

type of blend for the balls

ball_blend_size

double

constant blend size for balls

ball_blend_sizes

pointer

array of variable blend sizes for balls if ball_blend_type is anything other than SCH_ball_blend_none and ball_blend_size is zero.

rod_term_type

byte

form of rod terminal radii

rod_term_radius

double

constant terminal radius for rods

rod_start_radii

pointer

array of variable radii for start of rod

rod_end_radii

pointer

array of variable radii for ends of rod

rod_mid_type

byte

form of mid radius of rods

rod_mid_radius

double

constant mid radius for rods

rod_mid_radii

pointer

array of mid radii for rods

 

struct LATTICE_DATA_IRREGULAR_s            //General lattice data
    {
    struct GRAPH_COMPACT_s        *connectivity;       // $p
    struct VECTOR_COMB_s_         *positions;          // $p
    SCH_lattice_ball_type_t        ball_type;          // $u
    double                         ball_radius;        // $f
    struct REAL_COMB_s            *ball_radii;         // $p
    struct REAL_COMB_s            *ball_rod_radii;     // $p
     SCH_lattice_ball_blend_type_t  ball_blend_type;    // $u
    double                         ball_blend_size;    // $f
    struct REAL_COMB_s            *ball_blend_sizes;   // $p
    SCH_lattice_rod_term_type_t    rod_term_type;      // $u
    double                         rod_term_radius;    // $f
    struct REAL_COMB_s            *rod_start_radii;    // $p
    struct REAL_COMB_s            *rod_end_radii;      // $p
    SCH_lattice_rod_mid_type_t     rod_mid_type;       // $u
    double                         rod_mid_radius;     // $f
    struct REAL_COMB_s            *rod_mid_radii;      // $p
  };
typedef struct LATTICE_DATA_IRREGULAR_s *LATTICE_DATA_IRREGULAR;

The GRAPH_COMPACT node stores graph data for a lattice and is defined as follows:

 

typedef struct GRAPH_COMPACT_s  //Graph data
{
    struct INTEGER_COMB_s       *adjacency_indices;        // $p
    struct INTEGER_COMB_s_      *adjacencies;              // $p
};
 
typedef struct GRAPH_COMPACT_s *GRAPH_COMPACT; 
 
 
SCH_define_init_fn_m( GRAPH_COMPACT_S, SELF,
                      self -> adjacency_indices = null;
                      self -> adjacencies       = null;
                     ) 
 

The ball_type enum defines the type of ball radii

 

typedef short short enum
    {
    SCH_ball_unset    = 0,
    SCH_ball_const    = 1,
    SCH_ball_variable = 2
    }
    SCH_lattice_ball_type_t;

The ball_blend_type enum defines the type of ball blend

 

typedef short short enum
    {
    SCH_ball_blend_none = 0,
    SCH_ball_blend_absolute = 1,
    SCH_ball_blend_relative = 2,
    }
    SCH_lattice_ball_blend_type_t;

The rod_term_type enum defines the type of rod terminal radii

 

typedef short short enum
    {
    SCH_rod_term_unset      = 0,
    SCH_rod_term_const      = 1,
    SCH_rod_term_derived    = 2,
    SCH_rod_term_variable_1 = 3,
    SCH_rod_term_variable_2 = 4
    }
    SCH_lattice_rod_term_type_t;

The rod_mid_type enum defines the type of the rod mid radii

 

typedef short short enum
    {
    SCH_rod_mid_unset      = 0,
    SCH_rod_mid_none       = 1,
    SCH_rod_mid_const      = 2,
    SCH_rod_mid_variable   = 3
    }
    SCH_lattice_rod_mid_type_t;

The arrays in the LATTICE_DATA_IRREGULAR node are stored using “comb” nodes, each of which consists of a “spine” array containing pointers to “tooth” arrays. Each tooth array contains the vector or real information. See Section 5.2.7, “Comb nodes” for more information.

5.2.5 Point

 

Field name

Data type

Description

node_id

int

integer unique within part

attributes_features

pointer0

attributes and features associated with point

owner

pointer

owner

next

pointer0

next point in chain

previous

pointer0

previous point in chain

pvec

vector

position of point

 

union POINT_OWNER_u
    {
    struct VERTEX_s              *vertex; 
    struct BODY_s                *body; 
    struct ASSEMBLY_s            *assembly;
    struct WORLD_s               *world; 
    };

 

struct POINT_s                    //Point
    {
    int                           node_id;             // $d
    union  ATTRIB_FEAT_u        
    attributes_features;                               // $p
    union  POINT_OWNER_u          owner;               // $p
    struct POINT_s               *next;                // $p
    struct POINT_s               *previous;            // $p
    vector                        pvec;                // $v
    };
typedef struct POINT_s *POINT;

5.2.6 Transform

 

Field name

Data type

Description

node_id

int

integer unique within part

owner

pointer

owning instance or world

next

pointer0

next transform in chain

previous

pointer0

previous pointer in chain

rotation_matrix

double[3][3]

rotation component

translation_vector

vector

translation component

scale

double

scaling factor

flag

byte

binary flags indicating non-trivial components

perspective_vector

vector

perspective vector (always null vector)

precision

pointer0

additional precision data for the transform

The transform acts as:

x’ = (rotation_matrix . x + translation_vector) * scale

The ‘flag’ field contains various bit flags which identify the components of the transformation:

 

Field name

Data type

Description

translation

00001

set if translation vector non-zero

rotation

00010

set if rotation matrix is not the identity

scaling

00100

set if scaling component is not 1.0

reflection

01000

set if determinant of rotation matrix is negative

general affine

10000

set if the rotation_matrix is not a rigid rotation

 

union TRANSFORM_OWNER_u{
    struct INSTANCE_s          *instance; 
    struct WORLD_s             *world;
    };

 

struct TRANSFORM_s               //Transformation
    {
    int                           node_id;                 // $d
    union TRANSFORM_OWNER_u       owner;                   // $p
    struct TRANSFORM_s           *next;                    // $p
    struct TRANSFORM_s           *previous;                // $p
    double                        rotation_matrix[3][3];   // $f[9]
    vector                        translation_vector;      // $v
    double                        scale;                   // $f
    unsigned                      flag;                    // $d
    vector                        perspective_vector;      // $v
struct TRANSFORM_PRECISION_s     *precision;               // $p
    };
typedef struct TRANSFORM_s *TRANSFORM;

The TRANSFORM_PRECISION node is an optional structure for storing additional precision information of the transform and is defined as follows:

 

struct TRANSFORM_PRECISION_s     //Transformation precision
{
double  rotation_matrix[3][3];    //$f[3*3]
vector  translation_vector;       //$v
};
typedef struct TRANSFORM_PRECISION_s *TRANSFORM_PRECISION;

 

Note: When consuming Parasolid-native XT, the values in the TRANSFORM_PRECISION structure (when not NULL) should be added to those in the rotation_matrix and translation_vector values in the parent TRANSFORM structure.

When using the format reference to write XT data, the TRANSFORM_PRECISION structure should not typically be used.

5.2.7 Comb nodes

5.2.7.1 VECTOR_COMB nodes

The VECTOR_COMB node stores an array of double precision vectors.

The vector array is stored using “comb” nodes, each of which consists of a “spine” array containing pointers to “tooth” arrays. Each tooth array contains the vector information. All the teeth have the same length, which is a power of 2.

 

Field Name

Data Type

Description

encoding

byte

Form of the vector coordinates

n_vectors

int

Number of vectors stored in the comb

n_max_vectors

int

Maximum number of vectors for which space has been allocated in the comb

shift

int

Capacity of the tooth, defined as 2 shift

teeth

pointer array

Array of pointers to vector teeth

 

struct VECTOR_TOOTH_s                         //Vector Tooth
{
double                      values[1];        //$f[]
};
 
typedef enum
{
SCH_vector_simple    = 1,
SCH_vector_spherical = 2
}
SCH_vector_encoding_t;
 
struct VECTOR_COMB_s  //Vector Comb
{
SCH_vector_encoding_t       encoding;        //$u
int                         n_vectors;       //$d
int                         n_max_vectors;   //$d
int                         shift;           //$d
struct VECTOR_TOOTH_s      *teeth[1]     ;  //$p[]
};

The encoding enum determines the number of values used to store the vectors:

5.2.7.2 INTEGER_COMB nodes

Similar to vector comb nodes and is defined as follows:

 

struct INTEGER_TOOTH_s                            //Integer Tooth
{
int                         values[1];            //$d[]
};
 
typedef enum
{
SCH_no_encoding       = 1
}
SCH_comb_encoding_t;
 
struct INTEGER_COMB_s                            //Integer Comb
{
SCH_comb_encoding_t         encoding;            //$u
int                         n_integers;          //$d
int                         n_max_integers;      //$d
int                         n_bits_per_integer;  //$d
int                         shift;               //$d
struct INTEGER_TOOTH_s     *teeth[1];            //$p[]
};

The encoding enum is reserved for future use. The n_bits_per_integer integer is not used and must be set to 32.

5.2.7.3 REAL_COMB nodes

These are similar to vector nodes and are described as follows:

 

Field Name

Data Type

Description

encoding

byte

Reserved for future use

length

int

Number of reals stored in the comb

max_length

int

Maximum length

shift

int

Capacity of the tooth, defined as 2 shift

teeth

pointer array

Array of pointers to real teeth

 

struct REAL_TOOTH_s                            //Real Tooth
{
int                      values[1];            //$d[]
};
 
typedef enum
{
SCH_no_encoding       = 1
}
SCH_comb_encoding_t;
 
struct REAL_COMB_s                              //Real Comb
    {
    SCH_comb_encoding_t         encoding;       //$u
    int                         length;         //$d
    int                         max_length;     //$d
    int                         shift;          //$d
    struct REAL_TOOTH_s        *teeth[1];       //$p[]
    };
typedef struct REAL_COMB_s *REAL_COMB;

5.2.8 Curve, surface and lattice senses

The ‘natural’ tangent to a curve is that in the increasing parameter direction, and the ‘natural’ normal to a surface is in the direction of the cross-product of dP/du and dP/dv. For some purposes these are modified by the curve and surfaces senses, respectively - for example in the definition of blend surfaces, offset surfaces and intersection curves.

At the XT interface, the edge/curve and face/surface sense orientations are regarded as properties of the topology/geometry combination. In the XT format, this orientation information resides in the curves, surfaces and faces as follows:

The edge/curve orientation is stored in the curve->sense field. The face/surface orientation is a combination of sense flags stored in the face->sense and surface->sense fields, so the face/surface orientation is true (i.e. the face normal is parallel to the natural surface normal) if neither, or both, of the face and surface senses are positive.

In the XT Format, the orientation information of lattices is stored in the sense field. If the sense is positive, the interior of the lattice is considered solid, and void if the sense is negative.

5.2.9 Geometric_owner

Where geometry has dependants, the dependants point back to the referencing geometry by means of Geometric Owner nodes. Each geometric node points to a doubly-linked ring of Geometric Owner nodes which identify its referencing geometry. Referenced geometry is as follows:

 

Note: The 2D B-curve referenced by an SP-curve is not a dependent in this sense, and does not need a geometric owner node.

 

Field name

Data type

Description

owner

pointer

referencing geometry

next

pointer

next in ring of geometric owners referring to the same geometry

previous

pointer

previous in above ring

shared_geometry

pointer

referenced (dependent) geometry

 

struct GEOMETRIC_OWNER_s      //geometric owner of geometry
    {
    union  GEOMETRY_u              owner;               // $p
    struct GEOMETRIC_OWNER_s      *next;                // $p
    struct GEOMETRIC_OWNER_s      *previous;            // $p
    union  GEOMETRY_u              shared_geometry;     // $p
    };
typedef struct GEOMETRIC_OWNER_s *GEOMETRIC_OWNER;

[back to top]


5.3 Topology

In the following tables, ‘ignore’ means this may be set to null (zero) if the XT data is created outside of the Parasolid Kernel. For XT data created by the Parasolid Kernel, this may take any value, but should be ignored.

Unless otherwise stated, all chains of nodes are doubly-linked and null-terminated.

5.3.1 World

 

Field name

Data type

Description

assembly

pointer0

Head of chain of assemblies

attribute

pointer0

Ignore

body

pointer0

Head of chain of bodies. This chain contains standard and compound bodies but does not contain any child bodies.

transform

pointer0

Head of chain of transforms

lattice

pointer0

Head of chain of lattices

surface

pointer0

Head of chain of surfaces

curve

pointer0

Head of chain of curves

point

pointer0

Head of chain of points

mesh

pointer0

Head of chain of meshes

polyline

pointer0

Head of chain of polylines

alive

logical

True unless partition is at initial pmark

attrib_def

pointer0

Head of chain of attribute definitions

attdef_list

pointer0

Shallbe set to null

highest_id

int

Highest pmark id in partition

current_id

int

Id of current pmark

index_map_offset

int

Shallbe set to 0

index_map

pointer0

Shall be set to null

schema_embedding_map

pointer0

Shallbe set to null

mesh_offset_data

pointer0

Data for embedded meshes. If the XT file does not contain embedded meshes, this field must be set to null.

The World node is only used when a partition is transmitted. Because some of the attribute definitions may be referenced by nodes which have been deleted, but which may reappear on rollback, the attribute definitions are chained off the World node rather than simply being referenced by attributes.

The attdef_list field is not used and shall be set to null pointer.

The fields index_map_offset , index_map , and schema_embedding_map are used for Indexed Transmit; applications writing XT data shall set them to 0 and null.

The mesh_offset_data field is used for embedded mesh data.

 

struct WORLD_s                    //World
    {
    struct ASSEMBLY_s            *assembly;              // $p
    struct ATTRIBUTE_s           *attribute;             // $p
    struct BODY_s                *body;                  // $p
    struct TRANSFORM_s           *transform;             // $p
    struct LATTICE_s             *lattice;               // $p
    union  SURFACE_u              surface;               // $p
    union  CURVE_u                curve;                 // $p
    struct POINT_s               *point;                 // $p
    union SURFACE_u               mesh;                  // $p
    union CURVE_u                 polyline;              // $p
    logical                       alive;                 // $l
    struct  ATTRIB_DEF_s         *attrib_def;            // $p
    struct  POINTER_LIS_BLOCK_s  *attdef_list;           // $p
    int                           highest_id;            // $d
    int                           current_id;            // $d
    int                           index_map_offset:      // $d
    struct INT_VALUES_s           *index_map;            // $p
    struct INT_VALUES_s           *schema_embedding_map; // $p
    struct MESH_OFFSET_DATA_s     *mesh_offset_data;     // $p
    };
typedef struct WORLD_s *WORLD;

5.3.2 Assembly

 

Field name

Data type

Description

highest_node_id

int

Highest identifier in assembly

attributes_features

pointer0

Head of chain of attributes of/and features in assembly

attribute_chains

pointer0

List of attributes, one for each attribute definition used in the assembly

list

pointer0

Null

lattice

pointer0

Head of construction lattice chain

surface

pointer0

Head of construction surface chain

curve

pointer0

Head of construction curve chain

point

pointer0

Head of construction point chain

mesh

pointer0

Head of construction mesh chain

polyline

pointer0

Head of construction polyline chain

key

pointer0

Ignore

res_size

double

Value of ‘size box’ when transmitted (normally 1000)

res_linear

double

Value of linear resolution when transmitted (normally 1.0e-8).

For more information on linear resolution, see Section 4.2, “General points”.

ref_instance

pointer0

Head of chain of instances referencing this assembly

next

pointer0

Ignore

previous

pointer0

Ignore

state

byte

Set to 1

owner

pointer0

Ignore

type

byte

Always 1

sub_instance

pointer0

Head of chain of instances in assembly

mesh_offset_data

pointer0

Data for embedded meshes. If the XT file does not contain embedded meshes, this field must be set to null.

The value of the ‘state’ field should be ignored, as should any nodes of type ‘KEY’ referenced by the assembly. If XT data is constructed without the use of the Parasolid Kernel, the state field should be set to 1, and the key to null.

The highest_node_id gives the highest identifier of any node in the assembly. Certain nodes within the assembly (namely instances, transforms, geometry, attributes and groups) have unique identifiers which are non-zero integers.

The mesh_offset_data field is used for embedded mesh data.

 

typedef enum
    {
    SCH_collective_assembly  = 1,
    SCH_conjunctive_assembly = 2,
    SCH_disjunctive_assembly = 3
    }
    SCH_assembly_type;

 

typedef enum
    {
    SCH_new_part       = 1,
    SCH_stored_part    = 2,
    SCH_modified_part  = 3,
    SCH_anonymous_part = 4,
    SCH_unloaded_part  = 5
    }
    SCH_part_state;

 

struct ASSEMBLY_s                 //Assembly
    {
    int                           highest_node_id;      // $d
    union ATTRIB_FEAT_u           attributes_features;  // $p
    struct LIST_s                *attribute_chains;     // $p
    struct LIST_s                *list;                 // $p
    union LATTICE_u               lattice;              // $p
    union SURFACE_u               surface;              // $p
    union CURVE_u                 curve;                // $p
    struct POINT_s               *point;                // $p
    union SURFACE_u               mesh;                 // $p
    union CURVE_u                 polyline;             // $p
    struct KEY_s                 *key;                  // $p
    double                        res_size;             // $f
    double                        res_linear;           // $f
    struct INSTANCE_s            *ref_instance;         // $p
    struct ASSEMBLY_s            *next;                 // $p
    struct ASSEMBLY_s            *previous;             // $p
    SCH_part_state                state;                // $u
    struct WORLD_s               *owner;                // $p
    SCH_assembly_type             type;                 // $u
    struct INSTANCE_s            *sub_instance;         // $p
struct MESH_OFFSET_DATA_s  *mesh_offset_data;  //$p
    };
typedef struct ASSEMBLY_s *ASSEMBLY;

 

struct KEY_s                      //Key
    {
    string[1];                    char                  // $c[]
    };
typedef struct KEY_s  *KEY;

5.3.3 Instance

 

Field name

Data type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of instance and member_of_feature instance

type

byte

Always 1

part

pointer

Part referenced by instance

transform

pointer0

Transform of instance

assembly

pointer

Assembly in which instance lies

next_in_part

pointer0

Next instance in assembly

prev_in_part

pointer0

Previous instance in assembly

next_of_part

pointer0

Next instance of instance->part

prev_of_part

pointer0

Previous instance of instance->part

 

Note: Only standard bodies can be instanced. Compound or child bodies cannot be instanced.

 

typedef enum
    {
    SCH_positive_instance = 1,
    SCH_negative_instance = 2
    }
    SCH_instance_type;

 

union  PART_u
    {
    struct BODY_s          *body;
    struct ASSEMBLY_s      *assembly;
    };
typedef union PART_u PART;

 

struct INSTANCE_s                 //Instance
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    SCH_instance_type             type;                  // $u
    union  PART_u                 part;                  // $p
    struct TRANSFORM_s           *transform;             // $p
    struct ASSEMBLY_s            *assembly;              // $p
    struct INSTANCE_s            *next_in_part;          // $p
    struct INSTANCE_s            *prev_in_part;          // $p
    struct INSTANCE_s            *next_of_part;          // $p
    struct INSTANCE_s            *prev_of_part;          // $p
    };
typedef struct INSTANCE_s *INSTANCE;

5.3.4 Body

 

Field name

Data type

Description

highest_node_id

int

Highest identifier in a standard body.

For compound bodies, this is the highest identifier, including entities in child bodies.

For child bodies, this is the identifier of the child body itself. It is also the highest unique identifier of the entities which were in the child body when it was added to its parent compound body.

attributes_features

pointer0

Head of chain of attributes of and features in body.

All features in a compound body and its children are chained off this regardless of their contents.

attribute_chains

pointer0

List of attributes, one for each attribute definition used in the body.

For compound bodies, all attributes within the compound body and its children appear in the attribute_chains list for the compound body, except those attributes that are directly attached to the child bodies. These attributes appear in the attribute_chains list of their relevant child body.

lattice

pointer0

Head of construction lattice chain.

surface

pointer0

Head of construction surface chain. For a child body, these fields are always null.

curve

pointer0

Head of construction curve chain. For a child body, these fields are always null.

point

pointer0

Head of construction point chain. For a child body, these fields are always null.

mesh

pointer0

Head of construction mesh chain. For a child body, these fields are always null

polyline

pointer0

Head of construction polyline chain. For a child body, these fields are always null

key

pointer0

Ignore

res_size

double

Value of ‘size box’ when transmitted (normally 1000)

res_linear

double

Value of linear resolution when transmitted (normally 1.0e-8).

For more information on linear resolution, see Section 4.2, “General points”.

ref_instance

pointer0

Head of chain of instances referencing this assembly

next

pointer0

For a child body, this field chains children of the same parent together.

previous

pointer0

For a child body, this field chains children of the same parent together.

state

byte

Set to 1 (see below)

owner

pointer0

For a child, this field references its parent compound body.

body_type

byte

Body type. If children of a compound body have the same body_type , then this will also be the body_type of the compound body. Otherwise, the body_type of the compound will be general.

nom_geom_state

byte

Set to 1 (for future use)

shell

pointer0

For general bodies: null.

For solid bodies: the first shell in one of the solid regions.

For other bodies: the first shell in one of the regions.This field is obsolete, and should be ignored by applications reading XT data. When writing XT data, it shall be set as above.

boundary_surface

pointer0

Head of chain of surfaces attached directly or indirectly to faces or edges or fins. For a child body, these fields are always null

boundary_curve

pointer0

Head of chain of curves attached directly or indirectly to edges or faces or fins. For a child body, these fields are always null

boundary_point

pointer0

Head of chain of points attached to vertices. For a child body, these fields are always null

boundary_mesh

pointer0

Head of chain of meshes attached directly or indirectly to faces or edges or fins. For a child body, these fields are always null

boundary_polyline

pointer0

Head of chain of polylines attached directly or indirectly to edges or faces or fins. For a child body, these fields are always null

region

pointer0

Head of chain of regions in body; this is the infinite region.

For a compound body, this is the head of chain of regions comprising of all the regions of all the child bodies. The regions of each child body are contiguous in this chain and the order of the regions corresponds to the order of the children.

For a child body, this field points to the first region of the child. For an empty compound body (i.e. one without any children), this field is null.

edge

pointer0

Head of chain of all non-wireframe edges in body. For a compound body, this is the head of a chain of all non-wireframe edges in all the children.For a child body, this field is null.

vertex

pointer0

Head of chain of all vertices in body. For a compound body, this is the head of a chain of all vertices in all the children.For a child body, this field is null.

index_map_offset

int

Shallbe set to 0

index_map

pointer0

Shall be set to null

node_id_index_map

pointer0

Shallbe set to null

schema_embedding_map

pointer0

Shallbe set to null

child

pointer0

For a compound body, this is the first child body. the children are chained using the next and previous pointers. For a standard or child body, this is null.

lowest_node_id

int

For a standard or compound body, this field is zero. For a child body, this is the lowest node id of the entities in the child body.

mesh_offset_data

pointer0

Data for embedded meshes. If the XT file does not contain embedded meshes, this field must be set to null.

The value of the ‘state’ field should be ignored, as should any nodes of type ‘KEY’ referenced by the body. If XT data is constructed without using the Parasolid Kernel, the state field should be set to 1, and the key to null.

The highest_node_id gives the highest identifier of any node in this body. Most nodes in a body which are visible at the PK interface have identifier, which are non-zero integers unique to that node within the body. Applications writing XT data shall ensure that identifiers are present and distinct. The details of which nodes have node ids are given in an appendix.

The fields index_map_offset , index_map, node_id_index_map , and schema_embedding_map are used for Indexed Transmit; applications writing XT data shall ensure that these fields are set to 0 and null.

The mesh_offset_data field is used for embedded mesh data.

 

typedef enum
    {
    SCH_solid_body     = 1,
    SCH_wire_body      = 2,
    SCH_sheet_body     = 3,
    SCH_general_body   = 6
    }
    SCH_body_type;

 

typedef short short enum
    {
    SCH_nom_geom_off = 1,              --- Entirely off
    SCH_nom_geom_on  = 2,              --- Entirely on
    }
    SCH_nom_geom_state_t;

 

struct BODY_s                     //Body
    {
    int                           highest_node_id;       // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    struct LIST_s                *attribute_chains;      // $p
    union  LATTICE_u             *lattice;               // $p
    union  SURFACE_u              surface;               // $p
    union  CURVE_u                curve;                 // $p
    struct POINT_s               *point;                 // $p
    union SURFACE_u               mesh;                  // $p
    union CURVE_u                 polyline;              // $p
    struct KEY_s                 *key;                   // $p
    double                        res_size;              // $f
    double                        res_linear;            // $f
    struct INSTANCE_s            *ref_instance;          // $p
    struct BODY_s                *next;                  // $p
    struct BODY_s                *previous;              // $p
    SCH_part_state                state;                 // $u
    union BODY_OWNER_u            owner;                 // $p
    SCH_body_type                 body_type;             // $u
    SCH_nom_geom_state_t          nom_geom_state;        // $u
    struct SHELL_s               *shell;                 // $p
    union  SURFACE_u              boundary_surface;      // $p
    union  CURVE_u                boundary_curve;        // $p
    struct POINT_s               *boundary_point;        // $p
    union SURFACE_u               boundary_mesh;         // $p
    union CURVE_u                 boundary_polyline;     // $p
    struct REGION_s              *region;                // $p
    struct EDGE_s                *edge;                  // $p
    struct VERTEX_s              *vertex;                // $p
    int                           index_map_offset;      // $d
    struct INT_VALUES_s          *index_map;             // $p
    struct INT_VALUES_s          *node_id_index_map;     // $p
    struct INT_VALUES_s          *schema_embedding_map;  // $p
struct BODY_s   *child;  //$p
int   lowest_node_id;  //$d
struct MESH_OFFSET_data_s  *mesh_offset_data;  //$p
    };
typedef struct BODY_s *BODY;

 

union BODY_OWNER_u 
{
struct WORLD_s  *world; 
struct BODY_s  *body; 
};

5.3.4.1 Attaching geometry to topology

The faces which reference a surface are chained together, surface->owner is the head of this chain. Similarly the edges which reference the same curve are chained together. Fins do not share curves.

Geometry in parts may be chained into one of the three boundary geometry chains, or one of the three construction geometry chains. A geometric node will fall into one of the following cases:

 

Geometry

Owner

Whether chained

Attached to face

face

In boundary_surface chain

Attached to edge or fin

pointer0

In boundary_curve chain

Attached to vertex

pointer

In boundary_point chain

Indirectly attached to face or edge or fin

pointer0

In boundary_surface chain or boundary_curve chain

Construction geometry

pointer0

In lattice, surface, curve or point chain

2D B-curve in SP-curve

pointer0

Not chained

type

char

Region type - solid (‘S’) or void (‘V’)

Here ‘indirectly attached’ means geometry which is a dependent of a dependent of (... etc) of geometry attached to an edge, face or fin.

Geometry in a construction chain may reference geometry in a boundary chain, but not vice-versa.

5.3.5 Region

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of region and member of features of region

body

pointer

Body of region. For a region in a child body, this field references the parent compound body.

next

pointer0

Next region in body

prev

pointer0

Previous region in body

shell

pointer0

Head of singly-linked chain of shells in region

type

char

Region type - solid (‘S’) or void (‘V’)

owner

pointer0

For a region in a child body, this field references the child body. Otherwise, the field is null.

 

struct REGION_s                   //Region
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    struct BODY_s                *body;                  // $p
    struct REGION_s              *next;                  // $p
    struct REGION_s              *previous;              // $p
    struct SHELL_s               *shell;                 // $p
    char                          type;                  // $c
struct BODY_s  *owner:  //$p
    };
typedef struct REGION_s *REGION;

5.3.6 Shell

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of shell

body

pointer0

For standard bodies: For shells in wire and sheet bodies, and for shells bounding a solid region of a solid body, this is set to the body of the shell. For shells in general bodies, or void shells in solid bodies, it is null.

For shells in child bodies, this field is set to the parent compound body if the child has type wire or sheet, or if it has type solid and the shell belongs to a solid region. Otherwise, this field is null.

This field is obsolete, and should be ignored by applications reading XT data. When writing XT data, it shall be set as above.

next

pointer0

Next shell in region

face

pointer0

Head of chain of back-faces of shell (i.e. faces with face normal pointing out of region of shell).

edge

pointer0

Head of chain of wire-frame edges of shell.

vertex

pointer0

If shell consists of a single vertex, this is it; else null

region

pointer

Region of shell

front_face

pointer0

Head of chain of front-faces of shell (i.e. faces with face normal pointing into region of shell).

 

struct SHELL_s                    //Shell
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    struct BODY_s                *body;                  // $p
    struct SHELL_s               *next;                  // $p
    struct FACE_s                *face;                  // $p
    struct EDGE_s                *edge;                  // $p
    struct VERTEX_s              *vertex;                // $p
    struct REGION_s              *region;                // $p
    struct FACE_s                *front_face;            // $p
    };
typedef struct SHELL_s *SHELL;

5.3.7 Face

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of face and member_of_ feature of face.

tolerance

double

Not used (null double)

next

pointer0

Next back-face in shell

previous

pointer0

Previous back-face in shell

loop

pointer0

Head of singly-linked chain of loops

shell

pointer

Shell of which this is a back-face

surface

pointer0

Surface of face

sense

char

Face sense - positive (‘+’) or negative (‘-’)

next_on_surface

pointer0

Next in chain of faces sharing the surface of this face

previous_on_surface

pointer0

Previous in chain of faces sharing the surface of this face

next_front

pointer0

Next front-face in shell

previous_front

pointer0

Previous front-face in shell

front_shell

pointer

Shell of which this is a front-face

 

struct FACE_s                     //Face
    {
    int                           node_id;               // $d
    union ATTRIB_FEAT_u          attributes_features;   // $
    double                        tolerance;             // $f
    struct FACE_s                *next;                  // $p
    struct FACE_s                *previous;              // $p
    struct LOOP_s                *loop;                  // $p
    struct SHELL_s               *shell;                 // $p
    union  SURFACE_u              surface;               // $p
    char                          sense;                 // $c
    struct FACE_s                *next_on_surface;       // $p
    struct FACE_s                *previous_on_surface;   // $p
    struct FACE_s                *next_front;            // $p
    struct FACE_s                *previous_front;        // $p
    struct SHELL_s               *front_shell;           // $p
    };
typedef struct FACE_s *FACE;

5.3.8 Loop

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of loop

halfedge

pointer

One of ring of fins of loop

face

pointer

Face of loop

next

pointer0

Next loop in face

5.3.8.1 Isolated loops

An isolated loop (one consisting of a single vertex) does not refer directly to a vertex, but points to a fin which refers to that vertex. This isolated fin has halfedge->forward = halfedge->backward = halfedge , and halfedge->other = halfedge->curve = halfedge->edge = null . Its sense is not significant. The fin is chained into the chain of fins referencing the isolated vertex.

 

struct LOOP_s                     //Loop
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    struct HALFEDGE_s            *halfedge
;              // $p
    struct FACE_s                *face;                  // $p
    struct LOOP_s                *next;                  // $p
    };
typedef struct LOOP_s *LOOP;

5.3.9 Fin

 

Note: Fins are referred to as halfedges in the PK Interface.

 

Field name

Type

Description

attributes_features

pointer0

Head of chain of attributes of fin

loop

pointer0

Loop of fin

forward

pointer0

Next fin around loop

backward

pointer0

Previous fin around loop

vertex

pointer0

Forward vertex of fin

other

pointer0

Next fin around edge, clockwise looking along edge

edge

pointer0

Edge of fin

curve

pointer0

For a non-dummy fin of a tolerant edge, this will be a trimmed SP-curve, otherwise null.

next_at_vx

pointer0

Next fin referencing the vertex of this fin

sense

pointer0

Positive (‘+’) if the fin direction is parallel to that of its edge, else negative (‘-’)

5.3.9.1 Dummy fins

An application will see edges as having any number of fins, including zero. However internally, they have at least two. This is so that the forward and backward vertices of an edge can always be found as edge->halfedge->vertex and edge->halfedge->other->vertex respectively - the first one being a positive fin, the second a negative fin. If an edge does not have both a positive and a negative externally-visible fin, dummy fins will exist for this purpose. Dummy fins have halfedge->loop = halfedge->forward = halfedge->backward = halfedge->curve = halfedge->next_at_vx = null . For example the boundaries of a sheet always have one dummy fin. See Section 5.3.9.2, “Fin chain at a vertex” for more information on fin chains at a vertex.

 

struct HALFEDGE_s  //Halfedge
    {
    union  ATTRIB_FEAT_u         attributes_features;   // $p
    struct HALFEDGE_s           *forward;               // $p
    struct HALFEDGE_s           *backward;              // $p
    struct VERTEX_s             *vertex;                // $p
    struct HALFEDGE_s           *other;                 // $p
    struct EDGE_s               *edge;                  // $p
    union  CURVE_u               curve;                 // $p
    struct HALFEDGE_s           *next_at_vx;            // $p
    char                         sense;                 // $c
    };
typedef struct HALFEDGE_s *HALFEDGE;

5.3.9.2 Fin chain at a vertex

The fin chain at a vertex only includes fins which are primary or secondary fins i.e edge->halfedge or edge->halfedge->other for some edge. All fins going into a vertex have that vertex as their halfedge->vertex but only those fins which are primary or secondary fins appear in the fin chains at the vertex. For any edge with a vertex or vertices, regardless of how many fins it has, the primary fin will be in the fin chain of the vertex towards which the edge points. The secondary fin will be in the fin chain of the vertex away from which the edge points. Any other fin will not appear in either fin chain at a vertex.

5.3.10 Vertex

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of vertex and member_of_ feature of vertex

halfedge

pointer0

Head of singly-linked chain of fins referencing this vertex

previous

pointer0

Previous vertex in body

next

pointer0

Next vertex in body

point

pointer

Point of vertex

tolerance

double

Tolerance of vertex (null-double for accurate vertex)

owner

pointer

Owning body (for non-acorn vertices) or shell (for acorn vertices). If the vertex is in a child body and it’s not an acorn vertex then the field references the parent compound body.

union SHELL_OR_BODY_u
    (
    struct BODY_s              *body;
    struct SHELL_s             *shell;
    };
typedef union SHELL_OR_BODY_u SHELL_OR_BODY;

 

struct VERTEX_s                   //Vertex
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    struct HALFEDGE_s            *halfedge
;              // $p
    struct VERTEX_s              *previous;              // $p
    struct VERTEX_s              *next;                  // $p
    struct POINT_s               *point;                 // $p
    double                        tolerance;             // $f
    union SHELL_OR_BODY_u         owner;                 // $p
    };
typedef struct VERTEX_s *VERTEX;

5.3.11 Edge

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer0

Head of chain of attributes of edge and member_of_feature of edge

tolerance

double

Tolerance of edge (null-double for accurate edges)

halfedge

pointer

Head of singly-linked chain of fins around edge

previous

pointer0

Previous edge in body or shell

next

pointer0

Next edge in body or shell

curve

pointer0

Curve of edge, zero for tolerant edge. If edge is accurate, but any of its vertices are tolerant, this will be a trimmed curve.

next_on_curve

pointer0

Next in chain of edges sharing the curve of this edge

previous_on_curve

pointer0

Previous in chain of edges sharing the curve of this edge

owner

pointer

Owning body (for non-wireframe edges) or shell (for wireframe edges). If the edge is in a child body and it is not a wireframe edge, then the field references the parent compound body.

 

struct EDGE_s                     //Edge
    {
    int                           node_id;               // $d
    union  ATTRIB_FEAT_u          attributes_features;   // $p
    double                        tolerance;             // $f
    struct HALFEDGE_s            *halfedge
;              // $p
    struct EDGE_s                *previous;              // $p
    struct EDGE_s                *next;                  // $p
    union  CURVE_u                curve;                 // $p
    struct EDGE_s;               *next_on_curve          // $p
    struct EDGE_s                *previous_on_curve;     // $p
    union  SHELL_OR_BODY_u        owner;                 // $p
    };
typedef struct EDGE_s *EDGE;

[back to top]


5.4 Associated Data

5.4.1 List

 

Field name

Type

Description

node_id

int

Zero

list_type

byte

Always

notransmit

logical

Ignore

owner

pointer

Owning part

previous

pointer0

Ignore

next

pointer0

Ignore

list_length

int

Length of list (>=0)

block_length

int

Length of each block of list. Always 20

size_of_entry

int

Ignore

finger_index

int

Any integer between 1 and list->list_length (set to 1 if length is zero). Ignore

finger_block

pointer

Any block e.g. the first one. Ignore

list_block

pointer

Head of singly-linked chain of pointer list blocks

Lists only occur in part data as the list of attributes referenced by a part.

 

typedef enum
    {
    LIS_pointer = 4
    }
    LIS_type_t;

 

union LIS_BLOCK_u
    {
    struct POINTER_LIS_BLOCK_s    *pointer_block;
    };
typedef union LIS_BLOCK_u     LIS_BLOCK;

 

union LIS_OWNER_u
    {
    struct BODY_s                 *body;
    struct ASSEMBLY_s             *assembly;
    struct WORLD_s                *world;
    };
typedef union LIST_OWNER_u    LIST_OWNER;

 

struct LIST_s                     //List Header
    {
    int                           node_id;               // $d
    LIS_type_t                    list_type;             // $u
    logical                       notransmit;            // $l
    union  LIST_OWNER_u           owner;                 // $p
    struct LIST_s                *next;                  // $p
    struct LIST_s                *previous;              // $p
    int                           list_length;           // $d
    int                           block_length;          // $d
    int                           size_of_entry;         // $d
    int                           finger_index;          // $d
    union  LIS_BLOCK_u            finger_block;          // $p
    union  LIS_BLOCK_u            list_block;            // $p
    };
typedef struct LIST_s *LIST;

5.4.2 Pointer_lis_block

 

Field name

Type

Description

n_entries

int

Number of entries in this block (0 <= n_entries <= 20). Only the first block may have n_entries = 0

index_map_offset

int

Shallbe set to 0

next_block

pointer0

Next pointer list block in chain

entries[20]

pointer

Pointers in block, those beyond n_entries shall be zero

When the pointer_lis_block is used as the root node in XT data containing more than one part, the restriction n_entries <= 20 does not apply.

The index_map_offset field is used for Indexed Transmit; applications writing XT data shall ensure this field is set to 0.

 

struct POINTER_LIS_BLOCK_s        //Pointer List
    {
    int                           n_entries;            // $d
    int                           index_map_offset      // $d
    struct POINTER_LIS_BLOCK_s   *next_block;           // $p
    void                         *entries[ 1 ];         // $p[]
    };
typedef struct POINTER_LIS_BLOCK_s *POINTER_LIS_BLOCK;

5.4.3 Att_def_id

 

Field name

Type

Description

string[]

char

String name e.g. "SDL/TYSA_COLOUR"

 

struct ATT_DEF_ID_s  //name field type for attrib def.
    {
    char                          string[1];            // $c[]
    };
typedef struct ATT_DEF_ID_s *ATT_DEF_ID;

5.4.4 Field_names

 

Field name

Type

Description

names[]

pointer

Array of field names - unicode or char

 

typedef union FIELD_NAME_u
    {
    struct CHAR_VALUES_s         *name
    struct UNICODE_VALUES_s      *uname
    };
    FIELD_NAME_t;

 

struct FIELD_NAME_s               //attribute field name
    {
    union  FIELD_NAME_u           names[1];       // $p[]
    };
typedef struct FIELD_NAME_s *FIELD_NAME;

5.4.5 Attrib_def

The XT Format provides a set of pre-defined attribute definitions known as system attribute definitions. See Appendix A, “System Attribute Definitions”, for more information on these.

Attribute definitions have the following form in the XT format:

 

Field name

Type

Description

next

pointer0

Next attribute definition. This can be ignored, except in partition data.

identifier

pointer

Pointer to a string name

type_id

int

Numeric id, e.g. 8001 for color. 9000 for user-defined attribute definitions

actions[8]

byte

Required actions on various events

field_names

pointer

Names of fields (unicode or char)

legal_owners[14]

logical

Allowed owner types

fields[]

byte

Array of field types. Note that the number of fields is given by the length of the variable length part of this node, i.e. the integer following the node type in the XT data.

The legal_owners array is an array of logicals determining which node types may own this type of attribute.

e.g. if faces are allowed attrib_def -> legal_owners [SCH_fa_owner] = true .

Note that if the XT data contains user fields, the ‘fields’ field of an attribute definition may contain extra values, set to zero. These are to be ignored.

The ‘actions’ field in an attribute definition defines the behaviour of the attribute when an event (rotate, scale, translate, reflect, split, merge, transfer, change) occurs. The actions are in table F.49:

 

Action

Explanation

do_nothing

Leave attribute as it is

delete

Delete the attribute

transform

Transform the transformable fields (point, vector, direction, axis) by appropriate part of transformation

propagate

Copy attribute onto split-off node

keep_sub_dominant

Move attribute(s) from deleted node onto surviving node in a merge, but any such attributes already on the surviving node are deleted

keep_if_equal

Keep attribute if present on both nodes being merged, with the same field values

combine

Move attribute(s) from deleted node onto surviving node, in a merge

The XT attribute classes 1-7 correspond as follows:

 

 

split

merge

transfer

change

rotate

scale

translate

reflect

class 1

propagate

keep_equal

do_nothing

do_nothing

do_nothing

do_nothing

do_nothing

do_nothing

class 2

delete

delete

delete

delete

do_nothing

delete

do_nothing

do_nothing

class 3

delete

delete

delete

delete

delete

delete

delete

delete

class 4

propagate

keep_equal

do_nothing

do_nothing

transform

transform

transform

transform

class 5

delete

delete

delete

delete

transform

transform

transform

transform

class 6

propagate

combine

do_nothing

do_nothing

do_nothing

do_nothing

do_nothing

do_nothing

class 7

propagate

combine

do_nothing

do_nothing

transform

transform

transform

transform

 

typedef enum
    {
    SCH_rotate      = 0,
    SCH_scale       = 1,
    SCH_translate   = 2,
    SCH_reflect     = 3,
    SCH_split       = 4,
    SCH_merge       = 5,
    SCH_transfer    = 6,
    SCH_change      = 7,
    SCH_max_logged_event   //last entry; value in $d[] code for actions
    }
    SCH_logged_event_t;

 

typedef enum
    {
    SCH_do_nothing        = 0,
    SCH_delete            = 1,
    SCH_transform         = 2,
    SCH_propagate         = 3,
    SCH_keep_sub_dominant = 4,
    SCH_keep_if_equal     = 5,
    SCH_combine           = 6
    }
    SCH_action_on_fields_t;

 

typedef enum
    {
    SCH_as_owner = 0,
    SCH_in_owner = 1,
    SCH_by_owner = 2,
    SCH_sh_owner = 3,
    SCH_fa_owner = 4,
    SCH_lo_owner = 5,
    SCH_ed_owner = 6,
    SCH_vx_owner = 7,
    SCH_fe_owner = 8,
    SCH_sf_owner = 9,
    SCH_cu_owner = 10,
    SCH_pt_owner = 11,
    SCH_rg_owner = 12,
    SCH_fn_owner = 13,
    SCH_max_owner  //last entry; value in $l[] for                    .legal_owners
    } 
    SCH_attrib_owners_t;

 

typedef enum
    {
    SCH_int_field       = 1,
    SCH_real_field      = 2,
    SCH_char_field      = 3,
    SCH_point_field     = 4,
    SCH_vector_field    = 5,
    SCH_direction_field = 6,
    SCH_axis_field      = 7,
    SCH_tag_field       = 8,
    SCH_pointer_field   = 9,
    SCH_unicode_field   = 10
    } 
    SCH_field_type_t;

 

struct ATTRIB_DEF_s               //attribute definition
    {
    struct ATTRIB_DEF_s          *next;               // $p
    struct ATT_DEF_ID_s          *identifier;         // $p
    int                           type_id;            // $d
    SCH_action_on_fields_t        actions             // $u[8]
    [(int)SCH_max_logged_event];                      // $u[8]
    struct FIELD_NAMES_s         *field_names         // $p
    logical                       legal_owners        // $l[14]
     [(int)SCH_max_owner];                            //$l[14]
    SCH_field_type_t              fields[1];          // $u[]
    };
typedef struct ATTRIB_DEF_s *ATTRIB_DEF;

5.4.6 Attribute

 

Field name

Type

Description

node_id

int

Identifier

definition

pointer

Attribute definition

owner

pointer

Attribute owner

next

pointer0

Next attribute, feature, or member_of_feature

previous

pointer0

Previous ditto

next_of_type

pointer0

Next attribute of this type in this part

previous_of_type

pointer0

Previous attribute of this type in this part

fields[]

pointer

Fields, of type int_values etc. The number of fields is given by the length of the variable part of the node. There may be no fields.

The attributes of a node are chained using the next and previous pointers in the attribute. The attributes_ features pointer in the node points to the head of this chain. This chain also contains the member_of_ feature of the node.

Attributes within the same part, with the same attribute definition, are chained together by the next_of_type and previous_of_type pointers. The part points to the head of this chain as follows. The attribute_chains pointer in the part points to a list which contains the heads of these attribute chains, one for each attribute definition which has attributes in the part. The list may be null.

Note that the attributes_ featur es chains in parts, features and nodes contain the following types of node:

Fields of type ‘pointer’ can be used in Parasolid V12.0, but they are always transmitted as empty.

 

union ATTRIBUTE_OWNER_u
    {
    struct ASSEMBLY_s            *assembly;
    struct INSTANCE_s            *instance;
    struct BODY_s                *body;
    struct SHELL_s               *shell;
    struct REGION_s              *region;
    struct FACE_s                *face;
    struct LOOP_s                *loop;
    struct EDGE_s                *edge;
    struct HALFEDGE_s            *halfedge
;
    struct VERTEX_s              *vertex;
    union  SURFACE_u              Surface;
    union  CURVE_u                Curve;
    struct POINT_s               *point;
    struct FEATURE_s
             *feature;
    };
typedef union ATTRIBUTE_OWNER_u ATTRIBUTE_OWNER;

 

union FIELD_VALUES_u
    {
    struct INT_VALUES_s          *int_values;
    struct REAL_VALUES_s         *real_values;
    struct CHAR_VALUES_s         *char_values;
    struct POINT_VALUES_s        *point_values;
    struct VECTOR_VALUES_s       *vector_values;
    struct DIRECTION_VALUES_s    *direction_values;
    struct AXIS_VALUES_s         *axis_values;
    struct TAG_VALUES_s          *tag_values;
    struct UNICODE_VALUES_s      *unicode_values;
    };
typedef union FIELD_VALUES_u FIELD_VALUES;

 

struct ATTRIBUTE_s                //Attribute
    {
    int                          node_id;              // $d
    struct ATTRIB_DEF_s         *definition;           // $p
    union  ATTRIBUTE_OWNER_u     owner;                // $p
    union  ATTRIB_FEAT_u         next;                 // $p
    union  ATTRIB_FEAT_u         previous;             // $p
    struct ATTRIBUTE_s          *next_of_type;         // $p
    struct ATTRIBUTE_s          *previous_of_type;     // $p
    union  FIELD_VALUES_u        fields[1];            // $p[]
    };
typedef struct ATTRIBUTE_s *ATTRIBUTE;

5.4.7 Int_values

 

Field name

Type

Description

values[]

int

Integer values

 

struct INT_VALUES_s                //Int values
    {
    int                            values[1];           // $d[]
    };
typedef struct INT_VALUES_s *INT_VALUES;

5.4.8 Real_values

 

Field name

Type

Description

values[]

double

Real values

 

struct REAL_VALUES_s               //Real values
    {
    double                         values[1];           // $f[]
    };
typedef struct REAL_VALUES_s *REAL_VALUES;

5.4.9 Char_values

 

Field name

Type

Description

values[]

char

Character values

 

struct CHAR_VALUES_s               //Character values
    {
    char                           values[1];           // $c[]
    };
typedef struct CHAR_VALUES_s *CHAR_VALUES;

5.4.10 Unicode_values

 

Field name

Type

Description

values[]

short

Unicode character values

 

struct UNICODE_VALUES_s            //Unicode character values
    {
    short                          values[1];           // $w[]
    };
typedef struct UNICODE_VALUES_s *UNICODE_VALUES;

5.4.11 Point_values

 

Field name

Type

Description

values[]

vector

Point values

 

struct POINT_VALUES_s              //Point values
    {
    vector                         values[1];           // $v[]
    };
typedef struct POINT_VALUES_s *POINT_VALUES;

5.4.12 Vector_values

 

Field name

Type

Description

values[]

vector

Vector values

 

struct VECTOR_VALUES_s             //Vector values
    {
    vector                         values[1];           // $v[]
    };
typedef struct VECTOR_VALUES_s *VECTOR_VALUES;

5.4.13 Direction_values

 

Field name

Type

Description

values[]

vector

Direction values

 

struct DIRECTION_VALUES_s          //Direction values
    {
    vector                         values[1];           // $v[]
    };
typedef struct DIRECTION_VALUES_s *DIRECTION_VALUES;

5.4.14 Axis_values

 

Field name

Type

Description

values[]

vector

Axis values

 

struct AXIS_VALUES_s              //Axis values
    {
    vector                         values[1];           // $v[]
    };
typedef struct AXIS_VALUES_s *AXIS_VALUES;

5.4.15 Tag_values

 

Field name

Type

Description

values[]

int

Integer tag values

 

struct TAG_VALUES_s                //Tag values
    {
    int                            values[1];           // $t[]
    };
typedef struct TAG_VALUES_s *TAG_VALUES;

The tag field type and the tag_values node are not available for use in user-defined attributes, they occur only in certain system attributes.

5.4.16 Feature

 

Note: Features are referred to as ‘groups’ in the PK Interface.

 

Field name

Type

Description

node_id

int

Identifier

attributes_features

pointer

Head of chain of attributes of this feature

owner

pointer

Owning part

next

pointer0

Next feature or attribute

previous

pointer0

Previous feature or attribute

type

byte

Type of node allowed in feature

first_member

pointer0

Head of chain of member_of_ feature nodes in feature

The groups in a part are chained by the next and previous pointers in a group. The attributes_ features pointer in the part points to the head of the chain. This chain also contains the attributes attached directly to the part - groups and attributes are intermingled in this chain, the order is not significant.

Each group has a chain of member_of_ feature. These are chained together using the next_member and previous_member pointers. The first_member pointer in the feature points to the head of the chain. Each member_of_ feature has an owning_ feature pointer which points back to the feature.

Each member_of_ feature has an owner pointer which points to a node. Thus the feature references its member nodes via the member_of_feature .

The member_of_ feature which refer to a particular node are chained using the next and previous pointers in the member_of_ feature. The attributes_ features pointer in the node points to the head of this chain. This chain also contains the attributes attached to the node.

 

typedef enum
    {
    SCH_instance_fe   = 1,
    SCH_face_fe       = 2,
    SCH_loop_fe       = 3,
    SCH_edge_fe       = 4,
    SCH_vertex_fe     = 5,
    SCH_surface_fe    = 6,
    SCH_curve_fe      = 7,
    SCH_point_fe      = 8,
    SCH_mixed_fe      = 9,
    SCH_region_fe     = 10,
    SCH_pf_pline_fe   = 11,
    SCH_feature_fe    = 12
    } SCH_feature_type_t;

 

struct FEATURE_s  //Feature
    {
    int                          node_id;               // $d
    union  ATTRIB_FEAT_u         attributes_features;   // $p
    union  PART_u                owner;                 // $p
    union  ATTRIB_FEAT_u         next;                  // $p
    union  ATTRIB_FEAT_u         previous;              // $p
    SCH_feature_type_t           type;                  // $u
    struct MEMBER_OF_FEATURE_s  *first_member;          // $p
    };
typedef struct FEATURE_s *FEATURE;

5.4.17 Member_of_feature

 

Field name

Type

Description

dummy_node_id

int

Entity label

owning_feature

pointer

Owning feature

owner

pointer

Referenced member of feature

next

pointer0

Next attribute, feature or member_of_ feature

previous

pointer0

Previous ditto

next_member

pointer0

Next member_of_ feature in this feature

previous_member

pointer0

Previous ditto

 

union FEATURE_MEMBER_u
    {
    struct INSTANCE_s            *instance;
    struct FACE_s                *face;
    struct REGION_s              *region;
    struct LOOP_s                *loop;
    struct EDGE_s                *edge;
    struct VERTEX_s              *vertex;
    union  SURFACE_u              surface;
    union  CURVE_u                curve;
    struct POINT_s               *point;
struct FEATURE_s  *feature;
    };
typedef union FEATURE_MEMBER_u FEATURE_MEMBER;

 

struct MEMBER_OF_FEATURE_s //Member of feature
   {
   int                             dummy_node_id;        // $d
   struct FEATURE_s               *owning_feature;       // $
   union  FEATURE_MEMBER_u         owner;                // $p
   union  ATTRIB_FEAT_u            next;                 // $p
   union  ATTRIB_FEAT_u            previous;             // $p
   struct MEMBER_OF_FEATURE_s     *next_member;          // $p
   struct MEMBER_OF_FEATURE_s     *previous_member;      // $p
   };
typedef struct MEMBER_OF_FEATURE_s *MEMBER_OF_FEATURE;

5.4.18 Part_XMT_block

 

Field name

Type

Description

n_entries

int

Number of entries in this block. ( n_entries >1)

index_map_offset

int

Must be set to 0

index_map

pointer0

Must be set to null

schema_embedding_map

pointer0

Must be set to null

mesh_offset_data

pointer0

Data for embedded meshes. If the XT file does not contain embedded meshes, this field must be set to null.

entries[]

pointer

Pointers in block

The PART_XMT_BLOCK must be the root node in XT data containing more than one part,

The fields index_map_offset , index_map , and schema_embedding_map are used for Indexed Transmit.

The mesh_offset_data field is used for embedded mesh data.

 

struct PART_XMT_BLOCK_s //Part list
{
int                              n_entries;              //$d
unsigned                         index_map_offset;       //$d
struct INT_VALUES_s             *index_map;              //$p
struct INT_VALUES_s             *schema_embedding_map;   //$p
struct MESH_OFFSET_DATA_s       *mesh_offset_data;       //$p
union PART_u                     entries[1];             //$p[]
};
 
typedef struct PART_XMT_BLOCK_s *PART_XMT_BLOCK;

5.4.19 Mesh_offset_data

The MESH_OFFSET_DATA node is used for embedded mesh data. It is the second node in an XT file with embedded meshes. At most, there can only be one MESH_OFFSET_DATA node.

 

Field Name

Data Type

Description

mesh_index_map

pointer0

Must be set to an offset_values node

schema_data

pointer0

See Section 5.4.19.2, “Schema_data” for information

schema_data_offset_high

int

Must be present

schema_data_offset_low

int

Must be present

The schema_data field must be present if the XT data contains embedded schema information, otherwise it must be set to null.

The schema_data_offset_high and schema_data_offset_low fields must be present and indicate either the offset of the schema_data node (if present), or the offset of the terminator.

 

struct MESH_OFFSET_DATA_s //Mesh offset data
{
struct OFFSET_VALUE_s    *mesh_index_map;           //$p
struct SCHEMA_DATA_s     *schema_data;              //$p
unsigned                 *schema_data_offset_high;  //$d
unsigned                 *schema_data_offset_low ;  //$d
};
typedef struct MESH_OFFSET_DATA_s *MESH_OFFSET_DATA;

5.4.19.1 Offset_values

The OFFSET_VALUES node contains the offset values of each PSM_MESH node. These offset values must be in the same order as the PSM_MESH nodes in the XT data. If this node is present, it must be the third node in the XT data.

 

Field Name

Data Type

Description

values[]

int

Offset values in high and low pairs

 

struct OFFSET_VALUES_s     //Offset values
{
unsigned    values[1];     //$d[]
};
typedef struct OFFSET_VALUES_s *OFFSET_VALUES;

5.4.19.2 Schema_data

The SCHEMA_DATA node must be present if the XT data contains embedded schema information. The SCHEMA_DATA node chains one NODE_MAP node per node type used in the mesh data section of the XT data (i.e between the first PSM_MESH node and the last node before the SCHEMA_DATA node).

There is a NEW_NODE_MAP node defining the following node types:

These node types are relative to the defined base schema, currently SCH_13006. See Section 2.1.2, “Embedded schemas” for more information.

 

struct SCHEMA_DATA_s //Schema data
{
union NODE_MAP_u   node_map;   //$p
};
typedef struct SCHEMA_DATA_s *SCHEMA_DATA;

The SCHEMA_DATA node is followed by the NODE_MAP, FIELD_MAP, and SCHEMA_CHAR_VALUES nodes. These nodes will always be at the end of the embedded mesh file and indicate whether an embedded mesh file was saved using an embedded schema.

5.4.19.3 Node_map union

 

union NODE_MAP_u
{
struct ANY_NODE_MAP_s *any;
struct NEW_NODE_MAP_s *new;
struct MOD_NODE_MAP_s *mod;
struct OLD_NODE_MAP_s *old;
};
typedef union NODE_MAP_u NODE_MAP;

5.4.19.4 Node map nodes

All node map nodes share the following common fields:

 

Field Name

Data Type

Description

next

pointer0

Next node map in chain

exemplar_offset_high

int

Offset values of the first node of node_type in the XT data

exemplar_offset_low

int

Offset values of the first node of node_type in the XT data

node_type

short

Node type

5.4.19.5 Any_node_map

 

struct ANY_NODE_MAP_s //Any node map
{
union NODE_MAP_u             next;                  //$p
unsigned                     exemplar_offset_high;  //$d
unsigned                     exemplar_offset_low;   //$d
short                        node_type;             //$n
};
typedef struct ANY_NODE_MAP_s  *ANY_NODE_MAP;

5.4.19.6 Old_node_map

 

struct OLD_NODE_MAP_s == ANY_NODE_MAP_s //Unchanged node map
{
union NODE_MAP_u             next;                  //$p
unsigned                     exemplar_offset_high;  //$d
unsigned                     exemplar_offset_low;   //$d
short                        node_type;             //$n
};
typedef struct OLD_NODE_MAP_s *OLD_NODE_MAP;

5.4.19.7 New_node_map

 

Field Name

Data Type

Description

vla_field_xmt_code

logical

Whether the variable length array field (if present) should be saved to XT. If this field is not present, the value is set to false.

name

pointer

Points to the schema character values node that contain the node name.

description

pointer

Points to the schema character values node that contain the description.

field_maps[1]

pointer

Array of new field maps

 

struct NEW_NODE_MAP_s == ANY_NODE_MAP_s //New node map
{
union NODE_MAP_u             next; $p
unsigned                     exemplar_offset_high;  //$d
unsigned                     exemplar_offset_low;   //$d
short                        node_type;             //$n
logical                      vla_field_xmt_code;    //$l
struct SCHEMA_CHAR_VALUES_s *name;                  //$p
struct SCHEMA_CHAR_VALUES_s *description;           //$p
struct NEW_FIELD_MAP_s      *field_maps[1];         //$p[]
};
typedef struct NEW_NODE_MAP_s *NEW_NODE_MAP;

5.4.19.8 Modified_node_map

 

Field Name

Data Type

Description

vla_field_xmt_code

logical

Whether the variable length array field (if present) is transmitted. If this field is not present, the value is set to false.

field_maps[1]

pointer

Array of field maps

 

struct MOD_NODE_MAP_s == ANY_NODE_MAP_s          //Modified node map
{
union NODE_MAP_u             next;                  //$p
unsigned                     exemplar_offset_high;  //$d
unsigned                     exemplar_offset_low;   //$d
short                        node_type;             //$n
logical                      vla_field_xmt_code;    //$l
union FIELD_MAP_u            field_maps[1];         //$p[]
};
typedef struct MOD_NODE_MAP_s *MODE_NODE_MAP;

5.4.19.9 Field_map union

 

union FIELD_MAP_u
{
struct NEW_FIELD_MAP_s *new;
struct OLD_FIELD_MAP_s *old;
};
typedef union FIELD_MAP_u FIELD_MAP;

5.4.19.10 Old_field_map

 

Field Name

Data Type

Description

base_index

byte

The field number this field used to be in the baseline schema

 

struct OLD_FIELD_MAP_s // Old field map
{
SCH_byte_t               base_index;    //$u
};
typedef struct OLD_FIELD_MAP_s *OLD_FIELD_MAP;

5.4.19.11 New_field_map

 

Field Name

Data Type

Description

name

pointer

Points to the schema character values node that contains the field name.

ptr_class

short

Node type or class of the field if it is a pointer field

n_elts

int

Number of elements for that field

type

pointer

Points to a schema character values node that contains the field type.

 

struct NEW_FIELD_MAP_s // New field map
{
struct SCHEMA_CHAR_VALUES_s *name;      //$p
short                        ptr_class; //$n
int                          n_elts;    //$d
struct SCHEMA_CHAR_VALUES_s *type;      //$p
};
typedef struct NEW_FIELD_MAP_s *NEW_FIELD_MAP;

5.4.19.12 Schema_char_values

 

Field Name

Data Type

Description

values[]

char

Character values

 

struct SCHEMA_CHAR_VALUES_s     //Schema character values
{
char values[1];     //$c[]
};
typedef struct SCHEMA_CHAR_VALUES_s *SCHEMA_CHAR_VALUES;

 

 

[back to top]

<<< Model Structure Chapters Nodes and Classes >>>