Field tables follow the order of the fields in the file. Codes are those of the field types table. “Ignore” in the reference means the field may be null (0) in a file made outside Parasolid, and that readers should ignore it in files made by Parasolid. Unless said otherwise, chains of nodes are doubly linked and null-terminated. This page restates the UGS “Parasolid XT Format Reference” (October 2006). The geometry nodes are on the Geometry nodes page.
The topological model
Parasolid can represent wire, sheet, solid, cellular and general non-manifold bodies, including bodies of mixed dimension and disconnected bodies.
| Entity | What it is |
|---|---|
| Assembly | A collection of instances of bodies or other assemblies, with optional construction geometry (surfaces, curves, points) |
| Instance | A reference to a body or assembly, with an optional transform (null means identity) |
| Body | Faces, edges and vertices together with the connected regions into which they divide space. The point set is the disjoint union of the solid regions, faces, edges and vertices, and must be finite (enclosed in a ball), though it need not be connected. A body has at least one region; exactly one is infinite and it must be void |
| Region | An open connected subset of 3-space bounded by vertices, edges and oriented faces. Solid or void; two regions may share a face, one on each side. A region with no shells is all of space (the only region of a body with no faces, edges or vertices) |
| Shell | A connected component of a region’s boundary: faces, each used on one or both sides, wireframe edges, or a single vertex (an acorn shell). A face used on both sides is a 2D cut subtracted from the region. Must contain at least one vertex, edge or face |
| Face | An open finite connected subset of a surface bounded by edges and vertices. It may have no loops (a full sphere), one, or many. The surface may be null and may be shared by other faces |
| Loop | A connected component of the boundary of a face: an ordered ring of fins, or a single vertex (an isolated loop, a 0-dimensional hole). The face is on the left of the loop looking from above along its direction |
| Fin | The oriented use of an edge by a loop; its sense says whether it agrees with the edge. A loop may not use an edge twice in the same direction |
| Edge | An open finite connected subset of a curve with zero, one or two vertices (zero, or one null, and the other null too: a ring edge). Its fins are ordered by the faces around it, clockwise looking along the edge. An edge with no fins is a wireframe edge. An edge with a tolerance is tolerant, otherwise accurate (a tolerance of half the modeller’s linear resolution) |
| Vertex | A point in space with an optional tolerance |
| Attribute | Data attached to any entity except attributes, fins, lists, transforms or attribute definitions. Its definition says the number and types of its fields, which entities may own it and how it behaves when they change |
| Group | A set of entities in one part: instances, surfaces, curves, points in an assembly; regions, faces, edges, vertices, surfaces, curves, points in a body. The group’s type restricts its members |
All entities except fins have a non-zero node-id, unique within the part.
Body types and their rules
| Value | body_type | Rules |
|---|---|---|
| 1 | solid | A manifold 3D volume, possibly with voids, and not necessarily connected. At least one face, no wireframe edges or acorn vertices, and at least two regions, at least one of them solid. Every face has a solid region on its negative side and a void on its positive side. Every edge has exactly two fins with opposite senses. Every vertex belongs to one isolated loop or to edges whose faces form a single edgewise-connected set |
| 2 | wire | A 1D subset: a single void region with shells of wireframe edges and vertices and no faces; every vertex is used by one or two edges. Closed if every vertex has two edges, open otherwise. An acorn body (one 0D point) also has this type, with one void region and one shell with a single vertex |
| 3 | sheet | A 2D subset: all regions void; at least one face; no wireframe edges or acorn vertices; every edge has one or two fins (opposite senses if two); open if one region, closed if no boundary. Vertex rules in an open sheet allow non-manifold cases such as two squares sharing a corner |
| 6 | general | None of the above: need not be manifold, connected or of one dimension |
Topology nodes
Type numbers: ASSEMBLY 10, INSTANCE 11, BODY 12, SHELL 13, FACE 14, LOOP 15, EDGE 16, FIN 17, VERTEX 18, REGION 19. All are visible at the PK interface; all have node-ids except ASSEMBLY, BODY and FIN.
WORLD (partition files only)
| Field | Type | Meaning |
|---|---|---|
| assembly | p | Head of chain of assemblies |
| attribute | p | Ignore |
| body | p | Head of chain of bodies |
| transform | p | Head of chain of transforms |
| surface, curve, point | p, p, p | Heads of the geometry chains |
| alive | l | True unless the partition is at its initial pmark |
| attrib_def | p | Head of the chain of attribute definitions. They hang off the world rather than the attributes because deleted nodes that reappear on rollback may still need them |
| highest_id, current_id | d, d | Highest and current pmark id in the partition |
ASSEMBLY (10)
| Field | Type | Meaning |
|---|---|---|
| highest_node_id | d | Highest node-id of any instance, transform, geometry, attribute or group in the assembly |
| attributes_groups | p | Head of chain of its attributes and groups |
| attribute_chains | p | A list of attributes, one for each attribute definition used |
| list | p | Null |
| surface, curve, point | p, p, p | Heads of the construction geometry chains |
| key | p | Ignore (write null) |
| res_size | f | The “size box” when transmitted (normally 1000) |
| res_linear | f | Modeller linear precision when transmitted (normally 1.0e-8) |
| ref_instance | p | Head of chain of instances that reference this assembly |
| next, previous | p, p | Ignore |
| state | u | Ignore; write 1 |
| owner | p | Ignore |
| type | u | Always 1 (the reference also defines an assembly-type enum: 1 collective, 2 conjunctive, 3 disjunctive) |
| sub_instance | p | Head of chain of instances in the assembly |
The part-state enum is 1 new, 2 stored, 3 modified, 4 anonymous, 5 unloaded.
INSTANCE (11)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes and member_of_groups of the instance |
| type | u | Always 1 (the enum has 1 positive, 2 negative) |
| part | p | The part referenced |
| transform | p | Transform of the instance, may be null |
| assembly | p | The assembly containing it |
| next_in_part, prev_in_part | p, p | Neighbours in that assembly’s chain |
| next_of_part, prev_of_part | p, p | Neighbours in the chain of instances of the same part |
BODY (12)
| Field | Type | Meaning |
|---|---|---|
| highest_node_id | d | Highest node-id in the body. A writer must give every node that has an id a distinct one |
| attributes_groups | p | Attributes of and groups in the body |
| attribute_chains | p | One attribute chain per attribute definition used |
| surface, curve, point | p, p, p | Construction geometry chains |
| key | p | Ignore (write null) |
| res_size, res_linear | f, f | As for an assembly |
| ref_instance | p | Instances that reference this part |
| next, previous | p, p | Ignore |
| state | u | Ignore; write 1 |
| owner | p | Ignore |
| body_type | u | 1 solid, 2 wire, 3 sheet, 6 general |
| nom_geom_state | u | Set to 1 (for future use) |
| shell | p | Obsolete, to be ignored on reading. When writing: null for a general body; for a solid body the first shell of one of its solid regions; for other bodies the first shell of one of its regions |
| boundary_surface | p | Head of the chain of surfaces attached, directly or indirectly, to faces, edges or fins |
| boundary_curve | p | Head of the chain of curves attached to edges, faces or fins |
| boundary_point | p | Head of the chain of points attached to vertices |
| region | p | Head of the chain of regions; this is the infinite region |
| edge | p | Head of the chain of all non-wireframe edges |
| vertex | p | Head of the chain of all vertices |
Geometry chaining: the faces that share a surface are chained together with surface→owner the head; edges that share a curve likewise. Fins never share curves. Surfaces on faces and curves on edges or fins go in the body’s boundary chains (also geometry “indirectly attached” to them), points on vertices in the boundary point chain, construction geometry in the body’s or assembly’s own surface, curve and point chains, and the 2D B-curve of an SP-curve in no chain. Construction geometry may reference boundary geometry but not the other way round. The state and key fields of assemblies and bodies should be written 1 and null by an external writer.
REGION (19)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes and member_of_groups |
| body | p | The body of the region |
| next, prev | p, p | Neighbours in the body’s regions |
| shell | p | Head of the singly linked chain of shells in the region |
| type | c | S solid or V void |
SHELL (13)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes of the shell |
| body | p | Obsolete, ignored on reading. When writing: the body for shells in wire and sheet bodies and for shells bounding a solid region of a solid body; null for shells of general bodies or void shells of solid bodies |
| next | p | Next shell in the region |
| face | p | Head of the chain of back-faces: faces whose normal points out of the shell’s region |
| edge | p | Head of the chain of wireframe edges |
| vertex | p | The vertex if the shell is a single vertex, else null |
| region | p | The region of the shell |
| front_face | p | Head of the chain of front-faces: faces whose normal points into the region |
FACE (14)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes and member_of_groups |
| tolerance | f | Not used (null) |
| next, previous | p, p | Next and previous back-face in the shell |
| loop | p | Head of the singly linked chain of loops |
| shell | p | The shell it is a back-face of |
| surface | p | The face’s surface (may be null) |
| sense | c | + or -: relation of the face normal to the surface’s |
| next_on_surface, previous_on_surface | p, p | Chain of faces sharing the surface |
| next_front, previous_front | p, p | Chain of front-faces in the shell |
| front_shell | p | The shell it is a front-face of |
LOOP (15)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes of the loop |
| fin | p | One fin of the ring |
| face | p | The face of the loop |
| next | p | Next loop in the face |
An isolated loop (a single vertex) points to a fin that refers to the vertex: that fin has forward = backward = itself and other, edge and curve null; its sense does not matter, and it is chained among the vertex’s fins.
FIN (17)
| Field | Type | Meaning |
|---|---|---|
| attributes_groups | p | Attributes of the fin |
| loop | p | The loop of the fin |
| forward, backward | p, p | Next and previous fin around the loop |
| vertex | p | The fin’s forward vertex |
| other | p | Next fin around the edge, clockwise looking along the edge |
| edge | p | The edge of the fin |
| curve | p | For a non-dummy fin of a tolerant edge, a trimmed SP-curve on the face’s surface within the edge tolerance of the other fins’ curves, ending within vertex tolerance of the vertices; otherwise null |
| next_at_vx | p | Next fin referencing the same vertex |
| sense | c | + if the fin’s direction is parallel to the edge’s, else - |
Edges always have at least two fins internally, so that the forward and backward vertices
of an edge are edge→fin→vertex (a positive fin) and
edge→fin→other→vertex (a negative fin). If an edge lacks a visible positive or negative
fin, a dummy fin is written, with loop, forward, backward, curve and next_at_vx all
null: the boundary of a sheet always has one.
VERTEX (18)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes and member_of_groups |
| fin | p | Head of the singly linked chain of fins that reference the vertex |
| previous, next | p, p | Neighbours in the body’s vertex chain |
| point | p | The vertex’s point |
| tolerance | f | Null if accurate |
| owner | p | The body (for non-acorn vertices) or the shell (acorn vertices) |
EDGE (16)
| Field | Type | Meaning |
|---|---|---|
| node_id | d | Node-id |
| attributes_groups | p | Attributes and member_of_groups |
| tolerance | f | Null if accurate |
| fin | p | One fin of the ring around the edge |
| previous, next | p, p | Neighbours in the body’s or shell’s edge chain |
| curve | p | The edge’s curve; zero for a tolerant edge. If the edge is accurate but a vertex is tolerant, a trimmed curve |
| next_on_curve, previous_on_curve | p, p | Chain of edges sharing the curve |
| owner | p | The body (non-wireframe edges) or shell (wireframe edges) |
An edge has no start or end vertex fields and no sense field of its own: its vertices are reached through its fins, and the edge/curve orientation is the curve’s sense.
Associated data nodes
| Node | Fields | Meaning |
|---|---|---|
| LIST (70) | node_id : d (zero); owner : p; next : p; previous : p; list_type : d (always 4, pointer lists); list_length : d; block_length : d (always 20); size_of_entry : d (ignore); list_block : p; finger_block : p; finger_index : d; notransmit : l (ignore) | Lists occur only as a part’s list of attributes (attribute_chains) |
| POINTER_LIS_BLOCK (74) | n_entries : d (0 to 20; only the first block may have 0); next_block : p; entries[20] : p | One block of a pointer list; entries past n_entries are zero. As the root node of a file of several parts, the limit of 20 does not apply |
| ATT_DEF_ID (79) | string[] : c | The name of an attribute definition, for example SDL/TYSA_COLOUR |
| FIELD_NAMES | names[] : p | Field names, Unicode or char |
| ATTRIB_DEF (80) | next : p (ignore except in partitions); identifier : p; type_id : d; actions[8] : u; field_names : p; legal_owners[14] : l; fields[] : u | An attribute definition. type_id is 8001 for colour and 9000 for user-defined definitions. The length of fields[] is the variable length written after the node type. If the file has user fields, extra zero entries may follow and are ignored |
| ATTRIBUTE (81) | node_id : d; definition : p; owner : p; next : p; previous : p; next_of_type : p; previous_of_type : p; fields[] : p | Fields are value nodes. An attribute’s next chain also holds the groups and member_of_groups of its owner. Attributes with the same definition in a part are chained through next_of_type, and the part’s attribute_chains list holds the heads. Pointer-type fields can be used but are always written empty |
| INT_VALUES (82), REAL_VALUES (83) | values[] : d / f | Integer and real field values |
| CHAR_VALUES, UNICODE_VALUES | values[] : c / n | Characters; Unicode as short integers |
| POINT_VALUES, VECTOR_VALUES, DIRECTION_VALUES | values[] : v | Vectors |
| AXIS_VALUES | values[] : v | An axis takes two vectors |
| TAG_VALUES | values[] : d | Tag values: used only in some system attributes, not in user-defined ones |
| GROUP | node_id : d; attributes_groups : p; owner : p; next : p; previous : p; type : u; first_member : p | A group in a part. The part’s attributes_groups chain mixes groups and attributes. type is a group type (below) |
| MEMBER_OF_GROUP | dummy_node_id : d (zero); owning_group : p; owner : p; next : p; previous : p; next_member : p; previous_member : p | One membership: owner is the member entity. The memberships of a node are chained with its attributes |
The reference’s table pairs node names and numbers in columns that the extracted text mixes. LIST 70, POINTER_LIS_BLOCK 74, ATT_DEF_ID 79, ATTRIB_DEF 80, ATTRIBUTE 81 and REAL_VALUES 83 are confirmed by its worked example; INT_VALUES 82 follows the numbering but its pairing is inferred. The numbers of the other value nodes, FIELD_NAMES, GROUP and MEMBER_OF_GROUP are not stated confidently here.
| Field type | Code | Group type | Code |
|---|---|---|---|
| int | 1 | instance | 1 |
| real | 2 | face | 2 |
| char | 3 | loop | 3 |
| point | 4 | edge | 4 |
| vector | 5 | vertex | 5 |
| direction | 6 | surface | 6 |
| axis | 7 | curve | 7 |
| tag | 8 | point | 8 |
| pointer | 9 | mixed | 9 |
| unicode | 10 | region | 10 |
An attribute definition’s actions[8] give what happens on each event: index 0
rotate, 1 scale, 2 translate, 3 reflect, 4 split, 5 merge, 6 transfer, 7 change. The action
values are 0 do nothing, 1 delete, 3 transform (point, vector, direction and axis fields are
transformed), 5 keep if equal (kept on a merge only if both nodes have it with equal
values), and 6 combine (move onto the surviving node on a merge); propagate (copy onto a
split-off node) is also an action and its value is not shown in the table I read. The
legal_owners[14] array is indexed by the reference’s owner enum:
0 as_owner, 1 in_owner, 2 by_owner, 3 sh_owner,
4 fa_owner, 5 lo_owner, 6 ed_owner, 7 vx_owner,
8 fe_owner, 9 sf_owner, 10 cu_owner, 11 pt_owner,
12 rg_owner, 13 fn_owner. The reference does not spell the
abbreviations out beyond one example (a face is allowed if legal_owners[fa_owner]
is true). They read as assembly, instance, body, shell, face, loop, edge, vertex, then
fe (probably group, which the schema file calls a feature), surface, curve,
point, region and fn, but that reading is a guess.
PK attribute classes 1 to 7 map onto the actions (for example class 1 propagates on a split, keeps equal on a merge and does nothing otherwise; class 2 deletes on every change but does nothing on rotation, and so on); the full class table of the reference was too mixed in extraction to reproduce here.
Node classes
A pointer field names a node class, the set of node types it may point to.
| Class | Code | Class | Code |
|---|---|---|---|
| GEOMETRY | 1003 | GROUP_OWNER | 1016 |
| PART | 1005 | GROUP_MEMBER | 1017 |
| SURFACE | 1006 | FIELD_VALUES | 1018 |
| SURFACE_OWNER | 1007 | ATTRIB_GROUP | 1019 |
| CURVE | 1008 | TRANSFORM_OWNER | 1023 |
| CURVE_OWNER | 1010 | PE_DATA | 1027 |
| POINT_OWNER | 1011 | PE_INT_GEOM | 1028 |
| LIS_BLOCK | 1012 | SHELL_OR_BODY | 1029 |
| LIST_OWNER | 1013 | FIELD_NAME | 1037 |
| ATTRIBUTE_OWNER | 1015 |
System attribute definitions
Parasolid creates these on start-up; they are class 1 definitions. They may appear in any file that uses them.
| Identifier | type_id | Entities | Fields | Used for |
|---|---|---|---|---|
SDL/TYSA_COLOUR | 8001 | face, edge | real red, green, blue, each 0.0 to 1.0 | The application sets and uses it |
SDL/TYSA_DENSITY | 8004 | body | real density; string units | Mass properties. A body without it has density 1.0; units are not used by Parasolid |
SDL/TYSA_HATCHING | 8003 | face | real ×4; integer hatching type | Hidden-line and wireframe images. Planar: the four reals are the orientation vector and the spacing between planes; radial: the first three are the spacings; parametric: the first two are the u and v spacings |
SDL/TYSA_PLANAR_HATCH | 8021 | face | real: direction (x, y, z) or plane normal, pitch (separation), position vector (x, y, z) | Takes precedence over TYSA_HATCHING |
SDL/TYSA_RADIAL_HATCH | 8027 | face | real: radial around, along, about, then the same three “start” values | Takes precedence over TYSA_HATCHING |
SDL/TYSA_PARAM_HATCH | 8028 | face | real: u spacing, v spacing, u start, v start | Takes precedence over TYSA_HATCHING |
SDL/TYSA_REGION_DENSITY | 8023 | region | real density; string units | Solid regions only; default is the body’s density |
SDL/TYSA_FACE_DENSITY | 8024 | face | real density (mass per unit area); string units | A face has mass only if it has this |
SDL/TYSA_EDGE_DENSITY | 8025 | edge | real density (mass per unit length); string units | An edge has mass only if it has this |
SDL/TYSA_VERTEX_DENSITY | 8026 | vertex | real mass (a point mass); string units | A vertex has mass only if it has this |
SDL/TYSA_REGION | 8013 | face | string (unused) | Region data for analysing hidden-line pictures |
SDL/TYSA_REFLECTIVITY | 8014 | face | real: coefficients of specular reflection, proportion of coloured light in highlights, diffuse and ambient reflection; integer reflection power | Also used by the RRPIXL routine, whose use is not recommended |
SDL/TYSA_TRANSLUCENCY | 8015 | face | real transparency, 0.0 opaque to 1.0 transparent | |
SDL/TYSA_NAME | 8017 | assembly, body, instance, shell, face, loop, edge, vertex, group, surface, curve, point | string name | Names of entities; the reference says entities read from a Romulus 6.0 transmit file keep their names in these |
Density rules: a region’s mass excludes the masses of its faces and edges; a void region has zero mass whatever its density; a solid region without a density takes the body’s; the default density of faces, edges and vertices is zero. User-defined attribute definitions use type_id 9000.
Not confirmed on this page
- The numbers of nodes that the extracted node type table does not pair clearly (see the notes above), and the “has node-id” and “visible at PK” column for the geometry and data nodes.
- The PK attribute class table (classes 1 to 7) and the action value for propagate.
- Anything that changed in Parasolid schemas after the 2006 reference (V12 to V14). Newer files from current Siemens software, including the schema numbers in the 20 000s and 30 000s that Siemens support pages mention, are not described by it.
Sources
- Parasolid XT Format Reference, October 2006 – UGS Corp.; the Model Structure, Topology, Associated Data, Node Types, Node Classes and System Attribute Definitions chapters