How do I Exchange NEW for OLD Markers?

Grazie wrote on 1/14/2009, 4:19 AM
Hi Gang!

1] Did a project in Vegas, used UliS to create DVD files including the markers SFL file. It works and I have 10 Makers/Chapters available in DVDA- Done!

. . time passes . ..

2] Same project, same final MPG, different name, still in Vegas but it now has 33 markers with 33 lumps of text.

I have used a script to extract just the NEW markers. How do I tell DVDA to swap over the NEW 33 markers for the OLD 10?

And yes I went to the Folder and changed the name of the newly generated NEW name file *.sfl file to mirror that of the original. Kept the old file and have proved it still is working with this by then re-renaming back.

All this comes about so that I DON'T have to re-render the MPEG and AC-3. No biggie if I have too, but it would be intelligent to use a facility that IS in place to do this and explore and learn something new - yeah?

TIA - as always!

Grazie

Comments

farss wrote on 1/14/2009, 4:29 AM
"How do I tell DVDA to swap over the NEW 33 markers for the OLD 10?"

There's a Load Markers icon above the DVDA T/L, is that not doing it for you?

Bob.
Grazie wrote on 1/14/2009, 5:10 AM
"There's a Load Markers icon above the DVDA T/L, is that not doing it for you?" There certainly was an Icon 12 hours ago. And no it isn't swapping.

Grazie
farss wrote on 1/14/2009, 5:38 AM
Following on from our conversation I opened a .sfl file in a text editor.
It does have the name of the .mpg file in it that it belongs to. Based on that renaming a .sfl file to match the .mpg file will achieve nothing if what you're renaming it to is not the same as what's inside the .sfl file.

If no one else comes up with an answer before hand I believe I can devise a work around in the AM.

Bob.
farss wrote on 1/14/2009, 5:54 AM
Sorry mate,
I just realised there's another problem.
The markers that you're trying to load into DVDA even if you can probably will not work too well. The markers need to align with "I" frames. If they don't when the user jumps to one they'll land at the nearest "I" frame which may or may not be a problem for you.
DVDA will flag the problem by putting little "i"s inside the markers' flags. You can the slide the markers around to the nearest "I" frame but that might not be where you want navigation to jump to.

In the end you maybe forced to encode the mpeg-2 file again for this reason, sorry.

Bob.
JohnnyRoy wrote on 1/14/2009, 6:28 AM
> Did a project in Vegas, used UliS to create DVD files including the markers SFL file.

Since you have Ultimate S Pro, go to the DVD tab use the DVD Architect Chapters function to create a new .sfl file from the existing project markers. Then go into DVD Architect and press the load markers button. If the file has the same name with the .sfl extension (i.e., my.mpg and my.mpg.sfl) DVD Architect will associate the file with the video and load the markers. There is no need to re-render.

~jr
johnmeyer wrote on 1/14/2009, 9:19 AM
I was corresponding offline with Grazie on this, and sent the script to him. I know what the problem is, but I have never found an easy way to get around it.

If you encode the MPEG-2 file outside of Vegas, or if you forget to include markers, or it you want to radically change the marker positions, etc., you will need to export markers from Vegas to DVDA. Fortunately, there is a script that does this and it will create a new SFL file. If you name that SFL file to the exact same name as the MPEG file (including the .mpg extension) and simply add a second extension of .sfl, you can use the Load Markers button in DVDA to load the markers. Yes, some markers will be off by a few frames because of the I-frame issue already brought up, but you can re-align those in about two minutes of work.

Thus, you can get new markers in ten seconds, instead of having to re-render the entire MPEG-2 file which can take HOURS.

Unfortunately, there are two problems with this otherwise pretty simple solution.

First, the script has a bunch of little bugs in it that have to do with what timecode is used, and the markers can often be too close together or too far apart. I troubleshot this enough to figure out the exact timecodes that should be used, but not enough to know when to use one timecode vs. the other. I included the alternate timecodes in the script I sent to Grazie.

That, however, is not his immediate problem.

The bigger issue is that DVD Architect often refuses to read the timecodes from the SFL file. This is the problem Grazie is having. I have never found a simple solution to this. I think it has to do with the fact that DVDA sometimes reads the markers directly from within the MPEG file. For markers, the SFL file is actually redundant, because the MPEG file contains those markers, something you can easily see if you put that MPEG file back into Vegas on the timeline. You'll see the embedded markers which you can then promote using a script.

