Issues with a script that Swap Events.

Thiago_Sase wrote on 9/14/2024, 8:30 PM

@jetdv 

Hello Sir. Please, if possible, could you help me find a solution for this issue?

This Swap Events script handles 4 scenarios cases;

1º Scenario = Swap 1 to 1
2º Scenario = Swap 1 to N
3º Scenario = Swap N to 1
4º Scenario = Swap N to N

All those Scenarios are working perfect.

Then, after the Swap is done, a deleted message box is prompt with Yes and No options. Yes to delete the event or events swapped, and No to not delete the event or events swapped.

1º Scenario = Swap 1 to 1 - The delete logic works.
2º Scenario = Swap 1 to N - The delete logic works.
3º Scenario = Swap N to 1 - The delete logic DOES NOT Work properly. Only when I press the "NO" option works, but if I press "YES" does not work, and it is Here that rises my issue.
4º Scenario = Swap N to N - The delete logic works.


How I do the delete logic works properly for the 3º Scenario = Swap N to 1?

 

using ScriptPortal.Vegas;
using System.Collections.Generic;
using System.Windows.Forms;

public class EntryPoint
{
    public void FromVegas(Vegas vegas)
    {
        List<TrackEvent> selectedEvents = new List<TrackEvent>();
        List<TrackEvent> eventsToDelete = new List<TrackEvent>(); // List to track multiple events to delete
        TrackEvent eventToDelete = null; // Keep original logic for single event deletion
        bool swapDone = false;
        bool isOneToManySwap = false; // Flag for 1-to-N swap
        bool isManyToOneSwap = false; // Flag for N-to-1 swap

        // Collect selected events
        foreach (Track track in vegas.Project.Tracks)
        {
            foreach (TrackEvent trackEvent in track.Events)
            {
                if (trackEvent.Selected && (trackEvent.IsVideo() || trackEvent.IsAudio()))
                {
                    selectedEvents.Add(trackEvent);
                }
            }
        }

        // Handle the 1-to-1 swap case
        if (selectedEvents.Count == 2)
        {
            TrackEvent event1 = selectedEvents[0];
            TrackEvent event2 = selectedEvents[1];

            // Ensure the selected events are on different tracks
            if (event1.Track == event2.Track)
            {
                MessageBox.Show("Selected events must be on different tracks.");
                return;
            }

            // Swap tracks of the two selected events
            Track tempTrack = event1.Track;
            event1.Track = event2.Track;
            event2.Track = tempTrack;

            swapDone = true;
            eventToDelete = event2; // Maintain the original single event deletion logic
        }
        else if (selectedEvents.Count < 2 || selectedEvents.Count > 1000) // Ensure between 2 and 1000 selected events
        {
            MessageBox.Show("Please select between 2 to 1000 video or audio events.");
            return;
        }

        // Handle the 1-to-N swap case (Scenario 2)
        if (selectedEvents.Count <= 101) // Up to 1-to-100 events
        {
            TrackEvent singleEvent = null;
            List<TrackEvent> multipleEvents = new List<TrackEvent>();
            Dictionary<Track, int> trackCounts = new Dictionary<Track, int>();

            // Count the number of events per track
            foreach (TrackEvent evt in selectedEvents)
            {
                if (!trackCounts.ContainsKey(evt.Track))
                    trackCounts[evt.Track] = 0;

                trackCounts[evt.Track]++;
            }

            // Find the single event and multiple events based on track counts
            foreach (TrackEvent evt in selectedEvents)
            {
                if (trackCounts[evt.Track] == 1 && singleEvent == null)
                {
                    singleEvent = evt; // Identify the single event
                }
                else
                {
                    multipleEvents.Add(evt); // Identify the multiple events
                }
            }

            // Check if we are in a valid "1-to-N" swap case
            if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100)
            {
                // Perform the "1-to-N" swap
                Track swapTargetTrack = multipleEvents[0].Track; // Track where multiple events are located
                Track swapSourceTrack = singleEvent.Track; // Track where the single event is located

                foreach (TrackEvent multiEvent in multipleEvents)
                {
                    multiEvent.Track = swapSourceTrack; // Move multiple events to the single event's track
                }

                singleEvent.Track = swapTargetTrack; // Move the single event to the target track

                swapDone = true;
                isOneToManySwap = true; // Set flag to indicate 1-to-N swap occurred
                eventsToDelete.AddRange(multipleEvents); // Add the multiple events to the delete list
            }
        }

