未参照のマスターサーフェスを削除 (スクリプト)

使用されていないイメージやマスターサーフェスは、ブラウザ下のセパレータをドラッグして上に移動させると、
どのイメージまたはマスターサーフェスがどの形状を参照しているか見ることができます。
以下のスクリプトで、マスターサーフェスを取得しどこからも参照されていないものを削除します。


scene = xshade.scene()

# ---------------------------------------------.
# 階層をたどってマスターサーフェスを格納.
# ---------------------------------------------.
def getMasterSurfaces (shape, masterSurfaceA):
  if shape.type == 8:  # マスターサーフェス.
    masterSurfaceA.append(shape)

  if shape.has_son:
    s = shape.son
    while s.has_bro:
      s = s.bro
      getMasterSurfaces(s, masterSurfaceA)

# ---------------------------------------------.
# 階層をたどってマスターサーフェスが使用されているか調査.
# ---------------------------------------------.
def checkMasterSurface (shape, masterSurfaceA, masterSurfaceUseA):
  if shape.type == 8:  # マスターサーフェス.
    return

  # shapeの形状が表面材質を持つ場合、マスターサーフェスの存在をチェック.
  if shape.has_surface_attributes:
    mSurface = shape.master_surface
    if mSurface != None:
      for i in range(len(masterSurfaceA)):
          if mSurface.ordinal == masterSurfaceA[i].ordinal:
            masterSurfaceUseA[i] = 1
            break

  # フェイスグループを持つ場合.
  if shape.type == 7:  # ポリゴンメッシュの場合.
    faceGroupCou = shape.get_number_of_face_groups()
    for i in range(faceGroupCou):
      mSurface = shape.get_face_group_surface(i)
      if mSurface != None:
        for j in range(len(masterSurfaceA)):
          if mSurface.ordinal == masterSurfaceA[j].ordinal:
            masterSurfaceUseA[j] = 1
            break
    
  if shape.has_son:
    s = shape.son
    while s.has_bro:
      s = s.bro
      checkMasterSurface(s, masterSurfaceA, masterSurfaceUseA)

# ---------------------------------------------.
# マスターサーフェスを取得.
rootShape = scene.shape  # ルート形状.
masterSurfaceList = []
getMasterSurfaces(rootShape, masterSurfaceList)

# マスターサーフェスが使用されているかチェック.
msCou = len(masterSurfaceList)
masterSurfaceUseList = []
if msCou > 0:
  for i in range(msCou):
    masterSurfaceUseList.append(0)
  checkMasterSurface(rootShape, masterSurfaceList, masterSurfaceUseList)

# 未使用のマスターサーフェスを削除.
for i in range(msCou):
   # マスターサーフェスが参照されていない場合.
   if masterSurfaceUseList[i] == 0:
     masterSurfaceList[i].remove()  # マスターサーフェスを削除.

未参照のマスターイメージの削除については「未参照のイメージを削除 (スクリプト)」をご参照くださいませ。

Translate »