My solutions in the past have been to put a dummy MPEG file into DVDA, then export the markers to a SFL file that matches the name of that file. These will import just fine. Then, I use DVD Architect's "replace" functionality to replace the dummy file with the MPEG file I actually want to use (i.e., the one that refuses to let the marker file load). The imported markers stay where they are when this replacement operation is done. I then use the "Save Markers" button on the DVDA timeline to create a new SFL file, one that matches the MPEG file that I really want to use.

So, in the end, it is a bug in DVDA, but one I never bothered to report because there are only a handful of people that have ever needed to use the load markers function, and even fewer where this bug has caused the load marker button to malfunction.

farss wrote on 1/14/2009, 12:18 PM
I use the Load Markers function very regularly. I have a boilerplate DVDA project that I may reuse 20 times. So long as I've loaded a new mpg file all works as it should when I click the Load Markers button.

Still having looked into the .sfl file last night the whole thing seems inordinately complex to my way of thinking. Why is this file not a simple EDL like text file that's human readable. Using such simple file structures makes all manner of user convenience possible.

Bob.
johnmeyer wrote on 1/14/2009, 12:51 PM
Why is this file not a simple EDL like text file that's human readable. Using such simple file structures makes all manner of user convenience possible.Good question. I don't see any need for a binary file for this simple process, and if it were a text file, we could do all sorts of things with DVDA chapter stops.

BTW, I mentioned in my last post about putting a "dummy" MPEG-2 file into DVDA and then loading the markers into that. I assume Grazie's next question would be, "where do I get a dummy MPEG file?" Well, I usually create it using Vegas. I put a blank media file on a track in Vegas. I set project properties to 320x240, but keep everything else at the default for whatever format I am trying to emulate (i.e., 25 fps for Grazie in PAL-land). I then render to MPEG-2, but before I start the render, I set the quality to Draft, set the quality slider all the way to the left, set the video to 320x240, the bitrate to 1,000,000 CBR, and the DC coefficient to 8-bit. On my soon-to-be retired 6-year-old computer, a two hour MPEG-2 dummy file takes 14:52 to create. I expect that this will take less than two minutes on my new PC.

Oh, I almost forgot. When I do this, I enable "Save Markers" so when I import this dummy file into DVDA, I get the markers without having to run the script (because I copy the markers into this project from the project I'm trying to emulate). I then simply replace this file with the one I really want to use.
farss wrote on 1/14/2009, 12:57 PM
Are you certain that Grazies problem is not that the .sfl file contains the name of the mpg file that it relates to?

The export markers script that I have writes the name of the mpg file into the .sfl file.

Bob.
johnmeyer wrote on 1/14/2009, 2:09 PM
Are you certain that Grazies problem is not that the .sfl file contains the name of the mpg file that it relates to?Only Grazie can answer that. However, I have definitely had the problem of the "Load Markers" button in DVDA not loading the markers from an SFL file created by the DVDA chapter from Vegas marker wil_mksfl.js script. When I use that, I create the file name by actually clicking on the MPEG file and then adding the SFL extension. Thus, I am 100% certain that the file name matches. Despite this, the "Load Markers" button often doesn't do anything. I have tried re-booting to clear any temporary registers and memory that might cause a problem, and even then, the button sometimes won't work, hence my elaborate workaround. Most of the time, everything works fine.

Update

I just spent a few minutes trying to re-create the problem and indeed succeeded in not only making it happen at will, but also finding a viable workaround. I rendered a one minute MPEG with a few embedded markers. I opened this in DVDA and the markers showed up just fine. I saved the DVDA project and then closed it. I then changed the location of the markers in Vegas and added a few more. I then ran the DVDA script in Vegas to export the new markers. I saved them to the existing SFL file, overwriting what was there before. I then re-opened the saved DVDA project and clicked on "Load Markers" icon.

Nothing happened.

I then close the project and then dragged the same file into DVDA and clicked on Load Markers. This time the new markers loaded just fine. I clicked on the Save Markers icon, and then re-opened the original project. This time I got my new markers.

So the workaround seems to be that if the Load Markers doesn't work within your original project, close that project and then in a clean, brand new project, put that MPEG file into the project and load, then save the markers. Don't save that project; just simply close it. Then, open your original project. This only takes a minute or so.

[Edit]I also think this problem may be an issue more often with really big MPEG files (> 4 GB).
Grazie wrote on 1/14/2009, 2:40 PM
Sorry Guys - been out all day and have come back to read all this great feedback. It is now 10:30pm in London and I WILL get to this in the morning.

I'll try Johnny's recom. and dig into JM's too.

What I think you all need to take on board is that I had produced the original MPEG, AC-3 and SFL from Myproj_1a.veg . This had 10 markers. I then saved this VEG as Mypropj_2a.veg and it was in THIS veg that I produced the new 33 marker set. And from here I used JM's script to deliver the NEW sfl file.

So, will making the NEW sfl file be recognised by the OLD existing DVDA project when I attempt to load the NEW 33 marker set?

Again, thank you all.

Grazie
farss wrote on 1/14/2009, 5:30 PM
I can get this to work in a small case test. There maybe other gremlins however.
Test 1:
I created Proj1.veg with gen media and 3 markers.
Rendered to mpeg-2 with markers and opened that in DVDA.

Test 2:
I opened Proj1.veg, Saved As Proj2.veg and added 2 extra markers. I then ran the Export Markers scrip. When it asks me for the name of the .sfl file I pointed it to the .sfl file I created out of Proj1.veg. It will warn me I am going to overwrite the file. I click OK.
Then in DVDA I open original project and then click the Load Markers icon and they load, complete with the extra two markers that are flagged as not being on "I" Frames.

Test 3:
I then opened Proj2.veg and added an extra marker and again exported using the script. Except this time I saved the file as Proj3.mpg.sfl. Exited Vegas and renamed the file to Proj1.mpg.sfl. I opened DVDA and when I click the Load Markers icon, poof, all markers are gone.

Following is the code for the script I used. This is not my work, I've had it for ages and I no longer know who wrote it.

Please note carefully the first comment labelled 1)
I believe this might hold the clue and it is confirmed in my tests as Test 2 works, Test 3 fails for this very reason.

