Overview Schemas Index

AIC_NON_MANIFOLD_SURFACE (jsdai.SAic_non_manifold_surface)


FUNCTION nmsf_curve_check
          (cv : representation_item) : BOOLEAN;

IF SIZEOF  (['AIC_NON_MANIFOLD_SURFACE.BOUNDED_CURVE',
   'AIC_NON_MANIFOLD_SURFACE.CONIC',
   'AIC_NON_MANIFOLD_SURFACE.CURVE_REPLICA',
   'AIC_NON_MANIFOLD_SURFACE.LINE',
   'AIC_NON_MANIFOLD_SURFACE.OFFSET_CURVE_3D'] * TYPEOF(cv)) > 1
 THEN  RETURN(FALSE);
 ELSE

  (* b_spline_curves shall NOT  self-intersect
   *)
  IF  (('AIC_NON_MANIFOLD_SURFACE.B_SPLINE_CURVE' IN  TYPEOF  (cv)) AND
    (cv\b_spline_curve.self_intersect = FALSE) OR
    (cv\b_spline_curve.self_intersect = UNKNOWN))
  THEN  RETURN(TRUE);
  ELSE

    (* conics AND  lines are valid curve types
     *)
    IF  SIZEOF (['AIC_NON_MANIFOLD_SURFACE.CONIC',
    'AIC_NON_MANIFOLD_SURFACE.LINE'] * TYPEOF  (cv)) = 1 THEN
      RETURN(TRUE);
    ELSE

      (* a curve_replica shall REFERENCE  a valid curve
       *)
      IF  'AIC_NON_MANIFOLD_SURFACE.CURVE_REPLICA' IN  TYPEOF(cv) THEN
        RETURN  (nmsf_curve_check(cv\curve_replica.parent_curve)); 
      ELSE  
 
        (* an offset_curve_3d shall NOT  self-intersect and
           shall REFERENCE  a valid curve; a polyline is NOT  a
           valid basis_curve
         *)
        IF  (('AIC_NON_MANIFOLD_SURFACE.OFFSET_CURVE_3D' IN  TYPEOF  (cv)) 
          AND
          ((cv\offset_curve_3d.self_intersect = FALSE) OR
          (cv\offset_curve_3d.self_intersect = UNKNOWN))
          AND
          (NOT ('AIC_NON_MANIFOLD_SURFACE.POLYLINE' IN  TYPEOF
          (cv\offset_curve_3d.basis_curve)))) THEN
          RETURN  (nmsf_curve_check(cv\offset_curve_3d.basis_curve)); 
        ELSE  
 
          (* a pcurve shall REFERENCE  a valid curve AND  a valid
             basis_surface
           *)
          IF  'AIC_NON_MANIFOLD_SURFACE.PCURVE' IN  TYPEOF(cv) THEN  
            RETURN  ((nmsf_curve_check
            (cv\pcurve.reference_to_curve\representation.items[1]))
            AND
            (nmsf_surface_check(cv\pcurve.basis_surface)));
          ELSE  
 
            (* a surface_curve references a curve_3d AND one or
               two pcurves OR  one OR  two surfaces OR  one of
               each; all OF these references shall be valid
             *)
            IF  'AIC_NON_MANIFOLD_SURFACE.SURFACE_CURVE' IN  TYPEOF(cv) THEN  

              (* IF  the curve REFERENCE is correct, check also the rest
               *)
              IF  nmsf_curve_check(cv\surface_curve.curve_3d) THEN
                REPEAT i := 1 TO SIZEOF
                (cv\surface_curve.associated_geometry);

                  (* do FOR one OR two associated_geometrys:
                   *)
                  IF  'AIC_NON_MANIFOLD_SURFACE.SURFACE' IN  
                    TYPEOF  (cv\surface_curve.associated_geometry[i]) THEN   
                    IF  NOT  nmsf_surface_check
                      (cv\surface_curve.associated_geometry[i]) THEN   
                      RETURN(FALSE);  
                    END_IF;  
                  ELSE  
                    IF  'AIC_NON_MANIFOLD_SURFACE.PCURVE' IN  TYPEOF 
                      (cv\surface_curve.associated_geometry[i]) THEN   
                      IF  NOT  nmsf_curve_check
                        (cv\surface_curve.associated_geometry[i]) THEN  
                        RETURN(FALSE);  
                      END_IF;  
                    END_IF;  
                  END_IF; 
                END_REPEAT;  
                RETURN(TRUE);
              END_IF; 
            ELSE

              (* a polyline shall have at least 3 points 
               *)
              IF  'AIC_NON_MANIFOLD_SURFACE.POLYLINE' IN TYPEOF(cv) THEN
                IF  (SIZEOF (cv\polyline.points) >= 3) THEN RETURN  (TRUE);
                END_IF;
              END_IF;
            END_IF; 
          END_IF; 
        END_IF; 
      END_IF; 
    END_IF; 
  END_IF; 
 END_IF; 
 (* FALSE is returned IF the input parameter cv is NOT a valid curve.
  *)
 RETURN (FALSE);

END_FUNCTION; -- nmsf_curve_check

public class FNmsf_curve_check
          public static Value run(SdaiContext _context, Value cv)