        // Handle the N-to-1 swap case (Scenario 3)
        else if (selectedEvents.Count > 1 && selectedEvents.Count <= 101) // N-to-1 case
        {
            TrackEvent singleEvent = null;
            List<TrackEvent> multipleEvents = new List<TrackEvent>();
            Dictionary<Track, int> trackCounts = new Dictionary<Track, int>();

            // Count the number of events per track
            foreach (TrackEvent evt in selectedEvents)
            {
                if (!trackCounts.ContainsKey(evt.Track))
                    trackCounts[evt.Track] = 0;

                trackCounts[evt.Track]++;
            }

            // Find the single event and multiple events based on track counts
            foreach (TrackEvent evt in selectedEvents)
            {
                if (trackCounts[evt.Track] == 1 && singleEvent == null)
                {
                    singleEvent = evt; // Identify the single event
                }
                else
                {
                    multipleEvents.Add(evt); // Identify the multiple events
                }
            }

            // Check if we are in a valid "N-to-1" swap case
            if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100)
            {
                // Perform the "N-to-1" swap
                Track swapTargetTrack = singleEvent.Track; // Track where the single event is located
                Track swapSourceTrack = multipleEvents[0].Track; // Track where the multiple events are located

                foreach (TrackEvent multiEvent in multipleEvents)
                {
                    multiEvent.Track = swapTargetTrack; // Move multiple events to the single event's track
                }

                singleEvent.Track = swapSourceTrack; // Move the single event to the target track

                swapDone = true;
                isManyToOneSwap = true; // Set flag to indicate N-to-1 swap occurred
                eventToDelete = singleEvent; // Add the single event to delete list
            }
        }

        // Handle the n-to-n toggle case (Scenario 1)
        if (selectedEvents.Count % 2 == 0 && selectedEvents.Count <= 1000)
        {
            int halfCount = selectedEvents.Count / 2;
            Track trackGroup1 = selectedEvents[0].Track;
            Track trackGroup2 = selectedEvents[halfCount].Track;

            // Validate both groups
            bool validGroups = true;
            for (int i = 0; i < halfCount; i++)
            {
                if (selectedEvents[i].Track != trackGroup1 || selectedEvents[i + halfCount].Track != trackGroup2)
                {
                    validGroups = false;
                    break;
                }
            }

            if (validGroups && trackGroup1 != trackGroup2)
            {
                // Perform the swap for n-to-n toggle
                for (int i = 0; i < halfCount; i++)
                {
                    Track tempTrack = selectedEvents[i].Track;
                    selectedEvents[i].Track = selectedEvents[i + halfCount].Track;
                    selectedEvents[i + halfCount].Track = tempTrack;
                }

                swapDone = true;
                eventsToDelete.AddRange(selectedEvents.GetRange(halfCount, halfCount)); // Add the second group to delete list
            }
        }

        // If a swap was done, ask for event deletion confirmation
        if (swapDone)
        {
            DialogResult result = MessageBox.Show("Do you want to delete the swapped event(s)?", "Confirmation", MessageBoxButtons.YesNo);
            if (result == DialogResult.Yes)
            {
                if (isOneToManySwap)
                {
                    // In a 1-to-N swap, we delete the multiple events only
                    foreach (TrackEvent evtToDelete in eventsToDelete)
                    {
                        if (IsValidEvent(evtToDelete))
                        {
                            DeleteEvent(vegas, evtToDelete);
                        }
                    }
                }
                else if (isManyToOneSwap)
                {
                    // In an N-to-1 swap, we delete the single event only
                    if (IsValidEvent(eventToDelete))
                    {
                        DeleteEvent(vegas, eventToDelete);
                    }
                }
                else if (eventsToDelete.Count > 0)
                {
                    // Validate and delete multiple events in n-to-n and other scenarios
                    foreach (TrackEvent evtToDelete in eventsToDelete)
                    {
                        if (IsValidEvent(evtToDelete))
                        {
                            DeleteEvent(vegas, evtToDelete);
                        }
                    }
                }
            }
        }
    }

    private bool IsValidEvent(TrackEvent evt)
    {
        try
        {
            // Attempt to access the Track property to verify the event is still valid
            return evt.Track != null;
        }
        catch
        {
            return false;
        }
    }

    private void DeleteEvent(Vegas vegas, TrackEvent eventToDelete)
    {
        if (eventToDelete != null && eventToDelete.Track != null)
        {
            eventToDelete.Track.Events.Remove(eventToDelete);
        }
    }
}

 

Comments

jetdv wrote on 9/15/2024, 7:51 AM

Drop some message boxes in there to:

  1. Follow the path of the process and make sure it's not actually going through some routines you don't think it's going through
  2. See the value of any variables that could affect which routine it's going through.

For Example:
 

using ScriptPortal.Vegas;
using System.Collections.Generic;
using System.Windows.Forms;

