"""Parts list in metres and link-local coordinates (for design.json["parts_m"] and the tables in DESIGN.md).""" import design_kin as K S = 0.0022 ORIGIN_PX = { # link object origins in the A frame at rest (px) "Carriage": (0, 0, 0), "Turret": (0, 0, 0), "LowerArm": (K.PX["J2"][0], 0, K.PX["J2"][1]), "UpperArm": (K.PX["J3"][0], 0, K.PX["J3"][1]), "Forearm": (-35, 0, 937), "WristHead": (K.PX["WC"][0], 0, K.PX["WC"][1]), "Flange": (K.PX["WC"][0], 0, K.PX["WC"][1]), "ToolA": (K.PX["WC"][0], 0, K.PX["WC"][1]), "ToolB": (K.PX["WC"][0], 0, K.PX["WC"][1]), "Finger": (0, 0, 0), } NUM_SIZE = {"box": 3, "rbox": 4, "cyl": 2, "ring": 3, "disc": 2, "U": 3, "decal": 2, "knurl": 2, "links": 3, "channel": 3, "cone": 3, "hex": 2, "belt": 2, "tube": 1} def conv_pt(p, o): return [round((p[i] - o[i]) * S, 4) for i in range(3)] def to_m(parts): out = {} for link, lst in parts.items(): o = ORIGIN_PX.get(link, (0, 0, 0)) rows = [] for pt in lst: q = dict(pt) if pt["units"] == "px": sh = pt["shape"] if sh == "stack": q["size"] = [[round(d * S, 4), round(h * S, 4), mat] for d, h, mat in pt["size"]] elif sh == "plate2d": q["size"] = [[round((x - o[0]) * S, 4), round((z - o[2]) * S, 4)] for x, z in pt["size"]] q["size_note"] = "outline (x, z) in the link frame, metres" else: n = NUM_SIZE.get(sh, len(pt["size"])) q["size"] = [round(v * S, 4) if i < n else v for i, v in enumerate(pt["size"])] at = pt["at"] if at and isinstance(at[0], (list, tuple)): q["at"] = [conv_pt(a, o) for a in at] elif sh == "plate2d": q["at"] = [0, 0, 0] else: q["at"] = conv_pt(at, o) q["units"] = "m" q["frame"] = "%s object (origin %s m in the arm frame A at rest)" % (link, [round(v * S, 4) for v in o]) rows.append(q) out[link] = rows return out def md_tables(parts_m): lines = [] for link, rows in parts_m.items(): lines.append("\n### %s\n" % link) fr = rows[0].get("frame", "") lines.append("Frame: %s.\n" % fr) lines.append("| id | part | shape | size (m) | at (m) | refs | material | notes |") lines.append("|---|---|---|---|---|---|---|---|") for q in rows: size = q["size"] if q["shape"] == "stack": size = " / ".join("dia %.3f h %.3f %s" % (d, h, m) for d, h, m in size) elif q["shape"] == "plate2d": size = "outline " + " ".join("(%.3f, %.3f)" % (x, z) for x, z in size) else: size = ", ".join(str(v) for v in size) at = q["at"] if at and isinstance(at[0], list): at = "; ".join("(%s)" % ", ".join("%.3f" % v for v in a) for a in at) elif at: at = "(%s)" % ", ".join("%.3f" % v for v in at) else: at = "-" note = q.get("note", "") if q.get("frame") and q.get("frame") != fr and q["units"] == "m": note = "[frame: %s] " % q["frame"] + note if q.get("both"): note = "both sides (mirror Y). " + note if q.get("axis"): note = "axis %s. " % q["axis"] + note lines.append("| %s | %s | %s | %s | %s | %s | %s | %s |" % (q["id"], q["name"], q["shape"], size, at, q["refs"], q["mat"], note.replace("|", "/"))) return "\n".join(lines)