haho 发表于 2025-12-24 14:37

bone 选择基于父子排序


-- ==============================================
-- 【全局递归函数】兼容2020
-- ==============================================
fn traverseBipedBone_GLOBAL currBone &validBones &sortedBones &processed =
(
    if (isValidNode currBone and classOf currBone == BoneGeometry and findItem validBones currBone > 0 and findItem processed currBone == 0) do
    (
      append sortedBones currBone       -- 先添加当前父骨骼
      append processed currBone      -- 标记已处理

      -- 遍历子骨骼:纯()写法
      for childBone in currBone.children do
      (
            if (classOf childBone == BoneGeometry) do
            (
                -- 递归调用,参数全显式传递
                traverseBipedBone_GLOBAL childBone &validBones &sortedBones &processed
            )
      )
    )
)

-- ==============================================
-- 【核心排序函数】
-- ==============================================
fn sortBipedBonesByHierarchy targetBones =
(
    -- 边界检查
    if (targetBones == undefined or targetBones.count == 0) then (return #())

    -- 步骤1:过滤+去重,仅保留有效Biped骨骼
    validBipedBones = #()
    for bone1 in targetBones do
    (
      if (isValidNode bone1 and classOf bone1 == BoneGeometry and findItem validBipedBones bone1 == 0) then
      (
            append validBipedBones bone1
      )
    )

    sortedBones = #()-- 最终排序结果
    processed = #()    -- 去重标记

    -- 步骤2:优先处理根骨骼(无父/父非Biped骨骼)
    for bone1 in validBipedBones do
    (
      if (bone1.parent == undefined or classOf bone1.parent != BoneGeometry) then
      (
            -- 调用全局递归函数,全引用传参
            traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
      )
    )

    -- 步骤3:补充处理未递归到的非根骨骼
    for bone1 in validBipedBones do
    (
      if (findItem processed bone1 == 0) then
      (
            traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
      )
    )

    return sortedBones
)

-- ==============================================
-- 【快捷执行函数】
-- ==============================================
fn selectBipedBonesByHierarchy =
(
    -- 提取当前选中的所有Biped骨骼
    selectedBones = for obj in selection where (classOf obj == BoneGeometry) collect obj

    -- 按父子层级排序
    sortedBones = sortBipedBonesByHierarchy selectedBones

    -- 执行选中并反馈结果
    if (sortedBones.count > 0) then
    (
      select sortedBones
      print "========================================"
      print ("✅ 成功排序并选中 " + sortedBones.count as string + " 个Biped骨骼:")
      for i = 1 to sortedBones.count do
      (
            print ("" + i as string + ". " + sortedBones.name)
      )
      print "========================================"
    )
    else
    (
      print "❌ 未检测到有效Biped骨骼!请先选中Biped骨骼后重试。"
    )

    return sortedBones
)

-- ==============================================
-- 【一键执行】直接运行此句即可
-- ==============================================

for a in selection do print a.name
selectBipedBonesByHierarchy()


页: [1]
查看完整版本: bone 选择基于父子排序