diff --git a/scripts/generators/prism.py b/scripts/generators/prism.py new file mode 100644 index 0000000..566d824 --- /dev/null +++ b/scripts/generators/prism.py @@ -0,0 +1,393 @@ +"""Planar prism solids written as STEP (AP214) or IGES 5.3 (186 manifold solid B-reps), with +assemblies: STEP next-assembly-usage occurrences placed by item-defined transformations, IGES +subfigure definitions (308) placed by singular subfigure instances (408). + +Standard library only. Every model here is generated from code, so the files are reproducible: +run the model's script and compare the SHA-256 with its README. + +A part is a polygon (counter-clockwise, in the XY plane, millimetres) extruded along +Z by a +height. Faces: bottom, top and one side per polygon edge, all planar, normals outward. +""" + +import math + + +# ---------- geometry ---------- + +def regular(n, r, phase=0.0): + return [(r * math.cos(phase + 2 * math.pi * i / n), r * math.sin(phase + 2 * math.pi * i / n)) for i in range(n)] + + +def rect(w, d): + return [(-w / 2, -d / 2), (w / 2, -d / 2), (w / 2, d / 2), (-w / 2, d / 2)] + + +def l_section(w, d, t): + """An L: a w x d bounding box with legs t thick (not convex).""" + return [(0, 0), (w, 0), (w, t), (t, t), (t, d), (0, d)] + + +def area2(poly): + return sum(poly[i][0] * poly[(i + 1) % len(poly)][1] - poly[(i + 1) % len(poly)][0] * poly[i][1] for i in range(len(poly))) + + +class Part: + def __init__(self, name, poly, height): + if area2(poly) <= 0: + raise ValueError(f"{name}: polygon must be counter-clockwise") + self.name, self.poly, self.h = name, poly, height + + @property + def faces(self): + return len(self.poly) + 2 + + @property + def edges(self): + return 3 * len(self.poly) + + @property + def vertices(self): + return 2 * len(self.poly) + + +# A placement is (rotation 3x3 as rows, translation). Rotations are built from axis angles. + +def rot(axis, deg): + a = math.radians(deg) + c, s = math.cos(a), math.sin(a) + x, y, z = axis + n = math.sqrt(x * x + y * y + z * z) + x, y, z = x / n, y / n, z / n + return [[c + x * x * (1 - c), x * y * (1 - c) - z * s, x * z * (1 - c) + y * s], + [y * x * (1 - c) + z * s, c + y * y * (1 - c), y * z * (1 - c) - x * s], + [z * x * (1 - c) - y * s, z * y * (1 - c) + x * s, c + z * z * (1 - c)]] + + +IDENTITY = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + + +def matmul(a, b): + return [[sum(a[i][k] * b[k][j] for k in range(3)) for j in range(3)] for i in range(3)] + + +class Node: + """An assembly: a name and children (Part or Node), each with a rotation and translation.""" + + def __init__(self, name, children=None): + self.name = name + self.children = children or [] # [(Part | Node, R, t)] + + def add(self, child, R=IDENTITY, t=(0, 0, 0)): + self.children.append((child, R, tuple(t))) + return self + + +def count(node): + """(solid instances, face instances, distinct parts, assembly nodes, occurrences).""" + parts, nodes = set(), set() + def walk(n): + nodes.add(id(n)) + s = f = o = 0 + for c, _, _ in n.children: + o += 1 + if isinstance(c, Part): + parts.add(id(c)); s += 1; f += c.faces + else: + a, b, d = walk(c); s += a; f += b; o += d + return s, f, o + s, f, o = walk(node) + return dict(solids=s, faces=f, distinct_parts=len(parts), assemblies=len(nodes), occurrences=o) + + +def f6(x): + """A real in the shortest form that round-trips at 1e-9 mm, never '-0.'.""" + v = round(x, 9) + if v == 0: + return "0." + s = repr(v) + if "e" in s or "E" in s: + s = f"{v:.12E}" + return s + return s if "." in s else s + "." + + +# ---------- STEP AP214 ---------- + +def step_text(root, file_name, description): + out = [] + + def add(s): + out.append(s) + return len(out) + + def pt(p): + return add(f"CARTESIAN_POINT('',({f6(p[0])},{f6(p[1])},{f6(p[2])}))") + + def dr(d): + return add(f"DIRECTION('',({f6(d[0])},{f6(d[1])},{f6(d[2])}))") + + def ax(o, z, x): + return add(f"AXIS2_PLACEMENT_3D('',#{pt(o)},#{dr(z)},#{dr(x)})") + + # context + mm = add("(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.))") + rad = add("(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.))") + sr = add("(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT())") + unc = add(f"UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-06),#{mm},'distance_accuracy_value','')") + ctx = add(f"(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#{unc}))" + f"GLOBAL_UNIT_ASSIGNED_CONTEXT((#{mm},#{rad},#{sr}))REPRESENTATION_CONTEXT('',''))") + appctx = add("APPLICATION_CONTEXT('core data for automotive mechanical design processes')") + add(f"APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,#{appctx})") + pctx = add(f"PRODUCT_CONTEXT('',#{appctx},'mechanical')") + pdctx = add(f"PRODUCT_DEFINITION_CONTEXT('part definition',#{appctx},'design')") + + def product(name): + p = add(f"PRODUCT('{name}','{name}','',(#{pctx}))") + add(f"PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#{p}))") + f = add(f"PRODUCT_DEFINITION_FORMATION('','',#{p})") + pd = add(f"PRODUCT_DEFINITION('design','',#{f},#{pdctx})") + pds = add(f"PRODUCT_DEFINITION_SHAPE('','',#{pd})") + return pd, pds + + origin = None + + def brep(part): + n, h = len(part.poly), part.h + P = [(x, y, 0.0) for x, y in part.poly] + [(x, y, h) for x, y in part.poly] + V = [add(f"VERTEX_POINT('',#{pt(p)})") for p in P] + + def edge(a, b): + pa, pb = P[a], P[b] + d = [pb[k] - pa[k] for k in range(3)] + L = math.sqrt(sum(x * x for x in d)) + u = [x / L for x in d] + vec = add(f"VECTOR('',#{dr(u)},{f6(L)})") + line = add(f"LINE('',#{pt(pa)},#{vec})") + return add(f"EDGE_CURVE('',#{V[a]},#{V[b]},#{line},.T.)") + + bot = [edge(i, (i + 1) % n) for i in range(n)] + top = [edge(n + i, n + (i + 1) % n) for i in range(n)] + ver = [edge(i, n + i) for i in range(n)] + + def oe(e, fwd): + return f"#{add(f'ORIENTED_EDGE({chr(39)}{chr(39)},*,*,#{e},{'.T.' if fwd else '.F.'})')}" + + def face(oes, o, z, x): + loop = add(f"EDGE_LOOP('',({','.join(oes)}))") + bound = add(f"FACE_OUTER_BOUND('',#{loop},.T.)") + plane = add(f"PLANE('',#{ax(o, z, x)})") + return add(f"ADVANCED_FACE('',(#{bound}),#{plane},.T.)") + + faces = [face([oe(bot[i], False) for i in reversed(range(n))], P[0], (0, 0, -1), (1, 0, 0)), + face([oe(top[i], True) for i in range(n)], P[n], (0, 0, 1), (1, 0, 0))] + for i in range(n): + j = (i + 1) % n + dx, dy = P[j][0] - P[i][0], P[j][1] - P[i][1] + L = math.hypot(dx, dy) + faces.append(face([oe(bot[i], True), oe(ver[j], True), oe(top[i], False), oe(ver[i], False)], + P[i], (dy / L, -dx / L, 0), (dx / L, dy / L, 0))) + shell = add(f"CLOSED_SHELL('',({','.join(f'#{f}' for f in faces)}))") + return add(f"MANIFOLD_SOLID_BREP('{part.name}',#{shell})") + + reps, pds_of = {}, {} + + def define(node): + """Product + shape representation for a part or an assembly (once each).""" + nonlocal origin + if id(node) in reps: + return reps[id(node)] + pd, pds = product(node.name) + o = ax((0, 0, 0), (0, 0, 1), (1, 0, 0)) + if isinstance(node, Part): + rep = add(f"ADVANCED_BREP_SHAPE_REPRESENTATION('{node.name}',(#{o},#{brep(node)}),#{ctx})") + else: + rep = add(f"SHAPE_REPRESENTATION('{node.name}',(#{o}),#{ctx})") + add(f"SHAPE_DEFINITION_REPRESENTATION(#{pds},#{rep})") + reps[id(node)] = (pd, rep, o) + if not isinstance(node, Part): + k = 0 + for child, R, t in node.children: + cpd, crep, co = define(child) + k += 1 + nm = f"{child.name}:{k}" + nauo = add(f"NEXT_ASSEMBLY_USAGE_OCCURRENCE('{nm}','{nm}','',#{pd},#{cpd},$)") + npds = add(f"PRODUCT_DEFINITION_SHAPE('','',#{nauo})") + z = (R[0][2], R[1][2], R[2][2]) + x = (R[0][0], R[1][0], R[2][0]) + tgt = ax(t, z, x) + # the child's origin (in the child's representation) maps to the placement in the parent's + idt = add(f"ITEM_DEFINED_TRANSFORMATION('','',#{co},#{tgt})") + rr = add(f"(REPRESENTATION_RELATIONSHIP('','',#{crep},#{rep})REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#{idt})SHAPE_REPRESENTATION_RELATIONSHIP())") + add(f"CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#{rr},#{npds})") + return reps[id(node)] + + define(root) + head = ("ISO-10303-21;\nHEADER;\n" + f"FILE_DESCRIPTION(('{description}'),'2;1');\n" + f"FILE_NAME('{file_name}','2026-10-20T00:00:00',('raykholo'),(''),'tangency-labs/models generator','python3 scripts/generators','');\n" + "FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));\nENDSEC;\nDATA;\n") + body = "".join(f"#{i + 1}={s};\n" for i, s in enumerate(out)) + return head + body + "ENDSEC;\nEND-ISO-10303-21;\n" + + +# ---------- IGES 5.3 ---------- + +class Iges: + """Directory entries and parameter data, written in fixed 80-column records.""" + + def __init__(self): + self.ents = [] # (type, form, params list, status, matrix_de, label) + + def add(self, typ, params, form=0, status="00000000", matrix=0, label=""): + self.ents.append([typ, form, params, status, matrix, label]) + return 2 * len(self.ents) - 1 # the entity's DE sequence number + + def set_status(self, de, status): + self.ents[(de - 1) // 2][3] = status + + def text(self, file_name, max_coord): + def h(s): + return f"{len(s)}H{s}" + g = [h(","), h(";"), h("tangency-labs/models generator"), h(file_name), h("python3 scripts/generators"), + h("prism.py IGES 5.3"), "32", "38", "6", "308", "15", h(file_name), "1.", "2", h("MM"), "1", "1.", + h("20261020.000000"), "1.E-06", f6(max_coord), h("raykholo"), h(""), "11", "0", h("20261020.000000")] + s_lines = ["Generated by scripts/generators (github.com/tangency-labs/models), CC0"] + + def wrap(items, width, end): + """Join parameters with ',' and end with ';', split into lines of at most width chars.""" + lines, cur = [], "" + for i, it in enumerate(items): + tok = it + (end if i == len(items) - 1 else ",") + if len(cur) + len(tok) > width: + lines.append(cur); cur = "" + cur += tok + lines.append(cur) + return lines + + g_lines = wrap(g, 72, ";") + d_lines, p_lines = [], [] + for idx, (typ, form, params, status, matrix, label) in enumerate(self.ents): + de = 2 * idx + 1 + pl = wrap([str(typ)] + [str(p) for p in params], 64, ";") + start = len(p_lines) + 1 + for line in pl: + p_lines.append(f"{line:<64}{de:>8}") + d_lines.append(f"{typ:>8}{start:>8}{0:>8}{0:>8}{0:>8}{0:>8}{matrix:>8}{0:>8}{status:>8}") + d_lines.append(f"{typ:>8}{0:>8}{0:>8}{len(pl):>8}{form:>8}{'':>8}{'':>8}{label[:8]:>8}{0:>8}") + rec = [] + rec += [f"{l:<72}S{i + 1:>7}" for i, l in enumerate(s_lines)] + rec += [f"{l:<72}G{i + 1:>7}" for i, l in enumerate(g_lines)] + rec += [f"{l:<72}D{i + 1:>7}" for i, l in enumerate(d_lines)] + rec += [f"{l:<72}P{i + 1:>7}" for i, l in enumerate(p_lines)] + rec.append(f"S{len(s_lines):>7}G{len(g_lines):>7}D{len(d_lines):>7}P{len(p_lines):>7}{'':<40}T{1:>7}") + return "\n".join(rec) + "\n" + + +DEP = "00010000" # physically dependent +DEF = "00000200" # independent, used as a definition (subfigure definitions) + + +def iges_solid(ig, part): + """A 186 manifold solid B-rep for the prism; every entity under it is physically dependent.""" + n, hgt = len(part.poly), part.h + P = [(x, y, 0.0) for x, y in part.poly] + [(x, y, hgt) for x, y in part.poly] + vl = ig.add(502, [len(P)] + [f6(c) for p in P for c in p], form=1, status=DEP) + edges = [] # (a, b) vertex indices, 1-based in the vertex list + + def line(a, b): + pa, pb = P[a], P[b] + return ig.add(110, [f6(c) for c in pa + pb], status=DEP) + + E = [(i, (i + 1) % n) for i in range(n)] + [(n + i, n + (i + 1) % n) for i in range(n)] + [(i, n + i) for i in range(n)] + curves = [line(a, b) for a, b in E] + params = [len(E)] + for (a, b), c in zip(E, curves): + params += [c, vl, a + 1, vl, b + 1] + el = ig.add(504, params, form=1, status=DEP) + bot = list(range(n)); top = [n + i for i in range(n)]; ver = [2 * n + i for i in range(n)] + + def loop(es): # [(edge index 0-based, forward)] + p = [len(es)] + for e, fwd in es: + p += [0, el, e + 1, 1 if fwd else 0, 0] + return ig.add(508, p, form=1, status=DEP) + + def plane(o, z): + pt = ig.add(116, [f6(c) for c in o], status=DEP) + dn = ig.add(123, [f6(c) for c in z], status=DEP) + return ig.add(190, [pt, dn], status=DEP) + + def face(es, o, z): + return ig.add(510, [plane(o, z), 1, 1, loop(es)], form=1, status=DEP) + + faces = [face([(bot[i], False) for i in reversed(range(n))], P[0], (0, 0, -1)), + face([(top[i], True) for i in range(n)], P[n], (0, 0, 1))] + for i in range(n): + j = (i + 1) % n + dx, dy = P[j][0] - P[i][0], P[j][1] - P[i][1] + L = math.hypot(dx, dy) + faces.append(face([(bot[i], True), (ver[j], True), (top[i], False), (ver[i], False)], P[i], (dy / L, -dx / L, 0))) + shell = ig.add(514, [len(faces)] + [x for f in faces for x in (f, 1)], form=1, status=DEP) + return ig.add(186, [shell, 1, 0], status=DEP, label=part.name[:8].upper()) + + +def iges_text(root, file_name): + """root: a Node. Every Node becomes a 308 definition (deepest first); every child placement a 408. + The top Node's children are written as independent 408 instances (the file's assembly).""" + ig = Iges() + solid_de, sub_de, depth = {}, {}, {} + + def matrix(R, t): + return ig.add(124, [f6(R[i][j]) if j < 3 else f6(t[i]) for i in range(3) for j in range(4)], status=DEP) + + def part_sub(part): + # a part becomes a one-member subfigure, so every placement is a 408 + if id(part) not in sub_de: + s = iges_solid(ig, part) + sub_de[id(part)] = ig.add(308, [0, f"{len(part.name)}H{part.name}", 1, s], status=DEF) + depth[id(part)] = 0 + return sub_de[id(part)] + + def instance(child, R, t, status): + d = part_sub(child) if isinstance(child, Part) else node_sub(child) + # an unrotated placement uses the 408's own X, Y, Z; a rotated one puts rotation and translation in + # the 408's transformation matrix (124), so both placement mechanisms are exercised (X' = M (S x + T)). + if R == IDENTITY: + return ig.add(408, [d, f6(t[0]), f6(t[1]), f6(t[2]), "1."], status=status) + m = matrix(R, t) + return ig.add(408, [d, "0.", "0.", "0.", "1."], status=status, matrix=m) + + def node_sub(node): + if id(node) not in sub_de: + members = [instance(c, R, t, DEP) for c, R, t in node.children] + dmax = 1 + max(depth[id(c)] for c, _, _ in node.children) + sub_de[id(node)] = ig.add(308, [dmax, f"{len(node.name)}H{node.name}", len(members)] + members, status=DEF) + depth[id(node)] = dmax + return sub_de[id(node)] + + for c, R, t in root.children: + instance(c, R, t, "00000000") + return ig.text(file_name, 1000.0) + + +def expected(root): + """Analytic totals for checking a reader: solid count, total volume (mm3), world bounding box.""" + vol, lo, hi, n = 0.0, [math.inf] * 3, [-math.inf] * 3, 0 + + def walk(node, R, t): + nonlocal vol, n + for c, Rc, tc in node.children: + R2 = matmul(R, Rc) + t2 = [sum(R[i][k] * tc[k] for k in range(3)) + t[i] for i in range(3)] + if isinstance(c, Part): + n += 1 + vol += abs(area2(c.poly)) / 2 * c.h + for x, y in c.poly: + for z in (0.0, c.h): + p = [sum(R2[i][k] * (x, y, z)[k] for k in range(3)) + t2[i] for i in range(3)] + for i in range(3): + lo[i], hi[i] = min(lo[i], p[i]), max(hi[i], p[i]) + else: + walk(c, R2, t2) + walk(root, IDENTITY, [0, 0, 0]) + return dict(solids=n, volume=round(vol, 3), bbox=[round(v, 3) for v in lo + hi]) diff --git a/scripts/generators/sliver_faces.py b/scripts/generators/sliver_faces.py new file mode 100644 index 0000000..aa62850 --- /dev/null +++ b/scripts/generators/sliver_faces.py @@ -0,0 +1,41 @@ +"""step/sliver-faces: one solid, a 60 x 40 x 10 mm block whose outline has short steps 1 um, 10 nm, +0.1 nm and 0.01 nm long, so its side carries four sliver faces of those widths, each 10 mm tall. +The file declares a distance accuracy of 1e-6 mm: two slivers are wider than that, two narrower. + + python3 scripts/generators/sliver_faces.py step/sliver-faces +""" + +import os +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from prism import Node, Part, count, expected, step_text # noqa: E402 + +STEPS = [1e-3, 1e-5, 1e-7, 1e-8] # mm: the sliver widths + + +def outline(): + """Counter-clockwise: along the bottom edge, at x = 10, 20, 30, 40 the edge steps up by each width.""" + pts = [(0.0, 0.0)] + y = 0.0 + for k, w in enumerate(STEPS): + x = 10.0 * (k + 1) + pts.append((x, y)) + y += w + pts.append((x, y)) + pts += [(60.0, y), (60.0, 40.0), (0.0, 40.0)] + return pts + + +part = Part("sliver-faces", outline(), 10.0) +top = Node("sliver-faces") +top.add(part) + +if __name__ == "__main__": + out = sys.argv[1] if len(sys.argv) > 1 else "." + os.makedirs(out, exist_ok=True) + name = "sliver-faces.step" + path = os.path.join(out, name) + with open(path, "w", newline="\n") as f: + f.write(step_text(top, name, "a block with sliver side faces")) + print(path, count(top), expected(top)) diff --git a/step/sliver-faces/README.md b/step/sliver-faces/README.md new file mode 100644 index 0000000..29f57b3 --- /dev/null +++ b/step/sliver-faces/README.md @@ -0,0 +1,38 @@ +# sliver-faces + +One solid, a 60 × 40 × 10 mm block whose side carries four sliver faces 1 µm, 10 nm, 0.1 nm and +0.01 nm wide, while the file declares a distance accuracy of 1e-6 mm (1 nm): two slivers are wider +than the accuracy and two are narrower. + +- **File:** `sliver-faces.step` +- **Author:** raykholo +- **Made with:** `scripts/generators/sliver_faces.py` (Python 3, standard library only; shared code + in `scripts/generators/prism.py`). It writes STEP AP214 (`AUTOMOTIVE_DESIGN`) directly, in + millimetres, with a distance accuracy of 1e-6 mm. Run + `python3 scripts/generators/sliver_faces.py step/sliver-faces` to reproduce the file byte for + byte. +- **Application protocol:** AP214. +- **Size:** 1 solid; 14 planar faces, 36 edges, 24 vertices. 17 KB. +- **SHA-256:** `366d369d959049f085c1d7954a7c4cee7b7c077df73f36d4177a4b04ed3777a3` + +## Shape + +The block's outline runs along y = 0 and steps up at x = 10, 20, 30 and 40 mm by 1e-3, 1e-5, +1e-7 and 1e-8 mm. Each step is a side face that wide and 10 mm tall; the top and bottom faces +each have 12 edges, four of them that short. + +## Why it is interesting + +Exports from many systems carry faces and edges near or below their stated accuracy. A reader +must keep the solid closed while edges are shorter than its tolerance: merging such vertices can +leave faces without area or split the shell, and keeping them strains meshing and sewing. The +four widths show where a reader's limit lies. + +## Check values + +| | | +|---|---| +| Solids | 1, closed | +| Faces | 14 | +| Volume | 23,999.496 mm³ | +| Bounding box | x 0 … 60, y 0 … 40, z 0 … 10 mm | diff --git a/step/sliver-faces/sliver-faces.step b/step/sliver-faces/sliver-faces.step new file mode 100644 index 0000000..ae5561d --- /dev/null +++ b/step/sliver-faces/sliver-faces.step @@ -0,0 +1,463 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('a block with sliver side faces'),'2;1'); +FILE_NAME('sliver-faces.step','2026-10-20T00:00:00',('raykholo'),(''),'tangency-labs/models generator','python3 scripts/generators',''); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.)); +#2=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.)); +#3=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT()); +#4=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-06),#1,'distance_accuracy_value',''); +#5=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#4))GLOBAL_UNIT_ASSIGNED_CONTEXT((#1,#2,#3))REPRESENTATION_CONTEXT('','')); +#6=APPLICATION_CONTEXT('core data for automotive mechanical design processes'); +#7=APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,#6); +#8=PRODUCT_CONTEXT('',#6,'mechanical'); +#9=PRODUCT_DEFINITION_CONTEXT('part definition',#6,'design'); +#10=PRODUCT('sliver-faces','sliver-faces','',(#8)); +#11=PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#10)); +#12=PRODUCT_DEFINITION_FORMATION('','',#10); +#13=PRODUCT_DEFINITION('design','',#12,#9); +#14=PRODUCT_DEFINITION_SHAPE('','',#13); +#15=CARTESIAN_POINT('',(0.,0.,0.)); +#16=DIRECTION('',(0.,0.,1.)); +#17=DIRECTION('',(1.,0.,0.)); +#18=AXIS2_PLACEMENT_3D('',#15,#16,#17); +#19=SHAPE_REPRESENTATION('sliver-faces',(#18),#5); +#20=SHAPE_DEFINITION_REPRESENTATION(#14,#19); +#21=PRODUCT('sliver-faces','sliver-faces','',(#8)); +#22=PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#21)); +#23=PRODUCT_DEFINITION_FORMATION('','',#21); +#24=PRODUCT_DEFINITION('design','',#23,#9); +#25=PRODUCT_DEFINITION_SHAPE('','',#24); +#26=CARTESIAN_POINT('',(0.,0.,0.)); +#27=DIRECTION('',(0.,0.,1.)); +#28=DIRECTION('',(1.,0.,0.)); +#29=AXIS2_PLACEMENT_3D('',#26,#27,#28); +#30=CARTESIAN_POINT('',(0.,0.,0.)); +#31=VERTEX_POINT('',#30); +#32=CARTESIAN_POINT('',(10.0,0.,0.)); +#33=VERTEX_POINT('',#32); +#34=CARTESIAN_POINT('',(10.0,0.001,0.)); +#35=VERTEX_POINT('',#34); +#36=CARTESIAN_POINT('',(20.0,0.001,0.)); +#37=VERTEX_POINT('',#36); +#38=CARTESIAN_POINT('',(20.0,0.00101,0.)); +#39=VERTEX_POINT('',#38); +#40=CARTESIAN_POINT('',(30.0,0.00101,0.)); +#41=VERTEX_POINT('',#40); +#42=CARTESIAN_POINT('',(30.0,0.0010101,0.)); +#43=VERTEX_POINT('',#42); +#44=CARTESIAN_POINT('',(40.0,0.0010101,0.)); +#45=VERTEX_POINT('',#44); +#46=CARTESIAN_POINT('',(40.0,0.00101011,0.)); +#47=VERTEX_POINT('',#46); +#48=CARTESIAN_POINT('',(60.0,0.00101011,0.)); +#49=VERTEX_POINT('',#48); +#50=CARTESIAN_POINT('',(60.0,40.0,0.)); +#51=VERTEX_POINT('',#50); +#52=CARTESIAN_POINT('',(0.,40.0,0.)); +#53=VERTEX_POINT('',#52); +#54=CARTESIAN_POINT('',(0.,0.,10.0)); +#55=VERTEX_POINT('',#54); +#56=CARTESIAN_POINT('',(10.0,0.,10.0)); +#57=VERTEX_POINT('',#56); +#58=CARTESIAN_POINT('',(10.0,0.001,10.0)); +#59=VERTEX_POINT('',#58); +#60=CARTESIAN_POINT('',(20.0,0.001,10.0)); +#61=VERTEX_POINT('',#60); +#62=CARTESIAN_POINT('',(20.0,0.00101,10.0)); +#63=VERTEX_POINT('',#62); +#64=CARTESIAN_POINT('',(30.0,0.00101,10.0)); +#65=VERTEX_POINT('',#64); +#66=CARTESIAN_POINT('',(30.0,0.0010101,10.0)); +#67=VERTEX_POINT('',#66); +#68=CARTESIAN_POINT('',(40.0,0.0010101,10.0)); +#69=VERTEX_POINT('',#68); +#70=CARTESIAN_POINT('',(40.0,0.00101011,10.0)); +#71=VERTEX_POINT('',#70); +#72=CARTESIAN_POINT('',(60.0,0.00101011,10.0)); +#73=VERTEX_POINT('',#72); +#74=CARTESIAN_POINT('',(60.0,40.0,10.0)); +#75=VERTEX_POINT('',#74); +#76=CARTESIAN_POINT('',(0.,40.0,10.0)); +#77=VERTEX_POINT('',#76); +#78=DIRECTION('',(1.0,0.,0.)); +#79=VECTOR('',#78,10.0); +#80=CARTESIAN_POINT('',(0.,0.,0.)); +#81=LINE('',#80,#79); +#82=EDGE_CURVE('',#31,#33,#81,.T.); +#83=DIRECTION('',(0.,1.0,0.)); +#84=VECTOR('',#83,0.001); +#85=CARTESIAN_POINT('',(10.0,0.,0.)); +#86=LINE('',#85,#84); +#87=EDGE_CURVE('',#33,#35,#86,.T.); +#88=DIRECTION('',(1.0,0.,0.)); +#89=VECTOR('',#88,10.0); +#90=CARTESIAN_POINT('',(10.0,0.001,0.)); +#91=LINE('',#90,#89); +#92=EDGE_CURVE('',#35,#37,#91,.T.); +#93=DIRECTION('',(0.,1.0,0.)); +#94=VECTOR('',#93,1.000000000000E-05); +#95=CARTESIAN_POINT('',(20.0,0.001,0.)); +#96=LINE('',#95,#94); +#97=EDGE_CURVE('',#37,#39,#96,.T.); +#98=DIRECTION('',(1.0,0.,0.)); +#99=VECTOR('',#98,10.0); +#100=CARTESIAN_POINT('',(20.0,0.00101,0.)); +#101=LINE('',#100,#99); +#102=EDGE_CURVE('',#39,#41,#101,.T.); +#103=DIRECTION('',(0.,1.0,0.)); +#104=VECTOR('',#103,1.000000000000E-07); +#105=CARTESIAN_POINT('',(30.0,0.00101,0.)); +#106=LINE('',#105,#104); +#107=EDGE_CURVE('',#41,#43,#106,.T.); +#108=DIRECTION('',(1.0,0.,0.)); +#109=VECTOR('',#108,10.0); +#110=CARTESIAN_POINT('',(30.0,0.0010101,0.)); +#111=LINE('',#110,#109); +#112=EDGE_CURVE('',#43,#45,#111,.T.); +#113=DIRECTION('',(0.,1.0,0.)); +#114=VECTOR('',#113,1.000000000000E-08); +#115=CARTESIAN_POINT('',(40.0,0.0010101,0.)); +#116=LINE('',#115,#114); +#117=EDGE_CURVE('',#45,#47,#116,.T.); +#118=DIRECTION('',(1.0,0.,0.)); +#119=VECTOR('',#118,20.0); +#120=CARTESIAN_POINT('',(40.0,0.00101011,0.)); +#121=LINE('',#120,#119); +#122=EDGE_CURVE('',#47,#49,#121,.T.); +#123=DIRECTION('',(0.,1.0,0.)); +#124=VECTOR('',#123,39.99898989); +#125=CARTESIAN_POINT('',(60.0,0.00101011,0.)); +#126=LINE('',#125,#124); +#127=EDGE_CURVE('',#49,#51,#126,.T.); +#128=DIRECTION('',(-1.0,0.,0.)); +#129=VECTOR('',#128,60.0); +#130=CARTESIAN_POINT('',(60.0,40.0,0.)); +#131=LINE('',#130,#129); +#132=EDGE_CURVE('',#51,#53,#131,.T.); +#133=DIRECTION('',(0.,-1.0,0.)); +#134=VECTOR('',#133,40.0); +#135=CARTESIAN_POINT('',(0.,40.0,0.)); +#136=LINE('',#135,#134); +#137=EDGE_CURVE('',#53,#31,#136,.T.); +#138=DIRECTION('',(1.0,0.,0.)); +#139=VECTOR('',#138,10.0); +#140=CARTESIAN_POINT('',(0.,0.,10.0)); +#141=LINE('',#140,#139); +#142=EDGE_CURVE('',#55,#57,#141,.T.); +#143=DIRECTION('',(0.,1.0,0.)); +#144=VECTOR('',#143,0.001); +#145=CARTESIAN_POINT('',(10.0,0.,10.0)); +#146=LINE('',#145,#144); +#147=EDGE_CURVE('',#57,#59,#146,.T.); +#148=DIRECTION('',(1.0,0.,0.)); +#149=VECTOR('',#148,10.0); +#150=CARTESIAN_POINT('',(10.0,0.001,10.0)); +#151=LINE('',#150,#149); +#152=EDGE_CURVE('',#59,#61,#151,.T.); +#153=DIRECTION('',(0.,1.0,0.)); +#154=VECTOR('',#153,1.000000000000E-05); +#155=CARTESIAN_POINT('',(20.0,0.001,10.0)); +#156=LINE('',#155,#154); +#157=EDGE_CURVE('',#61,#63,#156,.T.); +#158=DIRECTION('',(1.0,0.,0.)); +#159=VECTOR('',#158,10.0); +#160=CARTESIAN_POINT('',(20.0,0.00101,10.0)); +#161=LINE('',#160,#159); +#162=EDGE_CURVE('',#63,#65,#161,.T.); +#163=DIRECTION('',(0.,1.0,0.)); +#164=VECTOR('',#163,1.000000000000E-07); +#165=CARTESIAN_POINT('',(30.0,0.00101,10.0)); +#166=LINE('',#165,#164); +#167=EDGE_CURVE('',#65,#67,#166,.T.); +#168=DIRECTION('',(1.0,0.,0.)); +#169=VECTOR('',#168,10.0); +#170=CARTESIAN_POINT('',(30.0,0.0010101,10.0)); +#171=LINE('',#170,#169); +#172=EDGE_CURVE('',#67,#69,#171,.T.); +#173=DIRECTION('',(0.,1.0,0.)); +#174=VECTOR('',#173,1.000000000000E-08); +#175=CARTESIAN_POINT('',(40.0,0.0010101,10.0)); +#176=LINE('',#175,#174); +#177=EDGE_CURVE('',#69,#71,#176,.T.); +#178=DIRECTION('',(1.0,0.,0.)); +#179=VECTOR('',#178,20.0); +#180=CARTESIAN_POINT('',(40.0,0.00101011,10.0)); +#181=LINE('',#180,#179); +#182=EDGE_CURVE('',#71,#73,#181,.T.); +#183=DIRECTION('',(0.,1.0,0.)); +#184=VECTOR('',#183,39.99898989); +#185=CARTESIAN_POINT('',(60.0,0.00101011,10.0)); +#186=LINE('',#185,#184); +#187=EDGE_CURVE('',#73,#75,#186,.T.); +#188=DIRECTION('',(-1.0,0.,0.)); +#189=VECTOR('',#188,60.0); +#190=CARTESIAN_POINT('',(60.0,40.0,10.0)); +#191=LINE('',#190,#189); +#192=EDGE_CURVE('',#75,#77,#191,.T.); +#193=DIRECTION('',(0.,-1.0,0.)); +#194=VECTOR('',#193,40.0); +#195=CARTESIAN_POINT('',(0.,40.0,10.0)); +#196=LINE('',#195,#194); +#197=EDGE_CURVE('',#77,#55,#196,.T.); +#198=DIRECTION('',(0.,0.,1.0)); +#199=VECTOR('',#198,10.0); +#200=CARTESIAN_POINT('',(0.,0.,0.)); +#201=LINE('',#200,#199); +#202=EDGE_CURVE('',#31,#55,#201,.T.); +#203=DIRECTION('',(0.,0.,1.0)); +#204=VECTOR('',#203,10.0); +#205=CARTESIAN_POINT('',(10.0,0.,0.)); +#206=LINE('',#205,#204); +#207=EDGE_CURVE('',#33,#57,#206,.T.); +#208=DIRECTION('',(0.,0.,1.0)); +#209=VECTOR('',#208,10.0); +#210=CARTESIAN_POINT('',(10.0,0.001,0.)); +#211=LINE('',#210,#209); +#212=EDGE_CURVE('',#35,#59,#211,.T.); +#213=DIRECTION('',(0.,0.,1.0)); +#214=VECTOR('',#213,10.0); +#215=CARTESIAN_POINT('',(20.0,0.001,0.)); +#216=LINE('',#215,#214); +#217=EDGE_CURVE('',#37,#61,#216,.T.); +#218=DIRECTION('',(0.,0.,1.0)); +#219=VECTOR('',#218,10.0); +#220=CARTESIAN_POINT('',(20.0,0.00101,0.)); +#221=LINE('',#220,#219); +#222=EDGE_CURVE('',#39,#63,#221,.T.); +#223=DIRECTION('',(0.,0.,1.0)); +#224=VECTOR('',#223,10.0); +#225=CARTESIAN_POINT('',(30.0,0.00101,0.)); +#226=LINE('',#225,#224); +#227=EDGE_CURVE('',#41,#65,#226,.T.); +#228=DIRECTION('',(0.,0.,1.0)); +#229=VECTOR('',#228,10.0); +#230=CARTESIAN_POINT('',(30.0,0.0010101,0.)); +#231=LINE('',#230,#229); +#232=EDGE_CURVE('',#43,#67,#231,.T.); +#233=DIRECTION('',(0.,0.,1.0)); +#234=VECTOR('',#233,10.0); +#235=CARTESIAN_POINT('',(40.0,0.0010101,0.)); +#236=LINE('',#235,#234); +#237=EDGE_CURVE('',#45,#69,#236,.T.); +#238=DIRECTION('',(0.,0.,1.0)); +#239=VECTOR('',#238,10.0); +#240=CARTESIAN_POINT('',(40.0,0.00101011,0.)); +#241=LINE('',#240,#239); +#242=EDGE_CURVE('',#47,#71,#241,.T.); +#243=DIRECTION('',(0.,0.,1.0)); +#244=VECTOR('',#243,10.0); +#245=CARTESIAN_POINT('',(60.0,0.00101011,0.)); +#246=LINE('',#245,#244); +#247=EDGE_CURVE('',#49,#73,#246,.T.); +#248=DIRECTION('',(0.,0.,1.0)); +#249=VECTOR('',#248,10.0); +#250=CARTESIAN_POINT('',(60.0,40.0,0.)); +#251=LINE('',#250,#249); +#252=EDGE_CURVE('',#51,#75,#251,.T.); +#253=DIRECTION('',(0.,0.,1.0)); +#254=VECTOR('',#253,10.0); +#255=CARTESIAN_POINT('',(0.,40.0,0.)); +#256=LINE('',#255,#254); +#257=EDGE_CURVE('',#53,#77,#256,.T.); +#258=ORIENTED_EDGE('',*,*,#137,.F.); +#259=ORIENTED_EDGE('',*,*,#132,.F.); +#260=ORIENTED_EDGE('',*,*,#127,.F.); +#261=ORIENTED_EDGE('',*,*,#122,.F.); +#262=ORIENTED_EDGE('',*,*,#117,.F.); +#263=ORIENTED_EDGE('',*,*,#112,.F.); +#264=ORIENTED_EDGE('',*,*,#107,.F.); +#265=ORIENTED_EDGE('',*,*,#102,.F.); +#266=ORIENTED_EDGE('',*,*,#97,.F.); +#267=ORIENTED_EDGE('',*,*,#92,.F.); +#268=ORIENTED_EDGE('',*,*,#87,.F.); +#269=ORIENTED_EDGE('',*,*,#82,.F.); +#270=EDGE_LOOP('',(#258,#259,#260,#261,#262,#263,#264,#265,#266,#267,#268,#269)); +#271=FACE_OUTER_BOUND('',#270,.T.); +#272=CARTESIAN_POINT('',(0.,0.,0.)); +#273=DIRECTION('',(0.,0.,-1.)); +#274=DIRECTION('',(1.,0.,0.)); +#275=AXIS2_PLACEMENT_3D('',#272,#273,#274); +#276=PLANE('',#275); +#277=ADVANCED_FACE('',(#271),#276,.T.); +#278=ORIENTED_EDGE('',*,*,#142,.T.); +#279=ORIENTED_EDGE('',*,*,#147,.T.); +#280=ORIENTED_EDGE('',*,*,#152,.T.); +#281=ORIENTED_EDGE('',*,*,#157,.T.); +#282=ORIENTED_EDGE('',*,*,#162,.T.); +#283=ORIENTED_EDGE('',*,*,#167,.T.); +#284=ORIENTED_EDGE('',*,*,#172,.T.); +#285=ORIENTED_EDGE('',*,*,#177,.T.); +#286=ORIENTED_EDGE('',*,*,#182,.T.); +#287=ORIENTED_EDGE('',*,*,#187,.T.); +#288=ORIENTED_EDGE('',*,*,#192,.T.); +#289=ORIENTED_EDGE('',*,*,#197,.T.); +#290=EDGE_LOOP('',(#278,#279,#280,#281,#282,#283,#284,#285,#286,#287,#288,#289)); +#291=FACE_OUTER_BOUND('',#290,.T.); +#292=CARTESIAN_POINT('',(0.,0.,10.0)); +#293=DIRECTION('',(0.,0.,1.)); +#294=DIRECTION('',(1.,0.,0.)); +#295=AXIS2_PLACEMENT_3D('',#292,#293,#294); +#296=PLANE('',#295); +#297=ADVANCED_FACE('',(#291),#296,.T.); +#298=ORIENTED_EDGE('',*,*,#82,.T.); +#299=ORIENTED_EDGE('',*,*,#207,.T.); +#300=ORIENTED_EDGE('',*,*,#142,.F.); +#301=ORIENTED_EDGE('',*,*,#202,.F.); +#302=EDGE_LOOP('',(#298,#299,#300,#301)); +#303=FACE_OUTER_BOUND('',#302,.T.); +#304=CARTESIAN_POINT('',(0.,0.,0.)); +#305=DIRECTION('',(0.,-1.0,0.)); +#306=DIRECTION('',(1.0,0.,0.)); +#307=AXIS2_PLACEMENT_3D('',#304,#305,#306); +#308=PLANE('',#307); +#309=ADVANCED_FACE('',(#303),#308,.T.); +#310=ORIENTED_EDGE('',*,*,#87,.T.); +#311=ORIENTED_EDGE('',*,*,#212,.T.); +#312=ORIENTED_EDGE('',*,*,#147,.F.); +#313=ORIENTED_EDGE('',*,*,#207,.F.); +#314=EDGE_LOOP('',(#310,#311,#312,#313)); +#315=FACE_OUTER_BOUND('',#314,.T.); +#316=CARTESIAN_POINT('',(10.0,0.,0.)); +#317=DIRECTION('',(1.0,0.,0.)); +#318=DIRECTION('',(0.,1.0,0.)); +#319=AXIS2_PLACEMENT_3D('',#316,#317,#318); +#320=PLANE('',#319); +#321=ADVANCED_FACE('',(#315),#320,.T.); +#322=ORIENTED_EDGE('',*,*,#92,.T.); +#323=ORIENTED_EDGE('',*,*,#217,.T.); +#324=ORIENTED_EDGE('',*,*,#152,.F.); +#325=ORIENTED_EDGE('',*,*,#212,.F.); +#326=EDGE_LOOP('',(#322,#323,#324,#325)); +#327=FACE_OUTER_BOUND('',#326,.T.); +#328=CARTESIAN_POINT('',(10.0,0.001,0.)); +#329=DIRECTION('',(0.,-1.0,0.)); +#330=DIRECTION('',(1.0,0.,0.)); +#331=AXIS2_PLACEMENT_3D('',#328,#329,#330); +#332=PLANE('',#331); +#333=ADVANCED_FACE('',(#327),#332,.T.); +#334=ORIENTED_EDGE('',*,*,#97,.T.); +#335=ORIENTED_EDGE('',*,*,#222,.T.); +#336=ORIENTED_EDGE('',*,*,#157,.F.); +#337=ORIENTED_EDGE('',*,*,#217,.F.); +#338=EDGE_LOOP('',(#334,#335,#336,#337)); +#339=FACE_OUTER_BOUND('',#338,.T.); +#340=CARTESIAN_POINT('',(20.0,0.001,0.)); +#341=DIRECTION('',(1.0,0.,0.)); +#342=DIRECTION('',(0.,1.0,0.)); +#343=AXIS2_PLACEMENT_3D('',#340,#341,#342); +#344=PLANE('',#343); +#345=ADVANCED_FACE('',(#339),#344,.T.); +#346=ORIENTED_EDGE('',*,*,#102,.T.); +#347=ORIENTED_EDGE('',*,*,#227,.T.); +#348=ORIENTED_EDGE('',*,*,#162,.F.); +#349=ORIENTED_EDGE('',*,*,#222,.F.); +#350=EDGE_LOOP('',(#346,#347,#348,#349)); +#351=FACE_OUTER_BOUND('',#350,.T.); +#352=CARTESIAN_POINT('',(20.0,0.00101,0.)); +#353=DIRECTION('',(0.,-1.0,0.)); +#354=DIRECTION('',(1.0,0.,0.)); +#355=AXIS2_PLACEMENT_3D('',#352,#353,#354); +#356=PLANE('',#355); +#357=ADVANCED_FACE('',(#351),#356,.T.); +#358=ORIENTED_EDGE('',*,*,#107,.T.); +#359=ORIENTED_EDGE('',*,*,#232,.T.); +#360=ORIENTED_EDGE('',*,*,#167,.F.); +#361=ORIENTED_EDGE('',*,*,#227,.F.); +#362=EDGE_LOOP('',(#358,#359,#360,#361)); +#363=FACE_OUTER_BOUND('',#362,.T.); +#364=CARTESIAN_POINT('',(30.0,0.00101,0.)); +#365=DIRECTION('',(1.0,0.,0.)); +#366=DIRECTION('',(0.,1.0,0.)); +#367=AXIS2_PLACEMENT_3D('',#364,#365,#366); +#368=PLANE('',#367); +#369=ADVANCED_FACE('',(#363),#368,.T.); +#370=ORIENTED_EDGE('',*,*,#112,.T.); +#371=ORIENTED_EDGE('',*,*,#237,.T.); +#372=ORIENTED_EDGE('',*,*,#172,.F.); +#373=ORIENTED_EDGE('',*,*,#232,.F.); +#374=EDGE_LOOP('',(#370,#371,#372,#373)); +#375=FACE_OUTER_BOUND('',#374,.T.); +#376=CARTESIAN_POINT('',(30.0,0.0010101,0.)); +#377=DIRECTION('',(0.,-1.0,0.)); +#378=DIRECTION('',(1.0,0.,0.)); +#379=AXIS2_PLACEMENT_3D('',#376,#377,#378); +#380=PLANE('',#379); +#381=ADVANCED_FACE('',(#375),#380,.T.); +#382=ORIENTED_EDGE('',*,*,#117,.T.); +#383=ORIENTED_EDGE('',*,*,#242,.T.); +#384=ORIENTED_EDGE('',*,*,#177,.F.); +#385=ORIENTED_EDGE('',*,*,#237,.F.); +#386=EDGE_LOOP('',(#382,#383,#384,#385)); +#387=FACE_OUTER_BOUND('',#386,.T.); +#388=CARTESIAN_POINT('',(40.0,0.0010101,0.)); +#389=DIRECTION('',(1.0,0.,0.)); +#390=DIRECTION('',(0.,1.0,0.)); +#391=AXIS2_PLACEMENT_3D('',#388,#389,#390); +#392=PLANE('',#391); +#393=ADVANCED_FACE('',(#387),#392,.T.); +#394=ORIENTED_EDGE('',*,*,#122,.T.); +#395=ORIENTED_EDGE('',*,*,#247,.T.); +#396=ORIENTED_EDGE('',*,*,#182,.F.); +#397=ORIENTED_EDGE('',*,*,#242,.F.); +#398=EDGE_LOOP('',(#394,#395,#396,#397)); +#399=FACE_OUTER_BOUND('',#398,.T.); +#400=CARTESIAN_POINT('',(40.0,0.00101011,0.)); +#401=DIRECTION('',(0.,-1.0,0.)); +#402=DIRECTION('',(1.0,0.,0.)); +#403=AXIS2_PLACEMENT_3D('',#400,#401,#402); +#404=PLANE('',#403); +#405=ADVANCED_FACE('',(#399),#404,.T.); +#406=ORIENTED_EDGE('',*,*,#127,.T.); +#407=ORIENTED_EDGE('',*,*,#252,.T.); +#408=ORIENTED_EDGE('',*,*,#187,.F.); +#409=ORIENTED_EDGE('',*,*,#247,.F.); +#410=EDGE_LOOP('',(#406,#407,#408,#409)); +#411=FACE_OUTER_BOUND('',#410,.T.); +#412=CARTESIAN_POINT('',(60.0,0.00101011,0.)); +#413=DIRECTION('',(1.0,0.,0.)); +#414=DIRECTION('',(0.,1.0,0.)); +#415=AXIS2_PLACEMENT_3D('',#412,#413,#414); +#416=PLANE('',#415); +#417=ADVANCED_FACE('',(#411),#416,.T.); +#418=ORIENTED_EDGE('',*,*,#132,.T.); +#419=ORIENTED_EDGE('',*,*,#257,.T.); +#420=ORIENTED_EDGE('',*,*,#192,.F.); +#421=ORIENTED_EDGE('',*,*,#252,.F.); +#422=EDGE_LOOP('',(#418,#419,#420,#421)); +#423=FACE_OUTER_BOUND('',#422,.T.); +#424=CARTESIAN_POINT('',(60.0,40.0,0.)); +#425=DIRECTION('',(0.,1.0,0.)); +#426=DIRECTION('',(-1.0,0.,0.)); +#427=AXIS2_PLACEMENT_3D('',#424,#425,#426); +#428=PLANE('',#427); +#429=ADVANCED_FACE('',(#423),#428,.T.); +#430=ORIENTED_EDGE('',*,*,#137,.T.); +#431=ORIENTED_EDGE('',*,*,#202,.T.); +#432=ORIENTED_EDGE('',*,*,#197,.F.); +#433=ORIENTED_EDGE('',*,*,#257,.F.); +#434=EDGE_LOOP('',(#430,#431,#432,#433)); +#435=FACE_OUTER_BOUND('',#434,.T.); +#436=CARTESIAN_POINT('',(0.,40.0,0.)); +#437=DIRECTION('',(-1.0,0.,0.)); +#438=DIRECTION('',(0.,-1.0,0.)); +#439=AXIS2_PLACEMENT_3D('',#436,#437,#438); +#440=PLANE('',#439); +#441=ADVANCED_FACE('',(#435),#440,.T.); +#442=CLOSED_SHELL('',(#277,#297,#309,#321,#333,#345,#357,#369,#381,#393,#405,#417,#429,#441)); +#443=MANIFOLD_SOLID_BREP('sliver-faces',#442); +#444=ADVANCED_BREP_SHAPE_REPRESENTATION('sliver-faces',(#29,#443),#5); +#445=SHAPE_DEFINITION_REPRESENTATION(#25,#444); +#446=NEXT_ASSEMBLY_USAGE_OCCURRENCE('sliver-faces:1','sliver-faces:1','',#13,#24,$); +#447=PRODUCT_DEFINITION_SHAPE('','',#446); +#448=CARTESIAN_POINT('',(0.,0.,0.)); +#449=DIRECTION('',(0.,0.,1.)); +#450=DIRECTION('',(1.,0.,0.)); +#451=AXIS2_PLACEMENT_3D('',#448,#449,#450); +#452=ITEM_DEFINED_TRANSFORMATION('','',#29,#451); +#453=(REPRESENTATION_RELATIONSHIP('','',#444,#19)REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#452)SHAPE_REPRESENTATION_RELATIONSHIP()); +#454=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#453,#447); +ENDSEC; +END-ISO-10303-21;