| FUNCTION gbsf_check_surface (sf : surface) : BOOLEAN;
 
 IF (('AIC_GEOMETRICALLY_BOUNDED_SURFACE.B_SPLINE_SURFACE' IN  TYPEOF(sf)) AND  (sf\b_spline_surface.self_intersect = FALSE) OR  (sf\b_spline_surface.self_intersect = UNKNOWN)) THENEND_FUNCTION; -- gbsf_check_surfaceRETURN  (TRUE);
 ELSE
 IF  SIZEOF(['AIC_GEOMETRICALLY_BOUNDED_SURFACE.SPHERICAL_SURFACE', 'AIC_GEOMETRICALLY_BOUNDED_SURFACE.TOROIDAL_SURFACE', 'AIC_GEOMETRICALLY_BOUNDED_SURFACE.CURVE_BOUNDED_SURFACE', 'AIC_GEOMETRICALLY_BOUNDED_SURFACE.RECTANGULAR_TRIMMED_SURFACE'] * TYPEOF(sf)) = 1 THEN
 RETURN  (TRUE);
 ELSE
 IF  (('AIC_GEOMETRICALLY_BOUNDED_SURFACE.OFFSET_SURFACE' IN  TYPEOF(sf)) AND (sf\offset_surface.self_intersect = FALSE) OR (sf\offset_surface.self_intersect = UNKNOWN)) THEN
 RETURN  (gbsf_check_surface(sf\offset_surface.basis_surface));
 ELSE
 IF  'AIC_GEOMETRICALLY_BOUNDED_SURFACE.RECTANGULAR_COMPOSITE_SURFACE' IN  TYPEOF(sf) THEN
 REPEAT  i := 1 TO  SIZEOF(sf\rectangular_composite_surface.segments);
 REPEAT j := 1 TO SIZEOF(sf\rectangular_composite_surface.segments[i]);
 IF  NOT (gbsf_check_surface(sf\rectangular_composite_surface.segments[i][j].parent_surface)) THEN
 RETURN  (FALSE);
 END_IF;
 END_REPEAT;
 END_REPEAT;
 RETURN  (TRUE);
 ELSE
 IF  'AIC_GEOMETRICALLY_BOUNDED_SURFACE.SURFACE_REPLICA' IN  TYPEOF(sf) THEN
 RETURN  (gbsf_check_surface(sf\surface_replica.parent_surface));
 ELSE
 IF 'AIC_GEOMETRICALLY_BOUNDED_SURFACE.SURFACE_OF_REVOLUTION' IN TYPEOF(sf) THEN
 RETURN  (gbsf_check_curve(sf\swept_surface.swept_curve));
 END_IF;
 END_IF;
 END_IF;
 END_IF;
 END_IF;
 END_IF;
 RETURN (FALSE);
 
 |