(* SCHEMA step_merged_ap_schema; *)
-- IN AP238 STEP-NC/AP242
RULE unique_gdt_element_id_constraint FOR (dimensional_location, dimensional_size, geometric_tolerance, product_definition_shape, shape_aspect, shape_aspect_relationship );
LOCAL
bss : BAG OF STRING := [];
cum_bss : BAG OF STRING := [];
dssa : SET OF dimensional_size := [];
dssai : SET OF dimensional_size := [];
gtsi : SET OF geometric_tolerance := QUERY (gtsi <* geometric_tolerance| EXISTS(gtsi\geometric_tolerance.id));
sarsa : SET OF shape_aspect_relationship := [];
sarsai : SET OF shape_aspect_relationship := [];
ssa : SET OF shape_aspect := [];
ssai : SET OF shape_aspect := [];
pass : BOOLEAN := TRUE;
END_LOCAL;
REPEAT ii := 1 TO SIZEOF(product_definition_shape) WHILE pass;
bss := [];
ssa := bag_to_set(USEDIN(product_definition_shape[ii], 'STEP_MERGED_AP_SCHEMA.SHAPE_ASPECT.OF_SHAPE'));
ssai := QUERY (sa <* ssa| EXISTS(sa\shape_aspect.id));
IF (SIZEOF(ssai) > 0) AND (SIZEOF(ssai) <> SIZEOF(ssa)) THEN
pass := FALSE;
END_IF;
REPEAT i := 1 TO SIZEOF(ssai);
IF ssai[i] IN ssa THEN
bss := bss + ssai[i]\shape_aspect.id;
END_IF;
dssa := bag_to_set(USEDIN(ssai[i], 'STEP_MERGED_AP_SCHEMA.DIMENSIONAL_SIZE.APPLIES_TO'));
dssai := QUERY (ds <* dssa| EXISTS(ds\dimensional_size.id));
IF (SIZEOF(dssai) > 0) AND (SIZEOF(dssai) <> SIZEOF(dssa)) THEN
pass := FALSE;
END_IF;
REPEAT j := 1 TO SIZEOF(dssai);
IF dssai[j]\dimensional_size.applies_to IN ssa THEN
bss := bss + dssai[j]\dimensional_size.id;
END_IF;
END_REPEAT;
sarsa := bag_to_set(USEDIN(ssai[i], 'STEP_MERGED_AP_SCHEMA.SHAPE_ASPECT_RELATIONSHIP.RELATING_SHAPE_ASPECT'));
sarsai := QUERY (sar <* sarsa| EXISTS(sar\shape_aspect_relationship.id));
IF (SIZEOF(sarsai) > 0) AND (SIZEOF(sarsai) <> SIZEOF(sarsa)) THEN
pass := FALSE;
END_IF;
REPEAT j := 1 TO SIZEOF(sarsai);
IF sarsai[j]\shape_aspect_relationship.relating_shape_aspect IN ssa THEN
bss := bss + sarsai[j]\shape_aspect_relationship.id;
END_IF;
END_REPEAT;
END_REPEAT;
cum_bss := cum_bss + bss;
END_REPEAT;
IF (SIZEOF(gtsi) > 0) AND (SIZEOF(gtsi) <> SIZEOF(geometric_tolerance)) THEN
pass := FALSE;
END_IF;
REPEAT j := 1 TO SIZEOF(gtsi);
IF gtsi[j] IN geometric_tolerance THEN
cum_bss := cum_bss + gtsi[j]\geometric_tolerance.id;
END_IF;
IF SIZEOF(bag_to_set(cum_bss)) <> SIZEOF(cum_bss) THEN
pass := FALSE;
END_IF;
END_REPEAT;
WHERE
WR1:
pass;
END_RULE;
Generated by STEP Tools® EXPRESS to HTML Converter
2026-09-02T09:08:05-04:00