インスタンスを保持(Preserve Instances)せずに書き出されたFBXファイルをBlenderで読み込んでインスタンス(Meshデータブロックのリンク)を復元してみるテストです。

Meshの同一性の比較として、頂点数、エッジ数、フェース数とバウンディングボックスが一致しているかどうかを比べています。無理やりhashを取得して比較のほうが良いかもしれませんが。
以下、スクリプトのサンプルです。
import bpy
from pprint import pprint
def is_similar(obj_a, obj_b):
results = []
# compare componet count
mesh_a = obj_a.to_mesh()
mesh_b = obj_b.to_mesh()
results.append(len(mesh_a.vertices) == len(mesh_b.vertices))
results.append(len(mesh_a.edges) == len(mesh_b.edges))
results.append(len(mesh_a.polygons) == len(mesh_b.polygons))
# compare bounding box
for p in range(len(obj_a.bound_box)):
p_a = [c for c in obj_a.bound_box[p]]
p_b = [c for c in obj_b.bound_box[p]]
results.append(p_a == p_b)
return all(results)
def sorting_similar_mesh(objects):
results =[[objects.pop(0)]]
for obj in objects:
is_sim = False
for r in results:
if is_similar(obj, r[0]):
r.append(obj)
is_sim = True
if not is_sim:
results.append([obj])
return results
def link_data_block(objects):
if len(objects) <= 1:
return
origin = objects.pop(0)
for obj in objects:
obj.data = origin.data
if __name__ == "__main__":
# get all objects has mesh data.
mesh_objects = [obj for obj in bpy.data.objects if type(obj.data) == bpy.types.Mesh]
# sort
results = sorting_similar_mesh(mesh_objects)
for r in results:
link_data_block(r)