【问题标题】:Set position according part of an objectname根据对象名的一部分设置位置
【发布时间】:2017-09-03 00:58:28
【问题描述】:

我正在尝试使用 python 在 blender3D 中编写脚本。 我的场景中有一堆对象,我想使用对象名称的数字部分来翻译它们。

首先,我通过匹配对象名称的一部分从场景中收集对象。

root_obj = [obj for obj in scene.objects if fnmatch.fnmatchcase(obj.name, "*_Root")]

这给了我一个列表:[bpy.data.objects['01_Root'],bpy.data.objects['02_Root'],bpy.data.objects['03_Root'],bpy.data.objects[ '00_Root']]

我的目标是将这些对象移动 15 倍于它们对应的名称部分。所以 '00_Root' 不必移动,但 '01_Root' 必须移动 15 个搅拌机单元和 '02_Root' 30 个搅拌机单元。

如何提取名称的数字部分并将其用作翻译值。

我是 python 的新手,所以我会很感激我能得到的所有帮助。

【问题讨论】:

    标签: python-3.x blender


    【解决方案1】:

    字符串是一个字符列表,每个字符都可以通过索引从0开始访问,第一个字符用name[0],第二个用name[1]。与任何列表一样,您可以使用slicing 获取列表的一部分。如果值始终是前两个字符,您可以使用name[:2] 获取值,您可以使用int() 将其转换为整数或使用float() 将其转换为浮点数。结合起来,就变成了,

    val = int(name[:2])
    

    然后你就有了一个可以用来计算新位置的数字。

    obj.location.x = val * 15
    

    如果名称中的位数可能不同,您可以使用split() 在特定分隔符处断开字符串。这会返回一个指定字符之间的项目列表,所以如果你想让第一个项目变成一个整数。

    name = '02_item'
    val = int(name.split('_')[0])
    

    使用 split 还允许名称中有多个值。

    name = '2_12_item'
    val1 = int(name.split('_')[0])
    val2 = int(name.split('_')[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多