public void Operate(IList <MotionObjectInfo> selectedInfoList, IList <ProcParam <MotionProcEnv> > args, MotionDataSet dataSet, ProgressInformation progressInfo) { SingleSelectParameter mode = args[0] as SingleSelectParameter; NumberParameter limit2 = args[1] as NumberParameter; bool addMode = mode.Value == 1; int limit = (int)limit2.Value; progressInfo.Initialize(selectedInfoList.Count, "Interpolate"); foreach (var info in selectedInfoList) { // 欠落範囲の集合 RangeSet <int> missings = new RangeSet <int>(); bool exist = true; int begin = 0; // 最初のフレームからかけている部分,最後のかけている部分は無視 for (int i = 0; i < dataSet.FrameLength; i++) { if (dataSet.GetFrameByIndex(i)[info] == null) { if (exist) { begin = i; exist = false; } } else { if (!exist) { if (begin != 0) { missings.Add(new RangeSet <int> .Range(begin, i)); exist = true; } } } } // 別オブジェクトにするとき用に入力オブジェクトと出力オブジェクトを分ける MotionObjectInfo addInfo = info; if (addMode) { // 別オブジェクトにするオプション addInfo = new MotionObjectInfo(info.ObjectType, info); addInfo.Name = PathEx.GiveName("interpolate", info.Name); dataSet.AddObject(addInfo); } // 線形補間 foreach (var range in missings) { if (limit == 0 || range.End - range.Start <= limit) { int pre = range.Start - 1; int post = range.End; MotionFrame preFrame = dataSet.GetFrameByIndex(pre); MotionFrame postFrame = dataSet.GetFrameByIndex(post); MotionObject preObject = preFrame[info]; if (preObject != null) { for (int index = range.Start; index < range.End; index++) { float interpolater = (float)(index - pre) / (post - pre); MotionFrame frame = dataSet.GetFrameByIndex(index); frame[addInfo] = preObject.InterpolateLinear(postFrame[info], interpolater); } } } } progressInfo.CurrentValue++; } dataSet.DoFrameListChanged(); if (addMode) { dataSet.DoObjectInfoSetChanged(); } }
public void Operate(IList <MotionObjectInfo> selectedInfoList, IList <ProcParam <MotionProcEnv> > args, MotionDataSet dataSet, ProgressInformation progressInfo) { NumberParameter begin = args[0] as NumberParameter; NumberParameter end = args[1] as NumberParameter; dataSet.RemoveFrameAll((f, i) => f.Time < begin.Value || end.Value < f.Time); }
public void Operate(IList <MotionObjectInfo> selectedInfoList, IList <ProcParam <MotionProcEnv> > args, MotionDataSet dataSet, ProgressInformation progressInfo) { progressInfo.Initialize(dataSet.FrameLength, "Remove Object from Frames"); foreach (MotionFrame frame in dataSet.EnumerateFrame()) { progressInfo.CurrentValue++; foreach (MotionObjectInfo info in selectedInfoList) { frame.RemoveObject(info); } } foreach (MotionObjectInfo info in selectedInfoList) { dataSet.RemoveObject(info); } dataSet.DoObjectInfoSetChanged(); }