If after taking all this in it still don't work then JM is right, there is still some other gremlin in the process however so far no one has specifically addressed this aspect of the problem.



/**

Objective:
==========

Script to generate *.sfl file from Vegas timeline markers, which can then be imported into
DVDA as chapter points.

Note:
=====
1) The sfl file **MUST** use the MPEG file as basename, eg. "myfile.mpg.sfl".
2) If string length (including null byte) is not word aligned, ie. odd bytes, then pad
with another null byte to make it even bytes.

History:
========
8/12/2003 WL v1.0. Creation.
9/12/2003 WL v1.1.
- Vegas don't write blank label. Script generated blank labels, but
was accepted by DVDA. Modified script not to write blank labels.
- Do not write LIST section if there are no labels.
- Do not create SFL file if there are no markers.
- Support for NTSC.
28/12/2003 WL v1.2.
- Modified to auto detect PAL or NTSC to set frame rate.
Only supports 25f/s and 29.97f/s.
1/1/2004 WL v1.3
- Modified to match ruler format with video format. Required for *.stl
and *.chp.
2/1/2004 WL v1.4
- Problem with some DVDA NTSC chapter points being 1 frame off near end of
tape, so used double for markerTC and round up to nearest integer, but
still no good. Work-around is to add 1 frame for each NTSC chapter points.
- Check for maxMarker.
- DVDA requires chapter length be >= 1 sec. Check when creating markers
in another script.
**/

//----------------------------------------------------------------------------------------
import System;
import System.Text;
import System.IO;
import System.Drawing;
import System.Windows.Forms;
import SonicFoundry.Vegas;

//----------------------------------------------------------------------------------------
//
// Constants
//
var NULLCH : byte = 0;
var maxMarker : int = 300;
var PALFrameTime : double = 1764; // 25 frames/sec
var NTSCFrameTime : double = 1471.47; // 30000.0/1001.0 = 29.97....

//----------------------------------------------------------------------------------------
//
// Global variables
//
var frameTime : double = PALFrameTime;
var formatMsg = "unknown";

//
// DVDA seemed to have problem with NTSC chapters points off by 1 frame near the end of tape.
// So adding 1 frame offset for NTSC chapter points. 0 for PAL.
//
var frameOffset : int = 0;

//
// Files
//
var desDir = "F:\\home\\dv\\apps\\sfoundry\\vegas\\sfl";
var srcMpgFname = "*.mpg";
var desExt = ".sfl";
var desFullFname = desDir + Path.DirectorySeparatorChar + srcMpgFname + desExt;

