关于脚本中分组的疑惑

问题详情

给一些媒体块做了分组,但用reaper.GetMediaItemInfo_Value(it, 'I_GROUPID ')得到的结果却是0,这会是什么原因呢?或者有什么其他方法可以获取分组信息?
请教大神们

做过的尝试

尝试了一下很正常,你没提供什么信息判断不了具体情况,只能推测,确保你的对象是确实有分组的,确保你用的分组是以这个方式 Item grouping: Group items。如果都没问题,那就贴上操作过程的动图和完整的代码

grouptest_1

大致脚本如下:
local cur=reaper.GetCursorPosition() --获取当前光标位置
local tr=reaper.GetSelectedTrack(0, 0) --获取选中的轨道

function get_item_group(tr)
local num=reaper.CountTrackMediaItems(tr)
if num==0 then
msg(‘该轨道上没有媒体块’)
return
end

for i=0, num-1 do
	it=reaper.GetTrackMediaItem(tr, i)  --依次获取媒体块
	itpos=reaper.GetMediaItemInfo_Value(it, 'D_POSITION')    --获取媒体块的横坐标位置
	itlen=reaper.GetMediaItemInfo_Value(it, 'D_LENGTH')      --获取媒体块长度
	
	if cur<=itpos+itlen then --获取在光标时间后最近的媒体块(含重合)
		break
	end
end

itgroup=reaper.GetMediaItemInfo_Value(it, 'I_GROUPID ') --获取该媒体块的分组
msg(itgroup)

end

啊不好意思,低级错误,I_GROUPID后面多了个空格。。。。
sorry

代码犯了一些基本错误,说说怎么修改,具体原理要自己去查资料

local cur=reaper.GetCursorPosition() --获取当前光标位置
local tr=reaper.GetSelectedTrack(0, 0) --获取选中的轨道

function get_item_group(tr)
    local num=reaper.CountTrackMediaItems(tr)
    if num==0 then
        msg('该轨道上没有媒体块')
        return
    end

    local target  --保存目标item
    for i=0, num-1 do
    	local it=reaper.GetTrackMediaItem(tr, i)  --依次获取媒体块
    	local itpos=reaper.GetMediaItemInfo_Value(it, 'D_POSITION')    --获取媒体块的横坐标位置
    	local itlen=reaper.GetMediaItemInfo_Value(it, 'D_LENGTH')      --获取媒体块长度
	
    	if cur<=itpos+itlen then --获取在光标时间后最近的媒体块(含重合)
            target=it
            break
        end
    end

    itgroup=reaper.GetMediaItemInfo_Value(target, 'I_GROUPID') --获取该媒体块的分组
    msg(itgroup)
end

呃,你指的是哪些基本错误?

应该说是一些不好的习惯。你在一个函数里,特别是一个循环里用了很多全局变量,这样写很容易出问题,特别是你的变量名是it这样简单的命名。所以我为什么在开始循环之前先定义一个叫target的局部变量,为了把循环中获取到的目标item保存下来,同时让循环时用到的变量都改成局部变量,达到用完即弃的效果。大部分情况下函数和循环里用到的变量都应该是独立的,不影响外部的

明白,的确有些不太好的习惯,也是刚接触Lua不太久,多谢指教

怎么知道局部变量的范围?我一直对这个不太了解,我也很少定义局部变量,对于一些大型运算,速度会有明显提升吗?

局部变量只会在他被声明开始的那一个范围内生效,在if里声明,if结束后消失,在循环里声明,循环结束后消失,在一个函数里声明,函数结束时消失。对性能没有影响,但全用全局变量的话有被意外覆盖掉数值的危险,一般无脑local就对了