hi sir how r you..
i need your help in this code..
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using ScriptPortal.Vegas;
public class EntryPoint
{
public void FromVegas(Vegas vegas)
{
// Open form for user input
string userInput = PromptForTimecodes(vegas);
if (string.IsNullOrEmpty(userInput))
{
MessageBox.Show("Operation cancelled or no input provided.");
return;
}
}
private string PromptForTimecodes(Vegas vegas)
{
using (Form form = new Form())
{
form.Text = "Enter Timecodes (e.g. HH:MM:SS - HH:MM:SS or HH:MM:SS to HH:MM:SS)";
form.StartPosition = FormStartPosition.CenterScreen;
form.Size = new System.Drawing.Size(400, 300);
TextBox textBox = new TextBox
{
Multiline = true,
Width = 360,
Height = 200,
ScrollBars = ScrollBars.Vertical
};
Button keepButton = new Button
{
Text = "Keep",
DialogResult = DialogResult.OK,
Location = new System.Drawing.Point(50, 220)
};
Button cutButton = new Button
{
Text = "Cut",
DialogResult = DialogResult.OK,
Location = new System.Drawing.Point(150, 220)
};
Button cancelButton = new Button
{
Text = "Cancel",
DialogResult = DialogResult.Cancel,
Location = new System.Drawing.Point(250, 220)
};
keepButton.Click += (sender, e) =>
{
if (string.IsNullOrWhiteSpace(textBox.Text))
{
MessageBox.Show("Please enter valid timecodes.");
}
else
{
ProcessUserSelection(vegas, textBox.Text, true);
form.Close();
}
};
cutButton.Click += (sender, e) =>
{
if (string.IsNullOrWhiteSpace(textBox.Text))
{
MessageBox.Show("Please enter valid timecodes.");
}
else
{
ProcessUserSelection(vegas, textBox.Text, false);
form.Close();
}
};
form.Controls.Add(textBox);
form.Controls.Add(keepButton);
form.Controls.Add(cutButton);
form.Controls.Add(cancelButton);
form.CancelButton = cancelButton;
// Show dialog and return user input or an empty string
return form.ShowDialog() == DialogResult.OK ? textBox.Text : string.Empty;
}
}
private void ProcessUserSelection(Vegas vegas, string userInput, bool keepOddEvents)
{
// Process each line of input
foreach (string line in userInput.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
{
ProcessLine(vegas, line.Trim());
}
// Run the conversion from regions to markers
RegionsToMarkers(vegas);
// Split events at markers
SplitAtMarkers(vegas);
// Remove markers and regions after processing
RemoveMarkers(vegas);
RemoveRegions(vegas);
// Select and delete either odd or even events
if (keepOddEvents)
{
SelectOddEvents(vegas);
}
else
{
SelectEvenEvents(vegas);
}
DeleteSelectedEvents(vegas);
}
void ProcessLine(Vegas vegas, string line)
{
try
{
// Split the line into start and end timecodes using '-' or 'to' as delimiters
string[] pieces = line.Split(new string[] { "-", "to" }, StringSplitOptions.RemoveEmptyEntries);
if (pieces.Length != 2)
{
MessageBox.Show("Line format is incorrect: " + line + "\nExpected format: HH:MM:SS - HH:MM:SS or HH:MM:SS to HH:MM:SS");
return;
}
// Normalize timecodes
string startCode = EnsureFourPairs(pieces[0].Trim());
string endCode = EnsureFourPairs(pieces[1].Trim());
// Check for empty string after ensuring proper format
if (string.IsNullOrEmpty(startCode) || string.IsNullOrEmpty(endCode))
{
MessageBox.Show("Invalid timecode format: " + line);
return;
}
// Convert to Timecode objects
Timecode regionStart = Timecode.FromString(startCode);
Timecode regionEnd = Timecode.FromString(endCode);
// Ensure end time is greater than start time
if (regionEnd < regionStart)
{
MessageBox.Show("End time must be greater than start time: " + line);
return;
}
// Create and add the region
ScriptPortal.Vegas.Region myRegion = new ScriptPortal.Vegas.Region(regionStart, regionEnd - regionStart);
vegas.Project.Regions.Add(myRegion);
}
catch (FormatException ex)
{
MessageBox.Show("Error processing line: " + line + " - " + ex.Message);
}
}
private void RegionsToMarkers(Vegas vegas)
{
try
{
// Iterate through all regions and convert both start and end marks into markers
foreach (ScriptPortal.Vegas.Region region in vegas.Project.Regions)
{
try
{
// Create markers for the start and end of the region
Marker startMarker = new Marker(region.Position, region.Label + " (Start)");
vegas.Project.Markers.Add(startMarker);
Marker endMarker = new Marker(region.Position + region.Length, region.Label + " (End)");
vegas.Project.Markers.Add(endMarker);
}
catch (Exception ex)
{
MessageBox.Show("Error while adding markers for region '" + region.Label + "': " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Continue with the next region even if there's an error with the current one
}
}
}
catch (Exception ex)
{
MessageBox.Show("An unexpected error occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SplitAtMarkers(Vegas vegas)
{
try
{
List<TrackEvent> selectedEvents = GetSelectedEvents(vegas);
int totalMarkers = vegas.Project.Markers.Count;
if (totalMarkers == 0)
{
MessageBox.Show("No markers found in the project.", "No Markers", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (selectedEvents == null || selectedEvents.Count == 0)
{
MessageBox.Show("No events selected.", "No Selection", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
foreach (Track track in vegas.Project.Tracks)
{
foreach (TrackEvent trackEvent in track.Events)
{
if (trackEvent.Selected)
{
Timecode eventStart = trackEvent.Start;
// Iterate over markers to split events
foreach (Marker marker in vegas.Project.Markers)
{
if (marker.Position >= trackEvent.Start && marker.Position <= trackEvent.End)
{
Timecode markerPosition = marker.Position;
// Calculate the offset relative to the event start
Timecode offset = markerPosition - eventStart;
// Split the event at the marker
trackEvent.Split(offset);
eventStart = markerPosition; // Update event start time
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("An error occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private List<TrackEvent> GetSelectedEvents(Vegas vegas)
{
List<TrackEvent> selectedEvents = new List<TrackEvent>();
try
{
foreach (Track track in vegas.Project.Tracks)
{
foreach (TrackEvent trackEvent in track.Events)
{
try
{
if (trackEvent.Selected)
{
selectedEvents.Add(trackEvent);
}
}
catch (Exception ex)
{
MessageBox.Show("Error processing TrackEvent: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error while retrieving selected events: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return selectedEvents;
}
private void RemoveMarkers(Vegas vegas)
{
try
{
vegas.Project.Markers.Clear();
}
catch (Exception ex)
{
MessageBox.Show("Error while removing markers: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void RemoveRegions(Vegas vegas)
{
try
{
vegas.Project.Regions.Clear();
}
catch (Exception ex)
{
MessageBox.Show("Error while removing regions: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SelectOddEvents(Vegas vegas)
{
foreach (Track track in vegas.Project.Tracks)
{
if (track.Selected)
{
int eventIndex = 0;
foreach (TrackEvent trackEvent in track.Events)
{
trackEvent.Selected = eventIndex % 2 == 0; // Keep odd events
eventIndex++;
}
}
}
}
private void SelectEvenEvents(Vegas vegas)
{
foreach (Track track in vegas.Project.Tracks)
{
if (track.Selected)
{
int eventIndex = 0;
foreach (TrackEvent trackEvent in track.Events)
{
trackEvent.Selected = eventIndex % 2 != 0; // Keep even events
eventIndex++;
}
}
}
}
private void DeleteSelectedEvents(Vegas vegas)
{
foreach (Track track in vegas.Project.Tracks)
{
List<TrackEvent> eventsToDelete = new List<TrackEvent>();
foreach (TrackEvent trackEvent in track.Events)
{
if (trackEvent.Selected)
{
eventsToDelete.Add(trackEvent);
}
}
foreach (TrackEvent eventToDelete in eventsToDelete)
{
track.Events.Remove(eventToDelete);
}
}
}
private string EnsureFourPairs(string timecode)
{
// Replace periods with colons to handle different separators
timecode = timecode.Replace('.', ':').Trim();
// Split the timecode by colons
string[] parts = timecode.Split(':');
switch (parts.Length)
{
case 1: // SS
return "00:00:" + parts[0].PadLeft(2, '0') + ":00"; // Format: 00:00:SS:00
case 2: // MM:SS
return "00:" + parts[0].PadLeft(2, '0') + ":" + parts[1].PadLeft(2, '0') + ":00"; // Format: 00:MM:SS:00
case 3: // HH:MM:SS
return parts[0].PadLeft(2, '0') + ":" + parts[1].PadLeft(2, '0') + ":" + parts[2].PadLeft(2, '0') + ":00"; // Format: HH:MM:SS:00
case 4: // HH:MM:SS:FF (Already valid format)
return parts[0].PadLeft(2, '0') + ":" + parts[1].PadLeft(2, '0') + ":" + parts[2].PadLeft(2, '0') + ":" + parts[3]; // Format: HH:MM:SS:FF
default:
MessageBox.Show("Invalid timecode format: " + timecode, "Error");
return string.Empty; // Returning empty string to avoid null reference warning
}
}
}
actually, it is working good for me.
but it is removing corresponding audio streams too if I select only video event and also after trim process it is also grouping all events, but I need them to stay in their original stream's groups.
please take a look at this clip for more understanding sir..
thanks in advance.. sir..