//----------------------------------------------------------------------------------------
function initVar() {
var frameRate = Vegas.Project.Video.FrameRate;

if ( frameRate == 25 ) {
frameTime = PALFrameTime;
frameOffset = 0;
formatMsg = "PAL, 25fps";
Vegas.Project.Ruler.Format = RulerFormat.SmpteEBU;
// MessageBox.Show(formatMsg);
}
else {
frameTime = NTSCFrameTime;
frameOffset = 1;
formatMsg = "NTSC, 29.97fps, TC=non-drop-frame";
Vegas.Project.Ruler.Format = RulerFormat.SmpteNonDrop;
// MessageBox.Show(formatMsg);
}
return null;
}

//----------------------------------------------------------------------------------------
// Button subclass that shows a save file dialog when clicked

class BrowseButton extends Button {
var myResultBox = null;

function BrowseButton(resultBox) {
myResultBox = resultBox;
}

protected override function OnClick(e : EventArgs) {
var saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVDA Chapter File (*.sfl)|*.sfl|All Files (*.*)|*.*";
saveFileDialog.DefaultExt = desExt;
saveFileDialog.CheckPathExists = true;
saveFileDialog.CheckFileExists = false;
//
// saveFileDialog.AddExtension is confused because file already has .mpg extension, so
// disabling this option.
//
saveFileDialog.AddExtension = false;
if (null != myResultBox) {
var filename = myResultBox.Text;
var initialDir = Path.GetDirectoryName(filename);
if (Directory.Exists(initialDir)) {
saveFileDialog.InitialDirectory = initialDir;
}
saveFileDialog.FileName = Path.GetFileName(filename);
}

if ( System.Windows.Forms.DialogResult.OK == saveFileDialog.ShowDialog() ) {
if ( null != myResultBox ) {
if ( Path.GetExtension(saveFileDialog.FileName) != desExt )
saveFileDialog.FileName += desExt;
myResultBox.Text = Path.GetFullPath(saveFileDialog.FileName);
}
}
}
}

//----------------------------------------------------------------------------------------
// Form subclass that is the dialog box for this script

class getFnameDialog extends Form {
var browseButton;
var fileNameBox;
var noticeBox;

function getFnameDialog(baseFileName) {

this.Text = "Create DVDA chapter file using timeline markers";
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
this.Width = 580;

var buttonWidth = 80;

fileNameBox = addTextControl("DVDA chapter file", 6, 480, 10, baseFileName);
noticeBox = addTextLabel("Caution: must use mpeg file as basename, eg. myfile.mpg.sfl\n", 6, fileNameBox.Bottom+5);

browseButton = new BrowseButton(fileNameBox);
browseButton.Left = fileNameBox.Right + 4;
browseButton.Top = fileNameBox.Top - 2;
browseButton.Width = buttonWidth;
browseButton.Height = browseButton.Font.Height + 12;
browseButton.Text = "Browse...";
Controls.Add(browseButton);

var buttonTop = noticeBox.Bottom + 16;

var okButton = new Button();
okButton.Text = "OK";
okButton.Left = this.Width - (2*(buttonWidth+10));
okButton.Top = buttonTop;
okButton.Width = buttonWidth;
okButton.Height = okButton.Font.Height + 12;
okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
AcceptButton = okButton;
Controls.Add(okButton);

var cancelButton = new Button();
cancelButton.Text = "Cancel";
cancelButton.Left = this.Width - (1*(buttonWidth+10));
cancelButton.Top = buttonTop;
cancelButton.Height = cancelButton.Font.Height + 12;
cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
CancelButton = cancelButton;
Controls.Add(cancelButton);

var titleHeight = this.Height - this.ClientSize.Height;
this.Height = titleHeight + okButton.Bottom + 8;
}

function addTextLabel(labelName, left, top) {
var label = new Label();

label.AutoSize = true;
label.Text = labelName;
label.Left = left;
label.Top = top + 4;
Controls.Add(label);
return label;
}

function addTextControl(labelName, left, width, top, defaultValue) {
var label = new Label();
label.AutoSize = true;
label.Text = labelName + ":";
label.Left = left;
label.Top = top + 4;
Controls.Add(label);

var textbox = new TextBox();
textbox.Multiline = false;
textbox.Left = label.Right;
textbox.Top = top;
textbox.Width = width - (label.Width);
textbox.Text = defaultValue;
Controls.Add(textbox);

return textbox;
}
}