public class EntryPoint
{
    public void FromVegas(Vegas vegas)
    {
        List<TrackEvent> selectedEvents = new List<TrackEvent>();
        List<TrackEvent> eventsToDelete = new List<TrackEvent>(); // List to track multiple events to delete
        TrackEvent eventToDelete = null; // Keep original logic for single event deletion
        bool swapDone = false;
        bool isOneToManySwap = false; // Flag for 1-to-N swap
        bool isManyToOneSwap = false; // Flag for N-to-1 swap

        // Collect selected events
        foreach (Track track in vegas.Project.Tracks)
        {
            foreach (TrackEvent trackEvent in track.Events)
            {
                if (trackEvent.Selected && (trackEvent.IsVideo() || trackEvent.IsAudio()))
                {
                    selectedEvents.Add(trackEvent);
                }
            }
        }

        // Handle the 1-to-1 swap case
        if (selectedEvents.Count == 2)
        {
            MessageBox.Show("Inside Handle 1-1");

            TrackEvent event1 = selectedEvents[0];
            TrackEvent event2 = selectedEvents[1];

            // Ensure the selected events are on different tracks
            if (event1.Track == event2.Track)
            {
                MessageBox.Show("Selected events must be on different tracks.");
                return;
            }

            // Swap tracks of the two selected events
            Track tempTrack = event1.Track;
            event1.Track = event2.Track;
            event2.Track = tempTrack;

            swapDone = true;
            eventToDelete = event2; // Maintain the original single event deletion logic
        }
        else if (selectedEvents.Count < 2 || selectedEvents.Count > 1000) // Ensure between 2 and 1000 selected events
        {
            MessageBox.Show("Please select between 2 to 1000 video or audio events.");
            return;
        }

        // Handle the 1-to-N swap case (Scenario 2)
        if (selectedEvents.Count <= 101) // Up to 1-to-100 events
        {
            MessageBox.Show("Inside Handle 1-N");

            TrackEvent singleEvent = null;
            List<TrackEvent> multipleEvents = new List<TrackEvent>();
            Dictionary<Track, int> trackCounts = new Dictionary<Track, int>();

            // Count the number of events per track
            foreach (TrackEvent evt in selectedEvents)
            {
                if (!trackCounts.ContainsKey(evt.Track))
                    trackCounts[evt.Track] = 0;

                trackCounts[evt.Track]++;
            }

            // Find the single event and multiple events based on track counts
            foreach (TrackEvent evt in selectedEvents)
            {
                if (trackCounts[evt.Track] == 1 && singleEvent == null)
                {
                    singleEvent = evt; // Identify the single event
                }
                else
                {
                    multipleEvents.Add(evt); // Identify the multiple events
                }
            }

            // Check if we are in a valid "1-to-N" swap case
            if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100)
            {
                MessageBox.Show("Perform 1-N Swap");

                // Perform the "1-to-N" swap
                Track swapTargetTrack = multipleEvents[0].Track; // Track where multiple events are located
                Track swapSourceTrack = singleEvent.Track; // Track where the single event is located

                foreach (TrackEvent multiEvent in multipleEvents)
                {
                    multiEvent.Track = swapSourceTrack; // Move multiple events to the single event's track
                }

                singleEvent.Track = swapTargetTrack; // Move the single event to the target track

                swapDone = true;
                isOneToManySwap = true; // Set flag to indicate 1-to-N swap occurred
                eventsToDelete.AddRange(multipleEvents); // Add the multiple events to the delete list
            }
        }

        // Handle the N-to-1 swap case (Scenario 3)
        else if (selectedEvents.Count > 1 && selectedEvents.Count <= 101) // N-to-1 case
        {
            MessageBox.Show("Inside Handle N-1");

            TrackEvent singleEvent = null;
            List<TrackEvent> multipleEvents = new List<TrackEvent>();
            Dictionary<Track, int> trackCounts = new Dictionary<Track, int>();

            // Count the number of events per track
            foreach (TrackEvent evt in selectedEvents)
            {
                if (!trackCounts.ContainsKey(evt.Track))
                    trackCounts[evt.Track] = 0;

                trackCounts[evt.Track]++;
            }

            // Find the single event and multiple events based on track counts
            foreach (TrackEvent evt in selectedEvents)
            {
                if (trackCounts[evt.Track] == 1 && singleEvent == null)
                {
                    singleEvent = evt; // Identify the single event
                }
                else
                {
                    multipleEvents.Add(evt); // Identify the multiple events
                }
            }

            // Check if we are in a valid "N-to-1" swap case
            if (singleEvent != null && multipleEvents.Count >= 1 && multipleEvents.Count <= 100)
            {
                MessageBox.Show("Perform N-1 Swap");

                // Perform the "N-to-1" swap
                Track swapTargetTrack = singleEvent.Track; // Track where the single event is located
                Track swapSourceTrack = multipleEvents[0].Track; // Track where the multiple events are located

                foreach (TrackEvent multiEvent in multipleEvents)
                {
                    multiEvent.Track = swapTargetTrack; // Move multiple events to the single event's track
                }

                singleEvent.Track = swapSourceTrack; // Move the single event to the target track

                swapDone = true;
                isManyToOneSwap = true; // Set flag to indicate N-to-1 swap occurred
                eventToDelete = singleEvent; // Add the single event to delete list
            }
        }

