Source : ISO 10303-503
SCHEMA aic_geometrically_bounded_2d_wireframe;
USE FROM
geometric_model_schema -- ISO 10303-42
(geometric_curve_set,
geometric_set);
USE FROM
geometry_schema -- ISO 10303-42
(axis2_placement_2d,
b_spline_curve_with_knots,
bezier_curve,
circle,
composite_curve,
composite_curve_segment,
curve,
curve_replica,
ellipse,
geometric_representation_context,
hyperbola,
line,
offset_curve_2d,
parabola,
point_on_curve,
polyline,
quasi_uniform_curve,
rational_b_spline_curve,
trimmed_curve,
uniform_curve);
USE FROM
product_property_representation_schema -- ISO 10303-41
(shape_representation);
USE FROM
representation_schema -- ISO 10303-43
(mapped_item);
ENTITY geometrically_bounded_2d_wireframe_representation
SUBTYPE OF (shape_representation);
WHERE
WR1: SELF.context_of_items\geometric_representation_context.
coordinate_space_dimension = 2;
WR2: SIZEOF (QUERY (item <* SELF.items |
NOT (SIZEOF (TYPEOF (item) *
['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.GEOMETRIC_CURVE_SET',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.AXIS2_PLACEMENT_2D',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.MAPPED_ITEM']) = 1)
)) = 0;
WR3: SIZEOF (QUERY (item <* SELF.items |
SIZEOF (TYPEOF (item) *
['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.GEOMETRIC_CURVE_SET',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.MAPPED_ITEM']) = 1
)) >= 1;
WR4: SIZEOF (QUERY (mi <* QUERY (item <* SELF.items |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.MAPPED_ITEM'
IN TYPEOF (item))) |
NOT ('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.' +
'GEOMETRICALLY_BOUNDED_2D_WIREFRAME_REPRESENTATION'
IN TYPEOF
(mi\mapped_item.mapping_source.mapped_representation))
)) = 0;
WR5: SIZEOF (QUERY (gcs <* QUERY (item <* SELF.items |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.GEOMETRIC_CURVE_SET'
IN TYPEOF (item))) |
NOT (SIZEOF (QUERY (elem <* gcs\geometric_set.elements |
NOT (SIZEOF (TYPEOF (elem) *
['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.B_SPLINE_CURVE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.CIRCLE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.COMPOSITE_CURVE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.ELLIPSE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.OFFSET_CURVE_2D',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.POINT',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.POLYLINE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.TRIMMED_CURVE']) =
1)
)) = 0)
)) = 0;
WR6: SIZEOF (QUERY (gcs <* QUERY (item <* SELF.items |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.GEOMETRIC_CURVE_SET'
IN TYPEOF (item))) |
NOT (SIZEOF (QUERY (crv <*
QUERY (elem <* gcs\geometric_set.elements |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.CURVE'
IN TYPEOF (elem))) |
NOT (valid_basis_curve_in_2d_wireframe
(crv))
)) = 0)
)) = 0;
WR7: SIZEOF (QUERY (gcs <* QUERY (item <* SELF.items |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.GEOMETRIC_CURVE_SET'
IN TYPEOF (item))) |
NOT (SIZEOF (QUERY (pnt <*
QUERY (elem <* gcs\geometric_set.elements |
('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.POINT'
IN TYPEOF(elem))) |
NOT (SIZEOF (TYPEOF (pnt) *
['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.CARTESIAN_POINT',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.POINT_ON_CURVE'])
= 1)
)) = 0)
)) = 0;
END_ENTITY;
FUNCTION valid_basis_curve_in_2d_wireframe
(crv : curve) : BOOLEAN;
IF SIZEOF (['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.POLYLINE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.B_SPLINE_CURVE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.ELLIPSE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.CIRCLE'] *
TYPEOF (crv)) = 1
THEN RETURN (TRUE);
ELSE
-- if the curve is a trimmed_curve
IF (('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.TRIMMED_CURVE')
IN TYPEOF (crv)) THEN
-- if a line, parabola, or hyperbola is being trimmed, then valid
IF SIZEOF (['AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.LINE',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.PARABOLA',
'AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.HYPERBOLA'] *
TYPEOF(crv\trimmed_curve.basis_curve)) = 1
THEN RETURN (TRUE);
-- otherwise, recursively check basis_curve
ELSE RETURN (valid_basis_curve_in_2d_wireframe
(crv\trimmed_curve.basis_curve));
END_IF;
ELSE
-- recursively check the offset_curve basis curve
IF (('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.OFFSET_CURVE_2D')
IN TYPEOF (crv))
THEN RETURN (valid_basis_curve_in_2d_wireframe
(crv\offset_curve_2d.basis_curve));
ELSE
-- recursively check the curve_replica parent curve
IF (('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.CURVE_REPLICA')
IN TYPEOF (crv))
THEN RETURN (valid_basis_curve_in_2d_wireframe
(crv\curve_replica.parent_curve));
ELSE
-- recursively check the composite_curve segments
IF (('AIC_GEOMETRICALLY_BOUNDED_2D_WIREFRAME.COMPOSITE_CURVE')
IN TYPEOF (crv)) THEN
RETURN (SIZEOF (QUERY (ccs <* crv\composite_curve.segments |
NOT (valid_basis_curve_in_2d_wireframe
(ccs.parent_curve)))) = 0);
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
RETURN (FALSE);
END_FUNCTION;
END_SCHEMA; -- aic_geometrically_bounded_2d_wireframe