:docnumber: ISO 10303-42:2019(E) :partnumber: 42 :edition: 6 :title-intro-en: Industrial automation systems and integration :title-main-en: Product data representation and exchange :title-part-en: Integrated generic resource: Geometric and topological representation :title-intro-fr: Systèmes d'automatisation industrielle et intégration :title-main-fr: Représentation et échange de données de produits :title-part-fr: Ressources génériques intégrées: Représentation géométrique et topologique :doctype: international-standard :docstage: 60 :docsubstage: 60 :copyright-year: 2019 :keywords: STEP, ISO 10303, integrated resource, integrated generic resource, geometry, topology, solid model, swept solid. :technical-committee-number: 184 :subcommittee-number: 4 :workgroup-number: 12 :library-ics: 25.040.40 [abstract] ISO 10303-42:2019 specifies the integrated resource constructs for Geometric and topological representation. .Foreword ISO (the International Organization for Standardization) is a worldwide federation of national standards bodies (ISO member bodies). The work of preparing International Standards is normally carried out through ISO technical committees. Each member body interested in a subject for which a technical committee has been established has the right to be represented on that committee. International organizations, governmental and non-governmental, in liaison with ISO, also take part in the work. ISO collaborates closely with the International Electrotechnical Commission (IEC) on all matters of electrotechnical standardization. The procedures used to develop this document and those intended for its further maintenance are described in the ISO/IEC Directives, Part 1. In particular, the different approval criteria needed for the different types of ISO documents should be noted. This document was drafted in accordance with the editorial rules of the ISO/IEC Directives, Part 2 (see http://www.iso.org/directives[www.iso.org/directives]). Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. ISO shall not be held responsible for identifying any or all such patent rights. Details of any patent rights identified during the development of the document will be in the Introduction and/or on the ISO list of patent declarations received (see www.iso.org/patents[http://www.iso.org/patents]). Any trade name used in this document is information given for the convenience of users and does not constitute an endorsement. For an explanation on the voluntary nature of standards, the meaning of ISO specific terms and expressions related to conformity assessment, as well as information about ISO's adherence to the World Trade Organization (WTO) principles in the Technical Barriers to Trade (TBT) see http://www.iso.org/iso/foreword.html[www.iso.org/iso/foreword.html]. This document was prepared by Technical Committee ISO/TC 184, _Automation systems and integration_, Subcommittee SC 4, _Industrial data._ This sixth edition cancels and replaces the fifth edition (ISO 10303-42:2018-11), which has been technically revised. A detailed description of the changes is provided in <>. A list of all parts in the ISO 10303 series can be found on the http://standards.iso.org/iso/10303/tech/step_titles.htm[ISO website]. Any feedback or questions on this document should be directed to the user’s national standards body. A complete listing of these bodies can be found at https://www.iso.org/members.html[www.iso.org/members.html]. [[introduction]] == Introduction ISO 10303 is an International Standard for the computer-interpretable representation of product information and for the exchange of product data. The objective is to provide a neutral mechanism capable of describing products throughout their life cycle. This mechanism is suitable not only for neutral file exchange, but also as a basis for implementing and sharing product databases, and as a basis for retention and archiving. Major subdivisions of this part of ISO 10303 are: * geometry_schema; * topology_schema; * geometric_model_schema; * scan_data_3d_shape_model_schema. This document specifies the integrated resources used for geometric and topological representation. Their primary application is for explicit representation of the shape or geometric form of a product model. The shape representation presented here has been designed to facilitate stable and efficient communication when mapped to a physical file. The geometry in clause 4 is exclusively the geometry of parametric curves and surfaces. It includes the curve and surface entities and other entities, functions and data types necessary for their definition. A common scheme has been used for the definition of both two-dimensional and three-dimensional geometry. All geometry is defined in a coordinate system which is established as part of the context of the item which it represents. These concepts are fully defined in ISO 10303 Part 43. The topology in clause 5 is concerned with connectivity relationships between objects rather than with the precise geometric form of objects. This clause contains the basic topological entities and specialised subtypes of these. In some cases the subtypes have geometric associations. Also included are functions, particularly constraint functions, and data types necessary for the definitions of the topological entities. NOTE: This integrated resource has the following objects that are known to have issues and will be updated in the near future: * edge_with_length; * vertex_on_edge. The geometric models in clause 6 provide basic resources for the communication of data describing the precise size and shape of three-dimensional solid objects. The geometric shape models provide a complete representation of the shape which in many cases includes both geometric and topological data. Included here are the two classical types of solid model, constructive solid geometry (CSG) and boundary representation (B-rep). Other entities, providing a rather less complete description of the geometry of a product, and with less consistency constraints, are also included. The scan data shape models in clause 5 provide resources for the approximate representation of a 3 dimensional shape as a cloud of points. The relationships of the schemas in this part of ISO 10303 to other schemas that define the integrated resources of ISO 10303 are illustrated in Figure 1 using the EXPRESS-G notation. EXPRESS-G is defined in ISO 10303-11. The following schemas shown in Figure 1 are not found in this part of ISO 10303, but are found as specified: * measure_schema is found in ISO 10303-41; * product_property_representation_schema is found in ISO 10303-41; * representation_schema is found in ISO 10303-43. The schemas illustrated in Figure 1 are components of the integrated resources. * <
> [[scope]] == Scope This part of ISO 10303 specifies the integrated generic resource constructs for geometric and topological representation. [[inscope]] The following are within the scope of this part of ISO 10303: The following are in the scope of the geometry schema: * definition of points, vectors, parametric curves and parametric surfaces; * definition of finite volumes with internal parametrisation; * definition of transformation operators; * points defined directly by their coordinate values or in terms of the parameters of an existing curve or surface; * definition of conic curves and elementary surfaces; * definition of curves defined on a parametric surface; * definition of general parametric spline curves, surfaces and volumes; * definition of locally refined spline curves, surfaces and volumes; * definition of point, curve and surface replicas; * definition of offset curves and surfaces; * definition of intersection curves. The following are in the scope of the topology schema: * definition of the fundamental topological entities vertex, edge, and face, each with a specialised subtype to enable it to be associated with the geometry of a point, curve, or surface, respectively; * collections of the basic entities to form topological structures of path, loop and shell and constraints to ensure the integrity of these structures; * the association of faces with geometric volumes; * orientation of topological entities. The following are in the scope of the geometric model schema: * data describing the precise geometric form of three-dimensional solid * objects; * constructive solid geometry (CSG) models; * CSG models in two-dimensional space; * definition of CSG primitives and half-spaces; * creation of solid models by sweeping operations; * manifold boundary representation (B-rep) models; * constraints to ensure the integrity of B-rep models; * surface models; * wireframe models; * geometric sets; * creation of a replica of a solid model in a new location; * tessellated geometry; * the association of tessellated geometry with exact geometry. The following are in the scope of the scan data 3d shape model schema: * representation of a shape as a cloud of points produced by a scanning process. [[outscope]] The following are outside the scope of this part of ISO 10303: * all other forms of procedurally defined curves and surfaces; * curves and surfaces which do not have a parametric form of representation; * any form of explicit representation of a ruled surface. NOTE: For a ruled surface the geometry is critically dependent upon the parametrisation of the boundary curves and the method of associating pairs of points on the two curves. A ruled surface with B-spline boundary curves can however be exactly represented by the B-spline surface entity. * spatial occupancy forms of solid models (such as octree models); * geometric tolerances; * implicit forms of representation in terms of features; * assemblies and mechanisms. [bibliography] == Normative references The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies. [[defns]] == Terms, definitions and abbreviated terms [[termsdefns]] === Terms and definitions [[sec_3.1.1]] ==== Terms defined in ISO 10303-1 For the purposes of this document, the following terms defined in ISO 10303-1 apply: * [[term-integrated resource]]integrated resource. [[sec_3.1.2]] ==== Other terms and definitions For the purposes of this document, the following terms and definitions apply: [[sec_3.1.2.1]] ===== [[term-arcwise connected]]arcwise connected such that any pair of distinct points in the relevant domain may be connected by a continuous arc entirely contained within that domain [[sec_3.1.2.2]] ===== [[term-axi-symmetric]]axi-symmetric invariant under all rotations about a central axis [[sec_3.1.2.3]] ===== [[term-boundary]]boundary subset of the points x in a domain X having the property that any open ball U centred on x satisfies U ⋂ X ≠ U NOTE: Any open ball centred on the boundary of the domain will contain both points inside the domain and points outside the domain. [[sec_3.1.2.4]] ===== [[term-boundary representation solid model]]boundary representation solid model B-rep type of geometric model in which the size and shape of a solid is defined in terms of the faces, edges and vertices which make up its boundary [[sec_3.1.2.5]] ===== [[term-bounds]]bounds limits of a topological entity NOTE: Bounds are the topological entities of lower dimensionality which mark the limits of a topological entity. The bounds of a face are loops, and the bounds of an edge are vertices. [[sec_3.1.2.6]] ===== [[term-closed curve]]closed curve curve such that both end points are the same [[sec_3.1.2.7]] ===== [[term-closed surface]]closed surface connected 2-manifold that divides space into exactly two connected components, one of which is finite [[sec_3.1.2.8]] ===== [[term-completion of a topological entity]]completion of a topological entity set consisting of the entity in question together with all the faces, edges and vertices referenced, directly or indirectly, in the definition of the bounds of that entity [[sec_3.1.2.9]] ===== [[term-connected]]connected synonym for arcwise connected [[sec_3.1.2.10]] ===== [[term-connected component]]connected component maximal connected subset of a domain [[sec_3.1.2.11]] ===== [[term-constructive solid geometry]]constructive solid geometry CSG type of geometric modelling in which a solid is defined as the result of a sequence of regularised Boolean operations operating on solid models [[sec_3.1.2.12]] ===== [[term-coordinate space]]coordinate space reference system that associates a unique set of n parameters with each point in an n-dimensional space [[sec_3.1.2.13]] ===== [[term-curve]]curve set of mathematical points which is the image, in two- or three-dimensional space, of a continuous function defined over a connected subset of the real line R ^1^ , and which is not a single point [[sec_3.1.2.14]] ===== [[term-cycle]]cycle chain of alternating vertices and edges in a graph such that the first and last vertices are the same [[sec_3.1.2.15]] ===== [[term-dimensionality]]dimensionality number of independent coordinates in the parameter space of a geometric entity NOTE: A curve has dimensionality 1, a surface has dimensionality 2. The dimensionality of topological entities which need not have domains is specified in the entity definitions. The dimensionality of a list or set is the maximum of the dimensionalities of the elements of that list or set. [[sec_3.1.2.16]] ===== [[term-d -manifold with boundary]]d -manifold with boundary domain which is the union of its _d_ -dimensional interior and its boundary [[sec_3.1.2.17]] ===== [[term-domain]]domain mathematical point set in model space corresponding to an entity [[sec_3.1.2.18]] ===== [[term-euler equations]]euler equations equations used to verify the topological consistency of objects NOTE: Various equalities relating topological properties of entities are derived from the invariance of a number known as the Euler characteristic. Typically, these are used as quick checks on the integrity of the topological structure. A violation of an Euler condition signals an "impossible" object. Two special cases are important in this document. The Euler equation for graphs is discussed in 5.2.3. Euler conditions for surfaces are discussed in 5.4.25 and 5.2,27. [[sec_3.1.2.19]] ===== [[term-extent]]extent measure of the domain of a geometric entity in units appropriate to the dimensionality of the entity NOTE: Length, area and volume are used for dimensionalities 1, 2, and 3, respectively. Where necessary, the symbol Ξ will be used to denote extent. [[sec_3.1.2.20]] ===== [[term-facet]]facet a planar triangle [[sec_3.1.2.21]] ===== [[term-finite]]finite capable of being completely counted or measured NOTE: An entity is finite (or alternatively bounded) if there is a finite upper bound on the distance between any two points in its domain. [[sec_3.1.2.22]] ===== [[term-genus of a graph]]genus of a graph integer-valued invariant defined algorithmically by the graph traversal algorithm NOTE: The graph traversal algorithm is described in the note in 5.2.3. [[sec_3.1.2.23]] ===== [[term-genus of a surface]]genus of a surface number of handles that are added to a sphere to produce a surface homeomorphic to the surface in question NOTE: Handle is defined below. [[sec_3.1.2.24]] ===== [[term-geometrically founded]]geometrically founded having an associated coordinate space NOTE: Geometric founding is a property of *geometric_representation_item* s (see 4.4.2) asserting their relationship to a coordinate space in which the coordinate values of points and directions on which they depend for position and orientation are measured. [[sec_3.1.2.25]] ===== [[term-geometrically related]]geometrically related related by being in the same geometric context NOTE: If two *geometric_representation_item* s (see 4.4.2) are geometricaslly related then the concepts of distance and direction between them are defined. [[sec_3.1.2.26]] ===== [[term-geometric coordinate system]]geometric coordinate system underlying global rectangular Cartesian coordinate system to which all geometry refers [[sec_3.1.2.27]] ===== [[term-graph]]graph set of vertices and edges NOTE: The graphs discussed in this document are generally called pseudographs in the technical literature because they allow self-loops and also multiple edges connecting the same two vertices. [[sec_3.1.2.28]] ===== [[term-handle]]handle structure distinguishing a torus from a sphere, which can be viewed as a tubular surface connecting two holes in a surface [[sec_3.1.2.29]] ===== [[term-homeomorphic]]homeomorphic in one to one correspondence NOTE: Domains X and Y are homeomorphic if there is a continuous function _f_ from X to Y which is a one-to-one correspondence, so that the inverse function _f_  ^-1^ exists, and _f_  ^-1^ is also continuous. [[sec_3.1.2.30]] ===== [[term-inside]]inside completely included within NOTE: A domain X is inside domain Y if both domains are contained in the same Euclidean space, R ^m^ , and Y separates R ^m^ into exactly two connected components, one of which is finite, and X is contained in the finite component. [[sec_3.1.2.31]] ===== [[term-interior]]interior point set resulting from exclusion of all boundary points from a bounded point set NOTE: The d-dimensional interior of a d-dimensional domain X contained in R ^m^ is the set of mathematical points x in X for which there is an open ball U in R ^m^ containing x such that the intersection U ⋂ X is homeomorphic to an open ball in R ^d^ . [[sec_3.1.2.32]] ===== [[term-list]]list ordered homogeneous collection with possibly duplicate members [[sec_3.1.2.33]] ===== [[term-model space]]model space space with dimensionality 2 or 3 in which the geometry of a representation of a physical object, or any of its elements, is defined [[sec_3.1.2.34]] ===== [[term-open curve]]open curve curve which has two distinct end points [[sec_3.1.2.35]] ===== [[term-open surface]]open surface surface which is a manifold with boundary, but is not closed NOTE: Either it is not finite, or it does not divide space into exactly two connected components. [[sec_3.1.2.36]] ===== [[term-orientable]]orientable capable of being oriented in space NOTE: A surface is orientable if a consistent, continuously varying choice can be made of the sense of the normal vectors to the surface. This does not require a continuously varying choice of the _values_ of the normal vectors; the surface may have tangent plane discontinuities. [[sec_3.1.2.37]] ===== [[term-overlap]]overlap area or range shared in common by two or more geometric elements NOTE: Two topological entities overlap when they have shells, faces, edges, or vertices in common. [[sec_3.1.2.38]] ===== [[term-parameter range]]parameter range range of valid parameter values for a curve, surface, or volume [[sec_3.1.2.39]] ===== [[term-parameter space]]parameter space one-dimensional space associated with a curve via its uniquely defined parameterisation, or the two-dimensional space associated with a surface [[sec_3.1.2.40]] ===== [[term-parametric volume]]parametric volume bounded region of three dimensional model space with an associated parametric coordinate system such that every interior point is associated with a list _(u,v,w)_ of parameter values [[sec_3.1.2.41]] ===== [[term-placement coordinate system]]placement coordinate system rectangular Cartesian coordinate system associated with the placement of a geometric entity in space NOTE: This is used to describe the interpretation of the attributes and to associate a unique parameterisation with curve and surface entities [[sec_3.1.2.42]] ===== [[term-self-intersect]]self-intersect intersection of a geometric element with itself NOTE: A curve or surface self-intersects if there is a mathematical point in its domain which is the image of at least two points in the object's parameter range, and one of those two points lies in the interior of the parameter range. A vertex, edge or face self-intersects if its domain does. NOTE: A curve or surface is not considered to be self-intersecting just because it is closed. [[sec_3.1.2.43]] ===== [[term-self-loop]]self-loop edge that has the same vertex at both ends [[sec_3.1.2.44]] ===== [[term-set]]set unordered collection in which no two members are equal [[sec_3.1.2.45]] ===== [[term-space dimensionality]]space dimensionality number of parameters required to define the location of a point in the coordinate space [[sec_3.1.2.46]] ===== [[term-surface]]surface set of mathematical points which is the image of a continuous function defined over a connected subset of the plane R ^2^ [[sec_3.1.2.47]] ===== [[term-tessellated geometry]]tessellated geometry geometry composed of a large number of planar tiles, usually of triangular shape NOTE: Tessellated geometry is frequently used as an approximation to the exact shape of an object. [[sec_3.1.2.48]] ===== [[term-topological sense]]topological sense sense of a topological entity as derived from the order of its attributes [example] [[example_1]] The topological sense of an edge is from the edge start vertex to the edge end vertex. [example] [[example_2]] The topological sense of a path follows the edges in their listed order. [[abbrv]] === Abbreviated terms For the purposes of this document, the following abbreviated terms apply: URL:: uniform resource locator B-rep:: boundary representation solid model CSG:: constructive solid geometry [[schema4]] == Geometry schema [[gen]] == General The subject of the *geometry_schema* is the geometry of parametric curves and surfaces. The *representation_schema* (see ISO 10303-43) and the *geometric_representation_context* defined in this Part of ISO 10303, provide the context in which the geometry is defined. The *geometric_representation_context* enables a distinction to be made between those items which are in the same context, and thus geometrically related, and those existing in independent coordinate spaces. In particular, each *geometric_representation_item* has a *geometric_representation_context* which includes as an attribute the Euclidean dimension of its coordinate space. The coordinate system for this space is referred to as the geometric coordinate system in this clause. Units associated with *length_measure* s and *plane_angle_measure* s are assumed to be assigned globally within this context. A global rule ( *compatible_dimension* ) ensures that all *geometric_representation_item* s in the same *geometric_representation_context* have the same space dimensionality. The space dimensionality *dim* is a derived attribute of all subtypes of *geometric_representation_item* . This clause defines the information requirements to which implementations shall conform using the EXPRESS language as defined in ISO 10303-11. The following EXPRESS declaration begins the *geometry_schema* and identifies the necessary external references. Short names of entities defined in this schema are described in Annex A. Unambiguous identification of this schema is defined in Annex B. [.underline]#EXPRESS specification:# [source] -- *) [[geometry_schema]] SCHEMA geometry_schema; -- [[interfaces]] [source] -- REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema[geometric_model_schema]   -- ISO 10303-42   (../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.block[block],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.boolean_result[boolean_result],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.cyclide_segment_solid[cyclide_segment_solid],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.eccentric_cone[eccentric_cone],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.edge_based_wireframe_model[edge_based_wireframe_model],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.ellipsoid[ellipsoid],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.face_based_surface_model[face_based_surface_model],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.faceted_primitive[faceted_primitive],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.geometric_set[geometric_set],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.half_space_solid[half_space_solid],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.primitive_2d[primitive_2d],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.rectangular_pyramid[rectangular_pyramid],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.right_angular_wedge[right_angular_wedge],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.right_circular_cone[right_circular_cone],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.right_circular_cylinder[right_circular_cylinder],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.shell_based_surface_model[shell_based_surface_model],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.shell_based_wireframe_model[shell_based_wireframe_model],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.solid_model[solid_model],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.sphere[sphere],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.tessellated_item[tessellated_item],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.torus[torus]); REFERENCE FROM ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema[measure_schema]   -- ISO 10303-41   (../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.global_unit_assigned_context[global_unit_assigned_context],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.length_measure[length_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.parameter_value[parameter_value],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.plane_angle_unit[plane_angle_unit],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_plane_angle_measure[positive_plane_angle_measure]); REFERENCE FROM ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema[representation_schema]   -- ISO 10303-43   (../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.definitional_representation[definitional_representation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.founded_item[founded_item],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.functionally_defined_transformation[functionally_defined_transformation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.item_in_context[item_in_context],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation[representation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation_context[representation_context],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation_item[representation_item],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.using_representations[using_representations]); REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/7_schema.xml#scan_data_3d_shape_model_schema[scan_data_3d_shape_model_schema]   -- ISO 10303-42   (../../../../data/resource_docs/geometric_and_topological_representation/sys/7_schema.xml#scan_data_3d_shape_model_schema.scanned_data_item[scanned_data_item]); REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema[topology_schema]   -- ISO 10303-42   (../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.edge_curve[edge_curve],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.face_surface[face_surface],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.poly_loop[poly_loop],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.vertex_point[vertex_point],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.volume_with_faces[volume_with_faces]); (* -- NOTE: The schemas referenced above are specified in the following parts: [quote] _____ geometric_model_schema:: ISO 10303-42 measure_schema:: ISO 10303-41 representation_schema:: ISO 10303-43 scan_data_3d_shape_model_schema:: ISO 10303-42 topology_schema:: ISO 10303-42 _____ NOTE: See <> for a graphical representation of this schema. [[funcon]] == Fundamental concepts and assumptions *4.2.1 Space Dimensionality * All geometry shall be defined in a right-handed rectangular Cartesian coordinate system with the same units on each axis. A common scheme has been used for the definition of both two-dimensional and three-dimensional geometry. Points and directions exist in both a two-dimensional and a three-dimensional form; these forms are distinguished solely by the presence, or absence, of a third coordinate value. Complex geometric entities are all defined using points and directions from which their space dimensionality can be deduced. *4.2.2 Geometric relationships * All *geometric_representation_item* s which are included as *items* in a *representation* having a *geometric_representation_context* are geometrically related. Any such *geometric_representation_item* is said to be geometrically founded in the context of that *representation* . No geometric relationship, such as distance between points, is assumed to exist for *geometric_representation_item* s occurring as *items* in different *representation* s. *4.2.3 Parametrisation of analytic curves and surfaces * Each curve or surface specified here has a defined parametrisation. In some instances the definitions are in parametric terms. In others, the conic curves and elementary surfaces, the definitions are in geometric terms. In this latter case a placement coordinate system is used to define the parametrisation. The geometric definitions contain some, but not all, of the data required for this. The relevant data to define this placement coordinate system is contained in the *axis2_placement* associated with the individual curve and surface entities. Where the curve or surface parameterisation uses trigonometric functions, the parameter for the function behaves like an angle and can be considered to be an angular parameter. Numerical values for such angular parameters shall use the current units for *plane_angle_measure* . *4.2.4 Curves * The curve entities defined in this schema include lines, elementary conics, a general parametric polynominal curve, and some referentially or procedurally defined curves. All the curves have a well defined parametrisation which makes it possible to trim a curve or identify points on the curve by parameter value. The geometric direction of a curve is the direction of increasing parameter value. For the conic curves, a method of representation is used which separates their geometric form from their orientation and position in space. In each case, the position and orientation information is conveyed by an *axis2_placement* . The general purpose parametric curve is represented by the *b_spline_curve* entity. This was selected as the most stable form of representation for the communication of all types of polynomial and rational parametric curves. With appropriate attribute values and subtypes, a *b_spline_curve* entity is capable of representing single span or spline curves of explicit polynomial, rational, Bézier or B-spline type. A *composite_curve* entity, which includes the facility to communicate continuity information at the curve-to-curve transition points, is provided for the construction of more complex curves. The offset_curve and *curve_on_surface* types are curves defined with reference to other geometry. Separate offset_curve entities exist for 2D and 3D applications. The curve on surface entities include an *intersection_curve* which represents the intersection of two surfaces. Such a curve may be represented in 3D space or in the 2D parameter space of either of the surfaces. *4.2.5 Surfaces * The surface entities support the requirements of simple boundary representation (B-rep) solid modelling system and enable the communication of general polynomial and rational parametric surfaces. The simple surfaces are the planar, spherical, cylindrical, conical and toroidal surfaces, a *surface_of_revolution* and a *surface_of_linear_extrusion* . As with curves, all surfaces have an associated standard parametrisation. In many cases the surfaces, as defined, are unbounded; it is assumed that they will be bounded either explicitly or implicitly. Explicit bounding is achieved with the *rectangular_trimmed_surface* or *curve_bounded_surface* entities; implicit bounding requires the association of additional topological information to define a *face* . The *b_spline_surface* entity and its subtypes provide the most general capability for the communication of all types of polynomial and rational biparametric surfaces. This entity uses control points as the most stable form of representation for the surface geometry. The *offset_surface* entity is intended for the communication of a surface obtained as a simple normal offset from a given surface. The *rectangular_composite_surface* entity provides the basic capability to connect together a rectangular mesh of distinct surface patches, specifying the degree of continuity from patch to patch. * 4.2.6 Preferred form * Some of the geometric entities provide the potential capability of defining an item of geometry in more than one way. Such multiple representations are accommodated by requiring the nomination of a `preferred form' or `master representation'. This is the form which is used to determine the parametrisation. NOTE: The *master_representation* attribute acknowledges the impracticality of ensuring that multiple forms are indeed identical and allows the indication of a preferred form. This would probably be determined by the creator of the data. All characteristics, such as parametrisation, domain, and results of evaluation, for an entity having multiple representations, are derived from the master representation. Any use of the other representations is a compromise for practical considerations. [#table_table_1] [cols="1,1"] .Geometry mathematical symbology |=== |Symbol |Definition |_a_ |Scalar quantity |*A* |Vector quantity |< > |Vector normalisation |*a* |Normalised vector < *A* > = *A* / | *A* | | × |Vector (cross) product |⋅ |Scalar product |*A* → *B* |*A* is transformed to *B* | λ _(u)_ |Parametric curve | σ _(u,v)_ | Parametric surface |_S(x,y,z)_ | Analytic surface |_ C ~x~_ | Partial differential of _C_ with respect to _x_ | σ ~_u_~ | Partial differential of σ _(u,v)_ with respect to _u_ |_ S ~x~_ | Partial derivative of _S_ with respect to _x_ || | |Absolute value, or magnitude or determinant | R ^m^ | m-dimensional real space |=== [[constants]] == geometry_schema constant definition [.underline]#EXPRESS specification:# [source] -- *) CONSTANT (* -- [[geometry_schema.dummy_gri]] ==== dummy_gri A *dummy_gri* is a partial entity definition to be used when types of <> are constructed. It provides the correct supertypes and the ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item.name[name] attribute as an empty string. [.underline]#EXPRESS specification:# [source] -- *)   dummy_gri: ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.geometric_representation_item[geometric_representation_item] := representation_item('')|| geometric_representation_item(); (* -- [source] -- *) END_CONSTANT; (* -- [[types]] == geometry_schema type definitions [[geometry_schema.axis2_placement]] ==== axis2_placement The *axis2_placement* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. The *axis2_placement* select type represents the placing of mutually perpendicular axes in two-dimensional or in three-dimensional Cartesian space. NOTE: This select type enables entities requiring axis placement information to reference the axes without specifying the space dimensionality. [.underline]#EXPRESS specification:# [source] -- *) TYPE axis2_placement=SELECT    (#geometry_schema.axis2_placement_2d[axis2_placement_2d],     #geometry_schema.axis2_placement_3d[axis2_placement_3d]); END_TYPE; (* -- [[geometry_schema.b_spline_curve_form]] ==== b_spline_curve_form The *b_spline_curve_form* enumerated type is used to indicate that the <> represents a part of a curve of some specific form. [.underline]#EXPRESS specification:# [source] -- *) TYPE b_spline_curve_form=ENUMERATION OF    (polyline_form,     circular_arc,     elliptic_arc,     parabolic_arc,     hyperbolic_arc,     unspecified); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.b_spline_curve_form.polyline_form]]*polyline_form:* a connected sequence of line segments represented by degree 1 B-spline basis functions; [[geometry_schema.b_spline_curve_form.circular_arc]]*circular_arc:* an arc of a circle, or a complete circle represented by a B-spline curve; [[geometry_schema.b_spline_curve_form.elliptic_arc]]*elliptic_arc:* an arc of ellipse, or a complete ellipse represented by a B-spline curve; [[geometry_schema.b_spline_curve_form.parabolic_arc]]*parabolic_arc:* an arc of finite length of a parabola represented by a B-spline curve; [[geometry_schema.b_spline_curve_form.hyperbolic_arc]]*hyperbolic_arc:* an arc of finite length of an hyperbola represented by a B-spline curve; [[geometry_schema.b_spline_curve_form.unspecified]]*unspecified:* a curve for which no particular form is specified; [[geometry_schema.b_spline_surface_form]] ==== b_spline_surface_form The *b_spline_surface_form* enumerated type is used to indicate that the <> represents a part of a surface of some specific form. [.underline]#EXPRESS specification:# [source] -- *) TYPE b_spline_surface_form=ENUMERATION OF    (plane_surf,     cylindrical_surf,     conical_surf,     spherical_surf,     toroidal_surf,     surf_of_revolution,     ruled_surf,     generalised_cone,     quadric_surf,     surf_of_linear_extrusion,     unspecified); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.b_spline_surface_form.plane_surf]]*plane_surf:* a bounded portion of a plane represented by a B-spline surface of degree 1 in each parameter; [[geometry_schema.b_spline_surface_form.cylindrical_surf]]*cylindrical_surf:* a bounded portion of a cylindrical surface; [[geometry_schema.b_spline_surface_form.conical_surf]]*conical_surf:* a bounded portion of a right circular cone; [[geometry_schema.b_spline_surface_form.spherical_surf]]*spherical_surf:* a bounded portion of a sphere, or a complete sphere, represented by a B-spline surface; [[geometry_schema.b_spline_surface_form.toroidal_surf]]*toroidal_surf:* a torus, or portion of a torus, represented by a B-spline surface; [[geometry_schema.b_spline_surface_form.surf_of_revolution]]*surf_of_revolution:* a bounded portion of a surface of revolution; [[geometry_schema.b_spline_surface_form.ruled_surf]]*ruled_surf:* a surface constructed from two parametric curves by joining with straight lines corresponding points with the same parameter value on each of the curves. [[geometry_schema.b_spline_surface_form.generalised_cone]]*generalised_cone:* a special case of a ruled surface in which the second curve degenerates to a single point; when represented by a B-spline surface all the control points along one edge will be coincident; [[geometry_schema.b_spline_surface_form.quadric_surf]]*quadric_surf:* a bounded portion of one of the class of surfaces of degree 2 in the variables x, y and z; [[geometry_schema.b_spline_surface_form.surf_of_linear_extrusion]]*surf_of_linear_extrusion:* a bounded portion of a surface of linear extrusion represented by a B-spline surface of degree 1 in one of the parameters; [[geometry_schema.b_spline_surface_form.unspecified]]*unspecified:* a surface for which no particular form is specified; [[geometry_schema.curve_on_surface]] ==== curve_on_surface The *curve_on_surface* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. The *curve_on_surface* is a curve on a parametric surface. It may be a <>, or a <> including the specialised subtypes of <> and <>, or a <>. [.underline]#EXPRESS specification:# [source] -- *) TYPE curve_on_surface=SELECT    (#geometry_schema.composite_curve_on_surface[composite_curve_on_surface],     #geometry_schema.pcurve[pcurve],     #geometry_schema.surface_curve[surface_curve]); END_TYPE; (* -- [[geometry_schema.dimension_count]] ==== dimension_count A *dimension_count* is a positive integer used to define the coordinate space dimensionality of a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE dimension_count=INTEGER; WHERE   WR1: SELF > 0; END_TYPE; (* -- [.underline]#Formal propositions:# [[geometry_schema.dimension_count.wr:wr1]]*WR1:* A *dimension_count* shall be positive. [[geometry_schema.extent_enumeration]] ==== extent_enumeration The *extent_enumeration* type is used to describe the quantitive extent of an object. [.underline]#EXPRESS specification:# [source] -- *) TYPE extent_enumeration=ENUMERATION OF    (invalid,     zero,     finite_non_zero,     infinite); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.extent_enumeration.invalid]]*invalid:* the concept of extent is not valid for the quantity being measured; [[geometry_schema.extent_enumeration.zero]]*zero:* the extent is zero; [[geometry_schema.extent_enumeration.finite_non_zero]]*finite_non_zero:* the extent is finite (bounded) but not zero; [[geometry_schema.extent_enumeration.infinite]]*infinite:* the extent is not finite; [[geometry_schema.knot_type]] ==== knot_type The *knot_type* indicates that the B-spline knots have a particularly simple form enabling the knots themselves to be defaulted; [.underline]#EXPRESS specification:# [source] -- *) TYPE knot_type=ENUMERATION OF    (uniform_knots,     quasi_uniform_knots,     piecewise_bezier_knots,     unspecified); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.knot_type.uniform_knots]]*uniform_knots:* the form of knots appropriate for a uniform B-spline curve or surface; [[geometry_schema.knot_type.quasi_uniform_knots]]*quasi_uniform_knots:* the form of knots appropriate for a quasi-uniform B-spline curve or surface; [[geometry_schema.knot_type.piecewise_bezier_knots]]*piecewise_bezier_knots:* the form of knots appropriate for a piecewise Bézier curve; [[geometry_schema.knot_type.unspecified]]*unspecified:* the type of knots is not specified; this includes the case of non uniform knots; [[geometry_schema.linearly_independent_enum]] ==== linearly_independent_enum This type is used to indicate that a locally refined spline has been tested for linear independence. [.underline]#EXPRESS specification:# [source] -- *) TYPE linearly_independent_enum=ENUMERATION OF    (independent,     not_independent,     not_tested); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.linearly_independent_enum.independent]]*independent:* the set of combined B-spline functions is linearly independent; [[geometry_schema.linearly_independent_enum.not_independent]]*not_independent:* the set of B-spline functions is linearly dependent; [[geometry_schema.linearly_independent_enum.not_tested]]*not_tested:* the set of B-spline functions has not been tested for linear dependence. [[geometry_schema.locally_refined_spline_type_enum]] ==== locally_refined_spline_type_enum This type is used to indicate the type of the original locally refined spline to enable the standardized spline representation to be unpacked to this original format. NOTE: See [6], [7] and [15] for further details of the specific types of locally refined splines. [.underline]#EXPRESS specification:# [source] -- *) TYPE locally_refined_spline_type_enum=ENUMERATION OF    (analysis_suitable_t_spline,     hierarchical_b_spline,     lr_b_spline,     semi_standard_t_spline,     standard_t_spline); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.locally_refined_spline_type_enum.analysis_suitable_t_spline]]*analysis_suitable_t_spline:* the local B-spline is of the analysis suitable t-spline type; [[geometry_schema.locally_refined_spline_type_enum.hierarchical_b_spline]]*hierarchical_b_spline:* the local B-spline is of the hierachical b-spline type; [[geometry_schema.locally_refined_spline_type_enum.lr_b_spline]]*lr_b_spline:* the local B-spline is of the lr-b-spline type; [[geometry_schema.locally_refined_spline_type_enum.semi_standard_t_spline]]*semi_standard_t_spline:* the local B-spline is of the semi-standard t-spline type; [[geometry_schema.locally_refined_spline_type_enum.standard_t_spline]]*standard_t_spline:* the local B-spline is of the standard t-spline type; [[geometry_schema.pcurve_or_surface]] ==== pcurve_or_surface The *pcurve_or_surface* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. [.underline]#EXPRESS specification:# [source] -- *) TYPE pcurve_or_surface=SELECT    (#geometry_schema.pcurve[pcurve],     #geometry_schema.surface[surface]); END_TYPE; (* -- [[geometry_schema.preferred_surface_curve_representation]] ==== preferred_surface_curve_representation The *preferred_surface_curve_representation* type is used to indicate the preferred form of representation for a surface curve, which is either a curve in geometric space or in the parametric space of the underlying surfaces; [.underline]#EXPRESS specification:# [source] -- *) TYPE preferred_surface_curve_representation=ENUMERATION OF    (curve_3d,     pcurve_s1,     pcurve_s2); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.preferred_surface_curve_representation.curve_3d]]*curve_3d:* the curve in three-dimensional space is preferred; [[geometry_schema.preferred_surface_curve_representation.pcurve_s1]]*pcurve_s1:* the first pcurve is preferred; [[geometry_schema.preferred_surface_curve_representation.pcurve_s2]]*pcurve_s2:* the second pcurve is preferred; [[geometry_schema.spline_knot_values]] ==== spline_knot_values The *spline_knot_values* type defines a list of non-repeated real values in ascending order. It is used to represent the knot values in the definition of local B-splines. A local B-spline does not need to use all consecutive knots, and multiple use of knots may occur. [.underline]#EXPRESS specification:# [source] -- *) TYPE spline_knot_values=LIST[2:?] OF REAL; WHERE   WR1: increasing_values_in_list(SELF); END_TYPE; (* -- [.underline]#Formal propositions:# [[geometry_schema.spline_knot_values.wr:wr1]]*WR1:* The knot values shall be strictly increasing in size. [[geometry_schema.surface_boundary]] ==== surface_boundary The *surface_boundary* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. This type is used to select the type of bounding curve to be used in the definition of a <> . It provides for the boundary to be either a <> or a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE surface_boundary=SELECT    (#geometry_schema.boundary_curve[boundary_curve],     #geometry_schema.degenerate_pcurve[degenerate_pcurve]); END_TYPE; (* -- [[geometry_schema.transition_code]] ==== transition_code The *transition_code* type conveys the continuity properties of a composite curve or surface. The continuity referred to is geometric, not parametric continuity. [.underline]#EXPRESS specification:# [source] -- *) TYPE transition_code=ENUMERATION OF    (discontinuous,     continuous,     cont_same_gradient,     cont_same_gradient_same_curvature); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.transition_code.discontinuous]]*discontinuous:* the segments, or patches, do not join; this is permitted only at the boundary of the curve or surface to indicate that it is not closed. [[geometry_schema.transition_code.discontinuous]]*discontinuous:* the segments, or patches, do not join; this is permitted only at the boundary of the curve or surface to indicate that it is not closed. [[geometry_schema.transition_code.continuous]]*continuous:* the segments, or patches, join, but no condition on their tangents is implied; [[geometry_schema.transition_code.cont_same_gradient]]*cont_same_gradient:* the segments, or patches, join, and their tangent vectors, or tangent planes, are parallel and have the same direction at the joint; equality of derivatives is not required; [[geometry_schema.transition_code.cont_same_gradient_same_curvature]]*cont_same_gradient_same_curvature:* the gradient and curvature are continuous; for a curve, the segments join, their tangent vectors are parallel and in the same direction, and their curvatures are equal at the joint; equality of derivatives is not required; for a surface this implies that the principal curvatures are the same and that the principal directions are coincident along the common boundary. [[geometry_schema.trimming_preference]] ==== trimming_preference The *trimming_preference* type is used to indicate the preferred way of trimming a parametric curve where the trimming is multiply defined. [.underline]#EXPRESS specification:# [source] -- *) TYPE trimming_preference=ENUMERATION OF    (cartesian,     parameter,     unspecified); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometry_schema.trimming_preference.cartesian]]*cartesian:* trimming by cartesian point is preferred; [[geometry_schema.trimming_preference.parameter]]*parameter:* trimming by parameter value is preferred;; [[geometry_schema.trimming_preference.unspecified]]*unspecified:* no trimming preference is communicated; [[geometry_schema.trimming_select]] ==== trimming_select The *trimming_select* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. This select type identifies the two possible ways of trimming a parametric curve, by a cartesian point on the curve, or by a REAL number defining a parameter value within the parametric range of the curve. [.underline]#EXPRESS specification:# [source] -- *) TYPE trimming_select=SELECT    (#geometry_schema.cartesian_point[cartesian_point],     ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.parameter_value[parameter_value]); END_TYPE; (* -- [[geometry_schema.vector_or_direction]] ==== vector_or_direction The *vector_or_direction* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. This type is used to identify the types of entity which can participate in vector computations. [.underline]#EXPRESS specification:# [source] -- *) TYPE vector_or_direction=SELECT    (#geometry_schema.direction[direction],     #geometry_schema.vector[vector]); END_TYPE; (* -- [[entities]] == geometry_schema entity definitions [[geometry_schema.geometric_representation_context]] ==== geometric_representation_context A *geometric_representation_context* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_context[representation_context] in which <> s are geometrically founded. A *geometric_representation_context* is a distinct coordinate space, spatially unrelated to other coordinate spaces except as those coordinate spaces are specifically related by an appropriate transformation. (See 3.2 for definitions of geometrically founded and coordinate space.) [.underline]#EXPRESS specification:# [source] -- express_ref:[geometric_representation_context] -- [[geometry_schema.geometric_representation_item]] ==== geometric_representation_item A *geometric_representation_item* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] that has the additional meaning of having geometric position or orientation or both. This meaning is present by virtue of: * being a <> or a <> ; * referencing directly a <> or a <> ; * referencing indirectly a <> or a <> . [[note_1]] NOTE: An indirect reference to a <> or a <> means that a given *geometric_representation_item* references the <> or <> through one or more intervening attributes. In many cases this information is given in the form of an <> . [example] [[example_1]] Consider a circle. It gains its geometric position and orientation by virtue of a reference to an <> that in turn references a <> and several <> s. [example] [[example_2]] A <> is a *geometric_representation_item* that through several layers of <> s, references <> s, <> s and <> s. Through additional intervening entities curves and surfaces reference <> and <> . [[note_2]] NOTE: The intervening entities, which are all of type ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] , need not be of subtype *geometric_representation_item* . Consider the <> from the above example. One of the intervening levels of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] is a <> . This is a <> and does not require a <> in its own right. When used as part of the definition of a <> that itself is a *geometric_representation_item* , it is founded in a <> . [[note_3]] NOTE: A *geometric_representation_item* inherits the need to be related to a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_context[representation_context] in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] . The rule <> ensures that the ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_context[representation_context] is a <> . When in the context of geometry, this relationship causes the *geometric_representation_item* to be geometrically founded. [[note_4]] NOTE: As subtypes of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] there is an implicit and/or relationship between *geometric_representation_item* and <> . The only complex instances intended to be created are <> , <> , and <> [.underline]#EXPRESS specification:# [source] -- express_ref:[geometric_representation_item] -- [[geometry_schema.point]] ==== point A *point* is a type of <> and is a location in some real Cartesian coordinate space R ^_m_^ , for _m_ = 1 2 or 3. [.underline]#EXPRESS specification:# [source] -- express_ref:[point] -- [[geometry_schema.cartesian_point]] ==== cartesian_point A *cartesian_point* is a type of <> defined by its coordinates in a rectangular Cartesian coordinate system, or in a parameter space. The entity is defined in a one, two or three-dimensional space as determined by the number of coordinates in the list. [[note_1]] NOTE: For the purposes of defining geometry in this part of ISO 10303 only two or three-dimensional points are used. [[note_2]] NOTE: Depending upon the <> in which the point is used the names of the coordinates may be _(x,y,z)_ , or _(u,v),_ or any other chosen values. [.underline]#EXPRESS specification:# [source] -- express_ref:[cartesian_point] -- [[geometry_schema.cylindrical_point]] ==== cylindrical_point A *cylindrical_point* is a type of <> which uses a cylindrical polar coordinate system, centred at the origin of the corresponding Cartesian coordinate system, to define its location. [.underline]#EXPRESS specification:# [source] -- express_ref:[cylindrical_point] -- [[geometry_schema.spherical_point]] ==== spherical_point A *spherical_point* is a type of <> which uses a spherical polar coordinate system, centred at the origin of the corresponding Cartesian coordinate system, to define its location. [.underline]#EXPRESS specification:# [source] -- express_ref:[spherical_point] -- [[geometry_schema.polar_point]] ==== polar_point A *polar_point* is a type of <> which uses a two dimensional polar coordinate system, centred at the origin of the corresponding Cartesian coordinate system, to define its location. [.underline]#EXPRESS specification:# [source] -- express_ref:[polar_point] -- [[geometry_schema.point_on_curve]] ==== point_on_curve A *point_on_curve* is a type of <> which lies on a <> . The point is determined by evaluating the <> at a specific parameter value. The coordinate space dimensionality of the point is that of the *basis_curve* . [.underline]#EXPRESS specification:# [source] -- express_ref:[point_on_curve] -- [[geometry_schema.point_on_surface]] ==== point_on_surface A *point_on_surface* is a type of <> which lies on a <> . The point is determined by evaluating the <> at a specific pair of parameter values. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_on_surface] -- [[geometry_schema.point_in_volume]] ==== point_in_volume A *point_in_volume* is a type of <> which lies inside, or on the the surface of, a <> . The point is determined by evaluating the <> at the specified parameter values. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_in_volume] -- [[geometry_schema.point_replica]] ==== point_replica A *point_replica* is a type of <> that defines a replica of an existing point (the parent) in a different location. The replica has the same coordinate space dimensionality as the parent point. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_replica] -- [[geometry_schema.degenerate_pcurve]] ==== degenerate_pcurve A *degenerate_pcurve* is a type of <> that is defined as a parameter space curve, but in three-dimensional model space it collapses to a single point. It is thus a subtype of <> , not of <> . NOTE: For example, the apex of a cone could be represented as a *degenerate_pcurve* . [.underline]#EXPRESS specification:# [source] -- express_ref:[degenerate_pcurve] -- [[geometry_schema.evaluated_degenerate_pcurve]] ==== evaluated_degenerate_pcurve A *evaluated_degenerate_pcurve* is a type of <> which gives the result of evaluating the <> and associates it with the corresponding <> . NOTE: For example, the apex of a cone could be represented as a *evaluated_degenerate_pcurve* . [.underline]#EXPRESS specification:# [source] -- express_ref:[evaluated_degenerate_pcurve] -- [[geometry_schema.direction]] ==== direction A *direction* is a type of <> that defines a general direction vector in two or three dimensional space. The actual magnitudes of the components have no effect upon the direction being defined, only the ratios x:y:z or x:y, or, in parameter space u:v, are significant. [[note_1]] NOTE: The components of this entity are not normalised. If a unit vector is required it should be normalised before use. [.underline]#EXPRESS specification:# [source] -- express_ref:[direction] -- [[geometry_schema.vector]] ==== vector A *vector* is a type of <> that defines a vector in terms of the direction and the magnitude of the vector. NOTE: The magnitude of the vector must not be calculated from the components of the *orientation* attribute. This form of representation was selected to reduce problems with numerical instability. For example a vector of magnitude 2.0 mm and equally inclined to the coordinate axes could be represented with orientation attribute of (1.0,1.0,1.0) and magnitude attribute 2.0. [.underline]#EXPRESS specification:# [source] -- express_ref:[vector] -- [[geometry_schema.placement]] ==== placement A *placement* is a type of <> that locates a geometric item with respect to the coordinate system of its geometric context. It locates the item to be defined and, in the case of the axis placement subtypes, gives its orientation. [.underline]#EXPRESS specification:# [source] -- express_ref:[placement] -- [[geometry_schema.axis1_placement]] ==== axis1_placement A *axis1_placement* is a type of <> , that represents the direction and location in three-dimensional space of a single axis. An *axis1_placement* is defined in terms of a locating point (inherited from the placement supertype) and an axis direction; this is either the direction of *axis* or defaults to (0.0,0.0,1.0). The actual direction for the *axis1_placement* is given by the derived attribute *z* . [.underline]#EXPRESS specification:# [source] -- express_ref:[axis1_placement] -- [[geometry_schema.axis2_placement_2d]] ==== axis2_placement_2d A *axis2_placement_2d* is a type of <> that represents the location and orientation in two-dimensional space of two mutually perpendicular axes. An *axis2_placement_2d* is defined in terms of a point, (inherited from the placement supertype), and an axis. It can be used to locate and orientate an object in two-dimensional space and to define a placement coordinate system. The entity includes a point which forms the origin of the placement coordinate system. A direction vector is required to complete the definition of the placement coordinate system. The *ref_direction* defines the placement X axis direction; the placement Y axis direction is derived from this. [.underline]#EXPRESS specification:# [source] -- express_ref:[axis2_placement_2d] -- [[geometry_schema.axis2_placement_3d]] ==== axis2_placement_3d A *axis2_placement_3d* is a type of <> that represents the location and orientation in three-dimensional space of two mutually perpendicular axes. An *axis2_placement_3d* is defined in terms of a point, (inherited from the placement supertype), and two (ideally orthogonal) axes. It can be used to locate and orientate a non axi-symmetric object in space and to define a placement coordinate system. The entity includes a point which forms the origin of the placement coordinate system. Two direction vectors are required to complete the definition of the placement coordinate system. The *axis* is the placement Z axis direction and the *ref_direction* is an approximation to the placement X axis direction. NOTE: Let *z* be the placement Z axis direction and *a* be the approximate placement X axis direction. There are two methods, mathematically identical but numerically different, for calculating the placement X and Y axis directions. a) The vector *a* is projected onto the plane defined by the origin point *P* and the vector *z* to give the placement X axis direction as *x* = < *a - (a ⋅ z)z* >. The placement Y axis direction is then given by *y = < z × x * >. b) The placement Y axis direction is calculated as * y = < z × a >* and then the placement X axis direction is given by * x = < y \× z >* . The first method is likely to be the more numerically stable of the two, and is used here. A placement coordinate system referenced by the parametric equations is derived from the *axis2_placement_3d* data for conic curves and elementary surfaces. [.underline]#EXPRESS specification:# [source] -- express_ref:[axis2_placement_3d] -- [[geometry_schema.cartesian_transformation_operator]] ==== cartesian_transformation_operator A *cartesian_transformation_operator* is a type of <> and ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.functionally_defined_transformation[functionally_defined_transformation] , that defines a geometric transformation composed of translation, rotation, mirroring and uniform scaling. The list of normalised vectors *u* defines the columns of an orthogonal matrix *T* . These vectors are computed, by the <> function, from the direction attributes *axis1, axis2* and, in *cartesian_transformation_operator_3d, axis3* . If | *T* |= -1, the transformation includes mirroring. The local origin point *A* , the scale value _S_ and the matrix *T* together define a transformation. The transformation for a <> with position vector *P* is defined by * P → A + _S_ TP * The transformation for a <>   *d* is defined by *d → Td * The transformation for a <> with <>   *d* and <>  _k_ is defined by *d → Td * and _ k → Sk _ For those entities whose attributes include an <>, the transformation is applied, after the derivation, to the derived attributes *p* defining the placement coordinate directions. For a transformed <>, the direction of the surface normal at any point is obtained by transforming the normal, at the corresponding point, to the original <>. The parametrisation of the transformed surface is defined using the transformed value of *p* as defined above. For geometric entities with attributes (such as the radius of a circle) which have the dimensionality of length, the values will be multiplied by _S_. For transformations involving reflection or mirroring, with |*T*|= -1, the relationship between the sense of the boundary and the interior of a <>, or <> is affected. For a <> if *n* is the direction of the surface normal and *t* is the direction of the tangent vector at a point on the boundary after transformation, then the interior is in the direction |*T*|* n × t* For a <> or <>, if |*T*|= -1 the interior of the transformed face will lie to the right when traversing the bounding loops in the positive sense. For curves on surface the <> will be unaffected by any transformation. The *cartesian_transformation_operator* shall only be applied to geometry defined in a consistent system of units with the same units on each axis. With all optional attributes omitted, the transformation defaults to the identity transformation. The *cartesian_transformation_operator* shall only be instantiated as one of its subtypes. NOTE: See Figures 4a to 4c for demonstration of effect of transformation. [[figure4a]] .Cartesian_transformation_operator_3d image::Geomfig4a.gif[Cartesian_transformation_operator_3d] [[figure4b]] .Cartesian_transformation_operator_3d image::Geomfig4b.gif[Cartesian_transformation_operator_3d] [[figure4c]] .Cartesian_transformation_operator_3d image::Geomfig4c.gif[Cartesian_transformation_operator_3d] [.underline]#EXPRESS specification:# [source] -- express_ref:[cartesian_transformation_operator] -- [[geometry_schema.cartesian_transformation_operator_3d]] ==== cartesian_transformation_operator_3d A *cartesian_transformation_operator_3d* is a type of <>, that defines a geometric transformation in three-dimensional space composed of translation, rotation, mirroring and uniform scaling. The list of normalised vectors *u* defines the columns of an orthogonal matrix *T*. These vectors are computed from the direction attributes <>, <> and *axis3* by the <> function. If |*T*|= -1, the transformation includes mirroring. [.underline]#EXPRESS specification:# [source] -- express_ref:[cartesian_transformation_operator_3d] -- [[geometry_schema.cartesian_transformation_operator_2d]] ==== cartesian_transformation_operator_2d A *cartesian_transformation_operator_2d* is a type of <>, that defines a geometric transformation in two-dimensional space composed of translation, rotation, mirroring and uniform scaling. The list of normalised vectors *u* defines the columns of an orthogonal matrix *T*. These vectors are computed from the direction attributes <> and <> by the <> function. If |*T*|= -1, the transformation includes mirroring. [.underline]#EXPRESS specification:# [source] -- express_ref:[cartesian_transformation_operator_2d] -- [[geometry_schema.curve]] ==== curve A *curve* is a type of <>, that can be envisioned as the path of a point moving in its coordinate space. [.underline]#EXPRESS specification:# [source] -- express_ref:[curve] -- [[geometry_schema.line]] ==== line A *line* is a type of <>, that is an unbounded with constant tangent direction. A *line* is defined by a <> and a <>. The positive direction of the line is in the direction of the *dir* vector. The curve is parametrised as follows: stem:[* P = pnt *]stem:[* V = dir *]stem:[* λ*_(u)_ = *P* + _u_*V*] and the parametric range is -∞ < _u_ < ∞. [.underline]#EXPRESS specification:# [source] -- express_ref:[line] -- [[geometry_schema.conic]] ==== conic A *conic* is a type of <>, that is a planar curve which could be produced by intersecting a plane with a cone. A *conic* is defined in terms of its intrinsic geometric properties rather than being described in terms of other geometry. A *conic* entity always has a placement coordinate system defined by <>; the parametric representation is defined in terms of this placement coordinate system. [.underline]#EXPRESS specification:# [source] -- express_ref:[conic] -- [[geometry_schema.circle]] ==== circle A *circle* is a type of <>, section defined by a radius and the location and orientation of the *circle*. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[* z = position.p[3] *]stem:[ R = radius ] The circle is parametrised as follows: stem:[* λ*_(u)_ = *C* +R(cos(_u_)*x* + sin(_u_)*y*) ] and the parametric range is 0 ≤ _u_ ≤ 360 degrees, _u_ is an angular parameter and when a numerical value is specified it shall use the current units for plane_angle_measure. In the placement coordinate system defined above, the circle has the equation _* C * = 0,_ where stem:[_* C *(x, y, z) = x^2^ + y^2^ - R^2^_] The positive sense of the circle at any point is in the tangent direction, *T*, to the curve at the point, where stem:[*T =(-_C_*~y~,*_C_*~x~, 0). ] [[note_1]] NOTE: A circular arc is defined by using the <> entity in conjunction with the *circle* entity. [.underline]#EXPRESS specification:# [source] -- express_ref:[circle] -- [[geometry_schema.ellipse]] ==== ellipse An *ellipse* is a type of <>, section defined by the lengths of the semi-major and semi-minor diameters and the position (center or mid point of the line joining the foci) and orientation of the curve. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[* z = position.p[3] *]stem:[ R~1~ = *semi_axis_1*]stem:[ R~2~ = *semi_axis_2*] The *ellipse* is parametrised as follows: stem:[* λ*_(u)_ = *C* +R~1~(cos(_u_)*x*) + R~1~( sin(_u_)*y*) ] and the parametric range is 0 ≤ _u_ ≤ 360 degrees, _u_ is an angular parameter and when a numerical value is specified it shall use the current units for plane_angle_measure. In the placement coordinate system defined above, the *ellipse* has the equation _* C *_ = 0, where stem:[_* C *(x, y, z) = {x/(R~1~)}^2^ + {y/(R~2~)}^2^ - 1 _] The positive sense of the *ellipse* at any point is in the tangent direction, *T*, to the curve at the point, where stem:[*T =(-_C_*~y~, *_C_*~x~, 0). ] [.underline]#EXPRESS specification:# [source] -- express_ref:[ellipse] -- [[geometry_schema.hyperbola]] ==== hyperbola An *hyperbola* is a type of <>, section defined by the lengths of the major and minor radii and the position (mid-point of the line joining two foci) and orientation of the curve. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[* z = position.p[3] *]stem:[ R~1~ = *semi_axis*]stem:[ R~2~ = *semi_imag_axis*] The hyperbola is parametrised as follows: stem:[* λ*_(u)_ = *C* +R~1~(cosh(_u_)*)x* + R~2~( sinh(_u_))*y*] The parametrisation range is -∞ < _(u)_ < ∞ In the placement coordinate system defined above, the hyperbola has the equation _* C *_ = 0, where stem:[_* C *(x, y, z) = (x/R~1~)^2^ - (y/R~2~)^2^ - 1 _] The positive sense of the hyperbola at any point is in the tangent direction, *T*, to the curve at the point, where stem:[*T =(-_C_*~y~, *_C_*~x~, 0). ] The branch of the hyperbola represented is that pointed to by the *x* direction. [.underline]#EXPRESS specification:# [source] -- express_ref:[hyperbola] -- [[geometry_schema.parabola]] ==== parabola A *parabola* is a type of <>, section defined by its focal length, position (apex), and orientation. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[* z = position.p[3] *]stem:[ F = *focal_dist*] The parabola is parametrised as follows: stem:[* λ*_(u)_ = *C* + F(_u^2^_*x* + 2_u_*y*) ] The parametrisation range is -∞ < _(u)_ < ∞ In the placement coordinate system defined above, the parabola has the equation _* C *_ = 0, where stem:[_* C *(x, y, z) = 4Fx - y^2^_] The positive sense of the parabola at any point is in the tangent direction, *T*, to the curve at the point, where stem:[*T =(-_C_*~y~, *_C_*~x~, 0). ] [.underline]#EXPRESS specification:# [source] -- express_ref:[parabola] -- [[geometry_schema.clothoid]] ==== clothoid A *clothoid* is a type of <>, and is a planar curve in the form of a spiral. This curve has the property that the curvature varies linearly with the arc length. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[ C = *clothoid_constant*] The clothoid is parametrised as follows: stem:[* λ*_(u)_ = *C* + A√{π}(∫~0~^_u_^cos(π(_t^2^/2))dt_*x* + ∫~0~^_u_^sin(π(_t^2^/2))dt_*y*] The parametrisation range is -∞ < _ u _ < ∞ The arc length _s_ of the curve, from the point *C*, is given by the formula: s = A _u_√π. The curvature κ and radius of curvature ρ, at any point of the curve, are related to the arc length by the formulae: stem:[ρ = _s/(A^2^) _,   ρ = 1/κ. ] [[note_1]] NOTE: A more detailed description of the clothoid curve can be found in GIBSON[8]. [.underline]#EXPRESS specification:# [source] -- express_ref:[clothoid] -- [[geometry_schema.circular_involute]] ==== circular_involute A *circular_involute* is a type of <>, and is the involute of a circle. The involute of a planar curve is the locus of the end point of a thread as it is wound round the curve. If *P~0~* is the point where the involute meets the circle the distance from any point *P* on the involute to the tangential contact point *T* on the circle is equal to the arc length from *P~0~* to *T*. The *circular_involute* has a cusp at the point *P~0~* (_u = 0_), and forms a double spiral enclosing the base circle. [[note_1]] NOTE: See GIBSON[9] for further properties of involute curves. Interpretation of the data shall be as follows: stem:[* C = position.location* (centre) ]stem:[*x = position.p[1] *]stem:[*y = position.p[2] *]stem:[_r_ = *base_radius*] The *circular_involute* is parametrised as follows: stem:[* λ*_(u)_ = *C* + _r_( cos(_u) + u_sin(_u_))*x* + _r_( sin(_u) - u_cos(_u_))*y*] The parameter _u_ is measured in radians and parametrisation range is -∞ < _(u)_ < ∞ The arc length _s_ of the curve, from the point _u = 0 _, is given by the formula: s =(1/2) r _u^2^_ At any point on the involute the distance *PC* from a point *P* on the curve with parameter _u_ to the centre point *C* satisfies the equation: stem:[*(PC)*^2^ = _r^2^(1 + u^2^)_] [[note_2]] NOTE: See figure 10 for the interpretation of the attributes. This figure shows a portion of the curve for parameter values between -1.5 and +1.5. [.underline]#EXPRESS specification:# [source] -- express_ref:[circular_involute] -- [[geometry_schema.bounded_curve]] ==== bounded_curve A *bounded_curve* is a type of <> of finite arc length with identifiable end points. NOTE: A *bounded_curve* is not included in the ONEOF list for curve and, as such, has an implicit and/or relationship with other subtypes of curve. The only complex instances intended to be created are <> and <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[bounded_curve] -- [[geometry_schema.polyline]] ==== polyline A *polyline* is a type of <> with _(n-1)_ linear segments, defined by a list of _n _<> s, * P~1~, P~2~, ..... , P~n~. * The _i_th segment of the curve is parametrised as follows: stem:[* λ*_(u)_ = *P*_~i~(i-u)_ + *P*_~i+1~(u+1-i)_,     for _ 1 ≤ i ≤ n-1 _] where _i-1 ≤ u ≤ i_ and with parametric range of 0 ≤ _u ≤ n-1_. [.underline]#EXPRESS specification:# [source] -- express_ref:[polyline] -- [[geometry_schema.b_spline_curve]] ==== b_spline_curve A *b_spline_curve* is a type of <>, it is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions. The B-spline curve has been selected as the most stable format to represent all types of polynomial or rational parametric curves. With appropriate attribute values it is capable of representing single span or spline curves of explicit polynomial, rational, Bézier or B-spline type. The *b_spline_curve* has three special subtypes where the knots and knot multiplicities can be derived to provide simple default capabilities. [[note_1]] NOTE: Identification of B-spline curve default values and subtypes is important for performance considerations and for efficiency issues in performing computations. [[note_2]] NOTE: A B-spline is _rational_ if and only if the weights are not all identical; this can be represented by the *rational_b_spline_curve* subtype. If it is polynomial, the weights may be defaulted to all being 1. [[note_3]] NOTE: In the case where the B-spline curve is uniform, quasi-uniform or Bézier (including piecewise Bézier), the knots and knot multiplicities may be defaulted (i.e., non-existent in the data as specified by the attribute definitions). [[note_4]] NOTE: When the knots are defaulted, a difference of 1.0 between separate knots is assumed, and the effective parameter range for the resulting curve starts from 0.0. These defaults are provided by the subtypes. [[note_5]] NOTE: The knots and knot multiplicities shall not be defaulted in the non-uniform case. [[note_6]] NOTE: The defaulting of weights and knots are done independently of one another. [[note_7]] NOTE: Definitions of the B-spline basis functions _ N~i~^d,^(u)_ can be found in [5], [8], [11] and [12]. It should be noted that there is a difference in terminology between these references. Interpretation of the data shall be as follows: a) The curve, in the polynomial case, is given by: BScrv1.gif b) In the rational case all weights shall be positive and the curve is given by: BScrv2.gif where stem:[_ k+1 = _ number of control points ]stem:[*P *~_i_~ = control points]stem:[_w~i~_ = weights, and ]stem:[_ d = _ degree. ] The knot array is an array of _(k + d + 2)_ real numbers _[u~-d~,.. ,u~k+1~]_, such that for all indices _j_ in _[-d, k], u~j~ ≤ u~j+1~_. This array is obtained from the *knots* list by repeating each multiple knot according to the multiplicity. _N~i~^d^_, the _i_th normalised B-spline basis function of degree _d_, is defined on the subset _[u~i-d~, ... ,u~i+1~]_ of this array. c) Let _L_ denote the number of distinct values amongst the _d + k +2_ knots in the knot list; _L_ will be referred to as the `upper index on knots'. Let _m~j~_ denote the multiplicity (i.e., number of repetitions) of the _j_th distinct knot. Then: stem:[_ Σ^L^~i=1~ m~i~ = d + k + 2. _] All knot multiplicities except the first and the last shall be in the range _1, . . . , d_; the first and last may have a maximum value of _d + 1_. [[note_8]] NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity _3_ is interpreted as a sequence _u, u, u,_ in the knot array. The *b_spline_curve* has three special subtypes where the knots and knot multiplicities are derived to provide simple default capabilities. [[note_9]] NOTE: See Figure 11 for further information on curve definition. [[figure11]] .B_spline_curve image::Geomfig11.gif[B_spline_curve] [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_curve] -- [[geometry_schema.b_spline_curve_with_knots]] ==== b_spline_curve_with_knots A *b_spline_curve_with_knots* is a type of <>, for which the knot values are explicitly given. This subtype shall be used to represent non-uniform B-spline curves and may be used for other knot types. Let _L_ denote the number of distinct values amongst the _d + k +2_ knots in the knot list; _L_ will be referred to as the `upper index on knots'. Let _m~j~_ denote the multiplicity (i.e., number of repetitions) of the _j_th distinct knot. Then: Σ_~i=1~^L^ m~i~ = d + k + 2._ All knot multiplicities except the first and the last shall be in the range _1, . . ., d_; the first and last may have a maximum value of _d + 1_. [[note_1]] NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity _3_ is interpreted as a sequence _u, u, u,_ in the knot array. [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_curve_with_knots] -- [[geometry_schema.uniform_curve]] ==== uniform_curve A *uniform_curve* is a type of <>, in which the knots are evenly spaced. Suitable default values for the knots and knot multiplicities are derived in this case. A B-spline is _uniform_ if and only if all knots are of multiplicity 1 and they differ by a positive constant from the preceding knot. In this subtype the knot spacing is 1.0, starting at _-d_, where _d_ is the degree. [[note_1]] NOTE: If the B-spline curve is uniform and degree = 1, the B-spline is equivalent to a <> [[note_2]] NOTE: The value k_up may be required for the upper index on the knot and knot multiplicity lists. This is computed from the degree and the number of control points. k_up = SELF\b_spline_curve.upper_index_on_control_points + degree + 2. If required, the knots and knot multiplicities can be computed by the function calls: <>(SELF\b_spline_curve.degree, k_up,uniform_knots), <>(SELF\b_spline_curve.degree,k_up, uniform_knots). [.underline]#EXPRESS specification:# [source] -- express_ref:[uniform_curve] -- [[geometry_schema.quasi_uniform_curve]] ==== quasi_uniform_curve A *quasi_uniform_curve* is a type of <>, in which the knots are evenly spaced, and except for the first and last, have multiplicity 1. Suitable default values for the knots and knot multiplicities are derived in this case. A B-spline is _quasi-uniform_ if and only if the knots are of multiplicity (degree+1) at the ends, of multiplicity 1 elsewhere, and they differ by a positive constant from the preceding knot. A quasi-uniform B-spline curve which has only two knots represents a Bézier curve. In this subtype the knot spacing is 1.0, starting at 0.0. NOTE: The value k_up may be required for the upper index on the knot and knot multiplicity lists. This is computed from the degree and the number of control points. k_up = SELF\b_spline_curve.upper_index_on_control_points + degree + 2. If required, the knots and knot multiplicities can be computed by the function calls: <> (SELF\b_spline_curve.degree, k_up,quasi_uniform_knots), <> (SELF\b_spline_curve.degree,k_up, quasi_uniform_knots). [.underline]#EXPRESS specification:# [source] -- express_ref:[quasi_uniform_curve] -- [[geometry_schema.bezier_curve]] ==== bezier_curve A *bezier_curve* is a type of <>, that represents in the most general case a piecewise Bézier curve. This is a special type of curve which can be represented as a type of <> in which the knots are evenly spaced and have high multiplicities. Suitable default values for the knots and knot multiplicities are derived in this case. A B-spline curve is a piecewise Bézier curve if it is quasi-uniform except that the interior knots have multiplicity <> rather than having multiplicity one. In this subtype the knot spacing is 1.0, starting at 0.0. A piecewise Bézier curve which has only two knots, 0.0 and 1.0, each of multiplicity (degree+1), is a simple Bézier curve. [[note_1]] NOTE: A simple Bézier curve can be defined as a B-spline curve with knots by the following data: degree = (_d_) upper index on control points (equal to _d_) control points (_d + 1_ cartesian points) knot type (equal to quasi-uniform knots) knot multiplicities = (_d+1, d+1_) knots = (0.0, 1.0) No other data are needed, except for a rational Bézier curve. In this case the weights data ((_d + 1_) REALs) shall be given. [[note_2]] NOTE: It should be noted that every piecewise Bézier curve has an equivalent representation as a B-spline curve. Because of problems with non-uniform knots not every B-spline curve can be represented as a piecewise Bézier curve., To define a piecewise Bézier curve as a B-spline: The first knot is 0.0 with multiplicity (_d + 1_). The next knot is 1.0 with multiplicity _d_ (the knots for one segment are now defined, unless it is the last one). The next knot is 2.0 with multiplicity _d_ (the knots for two segments are now defined, unless the second is the last one). Continue to the end of the last segment, call it the _n_-th segment, at the end of which a knot with value _n_, multiplicity (_d + 1_) is added. [example] [[example_1]] A one-segment cubic Bézier curve would have knot sequence (0,1) with multiplicity sequence (4,4). [example] [[example_2]] A two-segment cubic piecewise Bézier curve would have knot sequence (0,1,2) with multiplicity sequence (4,3,4). [[note_3]] NOTE: For the piecewise Bézier case, if _d_ is the degree, _k+1_ is the number of control points, _m_ is the number of knots with multiplicity _d_, and _N_ is the total number of knots for the spline, then _ (d + 2 + k) = N = (d + 1) + md + (d + 1) _ thus,_ m = (k - d)/d _ Thus, the knot sequence is _(0, 1, ..., m, (m+1))_ with multiplicities _(d+1, d,. . ., d, d+1)_. [[note_3]] NOTE: The value k_up may be required for the upper index on the knot and knot multiplicity lists. This is computed from the degree and the number of control points. k_up = (SELF\backslash b_spline_curve.upper_index_on_control_points)/(SELF\backslash b_spline_curve.degree + 1) If required, the knots and knot multiplicities can be computed by the function calls: <>(SELF\b_spline_curve.degree, k_up, piecewise_bezier_knots), <>(SELF\b_spline_curve.degree,k_up, piecewise_bezier_knots). [.underline]#EXPRESS specification:# [source] -- express_ref:[bezier_curve] -- [[geometry_schema.rational_b_spline_curve]] ==== rational_b_spline_curve A *rational_b_spline_curve* is a type of <>, that is a piecewise parametric rational curve described in terms of control points and basis functions. This subtype is instantiated with one of the other subtypes of *b_spline_curve* which explicitly or implicitly provide the knot values used to define the basis functions. All weights shall be positive and the curve is given by: BScrv2.gif [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_b_spline_curve] -- [[geometry_schema.local_b_spline]] ==== local_b_spline A *local_b_spline* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] that is polynomial B-spline of degree d in one parameter defined over a list of knot values with associated multiplicities. The knot list is a list of distinct strictly increasing real values, the list of multiplicities defines the multiplicity of each knot. To ensure that all related *local_b_spline* functions refer to the same knot list the explicit knot list is defined with the entities, such as <> , which use *local_b_spline* functions. Let _ m ~j~_ denote the multiplicity (i.e. the number of repetitions) of the distinct knot number _j_ , and L denote the size of the knot list. Then [[figure12]] .local_b_spline equation image::local_b_spline_eqn.png[local_b_spline equation] All knot multiplicities except the first and the last shall be in the range 1,..., _d_ ; the first and last may have a maximum value of _d+1_ . The continuity of local B-spline at knot _j_ in the current parameter direction is _ d-m ~j~_ . [.underline]#EXPRESS specification:# [source] -- express_ref:[local_b_spline] -- [[geometry_schema.locally_refined_spline_curve]] ==== locally_refined_spline_curve A *locally_refined_spline_curve* is a type of <> that is a piecewise parametric polynomial or rational curve described in terms of control points and local B-spline functions. If the set of B-spline functions are linearly independent, they will form a basis. With appropriate attribute values, the curve is capable of representing single span or spline curves of explicit polynomial, rational, Bézier or B-spline type. Furthermore, the degree of the curve can vary as the B-splines from which it is defined, need not to have the same polynomial degree. [[note_1]] NOTE: A locally refined spline curve is rational if and only if the weights are not all identical; this can be represented by the <> subtype. If it is polynomial, the weights may be defaulted to all being 1. Interpretation of the data is as follows: The curve, in the polynomial case, is given by: LRcurve.gif In the rational case all weights shall be positive and the curve is given by: RationalLRcurve.gif where stem:[*K* = number of control points, ]stem:[*P*~_i_~ = control points,]stem:[_s~i~_= scaling_factors(_i_),]stem:[_w~i~_ = weights_data(_i_),]stem:[N~_i_~ = local B-splines, and]stem:[di=degree. ] [[note_2]] NOTE: the degree is associated with the local B-spline and does not need to be constant throughout the curve. The knot values are defined in the <> type, and the knot multiplicity is defined in the entity <>. [[note_3]] NOTE: When the polynomial degree is the same for all B-splines and no knot lines exist that do not cross the entire parameter domain, the *locally_refined_spline_curve* will coincide with <>. In that case <> has the simplest and most compact representation. [[note_4]] NOTE: A *locally_refined_spline_curve* can be of type analysis suitable T-spline, hierarchical B-spline, LR-spline, semi standard T-spline or standard T-spline. The type is given by the enumeration <>, and the packing and unpacking of the curve will depend on this type. [.underline]#EXPRESS specification:# [source] -- express_ref:[locally_refined_spline_curve] -- [[geometry_schema.rational_locally_refined_spline_curve]] ==== rational_locally_refined_spline_curve A *rational_locally_refined_spline_curve* is a type of <> that is a piecewise parametric rational curve described in terms of control points and local B-spline functions. [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_locally_refined_spline_curve] -- [[geometry_schema.trimmed_curve]] ==== trimmed_curve A *trimmed_curve* is a type of <>, which is created by taking a selected portion, between two identified points, of the associated basis curve. The basis curve itself is unaltered and more than one trimmed curve may reference the same basis curve. Trimming points for the curve may be identified: by parametric value; by geometric position; by both of the above. At least one of these shall be specified at each end of the curve. The *sense* makes it possible to unambiguously define any segment of a closed curve such as a circle. The combinations of sense and ordered end points make it possible to define four distinct directed segments connecting two different points on a circle or other closed curve. For this purpose cyclic properties of the parameter range are assumed; for example, 370 degrees is equivalent to 10 degrees. The trimmed curve has a parametrisation which is inherited from that of the particular basis curve referenced. More precisely the parameter _s_ of the trimmed curve is derived from the parameter _t_ of the basis curve as follows: If sense is TRUE: _ s = t - t~1~._ If sense is FALSE: _ s = t~1~ - t._ In the above equations _t~1~_ is the value given by *trim_1* or the parameter value corresponding to *point_1* and _t~2~_ is the parameter value given by *trim_2* or the parameter corresponding to *point_2*. The resultant trimmed curve has a parameter _s_ ranging from 0 at the first trimming point to _|t~2~ - t~1~|_ at the second trimming point. [[note_1]] NOTE: In the case of a closed basis curve, it may be necessary to increment _~1~_ or _~2~_ by the parametric length for consistency with the sense flag. [[note_2]] NOTE: For example: (a) If *sense_agreement* = TRUE and _t~2~ < t~1~, t~2~_ should be increased by the parametric length. (b) If *sense_agreement* = FALSE and _t~1~ > t~2~ , t~1~_ should be increased by the parametric length. [.underline]#EXPRESS specification:# [source] -- express_ref:[trimmed_curve] -- [[geometry_schema.composite_curve]] ==== composite_curve A *composite_curve* is a type of <>, that is a collection of curves joined end-to-end. The individual segments of the curve are themselves defined as <>s. The parametrisation of the composite curve is an accumulation of the parametric ranges of the referenced bounded curves. The first segment is parametrised from 0 to _l~1~_, and, for _i ≥ 2_, the _i_ th segment is parametrised from CompC1.gif where _l~k~_ is the parametric length (i.e., difference between maximum and minimum parameter values) of the curve underlying the _k_ th segment. Let _T_ denote the parameter for the *composite_curve*. Then, if the _i_th segment is not a *reparametrised_composite_curve_segment*, _T_ is related to the parameter _t~1~, t~i0~, ≤ t~1~, ≤ t~i1~_ for the _i_th segment by the equation: CompC2a.gif if *segments[i].same_sense* = TRUE; or by the equation: CompC2b.gif if *segments[i].same_sense* = FALSE. If *segments[i]* is of type *reparametrised_composite_curve_segment*, stem:[_ T = Σ~k=1~^i-1^ l~k~ + τ _] Where _τ_ is defined in <>. NOTE: See Figure 13 for further information on curve definition and attributes. [[figure13]] .Composite_curve image::Geomfig12.gif[Composite_curve] [.underline]#EXPRESS specification:# [source] -- express_ref:[composite_curve] -- [[geometry_schema.composite_curve_segment]] ==== composite_curve_segment A *composite_curve_segment* is a type of <>, and is a bounded curve together with transition information which is used to construct a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[composite_curve_segment] -- [[geometry_schema.reparametrised_composite_curve_segment]] ==== reparametrised_composite_curve_segment A *reparametrised_composite_curve_segment* is a type of <>, which provides the capability to re-define its parametric length without changing its geometry. Let _l_ = *param_length*. If _ t~0~ ≤ t ≤ t~1~_ is the parameter range of <>, the new parameter _τ_ for the *reparametrised_composite_curve_segment* is given by the equation: stem:[_ τ =(t - t~0~)l/(t~1~ - t~0~), _ if <> = TRUE; ] or by the equation: stem:[_ τ= (t~1~ - t)l/(t~1~ - t~0~), _ if <> = FALSE. ] [.underline]#EXPRESS specification:# [source] -- express_ref:[reparametrised_composite_curve_segment] -- [[geometry_schema.pcurve]] ==== pcurve A *pcurve* is a type of <>, that is a 3D curve defined by means of a 2D curve in the parameter space of a surface. If the curve is parametrised by the function _(u,v) = f(t)_, and the surface is parametrised by the function _(x,y,z) = g(u,v)_, the *pcurve* is parametrised by the function _(x,y,z) = g(f(t))_. A *pcurve* definition contains a reference to its *basis_surface* and an indirect reference to a 2D curve through a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.definitional_representation[definitional_representation] entity. The 2D curve, being in parameter space, is not in the context of the basis surface. Thus a direct reference is not possible. For the 2D curve the variables involved are _u_ and _v_, which occur in the parametric representation of the *basis_surface* rather than _x,y_ Cartesian coordinates. The curve is only defined within the parametric range of the surface. [.underline]#EXPRESS specification:# [source] -- express_ref:[pcurve] -- [[geometry_schema.bounded_pcurve]] ==== bounded_pcurve A *bounded_pcurve* is a type of <>, which also has the properties of a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[bounded_pcurve] -- [[geometry_schema.surface_curve]] ==== surface_curve A *surface_curve* is a type of <>, that is a curve on a surface. The curve is represented as a curve (*curve_3d*) in three-dimensional space and possibly as a curve, corresponding to a <>, in the two-dimensional parametric space of a surface. The ability of this curve to reference a list of 1 or 2 <>s enables this entity to define either a curve on a single surface, or an intersection curve which has two distinct surface associations. A `seam' on a closed surface can also be represented by this entity; in this case each *associated_geometry* will be a pcurve lying on the same surface. Each <>, if it exists, shall be parametrised to have the same sense as *curve_3d*. The *surface_curve* takes its parametrisation directly from either *curve_3d* or <> as indicated by the attribute master representation. [[note_1]] NOTE: Because of the ANDOR relationship with the *bounded_surface_curve* subtype an instance of a *surface_curve* may be any one of the following: * a *surface_curve;* * a <>; * an <>; * an <> AND <>; * a <>; * a <> AND <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_curve] -- [[geometry_schema.intersection_curve]] ==== intersection_curve A *intersection_curve* is a type of <>, which results from the intersection of two surfaces. It is represented as a special subtype of the <> entity having two distinct surface associations defined via the associated geometry list. [.underline]#EXPRESS specification:# [source] -- express_ref:[intersection_curve] -- [[geometry_schema.seam_curve]] ==== seam_curve A *seam_curve* is a type of <>, that is a curve on a closed parametric surface which has two distinct representations as constant parameter curves at the two extremes of the parameter range for the surface. [example] The `seam' on a cylinder has representations as the lines _u = 0_ or _ u = 360_ degrees in parameter space. [.underline]#EXPRESS specification:# [source] -- express_ref:[seam_curve] -- [[geometry_schema.bounded_surface_curve]] ==== bounded_surface_curve A *bounded_surface_curve* is a type of <>, which also has the properties of a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[bounded_surface_curve] -- [[geometry_schema.composite_curve_on_surface]] ==== composite_curve_on_surface A *composite_curve_on_surface* is a type of <>, that is a collection of segments which are curves on a surface. Each segment shall lie on the basis surface, and shall reference a <>, or a <>, or a <>. NOTE: A <> can be included as the <> attribute of a <> since it is a bounded curve subtype. There shall be at least positional continuity between adjacent segments. The parametrisation of the composite curve is obtained from the accumulation of the parametric ranges of the segments. The first segment is parametrised from 0 to _l~1~_, and, for _i ≥ 2_, the _i_ th segment is parametrised from stem:[_ Σ~k=1~^i-1^ l~k~_ to _ Σ^i^~k=1~ l~k~ , _] where _l~k~_ is the parametric length (i.e., difference between maximum and minimum parameter values) of the _k^th_ curve segment. [.underline]#EXPRESS specification:# [source] -- express_ref:[composite_curve_on_surface] -- [[geometry_schema.offset_curve_2d]] ==== offset_curve_2d A *offset_curve_2d* is a type of <>, at a constant distance from a basis curve in two-dimensional space. This entity defines a simple plane-offset curve by offsetting by *distance* along the normal to *basis_curve* in the plane of *basis_curve*. The underlying curve shall have a well-defined tangent direction at every point. In the case of a composite curve, the transition code between each segment shall be *cont_same_gradient* or *cont_same_gradient_same_curvature*. NOTE: The *offset_curve_2d* may differ in nature from the *basis_curve*; the offset of a non self-intersecting curve can be self-intersecting. Care should be taken to ensure that the offset to a continuous curve does not become discontinuous. The *offset_curve_2d* takes its parametrisation from the *basis_curve*. The *offset_curve_2d* is parametrised as stem:[_*λ*(u) = *C*(u) + d_(*orthogonal_complement(t*)), ] where *t* is the unit tangent vector to the basis curve _*C*(u)_ at parameter value _u_, and _d_ is *distance*. The underlying curve shall be two-dimensional., [.underline]#EXPRESS specification:# [source] -- express_ref:[offset_curve_2d] -- [[geometry_schema.offset_curve_3d]] ==== offset_curve_3d A *offset_curve_3d* is a type of <>, at a constant distance from a basis curve in three-dimensional space. The underlying curve shall have a well-defined tangent direction at every point. In the case of a composite curve the transition code between each segment shall be *cont_same_gradient* or *cont_same_gradient_same_curvature*. The offset curve at any point (parameter) on the basis curve is in the direction _< * v × t >*_ where _*v*_ is the fixed reference direction and _*t*_ is the unit tangent to the *basis_curve*. For the offset direction to be well defined, _*t*_ shall not at any point of the curve be in the same, or opposite, direction as _*v*_. NOTE: The *offset_curve_3d* may differ in nature from the *basis_curve*; the offset of a non-self-intersecting curve can be self-intersecting. Care should be taken to ensure that the offset to a continuous curve does not become discontinuous. The *offset_curve_3d* takes its parametrisation from the *basis_curve*. The *offset_curve_3d* is parametrised as stem:[_*λ*(u) = *C*(u) + d <* v × t >*_), ] where *t* is the unit tangent vector to the basis curve _*C*(u)_ at parameter value _u_, and _d_ is *distance*. [.underline]#EXPRESS specification:# [source] -- express_ref:[offset_curve_3d] -- [[geometry_schema.curve_replica]] ==== curve_replica A *curve_replica* is a type of <>, and is a replica of a curve in a different location. It is defined by referencing the parent curve and a transformation. The geometric form of the curve produced will be the same as the parent curve, but, where the transformation includes scaling, the dimensions will differ. The curve replica takes its parametric range and parametrisation directly from the parent curve. Where the parent curve is a curve on surface, the replica will not in general share the property of lying on the surface. [.underline]#EXPRESS specification:# [source] -- express_ref:[curve_replica] -- [[geometry_schema.surface]] ==== surface A *surface* is a type of <>, that can be envisioned as a set of connected points in 3-dimensional space which is always locally 2-dimensional, but need not be a manifold. A surface shall not be a single point or in part, or entirely, a curve. Each surface has a parametric representation of the form stem:[_*σ*(u,v), _] where _u_ and _v_ are independent dimensionless parameters. The unit normal * N*, at any point on the surface, is given by the equation stem:[*N*_(u,v) = < ∂*σ/*∂ u × ∂ *σ* /∂ u > _] [.underline]#EXPRESS specification:# [source] -- express_ref:[surface] -- [[geometry_schema.elementary_surface]] ==== elementary_surface A *elementary_surface* is a type of <>, that is a simple analytic surface with defined parametric representation. [.underline]#EXPRESS specification:# [source] -- express_ref:[elementary_surface] -- [[geometry_schema.plane]] ==== plane A *plane* is a type of <>, that is an unbounded surface with a constant normal. A *plane* is defined by a point on the plane and the normal direction to the plane. The data is to be interpreted as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (normal to plane) ] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + _u_*x* + _v_*y*] where the parametrisation range is _-∞ < u, v < ∞_. In the above parametrisation, the length unit for the unit vectors *x* and *y* is derived from the context of the *plane*. [.underline]#EXPRESS specification:# [source] -- express_ref:[plane] -- [[geometry_schema.cylindrical_surface]] ==== cylindrical_surface A *cylindrical_surface* is a type of <>, that is a surface at a constant distance (the *radius*)from a straight line. A *cylindrical_surface* is defined by its radius and its orientation and location. The data is to be interpreted as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of cylindrical_surface) ]stem:[_ R _ = *radius*] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + _R_((cos u)*x* + (sin _u_)*y*) + _v_*z*] where the parametrisation range is _0 ≤ u ≤ 360_ degrees and _-∞ < v < ∞_. In the above parametrisation the length unit for the unit vector _*z*_ is equal to that of the *radius*. _u_ is an angular parameter and when a numerical value is specified it shall use the current units for ../../../resource_docs/fundamentals_of_product_description_and_support/sys/19_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure]. In the placement coordinate system defined above, the surface is represented by the equation _ S = 0_, where stem:[_ S(x, y, z) = x^2^ + y^2^ - R^2^_] The positive direction of the normal to the surface at any point on the surface is given by: stem:[_ ( S~x~, S~y~, S~z~ ). _] The unit normal is given by stem:[*N*_(u,v)_ = (cos_(u)_)*x* + (sin _(u)_)*y*. ] The sense of this normal is away from the axis of the cylinder. [.underline]#EXPRESS specification:# [source] -- express_ref:[cylindrical_surface] -- [[geometry_schema.conical_surface]] ==== conical_surface _Warning Ent4: geometry_schema.conical_surface. There should be at least one bold text or express_ref in the entity description that contains the entity name. _ A *conical_surface* is a type of <>, which could be produced by revolving a line in 3-dimensional space about any intersecting line. A *conical_surface* is defined by the semi-angle, the location and orientation and by the radius of the cone in the plane passing through the location point *C* normal to the cone axis. [[note_1]] NOTE: This form of representation is designed to provide the greatest geometric precision for those parts of the surface which are close to the location point *C*. For this reason the apex should only be selected as location point if the region of the surface close to the apex is of interest. The data is to be interpreted as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of conical_surface) ]stem:[_ R _ = *radius*]stem:[_ α _ = *radius*] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + _(R + v _tan_ α)((_cos_ u)_*x* + (sin u)*y*) + v*z*] where the parametrisation range is _0 ≤ u ≤ 360_ degrees and _-∞ < v < ∞_. In the above parametrisation the length unit for the unit vector _*z*_ is equal to that of the *radius*. _u_ is an angular parameter and when a numerical value is specified it shall use the current units for ../../../resource_docs/fundamentals_of_product_description_and_support/sys/19_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure]. In the placement coordinate system defined above, the surface is represented by the equation _ S_ = 0, where stem:[_* S*(x, y, z) = x^2^ + y^2^ - (R + z_tan α)^2^] The positive direction of the normal to the surface at any point on the surface is given by stem:[_ ( S~x~, S~y~, S~z~ ). _] The unit normal is given by stem:[*N*_(u,v)_ = ((cos _u_)*x* + (sin _u_)*y* - (tan α)*z*)/( (√(1 + (tan α)^2^)), if _ R + v _tan α > 0.0 ]stem:[*N*(u,v) = - ((cos _u_)*x* + (\sin _u_)*y* - (tan α)*z*)/ (√(1 + (tan α)^2^)), if _ R + v _tan α < 0.0. ] [[note_2]] NOTE: The normal to the surface is undefined at the point where _ R + v _tan α = 0.0. The sense of the normal is away from the axis of the cone. If the radius is zero, the cone apex is at the point _(0, 0, 0)_ in the placement coordinate system (i.e., at *SELF\elementary_surface.position.location*). [[figure14]] .Conical_surface image::Geomfig13.gif[Conical_surface] [.underline]#EXPRESS specification:# [source] -- express_ref:[conical_surface] -- [[geometry_schema.spherical_surface]] ==== spherical_surface A *spherical_surface* is a type of <>, which is at a constant distance (the *radius*) from a central point. A *spherical_surface* is defined by the radius and the location and orientation of the surface. The data is to be interpreted as follows: *C = position.location * *stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of spherical_surface) ]stem:[_ R _ = *radius*] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + R cos _v_ ((cos _u_) *x* + (sin _u_) *y*) + R(sin _v_) *z*] where the parametrisation range is _0 ≤ u ≤ 360_ degrees and _-90 ≤ v ≤ 90_ degrees. _u_ and _v_ are angular parameters and when numerical values are specified they shall use the current units for *plane_angle_measure.* In the placement coordinate system defined above, the surface is represented by the equation _S_ = 0, where stem:[_ S(x, y, z) = x^2^ + y^2^ + z^2^ - R^2^. _] The positive direction of the normal to the surface at any point on the surface is given by stem:[_ ( S~x~, S~y~, S~z~ ). _] The unit normal is given by stem:[*N*_(u,v)_ = cos _v_((cos _u_)*x* + (sin _u_)*y*) + (sin _v_)*z*, ] [.underline]#EXPRESS specification:# [source] -- express_ref:[spherical_surface] -- [[geometry_schema.toroidal_surface]] ==== toroidal_surface A *toroidal_surface* is a type of <>, which could be produced by revolving a circle about a line in its plane. The radius of the circle being revolved is referred to here as the *minor_radius* and the *major_radius* is the distance from the centre of this circle to the axis of revolution. A *toroidal_surface* is defined by the major and minor radii and the position and orientation of the surface. The data is to be interpreted as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of toroidal_surface) ]stem:[_ R _ = *major_radius*]stem:[_ r _ = *minor_radius*] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + _(R + r_cos _v_)((cos_u_)*x* + (sin _u_))*y*) + _r_(sin_v_))*z*] where the parametrisation range is _0 ≤ u, v ≤ 360_ degrees. _u_ and _v_ are angular parameters and when numerical values are specified they shall use the current units for *plane_angle_measure.* In the placement coordinate system defined above, the surface is represented by the equation _S_ = 0, where stem:[_ S(x, y, z) = x^2^ + y^2^ + z^2^ -2R√(x^2^+y^2^) - r^2^ + R^2^. _] The positive direction of the normal to the surface at any point on the surface is given by stem:[_ ( S~x~, S~y~, S~z~ ). _] The unit normal is given by stem:[*N*_(u,v)_ = cos_v_((cos _u_)*x* + (sin _u_)*y*) + (sin _v_)*z*. ] The sense of this normal is away from the nearest point on the circle of radius _R_ with centre *C*. A manifold surface will be produced if the major radius is greater than the minor radius. If this condition is not fulfilled, the resulting surface will be self-intersecting. [.underline]#EXPRESS specification:# [source] -- express_ref:[toroidal_surface] -- [[geometry_schema.degenerate_toroidal_surface]] ==== degenerate_toroidal_surface A *degenerate_toroidal_surface* is a type of <>, in which the *minor_radius* is greater than the *major_radius*. In this subtype the parametric range is restricted in order to define a manifold surface which is either the inner 'lemon-shaped' surface, or the outer 'apple-shaped' portion of the self-intersecting surface defined by the supertype. The data is to be interpreted as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of degenerate_toroidal_surface) ]stem:[_ R _ = *major_radius*]stem:[_ r _ = *minor_radius*] and the surface is parametrised as stem:[_*σ*(u,v)_ = *C* + _(R + r_cos _v_)((cos_u_)*x* + (sin _u_))*y*) + _r_(sin_v_))*z*] where the parametrisation range is If *select_outer* = .TRUE. : _0 ≤ u ≤ 360_ degrees. _ -φ ≤ v ≤ φ_ degrees. If *select_outer* = .FALSE. : _0 ≤ u ≤ 360_ degrees. _ φ ≤ v ≤ 360 - φ_ degrees. Where _φ _ degrees is the angle given by _ r_cos φ = _-R _. _u_ and _v_ are angular parameters and when numerical values are specified they shall use the current units for ../../../resource_docs/fundamentals_of_product_description_and_support/sys/19_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure]. [[note_1]] NOTE: When *select_outer* = .FALSE. the surface normal points out of the enclosed volume and is defined by the equation stem:[*N*_(u,v)_ = cos _v_((cos _u_)*x* + (sin_u_)*y*) + (sin _v_)*z*. ] The sense of this normal is away from the furthest point on the circle of radius R in the plane normal to z centred at *C*. The sense of this normal is opposite to the direction of stem:[_(∂ *σ*)/(∂ u) × (∂ *σ*)/(∂ v) _. ] [[note_2]] NOTE: See Figure 15 for illustration of the attributes. [[figure15]] .Cross section of degenerate_toroidal_surface image::Geomfig14.gif[Cross section of degenerate_toroidal_surface] [.underline]#EXPRESS specification:# [source] -- express_ref:[degenerate_toroidal_surface] -- [[geometry_schema.dupin_cyclide_surface]] ==== dupin_cyclide_surface A *dupin_cyclide_surface* is a type of <>, that is a generalisation of a <> in which the radius of the generatrix varies as it is swept around the directrix, passing through a maximum and a minimum value. The directrix is in general an ellipse, though that fact is not germane to the definition given here. The surface has two orthogonal planes of symmetry, and in both of them its cross-section is a pair of circles. [[note_1]] NOTE: These circles are illustrated in Figure 15, where the upper cross-section contains the generatrix circles of maximum and minimum radius, and the lower cross-section is in the plane of the directrix. [[note_2]] NOTE: Further details of the properties and applications of this useful but unfamiliar surface may be found in PRATT [13],[14], and the further references they contain. As with the <>, self-intersecting forms occur. The Dupin cyclides are special cases of a more general class of surfaces known as _generalized cyclides_ (or sometimes simply _cyclides_). The present specification does not cover the wider class. The interpretation of the data is as follows: *stem:[ C = position.location ]stem:[ x = position.p[1] ]stem:[ y = position.p[2] ]*stem:[* z = position.p[3] * (axis of toroidal_surface) ]stem:[_ R _ = *generalised_major_radius*]stem:[_ r _ = *generalised_minor_radius*]stem:[_ s _ = *skewness*] and the surface is parametrised as Dupc1.gif where the domain of parametrisation is _0° ≤ u,v ≤ 360° _, and √ denotes the positive square root. _u_ and _v_ are angular parameters and when numerical values are specified they shall use the current units for ../../../resource_docs/fundamentals_of_product_description_and_support/sys/19_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure]. [[note_3]] NOTE: The three parameters _r,R_ and _s_ determine the centres and radii of the circles in the planes of symmetry, as shown in Figure 15. Conversely, knowledge of the geometry of these circles allows the defining cyclide parameters to be determined. In the upper and lower diagrams respectively of Figure 15 the circles have parameter values _u = 0°_ (right), _u = 180°_ (left), _v = 0°_ (inner) and _v = 180°_ (outer). The point with parameter values (0,0) is the extreme point on the positive x-axis. The parameter _u_ runs anticlockwise around both circles in the lower diagram, and the parameter _v_ runs clockwise round the left-hand circle and anticlockwise round the right-hand circle in the upper diagram. In the placement coordinate system defined above the Dupin cyclide surface has the algebraic representation _ S = 0_, where stem:[_ S = (x^2^ + y^2^ + z^2^ + R^2^ - r^2^ - s^2^)^2^ - 4(Rx - rs)^2^- 4(R^2^ - s^2^)y^2^. _] The positive direction of the normal vector at any point on the surface is given by stem:[ (S~x~,S~y~,S~z~).] In parametric terms, the unit surface normal vector is stem:[*N*_(u,v) = (R_ \cos _u_cos_v_ + _s_)*x* + (√(R^2^ - s^2)^sin_u_cos_v_)*y* + (√(R^2^ - s^2^)sin_v_)*z*] This enables the parametric surface representation to be rewritten as stem:[_*σ*(u,v) = *σ*~0~(u,v) + r_*N*_(u,v)_,] which shows that any Dupin cyclide with given values of _R_ and _s_ is a parallel offset from a base Dupin cyclide _*σ*~0~(u,v)_ with the same values of _R,s_ but with _r = 0_. Further, the offset distance is precisely _r_. This generalizes an important property of the torus. The Dupin cyclide is a manifold surface under the conditions _0 ≤ s < r < R_. This form is known as a _ring cyclide_. Self-intersecting forms arise when the circles in either plane of symmetry intersect. The conditions _0 < r ≤ s < R_ give a _horned cyclide_ and the conditions _ 0 ≤ s ≤ R < r_ a _spindle cyclide_. The sense of the surface normal given above is outwards from both circles in the upper view and from the annular region in the lower cross-sectional view in Figure 15. For the ring cyclide this means that it is outwards-pointing over the entire surface. For the horned cyclide the normal is inward-pointing over the smaller portion of the surface lying between the two self-intersection points. For the spindle cyclide the `spindle' corresponds to the `lemon' solid arising in the case of a self-intersecting torus. For this case of the Dupin cyclide the normal is outward-pointing over both the `apple' and 'lemon' solids enclosed by the surface. [[note_4]] NOTE: The three forms of the Dupin cyclide are shown in Figures 16, 17 and 18. In Figure 18 part of the exterior surface is removed to reveal the inner surface. [[figure16]] .Cross-sections of a Dupin cyclide with C = 0 image::Geomfig15.gif[Cross-sections of a Dupin cyclide with C = 0] [[figure17]] .A Dupin ring cyclide image::Geomfig16.gif[A Dupin ring cyclide] [[figure18]] .A Dupin horned cyclide image::Geomfig17.gif[A Dupin horned cyclide] [[figure19]] .A Dupin spindle cyclide image::Geomfig18.gif[A Dupin spindle cyclide] [[note_5]] NOTE: For ISO 10303 purposes, the values of _R_ and _r_ are of type *positive_length_measure* and _s_ is non-negative. The surface defined by the foregoing equations when one or more of _R, r_ and _s_ is negative corresponds to a reparametrisation of a Dupin cyclide for which these constants are all non-negative. [[note_6]] NOTE: Both families of isoparametric curves of the Dupin cyclide consist of circles. [[note_7]] NOTE: Dupin cyclides can be used to construct smooth joins between cylindrical and/or conical surfaces whose (possibly skew) axes have arbitrary relative orientations. Additionally, smooth T-junctions between cones and cylinders can be designed using Dupin cyclides. [[note_8]] NOTE: Dupin cyclides also have uses as blending surfaces in solid modeling, generalising the use of the torus for this purpose. [[note_9]] NOTE: The Dupin cyclide as defined here is a quartic (degree four) algebraic surface of bounded extent. There also exists a cubic Dupin cyclide of infinite extent, not currently defined in this part of ISO 10303. [.underline]#EXPRESS specification:# [source] -- express_ref:[dupin_cyclide_surface] -- [[geometry_schema.swept_surface]] ==== swept_surface A *swept_surface* is a type of <>, that is constructed by sweeping a curve along another curve. [.underline]#EXPRESS specification:# [source] -- express_ref:[swept_surface] -- [[geometry_schema.surface_of_linear_extrusion]] ==== surface_of_linear_extrusion A *surface_of_linear_extrusion* is a type of <>, or a generalised cylinder obtained by sweeping a curve in a given direction. The parametrisation is as follows, where the curve has a parametrisation _*λ*(u)_, and *V* = *extrusion_axis* stem:[_*σ*(u,v) = *λ*(u) + v_*V*] The parametrisation range for _v_ is _-∞ < v < ∞_ and for _u_ is defined by the curve parametrisation. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_of_linear_extrusion] -- [[geometry_schema.surface_of_revolution]] ==== surface_of_revolution A *surface_of_revolution* is a type of <>, obtained by rotating a curve one complete revolution about an axis. The data shall be interpreted as below. The parametrisation is as follows, where the curve has a parametrisation _*λ*(v)_, *C = position.location* and *V* = position.z stem:[_*σ*(u,v)_ = *C* + (*λ*_(v)_ - *C*)cos_u + ((*λ*(v)_ - *C)⋅ V)V*(1 - cos_u_) + *V*× (_*λ*(v)_ - *C*)sin_u_] In order to produce a single-valued surface with a complete revolution, the curve shall be such that when expressed in a cylindrical coordinate system _(r,φ,z)_ centred at *C* with axis *V*, no two distinct parametric points on the curve shall have the same values for _(r,z)_. [[note_1]] NOTE: In this context a single valued surface is interpreted as one for which the mapping, from the interior of the rectangle in parameter space corresponding to its parametric range, to geometric space, defined by the surface equation, is one-to-one. For a surface of revolution the parametric range is _0 ≤ u ≤ 360_ degrees. _u_ is an angular parameter and when a numerical value is specified it shall use the current units for ../../../resource_docs/fundamentals_of_product_description_and_support/sys/19_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure]. The parameter range for _v_ is defined by the referenced curve. [[note_2]] NOTE: The geometric shape of the surface is not dependent upon the curve parametrisation. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_of_revolution] -- [[geometry_schema.surface_curve_swept_surface]] ==== surface_curve_swept_surface A *surface_curve_swept_surface* is a type of <>, which is the result of sweeping a curve along a *directrix* curve lying on the *reference_surface*. The orientation of the <> during the sweeping operation is related to the normal to the *reference_surface*. The <> is required to be a curve lying in the plane _z = 0_ and this is swept along the *directrix* in such a way that the origin of the local coordinate system used to define the <> is on the *directrix* and the local X axis is in the direction of the normal to the *reference_surface*. The resulting surface has the property that the cross section of the surface by the normal plane to the *directrix* at any point is a copy of the <>. The orientation of the <> as it sweeps along the directrix is precisely defined by a *cartesian_transformation_operator_3d* with attributes: *local_origin* as point (0,0,0), *axis1* as the normal *N* to the *reference_surface* at the point of the *directrix* with parameter _u_. *axis3* as the direction of the tangent vector *t* at the point of the *directrix* with parameter _u_. The remaining attributes are defaulted to define a corresponding transformation matrix _*T*(u)_. [[note_1]] NOTE: In the special case where the *directrix* is a planar curve the *reference_surface* is the plane of the *directrix* and the normal *N* is a constant. The parametrisation is as follows, where the *directrix* has parametrisation _*μ*(u)_ and the <> curve has a parametrisation _*λ*(v),_ stem:[_*μ *(u)_ = Point on directrix, ]stem:[*T*_(u)_ = Transformation matrix at parameter _(u)_:]stem:[_*σ*(u,v) = *μ*(u)_ + *T*(_(u)_)*λ*_(v)_] In order to produce a continuous surface the *directrix* curve shall be tangent continuous. For a *surface_curve_swept_surface* the parameter range for _u_ is defined by the *directrix* curve. The parameter range for _v_ is defined by the referenced <>. [[note_2]] NOTE: The geometric shape of the surface is not dependent upon the curve parametrisations. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_curve_swept_surface] -- [[geometry_schema.fixed_reference_swept_surface]] ==== fixed_reference_swept_surface A *fixed_reference_swept_surface* is a type of <>, which is the result of sweeping a curve along a *directrix*. The orientation of the curve during the sweeping operation is controlled by the *fixed_reference* direction. The <> is required to be a curve lying in the plane _z = 0_ and this is swept along the *directrix* in such a way that the origin of the local coordinate system used to define the <> is on the *directrix* and the local X axis is in the direction of the projection of *fixed_reference* onto the normal plane to the *directrix* at this point. The resulting surface has the property that the cross section of the surface by the normal plane to the *directrix* at any point is a copy of the <>. The orientation of the <> as it sweeps along the directrix is precisely defined by a *cartesian_transformation_operator_3d* with attributes: *local_origin* as point _(0,0,0)_, *axis1* as *fixed_reference*, *axis3* as the direction of the tangent vector *t* at the point of the *directrix* with parameter _u_. The remaining attributes are defaulted to define a corresponding transformation matrix *T*_(u)_. The parametrisation is as follows, where the *directrix* has parametrisation _*μ*(u)_ and the <> curve has a parametrisation _*λ*(v)_, stem:[_*μ*(u)_ = Point on directrix, ]stem:[*T*_(u)_ = Transformation matrix at parameter _(u)_: ]stem:[_*σ*(u,v) = *μ*(u)_ + *T*_(u)*λ*(v) _] In order to produce a continuous surface the *directrix* curve the curve shall be tangent continuous. For a *fixed_reference_swept_surface* the parameter range for _u_ is defined by the *directrix* curve. The parameter range for _v_ is defined by the referenced <>. [[note_1]] NOTE: The geometric shape of the surface is not dependent upon the curve parametrisations. [[note_2]] NOTE: The attributes are illustrated in Figure 19. [[figure20]] .Fixed_reference_swept_surface image::Geomfig19.gif[Fixed_reference_swept_surface] [.underline]#EXPRESS specification:# [source] -- express_ref:[fixed_reference_swept_surface] -- [[geometry_schema.bounded_surface]] ==== bounded_surface A *bounded_surface* is a type of <> of finite area with identifiable boundaries. [.underline]#EXPRESS specification:# [source] -- express_ref:[bounded_surface] -- [[geometry_schema.b_spline_surface]] ==== b_spline_surface A *b_spline_surface* is a type of <>, and is a general form of rational or polynomial parametric surface which is represented by control points, basis functions, and possibly, weights. As with the corresponding curve entity it has some special subtypes where some of the data can be derived. [[note_1]] NOTE: Identification of B-spline surface default values and subtypes is important for performance considerations and for efficiency issues in performing computations. [[note_2]] NOTE: A B-spline is _rational_ if and only if the weights are not all identical. If it is polynomial, the weights may be defaulted to all being 1. [[note_3]] NOTE: In the case where the B-spline surface is uniform, quasi-uniform or piecewise Bézier, the knots and knot multiplicities may be defaulted (i.e., non-existent in the data as specified by the attribute definitions). When the knots are defaulted, a difference of 1.0 between separate knots is assumed, and the effective parameter range for the resulting surface starts from 0.0. These defaults are provided by the subtypes. [[note_4]] NOTE: The knots and knot multiplicities shall not be defaulted in the non-uniform case. [[note_5]] NOTE: The defaulting of weights and knots are done independently of one another. The data is to be interpreted as follows: The symbology used here is: stem:[_ K1 _= *upper_index_on_u_control_points*]stem:[_ K2 _= *upper_index_on_v_control_points*]stem:[*P*~ij~ = *control_points*]stem:[ w~ij~ = *weights*]stem:[_ d1_ = *u_degree*]stem:[_ d1_ = *u_degree*] The control points are ordered as stem:[*P*~00~, *P*~01~, *P*~02~, . . . . *P*~K1(K2-1~, *P*~K1K2~. ] The weights, in the case of the rational subtype, are ordered similarly. For each parameter, _ s = u_ or _v_, if _k_ is the upper index on the control points and _d_ is the degree for _s_, the knot array is an array of _(k + d + 2)_ real numbers _[s~-d~, ... ,s~k+1~]_, such that for all indices _j_ in _[-d, k], s~j~ ≤ s~j+1~_. This array is obtained from the appropriate *u_knots* or *v_knots* list by repeating each multiple knot according to the multiplicity. _N~i~^d^_, the _i_th normalised B-spline basis function of degree _d_, is defined on the subset _[s~i-d~, ... ,s~i+1~]_ of this array. Let _L_ denote the number of distinct values amongst the knots in the knot list; _L_ will be referred to as the `upper index on knots'. Let _m~j~_ denote the multiplicity (i.e., number of repetitions) of the _j_th distinct knot value. Then: stem:[_ Σ^L^~i=1~ m~i~ = d + k + 2 _] All knot multiplicities except the first and the last shall be in the range _1, . . . , d_; the first and last may have a maximum value of _d + 1_. [[note_6]] NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity 3 is interpreted as a sequence _u, u, u,_ in the knot array. The *surface_form* is used to identify specific quadric surface types (which shall have degree two), ruled surfaces and surfaces of revolution. As with the *b_spline_curve*, the *surface_form* is informational only and the spline data takes precedence. The surface is to be interpreted as follows: In the polynomial case the surface is given by the equation: BSsurf1.gif In the rational case the surface equation is: BSsurf2.gif [[note_7]] NOTE: Definitions of the B-spline basis functions, _N~i~^d1^(u)_ and _N~i~^d2^(v)_, can be found in [1], [5] and [6]. It should be noted that there is a difference in terminology between these references. [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_surface] -- [[geometry_schema.b_spline_surface_with_knots]] ==== b_spline_surface_with_knots A *b_spline_surface_with_knots* is a type of <>, in which the knot values are explicitly given. This subtype shall be used to represent non-uniform B-spline surfaces, and may also be used for other knot types. All knot multiplicities except the first and the last shall be in the range _1, . . . , d_; the first and last may have a maximum value of _d + 1_. NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity 3 is interpreted as a sequence _u, u, u,_ in the knot array. [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_surface_with_knots] -- [[geometry_schema.uniform_surface]] ==== uniform_surface A *uniform_surface* is a type of <>, in which the knots are evenly spaced. Suitable default values for the knots and knot multiplicities can be derived in this case. A B-spline is _uniform_ if and only if all knots are of multiplicity and they differ by a positive constant from the preceding knot. In this subtype the knot spacing is 1.0, starting from _-degree_. NOTE: If explicit knot values for the surface are required, they can be derived as follows: ku_up = SELF\backslash b_spline_surface.u_upper + SELF\backslash b_spline_surface.u_degree + 2, kv_up = SELF\backslash b_spline_surface.v_upper + SELF\backslash b_spline_surface.v_degree + 2 . ku_up is the value required for the upper index on the knot and knot multiplicity lists in the _u_ direction. This is computed from the degree and the number of control points in this direction. kv_up is the value required for the upper index on the knot and knot multiplicity lists in the _v_ direction. This is computed from the degree and the number of control points in this direction. The knot multiplicities and knots in the _u_ and _v_ parameter directions are then given by the function calls: stem:[<>(SELF\b_spline_surface.u_degree, ku_up, uniform_knots)]stem:[<>(SELF\b_spline_surface.u_degree, ku_up, uniform_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, uniform_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, uniform_knots)] [.underline]#EXPRESS specification:# [source] -- express_ref:[uniform_surface] -- [[geometry_schema.quasi_uniform_surface]] ==== quasi_uniform_surface A *quasi_uniform_surface* is a type of <>, in which the knots are evenly spaced, and except for the first and last, have multiplicity 1. Suitable default values for the knots and knot multiplicities are derived in this case. A B-spline is _quasi-uniform_ if and only if the knots are of multiplicity _(degree+1)_ at the ends, of multiplicity 1 elsewhere, and they differ by a positive constant from the preceding knot. In this subtype the knot spacing is 1.0, starting from 0.0. NOTE: If explicit knot values for the surface are required, they can be derived as follows: ku_up = SELF\backslash b_spline_surface.u_upper - SELF\backslash b_spline_surface.u_degree + 2, kv_up = SELF\backslash b_spline_surface.v_upper - SELF\backslash b_spline_surface.v_degree + 2. ku_up is the value required for the upper index on the knot and knot multiplicity lists in the _u_ direction. This is computed from the degree and the number of control points in this direction. kv_up is the value required for the upper index on the knot and knot multiplicity lists in the _v_ direction. This is computed from the degree and the number of control points in this direction. The knot multiplicities and knots in the _u_ and _v_ parameter directions are then given by the function calls: stem:[<>(SELF\b_spline_surface.u_degree, ku_up, quasi_uniform_knots)]stem:[<>(SELF\b_spline_surface.u_degree, ku_up, quasi_uniform_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, quasi_uniform_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, quasi_uniform_knots)] [.underline]#EXPRESS specification:# [source] -- express_ref:[quasi_uniform_surface] -- [[geometry_schema.bezier_surface]] ==== bezier_surface A *bezier_surface* is a type of <>, in which the knots are evenly spaced and have high multiplicities. Suitable default values for the knots and knot multiplicities are derived in this case. In this subtype the knot spacing is 1.0, starting from 0.0. NOTE: If explicit knot values for the surface are required, they can be derived as follows: ku_up = *(SELF\backslash b_spline_surface.u_upper)/(SELF\backslash b_spline_surface.u_degree)* + 1, kv_up = *(SELF\backslash b_spline_surface.v_upper)/(SELF\backslash b_spline_surface.v_degree)* + 1, _ku_up_ is the value required for the upper index on the knot and knot multiplicity lists in the _u_ direction. This is computed from the degree and the number of control points in this direction. _kv_up_ is the value required for the upper index on the knot and knot multiplicity lists in the _v_ direction. This is computed from the degree and the number of control points in this direction. The knot multiplicities and knots in the _u_ and _v_ parameter directions are then given by the function calls: stem:[<>(SELF\b_spline_surface.u_degree, ku_up, bezier_knots)]stem:[<>(SELF\b_spline_surface.u_degree, ku_up, bezier_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, bezier_knots)]stem:[<>(SELF\b_spline_surface.v_degree, kv_up, bezier_knots)] [.underline]#EXPRESS specification:# [source] -- express_ref:[bezier_surface] -- [[geometry_schema.rational_b_spline_surface]] ==== rational_b_spline_surface A *rational_b_spline_surface* is a type of <>, which is a piecewise parametric rational surface described in terms of control points, associated weight values and basis functions. It is instantiated with any of the other subtypes of <>, which provide explicit or implicit knot values from which the basis functions are defined. The surface is to be interpreted as follows: BSsurf2.gif NOTE: See <> for details of the symbology used in the above equation. [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_b_spline_surface] -- [[geometry_schema.locally_refined_spline_surface]] ==== locally_refined_spline_surface A *locally_refined_spline_surface* is a type of <> that is a piecewise parametric polynomial or rational surface described in terms of control points and local B-spline functions. If the set of B-spline functions are linearly independent, they will form a basis. With appropriate attribute values, the surface is capable of representing single span or spline surfaces of explicit polynomial, rational, Bézier or B-spline type. However, the *locally_ refined_spline_surface* entity is intended for spline surfaces that do not have a tensor product structure. The degree of the surface can vary as the B-splines from which it is defined, need not to have the same polynomial degree. [[note_1]] NOTE: A B-spline surface compactly represents a large smooth area. However, if the shape is mainly smooth, but with some areas of higher complexity, the data size of a B-spline surface tends to be high. Due to the tensor product construction of the B-spline surface the knot lines are global and high data size in one area of the surface cannot be kept locally. The following approaches to define a B-spline surface with the property of local refinement have been pursued: * PHT splines, * General T-splines, * Analysis suitable T-splines, * Standard and semi-standard T-splines, * Hierarchical B-splines, * LR B-splines. The entity *locally_refined_spline_surface* can, with proper pre and post processing, be used to represent surfaces of the types: analysis suitable T-spline, standard T-spline, semi-standard T-spline, hierarchical B-spline and LR B-spline. [[note_2]] NOTE: A locally refined spline surface is rational if and only if the weights are not all identical; this can be represented by the <> subtype. If it is polynomial, the weights may be defaulted to all being 1. Interpretation of the data is as follows: The surface, in the polynomial case, is given by: LRsurface.gif In the rational case all weights shall be positive and the surface is given by: RationalLRsurf.gif where stem:[*K* = number of control points, ]stem:[*P*~_i_~ = control points(_i_),]stem:[_s~i~_= scaling_factors(_i_),]stem:[_w~i~_ = weights_data(_i_),]stem:[N~_i_~^d1^(_u_) = u_bspline(_i_), and]stem:[d1=u_degree. ]stem:[N~_i_~^d2^(_v_) = v_bspline(_i_), and]stem:[d2=v_degree. ] [[note_2]] NOTE: The degrees are associated with the local_b_splines and do not need to be constant throughout the surface. The weights, in the case of the rational subtype, are given in the same sequence as the coefficients. The knot values and multiplicities are defined in the entity <>. The B-splines are defined over a domain described by knot vectors in the parameter directions of the surface. However, in contrast to B-bspline surfaces, the basis functions or B-splines do not need to adapt to all knot lines in their supports. This facilitates the definition of a spline surface on a box partition. [[note_3]] NOTE: When the polynomial degree is the same for all B-splines and no knot lines exist that do not cross the entire parameter domain, the *locally_refined_spline_surface* will coincide with <>. In that case <>. has the simplest and most compact representation. [[note_4]] NOTE: A *locally_refined_spline_surface* can be of type analysis suitable T-spline, hierarchical B-spline, LR-spline, semi standard T-spline or standard T-spline. The type is given by the enumeration <>, and the packing and unpacking of the surface will depend on this type. [[figure21]] .Mesh for a locally refined spline surface of degree 2 image::Splinesurf.gif[Mesh for a locally refined spline surface of degree 2] [example] The parameter domain of a locally refined spline surface illustrated as a regular mesh. The knot lines can have varying multiplicity throughout the domain. The numbers show the maximum multiplicity of each knot.There may exist B-splines with a given knot in its domain where this knot has a multiplicity less than the maximum multiplicity. Zero multiplicity indicates that this knot does not exist in that part of the domain. No B-splines have this knot in their definition. This mesh corresponds to a surface that is quadratic in both parameter directions for all local B-splines. The locally refined spline surface contains two knot values lists, one for each parameter direction. The knot values are (0, 1.0, 1.5, 2.0, 3.0) in the first parameter (_u_) direction and (0.0, 1.0, 1.2, 1.8, 2.0, 3.0) in the second parameter direction. The univariate B-splines in the first parameter direction are: * 1u. Degree =2, knots=(0,1), multiplicities=(3,1) * 2u. Degree=2, knots=(0,1,2), multiplicities=(2,1,1) * 3u. Degree=2, knots=(0,1,3), multiplicities=(2,1,1) * 4u. Degree=2, knots=(0,1,2), multiplicities=(1,1,2) * 5u. Degree=2, knots=(0,1,2,3), multiplicities=(1,1,1,1) * 6u. Degree=2, knots=0,1,3,4), multiplicities=(1,1,1,1) * 7u. Degree=2, knots=(1,2,3), multiplicities=(1,2,1) * 8u. Degree=2, knots=(1,2,3,4), multiplicities=(1,1,1,1) * 9u. Degree=2, knots=(1,3,4), multiplicities=(1,1,2) * 10u. Degree=2, knots=(2,3,4), multiplicities=(1,1,2) * 11u. Degree=2, knots=(3,4), multiplicities=(1,3) The univariate B-splines in the second parameter direction are: * 1v. Degree =2, knots=(0,1), multiplicities=(3,1) * 2v. Degree=2, knots=(0,1,2), multiplicities=(2,1,1) * 3v. Degree=2, knots=(0,1,4), multiplicities=(2,1,1) * 4v. Degree=2, knots=(0,1,2,3), multiplicities=(1,1,1,1) * 5v. Degree=2, knots=(0,1,2,4), multiplicities=(1,1,1,1) * 6v. Degree=2, knots=(0,1,4,5), multiplicities=(1,1,1,1) * 7v. Degree=2, knots=(1,2,3,4), multiplicities=(1,1,1,1) * 8v. Degree=2, knots=(1,2,4,5), multiplicities=(1,1,1,1 * 9v. Degree=2, knots=(1,4,5), multiplicities=(1,1,2) * 10v. Degree=2, knots=(2,4,5), multiplicities=(1,1,2) * 11v. Degree=2, knots=(4,5), multiplicities=(1,3) Each control point is associated with the product of 2 B-splines one in _u_ and one in _v_. The list of pairs of B-splines starts with all pairs of products of B-splines with knot values (0,0): (1u.1v, 2u.1v, 5u.1v, 1u.3v, 2u.3v, 5u.3v 1u.6v, 2u.6v, 5u.6v). The list continues with all the remaining B-spline products with first knot value _v _ = 0 : (8u.1v, 8u.2v, 8u.5v, 10u.1v, 10u.2v, 10u.5v, 11u.1v, 11u.2v, 11u.5v) The list continues with all the B-spline products with first knot value _v _ = 1 (1u.9v, 2u.9v, 5u.9v, 7u.7v, 11u.8v). Finally we list all B-spline products with first knot values _ v _ = 2 and _ v _ = 4 (9u.10v, 11u.10v) and (1u.11v, 3u.11v, 6u.11v, 9u.11v, 11u.11v). In this example the splines are of type LR B-spline and all scaling factors have value 1.0. Corresponding to the orders in the consecutive lists above the complete data defining the geometry of the curve is a list of 30 *u_b_splines*, a corresponding list of 30 *v_b_splines*, a list of 5 *u_knots*, a list of 6 *v_knots*, a list of 30 control points and a corresponding list of 30 scaling factors. The combined B-splines are not tested for linearly independence. The domain is [0,3]x[0,3]. The *surface_form* is unspecified and the matter of self-intersection and whether the surface is closed in any direction depends on the *control_points_list*. [.underline]#EXPRESS specification:# [source] -- express_ref:[locally_refined_spline_surface] -- [[geometry_schema.rational_locally_refined_spline_surface]] ==== rational_locally_refined_spline_surface A *rational_locally_refined_spline_surface* is a type of <> that is a piecewise parametric rational surface described in terms of control points and local B-spline functions. [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_locally_refined_spline_surface] -- [[geometry_schema.rectangular_trimmed_surface]] ==== rectangular_trimmed_surface A *rectangular_trimmed_surface* is a type of <>, in which the boundaries are the constant parametric lines _u~1~ = u1_, _u~2~ = u2_, _v~1~ = v1_ and _v~2~ = v2_. All these values shall be within the parametric range of the referenced surface. Cyclic properties of the parameter range are assumed. [[note_1]] NOTE: For example, 370 degrees is equivalent to 10 degrees, for those surfaces whose parametric form is defined using circular functions (sine and cosine). The rectangular trimmed surface inherits its parametrisation directly from the basis surface and has parameter ranges from 0 to _|u~2~ - u~1~|_ and 0 to _|v~2~ - v~1~|_. The derivation of the new parameters from the old uses the algorithm described in <>. [[note_2]] NOTE: If the surface is closed in a given parametric direction, the values of _>u~~_ or _>v~2~_ may require to be increased by the cyclic range. [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangular_trimmed_surface] -- [[geometry_schema.curve_bounded_surface]] ==== curve_bounded_surface A *curve_bounded_surface* is a type of <>, and is a parametric surface with curved boundaries defined by one or more <>s or <>s. One of the <>s may be the outer boundary; any number of inner boundaries is permissible. The outer boundary may be defined implicitly as the natural boundary of the surface; this is indicated by the *implicit_outer* flag being true. In this case at least one inner boundary shall be defined. For certain types of closed, or partially closed, surface (such as a cylinder) it may not be possible to identify any given boundary as outer. The region of the *curve_bounded_surface* in the *basis_surface* is defined to be the portion of the basis surface in the direction of *n × t* from any point on the boundary, where *n* is the surface normal and *t* the boundary curve tangent vector at this point. The region so defined shall be arcwise connected. [[figure22]] .Curve_bounded_surface image::Geomfig20.gif[Curve_bounded_surface] [.underline]#EXPRESS specification:# [source] -- express_ref:[curve_bounded_surface] -- [[geometry_schema.boundary_curve]] ==== boundary_curve A *boundary_curve* is a type of <> suitable for the definition of a surface boundary. [.underline]#EXPRESS specification:# [source] -- express_ref:[boundary_curve] -- [[geometry_schema.outer_boundary_curve]] ==== outer_boundary_curve An *outer_boundary_curve* is a type of <> which has the additional semantics of defining an outer boundary of a surface. No more than one such curve shall be included in the set of <> of a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[outer_boundary_curve] -- [[geometry_schema.rectangular_composite_surface]] ==== rectangular_composite_surface A *rectangular_composite_surface* is a type of <> composed of a rectangular array of *n_u* by *n_v* segments or patches. Each segment shall be finite and topologically rectangular (i.e., it corresponds to a rectangle in parameter space). The segment shall be either a <> or a <>. There shall be at least positional continuity between adjacent segments in both directions; the composite surface may be open or closed in the _u_ direction and open or closed in the _v_ direction. For a particular segment _S~ij~_ = *segments*[i][j]: The preceding segment in the _u_ direction is _S~(i-1)j~_ and the preceding segment in the _v_ direction is _S~i(j-1)~_; similarly for following segments. If *segments[i][j].u_sense* is TRUE, the boundary of _S~ij~_ where it adjoins _S~(i=1)j~_ is that where the _u_ parameter (of the underlying bounded surface) is high. If *segments[i][j].u_sense* is FALSE, it is at the low _u_ boundary; similarly for the *v_sense* indicator. The _u_ parametrisation of _S~ij~_ in the composite surface is from _i-1_ to _i_, mapped linearly from the parametrisation of the underlying bounded surface. If _U_ is the _u_ parameter for the *rectangular_composite_surface* and _ u~ij0~ ≤ u~ij~ij ≤ u~ij1~_, is the _u_ parameter for *segments[i][j]*, these parameters are related by the equations: stem:[_ U = (i - 1) + (u~ij~ - u~ij0~)/(u~ij1~ - u~ij0~),__ u~ij~ = u~ij0~ + (U -(i-1))(u~ij1~ - u~ij0~),_] if *segments[i][j].u_sense* = TRUE; stem:[_ U = i - (u~ij~ - u~ij0~)/(u~ij1~ - u~ij0~), __ u~ij~ = u~ij0~ - (U -i)(u~ij1~ - u~ij0~), _] if *segments[i][j].u_sense* = FALSE. The _v_ parametrisation is obtained in a similar way. Thus the composite surface has parametric range 0 to *n_u*, 0 to *n_v*. The degree of continuity of the joint between _S~ij~_ and _S~(i+1)j~/_ is given by *segments[i][j].u_transition*. For the last patch in a row _S~(n_u)j~_ this may take the value *discontinuous*, if the composite surface is open in the _u_ direction; otherwise it is closed here, and the transition code relates to the continuity to _S~1j~_; similarly for *v_transition*. *discontinuous* shall not occur elsewhere in the *segments surface_patch* transition codes. [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangular_composite_surface] -- [[geometry_schema.surface_patch]] ==== surface_patch A *surface_patch* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.founded_item[founded_item] and is a bounded surface with additional transition and sense information which is used to define a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_patch] -- [[geometry_schema.offset_surface]] ==== offset_surface A *offset_surface* is a type of <> and is a procedural definition of a simple offset surface at a normal distance from the originating surface. *distance* may be positive, negative or zero to indicate the preferred side of the surface. The positive side and the resultant offset surface are defined as follows: Define unit tangent vectors of the base surface in the _u_ and _v_ directions; denote these by _*σ*~u~_ and _*σ*~v~_. Take the cross product, _*N* = *σ*~u~ × *σ*~v~_, of these (which shall be linearly independent, or there is no offset surface). _*N*_ shall be extended by continuity at singular points, if possible. Normalise _*N*_ to get a unit normal (to the surface) vector. Move the offset distance (which may be zero) along that vector to find the point on the offset surface. [[note_1]] NOTE: The definition allows the *offset_surface* to be self-intersecting. The offset surface takes its parametrisation directly from that of the basis surface, corresponding points having identical parameter values. The *offset_surface* is parametrised as stem:[_*σ*(u,v) = *S*(u,v) + d*N*. _] Where *_N_* is the unit normal vector to the basis surface *S*(_u,v_) at parameter values (_u,v_), and _d_ is *distance*. [[note_2]] NOTE: Care should be taken when using this entity to ensure that the offset distance never exceeds the radius of curvature in any direction at any point of the basis surface. In particular, the surface should not contain any ridge or singular point. [.underline]#EXPRESS specification:# [source] -- express_ref:[offset_surface] -- [[geometry_schema.oriented_surface]] ==== oriented_surface A *oriented_surface* is a type of <> for which the direction of the surface normal may be reversed. The unit normal *N*, at any point on the *oriented_surface* is defined by the eqations: stem:[*N*_ (u,v) = < ((∂*σ*)/(∂ u) × (∂*σ*)/(∂ v)) > _, if *orientation* = .TRUE., ]stem:[*N*_ (u,v) = - < ((∂*σ*)/(∂ u) × (∂*σ*)/(∂ v)) > _, if *orientation* = .FALSE., ] NOTE: An *oriented_surface* may be instantiated with other subtypes of surface. For example a complex instance of *oriented_surface*, with *orientation* = .FALSE., and *spherical_surface*defines a spherical surface with an inward pointing normal. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_surface] -- [[geometry_schema.surface_replica]] ==== surface_replica A *surface_replica* is a type of <> which defines a replica of an existing surface in a different location. It is defined by referencing the parent surface and a transformation which gives the new position and possible scaling. The original surface is not affected. The geometric characteristics of the surface produced will be identical to that of the parent surface, but, where the transformation includes scaling, the size may differ. [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_replica] -- [[geometry_schema.volume]] ==== volume A *volume* is a type of <> that is a three dimensional solid of finite volume with a tri-parametric representation. Each volume has a parametric representation stem:[*V*_(u,v,w)_] where _u, v, w_ are independent dimensionless parameters. For each _(u,v,w)_ within the parameter range: stem:[*r = V*_(u,v,w)_, ] gives the coordinates of a point within the volume. NOTE: In this version of the standard the parameter ranges for the standard primitives have been standardised, mainly to [0:1], to ensure that they are dimensionless quantities. [.underline]#EXPRESS specification:# [source] -- express_ref:[volume] -- [[geometry_schema.block_volume]] ==== block_volume A *block_volume* is a type of <> in the form of a solid rectangular parallelepiped, defined with a location and placement coordinate system. The *block_volume* is specified by the positive lengths *x, >y*, and *z* along the axes of the placement coordinate system, and has one vertex at the origin of the placement coordinate system. The data is to be interpreted as follows: stem:[*C* = *position.location* (corner) ]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ l _ =*x* (length) ]stem:[_ d _ = *y* (depth) ]stem:[_ h _ = *z* (height) ] and the volume is parametrised as: stem:[_*V*(u,v,w)_ = *C* + _ ul _*x* + _vd_*y* + _wh_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_. [.underline]#EXPRESS specification:# [source] -- express_ref:[block_volume] -- [[geometry_schema.wedge_volume]] ==== wedge_volume A *wedge_volume* is a type of <> which can be envisioned as the result of intersecting a block with a plane perpendicular to one of its faces. It is defined with a location and local coordinate system. A triangular/trapezoidal face lies in the plane defined by the placement X and Y axes. This face is defined by positive lengths *x* and *y* along the placement X and Y axes, by the length *ltx* (if non-zero) parallel to the X axis at a distance *y* from the placement origin, and by the line connecting the ends of the *x* and *ltx* segments. The remainder of the wedge is specified by the positive length *z* along the placement Z axis which defines a distance through which the trapezoid or triangle is extruded. If *ltx*= 0, the wedge has five faces; otherwise, it has six faces. NOTE: See Figure 23 for interpretation of attributes. [[figure23]] .Wedge_volume and its attributes image::Geomfig21.gif[Wedge_volume and its attributes] The data is to be interpreted as follows: stem:[*C* = *position.location* (corner) ]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ l _ =*x* (length) ]stem:[_ d _ = *y* (depth) ]stem:[_ h _ = *z* (height) ]stem:[_ l~min~_ =*ltxx* (length) ] and the volume is parametrised as: stem:[_*V*(u,v,w)_ = *C* + _ u((1 - v)l + vl~min~) _*x* + _vd_*y* + _wh_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_. [.underline]#EXPRESS specification:# [source] -- express_ref:[wedge_volume] -- [[geometry_schema.pyramid_volume]] ==== pyramid_volume A *pyramid_volume* is a type of <> in the form of a solid pyramid with a rectangular base. The apex of the pyramid is directly above the centre point of the base. The *pyramid_volume* is specified by its position, which provides a placement coordinate system, its length, depth and height. The data is to be interpreted as follows: stem:[*C* = *position.location* (corner) ]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ l _ =*xlength*]stem:[_ d _ = *ydepth*]stem:[_ h _ = *height*] and the volume is parametrised as: stem:[_*V*(u,v,w)_ = *C* + _ w((l/2)_*x* + _(d/2)_*y* + _h_*z*) + _(1 - w)(ul_*x* + _vd_*y*) ] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_. [.underline]#EXPRESS specification:# [source] -- express_ref:[pyramid_volume] -- [[geometry_schema.tetrahedron_volume]] ==== tetrahedron_volume A *tetrahedron_volume* is a type of <> with 4 vertices and 4 triangular faces. It is defined by the four *cartesian_point*s which locate the vertices. These points shall not be coplanar. The data is to be interpreted as follows: stem:[*a* = *point_1.coordinates*]stem:[*b* = *point_2.coordinates*]stem:[*c* = *point_3.coordinates*]stem:[*d* = *point_4.coordinates*] and the volume is parametrised as: stem:[_*V*(u,v,w)_ = *a* + _u_(*b* - *a*) + _v_(*c* - *a*) + _w_(*d* - *a*) ] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_, with _u + v + w ≤ 1._ [.underline]#EXPRESS specification:# [source] -- express_ref:[tetrahedron_volume] -- [[geometry_schema.hexahedron_volume]] ==== hexahedron_volume A *hexahedron_volume* is a type of <> with 8 vertices and 6 four-sided faces. It is defined by the 8 points which locate the vertices. The volume is parametrised as stem:[*V*_(u,v,w) = (1 - u)(1 - v)(1 - w)_*P~1~* + _(1 - u)(v)(1 -w)_*P~2~* + _uv(1 - w)_*P~3~* + _u(1 -v)(1 - w)_*P~4~* + _(1 - u)(1 - v)w_*P~5~* + _(1 - u)(v)w_*P~6~* + _uvw_*P~7~* + _u(1 -v)w_*P~8~*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_. and *P_~i~_* denotes the position vector of *points[i]* [[figure24]] .Hexahedron_volume and its attributes image::Geomfig22.gif[Hexahedron_volume and its attributes] [.underline]#EXPRESS specification:# [source] -- express_ref:[hexahedron_volume] -- [[geometry_schema.spherical_volume]] ==== spherical_volume A *spherical_volume* is a type of <> in the form of a sphere of radius _R_. A *spherical_volume* is defined by the radius and the position of the solid. The data is to be interpreted as follows: stem:[*C* = *position.location* (centre) ]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ R _ =*radius*] and the volume is parametrised as: stem:[*V*_(u,v,w)_ = *C* + _wR_cos((π_v)/2)_((cos_(2πu))_*x* + (sin_(2πu))_*y*) + _wR_(sin ((π_v)/2))_*z*] where the parametrisation range is _0 ≤ u ≤ 1, -1 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_ . where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1_ , and _0 ≤ w ≤ 1_. [.underline]#EXPRESS specification:# [source] -- express_ref:[spherical_volume] -- [[geometry_schema.cylindrical_volume]] ==== cylindrical_volume A *cylindrical_volume* is a type of <> in the form of a circular cylinder. A *cylindrical_volume* is defined by its orientation and location, its radius and its height. The data is to be interpreted as follows: stem:[*C* = *position.location*]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ R _ =*radius*]stem:[_ h _ =*height*] and the volume is parametrised as: stem:[*V*_(u,v,w)_ = *C* + _wR_((cos _(2πu))_*x* + (sin_(2πu)_*y*) + _vH_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1 _, and _ 0 ≤ w ≤ 1 _. [.underline]#EXPRESS specification:# [source] -- express_ref:[cylindrical_volume] -- [[geometry_schema.eccentric_conical_volume]] ==== eccentric_conical_volume A *eccentric_conical_volume* is a type of <> in the form of a skew cone. The *eccentric_conical_volume* may have an elliptic cross section, and may have a central axis which is not perpendicular to the base. Depending upon the value of the *ratio* attribute it may be truncated, or may take the form of a generalised cylinder. When truncated the top face of the cone is parallel to the plane of the base and has a similar cross section. The data is to be interpreted as follows: stem:[*C* = *position.location*]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ R~1~_ = *semi_axis_1*]stem:[_ R~2~_ = *semi_axis_2*]stem:[_H _ = *height*]stem:[_xo _ = *x_offset*]stem:[_yo _ = *y_offset*]stem:[_s_ = *ratio*] and the volume is parametrised as: stem:[*V*_(u,v,w)_ = *C* + _v(xo_*x* + _yo_*y*)+ _w(1 + v(s - 1))( R~1~((2πu))_*x* + _ R~2~_ (sin_(2πu)_*y*)) + _vH_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1 _, and _ 0 ≤ w ≤ 1 _. [[note_1]] NOTE: In the placement coordinate system defined by *position* the central point of the top face of the *eccentric_conical_volume* has coordinates _(x_offset, y_offset, height)_. [[note_2]] NOTE: If *ratio* = 0.0 the *eccentric_conical_volume* includes the apex. If *ratio* = 1.0 the *eccentric_conical_volume* is in the form of a generalised cylinder with all cross sections of the same dimensions. [[note_3]] NOTE: If *x_offset* = *y_offset* = 0.0 the eccentric_conical_volume has the form of a right elliptic cone or, with _ R~1~ = R~2~_, a right circular cone. [.underline]#EXPRESS specification:# [source] -- express_ref:[eccentric_conical_volume] -- [[geometry_schema.toroidal_volume]] ==== toroidal_volume A *toroidal_volume* is a type of <> which could be produced by revolving a circular face about a line in its plane. The radius of the circle being revolved is referred to here as the *minor_radius* and the *major_radius* is the distance from the centre of this circle to the axis of revolution. A *toroidal_volume* is defined by the major and minor radii and the position and orientation of the volume. The data is to be interpreted as follows: stem:[*C* = *position.location*]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ R_ = *major_radius*]stem:[_ r _ = *minor_radius*] and the volume is parametrised as: stem:[*V*_(u,v,w)_ = *C* + _(R + wr_cos_(2πv))_((cos_(2πu))_*x* + (sin_(2πu))_*y*) + _wr_(sin(_πv))_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1 _, and _ 0 ≤ w ≤ 1 _. [.underline]#EXPRESS specification:# [source] -- express_ref:[toroidal_volume] -- [[geometry_schema.ellipsoid_volume]] ==== ellipsoid_volume A *ellipsoid_volume* is a type of <> in the form of a solid ellipsoid. It is defined by its location and orientation and by the lengths of the three semi-axes. The data is to be interpreted as follows: stem:[*C* = *position.location* (centre)]stem:[*x* = *position.p[1]*]stem:[*y* = *position.p[2]*]stem:[*z* = *position.p[3]*]stem:[_ a_ = *semi_axis_1*]stem:[_ b _ = *semi_axis_2*]stem:[_c _ = *semi_axis_3*] and the volume is parametrised as: stem:[*V*_(u,v,w)_ = *C* + _w_cos(_(πv)/2) (a(_cos_(πu))_*x* + _b(_sin_(2πu))_*y*) + _wc(_sin_ ((πv)/2))_*z*] where the parametrisation range is _0 ≤ u ≤ 1, 0 ≤ v ≤ 1 _, and _ 0 ≤ w ≤ 1 _. [.underline]#EXPRESS specification:# [source] -- express_ref:[ellipsoid_volume] -- [[geometry_schema.b_spline_volume]] ==== b_spline_volume A *b_spline_volume* is a type of <> that is a general form of tri-parametric volume field which is represented by control points and basis functions. As with the B-spline curve and surface entities it has special subtypes where some of the data can be derived. The data is to be interpreted as follows: stem:[ K1 = *upper_index_on_u_control_values*]stem:[ K2 = *upper_index_on_v_control_values*]stem:[ K2 = *upper_index_on_v_control_values*]stem:[*P*_~ijk~_ = *control_values*]stem:[_ d1_ = *u_degree*]stem:[_ d2 _ = *v_degree*]stem:[_ d3 _ = *w_degree*] The control values are ordered as stem:[*P*~000~, *P*~001~, *P*~002~, . . . , *P*~K1K2(K3-1)~, *P*~K1K2K3~] For each parameter, _ s = u_ or _v_, or _w_ if _k_ is the upper index on the control points and _d_ is the degree for _s_, the knot array is an array of _(k + d + 2)_ real numbers _[s~-d~, ... ,s~k+1~]_, such that for all indices _j_ in _[-d, k], s~j~ ≤ s~j+1~_. This array is obtained from the appropriate *knots_data* list by repeating each multiple knot according to the multiplicity. _N~i~^d^_, the _i_th normalised B-spline basis function of degree _d_, is defined on the subset: _ [s~i-d~, ... ,s~i+1~]_ of this array. Let _L_ denote the number of distinct values amongst the knots in the knot list; _L_ will be referred to as the `upper index on knots'. Let _m~j~_ denote the multiplicity (i.e., number of repetitions) of the _j_th distinct knot value. Then: _ Σ^L^~i=1~ m~i~ = d + k + 2 _ All knot multiplicities except the first and the last shall be in the range _1 .... d_; the first and last may have a maximum value of _d + 1_. NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity _3_ is interpreted as a sequence _ u, u, u,_ in the knot array. The parametric volume is given by the equation: BSvol1.gif [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_volume] -- [[geometry_schema.b_spline_volume_with_knots]] ==== b_spline_volume_with_knots A *b_spline_volume_with_knots* is a type of <> in which the knot values are explicitly given. This subtype shall be used to represent non-uniform B-spline volumes, and may also be used for other knot types. All knot multiplicities except the first and the last shall be in the range _1 .... degree_; the first and last may have a maximum value of _degree + 1_. NOTE: In evaluating the basis functions, a knot _u_ of, for example, multiplicity _3_ is interpreted as a sequence _u, u, u,_ in the knot array. [.underline]#EXPRESS specification:# [source] -- express_ref:[b_spline_volume_with_knots] -- [[geometry_schema.bezier_volume]] ==== bezier_volume A *bezier_volume* is a type of <> in which the knots are evenly spaced and have high multiplicities. Suitable default values for the knots and knot multiplicities are derived in this case. In this subtype the knot spacing is 1.0, starting from 0.0 NOTE: If explicit knot values for the volume are required, they can be derived as follows: * ku_up := (SELF\backslash b_spline_volume.u_upper)/(SELF\backslash b_spline_volume.u_degree* + 1) * kv_up := (SELF\backslash b_spline_volume.v_upper)/(SELF\backslash b_spline_volume.v_degree* + 1) * kw_up := (SELF\backslash b_spline_volume.w_upper)/(SELF\backslash b_spline_volume.w_degree* + 1) *ku_up* is the value required for the upper index on the knot and knot multiplicity lists in the u direction. This is computed from the degree and the number of control values in this direction. Similar computations are used to determine *kv_up, kw_up*. The knot multiplicities and knots in the _u, v_ and _w_ parameter directions are then given by the function calls: <>(SELF\b_spline_volume.u_degree, ku_up, bezier_knots) <>(SELF\b_spline_volume.u_degree,ku_up, bezier_knots) <>(SELF\b_spline_volume.v_degree, kv_up, bezier_knots) <>(SELF\b_spline_volume.v_degree,kv_up, bezier_knots) <>(SELF\b_spline_volume.w_degree, kw_up, bezier_knots) <>(SELF\b_spline_volume.w_degree,kw_up, bezier_knots) [.underline]#EXPRESS specification:# [source] -- express_ref:[bezier_volume] -- [[geometry_schema.uniform_volume]] ==== uniform_volume A *uniform_volume* is a type of <> in which the knots are evenly spaced. Suitable default values for the knots and knot multiplicities can be derived in this case. A B-spline is {_uniform_ if and only if all knots are of multiplicity 1 and they differ by a positive constant from the preceding knot. In this subtype the knot spacing is 1.0, starting from _-degree_. NOTE: If explicit knot values for the volume are required, they can be derived as follows: * ku_up := SELF\backslash b_spline_volume.u_upper + SELF\backslash b_spline_volume.u_degree* + 2 * kv_up := SELF\backslash b_spline_volume.u_upper + SELF\backslash b_spline_volume.v_degree* + 2 * kw_up := SELF\backslash b_spline_volume.u_upper + SELF\backslash b_spline_volume.w_degree* + 2 *ku_up* is the value required for the upper index on the knot and knot multiplicity lists in the u direction. This is computed from the degree and the number of control values in this direction. Similar computations are used to determine *kv_up, kw_up*. The knot multiplicities and knots in the _u, v_ and _w_ parameter directions are then given by the function calls: <>(SELF\b_spline_volume.u_degree, ku_up, uniform_knots) <>(SELF\b_spline_volume.u_degree,ku_up, uniform_knots) <>(SELF\b_spline_volume.v_degree, kv_up, uniform_knots) <>(SELF\b_spline_volume.v_degree,kv_up, uniform_knots) <>(SELF\b_spline_volume.w_degree, kw_up, uniform_knots) <>(SELF\b_spline_volume.w_degree,kw_up, uniform_knots) [.underline]#EXPRESS specification:# [source] -- express_ref:[uniform_volume] -- [[geometry_schema.quasi_uniform_volume]] ==== quasi_uniform_volume A *quasi_uniform_volume* is a type of <> in which the knots are evenly spaced, and except for the first and last, have multiplicity 1. Suitable default values for the knots and knot multiplicities are derived in this case. A B-spline is _quasi-uniform_ if and only if the knots are of multiplicity (degree+1) at the ends, of multiplicity 1 elsewhere, and they differ by a positive constant from the preceding knot. In this subtype the knot spacing is 1.0, starting from 0.0. NOTE: If explicit knot values for the volume are required, they can be derived as follows: * ku_up := SELF\backslash b_spline_volume.u_upper - SELF\backslash b_spline_volume.u_degree* + 2 * kv_up := SELF\backslash b_spline_volume.u_upper - SELF\backslash b_spline_volume.v_degree* + 2 * kw_up := SELF\backslash b_spline_volume.u_upper - SELF\backslash b_spline_volume.w_degree* + 2 *ku_up* is the value required for the upper index on the knot and knot multiplicity lists in the u direction. This is computed from the degree and the number of control values in this direction. Similar computations are used to determine *kv_up, kw_up*. The knot multiplicities and knots in the _u, v_ and _w_ parameter directions are then given by the function calls: <>(SELF\b_spline_volume.u_degree, ku_up, quasi_uniform_knots) <>(SELF\b_spline_volume.u_degree,ku_up, quasi_uniform_knots) <>(SELF\b_spline_volume.v_degree, kv_up, quasi_uniform_knots) <>(SELF\b_spline_volume.v_degree,kv_up, quasi_uniform_knots) <>(SELF\b_spline_volume.w_degree, kw_up, quasi_uniform_knots) <>(SELF\b_spline_volume.w_degree,kw_up, quasi_uniform_knots) [.underline]#EXPRESS specification:# [source] -- express_ref:[quasi_uniform_volume] -- [[geometry_schema.rational_b_spline_volume]] ==== rational_b_spline_volume A *rational_b_spline_volume* is a type of <> that is a piecewise parametric rational volume described in terms of control points, associated weight values and basis functions. It is instantiated with any of the other subtypes of <>, which provide explicit or implicit knot values from which the basis functions are defined. The volume is to be interpreted as follows: BSvol2.gif NOTE: See <> for details of the symbology used in the above equation. [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_b_spline_volume] -- [[geometry_schema.locally_refined_spline_volume]] ==== locally_refined_spline_volume A *locally_refined_spline_volume* is a type of <> that is a piecewise parametric polynomial or rational volume described in terms of control points and local B-spline functions. If the set of B-spline functions are linearly independent, they will form a basis. With appropriate attribute values, the volume is capable of representing single span or spline volumes of explicit polynomial, rational, Bézier or B-spline type. However, the *locally_ refined_spline_volume* entity is intended for spline volumes that do not have a tensor product structure. The degree of the volume can vary as the B-splines from which it is defined, need not to have the same polynomial degree. [[note_1]] NOTE: A locally refined spline volume is rational if and only if the weights are not all identical; this can be represented by the <> subtype. If it is polynomial, the weights may be defaulted to all being 1. The entity *locally_refined_spline_volume* can, with proper pre and post processing, be used to represent volumes of the types: * analysis suitable T-spline, * standard T-spline, * semi-standard T-spline, * hierarchical B-spline * LR B-spline. Interpretation of the data is as follows: The volume, in the polynomial case, is given by: LRvol.gif In the rational case all weights shall be positive and the volume is given by: RationalLRvol.gif where stem:[*K* = number of control points, ]stem:[*P*~_i_~ = control points(_i_),]stem:[_s~i~_= scaling_factors(_i_),]stem:[_h~i~_ = weights_data(_i_),]stem:[N~_i_~^d1^(_u_) = u_bspline(_i_), and]stem:[d1=u_degree. ]stem:[N~_i_~^d2^(_v_) = v_bspline(_i_), and]stem:[d2=v_degree. ]stem:[N~_i_~^d3^(_w_) = v_bspline(_i_), and]stem:[d3=v_degree. ] [[note_2]] NOTE: The degrees are associated with the <>s and do not need to be constant throughout the volume. The weights, in the case of the rational subtype, are given in the same sequence as the coefficients. The knot values and multiplicities are defined in the entity <>. The B-splines are defined over a domain described by knot vectors in the parameter directions of the volume. However, in contrast to B-bspline volumes, the basis functions or B-splines do not need to adapt to all knot lines in their supports. This facilitates the definition of a spline volume on a box partition. [[note_3]] NOTE: When the polynomial degree is the same for all B-splines and no knot lines exist that do not cross the entire parameter domain, the locally_refined_spline_volume will coincide with <>. In that case <> has the simplest and most compact representation. [[note_4]] NOTE: A *locally_refined_spline_volume* can be of type analysis suitable T-spline, hierarchical B-spline, LR-spline, semi standard T-spline or standard T-spline. The type is given by the enumeration locally_refined_spline_type_enum, and the packing and unpacking of the volume will depend on this type. [.underline]#EXPRESS specification:# [source] -- express_ref:[locally_refined_spline_volume] -- [[geometry_schema.rational_locally_refined_spline_volume]] ==== rational_locally_refined_spline_volume A *rational_locally_refined_spline_volume* is a type of <> that is a piecewise parametric rational volume described in terms of control points and local B-spline functions. [.underline]#EXPRESS specification:# [source] -- express_ref:[rational_locally_refined_spline_volume] -- [[functions]] == geometry_schema function definitions [[geometry_schema.above_plane]] ==== above_plane The *above_plane* function tests whether, or not, four <>s are coplanar. If the input arguments are two-dimensional an indeterminate result is returned. The function returns a zero value if the input arguments are coplanar. If the points are not coplanar the function returns the distance the fourth point is above the plane of the first 3 points, (*p1*, *p2*, *p3*), a negative result indicates that the fourth point is below this plane. Above is defined to be the side from which the the loop *p1**p2**p3* appears in counter-clockwise order. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION above_plane (p1 : #geometry_schema.cartesian_point[cartesian_point]; p2 : #geometry_schema.cartesian_point[cartesian_point]; p3 : #geometry_schema.cartesian_point[cartesian_point]; p4 : #geometry_schema.cartesian_point[cartesian_point]) : REAL; LOCAL dir2, dir3, dir4 : direction := dummy_gri || direction([1.0, 0.0, 0.0]); val, mag : REAL; END_LOCAL; IF (p1.dim <> 3) THEN RETURN(?); END_IF; REPEAT i := 1 TO 3; dir2.direction_ratios[i] := p2.coordinates[i] - p1.coordinates[i]; dir3.direction_ratios[i] := p3.coordinates[i] - p1.coordinates[i]; dir4.direction_ratios[i] := p4.coordinates[i] - p1.coordinates[i]; mag := dir4.direction_ratios[i]*dir4.direction_ratios[i]; END_REPEAT; mag := sqrt(mag); val := mag*dot_product(dir4, cross_product(dir2, dir3).orientation); RETURN(val); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.above_plane.p1]]*p1:* (input) the first <> to be tested as a member of a coplanar set; [[geometry_schema.above_plane.p2]]*p2:* the second <> to be tested as a member of a coplanar set; [[geometry_schema.above_plane.p3]]*p3:* (input) the third <> to be tested as a member of a coplanar set; [[geometry_schema.above_plane.p4]]*p4:* the fourth <> to be tested as a member of a coplanar set; [[geometry_schema.acyclic_curve_replica]] ==== acyclic_curve_replica The *acyclic_curve_replica* boolean function is a recursive function which determines whether, or not, a given <> participates in its own definition. The function returns FALSE if the <> refers to itself, directly or indirectly, in its own definition. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION acyclic_curve_replica (rep : #geometry_schema.curve_replica[curve_replica]; parent : #geometry_schema.curve[curve]) : BOOLEAN; IF NOT (('GEOMETRY_SCHEMA.CURVE_REPLICA') IN TYPEOF(parent)) THEN RETURN (TRUE); END_IF; (* Return TRUE if the parent is not of type curve_replica *) IF (parent :=: rep) THEN RETURN (FALSE); (* Return FALSE if the parent is the same curve_replica, otherwise, call function again with the parents own parent_curve. *) ELSE RETURN(acyclic_curve_replica(rep, parent\curve_replica.parent_curve)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.acyclic_curve_replica.rep]]*rep:* (input) The <> which is to be tested for a cyclic reference. [[geometry_schema.acyclic_curve_replica.parent]]*parent:* a <> used in the definition of the replica. [[geometry_schema.acyclic_point_replica]] ==== acyclic_point_replica The *acyclic_point_replica* boolean function is a recursive function which determines whether, or not, a given <> participates in its own definition. The function returns FALSE if the <> refers to itself, directly or indirectly, in its own definition. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION acyclic_point_replica (rep : #geometry_schema.point_replica[point_replica]; parent : #geometry_schema.point[point]) : BOOLEAN; IF NOT (('GEOMETRY_SCHEMA.POINT_REPLICA') IN TYPEOF(parent)) THEN RETURN (TRUE); END_IF; (* Return TRUE if the parent is not of type point_replica *) IF (parent :=: rep) THEN RETURN (FALSE); (* Return FALSE if the parent is the same point_replica, otherwise, call function again with the parents own parent_pt. *) ELSE RETURN(acyclic_point_replica(rep, parent\point_replica.parent_pt)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.acyclic_point_replica.rep]]*rep:* (input) the <> which is to be tested for acyclic reference; [[geometry_schema.acyclic_point_replica.parent]]*parent:* (input) the <> used to define the replica. [[geometry_schema.acyclic_surface_replica]] ==== acyclic_surface_replica The *acyclic_surface_replica* boolean function is a recursive function which determines whether, or not, a given <> participates in its own definition. The function returns FALSE if the <> refers to itself, directly or indirectly, in its own definition. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION acyclic_surface_replica (rep : #geometry_schema.surface_replica[surface_replica]; parent : #geometry_schema.surface[surface]) : BOOLEAN; IF NOT (('GEOMETRY_SCHEMA.SURFACE_REPLICA') IN TYPEOF(parent)) THEN RETURN (TRUE); END_IF; (* Return TRUE if the parent is not of type surface_replica *) IF (parent :=: rep) THEN RETURN (FALSE); (* Return FALSE if the parent is the same surface_replica, otherwise, call function again with the parents own parent_surface. *) ELSE RETURN(acyclic_surface_replica(rep, parent\surface_replica.parent_surface)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.acyclic_surface_replica.rep]]*rep:* (input) The <> which is to be tested for acyclic reference. [[geometry_schema.acyclic_surface_replica.parent]]*parent:* (input) A <> used in the definition of the replica. [[geometry_schema.associated_surface]] ==== associated_surface The *associated_surface* function determines the unique surface which is associated with the <> type. It is required by the propositions which apply to surface curve and its subtypes. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION associated_surface (arg : #geometry_schema.pcurve_or_surface[pcurve_or_surface]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.surface[surface]; LOCAL surf : surface; END_LOCAL; IF 'GEOMETRY_SCHEMA.PCURVE' IN TYPEOF(arg) THEN surf := arg\pcurve.basis_surface; ELSE surf := arg; END_IF; RETURN(surf); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.associated_surface.arg]]*arg:* (input) The <> for which the determination of the associated parent surface is required. [[geometry_schema.base_axis]] ==== base_axis The *base_axis* function returns normalised orthogonal directions, *u[1], u[2]* and, if appropriate, *u[3]*. In the three-dimensional case, with complete input data, *u[3]* is in the direction of *axis3, u[1]* is in the direction of the projection of *axis1* onto the plane normal to *u[3]*, and *u[2]* is orthogonal to both *u[1]* and *u[3]*, taking the same sense as *axis2*. In the two-dimensional case *u[1]* is in the direction of *axis1* and *u[2]* is perpendicular to this, taking its sense from *axis2*. For incomplete input data appropriate default values are derived. NOTE: This function does not provide geometric founding for the <>s returned, the caller of the the function is responsible for ensuring that they are used in a *representation* with a *geometric_representation_context*. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION base_axis (dim : INTEGER; axis1 : #geometry_schema.direction[direction]; axis2 : #geometry_schema.direction[direction]; axis3 : #geometry_schema.direction[direction]) : LIST[2:3] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL u : LIST [2:3] OF direction; factor : REAL; d1, d2 : direction; END_LOCAL; IF (dim = 3) THEN d1 := NVL(normalise(axis3), dummy_gri || direction([0.0,0.0,1.0])); d2 := first_proj_axis(d1,axis1); u := [d2, second_proj_axis(d1,d2,axis2), d1]; ELSE IF EXISTS(axis1) THEN d1 := normalise(axis1); u := [d1, orthogonal_complement(d1)]; IF EXISTS(axis2) THEN factor := dot_product(axis2,u[2]); IF (factor < 0.0) THEN u[2].direction_ratios[1] := -u[2].direction_ratios[1]; u[2].direction_ratios[2] := -u[2].direction_ratios[2]; END_IF; END_IF; ELSE IF EXISTS(axis2) THEN d1 := normalise(axis2); u := [orthogonal_complement(d1), d1]; u[1].direction_ratios[1] := -u[1].direction_ratios[1]; u[1].direction_ratios[2] := -u[1].direction_ratios[2]; ELSE u := [dummy_gri || direction([1.0, 0.0]), dummy_gri || direction([0.0, 1.0])]; END_IF; END_IF; END_IF; RETURN(u); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.base_axis.dim]]*dim:* (input) The integer value of the dimensionality of the space in which the normalised orthogonal directions are required. [[geometry_schema.base_axis.axis1]]*axis1:* (input) A direction used as a first approximation to the direction of output axis *u[1]*. [[geometry_schema.base_axis.axis2]]*axis2:* (input) A direction used to determine the sense of *u[2]*. [[geometry_schema.base_axis.axis3]]*axis3:* (input) The direction of *u[3]* in the case *dim* = 3, or indeterminate in the case *dim* = 2. [[geometry_schema.build_2axes]] ==== build_2axes The *build_2axes* function returns two normalised orthogonal directions. *u[1]* is in the direction of *ref_direction* and *u[2]* is perpendicular to *u[1]*. A default value of (1.0, 0.0) is supplied for *ref_direction* if the input data is incomplete. NOTE: This function does not provide geometric founding for the *direction*s returned, the caller of the the function is responsible for ensuring that they are used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION build_2axes (ref_direction : #geometry_schema.direction[direction]) : LIST[2:2] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL d : direction := NVL(normalise(ref_direction), dummy_gri || direction([1.0,0.0])); END_LOCAL; RETURN([d, orthogonal_complement(d)]); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.build_2axes.ref_direction]]*ref_direction:* (input) A reference <> in 2 dimensional space, this may be defaulted to (1.0, 0.0). [[geometry_schema.build_axes]] ==== build_axes The *build_axes* function returns three normalised orthogonal <>s. *u[3]* is in the direction of *axis*, *u[1]* is in the direction of the projection of *ref_direction* onto the plane normal to *u[3]*, and *u[2]* is the cross product of *u[3]* and *u[1]*. Default values are supplied if input data is incomplete. NOTE: This function does not provide geometric founding for the <>s returned, the caller of the the function is responsible for ensuring that they are used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION build_axes (axis : #geometry_schema.direction[direction]; ref_direction : #geometry_schema.direction[direction]) : LIST[3:3] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL d1, d2 : direction; END_LOCAL; d1 := NVL(normalise(axis), dummy_gri || direction([0.0,0.0,1.0])); d2 := first_proj_axis(d1, ref_direction); RETURN([d2, normalise(cross_product(d1,d2))\vector.orientation, d1]); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.build_axes.axis]]*axis:* (input) The intended <> of *u[3]*, this may be defaulted to (0.0, 0.0, 1.0). [[geometry_schema.build_axes.ref_direction]]*ref_direction:* (input) A <> in a direction used to compute *u[1]*. [[geometry_schema.check_geometric_dimension]] ==== check_geometric_dimension The *check_geometric_dimension * function checks that whenever a <>.is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] the number of coordinates is equal to the dimensionality of the corresponding <>. The function also checkes that whenever a <>.is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] the number of direction ratios is equal to the dimensionality of the corresponding <>. The function first determines whether there are mixed dimensions in the contexts, if not a simple check of the numbers of coordinates or direction ratios is sufficient. In other cases each point or direction is checked against the dimensionalites of all the contexts in which it is used. The value FALE is returned if any mis-match of dimensions is detected. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION check_geometric_dimension (capt : SET[0:?] OF #geometry_schema.cartesian_point[cartesian_point]; dir : SET[0:?] OF #geometry_schema.direction[direction]; grc : SET[0:?] OF #geometry_schema.geometric_representation_context[geometric_representation_context]) : BOOLEAN; LOCAL globaldim : INTEGER := 0; (* means mixed dimensionality *) reps : SET [0:?] OF representation := []; result : BOOLEAN := TRUE; (* means no error *) END_LOCAL; IF (SIZEOF(grc) = 0) THEN RETURN(FALSE); END_IF; globaldim:= geometric_dimensionalities_in_contexts(grc); IF (globaldim > 0) then (* Same dimension for all contexts; only one check needed. *) IF (SIZEOF(capt) > 0) THEN REPEAT i := 1 TO HIINDEX(capt); IF (HIINDEX(capt[i].coordinates) <> globaldim) THEN RETURN(FALSE); END_IF; END_REPEAT; END_IF; IF (SIZEOF(dir) > 0) THEN REPEAT i := 1 TO HIINDEX(dir); IF (HIINDEX(dir[i].direction_ratios) <> globaldim) THEN RETURN(FALSE); END_IF; END_REPEAT; END_IF; RETURN(result); ELSE (* globaldim=0, mixed dimensions for contexts; check needed for context of each representation in which gri is used. *) IF (SIZEOF(capt) > 0) THEN REPEAT i := 1 TO HIINDEX(capt); reps := using_representations(capt[i]); IF (SIZEOF(reps) > 0) THEN REPEAT j := 1 TO HIINDEX(reps); IF (HIINDEX(capt[i].coordinates) <> reps[j].context_of_items\geometric_representation_context.coordinate_space_dimension) THEN RETURN(FALSE); END_IF; END_REPEAT; ELSE (* zero reps *) RETURN(FALSE); END_IF; END_REPEAT; END_IF; IF (SIZEOF(dir) > 0) THEN REPEAT i := 1 TO HIINDEX(dir); (* globaldim=0, Mixed dimensions for contexts, check needed for context of each representation in which gri is used *) reps := using_representations(dir[i]); IF (SIZEOF(reps) > 0) THEN REPEAT j := 1 TO HIINDEX(reps); IF (HIINDEX(dir[i].direction_ratios) <> reps[j].context_of_items\geometric_representation_context.coordinate_space_dimension) THEN RETURN(FALSE); END_IF; END_REPEAT; ELSE (* zero reps *) RETURN(FALSE); END_IF; END_REPEAT; END_IF; END_IF; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.check_geometric_dimension.capt]]*capt:* (input) A set of <>s to be checked against context dimensionalities. [[geometry_schema.check_geometric_dimension.dir]]*dir:* (input) A set of <>s to be checked against context dimensionalities. [[geometry_schema.check_geometric_dimension.grc]]*grc:* (input) The set of <>s in which the points or directions might be used. [[geometry_schema.constraints_composite_curve_on_surface]] ==== constraints_composite_curve_on_surface The *constraints_composite_curve_on_surface* This function checks that the curves referenced by the segments of the <> are all curves on surface, including the <> type, which is admissible as a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_composite_curve_on_surface (c : #geometry_schema.composite_curve_on_surface[composite_curve_on_surface]) : BOOLEAN; LOCAL n_segments : INTEGER := SIZEOF(c.segments); END_LOCAL; REPEAT k := 1 TO n_segments; IF (NOT('GEOMETRY_SCHEMA.PCURVE' IN TYPEOF(c\composite_curve.segments[k].parent_curve))) AND (NOT('GEOMETRY_SCHEMA.SURFACE_CURVE' IN TYPEOF(c\composite_curve.segments[k].parent_curve))) AND (NOT('GEOMETRY_SCHEMA.COMPOSITE_CURVE_ON_SURFACE' IN TYPEOF(c\composite_curve.segments[k].parent_curve))) THEN RETURN (FALSE); END_IF; END_REPEAT; RETURN(TRUE); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.constraints_composite_curve_on_surface.c]]*c:* (input) A <> to be verified. [[geometry_schema.constraints_param_b_spline]] ==== constraints_param_b_spline The *constraints_param_b_spline* function checks the parametrisation of a B-spline curve or (one of the directions of) a B-spline surface or volume and returns TRUE if no inconsistencies are found. These constraints are: Degree ≥ 1. Upper index on knots ≥ 2. Upper index on control points ≥ degree. Sum of knot multiplicities = degree + (upper index on control points) + 2. For the first and last knot the multiplicity is bounded by 1 and (degree+1). For all other knots the knot multiplicity is bounded by 1 and degree. The consecutive knots are increasing in value. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_param_b_spline (degree : INTEGER; up_knots : INTEGER; up_cp : INTEGER; knot_mult : LIST[0:?] OF INTEGER; knots : LIST[0:?] OF ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.parameter_value[parameter_value]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; k, sum : INTEGER; END_LOCAL; (* Find sum of knot multiplicities. *) sum := knot_mult[1]; REPEAT i := 2 TO up_knots; sum := sum + knot_mult[i]; END_REPEAT; (* Check limits holding for all B-spline parametrisations *) IF (degree < 1) OR (up_knots < 2) OR (up_cp < degree) OR (sum <> (degree + up_cp + 2)) THEN result := FALSE; RETURN(result); END_IF; k := knot_mult[1]; IF (k < 1) OR (k > degree + 1) THEN result := FALSE; RETURN(result); END_IF; REPEAT i := 2 TO up_knots; IF (knot_mult[i] < 1) OR (knots[i] <= knots[i-1]) THEN result := FALSE; RETURN(result); END_IF; k := knot_mult[i]; IF (i < up_knots) AND (k > degree) THEN result := FALSE; RETURN(result); END_IF; IF (i = up_knots) AND (k > degree + 1) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.constraints_param_b_spline.degree]]*degree:* (input) an integer defining the degree of the B-spline basis functions. [[geometry_schema.constraints_param_b_spline.up_knots]]*up_knots:* (input) an integer giving the upper index of the list of knot multiplicities. [[geometry_schema.constraints_param_b_spline.up_cp]]*up_cp:* ((input) an integer which is the upper index of the control points for the curve or surface being checked for consistency of its parameter values; [[geometry_schema.constraints_param_b_spline.knot_mult]]*knot_mult:* (input) the list of knot multiplicities; [[geometry_schema.constraints_param_b_spline.knots]]*knots:* (input) the list of knot values to be checked. [[geometry_schema.constraints_param_local_b_spline]] ==== constraints_param_local_b_spline The *constraints_param_local_b_spline* function checks the parameters defining a <> and returns TRUE if no inconsistencies are found. These constraints are: These constraints are: Degree ≥= 1. Upper index on knots ≥= 2. Sum of knot multiplicities = degree + 2. For the first and last knot the multiplicity is bounded by 1 and (degree+1). For all other knots the knot multiplicity is bounded by 1 and degree. The first knot pointer is at least 1 and consecutive knot pointers are increasing in value. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_param_local_b_spline (degree : INTEGER; knot_mult : LIST[0:?] OF INTEGER; knots : LIST[0:?] OF INTEGER) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; k, up_knots, sum : INTEGER; END_LOCAL; (* Find sum of knot multiplicities. *) up_knots := SIZEOF(knots); sum := knot_mult[1]; REPEAT i := 2 TO up_knots; sum := sum + knot_mult[i]; END_REPEAT; (* Check limits holding for all B-spline parametrisations *) IF (degree < 1) OR (up_knots < 2) OR (sum <> (degree + 2)) THEN result := FALSE; RETURN(result); END_IF; k := knot_mult[1]; IF (k < 1) OR (k > degree + 1) THEN result := FALSE; RETURN(result); END_IF; (* first pointer shall be 1 or more *) IF (knots[1] < 1) THEN result := FALSE; END_IF; REPEAT i := 2 TO up_knots; IF (knot_mult[i] < 1) OR (knots[i] <= knots[i-1]) THEN result := FALSE; RETURN(result); END_IF; k := knot_mult[i]; IF (i < up_knots) AND (k > degree) THEN result := FALSE; RETURN(result); END_IF; IF (i = up_knots) AND (k > degree + 1) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.constraints_param_local_b_spline.degree]]*degree:* (input) an integer defining the degree of the B-spline basis functions. [[geometry_schema.constraints_param_local_b_spline.knot_mult]]*knot_mult:* (input) the list of knot multiplicities; [[geometry_schema.constraints_param_local_b_spline.knots]]*knots:* (input) the list of integer pointers to the knot values. [[geometry_schema.constraints_rectangular_composite_surface]] ==== constraints_rectangular_composite_surface The *constraints_rectangular_composite_surface* functions checks the following constraints on the attributes of a rectangular composite surface: that the component surfaces are all either rectangular trimmed surfaces or B-spline surfaces; that the *transition* attributes of the segments array do not contain the value *discontinuous* except for the last row or column, where they indicate that the surface is not closed in the appropriate direction. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_rectangular_composite_surface (s : #geometry_schema.rectangular_composite_surface[rectangular_composite_surface]) : BOOLEAN; REPEAT i := 1 TO s.n_u; REPEAT j := 1 TO s.n_v; IF NOT (('GEOMETRY_SCHEMA.B_SPLINE_SURFACE' IN TYPEOF (s.segments[i][j].parent_surface)) OR ('GEOMETRY_SCHEMA.RECTANGULAR_TRIMMED_SURFACE' IN TYPEOF (s.segments[i][j].parent_surface))) THEN RETURN(FALSE); END_IF; END_REPEAT; END_REPEAT; (* Check the transition codes, omitting the last row or column *) REPEAT i := 1 TO s.n_u-1; REPEAT j := 1 TO s.n_v; IF s.segments[i][j].u_transition = discontinuous THEN RETURN(FALSE); END_IF; END_REPEAT; END_REPEAT; REPEAT i := 1 TO s.n_u; REPEAT j := 1 TO s.n_v-1; IF s.segments[i][j].v_transition = discontinuous THEN RETURN(FALSE); END_IF; END_REPEAT; END_REPEAT; RETURN(TRUE); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.constraints_rectangular_composite_surface.s]]*s:* (input) A rectangular composite surface to be verified. [[geometry_schema.constraints_scaling]] ==== constraints_scaling The *constraints_scaling* function checks the scaling factors associated with the control points of a locally refined curve, surface or volume and returns TRUE if they are all positive and less than 1.0. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_scaling (factors : LIST[0:?] OF REAL) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT i := 1 TO SIZEOF(factors); IF NOT({0.0 < factors[i] <= 1.0}) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.constraints_scaling.factors]]*factors:* (input) a LIST of scaling factor values to be tested. [[geometry_schema.cross_product]] ==== cross_product The *cross_product* function returns the vector, or cross, product of two input <>s. The input <>s must be three-dimensional and are normalised at the start of the computation. The result is always a <> which is unitless. If the input <>s are either parallel or anti-parallel, a <> of zero magnitude is returned with <> as *arg1*. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION cross_product (arg1 : #geometry_schema.direction[direction]; arg2 : #geometry_schema.direction[direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.vector[vector]; LOCAL mag : REAL; res : direction; v1,v2 : LIST[3:3] OF REAL; result : vector; END_LOCAL; IF ( NOT EXISTS (arg1) OR (arg1.dim = 2)) OR ( NOT EXISTS (arg2) OR (arg2.dim = 2)) THEN RETURN(?); ELSE BEGIN v1 := normalise(arg1).direction_ratios; v2 := normalise(arg2).direction_ratios; res := dummy_gri || direction([(v1[2]*v2[3] - v1[3]*v2[2]), (v1[3]*v2[1] - v1[1]*v2[3]), (v1[1]*v2[2] - v1[2]*v2[1])]); mag := 0.0; REPEAT i := 1 TO 3; mag := mag + res.direction_ratios[i]*res.direction_ratios[i]; END_REPEAT; IF (mag > 0.0) THEN result := dummy_gri || vector(res, SQRT(mag)); ELSE result := dummy_gri || vector(arg1, 0.0); END_IF; RETURN(result); END; END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.cross_product.arg1]]*arg1:* (input) a <> defining the first operand in cross product operation. [[geometry_schema.cross_product.arg2]]*arg2:* (input) a <> defining the second operand for cross product. [[geometry_schema.curve_weights_positive]] ==== curve_weights_positive The *curve_weights_positive* function checks the weights associated with the control points of a <> and returns TRUE if they are all positive. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION curve_weights_positive (b : #geometry_schema.rational_b_spline_curve[rational_b_spline_curve]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT i := 0 TO b.upper_index_on_control_points; IF b.weights[i] <= 0.0 THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.curve_weights_positive.b]]*b:* (input) a rational B-spline curve for which the weight values are to be tested. [[geometry_schema.default_b_spline_curve_weights]] ==== default_b_spline_curve_weights The *default_b_spline_curve_weights* function returns *up_cp* weights equal to 1.0 in an array of real. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION default_b_spline_curve_weights (up_cp : INTEGER) : ARRAY[0:up_cp] OF REAL; RETURN([1:up_cp + 1]); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.default_b_spline_curve_weights.up_cp]]*up_cp:* (input) an integer defining the upper index on the array of the B-spline curve weights required. [[geometry_schema.default_b_spline_knot_mult]] ==== default_b_spline_knot_mult The *default_b_spline_knot_mult* function returns the integer list of knot multiplicities, depending on the type of knot vector, for the B-spline parametrisation. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION default_b_spline_knot_mult (degree : INTEGER; up_knots : INTEGER; uniform : #geometry_schema.knot_type[knot_type]) : LIST[2:?] OF INTEGER; LOCAL knot_mult : LIST [1:up_knots] OF INTEGER; END_LOCAL; IF uniform = uniform_knots THEN knot_mult := [1:up_knots]; ELSE IF uniform = quasi_uniform_knots THEN knot_mult := [1:up_knots]; knot_mult[1] := degree + 1; knot_mult[up_knots] := degree + 1; ELSE IF uniform = piecewise_bezier_knots THEN knot_mult := [degree:up_knots]; knot_mult[1] := degree + 1; knot_mult[up_knots] := degree + 1; ELSE knot_mult := [0:up_knots]; END_IF; END_IF; END_IF; RETURN(knot_mult); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.default_b_spline_knot_mult.degree]]*degree:* (input) an integer defining the degree of the B-spline basis functions. [[geometry_schema.default_b_spline_knot_mult.up_knots]]*up_knots:* (input) an integer which gives the number of knot multiplicities required. [[geometry_schema.default_b_spline_knot_mult.uniform]]*uniform:* (input) the type of basis function for which knot multiplicities are required. [[geometry_schema.default_b_spline_knots]] ==== default_b_spline_knots The *default_b_spline_knots* function returns the knot vector, depending on the <>, for a B-spline parametrisation. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION default_b_spline_knots (degree : INTEGER; up_knots : INTEGER; uniform : #geometry_schema.knot_type[knot_type]) : LIST[2:?] OF ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.parameter_value[parameter_value]; LOCAL knots : LIST [1:up_knots] OF parameter_value := [0:up_knots]; ishift : INTEGER := 1; END_LOCAL; IF (uniform = uniform_knots) THEN ishift := degree + 1; END_if; IF (uniform = uniform_knots) OR (uniform = quasi_uniform_knots) OR (uniform = piecewise_bezier_knots) THEN REPEAT i := 1 TO up_knots; knots[i] := i - ishift; END_REPEAT; END_IF; RETURN(knots); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.default_b_spline_knots.degree]]*degree:* (input) an integer defining the degree of the B-spline basis functions. [[geometry_schema.default_b_spline_knots.up_knots]]*up_knots:* (input) an integer which gives the number of knot values required. [[geometry_schema.default_b_spline_knots.uniform]]*uniform:* (input) the type of basis function for which knots are required. [[geometry_schema.default_b_spline_surface_weights]] ==== default_b_spline_surface_weights The *default_b_spline_surface_weights* function returns weights equal to 1.0 in an array of real. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION default_b_spline_surface_weights (u_upper : INTEGER; v_upper : INTEGER) : ARRAY[0:u_upper] OF ARRAY[0:v_upper] OF REAL; RETURN([[1:v_upper + 1]:u_upper +1]); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.default_b_spline_surface_weights.u_upper]]*u_upper:* (input) an integer defining the upper index on the array of the B-spline surface weights required in the _u_ direction. [[geometry_schema.default_b_spline_surface_weights.v_upper]]*v_upper:* (input) an integer defining the upper index on the array of the B-spline surface weights required in the _v_ direction. [[geometry_schema.dimension_of]] ==== dimension_of The *dimension_of* function returns the dimensionality of the input <>. If the item is a <>, <>, or <>, the dimensionality is obtained directly by counting components. For all other other subtypes the dimensionality is the integer <> of a <> in which the input <> is geometrically founded. By virtue of the constraints in global rule <>, this value is the <> of the input <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION dimension_of (item : #geometry_schema.geometric_representation_item[geometric_representation_item]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.dimension_count[dimension_count]; LOCAL x : SET OF representation; y : representation_context; dim : dimension_count; END_LOCAL; -- For cartesian_point, direction, or vector dimension is determined by -- counting components. IF 'GEOMETRY_SCHEMA.CARTESIAN_POINT' IN TYPEOF(item) THEN dim := SIZEOF(item\cartesian_point.coordinates); RETURN(dim); END_IF; IF 'GEOMETRY_SCHEMA.DIRECTION' IN TYPEOF(item) THEN dim := SIZEOF(item\direction.direction_ratios); RETURN(dim); END_IF; IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(item) THEN dim := SIZEOF(item\vector.orientation\direction.direction_ratios); RETURN(dim); END_IF; -- For all other types of geometric_representation_item dim is obtained -- via context. -- Find the set of representation in which the item is used. x := using_representations(item); -- Determines the dimension_count of the -- geometric_representation_context. Note that the -- RULE compatible_dimension ensures that the context_of_items -- is of type geometric_representation_context and has -- the same dimension_count for all values of x. -- The SET x is non-empty for legal instances since this is required by WR1 of -- representation_item. IF (SIZEOF(x) > 0) THEN y := x[1].context_of_items; dim := y\geometric_representation_context.coordinate_space_dimension; RETURN (dim); ELSE RETURN(?); -- mark error by returning indeterminate result END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.dimension_of.item]]*item:* (input) a <> for which the <> is determined. [[geometry_schema.dot_product]] ==== dot_product The *dot_product* function returns the scalar, or dot (⋅), product of two <>s. The input arguments can be <>s in either two- or three-dimensional space and are normalised at the start of the computation. The returned scalar is undefined if the input <>s have different dimensionality, or if either is undefined. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION dot_product (arg1 : #geometry_schema.direction[direction]; arg2 : #geometry_schema.direction[direction]) : REAL; LOCAL scalar : REAL; vec1, vec2: direction; ndim : INTEGER; END_LOCAL; IF NOT EXISTS (arg1) OR NOT EXISTS (arg2) THEN scalar := ?; (* When function is called with invalid data an indeterminate result is returned *) ELSE IF (arg1.dim <> arg2.dim) THEN scalar := ?; (* When function is called with invalid data an indeterminate result is returned *) ELSE BEGIN vec1 := normalise(arg1); vec2 := normalise(arg2); ndim := arg1.dim; scalar := 0.0; REPEAT i := 1 TO ndim; scalar := scalar + vec1.direction_ratios[i]*vec2.direction_ratios[i]; END_REPEAT; END; END_IF; END_IF; RETURN (scalar); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.dot_product.arg1]]*arg1:* (input)a <> defining first vector in dot product, or scalar product, operation.. [[geometry_schema.dot_product.arg2]]*arg2:* (input) a <> defining second operand for dot product operation. [[geometry_schema.first_proj_axis]] ==== first_proj_axis The *first_proj_axis* function produces a 3-dimensional <> which is, with fully defined input, the projection of *arg* onto the plane normal to the *z_axis*. With *arg* defaulted the result is the projection of [1,0,0] onto this plane; except that, if *z_axis* = [1,0,0], or, *z_axis* = [-1,0,0], [0,1,0] is the default for *arg*. A violation occurs if *arg* is in the same direction as the input *z_axis*. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION first_proj_axis (z_axis : #geometry_schema.direction[direction]; arg : #geometry_schema.direction[direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL x_axis : direction; v : direction; z : direction; x_vec : vector; END_LOCAL; IF (NOT EXISTS(z_axis)) THEN RETURN (?) ; ELSE z := normalise(z_axis); IF NOT EXISTS(arg) THEN IF ((z.direction_ratios <> [1.0,0.0,0.0]) AND (z.direction_ratios <> [-1.0,0.0,0.0])) THEN v := dummy_gri || direction([1.0,0.0,0.0]); ELSE v := dummy_gri || direction([0.0,1.0,0.0]); END_IF; ELSE IF (arg.dim <> 3) THEN RETURN (?) ; END_IF; IF ((cross_product(arg,z).magnitude) = 0.0) THEN RETURN (?); ELSE v := normalise(arg); END_IF; END_IF; x_vec := scalar_times_vector(dot_product(v, z), z); x_axis := vector_difference(v, x_vec).orientation; x_axis := normalise(x_axis); END_IF; RETURN(x_axis); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.first_proj_axis.z_axis]]*z_axis:* (input) A <> defining a local Z coordinate axis. [[geometry_schema.first_proj_axis.arg]]*arg:* (input) A <> not parallel to *z_axis*.. [[geometry_schema.first_proj_axis.arg]]*arg:* (output) A <> which is in the direction of the projection of *arg* onto the plane with normal *z_axis*. [[geometry_schema.geometric_dimensionalities_in_contexts]] ==== geometric_dimensionalities_in_contexts The *geometric_dimensionalities_in_contexts* function checks the different values of dimensionality which are found in a set of <>s. If all contexts have the same <> then the integer value 1, 2, or 3 is returned depending upon the shared value for <>. If mixed values are found the ineger 0 is returned. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION geometric_dimensionalities_in_contexts (grcs : SET[1:?] OF #geometry_schema.geometric_representation_context[geometric_representation_context]) : INTEGER; LOCAL grcs_1d : INTEGER := 0; grcs_2d : INTEGER := 0; grcs_3d : INTEGER := 0; END_LOCAL; IF (SIZEOF(grcs) = 1) THEN (* only one geometric_context, will be one type of dimension anyway *) RETURN(grcs[1]\geometric_representation_context.coordinate_space_dimension); ELSE REPEAT i := 1 TO HIINDEX(grcs); IF (grcs[i]\geometric_representation_context.coordinate_space_dimension = 1) THEN grcs_1d := grcs_1d + 1; ELSE IF (grcs[i]\geometric_representation_context.coordinate_space_dimension = 2) THEN grcs_2d := grcs_2d + 1; ELSE IF (grcs[i]\geometric_representation_context.coordinate_space_dimension = 3) THEN grcs_3d := grcs_3d + 1; END_IF; END_IF; END_IF; END_REPEAT; END_IF; IF (grcs_1d + grcs_2d = 0) THEN RETURN(3); ELSE IF (grcs_1d + grcs_3d = 0) THEN RETURN(2); ELSE IF (grcs_2d + grcs_3d = 0) THEN RETURN(1); ELSE RETURN(0); (* multiple dimensions *) END_IF; END_IF; END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.geometric_dimensionalities_in_contexts.grcs]]*grcs:* (input) The set of <>s to be checked for mixed dimensionality. [[geometry_schema.get_basis_surface]] ==== get_basis_surface The *get_basis_surface* function returns the basis surface for a <> as a a set of <>s. For a curve which is not a <> an empty set is returned. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION get_basis_surface (c : #geometry_schema.curve_on_surface[curve_on_surface]) : SET[0:2] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.surface[surface]; LOCAL surfs : SET[0:2] OF surface; n : INTEGER; END_LOCAL; surfs := []; IF 'GEOMETRY_SCHEMA.PCURVE' IN TYPEOF (c) THEN surfs := [c\pcurve.basis_surface]; ELSE IF 'GEOMETRY_SCHEMA.SURFACE_CURVE' IN TYPEOF (c) THEN n := SIZEOF(c\surface_curve.associated_geometry); REPEAT i := 1 TO n; surfs := surfs + associated_surface(c\surface_curve.associated_geometry[i]); END_REPEAT; END_IF; END_IF; IF 'GEOMETRY_SCHEMA.COMPOSITE_CURVE_ON_SURFACE' IN TYPEOF (c) THEN (* For a composite_curve_on_surface the basis_surface is the intersection of the basis_surfaces of all the segments. *) n := SIZEOF(c\composite_curve.segments); surfs := get_basis_surface( c\composite_curve.segments[1].parent_curve); IF n > 1 THEN REPEAT i := 2 TO n; surfs := surfs * get_basis_surface( c\composite_curve.segments[i].parent_curve); END_REPEAT; END_IF; END_IF; RETURN(surfs); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.get_basis_surface.c]]*c:* (input) a <> for which the <> is to be determined. [[geometry_schema.increasing_values_in_list]] ==== increasing_values_in_list This function checks a list of real values and returns TRUE if they are in strictly ascending order. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION increasing_values_in_list (values : LIST[2:?] OF REAL) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; limit : INTEGER := SIZEOF(values); END_LOCAL; REPEAT i := 2 TO limit; IF values[i] <= values[i-1] THEN result := FALSE; END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.increasing_values_in_list.values]]*values:* (input) a list of real values to be tested. [[geometry_schema.list_to_array]] ==== list_to_array The *list_to_array* function converts a generic list to an array with pre-determined array bounds. If the array bounds are incompatible with the number of elements in the original list, a null result is returned. This function is used to construct the arrays of control points and weights used in the b-spline entities. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_to_array (lis : LIST[0:?] OF GENERIC; low : INTEGER; u : INTEGER) : ARRAY[low:u] OF GENERIC; LOCAL n : INTEGER; res : ARRAY [low:u] OF GENERIC : T; END_LOCAL; n := SIZEOF(lis); IF (n <> (u-low +1)) THEN RETURN(?); ELSE res := [lis[1] : n]; REPEAT i := 2 TO n; res[low+i-1] := lis[i]; END_REPEAT; RETURN(res); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.list_to_array.lis]]*lis:* (input) A list to be converted. [[geometry_schema.list_to_array.low]]*low:* (input) An integer specifying the required lower index of the output array. [[geometry_schema.list_to_array.u]]*u:* (input) An integer value for the upper index. [[geometry_schema.make_array_of_array]] ==== make_array_of_array The *make_array_of_array* function builds an array of arrays from a list of lists. The function first checks that the specified array dimensions are compatible with the sizes of the lists, and in particular, verifies that all the sub-lists contain the same number of elements. A null result is returned if the input data is incompatible with the dimensions. This function is used to construct the arrays of control points and weights for a B-spline surface. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION make_array_of_array (lis : LIST[1:?] OF LIST[1:?] OF GENERIC; low1 : INTEGER; u1 : INTEGER; low2 : INTEGER; u2 : INTEGER) : ARRAY[low1:u1] OF ARRAY[low2:u2] OF GENERIC; LOCAL res : ARRAY[low1:u1] OF ARRAY [low2:u2] OF GENERIC : T; END_LOCAL; (* Check input dimensions for consistency *) IF (u1-low1+1) <> SIZEOF(lis) THEN RETURN (?); END_IF; IF (u2 - low2 + 1 ) <> SIZEOF(lis[1]) THEN RETURN (?) ; END_IF; (* Initialise res with values from lis[1] *) res := [list_to_array(lis[1], low2, u2) : (u1-low1 + 1)]; REPEAT i := 2 TO HIINDEX(lis); IF (u2-low2+1) <> SIZEOF(lis[i]) THEN RETURN (?); END_IF; res[low1+i-1] := list_to_array(lis[i], low2, u2); END_REPEAT; RETURN (res); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.make_array_of_array.lis]]*lis:* (input) A list of list to be converted. [[geometry_schema.make_array_of_array.low1]]*low1:* (input) An integer specifying the required lower index of the first output array. [[geometry_schema.make_array_of_array.u1]]*u1:* (input) An integer value for the upper index of the first output array. [[geometry_schema.make_array_of_array.low2]]*low2:* (input) An integer specifying the required lower index of the second output array. [[geometry_schema.make_array_of_array.u2]]*u2:* (input) An integer value for the upper index of the second output array. [[geometry_schema.make_array_of_array_of_array]] ==== make_array_of_array_of_array The *make_array_of_array_of_array* function builds an array of arrays of arrays from a list of lists of lists. The function first checks that the specified array dimensions are compatible with the sizes of the lists, and in particular, verifies that all the sub-lists contain the correct numbers of elements. An indeterminate result is returned if the input data is incompatible with the dimensions. This function is used to construct the arrays of control points and weights for a B-spline volume. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION make_array_of_array_of_array (lis : LIST[1:?] OF LIST[1:?] OF LIST[1:?] OF GENERIC; low1 : INTEGER; u1 : INTEGER; low2 : INTEGER; u2 : INTEGER; low3 : INTEGER; u3 : INTEGER) : ARRAY[low1:u1] OF ARRAY[low2:u2] OF ARRAY[low3:u3] OF GENERIC; LOCAL res : ARRAY[low1:u1] OF ARRAY [low2:u2] OF ARRAY[low3:u3] OF GENERIC : T; END_LOCAL; (* Check input dimensions for consistency *) IF (u1-low1+1) <> SIZEOF(lis) THEN RETURN (?); END_IF; IF (u2-low2+1) <> SIZEOF(lis[1]) THEN RETURN (?); END_IF; (* Initialise res with values from lis[1] *) res := [make_array_of_array(lis[1], low2, u2, low3, u3) : (u1-low1 + 1)]; REPEAT i := 2 TO HIINDEX(lis); IF (u2-low2+1) <> SIZEOF(lis[i]) THEN RETURN (?); END_IF; res[low1+i-1] := make_array_of_array(lis[i], low2, u2, low3, u3); END_REPEAT; RETURN (res); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.make_array_of_array_of_array.lis]]*lis:* (input) A list of list of list to be converted. [[geometry_schema.make_array_of_array_of_array.low1]]*low1:* (input) An integer specifying the required lower index of the first output array. [[geometry_schema.make_array_of_array_of_array.u1]]*u1:* (input) An integer value for the upper index of the first output array. [[geometry_schema.make_array_of_array_of_array.low2]]*low2:* (input) An integer specifying the required lower index of the second output array. [[geometry_schema.make_array_of_array_of_array.u2]]*u2:* (input) An integer value for the upper index of the second output array. [[geometry_schema.make_array_of_array_of_array.low3]]*low3:* (input) An integer specifying the required lower index of the third output array. [[geometry_schema.make_array_of_array_of_array.u3]]*u3:* (input) An integer value for the upper index of the third output array. [[geometry_schema.normalise]] ==== normalise The *normalise* function returns a <> or <> whose components are normalised to have a sum of squares of 1.0. The output is of the same type (<> or <>, with the same units) as the input argument. If the input argument is not defined or is of zero length, the output vector is undefined. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION normalise (arg : #geometry_schema.vector_or_direction[vector_or_direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.vector_or_direction[vector_or_direction]; LOCAL ndim : INTEGER; v : direction := dummy_gri || direction ([1.0,0.0,0.0]); result : vector_or_direction; vec : vector := dummy_gri || vector (v, 1.0); mag : REAL; END_LOCAL; IF NOT EXISTS (arg) THEN result := ?; (* When function is called with invalid data a NULL result is returned *) ELSE ndim := arg.dim; IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg) THEN BEGIN v := dummy_gri || direction(arg\vector.orientation.direction_ratios); IF arg\vector.magnitude = 0.0 THEN RETURN(?); ELSE vec := dummy_gri || vector (v, 1.0); END_IF; END; ELSE v := dummy_gri || direction (arg.direction_ratios); END_IF; mag := 0.0; REPEAT i := 1 TO ndim; mag := mag + v.direction_ratios[i]*v.direction_ratios[i]; END_REPEAT; IF mag > 0.0 THEN mag := SQRT(mag); REPEAT i := 1 TO ndim; v.direction_ratios[i] := v.direction_ratios[i]/mag; END_REPEAT; IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg) THEN vec.orientation := v; result := vec; ELSE result := v; END_IF; ELSE RETURN(?); END_IF; END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.normalise.arg]]*arg:* (input)a <> or <> to be normalised. [[geometry_schema.orthogonal_complement]] ==== orthogonal_complement The *orthogonal_complement* function returns a <> which is the orthogonal complement of the input <>. The input <> shall be a two-dimensional <> and the result is two dimensional and perpendicular to the input <>. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION orthogonal_complement (vec : #geometry_schema.direction[direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL result : direction ; END_LOCAL; IF (vec.dim <> 2) OR NOT EXISTS (vec) THEN RETURN(?); ELSE result := dummy_gri || direction([-vec.direction_ratios[2], vec.direction_ratios[1]]); RETURN(result); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.orthogonal_complement.vec]]*vec:* (input) A <> in 2D space. [[geometry_schema.same_side]] ==== same_side The *same_side* function tests whether, or not, a list of 2 or more test points are on the same side of plane defined by three given points. If the input arguments are two-dimensional an indeterminate result is returned. The function returns TRUE if the *test_points* all lie on the same side of the plane defined by *plane_pts*, FALSE indicates that the *test_points* are not all on the same side of this plane. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION same_side (plane_pts : LIST[3:3] OF #geometry_schema.cartesian_point[cartesian_point]; test_points : LIST[2:?] OF #geometry_schema.cartesian_point[cartesian_point]) : BOOLEAN; LOCAL val1, val2 : REAL; n : INTEGER; END_LOCAL; IF (plane_pts[1].dim = 2) OR (test_points[1].dim = 2) THEN RETURN(?); END_IF; n := SIZEOF(test_points); val1 := above_plane(plane_pts[1], plane_pts[2], plane_pts[3], test_points[1] ); REPEAT i := 2 TO n; val2 := above_plane(plane_pts[1], plane_pts[2], plane_pts[3], test_points[i] ); IF (val1*val2 <= 0.0) THEN RETURN(FALSE); END_IF; END_REPEAT; RETURN(TRUE); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.same_side.plane_pts]]*plane_pts:* (input) The LIST of 3 <>s defining the plane used in the test. [[geometry_schema.same_side.test_points]]*test_points:* (input) The LIST of <>s to be tested for the property of lying on the same side of the plane. [[geometry_schema.scalar_times_vector]] ==== scalar_times_vector The *scalar_times_vector* function returns the <> that is the scalar multiple of the input vector. It accepts as input a scalar and a `vector' which may be either a <> or a <>. The output is a <> of the same units as the input <>, or unitless if a <> is input. If either input argument is undefined, the returned <> is also undefined. The <> of the <> is reversed if the scalar is negative. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION scalar_times_vector (scalar : REAL; vec : #geometry_schema.vector_or_direction[vector_or_direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.vector[vector]; LOCAL v : direction; mag : REAL; result : vector; END_LOCAL; IF NOT EXISTS (scalar) OR NOT EXISTS (vec) THEN RETURN (?) ; ELSE IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF (vec) THEN v := dummy_gri || direction(vec\vector.orientation.direction_ratios); mag := scalar * vec\vector.magnitude; ELSE v := dummy_gri || direction(vec.direction_ratios); mag := scalar; END_IF; IF (mag < 0.0 ) THEN REPEAT i := 1 TO SIZEOF(v.direction_ratios); v.direction_ratios[i] := -v.direction_ratios[i]; END_REPEAT; mag := -mag; END_IF; result := dummy_gri || vector(normalise(v), mag); END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.scalar_times_vector.scalar]]*scalar:* (input) a real number to participate in the product. [[geometry_schema.scalar_times_vector.vec]]*vec:* (input) a <> or <> which is to be multiplied. [[geometry_schema.second_proj_axis]] ==== second_proj_axis The *second_proj_axis* function returns the normalised <> that is simultaneously the projection of *arg* onto the plane normal to the <>  *z_axis* and onto the plane normal to the <>  *x_axis*. If *arg* is NULL, the projection of the <> (0, 1, 0) onto *z_axis* is returned. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION second_proj_axis (z_axis : #geometry_schema.direction[direction]; x_axis : #geometry_schema.direction[direction]; arg : #geometry_schema.direction[direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]; LOCAL y_axis : vector; v : direction; temp : vector; END_LOCAL; IF NOT EXISTS(arg) THEN v := dummy_gri || direction([0.0,1.0,0.0]); ELSE v := arg; END_IF; temp := scalar_times_vector(dot_product(v, z_axis), z_axis); y_axis := vector_difference(v, temp); temp := scalar_times_vector(dot_product(v, x_axis), x_axis); y_axis := vector_difference(y_axis, temp); y_axis := normalise(y_axis); RETURN(y_axis.orientation); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.second_proj_axis.z_axis]]*z_axis:* (input) a defining a local Z axis. [[geometry_schema.second_proj_axis.x_axis]]*x_axis:* (input) a <> not parallel to *z_axis*. [[geometry_schema.second_proj_axis.arg]]*arg:* (input) a <> which is used as the first approximation to the direction of *y_axis*. [[geometry_schema.surface_weights_positive]] ==== surface_weights_positive The *surface_weights_positive* function checks the weights associated with the control points of a <> and returns TRUE if they are all positive. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION surface_weights_positive (b : #geometry_schema.rational_b_spline_surface[rational_b_spline_surface]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT i := 0 TO b.u_upper; REPEAT j := 0 TO b.v_upper; IF (b.weights[i][j] <= 0.0) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.surface_weights_positive.b]]*b:* (input) a <> for which the weight values are to be tested. [[geometry_schema.vector_difference]] ==== vector_difference The *vector_difference* function returns the difference of the input arguments as (*arg1* - *arg2*). The function returns as a <> the vector difference of the two input `vectors'. For this purpose <>s are treated as unit vectors. The input arguments shall both be of the same dimensionality but may be either <>s or <>s. If both input arguments are <>s, they must be expressed in the same units; if both are <>s, a unitless result is produced. A zero difference vector produces a <> of zero magnitude in the direction of *arg1*. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <> [.underline]#EXPRESS specification:# [source] -- *) FUNCTION vector_difference (arg1 : #geometry_schema.vector_or_direction[vector_or_direction]; arg2 : #geometry_schema.vector_or_direction[vector_or_direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.vector[vector]; LOCAL result : vector; res, vec1, vec2 : direction; mag, mag1, mag2 : REAL; ndim : INTEGER; END_LOCAL; IF ((NOT EXISTS (arg1)) OR (NOT EXISTS (arg2))) OR (arg1.dim <> arg2.dim) THEN RETURN (?) ; ELSE BEGIN IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg1) THEN mag1 := arg1\vector.magnitude; vec1 := arg1\vector.orientation; ELSE mag1 := 1.0; vec1 := arg1; END_IF; IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg2) THEN mag2 := arg2\vector.magnitude; vec2 := arg2\vector.orientation; ELSE mag2 := 1.0; vec2 := arg2; END_IF; vec1 := normalise (vec1); vec2 := normalise (vec2); ndim := SIZEOF(vec1.direction_ratios); mag := 0.0; res := dummy_gri || direction(vec1.direction_ratios); REPEAT i := 1 TO ndim; res.direction_ratios[i] := mag1*vec1.direction_ratios[i] - mag2*vec2.direction_ratios[i]; mag := mag + (res.direction_ratios[i]*res.direction_ratios[i]); END_REPEAT; IF (mag > 0.0 ) THEN result := dummy_gri || vector( res, SQRT(mag)); ELSE result := dummy_gri || vector( vec1, 0.0); END_IF; END; END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.vector_difference.arg1]]*arg1:* (input) a <>s or <> defining first operand in the vector difference operation; [[geometry_schema.vector_difference.arg2]]*arg2:* (input) a <>s or <> defining the second operand for vector difference; [[geometry_schema.vector_sum]] ==== vector_sum The *vector_sum* function returns the sum of the input arguments. The function returns as a <> the vector sum of the two input `vectors'. For this purpose <>s are treated as unit vectors. The input arguments must both be of the same dimensionality but may be either <>s or <> s. Where both arguments are <>s, they must be expressed in the same units. A zero sum vector produces a <> of zero magnitude in the direction of *arg1*. If both input arguments are <>s, the result is unitless. NOTE: This function does not provide geometric founding for the <> returned, the caller of the the function is responsible for ensuring that it is used in a ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation] with a <> [.underline]#EXPRESS specification:# [source] -- *) FUNCTION vector_sum (arg1 : #geometry_schema.vector_or_direction[vector_or_direction]; arg2 : #geometry_schema.vector_or_direction[vector_or_direction]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.vector[vector]; LOCAL result : vector; res, vec1, vec2 : direction; mag, mag1, mag2 : REAL; ndim : INTEGER; END_LOCAL; IF ((NOT EXISTS (arg1)) OR (NOT EXISTS (arg2))) OR (arg1.dim <> arg2.dim) THEN RETURN (?) ; ELSE BEGIN IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg1) THEN mag1 := arg1\vector.magnitude; vec1 := arg1\vector.orientation; ELSE mag1 := 1.0; vec1 := arg1; END_IF; IF 'GEOMETRY_SCHEMA.VECTOR' IN TYPEOF(arg2) THEN mag2 := arg2\vector.magnitude; vec2 := arg2\vector.orientation; ELSE mag2 := 1.0; vec2 := arg2; END_IF; vec1 := normalise (vec1); vec2 := normalise (vec2); ndim := SIZEOF(vec1.direction_ratios); mag := 0.0; res := dummy_gri || direction(vec1.direction_ratios); REPEAT i := 1 TO ndim; res.direction_ratios[i] := mag1*vec1.direction_ratios[i] + mag2*vec2.direction_ratios[i]; mag := mag + (res.direction_ratios[i]*res.direction_ratios[i]); END_REPEAT; IF (mag > 0.0 ) THEN result := dummy_gri || vector( res, SQRT(mag)); ELSE result := dummy_gri || vector( vec1, 0.0); END_IF; END; END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.vector_sum.arg1]]*arg1:* (input) a <> or <> defining the first operand in vector sum operation.. [[geometry_schema.vector_sum.arg2]]*arg2:* (input) a <> or <> defining the second operand for vector sum operation. [[geometry_schema.volume_weights_positive]] ==== volume_weights_positive The *volume_weights_positive* function checks the weights associated with the control points of a <> and returns TRUE if they are all positive. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION volume_weights_positive (b : #geometry_schema.rational_b_spline_volume[rational_b_spline_volume]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT i := 0 TO b.u_upper; REPEAT j := 0 TO b.v_upper; REPEAT k := 0 TO b.w_upper; IF (b.weights[i][j][k] <= 0.0) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; END_REPEAT; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.volume_weights_positive.b]]*b:* (input) a <> for which the weight values are to be tested. [[geometry_schema.weights_positive]] ==== weights_positive The *weights_positive* function checks the weights associated with the control points of a rational locally refined curve, surface or volume and returns TRUE if they are all positive. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION weights_positive (weights : LIST[0:?] OF REAL) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT i := 1 TO SIZEOF(weights); IF weights[i] <= 0.0 THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometry_schema.weights_positive.weights]]*weights:* (input) a LIST of weight values to be tested. are to be tested. [[rules]] == geometry_schema rule definitions [[geometry_schema.compatible_dimension]] ==== compatible_dimension All <>s are geometrically founded in one or more <> coordinate spaces, this is checked by WR1 of <>. The rule *compatible_dimension* ensures that: When <>s are geometrically founded together in a coordinate space, they have the same coordinate space <> by ensuring that each matches the <> of the coordinate space in which it is geometrically founded. [[note_1]] NOTE: Two-dimensional <>s that are geometrically founded in a <> are only geometrically founded in context with a <> of 2. All <>s founded in such a context are two-dimensional. All other values of <> behave similarly. [.underline]#EXPRESS specification:# [source] -- *) RULE compatible_dimension FOR (cartesian_point,direction,geometric_representation_context); WHERE   WR1: check_geometric_dimension (cartesian_point, direction, geometric_representation_context); END_RULE; (* -- [.underline]#Argument definitions:# *cartesian_point : * the set of all instances of ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.cartesian_point[cartesian_point]. *direction : * the set of all instances of ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.direction[direction]. *geometric_representation_context : * the set of all instances of ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.geometric_representation_context[geometric_representation_context]. [.underline]#Formal propositions:# [[geometry_schema.compatible_dimension.wr:wr1]]*WR1:* There shall be no <> that has a number of coordinates that differs from the <> of the <>s in which it is geometrically founded; there shall be no <> that has a number of <> that differs from the <> of the <>s in which it is geometrically founded. These properties are verifieded by the function <> [[note_2]] NOTE: A check of only <>s and <>s is sufficient for all <>s because: All <>s appear in trees of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item]s descending from the ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation.items[items] attribute of entity ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation[representation]. See WR1 of entity ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] in ISO 10303-43. Each <> gains its position and orientation information only by being, or referring to, a <> or <> entity in such a tree. In many cases this reference is made via an <>. No other use of any <> is allowed that would associate it with a coordinate space or otherwise assign a <> [source] -- *) END_SCHEMA; -- geometry_schema (* -- [[schema5]] == Topology schema [[gen]] == General The topology resource model has its basis in boundary representation solid modelling but can be used in any other application where an explicit method is required to represent connectivity. The table below shows the symbols used in the description of the topology schema. [#table_table_2] [cols="1,1"] .Topology symbol definitions |=== |Symbol |Definition |V |Vertex |*_V_* | Number of unique vertices |E | Undirected edge |*_E_* |Number of unique undirected edges |* E ~l~* |Oriented edge |*_ E ~l~_* | Number of unique oriented edges | G ^_e_^ | Edge genus |P |Path |*_P_* | Number of unique paths | G ^_p_^ | Path genus |L |Loop |_L_ |Number of unique loops | L ~l~ |Face bound |_ L ~l~_ |Number of unique face bounds | L ^e^ | Edge loop | L ^p^ |Polyloop | L ^v^ |Vertex loop | G ^_l_^ |Loop genus |F |Face |_F_ |Number of unique faces |_ H ^f^_ |Face genus | S |Shell |_S_ |Number of unique shells | S ^_c_^ |Closed shell | S ^_o_^ |Open shell | S ^_v_^ |Vertex shell | S ^_w_^ |Wire shell |_ H ^s^_ |Shell genus | Ξ |Extent | { A } |Set of entities of type A | [ A ] |List of entities of type A |=== This clause defines the information requirements to which implementations shall conform using the EXPRESS language as defined in ISO 10303-11. The following EXPRESS declaration begins the *topology_schema* and identifies the necessary external references. Short names of entities defined in this schema are described in Annex A. Unambiguous identification of this schema is defined in Annex B. [.underline]#EXPRESS specification:# [source] -- *) [[topology_schema]] SCHEMA topology_schema; -- [[interfaces]] [source] -- REFERENCE FROM ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema[basic_attribute_schema]   -- ISO 10303-41   (../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.aggregate_id_attribute[aggregate_id_attribute],   ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.get_aggregate_id_value[get_aggregate_id_value],   ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.get_id_value[get_id_value],   ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.id_attribute[id_attribute],   ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.id_attribute_select[id_attribute_select]); REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema[geometry_schema];   -- ISO 10303-42 REFERENCE FROM ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema[measure_schema]   -- ISO 10303-41   (../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure]); REFERENCE FROM ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema[representation_schema]   -- ISO 10303-43   (../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation[representation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation_item[representation_item]); REFERENCE FROM ../../../../data/resources/support_resource_schema/support_resource_schema.xml#support_resource_schema[support_resource_schema]   -- ISO 10303-41   (../../../../data/resources/support_resource_schema/support_resource_schema.xml#support_resource_schema.bag_to_set[bag_to_set],   ../../../../data/resources/support_resource_schema/support_resource_schema.xml#support_resource_schema.identifier[identifier]); (* -- NOTE: The schemas referenced above are specified in the following parts: [quote] _____ basic_attribute_schema:: ISO 10303-41 geometry_schema:: ISO 10303-42 measure_schema:: ISO 10303-41 representation_schema:: ISO 10303-43 support_resource_schema:: ISO 10303-41 _____ NOTE: See <> for a graphical representation of this schema. [[funcon]] == Fundamental concepts and assumptions The topological entities, *vertex* , *edge* etc., specified here have been defined independently of any use that may be made of them. Minimal constraints have been placed on each entity with the intention that any additional constraints will be specified by the using entity or by a defined context in which the entity is used. The intent is to avoid limiting the context or the use made of the entities. The topological entities have been defined in a hierarchical manner with the *vertex* being the primitive entity. That is, all other topological entities are defined either directly or indirectly in terms of vertices. Each entity has its own set of constraints. A higher-level entity may impose constraints on a lower-level entity. At the higher level, the constraints on the lower-level entity are the sum of the constraints imposed by each entity in the chain between the higher- and lower-level entities. The basic topological structures in order of increasing complexity are *vertex* , *edge* , *path* , *loop* , *face* , and *shell.* In addition to the high-level structured topological entities *open_shell* and *closed_shell* , which are specialised subtypes of *connected_face_set* , the topology section includes the *connected_edge_set* and the general *connected_face_set* . These two entities are designed for the communication of collections of topological data where the constraints applied to shell are inappropriate. The *poly_loop* is a loop with straight and coplanar edges and is defined as an ordered list of points. The *poly_loop* entity is used for the communication of faceted B-rep models. Many functions ensure consistency of the topology models by applying topological and geometric constraints to entities. * 5.2.1 Geometric associations * Many of the topological entities have a specialised subtype which enables them to be associated with geometric data. This association will be essential when communicating boundary representation solid models. The specialised subtypes of *vertex* , *edge* and *face* are *vertex_point* , *edge_curve* , and *face_surface* respectively. For the *edge_curve* and *face_surface* the relationship between the geometric sense and the topological sense of the associated entities is also recorded. The key concept relating geometry to topology is the domain. The domain of a *point* , *curve* , or *surface* is just that point, curve, or surface. The domain of a *vertex* , *edge* , or *face* is the corresponding point, curve, or surface. The domain of a *loop* or *path* is the union of the domains of all the vertices and edges in the *loop* or *path* . (Except in the case of a vertex loop, this is a curve.) The domain of a shell is the union of the domains of all the vertices, edges, and faces in the shell. (For a *closed_shell* or *open_shell* , this is a surface.) The domain of a solid model is the region of space it occupies. The domain of a set or list is the union of the domains of the elements of that set or list. Wherever in this standard a geometrical concept such as connectedness or finiteness is discussed in relation to an entity, it is understood that the concept applies to the domain of that entity. A key concept in describing domains is the idea of a manifold. Intuitively, a domain is a _d_ -manifold if it is locally indistinguishable from _d_ -dimensional Euclidean space. This means that the dimensionality is the same at each mathematical point, and self- intersections are prohibited. As defined in this standard, curves and surfaces may contain self-intersections, and hence need not be manifolds. However, the part of a curve or surface that corresponds to the domain of a topological entity such as an edge or face shall be a manifold. As used in this standard, the terms "manifold", "boundary" , and " manifold with boundary" are identical to the usual mathematical definitions. A manifold with boundary differs from a manifold in that the boundary is allowed, but not required, to be non-empty. A 1-manifold is a non-self-intersecting curve which does not include either of its end points. Examples of 1-manifolds are the real line and the unit circle. A "Y"-shaped figure is not a 1-manifold, and neither is the closed unit interval. A 2-manifold is a non-self-intersecting surface which does not include boundary curves. Examples of 2-manifolds include the unit sphere and the open disk _ {(x,y,0) : x ^2^ + y ^2^ < 1\} _ . The closed disk _ {(x,y,0) : x ^2^ + y ^2^ ≤ 1} _ is not a manifold. The domains of edges and paths, if present, are 1-manifolds. The domains of faces and closed shells, if present, are 2-manifolds. Any curve which does not self-intersect is a 1-manifold with boundary. The closed disk _ {(x,y,0) : x ^2^ + y ^2^ ≤ 1} _ is a 2-manifold with boundary. The domain of an open shell, if present, is a 2-manifold with boundary. The domain of a manifold solid boundary representation or a faceted manifold boundary representation is a 3-manifold with boundary. The boundary of a _d_ -manifold with boundary is a _(d-1)_ -manifold. For example, the boundary of a curve is the set of 0, 1, or 2 end points contained in that curve. The boundary of the closed disk _ {(x,y,0) : x ^2^ + y ^2^ ≤ 1} _ is the unit circle. The boundary of the domain of an open shell is the domain of the set of loops that bound holes in the shell. The boundary of a manifold solid boundary representation or a faceted manifold boundary representation is the domain of the set of bounding shells. Curves and surfaces which are manifolds with boundary are classified as either open or closed. The terms "open" and "closed", when applied to curves or surfaces in this standard, should not be confused with the notions of "open set" or "closed set" from point set topology. The term "closed surface" is identical to the usual definition of a closed, connected, orientable 2-manifold. Examples of a closed surface are a sphere and a torus. The domain of a closed shell, if present, is a closed surface. Examples of open surfaces are an infinite plane, or a surface with one or more holes. The domain of an open shell, if present, is an open surface. All closed surfaces that are physically manufacturable are orientable. Face domains, because they are always embeddable in the plane, are orientable. Open surfaces need not be orientable. For example, the Möbius strip is an open surface. Also, some manifolds are neither open nor closed as defined in this standard. The Klein bottle is an example. It is finite and its boundary is empty, but the surface is not orientable, and hence does not divide space into two regions. However, the domain of an open shell as defined in this standard must be orientable. The term "genus" refers to an integer-valued function used to classify topological properties of an entity. This standard defines two different types of genus. For an entity which can be described as a graph of edges and vertices, for example a loop, path, or wire shell, genus is equivalent to the standard technical term "cycle rank" in graph theory. It is _ not _ equivalent to the standard usage of the term "genus" in graph theory. Intuitively, it measures the number of independent cycles in a graph. For example, a graph with exactly one vertex, joined to itself by _n_ self-loops, has genus _n_ . The genus of a closed surface _X_ is the number of handles that must be added to a sphere to produce a surface homeomorphic to _X_. For example, the genus of a sphere is 0, and the genus of a torus is 1. This is identical to the standard technical term "genus of a surface" from algebraic topology. Adding a handle to a closed surface is the operation that corresponds to drilling a tunnel through the three-dimensional volume bounded by that surface. This can be viewed as cutting out two disks and connecting their boundaries with a cylindrical tube. Handles should not be confused with holes. As used in this standard, the term "hole" corresponds to the intuitive notion of punching a hole in a two-dimensional surface. The surface genus definition is extended to orientable open surfaces as follows. Fill in every hole in the domain with a disk. The resulting surface is a closed surface, for which genus is already defined. Use this number for the genus of the open surface. * 5.2.2 Associations with parameter space geometry * A fundamental assumption in this clause is that the topology being defined is that of model space. The geometry of curves and points can also be defined in parameter space but, in general, the topological structure of, for example a *face* , will not be the same in the parametric space of the underlying surface as it is in model space. Parametric space modelling systems differ from real space systems in the methodology used to associate geometry to topology. Parametric space modelling systems typically associate a different parametric space curve with each edge use (i.e., *oriented_edge* ). Every one of the parametric space curves associated with a given edge (by way of an edge use) describe the same point set in real space. The parametric space curves are defined in different parametric spaces. The parametric spaces are the surfaces which underlay the faces bordering on the edge. In a manifold solid the geometry of every *edge* is defined twice, once for each of the two *face* s which border on that *edge* . Associating a parametric space curve with each edge use extends naturally to the use of degenerate edges (i.e., edges with zero length in real space). For example, a parametric space modelling system could represent a face that is triangular in real space as a square in parametric space. A straight forward way to do this is to represent one of the triangular face's vertices as a degenerate edge (but having two vertices); then there is a one-to-one mapping between edges in real space and model space. The degenerate edge has zero length in real space, but greater than zero length in parametric space. Degenerate edges also may be used for creating bounds around singularities such as the apex of a cone. Real space modelling systems do not associate parametric space curves with each edge use nor do they allow degenerate edges. Since the parametric space modelling systems treatment of topology is an implementation convenience, this standard requires the use of real space topology. The parametric space modelling system's unique information requirements are satisfied using techniques at the geometric level. * 5.2.2.1 Edge_curve associations with parametric space curves * Techniques that can be used to associate parametric space curves with an *edge_curve* are: [loweralpha] . The *edge_geometry* attribute of an *edge_curve* may reference directly one *pcurve* , then only one *pcurve* is associated with that *edge_curve* . . The *edge_geometry* attribute of an *edge_curve* can reference a *surface_curve* , or a subtype of *surface_curve* ; then associated with that *edge_curve* are the *pcurve*s (one or two) referenced by the *associated_geometry* attribute of the *surface_curve* . The curve referenced by the *curve_3d* attribute of the *surface_curve* is also associated with the *edge_curve* but that curve cannot be a parametric space curve and represents the model space geometry of the *edge* . . The *edge_geometry* attribute of an *edge_curve* can reference a curve (not a *pcurve* ), then associated with the *edge_curve* are the *pcurve*s (zero or more) referenced by the *associated_geometry* attribute of every *surface_curve* whose *curve_3d* attribute references the same curve (i.e., is instance equal to, :=:) as the *edge_geometry* attribute of the *edge_curve* . These techniques are formally defined in EXPRESS as the function *edge_curve_pcurves* which can be used to determine all the parametric space curves associated with a particular *edge* . [[note_1]] NOTE: For applications where the real space modelling systems are not required to understand parametric space curves, the parametric space modelling systems should be required to use only the third technique described above. Then, even if the *pcurve* s are ignored, the real space modelling system will have the correct geometry associated with all *edge_curve* s. [[note_2]] NOTE: Given the *pcurve* s of an *edge_curve* , determining which *oriented_edge* a pcurve shall be associated with is a matter of matching (:=:) the *basis_surface* of the *pcurve* with the *face_geometry* of the face bound by that *oriented_edge* . If two or more *pcurve* s are associated with the same *edge_curve* and are defined in the parametric space of the same surface, determining which *oriented_\-edge* the *pcurve* is associated with requires checking connectivity of the *pcurve* s in parametric space. * 5.2.3 Graphs, cycles, and traversals * A connected component of a graph is a connected subset of the graph which is not contained in any larger connected subset. We denote by _M_ the _ multiplicity_ of a graph, that is, the number of connected components. Thus, a graph is connected if and only if _M = 1_ . Each component of a graph can be completely traversed, starting, and ending at the same vertex, such that every edge is traversed exactly twice, once in each direction, and every vertex is "passed through" the same number of times as there are edges using the vertex. If an (edge + edge traversal direction) is considered as a unit, each unique (edge + direction) combination shall occur once and only once in the traversal of a graph. During the traversal of a graph it will be found that there are one or more sets of alternating vertices and (edge + direction) units that form closed cycles. The symbol _G_ will denote the _graph genus_ , which is, intuitively, the number of independent cycles in the graph. (Technically, _G_ is the rank of the fundamental group of the graph.) Every graph satisfies the following Euler equation stem:[_* (V - E) - (M - G) = 0 *_] where _*V*_ and _*E*_ are the numbers of unique vertices and edges in the graph. [[note_3]] NOTE: The following _graph traversal _ algorithm, [16], may be used to traverse a graph and compute _*M*_ and _*G*_ . [loweralpha] . Set _*M*_ and _*G*_ to zero. . Start at any (unvisited) vertex. If there is no unvisited vertex, STOP. Mark the vertex as _visited_ . Increment _*M*_ . Traverse any edge at the vertex, marking the edge with the travel direction. . After traversing an edge PQ to reach the vertex Q, do the following: ** When reaching a vertex for the first time, mark the edge just travelled as the _advent edge_ of the vertex. The advent edge is marked so that it can only be selected once in this direction. ** Mark the vertex as _visited_ . ** If this is the first traversal of the edge and the vertex Q has previously been visited, increment _*G*_ . ** Select an exit edge from the vertex according to the following rules: [arabic] ... No edge may be selected that has previously been traversed in the direction away from the vertex Q. ... Select any edge, except the advent edge of Q, that meets rule (c1). ... If no edge meets rule (c2), select the advent edge. ** Traverse the selected exit edge and mark it with the travel direction. . If no edge was selected in the previous step, go to step b, else go to step c [[constants]] == topology_schema constant definition [.underline]#EXPRESS specification:# [source] -- *) CONSTANT (* -- [[topology_schema.dummy_tri]] ==== dummy_tri A *dummy_tri* is a constant that is a partial entity definition to be used when types of <> are constructed. It provides the correct supertypes and the ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item.name[name] attribute as an empty string. [.underline]#EXPRESS specification:# [source] -- *)   dummy_tri: ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.topological_representation_item[topological_representation_item] := representation_item('')|| topological_representation_item(); (* -- [source] -- *) END_CONSTANT; (* -- [[types]] == topology_schema type definitions [[topology_schema.list_of_reversible_topology_item]] ==== list_of_reversible_topology_item The *list_of_reversible_topology_item* type defines a list of reversible topology items; it is used by the function <> [.underline]#EXPRESS specification:# [source] -- *) TYPE list_of_reversible_topology_item=LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.reversible_topology_item[reversible_topology_item]; END_TYPE; (* -- [[topology_schema.reversible_topology]] ==== reversible_topology The *reversible_topology* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. The *reversible_topology* identifies all types of reversible topology items; it is used by the function <>. [.underline]#EXPRESS specification:# [source] -- *) TYPE reversible_topology=SELECT    (#topology_schema.reversible_topology_item[reversible_topology_item],     #topology_schema.list_of_reversible_topology_item[list_of_reversible_topology_item],     #topology_schema.set_of_reversible_topology_item[set_of_reversible_topology_item]); END_TYPE; (* -- [[topology_schema.reversible_topology_item]] ==== reversible_topology_item The *reversible_topology_item* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. The *reversible_topology_item* select type specifies all the topological representation items which can participate in the operation of reversing their orientation. This type is used by the function <>. [.underline]#EXPRESS specification:# [source] -- *) TYPE reversible_topology_item=SELECT    (#topology_schema.edge[edge],     #topology_schema.path[path],     #topology_schema.face[face],     #topology_schema.face_bound[face_bound],     #topology_schema.closed_shell[closed_shell],     #topology_schema.open_shell[open_shell]); END_TYPE; (* -- [[topology_schema.set_of_reversible_topology_item]] ==== set_of_reversible_topology_item The *set_of_reversible_topology_item* type defines a set of reversible topology items; it is used by the function <>. [.underline]#EXPRESS specification:# [source] -- *) TYPE set_of_reversible_topology_item=SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.reversible_topology_item[reversible_topology_item]; END_TYPE; (* -- [[topology_schema.shell]] ==== shell The *shell* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. The *shell* type collects together, for reference when constructing more complex models, the subtypes which have the characteristics of a shell. A *shell* is a connected object of fixed dimensionality _d_ = 0, 1, or 2, typically used to bound a region. The domain of a shell, if present, includes its bounds and 0 ≤ Ξ < ∞ A shell of dimensionality 0 is represented by a graph consisting of a single vertex. The vertex shall not have any associated edges. A shell of dimensionality 1 is represented by a connected graph of dimensionality 1. A shell of dimensionality 2 is a topological entity constructed by joining faces along edges. Its domain, if present, is a connected, orientable 2-manifold with boundary, that is, a connected, oriented, finite, non-self-intersecting surface, which may be closed or open. [.underline]#EXPRESS specification:# [source] -- *) TYPE shell=SELECT    (#topology_schema.vertex_shell[vertex_shell],     #topology_schema.wire_shell[wire_shell],     #topology_schema.open_shell[open_shell],     #topology_schema.closed_shell[closed_shell]); END_TYPE; (* -- [[topology_schema.tri_id_attribute_select]] ==== tri_id_attribute_select The *tri_id_attribute_select* type is an extension of the *../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.id_attribute_select[id_attribute_select]* type. It adds the data type #topology_schema.topological_representation_item[topological_representation_item] to the list of alternate data types. [.underline]#EXPRESS specification:# [source] -- *) TYPE tri_id_attribute_select=SELECT BASED_ON ../../../../data/resources/basic_attribute_schema/basic_attribute_schema.xml#basic_attribute_schema.id_attribute_select[id_attribute_select]WITH    (#topology_schema.topological_representation_item[topological_representation_item]); END_TYPE; (* -- [[entities]] == topology_schema entity definitions [[topology_schema.topological_representation_item]] ==== topological_representation_item A *topological_representation_item* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] that represents the topology, or connectivity, of entities which make up the representation of an object. The *topological_representation_item* is the supertype for all the representation items in the topology schema. [[note_1]] NOTE: As subtypes of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item] there is an implicit and/or relationship between <> and *topological_representation_item*. The only complex instances intended to be created are <>, <>, and <>. [[note_2]] NOTE: The definition of *topological_representation_item* defines an and/or relationship between <> and <>. The only valid complex instance is the <> entity. [.underline]#EXPRESS specification:# [source] -- express_ref:[topological_representation_item] -- [[topology_schema.vertex]] ==== vertex A *vertex* is a type of <>, and is the topological construct corresponding to a point. It has dimensionality 0 and extent 0. The domain of a vertex, if present, is a point in m dimensional real space R^_m_^; this is represented by the <> subtype. [.underline]#EXPRESS specification:# [source] -- express_ref:[vertex] -- [[topology_schema.vertex_on_edge]] ==== vertex_on_edge A *vertex_on_edge* is a type of <>, which is located on an <> at a distance <> from the start vertex. NOTE: This object is known to have issues and will be updated in the near future. [.underline]#EXPRESS specification:# [source] -- express_ref:[vertex_on_edge] -- [[topology_schema.vertex_point]] ==== vertex_point A *vertex_point* is a type of <>, which has its geometry defined as a point. [.underline]#EXPRESS specification:# [source] -- express_ref:[vertex_point] -- [[topology_schema.edge]] ==== edge An *edge* is a type of <>, corresponding to the connection between two vertices. More abstractly, it may stand for a logical relationship between the two vertices. The domain of an edge, if present, is a finite, non-self-intersecting open curve in R^_m_^, that is, a connected 1-dimensional manifold. The bounds of an *edge* are two vertices, which need not be distinct. The edge is oriented by choosing its traversal direction to run from the first to the second vertex. If the two vertices are the same, the edge is a self-loop. The domain of the edge does not include its bounds, and 0 < Ξ < ∞. Associated with an edge may be a geometric <> to locate the edge in a coordinate space; this is represented by the *edge_curve* subtype. The curve shall be finite and non-self-intersecting within the domain of the edge. An *edge* is a graph, so its multiplicity M and graph genus G^_e_^ may be determined by the graph traversal algorithm. Since M = *_E_* = 1, the Euler equation reduces in this case to [[eqn2]]stem:[*_V_* - (2 - G^_e_^) = 0   (2)   ] where *_V_* = 1 or 2, and G^_e_^ = 1 or 0. Specifically, the topological edge defining data shall satisfy: * An edge has two vertices, |E[V]| = 2 * The vertices need not be distinct, 1 ≤|E{V}| ≤ 2 * Equation #eqn2[(2)] shall hold |E{V}| - 2 + G^_e_^ = 0 [.underline]#EXPRESS specification:# [source] -- express_ref:[edge] -- [[topology_schema.edge_with_length]] ==== edge_with_length An *edge_with_length* is a type of <>, which has its geometry undefined but is of a fixed length. [[note_1]] NOTE: An *edge_with_length* may be used to describe the topology of flexible structures. [[note_2]] NOTE: This object is known to have issues and will be updated in the near future. [.underline]#EXPRESS specification:# [source] -- express_ref:[edge_with_length] -- [[topology_schema.edge_curve]] ==== edge_curve An *edge_curve* is a type of <>, which has its geometry fully defined. The geometry is defined by associating the edge with a <> which may be unbounded. As the topological and geometric directions may be opposed, an indicator (*same_sense*) is used to identify whether the edge and curve directions agree or are opposed. The Boolean value indicates whether the <> direction agrees with (TRUE) or is in the opposite direction (FALSE) to the <> direction. Any geometry associated with the vertices of the edge shall be consistent with the edge geometry. Multiple edges can reference the same curve. [[figure25]] .Edge_curve image::Topfig23.gif[Edge_curve] [.underline]#EXPRESS specification:# [source] -- express_ref:[edge_curve] -- [[topology_schema.oriented_edge]] ==== oriented_edge An *oriented_edge* is a type of <>, constructed from another <> and contains a BOOLEAN orientation flag to indicate whether or not the orientation of the constructed <> agrees with the orientation of the original <>. Except for possible re-orientation, the *oriented_edge* is equivalent to the original <>. NOTE: A common practice in solid modelling systems is to have an entity that represents the " use" or " traversal " of an <>. This "use" entity explicitly represents the requirement in a manifold solid that each edge must be traversed exactly twice, once in each direction. The "use" functionality is provided by the <> subtype *oriented_edge*. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_edge] -- [[topology_schema.seam_edge]] ==== seam_edge A *seam_edge* is a type of <>, which, additionally, identifies a corresponding <>. A *seam_edge* is always related to an <> having a <> as <>. The <> identifies which, of the two <>s defining the <>, is appropriate for this <>. NOTE: The inherited <> attribute refers to the relationship to the <> and not to the sense of the <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[seam_edge] -- [[topology_schema.subedge]] ==== subedge A *subedge* is a type of <>, whose domain is a connected portion of the domain of an existing <>. The topological constraints on a *subedge* are the same as those on an <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[subedge] -- [[topology_schema.path]] ==== path A *path* is a type of <>, consisting of an ordered collection of <>s, such that the <> vertex of each edge coincides with the <> of its predecessor. The path is ordered from the <> of its first <> to the <> of its last <>. The BOOLEAN value <> in the <> indicates whether the edge direction agrees with the direction of the path (TRUE) or is in the opposite direction (FALSE). An individual <> can only be referenced once by an individual *path*. An <> can be referenced by multiple *path*s. An <> can exist independently of a *path*. [.underline]#EXPRESS specification:# [source] -- express_ref:[path] -- [[topology_schema.oriented_path]] ==== oriented_path An *oriented_path* is a type of <>, constructed from another <> and contains a BOOLEAN orientation flag to indicate whether or not the orientation of the constructed <> agrees with the orientation of the original <>. Except for perhaps orientation, the *oriented_path* is equivalent to the other <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_path] -- [[topology_schema.open_path]] ==== open_path An *open_path* is a type of <>, such that a traversal of the path visits each of its vertices exactly once. In particular, the start vertex and end vertex are different. An *open_path* is a graph for which M = 1 and _*G*^p^_ = 0, so the Euler equation 6_schema.htm#eqnGM1[(1)] reduces in this case to [[eqn3]]stem:[ (*_V_* - *_E_*) - 1 = 0   (3)  ] where *_V_* and *_E_* are the number of unique vertices and edges in the path. Specifically, the topological attributes of a <> shall meet the following constraints: * The edges in the Path are unique, stem:[ (P)[E] = (P){E} ] * In the list ((P)[E])[V], two vertices appear once only and every other vertex appears exactly twice. * The graph genus of the path is zero. * Equation #eqn3[(3)] is interpreted as stem:[ |((P)[E]){V}| - |(P){E}| - 1 = 0 ] [.underline]#EXPRESS specification:# [source] -- express_ref:[open_path] -- [[topology_schema.loop]] ==== loop A *loop* is a type of <>, constructed from a single vertex, or by stringing together connected (oriented) edges, or linear segments beginning and ending at the same vertex. A loop has dimensionality 0 or 1. The domain of a 0-dimensional loop is a single point. The domain of a 1-dimensional loop is a connected, oriented curve, but need not be a manifold. As the loop is a cycle, the location of its beginning/ending point is arbitrary. The domain of the loop includes its bounds, and 0 ≤ Ξ < ∞ A loop is represented by a single vertex, or by an ordered collection of <>s, or by an ordered collection of points. A loop is a graph, so M and the graph genus G^_l_^ may be determined by the graph traversal algorithm. Since M = 1, the Euler equation reduces in this case to [[eqn4]]stem:[ (*_V_* - _*E*~l~_) - (1 - G^_l_^) = 0   (4)  ] where *_V_* and *_E_* are the number of unique vertices and oriented edges in the loop and G^_l_^ is the genus of the loop. [.underline]#EXPRESS specification:# [source] -- express_ref:[loop] -- [[topology_schema.vertex_loop]] ==== vertex_loop A *vertex_loop* is a type of <>, of zero genus consisting of a single <>. A <> can exist independently of a *vertex_loop*. The topological data shall satisfy the following constraint: Euler equation #eqn4[(4)] shall be satisfied: stem:[ |(L){V}| - 1 = 0 ] [.underline]#EXPRESS specification:# [source] -- express_ref:[vertex_loop] -- [[topology_schema.edge_loop]] ==== edge_loop An *edge_loop* is a type of <>, with nonzero extent. It is a <> in which the start and end vertices are the same. Its domain, if present, is a closed curve. An *edge_loop* may overlap itself. [.underline]#EXPRESS specification:# [source] -- express_ref:[edge_loop] -- [[topology_schema.poly_loop]] ==== poly_loop A *poly_loop* is a type of <>, with straight edges bounding a planar region in space. A *poly_loop* is a <> of genus 1 where the <> is represented by an ordered coplanar collection of <>s forming the vertices of the loop. The loop is composed of straight-line segments joining a point in the collection to the succeeding point in the collection. The closing segment is from the last to the first point in the collection. The direction of the loop is in the direction of the line segments. Unlike the <> entity, the edges of the *poly_loop* are implicitly defined by the *polygon* points. [[note_1]] NOTE: This entity exists primarily to facilitate the efficient communication of faceted boundary representation models. [[note_2]] NOTE: The *poly_loop* has vertices and <>s which are implicitly created. If, for example, A and B are consecutive points in the *polygon* list, there is an implicit <> from vertex point A to vertex point B with orientation value TRUE. It is assumed that when the higher-level entities such as shell and B-rep require checks on edge usage that this check will recognise, for example, a straight oriented edge from point B to point A with orientation TRUE as equal to an oriented edge from A to B with orientation FALSE. A *poly_loop* shall conform to the following topological constraints: * The loop has a genus of one. * Euler equation #eqn4[(4)] shall be satisfied: stem:[ |(L){V}| - |(L){E~_l_~}| = 0 ] [.underline]#EXPRESS specification:# [source] -- express_ref:[poly_loop] -- [[topology_schema.face_bound]] ==== face_bound A *face_bound* is a type of <>, and is a loop which is intended to be used for bounding a face. [.underline]#EXPRESS specification:# [source] -- express_ref:[face_bound] -- [[topology_schema.face_outer_bound]] ==== face_outer_bound A *face_outer_bound* is a type of <>, which carries the additional semantics of defining an outer boundary on the face. A *face_outer_bound* shall separate the interior of the <> from the exterior and shall enclose the interior domain of the <>. No more than one boundary of a <> shall be of this type. [example] [[example_1]] Any <> on a plane surface may be used to define a *face_outer_bound* provided it is not enclosed in any other loop in the <>. [example] [[example_2]] A circular loop on a cylindrical surface cannot define a *face_outer_bound* since it does not enclose a closed domain in the surface. [.underline]#EXPRESS specification:# [source] -- express_ref:[face_outer_bound] -- [[topology_schema.face]] ==== face A *face* is a type of <>, of dimensionality 2 corresponding to the intuitive notion of a piece of surface bounded by loops. Its domain, if present, is an oriented, connected, finite 2-manifold in R^_m_^. A face domain shall not have handles, but it may have holes, each hole bounded by a loop. The domain of the underlying geometry of the face, if present, does not contain its bounds, and 0 < Ξ < ∞. A face is represented by its bounding loops, which are defined as <>s. A face shall have at least one bound, and the bounds shall be distinct and shall not intersect. One <> is optionally distinguished, using the <> subtype, as the "outer" loop of the face. If so, it establishes a preferred way of embedding the face domain in the plane, in which the other bounding loops of the face are "inside" the outer loop. Because the face domain is arcwise connected, no inner loop shall contain any other loop. This is true regardless of which embedding in the plane is chosen. A geometric <> may be associated with the face. This may be done explicitly through the <> subtype, or implicitly if the faces are defined by <>s. In the latter case, the surface is the plane containing the points of the <>s. In either case, a topological normal *n* is associated with the face, such that the cross product *n* × *t* points toward the interior of the face, where *t* is the tangent to a bounding loop. That is, each loop runs counter-clockwise around the face when viewed from above, if we consider the normal *n* to point up. Each loop is associated through a *face_bound* entity with a BOOLEAN flag to signify whether the loop direction is oriented correctly with respect to the face normal (TRUE) or should be reversed (FALSE). For a face of the subtype <>, the topological normal *n* is defined from the normal of the underlying surface, together with the BOOLEAN attribute <>, and this in turn, determines on which side of the loop the face interior lies, using the cross-product rule described above. When a <> is used as a <> the sense of the topological normal is derived from any other bounding loops, or, in the case of a <>, from the <> and the <> flag. If the *face* has only one bound and this is of type <>, then the interior of the *face* is the domain of the <>. In such a case the underlying surface shall be closed (such as a spherical surface.) The situation is different for a face on an implicit planar surface, such as one defined by <>s, which has no unique surface normal. Since the face and its bounding loops lie in a plane, the outer loop can always be found without ambiguity. Since the face is required to be finite, the face interior must lie inside the outer loop, and outside each of the remaining loops. These conditions, together with the specified loop orientations, define the topological normal *n* using the cross-product rule described above. All <> orientations for a given face shall produce the same value for *n*. The edges and vertices referenced by the loops of a face form a graph, of which the individual loops are the connected components. The Euler equation for this graph becomes: [[eqn5]]stem:[ (*_V_* - *_E_*) - (*_L_* - Σ^L^~_i=1_~ (G_~i~^l^_)) = 0   (5)       ] where G_~i~^l^_ is the graph genus of the _i_ th loop. More specifically, the following topological constraints shall be met: * The loops are unique (F){L} = (F)[L] * In the list ((F)[L])[E] an individual edge occurs no more than twice. * Each <> shall be unique stem:[ ((F)[L])\{E_~l~_} = ((F)[L])[E_~l~_] ] * Equation #eqn5[(5)] shall be satisfied stem:[ |(((F)[L_^e^_]){E}){V}| + |((F)[L_^v^_]){V}| - |((F)[L]){E}| - |(F)[L]| + ΣG^_l_^ = 0 ] [.underline]#EXPRESS specification:# [source] -- express_ref:[face] -- [[topology_schema.face_surface]] ==== face_surface A *face_surface* is a type of <>, in which the geometry is defined by an associated <>. The portion of the surface used by the face shall be embeddable in the plane as an open disk, possibly with holes. However, the union of the face with the edges and vertices of its bounding loops need not be embeddable in the plane. It may, for example, cover an entire sphere or torus. As both a face and a geometric surface have defined normal directions, a BOOLEAN flag (the orientation attribute) is used to indicate whether the surface normal agrees with (TRUE) or is opposed to (FALSE) the face normal direction. The geometry associated with any component of the loops of the face shall be consistent with the surface geometry, in the sense that the domains of all the vertex points and edge curves are contained in the face geometry surface. A <> may be referenced by more than one *face_surface*. [.underline]#EXPRESS specification:# [source] -- express_ref:[face_surface] -- [[topology_schema.oriented_face]] ==== oriented_face An *oriented_face* is a type of <>, which contains an additional orientation BOOLEAN flag to indicate whether, or not, the sense of the oriented face agrees with its sense as originally defined in the face element. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_face] -- [[topology_schema.subface]] ==== subface A *subface* is a type of <>, which is a portion of the domain of a <>, or another *subface*. The topological constraints on a *subface* are the same as on a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[subface] -- [[topology_schema.connected_face_set]] ==== connected_face_set A *connected_face_set* is a type of <>, which is a set of <>s such that the domain of the faces together with their bounding edges and vertices is connected. [.underline]#EXPRESS specification:# [source] -- express_ref:[connected_face_set] -- [[topology_schema.vertex_shell]] ==== vertex_shell A *vertex_shell* is a type of <>, which is a <> consisting of a single <>. A *vertex_shell_extent* shall be unique. A <> can only be used by a single *vertex_shell*. A <> can exist independently of a *vertex_shell* [.underline]#EXPRESS specification:# [source] -- express_ref:[vertex_shell] -- [[topology_schema.wire_shell]] ==== wire_shell A *wire_shell* is a type of <>, which is a <> of dimensionality 1. A *wire_shell* can be regarded as a graph constructed of vertices and edges. However, it is not represented directly as a graph, but indirectly, as a set of loops. It is the union of the vertices and edges of these loops that form the graph. The domain of a wire shell, if present, is typically not a manifold. Two restrictions are placed on the structure of a wire shell. (a) The graph as a whole shall be connected. (b) Each edge in the graph shall be referenced exactly twice by the set of loops. [[note_1]] NOTE: Two main applications of wire shells are contemplated. [[note_2]] NOTE: Any connected graph can be written as a single loop obeying condition (b) by using the graph traversal algorithm. Such a graph may serve as a bound for a region. [[note_3]] NOTE: The set of loops referenced by the faces of a closed shell automatically obey condition (b), but need not be connected. However, the faces of a closed shell can always be subdivided in such a way that their loops form a connected graph, and hence a wire shell. Thus, wire shells can represent the ``one-dimensional skeleta'' of closed shells. Writing G^_w_^ for the graph genus, and setting the number of connected components M =1, the Euler graph equation becomes: [[eqn6]]stem:[ (*_V_* - *_E_*) - (1 -G^_w_^) = 0   (6)       ] More specifically, the following topological constraints shall be met: * The loops shall be unique. stem:[ (S^_w_^){L} = (S^_w_^)[L] ] * Each edge shall either be referenced by two loops, or twice by a single loop. That is, in the list ((S^_w_^)[L])[E], each edge appears exactly twice. stem:[ |((S^_w_^)[L])[E]| = 2|((S^_w_^)[L]){E}| ] * Each oriented edge shall be unique. stem:[ ((S^_w_^)[L]){E~_l_~} = ((S^_w_^)[L])[E~_l_~] ] * Equation #eqn6[(6)] shall be satisfied. stem:[ |(((S^_w_^)[L]){E}){V}| - |((S^_w_^)[L]){E}| - 1 +G^_w_^ = 0 ] [.underline]#EXPRESS specification:# [source] -- express_ref:[wire_shell] -- [[topology_schema.open_shell]] ==== open_shell An *open_shell* is a type of <>, which is a <> of dimensionality 2. Its domain, if present, is a finite, connected, oriented, 2-manifold with boundary, but is not a closed surface. It can be thought of as a <> with one or more holes punched in it. The domain of an open shell satisfies 0 < Ξ < ∞. An open shell is functionally more general than a <> because its domain can have handles. The shell is defined by a collection of <>s, which may be *oriented_face*s. The sense of each face, after taking account of the orientation, shall agree with the shell normal as defined below. The *orientation* can be supplied directly as a BOOLEAN attribute of an <>, or be defaulted to TRUE if the shell member is a <> without the orientation attribute. The following combinatorial restrictions on open shells and geometrical restrictions on their domains are designed, together with the informal propositions, to ensure that any domain associated with an open shell is an orientable manifold. * Each face reference shall be unique. * An *open_shell* shall have at least one <>. * A given <> may exist in more than one *open_shell*. The boundary of an open shell consists of the edges that are referenced only once by the <>s (loops) of its faces, together with all of their vertices. The domain of an open shell, if present, contains all edges and vertices of its faces. NOTE: This is slightly different from the definition of a face domain, which includes none of its bounds. For example, a face domain may exclude an isolated point or line segment. An open shell domain may not. (See the algorithm for computing _*B*_ below.) The surface genus and topological normal of an open shell are those that would be obtained by filling in the holes in its domain to produce a closed shell. The topological normal can also be derived from the face normals after taking account of their orientation. The following Euler equation is satisfied by open shells. It is the most general form of Euler equation for connected, orientable surfaces. [[eqn7]]stem:[ (*_V_* - *_E_* - _*L*~l~_ + 2_*F*_) - (2 - 2H - _*B*_) = 0   (7)   ] where *_V_*, *_E_*, _*L*~l~_, _*F*_ are, respectively, the numbers of distinct vertices, edges, face bounds, and faces, H is the surface genus, and _*B*_ is the number of holes. _*B*_ can be determined directly from the graph of edges and vertices defining the bounds of the face, in the following manner: Delete all edges from the graph that are referenced twice by the face bounds of the face. Delete all vertices that have no associated edges. Compute _* B*_ = the genus of the resulting graph. If known a priori, the surface genus H may be used to check equation #eqn7[(7)] as an exact equality. Typically, this will not be the case, so equation #eqn7[(7)] or some equivalent formulation shall be used to compute the genus. Since H shall be a non-negative integer, this leads to the following inequality, a necessary condition for well-formed open shells. [[eqn8]]stem:[*_V_* - *_E_* - _*L*~l~_ + _*B*_ shall be even and ≤ 2-2_*F*_   (8)  ] Specifically, the following topological constraints shall be met: * Each face in the shell is unique. _ (S^o^){F} = (S^o^)[F] _ * Each face bound in the shell is unique. stem:[_ ((S^o^)[F]){ L~l~} = ((S^o^)[F])[ L~l~] _] * Each <> in the shell is unique. stem:[_ ((S^o^)[F])[ L~l~]){E~l~} = ((S^o^)[F])[L~l~])[E~l~] _] * In the list _(((S^o^)[F])[ L~l~])[E]_ there is at least one edge that only appears once and no edges appear more than twice; the singleton edges are on the boundary of the shell. * The Euler condition #eqn8[(8)], and equation #eqn7[(7)] shall be satisfied. stem:[_ |((((S^o^)[F]){ L~l~^e^}){E\}){V\}| + |(((S^o^)[F]){ L~l~^v^}){V}| - |(((S^o^)[F]){L~l~})\{E\}| _]stem:[_ - |((S^o^)[F])[ L~l~]| + B _ is even and ≤ _2 - 2|(S^o^)[F]| _]stem:[_ 2 - 2H - B = |((((S^o^)[F]){ L~l~^e0^){E}){V}| + |(((S^o^)[F]){ L~l~^v^}){V}| _]stem:[_ - |(((S^o^)[F]){ L~l~}){E}| - |((S^o^)[F])[ L~l~]| + 2|(S^o^)[F]| _] [.underline]#EXPRESS specification:# [source] -- express_ref:[open_shell] -- [[topology_schema.oriented_open_shell]] ==== oriented_open_shell An *oriented_open_shell* is a type of <>, constructed from another <> and contains a BOOLEAN direction flag to indicate whether or not the orientation of the constructed <> agrees with the orientation of the original <>. Except for perhaps orientation, the *oriented_open_shell* is equivalent to the original <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_open_shell] -- [[topology_schema.closed_shell]] ==== closed_shell A *closed_shell* is a type of <>, which is a <> of dimensionality 2 which typically serves as a bound for a region in R^3^. A closed shell has no boundary, and has non-zero finite extent. If the shell has a domain with coordinate space R^3^, it divides that space into two connected regions, one finite and the other infinite. In this case, the topological normal of the shell is defined as being directed from the finite to the infinite region. The shell is defined by a collection of <>s, which may be <>s. The sense of each face, after taking account of the orientation, shall agree with the shell normal as defined above. The <> can be supplied directly as a BOOLEAN attribute of an <>, or be defaulted to TRUE if the shell member is a <> without the orientation attribute. The combinatorial restrictions on closed shells and geometrical restrictions on their domains ensure that any domain associated with a closed shell is a closed, orientable manifold. The domain of a closed shell, if present, is a connected, closed, oriented 2-manifold. It is always topologically equivalent to an H-fold torus for some H ≥ 0. The number H is referred to as the {surface genus of the shell. If a shell of genus H has a domain with coordinate space R^3^, the finite region of space inside it is topologically equivalent to a solid ball with H tunnels drilled through it. The surface Euler equation #eqn7[(7)] applies with _*B*_ = 0, because in this case there are no holes. As in the case of <>s, the surface genus H may not be known a priori, but shall be an integer ≥ 0. Thus, a necessary, but not sufficient, condition for a well-formed closed shell is the following: [[eqn9]]stem:[*_V_* - *_E_* - _*L*~l~_ shall be even and ≤ 2 - 2*_F_*   (9)  ] Specifically, the following topological constraints shall be met: * Each face in the shell is unique. _ (S^c^){F} = (S^c^)[F] _ * Each face bound in the shell is unique. _ ((S^c^)[F]){ L~l~} = ((S^c^)[F])[ L~l~] _ * Each <> in the shell is unique. stem:[_ ((S^c^)[F])[ L~l~]){E~l~} = ((S^c^)[F])[L~l~])[E~l~] _] * Each edge in the shell is either used by exactly two face bounds or is used twice by one face bound. stem:[_ |(((S^c^)[F])[L~l~])\{E~l~}| = 2|(((S^c^)[F])[L~l~]){E}| _] That is, in the list (((S^c^)[F])[L~l~])[E] each edge appears exactly twice. * The Euler conditions #eqn9[(9)], or optionally #eqn7[(7)] shall be satisfied. stem:[_ 2 - 2H = |((((S^c^)[F]){ L~l~^e0^){E}){V}| + |(((S^c^)[F]){ L~l~^v^}){V}| _]stem:[_ - |(((S^c^)[F]){ L~l~}){E}| - |((S^c^)[F])[ L~l~]| + 2|(S^c^)[F]| _]_stem:[ |((((S^c^)[F]){ L~l~^e^}){E\}){V\}| + |(((S^c^)[F]){ L~l~^v^}){V}| - |(((S^c^)[F]){L~l~}){E}| ]_stem:[_ - |((S^c^)[F])[ L~l~]| + B _ is even and ≤ _2 - 2|(S^c^)[F]| _] [.underline]#EXPRESS specification:# [source] -- express_ref:[closed_shell] -- [[topology_schema.oriented_closed_shell]] ==== oriented_closed_shell An *oriented_closed_shell* is a type of <>, constructed from another <> and contains a BOOLEAN direction flag to indicate whether or not the orientation of the constructed <> agrees with the orientation of the original <>. Except for perhaps orientation, the *oriented_closed_shell* is equivalent to the original <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[oriented_closed_shell] -- [[topology_schema.connected_face_sub_set]] ==== connected_face_sub_set A *connected_face_sub_set* is a type of <>, whose domain is a connected portion of the domain of an existing <>. As a complex subtype an instance of *connected_face_sub_set* may also be of type <>, or, if appropriate, <>. The bounding loops of the faces of the *connected_face_sub_set* may reference <>s. The topological constraints on a *connected_face_sub_set* are the same as on a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[connected_face_sub_set] -- [[topology_schema.connected_edge_set]] ==== connected_edge_set A *connected_edge_set* is a type of <>, and is a set of <>s such that the domain of the edges together with their bounding vertices is arcwise connected. [.underline]#EXPRESS specification:# [source] -- express_ref:[connected_edge_set] -- [[topology_schema.volume_with_faces]] ==== volume_with_faces A *volume_with_faces* is a type of <> and an explicitly defined solid, in contrast to a boundary representation solid, which is implicitly defined by its boundaries. The volume is limited by faces, which provide means for representation of adjacency information and which allow the subtypes of this entity to take part in a <>. The geometry of a *volume_with_faces* is defined by an associated <>. The portion of the volume used by *the volume_with_faces* shall be embeddable in the *volume_with_faces*. The geometry associated with any component of the faces of the *volume_with_faces* shall be consistent with the volume geometry, in the sense that the domains of all the <>s, <>s and <>s are contained in the *volume_with_faces* geometry volume. A <> may be referenced by more than one *volume_with_faces*. [.underline]#EXPRESS specification:# [source] -- express_ref:[volume_with_faces] -- [[topology_schema.volume_with_parametric_boundary]] ==== volume_with_parametric_boundary A *volume_with_parametric_boundary* is a type of <> where the boundary is specified by six faces. The associated surfaces of these faces shall correspond to the bounding surfaces of the inherited attributed <>. [example] This entity is suitable for use in a block structured model where the blocks meet in a corner-to-corner configuration, in the context of isogeometric analysis. A *volume_with_parametric_boundary* may represent one block in a block structured computational mesh. [.underline]#EXPRESS specification:# [source] -- express_ref:[volume_with_parametric_boundary] -- [[topology_schema.volume_with_shell]] ==== volume_with_shell A *volume_with_shell* is a type of <> where the boundary is specified by a <>. The volume shall not have voids. This entity enables the representation of trimmed volumes. It can also be used to represent blocks in a block structured volume model with T-joints, that is, no corner-to-corner condition is applied. In the latter case, the faces of the <> represent the boundary trimming of the volume. [.underline]#EXPRESS specification:# [source] -- express_ref:[volume_with_shell] -- [[topology_schema.connected_volume_set]] ==== connected_volume_set A *connected_volume_set* is a type of <> and is a set of <> such that the domain of the volumes together with their bounding faces, edges and vertices is connected. NOTE: This concept may be used in isogeometric analysis where the computational mesh is block structured and each block is defined by an explicitly defined volume. [.underline]#EXPRESS specification:# [source] -- express_ref:[connected_volume_set] -- [[topology_schema.connected_volume_sub_set]] ==== connected_volume_sub_set A *connected_volume_sub_set* is a type of <> whose domain is a connected portion of the domain of an existing <>. The bounding faces of the volumes of the *connected_volume_sub_set* may reference <>s. The topological constraints on a *connected_volume_sub_set* are the same as on a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[connected_volume_sub_set] -- [[functions]] == topology_schema function definitions [[topology_schema.boolean_choose]] ==== boolean_choose The *boolean_choose* function returns one of two choices depending the value of a Boolean input argument. The two choices are given as input arguments. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION boolean_choose (b : BOOLEAN; choice1 : GENERIC; choice2 : GENERIC) : GENERIC; IF b THEN RETURN (choice1); ELSE RETURN (choice2); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.boolean_choose.b]]*b:* the Boolean value used to select the element choice1 (TRUE) or choice2 (FALSE); [[topology_schema.boolean_choose.choice1]]*choice1:* (input) the first item which may be selected; [[topology_schema.boolean_choose.choice2]]*choice2:* (input) the second item which may be selected. [[topology_schema.closed_shell_reversed]] ==== closed_shell_reversed The *closed_shell_reversed* function returns an <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION closed_shell_reversed (a_shell : #topology_schema.closed_shell[closed_shell]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.oriented_closed_shell[oriented_closed_shell]; LOCAL the_reverse : oriented_closed_shell; END_LOCAL; IF ('TOPOLOGY_SCHEMA.ORIENTED_CLOSED_SHELL' IN TYPEOF (a_shell) ) THEN the_reverse := dummy_tri || connected_face_set ( a_shell\connected_face_set.cfs_faces) || closed_shell () || oriented_closed_shell( a_shell\oriented_closed_shell.closed_shell_element, NOT(a_shell\oriented_closed_shell.orientation)); ELSE the_reverse := dummy_tri || connected_face_set ( a_shell\connected_face_set.cfs_faces) || closed_shell () || oriented_closed_shell (a_shell, FALSE); END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.closed_shell_reversed.a_shell]]*a_shell:* (input) the <> which is to have its orientation reversed. [[topology_schema.conditional_reverse]] ==== conditional_reverse Depending on its first argument the *conditional_reverse* function returns either the input topology unchanged or a copy of the input topology with its orientation reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION conditional_reverse (p : BOOLEAN; an_item : #topology_schema.reversible_topology[reversible_topology]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.reversible_topology[reversible_topology]; IF p THEN RETURN (an_item); ELSE RETURN (topology_reversed (an_item)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.conditional_reverse.p]]*p:* (input) a BOOLEAN value indicating whether or not orientation reversal is required; [[topology_schema.conditional_reverse.an_item]]*an_item:* (input) an item of topology which can be reversed if required. [[topology_schema.edge_curve_pcurves]] ==== edge_curve_pcurves The *edge_curve_pcurves* function returns the set of pcurves that are associated with (i.e., represent the geometry of) an <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION edge_curve_pcurves (an_edge : #topology_schema.edge_curve[edge_curve]; the_surface_curves : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.surface_curve[surface_curve]) : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.pcurve[pcurve]; LOCAL a_curve : curve; result : SET OF pcurve; the_geometry : LIST[1:2] OF pcurve_or_surface; END_LOCAL; a_curve := an_edge.edge_geometry; result := []; IF 'GEOMETRY_SCHEMA.PCURVE' IN TYPEOF(a_curve) THEN result := result + a_curve; ELSE IF 'GEOMETRY_SCHEMA.SURFACE_CURVE' IN TYPEOF(a_curve) THEN the_geometry := a_curve\surface_curve.associated_geometry; REPEAT k := 1 TO SIZEOF(the_geometry); IF 'GEOMETRY_SCHEMA.PCURVE' IN TYPEOF (the_geometry[k]) THEN result := result + the_geometry[k]; END_IF; END_REPEAT; ELSE REPEAT j := 1 TO SIZEOF(the_surface_curves); the_geometry := the_surface_curves[j].associated_geometry; IF the_surface_curves[j].curve_3d :=: a_curve THEN REPEAT k := 1 TO SIZEOF(the_geometry); IF 'GEOMETRY_SCHEMA.PCURVE' IN TYPEOF (the_geometry[k]) THEN result := result + the_geometry[k]; END_IF; END_REPEAT; END_IF; END_REPEAT; END_IF; END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.edge_curve_pcurves.an_edge]]*an_edge:* (input) the <> whose associated pcurves are to be found; [[topology_schema.edge_curve_pcurves.the_surface_curves]]*the_surface_curves:* (input) the set of all <>s within the scope of the search for <>s. [[topology_schema.edge_reversed]] ==== edge_reversed The *edge_reversed* function returns an <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION edge_reversed (an_edge : #topology_schema.edge[edge]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.oriented_edge[oriented_edge]; LOCAL the_reverse : oriented_edge; END_LOCAL; IF ('TOPOLOGY_SCHEMA.ORIENTED_EDGE' IN TYPEOF (an_edge) ) THEN the_reverse := dummy_tri || edge(an_edge.edge_end, an_edge.edge_start) || oriented_edge(an_edge\oriented_edge.edge_element, NOT (an_edge\oriented_edge.orientation)) ; ELSE the_reverse := dummy_tri || edge(an_edge.edge_end, an_edge.edge_start) || oriented_edge(an_edge, FALSE); END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.edge_reversed.an_edge]]*an_edge:* (input) the <> which is to have its orientation reversed. [[topology_schema.face_bound_reversed]] ==== face_bound_reversed The *face_bound_reversed* function returns a <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION face_bound_reversed (a_face_bound : #topology_schema.face_bound[face_bound]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.face_bound[face_bound]; LOCAL the_reverse : face_bound ; END_LOCAL; IF ('TOPOLOGY_SCHEMA.FACE_OUTER_BOUND' IN TYPEOF (a_face_bound) ) THEN the_reverse := dummy_tri || face_bound(a_face_bound\face_bound.bound, NOT (a_face_bound\face_bound.orientation)) || face_outer_bound() ; ELSE the_reverse := dummy_tri || face_bound(a_face_bound.bound, NOT(a_face_bound.orientation)); END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.face_bound_reversed.a_face_bound]]*a_face_bound:* (input) the <> which is to have its orientation reversed. [[topology_schema.face_reversed]] ==== face_reversed The *face_reversed* function returns an <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION face_reversed (a_face : #topology_schema.face[face]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.oriented_face[oriented_face]; LOCAL the_reverse : oriented_face ; END_LOCAL; IF ('TOPOLOGY_SCHEMA.ORIENTED_FACE' IN TYPEOF (a_face) ) THEN the_reverse := dummy_tri || face(set_of_topology_reversed(a_face.bounds)) || oriented_face(a_face\oriented_face.face_element, NOT (a_face\oriented_face.orientation)) ; ELSE the_reverse := dummy_tri || face(set_of_topology_reversed(a_face.bounds)) || oriented_face(a_face, FALSE) ; END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.face_reversed.a_face]]*a_face:* (input) the <> which is to have its orientation reversed. [[topology_schema.get_tri_in_representations]] ==== get_tri_in_representations The FUNCTION *get_tri_in_representations* returns the SET of <> that are referenced by the SET of representations provided as input to the function. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION get_tri_in_representations (members : SET[0:?] OF ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation[representation]) : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.topological_representation_item[topological_representation_item]; LOCAL tri_set : SET OF topological_representation_item := []; END_LOCAL; IF SIZEOF(members) = 0 THEN RETURN(?); END_IF; REPEAT i := LOINDEX(members) TO HIINDEX(members); REPEAT J := LOINDEX(members[i]\representation.items) TO HIINDEX(members[i]\representation.items); IF 'TOPOLOGY_SCHEMA.TOPOLOGICAL_REPRESENTATION_ITEM' IN TYPEOF(members[i]\representation.items[j]) THEN tri_set := tri_set + members[i]\representation.items[j]; END_IF; END_REPEAT; END_REPEAT; RETURN(tri_set); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.get_tri_in_representations.members]]*members:* the SET of representations that are the input to the function. [[topology_schema.list_face_loops]] ==== list_face_loops Given a <> (or a <>), the *list_face_loops* function returns the list of <> s in the <> or <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_face_loops (f : #topology_schema.face[face]) : LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.loop[loop]; LOCAL loops : LIST[0:?] OF loop := []; END_LOCAL; REPEAT i := 1 TO SIZEOF(f.bounds); loops := loops +(f.bounds[i].bound); END_REPEAT; RETURN(loops); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_face_loops.f]]*f:* (input) the <> for which it is required to generate the list of bounding <>s. [[topology_schema.list_loop_edges]] ==== list_loop_edges Given a <>, the *list_loop_edges* function returns the list of <> s in the <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_loop_edges (l : #topology_schema.loop[loop]) : LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.edge[edge]; LOCAL edges : LIST[0:?] OF edge := []; END_LOCAL; IF 'TOPOLOGY_SCHEMA.EDGE_LOOP' IN TYPEOF(l) THEN REPEAT i := 1 TO SIZEOF(l\path.edge_list); edges := edges + (l\path.edge_list[i].edge_element); END_REPEAT; END_IF; RETURN(edges); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_loop_edges.l]]*l:* (input) the <> for which it is required to generate the list of <>s. [[topology_schema.list_of_topology_reversed]] ==== list_of_topology_reversed The *list_of_topology_reversed* function returns a list of topologies equivalent to the input list of topologies except that the orientation of each element of the list is reversed and the order of the elements in the list is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_of_topology_reversed (a_list : #topology_schema.list_of_reversible_topology_item[list_of_reversible_topology_item]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.list_of_reversible_topology_item[list_of_reversible_topology_item]; LOCAL the_reverse : list_of_reversible_topology_item; END_LOCAL; the_reverse := []; REPEAT i := 1 TO SIZEOF (a_list); the_reverse := topology_reversed (a_list [i]) + the_reverse; END_REPEAT; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_of_topology_reversed.a_list]]*a_list:* (input) the list of topology items which are to have their orientation and list order reversed. [[topology_schema.list_shell_edges]] ==== list_shell_edges Given a <>, the *list_shell_edges* function returns the list of <> s in the <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_shell_edges (s : #topology_schema.shell[shell]) : LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.edge[edge]; LOCAL edges : LIST[0:?] OF edge := []; END_LOCAL; REPEAT i := 1 TO SIZEOF(list_shell_loops(s)); edges := edges + list_loop_edges(list_shell_loops(s)[i]); END_REPEAT; RETURN(edges); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_shell_edges.s]]*s:* (input) the <> for which it is required to generate the list of <>s. [[topology_schema.list_shell_faces]] ==== list_shell_faces Given a <>, the *list_shell_faces* function returns the list of <> s in the <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_shell_faces (s : #topology_schema.shell[shell]) : LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.face[face]; LOCAL faces : LIST[0:?] OF face := []; END_LOCAL; IF ('TOPOLOGY_SCHEMA.CLOSED_SHELL' IN TYPEOF(s)) OR ('TOPOLOGY_SCHEMA.OPEN_SHELL' IN TYPEOF(s)) THEN REPEAT i := 1 TO SIZEOF(s\connected_face_set.cfs_faces); faces := faces + s\connected_face_set.cfs_faces[i]; END_REPEAT; END_IF; RETURN(faces); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_shell_faces.s]]*s:* (input) the <> for which it is required to generate the list of <>s. [[topology_schema.list_shell_loops]] ==== list_shell_loops Given a <>, the *list_shell_loops* function returns the list of <> s in the <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_shell_loops (s : #topology_schema.shell[shell]) : LIST[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.loop[loop]; LOCAL loops : LIST[0:?] OF loop := []; END_LOCAL; IF 'TOPOLOGY_SCHEMA.VERTEX_SHELL' IN TYPEOF(s) THEN loops := loops + s.vertex_shell_extent; END_IF; IF 'TOPOLOGY_SCHEMA.WIRE_SHELL' IN TYPEOF(s) THEN REPEAT i := 1 TO SIZEOF(s.wire_shell_extent); loops := loops + s.wire_shell_extent[i]; END_REPEAT; END_IF; IF ('TOPOLOGY_SCHEMA.OPEN_SHELL' IN TYPEOF(s)) OR ('TOPOLOGY_SCHEMA.CLOSED_SHELL' IN TYPEOF(s)) THEN REPEAT i := 1 TO SIZEOF(s.cfs_faces); loops := loops + list_face_loops(s.cfs_faces[i]); END_REPEAT; END_IF; RETURN(loops); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_shell_loops.s]]*s:* (input) the <> for which it is required to generate the list of <>s. [[topology_schema.list_to_set]] ==== list_to_set The *list_to_set* function creates a SET from a LIST, the type of element for the SET will be the same as that in the original LIST. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION list_to_set (l : LIST[0:?] OF GENERIC) : SET[0:?] OF GENERIC; LOCAL s : SET OF GENERIC:T := []; END_LOCAL; REPEAT i := 1 TO SIZEOF(l); s := s + l[i]; END_REPEAT; RETURN(s); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.list_to_set.l]]*l:* (input) The list of elements to be converted to a set. [[topology_schema.mixed_loop_type_set]] ==== mixed_loop_type_set Given a set of <>s, the *mixed_loop_type_set* function returns TRUE if the set includes both <>s and other types (edge and vertex) of loops. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION mixed_loop_type_set (l : SET[0:?] OF #topology_schema.loop[loop]) : LOGICAL; LOCAL poly_loop_type: LOGICAL; END_LOCAL; IF(SIZEOF(l) <= 1) THEN RETURN(FALSE); END_IF; poly_loop_type := ('TOPOLOGY_SCHEMA.POLY_LOOP' IN TYPEOF(l[1])); REPEAT i := 2 TO SIZEOF(l); IF(('TOPOLOGY_SCHEMA.POLY_LOOP' IN TYPEOF(l[i])) <> poly_loop_type) THEN RETURN(TRUE); END_IF; END_REPEAT; RETURN(FALSE); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.mixed_loop_type_set.l]]*l:* (input) the set of <>s for which it is required to determine whether, or not, it is a mixture of <>s and others. [[topology_schema.open_shell_reversed]] ==== open_shell_reversed The *open_shell_reversed* function returns an <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION open_shell_reversed (a_shell : #topology_schema.open_shell[open_shell]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.oriented_open_shell[oriented_open_shell]; LOCAL the_reverse : oriented_open_shell; END_LOCAL; IF ('TOPOLOGY_SCHEMA.ORIENTED_OPEN_SHELL' IN TYPEOF (a_shell) ) THEN the_reverse := dummy_tri || connected_face_set ( a_shell\connected_face_set.cfs_faces) || open_shell () || oriented_open_shell( a_shell\oriented_open_shell.open_shell_element, (NOT (a_shell\oriented_open_shell.orientation))); ELSE the_reverse := dummy_tri || connected_face_set ( a_shell\connected_face_set.cfs_faces) || open_shell () || oriented_open_shell (a_shell, FALSE); END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.open_shell_reversed.a_shell]]*a_shell:* (input) the <> which is to have its orientation reversed. [[topology_schema.path_head_to_tail]] ==== path_head_to_tail The *path_head_to_tail* function returns TRUE if for the <>s of the input <>, the end vertex of each <> is the same as the start vertex of its successor. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION path_head_to_tail (a_path : #topology_schema.path[path]) : LOGICAL; LOCAL n : INTEGER; p : LOGICAL := TRUE; END_LOCAL; n := SIZEOF (a_path.edge_list); REPEAT i := 2 TO n; p := p AND (a_path.edge_list[i-1].edge_end :=: a_path.edge_list[i].edge_start); END_REPEAT; RETURN (p); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.path_head_to_tail.a_path]]*a_path:* (input) the path for which it is required to verify that its component edges are arranged consecutively head-to-tail. [[topology_schema.path_reversed]] ==== path_reversed The *path_reversed* function returns an <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION path_reversed (a_path : #topology_schema.path[path]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.oriented_path[oriented_path]; LOCAL the_reverse : oriented_path ; END_LOCAL; IF ('TOPOLOGY_SCHEMA.ORIENTED_PATH' IN TYPEOF (a_path) ) THEN the_reverse := dummy_tri || path(list_of_topology_reversed (a_path.edge_list)) || oriented_path(a_path\oriented_path.path_element, NOT(a_path\oriented_path.orientation)) ; ELSE the_reverse := dummy_tri || path(list_of_topology_reversed (a_path.edge_list)) || oriented_path(a_path, FALSE); END_IF; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.path_reversed.a_path]]*a_path:* (input) the <> which is to have its orientation reversed. [[topology_schema.set_of_topology_reversed]] ==== set_of_topology_reversed The *set_of_topology_reversed* function returns a set of topology equivalent to the input set of topology except that the orientation of each element of the set is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION set_of_topology_reversed (a_set : #topology_schema.set_of_reversible_topology_item[set_of_reversible_topology_item]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.set_of_reversible_topology_item[set_of_reversible_topology_item]; LOCAL the_reverse : set_of_reversible_topology_item; END_LOCAL; the_reverse := []; REPEAT i := 1 TO SIZEOF (a_set); the_reverse := the_reverse + topology_reversed (a_set [i]); END_REPEAT; RETURN (the_reverse); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.set_of_topology_reversed.a_set]]*a_set:* (input) the set of topology items which are to have their orientation reversed. [[topology_schema.shell_reversed]] ==== shell_reversed The *shell_reversed* function returns an <> or <> equivalent to the input <> except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION shell_reversed (a_shell : #topology_schema.shell[shell]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.shell[shell]; IF ('TOPOLOGY_SCHEMA.OPEN_SHELL' IN TYPEOF (a_shell) ) THEN RETURN (open_shell_reversed (a_shell)); ELSE IF ('TOPOLOGY_SCHEMA.CLOSED_SHELL' IN TYPEOF (a_shell) ) THEN RETURN (closed_shell_reversed (a_shell)); ELSE RETURN (?); END_IF; END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.shell_reversed.a_shell]]*a_shell:* (input) the <> which is to have its orientation reversed. [[topology_schema.topology_reversed]] ==== topology_reversed The *topology_reversed* function returns topology equivalent to the input topology except that the orientation is reversed. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION topology_reversed (an_item : #topology_schema.reversible_topology[reversible_topology]) : ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.reversible_topology[reversible_topology]; IF ('TOPOLOGY_SCHEMA.EDGE' IN TYPEOF (an_item)) THEN RETURN (edge_reversed (an_item)); END_IF; IF ('TOPOLOGY_SCHEMA.PATH' IN TYPEOF (an_item)) THEN RETURN (path_reversed (an_item)); END_IF; IF ('TOPOLOGY_SCHEMA.FACE_BOUND' IN TYPEOF (an_item)) THEN RETURN (face_bound_reversed (an_item)); END_IF; IF ('TOPOLOGY_SCHEMA.FACE' IN TYPEOF (an_item)) THEN RETURN (face_reversed (an_item)); END_IF; IF ('TOPOLOGY_SCHEMA.SHELL' IN TYPEOF (an_item)) THEN RETURN (shell_reversed (an_item)); END_IF; IF ('SET' IN TYPEOF (an_item)) THEN RETURN (set_of_topology_reversed (an_item)); END_IF; IF ('LIST' IN TYPEOF (an_item)) THEN RETURN (list_of_topology_reversed (an_item)); END_IF; RETURN (?); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.topology_reversed.an_item]]*an_item:* (input) an item of reversible topology which is to have its orientation reversed; [[topology_schema.valid_tri_ids]] ==== valid_tri_ids The FUNCTION *valid_tri_ids* returns TRUE if each <> has an id and if each id is used only once in the SET of <>. NOTE: The value of <> and of <> shall be disjoint in order to support possible use cases where there shall be no more than one id of any kind assigned to a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION valid_tri_ids (objs : SET[0:?] OF #topology_schema.topological_representation_item[topological_representation_item]) : BOOLEAN; LOCAL values : BAG OF identifier := []; END_LOCAL; REPEAT i := LOINDEX(objs) TO HIINDEX(objs); --each tri shall have at least one id. IF NOT(EXISTS(objs[i]\topological_representation_item.permanent_id) OR EXISTS(objs[i]\topological_representation_item.permanent_aggregate_id)) THEN RETURN(FALSE); END_IF; values := values + objs[i]\topological_representation_item.permanent_id + objs[i]\topological_representation_item.permanent_aggregate_id; END_REPEAT; --ids are unique across both types IF SIZEOF(bag_to_set(values)) <> SIZEOF(values) THEN RETURN(FALSE); END_IF; RETURN (TRUE); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.valid_tri_ids.objs]]*objs:* the SET OF <> that are the input to the function. [[topology_schema.vertex_point_pcurves]] ==== vertex_point_pcurves The *vertex_point_pcurves* function returns the set of pcurves that are associated with (i.e., represent the geometry of) a <>. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION vertex_point_pcurves (a_vertex : #topology_schema.vertex_point[vertex_point]; the_degenerates : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.evaluated_degenerate_pcurve[evaluated_degenerate_pcurve]) : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.degenerate_pcurve[degenerate_pcurve]; LOCAL a_point : point; result : SET OF degenerate_pcurve; END_LOCAL; a_point := a_vertex.vertex_geometry; result := []; IF 'GEOMETRY_SCHEMA.DEGENERATE_PCURVE' IN TYPEOF(a_point) THEN result := result + a_point; ELSE REPEAT j := 1 TO SIZEOF(the_degenerates); IF (the_degenerates[j].equivalent_point :=: a_point) THEN result := result + the_degenerates[j]; END_IF; END_REPEAT; END_IF; RETURN (result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[topology_schema.vertex_point_pcurves.a_vertex]]*a_vertex:* (input) the <> whose associated pcurves are to be found; [[topology_schema.vertex_point_pcurves.the_degenerates]]*the_degenerates:* (input) the set of all <>s within the scope of the search for <>s. [source] -- *) END_SCHEMA; -- topology_schema (* -- [[schema6]] == Geometric model schema [[gen]] == General The subject of the *geometric_model* schema is the set of basic resources necessary for the communication of data describing the size, position, and shape of objects. The *solid_model* subtypes provide basic resources for the communication of data describing the precise size and shape of three-dimensional solid objects. The two classical types of solid model, constructive solid geometry (CSG) and boundary representation (B-rep) are included. Also included in this clause are entities providing less complete geometric and topological information than the full CSG or B-rep models. The use of these entities is appropriate for communication with systems whose capability differs from that of solid modelling systems. The entities in this schema are arranged in a logical order beginning with the *solid_model* supertype and its various subtypes. These subtypes include the different types of boundary representations (B-reps) and the CSG solids. After the *solid_model* subtypes the surface model entities are grouped together, followed by the wireframe models and the geometric sets. It concludes with tessellated geometry definitions. This clause defines the information requirements to which implementations shall conform using the EXPRESS language as defined in ISO 10303-11. The following EXPRESS declaration begins the *geometric_model_schema* and identifies the necessary external references. Short names of entities defined in this schema are described in Annex A. Unambiguous identification of this schema is defined in Annex B. [.underline]#EXPRESS specification:# [source] -- *) [[geometric_model_schema]] SCHEMA geometric_model_schema; -- [[interfaces]] [source] -- REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema[geometry_schema];   -- ISO 10303-42 REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema[topology_schema];   -- ISO 10303-42 REFERENCE FROM ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema[measure_schema]   -- ISO 10303-41   (../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.global_unit_assigned_context[global_unit_assigned_context],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.length_measure[length_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.parameter_value[parameter_value],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.plane_angle_measure[plane_angle_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.plane_angle_unit[plane_angle_unit],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_plane_angle_measure[positive_plane_angle_measure],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.ratio_measure[ratio_measure]); REFERENCE FROM ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema[representation_schema]   -- ISO 10303-43   (../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.founded_item[founded_item],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation[representation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation_item[representation_item],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.using_representations[using_representations]); REFERENCE FROM ../../../../data/resources/product_property_representation_schema/product_property_representation_schema.xml#product_property_representation_schema[product_property_representation_schema]   -- ISO 10303-41   (../../../../data/resources/product_property_representation_schema/product_property_representation_schema.xml#product_property_representation_schema.shape_representation[shape_representation]); (* -- NOTE: The schemas referenced above are specified in the following parts: [quote] _____ geometry_schema:: ISO 10303-42 topology_schema:: ISO 10303-42 measure_schema:: ISO 10303-41 representation_schema:: ISO 10303-43 product_property_representation_schema:: ISO 10303-41 _____ NOTE: See <> for a graphical representation of this schema. [[funcon]] == Fundamental concepts and assumptions The constructive solid geometry models are represented by their component primitives and the sequence of Boolean operations ( *union* , *intersection* or *difference* ) used in their construction. The standard CSG primitives are the *cone* , *eccentric_cone* , *cylinder* , *sphere* , *torus* , *block* , *right_angular_wedge* , *ellipsoid* , *tetrahedron* and pyramid. These primitives should be defined in their final position and orientation. A set of two dimensional primitives is included for use in the creation of two dimensional CSG solids. The entity which communicates the logical sequence of Boolean operations is the *boolean_result* which identifies an operator and two operands. The operands can themselves be *boolean_result* s, thus enabling nested operations. In addition to the CSG primitives, any solid model, including, in particular, swept solids and *half_space_solid* s may be Boolean operands. The swept solids are the *swept_area_solid* s and the *swept_face_solids* . The swept solids are obtained by extruding or sweeping a planar face which may contain holes. The *half_space_solid* is essentially defined as a semi-infinite solid on one side of a surface; it may be limited by a *box_domain* . The *half_space_2d* is an equivalent two dimensional entity and represents the region to one side of a curve. B-rep models are represented by the set of shells defining their exterior or interior boundaries. Constraints ensure that the associated geometry is well defined and that the Euler formula connecting the numbers of vertices, edges, faces, loops and shells in the model is satisfied. The *faceted_brep* is restricted to represent B-reps in which all faces are planar and every loop is a *poly_loop* . The *solid_replica* entity provides a mechanism for copying an existing solid in a new location. The *shell_based_surface_model* , *face_based_surface_model* , *shell_based_wireframe_model* , *edge_based_wireframe_model* , *geometric_set* , and *geometric_curve_set* entities do not enforce the integrity checks of the *manifold_solid_brep* and can be used for the communication of incomplete models or non-manifold objects, including two-dimensional models. [[types]] == geometric_model_schema type definitions [[geometric_model_schema.angular_deviation]] ==== angular_deviation An *angular_deviation* type specifies the maximum angular deviation of any facet in a tessellated shape model. Angular deviation is a measure of the angle between the normal vectors at two points on a shape. The angular deviation for a given facet is the maximum angular deviation for all pairs of points on the shape in the region being approximated by the facet. NOTE: The angular deviation of a facet may be approximated by the maximum angular deviation between the pairs of vertex normals. [.underline]#EXPRESS specification:# [source] -- *) TYPE angular_deviation=../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_plane_angle_measure[positive_plane_angle_measure]; END_TYPE; (* -- [[geometric_model_schema.boolean_operand]] ==== boolean_operand The *boolean_operand* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *boolean_operand* type identifies all those types of entities which may participate in a boolean operation to form a CSG solid. This includes provision for the special case of a two dimensional 'solid' which is an arcwise connected finite region in two dimensional space defined by boolean operations with 2D operands. [.underline]#EXPRESS specification:# [source] -- *) TYPE boolean_operand=SELECT    (#geometric_model_schema.boolean_result[boolean_result],     #geometric_model_schema.csg_primitive[csg_primitive],     #geometric_model_schema.half_space_2d[half_space_2d],     #geometric_model_schema.half_space_solid[half_space_solid],     #geometric_model_schema.solid_model[solid_model]); END_TYPE; (* -- [[geometric_model_schema.boolean_operator]] ==== boolean_operator A *boolean_operator* type defines the three boolean operators used in the definition of CSG solids. [.underline]#EXPRESS specification:# [source] -- *) TYPE boolean_operator=ENUMERATION OF    (union,     intersection,     difference); END_TYPE; (* -- [.underline]#Enumerated item definitions:# [[geometric_model_schema.boolean_operator.union]]*union:* the operation of constructing the regularised set theoretic union of the volumes defined by two solids; [[geometric_model_schema.boolean_operator.intersection]]*intersection:* the operation of constructing the regularised set theoretic intersection of the volumes defined by two solids; [[geometric_model_schema.boolean_operator.difference]]*difference:* the regularised set theoretic difference between the volumes defined by two solids; [[geometric_model_schema.bounded_primitive_2d]] ==== bounded_primitive_2d The *bounded_primitive_2d* type is an extensible list of alternate data types. It provides a mechanism to refer to instances of the data types included in the *bounded_primitive_2d* type or in its extensions. NOTE: The list of entity data types will be extended in application resources that use the constructs of this resource. A *bounded_primitive_2d* extensible select type defines the set of two dimensional CSG primitives of finite size which may participate in boolean operations or be used as <> to directly define a two dimensional CSG solid. [.underline]#EXPRESS specification:# [source] -- *) TYPE bounded_primitive_2d=EXTENSIBLE GENERIC_ENTITY SELECT    (#geometric_model_schema.area_with_outer_boundary[area_with_outer_boundary],     #geometric_model_schema.circular_area[circular_area],     #geometric_model_schema.elliptic_area[elliptic_area],     #geometric_model_schema.polygonal_area[polygonal_area],     #geometric_model_schema.rectangular_area[rectangular_area]); END_TYPE; (* -- [[geometric_model_schema.chordal_deviation]] ==== chordal_deviation A *chordal_deviation* type specifies the maximum chordal deviation of any facet in a tessellated shape model. Chordal deviation is the maximum value of the minimum distance from any point on the edge of a facet to the closest point on the surface being approximated by the facets. [.underline]#EXPRESS specification:# [source] -- *) TYPE chordal_deviation=../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure]; END_TYPE; (* -- [[geometric_model_schema.csg_primitive]] ==== csg_primitive The *csg_primitive* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *csg_primitive* select type defines the set of CSG primitives which may participate in boolean operations or be used as <> to directly define a CSG solid. The 3D CSG primitives are <> , <> , <> , <> , <> , <> , <> , <> , <> , and <> . The <> s which are all types of <> may participate in boolean operations with other two dimensional entities. [.underline]#EXPRESS specification:# [source] -- *) TYPE csg_primitive=SELECT    (#geometric_model_schema.block[block],     #geometric_model_schema.bounded_primitive_2d[bounded_primitive_2d],     #geometric_model_schema.cyclide_segment_solid[cyclide_segment_solid],     #geometric_model_schema.eccentric_cone[eccentric_cone],     #geometric_model_schema.ellipsoid[ellipsoid],     #geometric_model_schema.faceted_primitive[faceted_primitive],     #geometric_model_schema.rectangular_pyramid[rectangular_pyramid],     #geometric_model_schema.right_angular_wedge[right_angular_wedge],     #geometric_model_schema.right_circular_cone[right_circular_cone],     #geometric_model_schema.right_circular_cylinder[right_circular_cylinder],     #geometric_model_schema.sphere[sphere],     #geometric_model_schema.torus[torus]); END_TYPE; (* -- [[geometric_model_schema.csg_select]] ==== csg_select The *csg_select* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *csg_select* select type identifies the types of entity which may be selected as the root of a CSG tree including a single CSG primitive as a special case. [.underline]#EXPRESS specification:# [source] -- *) TYPE csg_select=SELECT    (#geometric_model_schema.boolean_result[boolean_result],     #geometric_model_schema.csg_primitive[csg_primitive]); END_TYPE; (* -- [[geometric_model_schema.edge_or_curve]] ==== edge_or_curve The *edge_or_curve* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *edge_or_curve* select type identifies the types of entity which may be selected as the underlying geometry of a tessellated edge. [.underline]#EXPRESS specification:# [source] -- *) TYPE edge_or_curve=SELECT    (../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.curve[curve],     ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.edge[edge]); END_TYPE; (* -- [[geometric_model_schema.face_or_surface]] ==== face_or_surface The *face_or_surface* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *face_or_surface* select type identifies the types of entity which may be selected as the underlying geometry of a tessellated face. [.underline]#EXPRESS specification:# [source] -- *) TYPE face_or_surface=SELECT    (../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.face[face],     ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.surface[surface]); END_TYPE; (* -- [[geometric_model_schema.geometric_set_select]] ==== geometric_set_select The *geometric_set_select* type is an extensible list of alternate data types. It provides a mechanism to refer to instances of the data types included in the *geometric_set_select* type or in its extensions. NOTE: The list of entity data types will be extended in application resources that use the constructs of this resource. A *geometric_set_select* type identifies the types of entities which can occur in a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE geometric_set_select=EXTENSIBLE GENERIC_ENTITY SELECT    (../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.curve[curve],     ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.point[point],     ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.surface[surface]); END_TYPE; (* -- [[geometric_model_schema.length_to_height_ratio]] ==== length_to_height_ratio A *length_to_height_ratio* type specifies the maximum ratio of height to length of any facets in a tessellated shape model. The height is measured in a direction perpendicular to the longest edge of a facet. NOTE: *length_to_height_ratio* is a criterion used to ensure reasonable proportions of the facets and thus, ensure the regularity of a set of facets in a tessellated geometry. [.underline]#EXPRESS specification:# [source] -- *) TYPE length_to_height_ratio=../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.ratio_measure[ratio_measure]; END_TYPE; (* -- [[geometric_model_schema.maximum_edge_length]] ==== maximum_edge_length A *maximum_edge_length* type specifies the maximum length of any edge off any facet of a tessellated shape model. [.underline]#EXPRESS specification:# [source] -- *) TYPE maximum_edge_length=../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure]; END_TYPE; (* -- [[geometric_model_schema.path_or_composite_curve]] ==== path_or_composite_curve The *path_or_composite_curve* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *path_or_composite_curve* select type identifies the types of entities in a geometric model which can be linked to a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE path_or_composite_curve=SELECT    (../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.composite_curve[composite_curve],     ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.path[path]); END_TYPE; (* -- [[geometric_model_schema.surface_model]] ==== surface_model The *surface_model* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *surface_model* select type collects all possible surface model entities. Some product model representations consist of collections of surfaces which do not necessarily form the complete boundary of a solid. Such a model can be represented by a collection of <> s or <> s. [.underline]#EXPRESS specification:# [source] -- *) TYPE surface_model=SELECT    (#geometric_model_schema.face_based_surface_model[face_based_surface_model],     #geometric_model_schema.shell_based_surface_model[shell_based_surface_model]); END_TYPE; (* -- [[geometric_model_schema.tessellated_facet_long_short_edge_ratio]] ==== tessellated_facet_long_short_edge_ratio A *tessellated_facet_long_short_edge_ratio* type specifies the maximum aspect ratio of any facet in a tessellated shape model. A *tessellated_facet_long_short_edge_ratio* is the ratio of the longest to shortest edge of a facet. NOTE: *tessellated_facet_long_short_edge_ratio* is an easily calculated criterion used to verify that the individual facets in a tessellated geometry have edges of similar lengths. [.underline]#EXPRESS specification:# [source] -- *) TYPE tessellated_facet_long_short_edge_ratio=../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.ratio_measure[ratio_measure]; END_TYPE; (* -- [[geometric_model_schema.tessellated_edge_or_vertex]] ==== tessellated_edge_or_vertex The *tessellated_edge_or_vertex* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *tessellated_edge_or_vertex* select type identifies the types of entities that are used as items in the definition of a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE tessellated_edge_or_vertex=SELECT    (#geometric_model_schema.tessellated_edge[tessellated_edge],     #geometric_model_schema.tessellated_vertex[tessellated_vertex]); END_TYPE; (* -- [[geometric_model_schema.tessellation_accuracy_parameter_item]] ==== tessellation_accuracy_parameter_item The *tessellation_accuracy_parameter_item* type is an extensible list of alternate data types. It provides a mechanism to refer to instances of the data types included in the *tessellation_accuracy_parameter_item* type or in its extensions. NOTE: The list of entity data types will be extended in application resources that use the constructs of this resource. A *tessellation_accuracy_parameter_item* select type identifies the types of entities that are used as items in the definition of <> of a <> . [.underline]#EXPRESS specification:# [source] -- *) TYPE tessellation_accuracy_parameter_item=EXTENSIBLE SELECT    (#geometric_model_schema.angular_deviation[angular_deviation],     #geometric_model_schema.chordal_deviation[chordal_deviation],     #geometric_model_schema.length_to_height_ratio[length_to_height_ratio],     #geometric_model_schema.maximum_edge_length[maximum_edge_length],     #geometric_model_schema.tessellated_facet_long_short_edge_ratio[tessellated_facet_long_short_edge_ratio]); END_TYPE; (* -- [[geometric_model_schema.wireframe_model]] ==== wireframe_model The *wireframe_model* type is a list of alternate data types. It provides a mechanism to refer to an instance of one of these data types. A *wireframe_model* type collects all possible wireframe model entities. A wireframe representation of a geometric model contains information only about the intersections of the surfaces forming the boundary but does not contain information about the surfaces themselves. [.underline]#EXPRESS specification:# [source] -- *) TYPE wireframe_model=SELECT    (#geometric_model_schema.edge_based_wireframe_model[edge_based_wireframe_model],     #geometric_model_schema.shell_based_wireframe_model[shell_based_wireframe_model]); END_TYPE; (* -- [[entities]] == geometric_model_schema entity definitions [[geometric_model_schema.solid_model]] ==== solid_model A *solid_model* is a type of <> which is a complete representation of the nominal shape of a product such that all points in the interior are connected. Any point can be classified as being inside, outside or on the boundary of a solid. There are several different types of solid model representations including 'solid's defined as connected regions in two dimensional space. [.underline]#EXPRESS specification:# [source] -- express_ref:[solid_model] -- [[geometric_model_schema.manifold_solid_brep]] ==== manifold_solid_brep A *manifold_solid_brep* is a type of <> which is is a finite, arcwise connected volume bounded by one or more surfaces, each of which is a connected, oriented, finite, closed 2-manifold. There is no restriction on the number of through holes, nor on the number of voids within the volume. The Boundary Representation (B-rep) of a manifold solid utilises a graph of edges and vertices embedded in a connected, oriented, finite, closed two manifold surface. The embedded graph divides the surface into arcwise connected areas known as faces. The edges and vertices, therefore, form the boundaries of the faces and the domain of a face does not include its boundaries. The embedded graph may be disconnected and may be a pseudograph. The graph is labelled; that is, each entity in the graph has a unique identity. The geometric surface definition used to specify the geometry of a face shall be 2-manifold embeddable in the plane within the domain of the face. In other words, it shall be connected, oriented, finite, non-self-intersecting, and of surface genus 0. Faces do not intersect except along their boundaries. Each edge along the boundary of a face is shared by at most one other face in the assemblage. The assemblage of edges in the B-rep do not intersect except at their boundaries (i.e., vertices). The geometric curve definition used to specify the geometry of an edge shall be arcwise connected and shall not self-intersect or overlap within the domain of the edge. The geometry of an edge shall be consistent with the geometry of the faces of which it forms a partial bound. The geometry used to define a vertex shall be consistent with the geometry of the faces and edges of which it forms a partial bound. A B-rep is represented by one or more <> s which shall be disjoint. One shell, the outer, shall completely enclose all the other shells and no other shell may enclose a shell. The facility to define a B-rep with one or more internal voids is provided by the <> subtype. The following version of the Euler formula shall be satisfied [[eqnGM1]]stem:[_ χ ~ms~ = *V - E + 2F - L*~l~* - 2(S - G*^s^) _ = 0   (1)   ] where _*V, E, F}, L*~l~_ and _* S*_ are the numbers of unique vertices, edges, faces, face bounds and shells in the model and _* G*^s^_ is the sum of the genus of the shells. More specifically, the topological entities shall conform to the following constraints, where _*B*_ denotes a manifold solid B-rep: * The shells shall be unique stem:[_* (B)[S] = (B){S} *_] * Each face in the B-rep is unique stem:[_* ((B)[S])[F] = ((B)[S]){F} *_] * Each loop is unique stem:[_* (((B)[S])[F])[L] = (((B)[S])[F]){L} *_] * Each (edge + logical) pair is unique stem:[_* ((((B)[S])[F])[L])[E ~l~ }] = ((((B)[S])[F])[L]){E *~l~ } _] * Each edge in the B-rep is either used by exactly two loops or twice by one loop stem:[_* |((((B)[S])[F])[L]){E*~l~ }| = 2 *|((((B)[S])[F])[L])[E*~l~ ]| _] That is, in the list _* ((((B)[S])[F])[L])[E]*_ each edge appears exactly twice. * Equation #eqnGM1[(1)] shall be satisfied stem:[_* 2|(B)[S]| - 2 ΣG*^s^ = * |(((((B)[S])[F]){L ^e^ }){E}){V}| + |((((B)[S])[F]){L *^v^ } *){V}| - |((((B)[S])[F]){L}){E}| + 2|((B)[S])[F]| - |(((B)[S])[F])[L]| *_] The topological normal of the B-rep at each point on its boundary is the surface normal direction that points away from the solid material. The <> normals, as used, shall be consistent with the topological normal of the B-rep. The *manifold_solid_brep* has two subtypes, <> and <> , with which there exists a default ANDOR relationship. The following can all be instantiated: * *manifold_solid_brep* * <> * <> * <> AND <> [.underline]#EXPRESS specification:# [source] -- express_ref:[manifold_solid_brep] -- [[geometric_model_schema.brep_with_voids]] ==== brep_with_voids A *brep_with_voids* is a type of <> which contains one or more voids in its interior. The voids are represented by <> s which are defined so that the <> normals point into the void, that is, with <> FALSE. A *brep_with_voids* can also be a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[brep_with_voids] -- [[geometric_model_schema.faceted_brep]] ==== faceted_brep A *faceted_brep* is a type of <> which is a simple form of boundary representation model in which all faces are planar and all edges are straight lines. NOTE: The *faceted_brep* has been introduced in order to support the large number of systems that allow boundary type solid representations with planar surfaces only. Faceted models may be represented by <> but their representation as a *faceted_brep* will be more compact. Unlike the B-rep model, edges and vertices are not represented explicitly in the model but are implicitly available through the <> entity. A *faceted_brep* has to meet the same topological constraints as the <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[faceted_brep] -- [[geometric_model_schema.brep_2d]] ==== brep_2d A *brep_2d* is a type of <> which is a bounded two-dimensional region defined by a face. Any two-dimensional point can be classified as being inside, outside or on the boundary of a *brep_2d* . A *brep_2d* shall have an outer boundary and may have any number of holes. [.underline]#EXPRESS specification:# [source] -- express_ref:[brep_2d] -- [[geometric_model_schema.csg_solid]] ==== csg_solid A *csg_solid* is a type of <> which is a solid represented as a CSG model defined by a collection of so-called primitive solids, combined using regularised boolean operations. The allowed operations are intersection, union and difference. As a special case a *csg_solid* can also consist of a single CSG primitive. A regularised subset of space is the closure of its interior, where this phrase is interpreted in the usual sense of point set topology. For <> s regularisation has the effect of removing dangling edges and other anomalies produced by the original operations. A CSG solid requires two kinds of information for its complete definition: geometric and structural. The geometric information is conveyed by <> s. These typically are primitive volumes such as cylinders, wedges and extrusions, but can include general B-rep models. <> s can also be <> s (transformed solids) and <> s. The structural information is in a tree (strictly, an acyclic directed graph) of <> and CSG solids, which represent a `recipe' for building the solid. The terminal nodes are the geometric primitives and other solids. Every *csg_solid* has precisely one <> associated with it which is the root of the tree that defines the solid. (There may be further <> s within the tree as operands). The significance of a *csg_solid* entity is that the solid defined by the associated tree is thus identified as a significant object in itself, and in this way it is distinguished from other <> entities representing intermediate results during the construction process. [.underline]#EXPRESS specification:# [source] -- express_ref:[csg_solid] -- [[geometric_model_schema.boolean_result]] ==== boolean_result A *boolean_result* is a type of <> which is the result of a regularised operation on two solids to create a new solid. Valid operations are regularised union, regularised intersection, and regularised difference. For purposes of Boolean operations, a solid is considered to be a regularised set of points. The final *boolean_result* depends upon the operation and the two operands. In the case of the difference operator the order of the operands is also significant. The operator can be either union, intersection or difference. The effect of these operators is described below. _union_ on two solids is the new solid that contains all the points that are in either the *first_operand* or the *second_operand* or both. _intersection_ on two solids is the new solid that is the regularisation of the set of all points that are in both the *first_operand* and the *second_operand* . The result of the _difference_ operation on two solids is the regularisation of the set of all points which are in the *first_operand* , but not in the *second_operand* . NOTE: For example if the first operand is a block and the second operand is a solid cylinder of suitable dimensions and location the *boolean_result* produced with the difference operator would be a block with a circular hole. [.underline]#EXPRESS specification:# [source] -- express_ref:[boolean_result] -- [[geometric_model_schema.block]] ==== block A *block* is a type of <> which is a solid rectangular parallelepiped, defined with a location and placement coordinate system. The *block* is specified by the positive lengths *x* , *y* , and *z* along the axes of the placement coordinate system, and has one vertex at the origin of the placement coordinate system. [.underline]#EXPRESS specification:# [source] -- express_ref:[block] -- [[geometric_model_schema.right_angular_wedge]] ==== right_angular_wedge A *right_angular_wedge* is a type of <> which can be envisioned as the result of intersecting a block with a plane perpendicular to one of its faces. It is defined with a location and local coordinate system. A triangular/trapezoidal face lies in the plane defined by the placement X and Y axes. This face is defined by positive lengths *x* and *y* along the placement X and Y axes, by the length *ltx* (if nonzero) parallel to the X axis at a distance *y* from the placement origin, and by the line connecting the ends of the *x* and *ltx* segments. The remainder of the wedge is specified by the positive length *z* along the placement Z axis which defines a distance through which the trapezoid or triangle is extruded. If *ltx* = 0, the wedge has five faces; otherwise, it has six faces. NOTE: See Figure #figure_GMfig24[(26)] for interpretation of attributes. [[figure26]] .Right angular wedge and its attributes image::GMfig24.gif[Right angular wedge and its attributes] [.underline]#EXPRESS specification:# [source] -- express_ref:[right_angular_wedge] -- [[geometric_model_schema.rectangular_pyramid]] ==== rectangular_pyramid A *rectangular_pyramid* is a type of <> which is a solid pyramid with a rectangular base. The apex of the pyramid is directly above the centre point of the base. The *rectangular_pyramid* is specified by its position, which provides a placement coordinate system, its length, depth and height. [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangular_pyramid] -- [[geometric_model_schema.faceted_primitive]] ==== faceted_primitive A *faceted_primitive* is a type of <> which is a type of CSG primitive with planar faces. It is defined by a list of four or more points which locate the vertices. These points shall not be coplanar. [.underline]#EXPRESS specification:# [source] -- express_ref:[faceted_primitive] -- [[geometric_model_schema.tetrahedron]] ==== tetrahedron A *tetrahedron* is a type of <> with 4 vertices and 4 triangular faces. It is defined by the four points which locate the vertices. These points shall not be coplanar. [.underline]#EXPRESS specification:# [source] -- express_ref:[tetrahedron] -- [[geometric_model_schema.convex_hexahedron]] ==== convex_hexahedron A *convex_hexahedron* is a type of <> primitive with 8 vertices and 6 four-sided faces. It is defined by the 8 points which locate the vertices. [[note_1]] NOTE: See Figure #figure_GMfig25[(27)] for further information about the faces and vertices. [[figure27]] .Convex_hexahedron image::Geomfig22.gif[Convex_hexahedron] [.underline]#EXPRESS specification:# [source] -- express_ref:[convex_hexahedron] -- [[geometric_model_schema.sphere]] ==== sphere A *sphere* is a type of <> which is a CSG primitive with a spherical shape defined by a centre and a radius. [.underline]#EXPRESS specification:# [source] -- express_ref:[sphere] -- [[geometric_model_schema.right_circular_cone]] ==== right_circular_cone A *right_circular_cone* is a type of <> which is a CSG primitive in the form of a cone which may be truncated. It is defined by an axis, a point on the axis, the semi-angle of the cone, and a distance giving the location in the negative direction along the axis from the point to the base of the cone. In addition, a radius is given, which, if nonzero, gives the size and location of a truncated face of the cone. [.underline]#EXPRESS specification:# [source] -- express_ref:[right_circular_cone] -- [[geometric_model_schema.right_circular_cylinder]] ==== right_circular_cylinder A *right_circular_cylinder* is a type of <> which is a CSG primitive in the form of a solid cylinder of finite height. It is defined by an axis point at the centre of one planar circular face, an axis, a height, and a radius. The faces are perpendicular to the axis and are circular discs with the specified radius. The height is the distance from the first circular face centre in the positive direction of the axis to the second circular face centre. [.underline]#EXPRESS specification:# [source] -- express_ref:[right_circular_cylinder] -- [[geometric_model_schema.eccentric_cone]] ==== eccentric_cone A *eccentric_cone* is a type of <> which is a CSG primitive which is a generalisation of the <> . The *eccentric_cone* may have an elliptic cross section, and may have a central axis which is not perpendicular to the base. Depending upon the value of the *ratio* attribute it may be truncated, or may take the form of a generalised cylinder. When truncated the top face of the cone is parallel to the plane of the base and has a similar cross section. [[note_1]] NOTE: In the placement coordinate system defined by *position* the central point of the top face of the *eccentric_cone* has coordinates (x_offset, y_offset, height). [[note_2]] NOTE: If *ratio* = 0.0 the *eccentric_cone* includes the apex. If *ratio* = 1.0 the *eccentric_cone* is in the form of a generalised cylinder with all cross sections of the same dimensions. [.underline]#EXPRESS specification:# [source] -- express_ref:[eccentric_cone] -- [[geometric_model_schema.torus]] ==== torus A *torus* is a type of <> which is a solid primitive defined by sweeping the area of a circle (the generatrix) about a larger circle (the directrix). The directrix is defined by a location and direction <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[torus] -- [[geometric_model_schema.ellipsoid]] ==== ellipsoid A *ellipsoid* is a type of <> which is a type of CSG primitive in the form of a solid ellipsoid. It is defined by its location and orientation and by the lengths of the three semi-axes. [.underline]#EXPRESS specification:# [source] -- express_ref:[ellipsoid] -- [[geometric_model_schema.cyclide_segment_solid]] ==== cyclide_segment_solid A *cyclide_segment_solid* is a type of <> which is a partial Dupin cyclide solid (see <>). This solid has two planar circular faces that in general have different radii and different normal directions. Around the boundary of each of these faces the curved surface of the solid is tangent to a right circular cone. In the following definition the semi-vertex angle of the cone is in each case specified with respect to the outward normal to its corresponding circular face. NOTE: See Figure #figure_GMfig_Cyclide_segment_solid[(28)] for further information about the attributes. [[figure28]] .Cyclide_segment_solid image::GMfig25.gif[Cyclide_segment_solid] [[figure29]] .Cross section of cyclide_segment_solid image::GMfig26.gif[Cross section of cyclide_segment_solid] [.underline]#EXPRESS specification:# [source] -- express_ref:[cyclide_segment_solid] -- [[geometric_model_schema.half_space_solid]] ==== half_space_solid A *half_space_solid* is a type of <> which is defined by the half space which is the regular subset of the domain which lies on one side of an unbounded surface. The domain is limited by an orthogonal box in the <> subtype. The side of the surface which is in the half space is determined by the surface normals and the agreement flag. If the agreement flag is TRUE, then the subset is the one the normals point away from. If the agreement flag is FALSE, then the subset is the one the normals point into. For a valid *half_space_solid* , the surface shall divide the domain into exactly two subsets. Also, within the domain the surface shall be manifold and all the surface normals shall point into the same subset. NOTE: A *half_space_solid* is not a subtype of <> ; *half_space_solid* s are only useful as operands in Boolean expressions. [.underline]#EXPRESS specification:# [source] -- express_ref:[half_space_solid] -- [[geometric_model_schema.boxed_half_space]] ==== boxed_half_space A *boxed_half_space* is a type of <> that is trimmed by a surrounding rectangular box. The box has its edges parallel to the coordinate axes of the geometric coordinate system. NOTE: The purpose of the box is to facilitate CSG computations by producing a solid of finite size. [.underline]#EXPRESS specification:# [source] -- express_ref:[boxed_half_space] -- [[geometric_model_schema.box_domain]] ==== box_domain A *box_domain* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.founded_item[founded_item] which is an orthogonal box oriented parallel to the axes of the geometric coordinate system which may be used to limit the domain of a <> . The *box_domain* is specified by the point at the corner of the box with minimum coordinates, and the lengths of the sides measured in the directions of the coordinate axes.e normals shall point into the same subset. [.underline]#EXPRESS specification:# [source] -- express_ref:[box_domain] -- [[geometric_model_schema.primitive_2d]] ==== primitive_2d A *primitive_2d* is a type of <> which is a two-dimensional CSG primitive represented as either a <> , <> , <> , <> , or <> . *primitive_2d* s may be used with other two-dimensional objects to create <> s in 2D. NOTE: The combination of *primitive_2d* s and any of the three-dimensional <> s in a <> is prohibited by the constraints on <> in the geometry schema. [.underline]#EXPRESS specification:# [source] -- express_ref:[primitive_2d] -- [[geometric_model_schema.circular_area]] ==== circular_area A *circular_area* is a type of <> which has the form of a circular disk. It is defined by a centre point and a radius. [.underline]#EXPRESS specification:# [source] -- express_ref:[circular_area] -- [[geometric_model_schema.elliptic_area]] ==== elliptic_area A *elliptic_area* is a type of <> which has an ellipse as outer boundary. It is defined by its position and the lengths of the semi-axes of the bounding ellipse. [.underline]#EXPRESS specification:# [source] -- express_ref:[elliptic_area] -- [[geometric_model_schema.rectangular_area]] ==== rectangular_area A *rectangular_area* is a type of <> with a rectangular shape. It is defined by a placement coordinate system and linear dimensions. It is specified by the positive lengths x and y along the axes of the placement coordinate system, and has one corner at the origin of the placement coordinate system. [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangular_area] -- [[geometric_model_schema.polygonal_area]] ==== polygonal_area A *polygonal_area* is a type of <> with straight edges. It is defined by a list of three or more <> s which implicitly define edges connecting consecutive points. The final edge is from the last point in the list of *bounds* to the first. [.underline]#EXPRESS specification:# [source] -- express_ref:[polygonal_area] -- [[geometric_model_schema.area_with_outer_boundary]] ==== area_with_outer_boundary An *area_with_outer_boundary* is a type of <> which is the finite interior of a closed curve. It is defined by its boundary, a <> which is required to be closed. [.underline]#EXPRESS specification:# [source] -- express_ref:[area_with_outer_boundary] -- [[geometric_model_schema.half_space_2d]] ==== half_space_2d A *half_space_2d* is a type of <> which is a partially bounded region of two-dimensional space. It is defined as the half plane which is the regular subset of the domain that lies on one side of an unbounded curve, or, of a closed curve. The domain is limited by a rectangle in the <> subtype. The side of the curve which is in the half plane is determined by the curve direction and an *agreement_flag* . For a valid *half_space_2d* , the curve shall divide the 2D space into exactly two connected regions. Within the domain of the *half_space_2d* the *base_curve* shall be manifold. NOTE: A *half_space_2d* may be used as an operand in a Boolean operation provided the final CSG object is finite and arcwise connected; only subtypes which are also of type <> may define a simple CSG solid with no Boolean operation. [.underline]#EXPRESS specification:# [source] -- express_ref:[half_space_2d] -- [[geometric_model_schema.rectangled_half_space]] ==== rectangled_half_space A *rectangled_half_space* is a type of <> which is trimmed by a surrounding rectangle. The trimming rectangle has its edges parallel to the coordinate axes of the geometric coordinate system. [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangled_half_space] -- [[geometric_model_schema.rectangle_domain]] ==== rectangle_domain A *rectangle_domain* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.founded_item[founded_item] which is a rectangular area in two-dimensional space with its edges parallel to the coordinate axes. It may be used to limit the domain of a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[rectangle_domain] -- [[geometric_model_schema.swept_face_solid]] ==== swept_face_solid A *swept_face_solid* is a type of <> which collects the entities which are defined procedurally by a sweeping action on planar figures. The position in space of the swept solid will be dependent upon the position of the *swept_face* . The *swept_face* will be a face of the *swept_face_solid* , except in the case of a solid of revolution with angle equal to 360 degrees. [.underline]#EXPRESS specification:# [source] -- express_ref:[swept_face_solid] -- [[geometric_model_schema.extruded_face_solid]] ==== extruded_face_solid A *extruded_face_solid* is a type of <> which is a solid defined by sweeping a planar <> . The direction of translation is defined by a <> , and the length of the translation is defined by a distance *depth* . The planar face may have holes which will sweep into holes in the solid. [.underline]#EXPRESS specification:# [source] -- express_ref:[extruded_face_solid] -- [[geometric_model_schema.revolved_face_solid]] ==== revolved_face_solid A *revolved_face_solid* is a type of <> which is a solid of revolution formed by revolving a planar <> about an axis. The axis shall be in the plane of the face and the axis shall not intersect the interior of the face. The planar face may have holes which will sweep into holes in the solid. The direction of revolution is clockwise when viewed along the axis in the positive direction. More precisely if *A* is the axis location and * d* is the axis direction and *C* is an arc on the surface of revolution generated by an arbitrary point *p* on the boundary of the face, then *C* leaves *p* in direction * d × (p - A)* as the face is revolved. NOTE: See Figure #figure_GMfig27[(30)] for illustration of attributes. [[figure30]] .Revolved face solid image::GMfig27.gif[Revolved face solid] [.underline]#EXPRESS specification:# [source] -- express_ref:[revolved_face_solid] -- [[geometric_model_schema.surface_curve_swept_face_solid]] ==== surface_curve_swept_face_solid A *surface_curve_swept_face_solid* is a type of <> which is the result of sweeping a face along a *directrix* lying on a *reference_surface* . The orientation of the <> is related to the direction of the surface normal. The <> is required to be a <> lying in the plane z = 0 and this is swept along the *directrix* in such a way that the origin of the local coordinate system used to define the <> is on the *directrix* and the local X axis is in the direction of the normal to the *reference_surface* at the current point. The resulting solid has the property that the cross section of the surface by the normal plane to the *directrix* at any point is a copy of the <> . The orientation of the <> geometry as it sweeps along the *directrix* is precisely defined by a <> with attributes: <> as point (0,0,0), <> as the normal *N* to the *reference_surface* at the point of the *directrix* with parameter _u_ . <> as the direction of the tangent vector * t * at the point of the *directrix* with parameter _u_ . The remaining attributes are defaulted to define a corresponding transformation matrix * T* ( _u_ ), which varies with the *directrix* parameter _u_ . NOTE: The geometric shape of the solid is not dependent upon the curve parametrisation; the volume depends upon the area of the face and the length of the *directrix* . [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_curve_swept_face_solid] -- [[geometric_model_schema.swept_area_solid]] ==== swept_area_solid A *swept_area_solid* is a type of <> which collects the entities which are defined procedurally by a sweeping action on planar bounded surfaces. The position in space of the swept solid will be dependent upon the position of the *swept_area* . The *swept_area* will be a face of the resulting *swept_area_solid* , except for the case of a <> with angle equal to 360 degrees. [.underline]#EXPRESS specification:# [source] -- express_ref:[swept_area_solid] -- [[geometric_model_schema.extruded_area_solid]] ==== extruded_area_solid A *extruded_area_solid* is a type of <> which is a solid defined by sweeping a bounded planar surface. The direction of translation is defined by a <> , and the length of the translation is defined by a distance *depth* . The planar area may have holes which will sweep into holes in the solid. [.underline]#EXPRESS specification:# [source] -- express_ref:[extruded_area_solid] -- [[geometric_model_schema.revolved_area_solid]] ==== revolved_area_solid A *revolved_area_solid* is a type of <> which is a solid formed by revolving a planar bounded surface about an axis. The axis shall be in the plane of the surface and the axis shall not intersect the interior of the bounded surface. The bounded surface may have holes which will sweep into holes in the solid. The direction of revolution is clockwise when viewed along the axis in the positive direction. More precisely if *A* is the axis location and *d* is the axis direction and *C* is an arc on the surface of revolution generated by an arbitrary point *p* on the boundary of the <> , then *C* leaves *p* in direction * d × (p - A)* as the area is revolved. [.underline]#EXPRESS specification:# [source] -- express_ref:[revolved_area_solid] -- [[geometric_model_schema.surface_curve_swept_area_solid]] ==== surface_curve_swept_area_solid A *surface_curve_swept_area_solid* is a type of <> which is the result of sweeping a face along a *directrix* lying on a *reference_surface* . The orientation of the <> is related to the direction of the surface normal. The <> is required to be a <> lying in the plane z = 0 and this is swept along the *directrix* in such a way that the origin of the local coordinate system used to define the <> . is on the *directrix* and the local X axis is in the direction of the normal to the *reference_surface* at the current point. The resulting solid has the property that the cross section of the surface by the normal plane to the *directrix* at any point is a copy of the <> . The orientation of the <> as it sweeps along the *directrix* is precisely defined by a <> with attributes: <> as point (0,0,0), <> as the normal *N* to the *reference_surface* at the point of the *directrix* with parameter _u_ . <> as the direction of the tangent vector *t* at the point of the *directrix* with parameter _u_ . The remaining attributes are defaulted to define a corresponding transformation matrix *T* ( _u_ ), which varies with the *directrix* parameter _u_ . NOTE: The geometric shape of the solid is not dependent upon the curve parametrisation; the volume depends upon the area swept and the length of the *directrix* . [.underline]#EXPRESS specification:# [source] -- express_ref:[surface_curve_swept_area_solid] -- [[geometric_model_schema.swept_disk_solid]] ==== swept_disk_solid A *swept_disk_solid* is a type of <> which is the solid produced by sweeping a circular disk along a three dimensional curve. During the sweeping operation the normal to the plane of the circular disk is in the direction of the tangent to the *directrix* curve and the centre of the disk lies on the *directrix* . The circular disk may, optionally, have a central hole, in this case the resulting solid has a through hole, or, an internal void when the directrix forms a close curve. [example] A solid in the form of a toroidal shell of major radius R ~1~ , minor radius R ~2~ and shell thickness _t_ could be defined as an instance of *swept_disk_solid* with the following attributes: stem:[*directrix* : a circle in 3D space of radius R ~1~ , ]stem:[*radius* : R ~2~ , ]stem:[*inner_radius* : R ~2~ - _t_ , ]stem:[*start_param* : 0, ]stem:[*end_param* : 360 degrees. ] [.underline]#EXPRESS specification:# [source] -- express_ref:[swept_disk_solid] -- [[geometric_model_schema.trimmed_volume]] ==== trimmed_volume A *trimmed_volume* is a type of <> for which the boundaries are the 6 constant parameter surfaces _u = u1, u = u2, v = v1, v = v2, w = w1, _ and _w = w2_ , of the *basis_volume* . In the three dimensional parameter space of the *basis_volume* the domain of the *trimmed_volume* is a cuboid. [[note_1]] NOTE: A *trimmed_volume* for which the *basis_volume* is not closed in any parameter direction will satisfy the additional constraints _u1 < u2, v1 < v2, w1 < w2._ [[note_2]] NOTE: If the *basis_volume* is closed in one or more parameter directions and uses circular functions (sine and cosine) in its definition the second value of a parameter may be less than the first value of that parameter. This is interpreted as a periodic definition of a portion of the volume from the second parameter boundary to the first including the `seam' of the parameter value. [example] If refcyl is a reference to a <> then: trimmed_volume(refcyl, 0.0, 0.5, 0.0, 1,0, 0.0, 1.0) defines a solid half cylinder whose vertical face is defined by the plane _ u = 0_ , trimmed_volume(refcyl, 0.875, 0.125, 0.0, 1.0, 0.9, 1.0) defines a quadrant of a cylindrical shell of thickness (0.1 radius 1) centred on _ u = 0 _ . The trimming values for _u_ are from 0.875 to 0.125 (equivalent to 1.125). [.underline]#EXPRESS specification:# [source] -- express_ref:[trimmed_volume] -- [[geometric_model_schema.solid_replica]] ==== solid_replica A *solid_replica* is a type of <> which is a copy of another solid at a new location. [.underline]#EXPRESS specification:# [source] -- express_ref:[solid_replica] -- [[geometric_model_schema.shell_based_surface_model]] ==== shell_based_surface_model A *shell_based_surface_model* is a type of <> which is described by a set of open or closed shells of dimensionality 2. The shells shall not intersect except at edges and vertices. In particular, distinct faces may not intersect. A complete face of one shell may be shared with another shell. Coincident portions of shells shall both reference the same faces, edges and vertices defining the coincident region. There shall be at least one <> . A <> may exist independently of a *shell_based_surface_model* . [.underline]#EXPRESS specification:# [source] -- express_ref:[shell_based_surface_model] -- [[geometric_model_schema.face_based_surface_model]] ==== face_based_surface_model A *face_based_surface_model* is a type of <> which is described by a set of <> s of dimensionality 2. The <> s shall not intersect except at edges and vertices, except that a <> in one connected face set may overlap a <> in another connected face set, provided the face boundaries are identical. There shall be at least one <> . A <> may exist independently of a *face_based_surface_model* . [.underline]#EXPRESS specification:# [source] -- express_ref:[face_based_surface_model] -- [[geometric_model_schema.shell_based_wireframe_model]] ==== shell_based_wireframe_model A *shell_based_wireframe_model* is a type of <> which is described by a graph of edges and vertices embedded in _ R ^3^_ . The graph may be disconnected. Within the graph the edges do not intersect except at their boundaries (i.e., vertices). The geometry associated with a vertex shall be consistent with the geometry associated with any of the edges of which the vertex forms a boundary. A *shell_based_wireframe_model* is represented by one or more <> s of dimensionality 0 or 1. There shall be at least one <> . A <> may exist independently of a *shell_based_wireframe_model* . [.underline]#EXPRESS specification:# [source] -- express_ref:[shell_based_wireframe_model] -- [[geometric_model_schema.edge_based_wireframe_model]] ==== edge_based_wireframe_model An *edge_based_wireframe_model* is a type of <> which is described by a graph of edges and vertices embedded in _ R ^3^_ . The graph may be disconnected. Within the graph the edges do not intersect except at their boundaries (i.e., vertices). The geometry associated with a vertex shall be consistent with the geometry associated with any of the edges of which the vertex forms a boundary. An *edge_based_wireframe_model* is represented by one or more <> s of dimensionality 1. There shall be at least one <> . A <> may exist independently of an *edge_based_wireframe_model* . [.underline]#EXPRESS specification:# [source] -- express_ref:[edge_based_wireframe_model] -- [[geometric_model_schema.geometric_set]] ==== geometric_set A *geometric_set* is a type of <> which is intended for the transfer of models when a topological structure is not available. [.underline]#EXPRESS specification:# [source] -- express_ref:[geometric_set] -- [[geometric_model_schema.geometric_curve_set]] ==== geometric_curve_set An *geometric_curve_set* is a type of <> which is a collection of two- or three-dimensional <> s and <> s. [.underline]#EXPRESS specification:# [source] -- express_ref:[geometric_curve_set] -- [[geometric_model_schema.sectioned_spine]] ==== sectioned_spine An *sectioned_spine* is a type of <> which is a representation of the shape of a three dimensional object composed of a spine curve and a number of planar *cross_sections* . The shape is defined between the first element of *cross_sections* and the last element of this set. NOTE: A *sectioned_spine* may be used to represent a surface or a solid but the interpolation of the shape between the cross-sections is not defined. For the representation of a solid all cross-sections are closed curves. [.underline]#EXPRESS specification:# [source] -- express_ref:[sectioned_spine] -- [[geometric_model_schema.geometric_set_replica]] ==== geometric_set_replica An *geometric_set_replica* is a type of <> which defines a replica of a <> in a different location. Each element of the set is transformed by the same *transformation* which may include scaling. The type of set produced will correspond to that of the *parent_set* [.underline]#EXPRESS specification:# [source] -- express_ref:[geometric_set_replica] -- [[geometric_model_schema.tessellated_shape_representation]] ==== tessellated_shape_representation A *tessellated_shape_representation* is a type of ../../../resource_docs/fundamentals_of_product_description_and_support/sys/23_schema.xml#product_property_representation_schema.shape_representation[shape_representation] in which the geometry is approximately represented by a tessellated model with planar facets. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_shape_representation] -- [[geometric_model_schema.tessellated_item]] ==== tessellated_item A *tessellated_item* is a type of <> used in the description of a tessellated shape. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_item] -- [[geometric_model_schema.repositioned_tessellated_item]] ==== repositioned_tessellated_item A *repositioned_tessellated_item* is a type of <> which has been re-postioned by defining the coordinates with respect to a new axis system. [.underline]#EXPRESS specification:# [source] -- express_ref:[repositioned_tessellated_item] -- [[geometric_model_schema.tessellated_structured_item]] ==== tessellated_structured_item A *tessellated_structured_item* is a type of <> which has a topological structure. The links to topological components of an exact geometric model are defined with the subtypes. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_structured_item] -- [[geometric_model_schema.coordinates_list]] ==== coordinates_list A *coordinates_list* is a type of <> that defines the coordinate values for points used in a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[coordinates_list] -- [[geometric_model_schema.tessellated_vertex]] ==== tessellated_vertex A *tessellated_vertex* is a type of <> and is a single vertex in a tessellated model. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_vertex] -- [[geometric_model_schema.tessellated_edge]] ==== tessellated_edge A *tessellated_edge* is a type of <> . The geometry of the *tessellated_edge* is approximated by straight line segments joining the points listed. NOTE: A *tessellated_edge* may be used as the boundary between two <> s. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_edge] -- [[geometric_model_schema.tessellated_connecting_edge]] ==== tessellated_connecting_edge A *tessellated_connecting_edge* is a type of <> . The *tessellated_connecting_edge* connects two faces and contains information relating to the face normals at corresponding points on the 2 faces. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_connecting_edge] -- [[geometric_model_schema.tessellated_face]] ==== tessellated_face A *tessellated_face* is a type of <> that represents a face of a tessellated model. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_face] -- [[geometric_model_schema.triangulated_face]] ==== triangulated_face A *triangulated_face* is a type of <> that has its geometry defined by a set of triangles. [[figure31]] .Use of pnindex to locate coordinates image::GMfig28.gif[Use of pnindex to locate coordinates] [.underline]#EXPRESS specification:# [source] -- express_ref:[triangulated_face] -- [[geometric_model_schema.cubic_bezier_tessellated_edge]] ==== cubic_bezier_tessellated_edge A *cubic_bezier_tessellated_edge* is a type of <> which takes the form of a piecewise cubic bezier curve. The *cubic_bezier_tessellated_edge* has its geometry defined by a list of control points, referenced by the inherited <> attribute; in this list only the points corresponding to ends of segments lie on the edge and the list of pointers is of length 3n +1, where n is the number of segments. [.underline]#EXPRESS specification:# [source] -- express_ref:[cubic_bezier_tessellated_edge] -- [[geometric_model_schema.cubic_tessellated_connecting_edge]] ==== cubic_tessellated_connecting_edge A *cubic_tessellated_connecting_edge* is a type of <> which takes the form of a cubic curve and connects two <>s. The *cubic_tessellated_connecting_edge* has its geometry defined by a list of control points contained in the inherited <> attribute; in this list only the points corresponding to vertices of the cubic triangles of the adjacent faces lie on the edge and the list of pointers is of length 3n +1, where n is the number of triangles with adjacent edges on each side of the connecting edge. [.underline]#EXPRESS specification:# [source] -- express_ref:[cubic_tessellated_connecting_edge] -- [[geometric_model_schema.complex_triangulated_face]] ==== complex_triangulated_face A *complex_triangulated_face* is a type of <> defining the geometry as a set of triangles arranged in strips and fans. [[note_1]] NOTE: The ordering of the points used to define the strips or fans of triangles is shown in Figure #figure_GMfig29[(32)] . [[figure32]] .Ordering of points for complex_triangulated_face image::GMfig29.gif[Ordering of points for complex_triangulated_face] [.underline]#EXPRESS specification:# [source] -- express_ref:[complex_triangulated_face] -- [[geometric_model_schema.cubic_bezier_triangulated_face]] ==== cubic_bezier_triangulated_face A *cubic_bezier_triangulated_face* is a type of <> that has its geometry defined by a set of curved triangles. Each of the triangles is a 3 sided Bezier cubic surface defined by a list of 10 control points, 9 near the edges and one above the centre. The control points * P ~1 ~* , * P ~2 ~* , * P ~3 ~* , are at the vertices of the triangle. Each triangle is a bi-parametric surface with equation: stem:[*s* (u,v) = (1 - u -v) ^3^* P ~1~* + u ^3^* P ~2~* + v ^3^* P ~3~* + 3(1 - u -v) ^2^ u * P ~4~* + 3(1 - u -v)u ^2^* P ~5~* + 3u ^2^ v * P ~6~* + 3uv ^2^* P ~7~* + 3(1 - u -v)v ^2^* P ~8~* + 3(1 - u -v) ^2^ v * P ~9~* + 6uv(1 - u -v) * P ~10~*] The parametric range for each triangle is _0 ≤ u ≤ 1; 0 ≤ v ≤ 1;_ with _ u + v ≤ 1. _ Continuity of geometry between adjacent triangles is assured provided the adjacent edges reference the same 4 control points. Each edge of the triangle is a Bezier cubic curve of parametric length 1 defined by the 4 control points along that edge. * P ~1~ , * P ~4~** , * P ~5~* , * P ~2~* define the cubic curve of the first edge of the triangle, other edges are defined in a similar manner. [[figure33]] .Relationship between control points and triangular surface image::beziertri.gif[Relationship between control points and triangular surface ] [[note_1]] NOTE: See Figure #figure_beziertri[(33)] for illustration of the numbering of the control points. [.underline]#EXPRESS specification:# [source] -- express_ref:[cubic_bezier_triangulated_face] -- [[geometric_model_schema.tessellated_solid]] ==== tessellated_solid A *tessellated_solid* is a type of <> that is a tessellated representation of a solid model. Its geometry is defined as a set of <> s. NOTE: The <> s defining the geometry may be relocated in a local coordinate system by defining a complex instance of this entity with a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_solid] -- [[geometric_model_schema.tessellated_shell]] ==== tessellated_shell A *tessellated_shell* is a type of <> that is a tessellated representation of a shell. Its geometry is defined as a set of <> s. NOTE: The <> s defining the geometry may be relocated in a local coordinate system by defining a complex instance of this entity with a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_shell] -- [[geometric_model_schema.tessellated_wire]] ==== tessellated_wire A *tessellated_wire* is a type of <> that is a tessellated representation of a collection of bounded curves joined end to end. Its geometry is defined as a set of tessellated edges and vertices. NOTE: The edges and vertices defining the geometry may be relocated in a local coordinate system by defining a complex instance of this entity with a <> . [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_wire] -- [[geometric_model_schema.tessellated_surface_set]] ==== tessellated_surface_set A *tessellated_surface_set* is a type of <> that is a tessellated representation of a collection of surfaces. [[note_1]] NOTE: If the surfaces are triangulated the geometry of the surfaces is fully defined by creating an instance of one of the subtypes. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_surface_set] -- [[geometric_model_schema.triangulated_surface_set]] ==== triangulated_surface_set A *triangulated_surface_set* is a type of <> defining the geometry of the surface set as a set of triangles. The individual triangles are defined by listing the coordinates of their vertices. Normals to the surfaces defined by the set of triangles may be included. [.underline]#EXPRESS specification:# [source] -- express_ref:[triangulated_surface_set] -- [[geometric_model_schema.complex_triangulated_surface_set]] ==== complex_triangulated_surface_set A *complex_triangulated_surface_set* is a type of <> defining the geometry by a set of triangles arranged in strips and fans. [[note_1]] NOTE: The ordering of the points used to define the strips or fans of triangles is shown in Figure #figure_GMfig29[(32)] . [.underline]#EXPRESS specification:# [source] -- express_ref:[complex_triangulated_surface_set] -- [[geometric_model_schema.tessellated_curve_set]] ==== tessellated_curve_set A *tessellated_curve_set* is a type of <> that is a tessellated representation of a collection of curves. The geometry of each curve is defined as a list of points obtained via the *line_strips* attribute. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_curve_set] -- [[geometric_model_schema.tessellated_geometric_set]] ==== tessellated_geometric_set A *tessellated_geometric_set* is a type of <> that is a collection of <> s. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_geometric_set] -- [[geometric_model_schema.tessellated_point_set]] ==== tessellated_point_set A *tessellated_point_set* is a type of <> that is a collection of points used to define tessellated geometry. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_point_set] -- [[geometric_model_schema.tessellated_shape_representation_with_accuracy_parameters]] ==== tessellated_shape_representation_with_accuracy_parameters A *tessellated_shape_representation_with_accuracy_parameters* is a type of <> which has additional parameters to define the accuracy of the tessellated approximation to the corresponding exact geometric shape. [.underline]#EXPRESS specification:# [source] -- express_ref:[tessellated_shape_representation_with_accuracy_parameters] -- [[functions]] == geometric_model_schema function definitions [[geometric_model_schema.acyclic_set_replica]] ==== acyclic_set_replica The *acyclic_set_replica* boolean function is a recursive function which determines whether, or not, a given <> participates in its own definition. The function returns FALSE if the <> refers to itself, directly or indirectly, in its own definition. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION acyclic_set_replica (rep : #geometric_model_schema.geometric_set_replica[geometric_set_replica]; parent : #geometric_model_schema.geometric_set[geometric_set]) : BOOLEAN; IF NOT (('GEOMETRY_SCHEMA.GEOMETRIC_SET_REPLICA') IN TYPEOF(parent)) THEN RETURN (TRUE); END_IF; (* Return TRUE if the parent is not of type geometric_set_replica *) IF (parent :=: rep) THEN RETURN (FALSE); (* Return FALSE if the parent is the same geometric_set_replica, otherwise, call function again with the parents own parent_set. *) ELSE RETURN(acyclic_set_replica(rep, parent\geometric_set_replica.parent_set)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.acyclic_set_replica.rep]]*rep:* (input) the <> which is to be tested for a cyclic reference; [[geometric_model_schema.acyclic_set_replica.parent]]*parent:* (input) a <> used in the definition of the replica; [[geometric_model_schema.acyclic_solid_replica]] ==== acyclic_solid_replica The *acyclic_solid_replica* boolean function is a recursive function which determines whether, or not, a given <> participates in its own definition. The function returns FALSE if the <> refers to itself, directly or indirectly, in its own definition. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION acyclic_solid_replica (rep : #geometric_model_schema.solid_replica[solid_replica]; parent : #geometric_model_schema.solid_model[solid_model]) : BOOLEAN; IF NOT (('GEOMETRY_SCHEMA.SOLID_REPLICA') IN TYPEOF(parent)) THEN RETURN (TRUE); END_IF; (* Return TRUE if the parent is not of type solid_replica. *) IF (parent :=: rep) THEN RETURN (FALSE); (* Return FALSE if the parent is the same solid_replica, otherwise, call function again with the parents own parent_solid. *) ELSE RETURN(acyclic_solid_replica(rep, parent\solid_replica.parent_solid)); END_IF; END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.acyclic_solid_replica.rep]]*rep:* (input) the <> which is to be tested for a cyclic reference; [[geometric_model_schema.acyclic_solid_replica.parent]]*parent:* (input) a <> used in the definition of the replica; [[geometric_model_schema.build_transformed_set]] ==== build_transformed_set The *build_transformed_set* function builds a transformed set by applying the input <> to the individual curve, point or surface elements of the input <> . [.underline]#EXPRESS specification:# [source] -- *) FUNCTION build_transformed_set (tr : ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.cartesian_transformation_operator[cartesian_transformation_operator]; gset : #geometric_model_schema.geometric_set[geometric_set]) : SET[0:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/6_schema.xml#geometric_model_schema.geometric_set_select[geometric_set_select]; LOCAL s : SET [1:?] OF geometric_set_select := gset.elements; trset : SET [0:?] OF geometric_set_select := []; END_LOCAL; REPEAT j := 1 TO SIZEOF(s); IF ('GEOMETRY_SCHEMA.CURVE' IN TYPEOF(s[j])) THEN trset := trset + dummy_gri || curve() ||curve_replica(s[j],tr); ELSE IF ('GEOMETRY_SCHEMA.POINT' IN TYPEOF(s[j])) THEN trset := trset + dummy_gri || point() || point_replica(s[j],tr); ELSE IF ('GEOMETRY_SCHEMA.SURFACE' IN TYPEOF(s[j])) THEN trset := trset + dummy_gri || surface() || surface_replica(s[j], tr || cartesian_transformation_operator_3d (?)); END_IF; END_IF; END_IF; END_REPEAT; RETURN(trset); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.build_transformed_set.tr]]*tr:* (input) the <> defining the transformation; [[geometric_model_schema.build_transformed_set.gset]]*gset:* (input) the geometric set to be transformed; [[geometric_model_schema.constraints_geometry_shell_based_surface_model]] ==== constraints_geometry_shell_based_surface_model The *constraints_geometry_shell_based_surface_model* boolean function evaluates the geometric constraints on a <> and returns TRUE if they are satisfied. The *constraints_geometry_shell_based_surface_model* boolean function evaluates the geometric constraints on a <> and returns TRUE if they are satisfied. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_geometry_shell_based_surface_model (m : #geometric_model_schema.shell_based_surface_model[shell_based_surface_model]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT j := 1 TO SIZEOF(m.sbsm_boundary); IF (NOT ('TOPOLOGY_SCHEMA.OPEN_SHELL' IN TYPEOF(m.sbsm_boundary[j])) AND (NOT ('TOPOLOGY_SCHEMA.CLOSED_SHELL' IN TYPEOF(m.sbsm_boundary[j])))) THEN result := FALSE; RETURN(result); (* A surface model is composed of OPEN_ and CLOSED_SHELLs. *) END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.constraints_geometry_shell_based_surface_model.m]]*m:* (input) the <> for which the geometric constraints are to be checked; [[geometric_model_schema.constraints_geometry_shell_based_surface_model.m]]*m:* (input) the <> for which the geometric constraints are to be checked; [[geometric_model_schema.constraints_geometry_shell_based_wireframe_model]] ==== constraints_geometry_shell_based_wireframe_model The *constraints_geometry_shell_based_wireframe_model* boolean function evaluates the geometric constraints on a <> and returns TRUE if they are satisfied. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION constraints_geometry_shell_based_wireframe_model (m : #geometric_model_schema.shell_based_wireframe_model[shell_based_wireframe_model]) : BOOLEAN; LOCAL result : BOOLEAN := TRUE; END_LOCAL; REPEAT j := 1 TO SIZEOF(m.sbwm_boundary); IF (NOT ('TOPOLOGY_SCHEMA.WIRE_SHELL' IN TYPEOF(m.sbwm_boundary[j])) AND (NOT ('TOPOLOGY_SCHEMA.VERTEX_SHELL' IN TYPEOF(m.sbwm_boundary[j])))) THEN result := FALSE; RETURN(result); (* A wireframe model is composed of WIRE_ and VERTEX_SHELLs *) END_IF; END_REPEAT; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.constraints_geometry_shell_based_wireframe_model.m]]*m:* (input) the <> for which the geometric constraints are to be checked; [[geometric_model_schema.msb_shells]] ==== msb_shells The *msb_shells* function determines the set of all <> s used in the definition of a <> . Special provision is made for the <> subtype. [.underline]#EXPRESS specification:# [source] -- *) FUNCTION msb_shells (brep : #geometric_model_schema.manifold_solid_brep[manifold_solid_brep]) : SET[1:?] OF ../../../../data/resource_docs/geometric_and_topological_representation/sys/5_schema.xml#topology_schema.closed_shell[closed_shell]; LOCAL return_set: SET[1:?] OF closed_shell := [brep.outer]; END_LOCAL; IF SIZEOF(QUERY(msbtype <* TYPEOF(brep) | msbtype LIKE '*BREP_WITH_VOIDS')) >= 1 THEN return_set := return_set + brep\brep_with_voids.voids; END_IF; RETURN(return_set); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[geometric_model_schema.msb_shells.brep]]*brep:* (input) A <> for which a set of <> components is required.; [source] -- *) END_SCHEMA; -- geometric_model_schema (* -- [[schema7]] == Scan data 3d shape model schema [[gen]] == General The subject of the *scan_data_3d_shape_model* schema is the set of basic resources necessary for the communication of data describing the representation of a shape as a cloud of points produced by a scanning process. This clause defines the information requirements to which implementations shall conform using the EXPRESS language as defined in ISO 10303-11. The following EXPRESS declaration begins the *scan_data_3d_shape_model_schema* and identifies the necessary external references. Short names of entities defined in this schema are described in Annex A. Unambiguous identification of this schema is defined in Annex B. [.underline]#EXPRESS specification:# [source] -- *) [[scan_data_3d_shape_model_schema]] SCHEMA scan_data_3d_shape_model_schema; -- [[interfaces]] [source] -- REFERENCE FROM ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema[measure_schema]   -- ISO 10303-41   (../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.global_unit_assigned_context[global_unit_assigned_context],   ../../../../data/resources/measure_schema/measure_schema.xml#measure_schema.positive_length_measure[positive_length_measure]); REFERENCE FROM ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema[representation_schema]   -- ISO 10303-43   (../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation[representation],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.representation_item[representation_item],   ../../../../data/resources/representation_schema/representation_schema.xml#representation_schema.using_representations[using_representations]); REFERENCE FROM ../../../../data/resources/product_property_representation_schema/product_property_representation_schema.xml#product_property_representation_schema[product_property_representation_schema]   -- ISO 10303-41   (../../../../data/resources/product_property_representation_schema/product_property_representation_schema.xml#product_property_representation_schema.shape_representation[shape_representation]); REFERENCE FROM ../../../../data/resources/support_resource_schema/support_resource_schema.xml#support_resource_schema[support_resource_schema]   -- ISO 10303-41   (../../../../data/resources/support_resource_schema/support_resource_schema.xml#support_resource_schema.label[label]); REFERENCE FROM ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema[geometry_schema]   -- ISO 10303-42   (../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.axis2_placement_3d[axis2_placement_3d],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.geometric_representation_item[geometric_representation_item],   ../../../../data/resource_docs/geometric_and_topological_representation/sys/4_schema.xml#geometry_schema.geometric_representation_context[geometric_representation_context]); (* -- NOTE: The schemas referenced above are specified in the following parts: [quote] _____ measure_schema:: ISO 10303-41 representation_schema:: ISO 10303-43 product_property_representation_schema:: ISO 10303-41 support_resource_schema:: ISO 10303-41 geometry_schema:: ISO 10303-42 _____ NOTE: See <> for a graphical representation of this schema. [[funcon]] == Fundamental concepts and assumptions [[types]] == scan_data_3d_shape_model_schema type definition [[scan_data_3d_shape_model_schema.point_cloud_set_or_superset]] ==== point_cloud_set_or_superset The *point_cloud_set_or_superset* select type collects together, for reference when constructing more complex models, sets and supersets of point clouds. [.underline]#EXPRESS specification:# [source] -- *) TYPE point_cloud_set_or_superset=SELECT    (#scan_data_3d_shape_model_schema.point_cloud_dataset[point_cloud_dataset],     #scan_data_3d_shape_model_schema.point_cloud_superdataset[point_cloud_superdataset]); END_TYPE; (* -- [[entities]] == scan_data_3d_shape_model_schema entity definitions [[scan_data_3d_shape_model_schema.scanned_data_item]] ==== scanned_data_item A *scanned_data_item* is a type of <> that represents an element of geometric data produced by a scanner. A *scanned_data_item* is required to be used in a <>. [.underline]#EXPRESS specification:# [source] -- express_ref:[scanned_data_item] -- [[scan_data_3d_shape_model_schema.point_cloud_dataset]] ==== point_cloud_dataset A *point_cloud_dataset* is a type of <>, and represents the geometry of a cloud of points produced by a scanner. [[note_1]] NOTE: The *point_cloud_dataset* has subtypes with additional attributes to permit the creation of instances of a *point_cloud_dataset* with normals, with colours, or with intensities. The and/or relationship between these subtypes enables, for example, the creation as a complex instance, of a *point_cloud_dataset* with normals and colours attached to each point. . [.underline]#EXPRESS specification:# [source] -- express_ref:[point_cloud_dataset] -- [[scan_data_3d_shape_model_schema.point_cloud_dataset_with_normals]] ==== point_cloud_dataset_with_normals A *point_cloud_dataset_with_normals* is a type of <>, which has a normal defined at each point of the dataset. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_cloud_dataset_with_normals] -- [[scan_data_3d_shape_model_schema.point_cloud_dataset_with_colours]] ==== point_cloud_dataset_with_colours A *point_cloud_dataset_with_colours* is a type of <>, which has a colour defined at each point of the dataset. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_cloud_dataset_with_colours] -- [[scan_data_3d_shape_model_schema.point_cloud_dataset_with_intensities]] ==== point_cloud_dataset_with_intensities A *point_cloud_dataset_with_intensities* is a type of <>, which has an intensity defined at each point of the dataset. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_cloud_dataset_with_intensities] -- [[scan_data_3d_shape_model_schema.point_cloud_superdataset]] ==== point_cloud_superdataset A *point_cloud_superdataset* is a type of <>, which contains a list of <>s. Each of the <>s, except, possibly, the last is required to contain the same number of points. [.underline]#EXPRESS specification:# [source] -- express_ref:[point_cloud_superdataset] -- [[scan_data_3d_shape_model_schema.triangulated_point_cloud_dataset]] ==== triangulated_point_cloud_dataset A *triangulated_point_cloud_dataset* is a type of <> in which the points of the dataset are arranged into triangles. [.underline]#EXPRESS specification:# [source] -- express_ref:[triangulated_point_cloud_dataset] -- [[scan_data_3d_shape_model_schema.scan_3d_model]] ==== scan_3d_model A *scan_3d_model* is a type of <>, which represents the data produced by scanning a 3D shape. It contains scanner properties and a set of <>s. Each of the <>s includes point cloud data.. [.underline]#EXPRESS specification:# [source] -- express_ref:[scan_3d_model] -- [[scan_data_3d_shape_model_schema.scanner_property]] ==== scanner_property A *scanner_property* is a type of ../../../resource_docs/representation_structures/sys/4_schema.xml#representation_schema.representation_item[representation_item], which represents one or more properties of a scanner. [.underline]#EXPRESS specification:# [source] -- express_ref:[scanner_property] -- [[scan_data_3d_shape_model_schema.scanner_basic_properties]] ==== scanner_basic_properties A *scanner_basic_properties* is a type of <>, which represents the basic properties of a scanner. NOTE: More advanced properties of a scanner may be represented by further subtypes of <> [.underline]#EXPRESS specification:# [source] -- express_ref:[scanner_basic_properties] -- [[scan_data_3d_shape_model_schema.scan_data_shape_representation]] ==== scan_data_shape_representation A *scan_data_shape_representation* is a type of ../../../resource_docs/fundamentals_of_product_description_and_support/sys/23_schema.xml#product_property_representation_schema.shape_representation[shape_representation] in which the geometry of a 3D shape is approximately represented by a set of point cloud data produced by a scanner. [.underline]#EXPRESS specification:# [source] -- express_ref:[scan_data_shape_representation] -- [[functions]] == scan_data_3d_shape_model_schema function definitions [[scan_data_3d_shape_model_schema.consistent_sizes]] ==== consistent_sizes The *consistent_sizes* function checks the sizes of the <> lists of the input <>s and returns true if all but the last are of size *max* and the last has a size which is not greater than *max*, [.underline]#EXPRESS specification:# [source] -- *) FUNCTION consistent_sizes (max : INTEGER; point_lists : LIST OF #scan_data_3d_shape_model_schema.point_cloud_dataset[point_cloud_dataset]) : BOOLEAN; LOCAL ndatasets : INTEGER := SIZEOF(point_lists); result: BOOLEAN := TRUE; END_LOCAL; REPEAT i := 1 TO (ndatasets - 1); IF (SIZEOF(point_lists[i].point_coordinates) <> max) THEN result := FALSE; RETURN(result); END_IF; END_REPEAT; IF (SIZEOF(point_lists[ndatasets].point_coordinates) > max) THEN result := FALSE; RETURN(result); END_IF; RETURN(result); END_FUNCTION; (* -- [.underline]#Argument definitions:# [[scan_data_3d_shape_model_schema.consistent_sizes.max]]*max:* (input) the maxinum permitted size of any of the point coordinate lists; [[scan_data_3d_shape_model_schema.consistent_sizes.point_lists]]*point_lists:* (input) A list of <>s whose sizes are to be checked. [source] -- *) END_SCHEMA; -- scan_data_3d_shape_model_schema (* -- [[AnnexA]] [appendix,obligation=normative] == Short names of entities Requirements on the use of the short names are found in the implementation methods included in ISO 10303. EXPRESS entity names and the equivalent short names are available from: [align=center] http://standards.iso.org/iso/10303/tech/short_names/short-names.txt[http://standards.iso.org/iso/10303/tech/short_names/short-names.txt] [[AnnexB]] [appendix,obligation=normative] == Information object registration [[b1]] === Document Identification To provide for unambiguous identification of an information object in an open system, the object identifier [align=center] { iso standard 10303 part(42) version(11) } is assigned to this part of ISO 10303. The meaning of this value is defined in ISO/IEC 8824-1, and is described in ISO 10303-1. [[b2]] === Schema identification ==== geometry-schema schema identification To provide for unambiguous identification of the schema specifications given in this integrated resource in an open information system, the object identifiers are assigned as follows: [align=center] { iso standard 10303 part(42) version(11) object(1) geometry-schema(1) } is assigned to the geometry-schema schema. The meaning of this value is defined in ISO/IEC 8824-1, and is described in ISO 10303-1. ==== topology-schema schema identification To provide for unambiguous identification of the schema specifications given in this integrated resource in an open information system, the object identifiers are assigned as follows: [align=center] { iso standard 10303 part(42) version(10) object(1) topology-schema(2) } is assigned to the topology-schema schema. The meaning of this value is defined in ISO/IEC 8824-1, and is described in ISO 10303-1. ==== geometric-model-schema schema identification To provide for unambiguous identification of the schema specifications given in this integrated resource in an open information system, the object identifiers are assigned as follows: [align=center] { iso standard 10303 part(42) version(10) object(1) geometric-model-schema(3) } is assigned to the geometric-model-schema schema. The meaning of this value is defined in ISO/IEC 8824-1, and is described in ISO 10303-1. ==== scan-data-3d-shape-model-schema schema identification To provide for unambiguous identification of the schema specifications given in this integrated resource in an open information system, the object identifiers are assigned as follows: [align=center] { iso standard 10303 part(42) version(1) object(1) scan-data-3d-shape-model-schema(4) } is assigned to the scan-data-3d-shape-model-schema schema. The meaning of this value is defined in ISO/IEC 8824-1, and is described in ISO 10303-1. [[AnnexC]] [appendix,obligation=informative] == Computer interpretable listings This annex references a listing of the EXPRESS entity names and corresponding short names as specified or referenced in this part of ISO 10303. It also provides a listing of each EXPRESS schema specified in this part of ISO 10303 without comments or other explanatory text. These listings are available in computer-interpretable form in Table C.1 and can be found at the following URLs: Short names::: http://standards.iso.org/iso/10303/tech/short_names/short-names.txt[http://standards.iso.org/iso/10303/tech/short_names/short-names.txt] EXPRESS::: http://standards.iso.org/iso/10303/smrl/v8/tech/smrlv8.zip[http://standards.iso.org/iso/10303/smrl/v8/tech/smrlv8.zip] [#table_e1] [cols="^,^",options="header"] .EXPRESS listings |=== | XML file | ASCII file | c_exp_schema_4.xml[geometry_schema.xml] | C:\Upwork\Metanorma\Stepmod\iso-10303-stepmod-master\data\resource_docs\geometric_and_topological_representation\../../../data/resources/geometry_schema/geometry_schema.exp[geometry_schema.exp] | c_exp_schema_5.xml[topology_schema.xml] | C:\Upwork\Metanorma\Stepmod\iso-10303-stepmod-master\data\resource_docs\geometric_and_topological_representation\../../../data/resources/topology_schema/topology_schema.exp[topology_schema.exp] | c_exp_schema_6.xml[geometric_model_schema.xml] | C:\Upwork\Metanorma\Stepmod\iso-10303-stepmod-master\data\resource_docs\geometric_and_topological_representation\../../../data/resources/geometric_model_schema/geometric_model_schema.exp[geometric_model_schema.exp] | c_exp_schema_7.xml[scan_data_3d_shape_model_schema.xml] | C:\Upwork\Metanorma\Stepmod\iso-10303-stepmod-master\data\resource_docs\geometric_and_topological_representation\../../../data/resources/scan_data_3d_shape_model_schema/scan_data_3d_shape_model_schema.exp[scan_data_3d_shape_model_schema.exp] |=== NOTE: The information provided in computer-interpretable form at the above URLs is informative. The information that is contained in the body of this part of ISO 10303 is normative. [[AnnexD]] [appendix,obligation=informative] == EXPRESS-G diagrams The diagrams in this annex correspond to the EXPRESS schemas specified in this part of ISO 10303. The diagrams use the EXPRESS-G graphical notation for the EXPRESS language. EXPRESS-G is defined in ISO 10303-11. * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>; * <>. [[AnnexE]] [appendix,obligation=informative] == Change history [[general]] === General This annex documents the history of technical modifications made to ISO/TS 10303-42. Unless otherwise specified all modifications are upwardly compatible to the previous edition. Modifications to EXPRESS specifications are upwardly compatible if: * instances encoded according to ISO 10303-21, and that conform to an ISO 10303 application protocol based on the previous edition of this part of ISO 10303, also conform to a revision of that application protocol based on this edition of this part of ISO 10303; * interfaces that conform to ISO 10303-22 and to an ISO 10303 application protocol based on the previous edition of this part of ISO 10303, also conform to a revision of that application protocol based on this edition of this part of ISO 10303; * the mapping tables of ISO 10303 application protocols based on the previous edition of this part of ISO 10303 remain valid in a revision of that application protocol based on this edition of this part of ISO 10303. [[change_2]] === Changes made in edition 2 [[summary2]] ==== Summary of changes The second edition of this part of ISO 10303 incorporated the modifications to the first edition listed below. Also changes of technical corrigendum 1 of edition 2 are listed here.[[schema.changes2]] ==== Changes made to schema geometry_schema The following EXPRESS declarations and interface specifications have been added: * CONSTANT dummy_gri; * ENTITY above_plane; * ENTITY b_spline_volume; * ENTITY b_spline_volume_with_knots; * ENTITY bezier_volume; * ENTITY block_volume; * ENTITY clothoid; * ENTITY cylindrical_point; * ENTITY cylindrical_volume; * ENTITY dupin_cyclide_surface; * ENTITY eccentric_conical_volume; * ENTITY ellipsoid_volume; * ENTITY hexahedron_volume; * ENTITY make_array_of_array_of_array; * ENTITY oriented_surface; * ENTITY point_in_volume; * ENTITY polar_point; * ENTITY pyramid_volume; * ENTITY quasi_uniform_volume; * ENTITY rational_b_spline_volume; * ENTITY same_side; * ENTITY spherical_point; * ENTITY spherical_volume; * ENTITY surface_boundary; * ENTITY surface_curve_swept_surface; * ENTITY tetrahedron_volume; * ENTITY toroidal_volume; * ENTITY volume; * ENTITY wedge_volume. The following EXPRESS declarations and interface specifications have been modified: * ENTITY axis1_placement; * ENTITY cartesian_transformation_operator_2d; * ENTITY cartesian_transformation_operator_3d; * ENTITY composite_curve_segment; * ENTITY curve_bounded_surface; * ENTITY default_b_spline_surface_weights; * ENTITY geometric_representation_item; * ENTITY point; * ENTITY rectangular_composite_surface; * ENTITY surface_of_revolution; * ENTITY surface_of_revolution; * ENTITY surface_patch; * ENTITY swept_surface; * ENTITY trimmed_curve; * FUNCTION base_axis; * FUNCTION build_2axes; * FUNCTION build_axes; * FUNCTION constraints_param_b_spline; * FUNCTION cross_product; * FUNCTION default_b_spline_curve_weights; * FUNCTION default_b_spline_knot_mult; * FUNCTION default_b_spline_knots; * FUNCTION first_proj_axis; * FUNCTION get_basis_surface; * FUNCTION list_to_array; * FUNCTION list_to_array; * FUNCTION make_array_of_array; * FUNCTION make_array_of_array; * FUNCTION make_array_of_array_of_array; * FUNCTION orthogonal_complement; * FUNCTION scalar_times_vector; * FUNCTION vector_difference; * FUNCTION vector_sum. [[schema.changes2]] ==== Changes made to schema topology_schema The following EXPRESS declarations and interface specifications have been added: * CONSTANT dummy_tri; * ENTITY connected_face_sub_set; * ENTITY seam_edge; * ENTITY subedge; * FUNCTION closed_shell_reversed; * FUNCTION open_shell_reversed. The following EXPRESS declarations and interface specifications have been modified: * ENTITY edge; * ENTITY face_surface; * FUNCTION edge_reversed; * FUNCTION face_bound_reversed; * FUNCTION face_reversed; * FUNCTION mixed_loop_type_set; * FUNCTION path_head_to_tail; * FUNCTION path_reversed; * FUNCTION shell_reversed. [[schema.changes2]] ==== Changes made to schema geometric_model_schema The following EXPRESS declarations and interface specifications have been added: * ENTITY brep_2d; * ENTITY circular_area; * ENTITY convex_hexahedron; * ENTITY cyclide_segment_solid; * ENTITY eccentric_cone; * ENTITY ellipsoid; * ENTITY elliptic_area; * ENTITY faceted_primitive; * ENTITY half_space_2d; * ENTITY polygonal_area; * ENTITY primitive_2d; * ENTITY rectangular_area; * ENTITY rectangular_pyramid; * ENTITY sectioned_spine; * ENTITY surface_curve_swept_area_solid; * ENTITY surface_curve_swept_face_solid; * ENTITY tetrahedron; * ENTITY trimmed_volume. The following EXPRESS declarations and interface specifications have been modified: * TYPE boolean_operand; * TYPE csg_primitive; * ENTITY box_domain; * ENTITY csg_solid; * ENTITY rectangle_domain; * ENTITY revolved_area_solid; * ENTITY revolved_area_solid; * ENTITY revolved_face_solid; * ENTITY revolved_face_solid; * ENTITY solid_model; * ENTITY swept_area_solid; * ENTITY swept_face_solid; * FUNCTION build_transformed_set; * FUNCTION build_transformed_set. [[change_3]] === Changes made in edition 3 [[summary3]] ==== Summary of changes The third edition of this part of ISO 10303 incorporated the modifications to the second edition listed below. Also changes of technical corrigendum 1 to edition 3 are included here that modified the description of cartesian_transformation_operator, clarified the interpretation of angular parameters, changed the REFERENCE FROM statements in the geometric model schema.[[schema.changes3]] ==== Changes made to schema geometry_schema The following EXPRESS declarations and interface specifications have been added: * ENTITY circular_involute. The following EXPRESS declarations and interface specifications have been modified: * ENTITY associated_surface; * ENTITY build_axes; * ENTITY normalise; * ENTITY scalar_times_vector; * ENTITY vector_difference; * ENTITY vector_sum. [[schema.changes3]] ==== Changes made to schema topology_schema The following EXPRESS declarations and interface specifications have been modified: * FUNCTION edge_curve_pcurves; * FUNCTION vertex_point_pcurves. [[schema.changes3]] ==== Changes made to schema geometric_model_schema The following EXPRESS declarations and interface specifications have been added: * ENTITY swept_disk_solid. The following EXPRESS declarations and interface specifications have been modified: * FUNCTION msb_shells; * FUNCTION path_head_to_tail. [[change_4]] === Changes made in edition 4 [[summary4]] ==== Summary of changes The fourth edition of this part of ISO 10303 incorporated the modifications to the third edition listed below. This fourth edition adds tessellated geometry and extends the 2D CSG capabilities.[[schema.changes4]] ==== Changes made to schema geometry_schema The following EXPRESS declarations and interface specifications have been modified: * FUNCTION dimension_of; * FUNCTION normalise; * FUNCTION scalar_times_vector; * FUNCTION vector_difference; * FUNCTION vector_sum. [[schema.changes4]] ==== Changes made to schema geometric_model_schema The following EXPRESS declarations and interface specifications have been added: * TYPE bounded_primitive_2d; * TYPE edge_or_curve; * TYPE face_or_surface; * ENTITY area_with_outer_boundary; * ENTITY complex_triangulated_face; * ENTITY complex_triangulated_surface_set; * ENTITY coordinates_list; * ENTITY repositioned_tessellated_item; * ENTITY tessellated_connecting_edge; * ENTITY tessellated_curve_set; * ENTITY tessellated_edge; * ENTITY tessellated_edge_or_vertex; * ENTITY tessellated_face; * ENTITY tessellated_geometric_set; * ENTITY tessellated_item; * ENTITY tessellated_point_set; * ENTITY tessellated_shape_representation; * ENTITY tessellated_shell; * ENTITY tessellated_solid; * ENTITY tessellated_structured_item; * ENTITY tessellated_surface_set; * ENTITY tessellated_vertex; * ENTITY tessellated_wire; * ENTITY triangulated_face; * ENTITY triangulated_surface_set. [[change_5]] === Changes made in edition 5 [[summary5]] ==== Summary of changes The fifth edition of this part of ISO 10303 incorporated the modifications to the fourth edition listed below. This fifth edition adds entities to enable isogeometric analysis and curved triangles as tessellated geometry. Additions to the topology schema enable an edge with defined length but no geometry to support flexible structure topology. A new schema is added to enable shape models defined by 3D scanned data.[[schema.changes5]] ==== Changes made to schema geometry_schema The following EXPRESS declarations and interface specifications have been added: * TYPE linearily_independent_enum; * TYPE locally_refined_spline_type_enum; * TYPE spline_knot_values; * ENTITY local_b_spline; * ENTITY locally_refined_spline_curve; * ENTITY locally_refined_spline_surface; * ENTITY locally_refined_spline_volume; * ENTITY rational_locally_refined_spline_curve; * ENTITY rational_locally_refined_spline_surface; * ENTITY rational_locally_refined_spline_volume; * FUNCTION check_geometric_dimension; * FUNCTION constraints_param_local_b_spline; * FUNCTION geometric_dimensionalities_in_contexts; * FUNCTION increasing; * FUNCTION weights_positive. The following EXPRESS declarations and interface specifications have been modified: * ENTITY bounded_curve; * ENTITY bounded_surface; * ENTITY cylindrical_point; * ENTITY geometric_representation_item; * ENTITY polar_point; * ENTITY spherical_point; * ENTITY volume; * RULE compatible_dimension. [[schema.changes5]] ==== Changes made to schema topology_schema The following EXPRESS declarations and interface specifications have been added: * REFERENCE_FROM basic_attribute_schema; * REFERENCE_FROM measure_schema; * REFERENCE_FROM support_resource_schema; * TYPE tri_id_attribute_select; * ENTITY connected_volume_set; * ENTITY connected_volume_sub_set; * ENTITY edge_with_length; * ENTITY vertex_on_edge; * ENTITY volume_with_faces; * ENTITY volume_with_parametric_boundary; * ENTITY volume_with_shell; * FUNCTION get_tri_in_representations; * FUNCTION valid_tri_ids. The following EXPRESS declarations and interface specifications have been modified: * REFERENCE_FROM representation_schema; * ENTITY edge; * ENTITY topological_representation_item. [[schema.changes5]] ==== Changes made to schema geometric_model_schema The following EXPRESS declarations and interface specifications have been added: * TYPE angular_deviation; * TYPE chordal_deviatione; * TYPE length_to_height_ratio; * TYPE maximum_edge_length; * TYPE tessellated_facet_long_short_edge_ratio; * TYPE tessellation_accuracy_parameter_item; * ENTITY cubic_bezier_tessellated_edge; * ENTITY cubic_bezier_triangulated_face; * ENTITY cubic_tessellated_connecting_edge; * ENTITY tessellated_shape_representation_with_accuracy_parameters. The following EXPRESS declarations and interface specifications have been modified: * REFERENCE_FROM measure_schema; * TYPE geometric_set_select; * ENTITY geometric_curve_set; * ENTITY tessellated_connecting_edge; * ENTITY tessellated_edge; * ENTITY tessellated_face; * ENTITY tessellated_shape_representation. [[schema.changes5]] ==== Changes made to schema scan_data_3d_shape_model_schema This schema has been added and includes the following objects.The following EXPRESS declarations and interface specifications have been added: * TYPE point_cloud_set_or_superset; * ENTITY point_cloud_dataset; * ENTITY point_cloud_dataset_with_colours; * ENTITY point_cloud_dataset_with_intensities; * ENTITY point_cloud_dataset_with_normals; * ENTITY point_cloud_superdataset; * ENTITY scan_3d_model; * ENTITY scan_data_shape_representation; * ENTITY scanned_data_item; * ENTITY scanner_basic_properties; * ENTITY scanner_property; * ENTITY triangulated_point_cloud_dataset. [[change_6]] === Changes made in edition 6 [[summary6]] ==== Summary of changes This sixth edition of this part of ISO 10303 incorporates the modifications to the fifth edition listed below. [[schema.changes6]] ==== Changes made to schema geometry_schema The following EXPRESS declarations and interface specifications have been modified: * ENTITY cartesian_transformation_operator + ENTITY subtype expression changed. [[schema.changes6]] ==== Changes made to schema topology_schema The following EXPRESS declarations and interface specifications have been modified: * ENTITY edge_with_length + Information proposition added; * ENTITY vertex_on_edge + Information proposition added. [[bibliography]] == Bibliography * [[[ref8824-1,ISO/IEC 8824-1]]], _Information technology -- Abstract Syntax Notation One (ASN.1) -- Part 1: Specification of basic notation_ * [[[ISO_10303-21,ISO 10303-21]]], _Industrial automation systems and integration -- Product data representation and exchange -- Part 21: Implementation methods: Clear text encoding of the exchange structure_ * [[[ISO_10303-22,ISO 10303-22]]], _Industrial automation systems and integration -- Product data representation and exchange -- Part 22: Implementation methods: Standard data access interface_ * [[[AMF,ISO/ASTM 52915:2013]]], _Standard specification for additive manufacturing file format (AMF) Version 1.1_ * [[[BBB,BARTELS, R. H., BEATTY, J. C. and BARSKY, B. A.]]], _Splines in Computer Graphics and Geometric Modelling_ , Morgan Kaufman, 1987. * [[[COTT2009,COTTRELL,J. A., HUGHES, T.J.R., BAZILEVS, Y.]]], _Isogeometric Analysis. Towards Integration of CAD and FEA_ , John Wiley & Sons , 2009. * [[[Dokken2013, T. Dokken, T., Pettersen, K.F. Lyche,T. ]]], _Polynomial splines over locally refined box-partitions._ , Computer Aided Geometric Design 30, 331-356 , 2013.Available from the World Wide Web: http://dx.doi.org/10.1016/j.cagd.2012.12.005[http://dx.doi.org/10.1016/j.cagd.2012.12.005] * [[[FARIN,FARIN, G.]]], _Curves and Surfaces for Computer Aided Geometric Design, 3rd. Edition_ , Academic Press, 1993. * [[[GIBSON, GIBSON, C. G.]]], _Elementary Geometry of Differentiable Curves_ , Cambridge University Press, 2001. * [[[GRAY,GRAY, A.]]], _Modern Differential Geometry of Curves and Surfaces with Mathematica, 2nd. edition; pp 64-66_ , CRC Press, 2001. * [[[NISTIR-4412,NISTIR 4412]]], _Initial Graphics Exchange Specification (IGES)_ , Version 5.0 * [[[PIEGL, PIEGL, L. and TILLER, W.]]], _The NURBS Book_ , Springer-Verlag, 1994. * [[[PRATT1,PRATT, M. J.]]], _Cyclides in computer aided geometric design; pp. 221 -242_ , Computer Aided Geometric Design 7, 1990. * [[[PRATT2,PRATT, M. J.]]], _Cyclides in computer aided geometric design II; pp. 131-152_ , Computer Aided Geometric Design 12, 1995. * [[[Sederberg2003, Sederberg,J, Zheng, T.W., Bakenov, A., Nasri, A. ]]], _T-splines and T-NURCCs_ , ACM Transactions on Graphics 22 , 477-484 , 2003. * [[[WILSON,WILSON, P. R.]]], _IEEE Computer Graphics & Applications_ , Vol. 5, No 8, pp. 24-36; Euler formulas and geometric modeling, August 1985.