        // Handle the n-to-n toggle case (Scenario 1)
        if (selectedEvents.Count % 2 == 0 && selectedEvents.Count <= 1000)
        {
            MessageBox.Show("Inside Handle N-N");

            int halfCount = selectedEvents.Count / 2;
            Track trackGroup1 = selectedEvents[0].Track;
            Track trackGroup2 = selectedEvents[halfCount].Track;

            // Validate both groups
            bool validGroups = true;
            for (int i = 0; i < halfCount; i++)
            {
                if (selectedEvents[i].Track != trackGroup1 || selectedEvents[i + halfCount].Track != trackGroup2)
                {
                    validGroups = false;
                    break;
                }
            }

            if (validGroups && trackGroup1 != trackGroup2)
            {
                MessageBox.Show("Perform N-N Swap");

                // Perform the swap for n-to-n toggle
                for (int i = 0; i < halfCount; i++)
                {
                    Track tempTrack = selectedEvents[i].Track;
                    selectedEvents[i].Track = selectedEvents[i + halfCount].Track;
                    selectedEvents[i + halfCount].Track = tempTrack;
                }

                swapDone = true;
                eventsToDelete.AddRange(selectedEvents.GetRange(halfCount, halfCount)); // Add the second group to delete list
            }
        }

        // If a swap was done, ask for event deletion confirmation
        if (swapDone)
        {
            DialogResult result = MessageBox.Show("Do you want to delete the swapped event(s)?", "Confirmation", MessageBoxButtons.YesNo);
            if (result == DialogResult.Yes)
            {
                MessageBox.Show("isOneToManySwap = " + isOneToManySwap + "   isManyToOneSwap = " + isManyToOneSwap);

                if (isOneToManySwap)
                {
                    // In a 1-to-N swap, we delete the multiple events only
                    foreach (TrackEvent evtToDelete in eventsToDelete)
                    {
                        if (IsValidEvent(evtToDelete))
                        {
                            DeleteEvent(vegas, evtToDelete);
                        }
                    }
                }
                else if (isManyToOneSwap)
                {
                    // In an N-to-1 swap, we delete the single event only
                    if (IsValidEvent(eventToDelete))
                    {
                        DeleteEvent(vegas, eventToDelete);
                    }
                }
                else if (eventsToDelete.Count > 0)
                {
                    // Validate and delete multiple events in n-to-n and other scenarios
                    foreach (TrackEvent evtToDelete in eventsToDelete)
                    {
                        if (IsValidEvent(evtToDelete))
                        {
                            DeleteEvent(vegas, evtToDelete);
                        }
                    }
                }
            }
        }
    }

    private bool IsValidEvent(TrackEvent evt)
    {
        try
        {
            // Attempt to access the Track property to verify the event is still valid
            return evt.Track != null;
        }
        catch
        {
            return false;
        }
    }

    private void DeleteEvent(Vegas vegas, TrackEvent eventToDelete)
    {
        if (eventToDelete != null && eventToDelete.Track != null)
        {
            eventToDelete.Track.Events.Remove(eventToDelete);
        }
    }
}

 

Thiago_Sase wrote on 9/15/2024, 10:23 AM

@jetdv Thank you, Sir, for the instructions. I dropped the Debug method with the message boxes.
I'm trying to find a solution for the Delete Logic of the N to 1 scenario. I found some solutions, but interfere with other methods. I need the others methods, scenarios, remain intact. 

Below, 2 images to explain better;

The other image below, I did the Debug;

 

 

 

jetdv wrote on 9/15/2024, 11:52 AM

So it looks like when you're doing the "N-1", it's actually doing the "1-N" code which "looks" correct until you're deleting the event(s).

Now you need to figure out what you need to do to differentiate between "N-1" and "1-N" as the current code apparently isn't working:

if (selectedEvents.Count <= 101) // Up to 1-to-100 events

That's picking up BOTH conditions so you need to change that so it only picks 1-N.

Thiago_Sase wrote on 9/15/2024, 1:40 PM

@jetdv Thank you, Sir, for the help. 

I could not find a solution without interfere with the others methods. So, I ended up creating a new script only to handle with the deletion of N to 1 scenario if I press the "Yes" option.