【问题标题】:How does the timeline_markers list work in Blender?时间线标记列表如何在 Blender 中工作?
【发布时间】:2016-10-12 08:52:28
【问题描述】:

我有以下代码:

import bpy
import math
import random


Markers = []

for marker in bpy.context.scene.timeline_markers:
    frame = marker.frame
    Markers.extend([frame])

print('-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+')
print(Markers)
Markers = sorted(Markers)
print(Markers)

当我执行它时,它会为第一个打印语句提供两个不同的输出,分别在 Markers = sorted(Markers) 之前和之后。

这是输出:

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+-+-+-+-+-+ [33、93、151、212、265、409、640、786、524、317] [33、93、151、212、265、317、409、524、640、786]

当循环读取timeline_markers中的项目时,它们不是按升序排列吗?

但是,假设不是这样,它是如何工作的?

【问题讨论】:

  • 列表已排序。你分配给同一个变量。这就是为什么它显示为不同的输出。实际上你想归档什么?
  • 不,我的意思是,不应该默认排序吗?
  • No.. 在Markers = sorted(Markers)执行后排序。你可以看看我的回答。

标签: python list blender


【解决方案1】:

您假设timeline_markers 存储为排序列表,但事实并非如此。虽然它们作为通用列表/数组呈现给 python,但它们在搅拌机内部存储为链表。如果您追溯源代码,您会发现它们使用 DNA_listBase.h 中定义并在 listbase.c 中实现的 ListBase。

虽然我们将标记视为与时间线匹配的顺序的序列,但保持它们排序并没有真正的必要或好处。如果您想按帧顺序显示标记列表,那么您只需要自己对它们进行排序即可。

【讨论】:

    【解决方案2】:

    您的代码没有问题。代码工作正常,这就是为什么它会这样显示。您被分配给同一个变量,这就是它显示不同输出的原因。当您执行 print(Markers) 时,它会给出原始结果。在Markers = sorted(Markers) 之后,列表被修改。所以分配给像这样的其他变量Sorted_Markers = sorted(Markers)

    您可以在此处查看差异。

    In [1]: markers = [33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
    In [2]: print (markers)
    [33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
    In [3]: sorted_marker = sorted(markers)
    In [3]: print (markers)
    [33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
    In [4]: print (sorted_marker)
    [33, 93, 151, 212, 265, 317, 409, 524, 640, 786]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2011-06-06
      • 2021-11-25
      • 2016-04-28
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多