NEED HELP!! In Extending Event Script. SPECIAL CASE

iEmby wrote on 12/4/2024, 11:16 AM

@jetdv

Hi sir..

need your help ...

look at this clip how my script is working and where is error..

sorry for my English

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

public class EntryPoint
{
    public void FromVegas(Vegas vegas)
    {
        PNGSetting(vegas);
    }

    private void PNGSetting(Vegas vegas)
    {
        try
        {
            // Ensure there are at least one marker
            int markerCount = vegas.Project.Markers.Count;

            if (markerCount < 1)
            {
                MessageBox.Show("At least one marker is required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // Get the positions of the first and second markers if they exist
            Timecode firstMarkerPosition = vegas.Project.Markers[0].Position;
            Timecode secondMarkerPosition = markerCount > 1 ? vegas.Project.Markers[1].Position : Timecode.FromSeconds(0);

            // Process events before the first marker
            DeselectEvents(vegas);
            SelectEventsInRange(vegas, Timecode.FromSeconds(0), firstMarkerPosition);
            SetEventsLength(vegas);

            if (markerCount > 1)
            {
                // Process events between the first and second markers
                DeselectEvents(vegas);
                SelectEventsInRange(vegas, firstMarkerPosition, secondMarkerPosition);
                SetEventsLength(vegas);

                // Process events after the second marker
                DeselectEvents(vegas);
                SelectEventsInRange(vegas, secondMarkerPosition, null);
                SetEventsLength(vegas);
            }
            else
            {
                // Process events after the first marker only if there is only one marker
                DeselectEvents(vegas);
                SelectEventsInRange(vegas, firstMarkerPosition, null);
                SetEventsLength(vegas);
            }

            // Final cleanup
            DeselectEvents(vegas);
            vegas.UpdateUI();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void DeselectEvents(Vegas vegas)
    {
        foreach (Track track in vegas.Project.Tracks)
        {
            foreach (TrackEvent trackEvent in track.Events)
            {
                trackEvent.Selected = false;
            }
        }
    }

    private void SelectEventsInRange(Vegas vegas, Timecode start, Timecode end)
    {
        foreach (Track track in vegas.Project.Tracks)
        {
            foreach (TrackEvent trackEvent in track.Events)
            {
                // Check if the event is within the range
                bool inRange =
                    (start == null || trackEvent.Start >= start) &&
                    (end == null || trackEvent.Start < end);

                trackEvent.Selected = inRange;
            }
        }
    }

    private void SetEventsLength(Vegas vegas)
    {
        try
        {
            var selectedEventsByTrack = GetSelectedEventsByTrack(vegas);

            if (selectedEventsByTrack.Count == 0)
                return;

            var result = GetHighestTrackAndTotalLength(selectedEventsByTrack);
            Track highestTrack = result.Key;
            Timecode totalHighestEventLength = result.Value;

            if (highestTrack == null)
                return;

            AdjustEventLengths(selectedEventsByTrack, highestTrack, totalHighestEventLength);
            AdjustRegionEnd(vegas);

            vegas.UpdateUI();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private Dictionary<Track, List<TrackEvent>> GetSelectedEventsByTrack(Vegas vegas)
    {
        var selectedEventsByTrack = new Dictionary<Track, List<TrackEvent>>();

        foreach (Track track in vegas.Project.Tracks)
        {
            foreach (TrackEvent trackEvent in track.Events)
            {
                if (trackEvent.Selected)
                {
                    if (!selectedEventsByTrack.ContainsKey(track))
                    {
                        selectedEventsByTrack[track] = new List<TrackEvent>();
                    }
                    selectedEventsByTrack[track].Add(trackEvent);
                }
            }
        }

        return selectedEventsByTrack;
    }

    private KeyValuePair<Track, Timecode> GetHighestTrackAndTotalLength(Dictionary<Track, List<TrackEvent>> selectedEventsByTrack)
    {
        Track highestTrack = null;
        Timecode totalHighestEventLength = Timecode.FromSeconds(0);

        foreach (var kvp in selectedEventsByTrack)
        {
            Track track = kvp.Key;

            // Identify the highest track based on index
            if (highestTrack == null || track.Index > highestTrack.Index)
            {
                highestTrack = track;
                totalHighestEventLength = Timecode.FromSeconds(0);

                // Calculate the total length of selected events for this track
                foreach (TrackEvent ev in kvp.Value)
                {
                    totalHighestEventLength += ev.Length;
                }
            }
        }

        return new KeyValuePair<Track, Timecode>(highestTrack, totalHighestEventLength);
    }

    private void AdjustEventLengths(Dictionary<Track, List<TrackEvent>> selectedEventsByTrack, Track highestTrack, Timecode totalHighestEventLength)
    {
        foreach (var kvp in selectedEventsByTrack)
        {
            Track track = kvp.Key;
            if (track == highestTrack) continue;

            Timecode totalPreviousLength = Timecode.FromSeconds(0);
            TrackEvent lastSelectedEvent = null;

            foreach (TrackEvent ev in kvp.Value)
            {
                if (lastSelectedEvent == null || ev.Start > lastSelectedEvent.Start)
                {
                    if (lastSelectedEvent != null)
                    {
                        totalPreviousLength += lastSelectedEvent.Length;
                    }
                    lastSelectedEvent = ev;
                }
                else
                {
                    totalPreviousLength += ev.Length;
                }
            }

            if (lastSelectedEvent != null)
            {
                Timecode newLength = totalHighestEventLength - totalPreviousLength;

                if (newLength > Timecode.FromSeconds(0))
                {
                    lastSelectedEvent.Length = newLength;
                }
            }
        }
    }

    private void AdjustRegionEnd(Vegas vegas)
    {
        var latestSelectedEvents = GetLastSelectedEvents(vegas);

        if (latestSelectedEvents.Count == 0) return;

        Timecode furthestEndTime = GetFurthestEndTime(latestSelectedEvents.Values);
        UpdateRegionEnd(vegas, furthestEndTime);
    }

    private Dictionary<Track, TrackEvent> GetLastSelectedEvents(Vegas vegas)
    {
        var lastSelectedEvents = new Dictionary<Track, TrackEvent>();

        foreach (Track track in vegas.Project.Tracks)
        {
            TrackEvent lastSelectedEvent = null;

            foreach (TrackEvent trackEvent in track.Events)
            {
                if (trackEvent.Selected)
                {
                    lastSelectedEvent = trackEvent;
                }
            }

            if (lastSelectedEvent != null)
            {
                lastSelectedEvents[track] = lastSelectedEvent;
            }
        }

        return lastSelectedEvents;
    }

    private Timecode GetFurthestEndTime(IEnumerable<TrackEvent> events)
    {
        Timecode furthestEndTime = Timecode.FromSeconds(0);

        foreach (TrackEvent trackEvent in events)
        {
            Timecode endTime = trackEvent.Start + trackEvent.Length;
            if (endTime > furthestEndTime)
            {
                furthestEndTime = endTime;
            }
        }

        return furthestEndTime;
    }

    private void UpdateRegionEnd(Vegas vegas, Timecode furthestEndTime)
    {
        Region latestRegion = null;

        foreach (Region region in vegas.Project.Regions)
        {
            if (region.Position < furthestEndTime)
            {
                if (latestRegion == null || region.Position > latestRegion.Position)
                {
                    latestRegion = region;
                }
            }
        }

        if (latestRegion != null)
        {
            latestRegion.Length = furthestEndTime - latestRegion.Position;
        }
    }
}

 

 

PROCESSOR
     

Operating System: Windows 11 Pro 64-bit (Always Updated)
System Manufacturer: ASUS
12th Gen Intel(R) Core(TM) i7-12700 (20 CPUs), ~2.1GHz - 4.90GHz
Memory: 32GB RAM
Page File: 11134MB used, 7934MB Available
DirectX Version: DirectX 12

-----------------------------------------------

MOTHERBOARD

 

ASUS PRIME H610-CS D4
Intel® H610 (LGA 1700)
Ready for 12th Gen Intel® Processors
Micro-ATX Motherboard with DDR4
Realtek 1 Gb Ethernet
PCH Heatsink
PCIe 4.0 | M.2 slot (32Gbps) 
HDMI® | D-Sub | USB 3.2 Gen 1 ports
SATA 6 Gbps | COM header
LPT header | TPM header
Luminous Anti-Moisture Coating
5X Protection III
(Multiple Hardware Safeguards
For all-round protection)

-----------------------------------------------
EXTERNAL GRAPHIC CARD

-----------------------------------------------

INTERNAL GRAPHIC CARD (iGPU)

------------------------------------------------

LED - MONITOR

Monitor Name: Generic PnP Monitor
Monitor Model: HP 22es
Monitor Id: HWP331B
Native Mode: 1920 x 1080(p) (60.000Hz)
Output Type: HDMI

-----------------------------------------------

STORAGE DRIVE

Drive: C:
Free Space: 182.3 GB
Total Space: 253.9 GB
File System: NTFS
Model: WD Blue SN570 1TB (NVMe)

---------------O----------------

My System Info (PDF File).

https://drive.google.com/open?id=1-eoLmuXzshTRH_8RunAYAuNocKpiLoiV&usp=drive_fs

 

Also Check

Some useful creations by me including VEGAS Scripts

https://getopensofts.blogspot.com/

 

My YouTube Channel Dedicated to Only VEGAS Pro Tutorials

EDITROOM : My YouTube Channel (For VEGAS Tutorials)

Comments

jetdv wrote on 12/4/2024, 1:53 PM

The problem is that the short overlapping event starts AFTER the longer event you want to change. Therefore *IT* is the one that will be selected as LAST.

You need to check to see if the previous event lasts longer than the end of the that new event. But, basically, you're not choosing the "last event ending in this range" event, you're choosing the "last event started in this range" event. So it's going to adjust the red one instead as it's the "last started" rather than the yellow one it's on top of which is the "last ending".