import numpy as np, trimesh
import xml.etree.ElementTree as ET
s=trimesh.load("gripper_from_blender.glb")
# drop the two marker cubes (they were just placement guides), keep real parts + add the connector
for m in ("servo_to_finger","finger_adj"):
    pass
conn=trimesh.load("gripper_connector.stl",force="mesh")
cg=conn.copy(); cg.apply_scale(0.01)                    # mm -> GLB units
s.add_geometry(cg,node_name="connector",geom_name="connector")
s.export("gripper.glb")                                 # updated GLB for Blender (with connector)
comb=s.dump(concatenate=True).copy(); comb.apply_scale(100.0)   # GLB units -> mm
comb.export("gripper_assembled.stl")
R=ET.Element("robot",{"name":"gripper_assembled"}); ET.SubElement(R,"link",{"name":"world"})
j=ET.SubElement(R,"joint",{"name":"w","type":"fixed"}); ET.SubElement(j,"parent",{"link":"world"}); ET.SubElement(j,"child",{"link":"g"}); ET.SubElement(j,"origin",{"xyz":"0 0 0","rpy":"1.5708 0 0"})
L=ET.SubElement(R,"link",{"name":"g"}); v=ET.SubElement(L,"visual"); ET.SubElement(v,"origin",{"xyz":"0 0 0","rpy":"0 0 0"})
ET.SubElement(ET.SubElement(v,"geometry"),"mesh",{"filename":"gripper_assembled.stl","scale":"0.001 0.001 0.001"})
ET.SubElement(ET.SubElement(v,"material",{"name":"m"}),"color",{"rgba":"0.72 0.6 0.3 1"})
ET.ElementTree(R).write("gripper_assembled.urdf")
print("wrote gripper.glb (+connector), gripper_assembled.urdf")
