I don't know if I'm reinventing the wheel, but I just wrote a simple script that can be used to split layers of a .psd file in Vegas with one-click.
Here's my code:
using System;
using System.Windows.Forms;
using ScriptPortal.Vegas; // "ScriptPortal.Vegas" for Magix Vegas Pro 14 or above, "Sony.Vegas" for Sony Vegas Pro 13 or below
namespace Test_Script
{
public class Class
{
public Vegas myVegas;
public void Main(Vegas vegas)
{
myVegas = vegas;
myVegas.ResumePlaybackOnScriptExit = true;
Project project = myVegas.Project;
Tracks myTracks = project.Tracks;
bool ctrlMode = ((Control.ModifierKeys & Keys.Control) != 0) ? true : false;
for (int jj = myTracks.Count - 1; jj >= 0; jj--)
{
if (myTracks[jj].IsVideo())
{
foreach (VideoEvent vEvent in myTracks[jj].Events)
{
VideoTrack myTrack = (VideoTrack) myTracks[jj];
if (vEvent.Selected)
{
if (vEvent.ActiveTake == null || vEvent.ActiveTake.Media == null || vEvent.ActiveTake.MediaStream == null)
{
continue;
}
int vStreamCount = vEvent.ActiveTake.Media.StreamCount(MediaType.Video);
if (vStreamCount < 2)
{
continue;
}
// If you hold down Ctrl and click the script icon on the toolbar, the selected event will be converted to Stream 1 (in a programming sense, it's a video stream with Index 0).
if (ctrlMode)
{
Take newTake = Take.CreateInstance(project, vEvent.ActiveTake.Media.GetVideoStreamByIndex(0));
vEvent.Takes.Clear();
vEvent.Takes.Add(newTake);
}
int vStreamIndex = GetVideoStreamIndex(vEvent);
if (vStreamIndex == 0)
{
vEvent.Mute = true;
}
int vStreamCountAdd = Mod(vStreamIndex - 1, vStreamCount);
TrackEventGroup grp = vEvent.Group;
if (grp == null)
{
grp = new TrackEventGroup(project);
project.Groups.Add(grp);
grp.Add(vEvent);
}
for (int i = 0; i < vStreamCountAdd; i++)
{
int j = i + jj;
VideoTrack newTrack = null;
if (j < myTracks.Count - 1)
{
Track trackBelow = myTracks[j + 1];
if (trackBelow.IsVideo() && !((VideoTrack)trackBelow).IsCompositingParent && (vStreamIndex == 0 ? ((VideoTrack)trackBelow).CompositeNestingLevel == myTrack.CompositeNestingLevel + 1 : ((VideoTrack)trackBelow).CompositeNestingLevel == myTrack.CompositeNestingLevel))
{
newTrack = (VideoTrack)trackBelow;
}
}
if (newTrack == null)
{
newTrack = new VideoTrack(project, j + 1, null);
myTracks.Add(newTrack);
newTrack.CompositeNestingLevel = myTrack.CompositeNestingLevel;
if (vStreamIndex == 0)
{
newTrack.CompositeNestingLevel += 1;
}
}
foreach (VideoEvent evnt in newTrack.Events)
{
if (evnt.Start == vEvent.Start)
{
if (evnt.ActiveTake == null || evnt.ActiveTake.Media == null || evnt.ActiveTake.MediaStream == null || evnt.ActiveTake.Media == vEvent.ActiveTake.Media)
{
newTrack.Events.Remove(evnt);
}
}
}
VideoEvent newEvent = (VideoEvent) vEvent.Copy(newTrack, vEvent.Start);
Take newTake = Take.CreateInstance(project, vEvent.ActiveTake.Media.GetVideoStreamByIndex(vStreamCountAdd - i));
newEvent.Takes.Clear();
newEvent.Takes.Add(newTake);
newEvent.Selected = false;
newEvent.Mute = false;
grp.Add(newEvent);
}
}
}
}
}
}
public static int Mod(double a, double b)
{
int c = (int)(a - Math.Floor(a / b) * b);
return c;
}
public static int GetVideoStreamIndex(VideoEvent vEvent)
{
int i = -1;
foreach (MediaStream ms in vEvent.ActiveTake.Media.Streams)
{
if (ms.MediaType == MediaType.Video)
{
i++;
if (ms == vEvent.ActiveTake.MediaStream)
{
return i;
}
}
}
return 0;
}
}
}
public class EntryPoint
{
public void FromVegas(Vegas vegas)
{
Test_Script.Class test = new Test_Script.Class();
test.Main(vegas);
}
}
To distinguish it in toolbar, I also made an icon for the script:
If you have any suggestions, please feel free to give feedback.