//----------------------------------------------------------------------------------------
function openSFL(desDir, srcMpgFname) : FileStream {

if ( !Directory.Exists(desDir) ) {
// Directory.CreateDirectory(desDir);
throw "Directory does not exist:\n\n" + desDir;
}
var fs = File.Create(desFullFname);
return fs;
}

//----------------------------------------------------------------------------------------
function closeSFL(fs, binw) {

binw.Close();
fs.Close();
return null;
}

//----------------------------------------------------------------------------------------
function writeRIFF(binw, sectsize) {

binw.Write( "RIFF".ToCharArray() );
binw.Write( sectsize );
return null;
}

//----------------------------------------------------------------------------------------
function writeSFPL(binw, markerTC : double[], markerCnt) {

var zero : double = 0;
var tc : int;
var counter : int = 0;
var sectsize : int = (markerCnt * 24) + 4;

binw.Write( "SFPLcue ".ToCharArray() );
binw.Write( sectsize );
binw.Write( markerCnt );

for (var i : int = 0; i < markerCnt; i++) {
counter++;
tc = System.Convert.ToInt32(System.Math.Round(markerTC));
binw.Write( counter );
binw.Write( tc );
binw.Write( "data".ToCharArray() );
binw.Write( zero );
binw.Write( tc );
}
return sectsize;
}

//----------------------------------------------------------------------------------------
// Do not write blank labels.
// If all labels are blank, do not write this section.

function writeLIST(binw, markerLabel, markerCnt) {

var counter : int = 0;
var sectsize : int = 0;
var elemsize : int;

binw.Write( "LIST".ToCharArray() );
binw.Write( sectsize );

binw.Write( "adtl".ToCharArray() );
sectsize += 4;

for (var i : int = 0; i < markerCnt; i++) {
counter++;
if ( markerLabel.Length > 0 ) {
elemsize = markerLabel.Length + 4 + 1;
binw.Write( "labl".ToCharArray() );
binw.Write( elemsize );
binw.Write( counter );
binw.Write( markerLabel.ToCharArray() );
binw.Write( NULLCH );
sectsize = sectsize + 8 + elemsize;
if ( (elemsize % 2) > 0 ) {
binw.Write( NULLCH );
sectsize++;
}
}
}
return sectsize;
}

//----------------------------------------------------------------------------------------
function writeSFPI(binw, srcMpgFname) {

var sectsize : int = srcMpgFname.Length + 1;

binw.Write( "SFPI".ToCharArray() );
binw.Write( sectsize );
binw.Write( srcMpgFname.ToCharArray() );
binw.Write( NULLCH );
if ( (sectsize % 2) > 0 ) {
binw.Write( NULLCH );
sectsize++;
}
return sectsize
}

//----------------------------------------------------------------------------------------
function rewriteSize(binw, SFPLsize, LISTsize, SFPIsize) {

var RIFFsize : int = (12 + SFPLsize) + (8 + SFPIsize);

if ( LISTsize > 0 )
RIFFsize = RIFFsize + (8 + LISTsize);
binw.Seek(0, SeekOrigin.Begin);
binw.Seek(4,SeekOrigin.Current);
binw.Write( RIFFsize );

if ( LISTsize > 0 ) {
binw.Seek(12 + SFPLsize + 4, SeekOrigin.Current);
binw.Write( LISTsize );
}
return null;
}

