"""Critique 2: the J3 rod's eye stays on the knob pin (the cylinder is aimed and sized right) at every frame, and the doors' own positions at the key frames. Read-only. blender -b --factory-startup "" --python previews/critique2/crit2_rodeye.py -- """ import json import sys import bpy from mathutils import Vector OUT = sys.argv[sys.argv.index("--") + 1] sf = bpy.data.scenes["DoorArm | Ship fit"] bpy.context.window_manager.windows[0].scene = sf ctl = bpy.data.objects["DoorArm | CONTROLS"] KNOB_IN_UPPER = Vector((-0.4664, 0.0, -0.3696)) # DoorRobotArm_layout.json ik_closed_form.rod.knob_in_upper R = {"rod_eye_to_knob_pin_mm": {}, "doors": {}} for ver in ("A", "B"): ctl["version"] = 0 if ver == "A" else 1 ctl.update_tag() for key in ("AFT", "FORE"): p = "DoorArm_%s_%s | " % (key, ver) up = bpy.data.objects[p + "upper arm"] pis = bpy.data.objects[p + "J3 piston"] worst = [0.0, 0] for f in range(1, 121): sf.frame_set(f) dg = bpy.context.evaluated_depsgraph_get() Mu = up.evaluated_get(dg).matrix_world Mp = pis.evaluated_get(dg).matrix_world d = (Mp.translation - Mu @ KNOB_IN_UPPER).length * 1000 if d > worst[0]: worst = [round(d, 3), f] R["rod_eye_to_knob_pin_mm"]["%s_%s" % (key, ver)] = worst ctl["version"] = 0 ctl.update_tag() for n in ("Moonpool_Door_Aft", "Moonpool_Door_Fore"): o = bpy.data.objects[n] row = {} for f in (1, 12, 30, 48, 72, 90, 108, 120): sf.frame_set(f) row[f] = [round(x, 4) for x in o.evaluated_get(bpy.context.evaluated_depsgraph_get()).matrix_world.translation] R["doors"][n] = row with open(OUT, "w") as fh: json.dump(R, fh, indent=1) print("[crit2] rodeye written", OUT, flush=True)