//----------------------------------------------------------------------------------------
function makeSFL(mrkEnum) {

var markerCnt : int = 0;
var totMarker : int = 0;
// var markerTC = new Array();
var markerTC : double[] = new double[maxMarker];

var markerLabel = new Array();
var sumLabelSize = 0;
var RIFFsize : int = 0;
var SFPLsize : int = 0, LISTsize : int = 0, SFPIsize : int = 0;
var nowMarker;

while ( !mrkEnum.atEnd() ) {
totMarker++;
if ( markerCnt < maxMarker ) {
nowMarker = mrkEnum.item();
var nowMarkPos = Marker(nowMarker).Position;
if ( nowMarkPos.FrameCount == 0 ) {
//
// DVDA auto creates chapter at 00:00:00:00, and creates only one if overlapped.
//
markerTC[markerCnt] = nowMarkPos.FrameCount * frameTime;
}
else {
markerTC[markerCnt] = (nowMarkPos.FrameCount + frameOffset) * frameTime;
}
markerLabel[markerCnt] = Marker(nowMarker).Label;
sumLabelSize += markerLabel[markerCnt].Length;
markerCnt++;
mrkEnum.moveNext();
}
}

if ( markerCnt == 0 )
throw "Error: no markers defined on Vegas timeline";

var fs = openSFL(desDir, srcMpgFname);
var binw = new BinaryWriter(fs);

writeRIFF(binw, RIFFsize);
SFPLsize = writeSFPL(binw, markerTC, markerCnt);
if ( sumLabelSize > 0 )
LISTsize = writeLIST(binw, markerLabel, markerCnt);
SFPIsize = writeSFPI(binw, srcMpgFname);
rewriteSize(binw, SFPLsize, LISTsize, SFPIsize);

closeSFL(fs, binw);
return totMarker;
}

//----------------------------------------------------------------------------------------
function findSelectedTrack() : Track {
var trackEnum = new Enumerator(Vegas.Project.Tracks);

while (!trackEnum.atEnd()) {
var track : Track = Track(trackEnum.item());
if (track.Selected) {
return track;
}
trackEnum.moveNext();
}
return null;
}

//----------------------------------------------------------------------------------------
try {

var totMarker : int = 0;
var missMarker : int = 0;

initVar();

// Show the script's dialog box.
var dialog = new getFnameDialog(srcMpgFname + desExt);
var dialogResult = dialog.ShowDialog();

// if the OK button was pressed...
if ( System.Windows.Forms.DialogResult.OK == dialogResult ) {

//
// Also need to check extension here in case user bypassed browse button.
//
desFullFname = Path.GetFullPath(dialog.fileNameBox.Text);
if ( Path.GetExtension(desFullFname) != desExt )
desFullFname += desExt;
desDir = Path.GetDirectoryName(desFullFname);
srcMpgFname = Path.GetFileNameWithoutExtension(desFullFname);

// MessageBox.Show(desDir.ToString() + "\n" + srcMpgFname.ToString() + "\n" + desFullFname.ToString());

var track = findSelectedTrack();
if ( null == track )
throw "Error: no selected track";

var mrkEnum = new Enumerator(Vegas.Project.Markers);
totMarker = makeSFL(mrkEnum);
if ( totMarker > maxMarker ) {
missMarker = totMarker - maxMarker;
}

MessageBox.Show(
"Done." +
"\nFile: " + desFullFname +
"\n" +
"\nFormat: " + formatMsg +
"\nTotal markers: " + totMarker.ToString() +
"\nMissed markers: " + missMarker.ToString()
);
}

} catch (e) {
MessageBox.Show(e);
}



Bob.

MSK wrote on 1/14/2009, 9:41 PM
Could open file in trimmer, make changes to any markers, then save markers/regions in trimmer (save button on top of trimmer). Re-import clip into DVDA project.
Grazie wrote on 1/15/2009, 12:15 AM
I feel a complete wooze.

After reading and understanding "much" of what you all wrote above, I made a decision. I started over. I gave in - "White Flag" time.

I started over for 2 main reasons:

1] Confusion: I tried renaming and so on but after reading Bob's notes and JM's notes on this, I didn't try the script. Sorry. I got myself more confused with the renaming than I was already.

2] Extra Material: As I have worked with the client, and produced an additional intro Video AND as I was edging towards the 4.7gb limit, I decided in all fairness to my own sanity and need to expedite this, to re-encode.

So I guess I am not giving up, just that I have pressing needs to "move-on". I hope all of you will understand?

However, I do think/realise/know that there WILL be a need for a simple and User friendlier GUI to achieve what I have obviously unearthed as a bit of a Curate's egg. An easier option/ability to cross-swap Markers. When I say "easier" I really mean a more transparent option.

You have all been total diamonds! This is NOT the last "Grazie-Quest", so keep tuned for others as I stumble my way through the landscape peppered with "scripting" grails.

As I look now the render is 50% done and all, so far, is well with the World.

And yes, Johnny, I am using UltimateS Pro4 for doing this. At least I can rely on this amazing set of tools to keep me in check and stop me wandering away from the path of "project-closure".

Best regards

Grazie