ReleaseNotes:Planimate 4.x Release Notes

From Planimate Knowledge Base
Jump to navigation Jump to search


  • recent list in file menu properly updated after a load


  • fixes a crash caused by appending a row to an empty table from the table view row menu

(The code was not properly testing if a broadcast should be sent )


  • The bugfix in n for the scroll BC was worse than the original bug so this release fixes the original problem in a different way


  • table scroll BCs no longer generate strange IFTableVoid errors
  • Fixed long standing redraw bug in icon selection (icon cache) if the icon being selected was the only instance of the icon in the model


New Track Options:

  • New track section type "Double (Other Road On Closure)"

Works like No Overtake except if a road is closed, then the train may used the other road if its available

  • Loop Option "No Following Trains" has been split up into "No Following Trains (Forward)" and "No Following Trains (Reverse)"

This enables a loop to act as a junction in one direction and a signal (allowing following trains) in the other.
WARNING: The models saved by this version require Planimate


if you are also testing the "Version 5" pre releases.


  • If a GANTT had the option for the vertical scroller on but id didn't actually need it (eg: # of rows in te view > # of labels) then a division by zero was getting into some co-ordinate calculations causing Very Bad Things to happen when the scroller was refreshed.

Different video hardware would probably respond differently to the bad co-ordinates passed.

  • increased model version # which should have been done in


due to the new operations added.


  • Pipe animmation works properly when items travel in the reverse direction on the pipe.

Use the pipe control attributes to reverse the activity animation as appropriate.

  • Format Into Label and Find Label Index now work for column and table targets
  • Allowable width for attribute views increased
  • File change object has a new menu option "Delete Resource".

Its intended to be used to "clear out" RTF notes.
This will remove the specified item from the runtime database (if set up) otherwise the model database is used (if available, not for a standalone EXE).
If the name does not include an extension, "RTF" is assumed.

  • new routine operation to set background colour of a panel (under display submenu)
  • bugfix: Due to support for "blocked" spatial links in


, a bug was introduced that caused PL to crash if NO spatial link leading to a target portal was found.
I've changed it to just "block" the item that cannot find a destination, as occurs with a stopped spatial link. It is conceivable that a modeller may later add a spatial link, enabling the "blocked" item to proceed.


  • Set Paint Text operation has been changed

A new parameter "For All States" (default is 1) enables the modeller to choose whether all states of a paint button are set to the new text. If this parameter is zero, then only the current state selected in the button will be update.d
For other paint objects this new parameter is ignored but should be left at the default.

  • A new paint routine operation "Copy Paint Properties" enables the properties of one paint object to be cloned into another paint object.

The 2 paint objects must be of the same kind or a runtime error will result


  • Paint copy: has new option to prevent an inherit link being made. This makes the copied paint object independent of the parent and allows an object to be copied onto the same or parent portal in an inherited hierarchy
  • New routine operation to delete paint object
  • New routine operations: "Inherit Paint Objects" and "Delete Inherited Paint"

These enable a panel to dynamically have paint objects inherited into it and those paint objects to also be deleted later. The objects do not get put into the paint label list and do not need to be because their ownership is determined by the parent panel from which they are inherited.
Since a panel can inherit from multiple sources, this gives good flexibility in creating backgrounds and interface buttons. It might also reduce the need for hiding paint objects using visibility control attributes.
If a panel already contains objects inherited from a given base panel, a runtime error is given if an attempt is made to re-inherit from that panel.

  • New routine operation "Change Panel In Popup" (Display) enables the panel displayed in a popup to be changed.

This is useful in creating "wizard" type progressions of dialogs.
The popup is NOT resized or repositioned, so the panels selected should be compatible in dimensions. Modal options are not adopted either, the initial panel's options are kept in effect.
The old and new panels do receive popup closed/opened broadcasts respectively.

  • The data targets in the file access menu of the change object can now be moved up and down relative to each other. the "Up" and "Dn" buttons act on the currently selected item in the list.
  • buttons have an "Auto Fit to text" option which fits the button to the text's width. This option is only implemented for paint buttons at the moment.
  • bugfix: Paint Copy onto the same panel as the parent with inheritance is now trapped as a model error since the paint system will not support doing this.
  • bugfix: Routine Editor and Default Attribute Naming

Due to the different scope between the routine editor's "attribute names" dropdown and the "name replace" when a name is changed, a situation could be created where a name in an item reference could trigger a global rename of that name when a newly added attribute had its default name changed.
To avoid this (and the annoying "rename existing" dialogs when a new attribute was created within a routine) the "New Attribute" dialog is no longer preloaded with the name in the attribute reference field next to the "add" button.


  • Paint Copy: A model can now copy an existing paint object into a nominated panel and it will create an inheritance link between the original and the created paint object.
  • have removed obsolete objects from the object palette. Since standard and "meta panel" object palettes are now the same, they use the same layout.

They are still internally supported but not for much longer

  • bugfix: routine call - a long nme can now be entered in a routine call
  • bugfix: time scaling mode behaves much better when mouse clicks occur. I've rewritten the delay code that this uses so it should be more reliable


  • added an "Active broadcast" indicator item in the "pause" menu for developers. This will indicate any broadcast currently being processed.

This is very useful when resolving endless loops within a broadcast or management of pause/continue options within broadcasts.
if your intention is to continue a run beyond the immediate effects of a broadcast button, use the "continue run" option on the button rather than forcing a run continue within the routine code.

  • bugfix: loading bug with RTF notes causing font pointer to be corrupted
  • new Change object File mode: Test/Read Resource Size

This mode is similar to the Test File Size routine mode except it looks in databases as well.
In this mode, "Target File Attribute" names a file/resource. If the name doesn't include an extention, "RTF" is assumed.
The file operation sets the first "Data Target" (if any exist) and the "Error Result" to the file size (in bytes) of the resource or -1 if the resource is not found.
This is useful to test if RTF notes exist.

  • changed the "Test File Size" routine operation to also set the "Error Result" attribute to the file size. Beforehand the "Error result" target attribute was not used.


  • the '*' in front of note links is now editable as part of the string
  • note text link boxes can be resized and the note description is centred like a button. If the box has any kind of border, it will not be auto-sized to fit changing note text fonts, so allow some space around the text to accomodate variations in fonts on different systems. If the box has no border, it gets autosized to match the font.

Note link font can be changed.

  • very basic support for rotated text in paint objects. Bounding boxes do not properly update to the rotated text but without a border/background it looks ok.
  • inherited paint objects and paint index:

If a paint object does not have an index ssigned in the paint label list but its parent does, then its parent's index is used when a button broadcast is sent and in the "Button Paint ID" system attribute.
This means any modification made based on that paint index will really be modifying the parent object (of which there could be many inherited objects)
This gives the modeller lots of flexibility in their use of paint objects, inheritance and the paint object label list.

  • new "Paint" routine operation to show/hide RTF note paint objects (as with other paint operations, it requires repaint to take effect)
  • fixed bugs with "_external files" label list handling.

The PL_MEDIA subdirectory is now scanned for resources other than media files


= This version of Planimate begins the retirement of the following objects:
Server Conveyor Facility Mark Record Assembler
This version will warn about any of these objects being present upon load.
You can use the "Find" function to locate the objects, use the "Advanced" button and select "Obsolete Objects". This will help track down the objects.
Generally Servers and conveyors used for simple delays can be replaced by single capacity multiservers.
Assemblers and Facilities can be implementing using attributes and simple logic in a subsystem.
Contact InterDynamics for assistance in converting your models.
The intention is that subsystem based "modules" will replace the functionality of these objects, with the advantage that the specific logic of the objects can be customised way beyond the hard coded capabilities of these objects that are being retired.

  • new table option "Reset Cells to Default At Start"

This enables a variable length table to be cleared leaving the existing rows intact.

  • table views created on multimonitor systems should properly be brought back into view on systems with different display configurations even if they were created on a non-active display to the left of the default display.
  • key [F4] toggles between run (ctrl-G) if stopped or stop (ctrl-T) if paused
  • form fields have an option to not confirm newly added labels
  • now show the "hand" mouse cursor over tables with send broadcast (no editing)
  • Table columns have an option "Edit Labels In-Place" to enable labels to be directly typed rather than using the dropdown. Typing an existing label sets the cell to the index of the label otherwise a new label is transparently added.

If the other new column option "Rename Instead Of Adding Labels" is on, then if the text typed is not an existing label, the original label index will be renamed to the text entered. If the text typed is an existing label, a message is given and no change is made.
HOWEVER, if the index in the cell was 0 (usually "-") then

  • if a new label is typed, it gets added
  • if an existing label is typed, the cell index gets assigned to it.

The label list "Only Modeller Can Add" option can be used to prevent new lebels being added in both cases above.
In summary:

  • use "Edit Labels In-Place" to enable the user to type existing or new label names, with the table cell indicies being updated automatically to point to the newly referenced labels
  • add the "Rename Instead of Adding Labels" option to enable the user to rename a number of existing indicies, without the table indicies being changed (as long as they are not 0).
  • The "Bring To Front" and "Send To Back" paint object menu commands are now applied to all paint objects which inherit from them as well. The bring one step forward/back commands are NOT applied to any child objects.
  • a minimised table editor does not retain its properties when closed. This prevents a minimised window which does not realise its minimised from being restored when the table editor is opened again.


  • Have added a new label list "_external files"

IF an imagea file name exists in this list (including extn) then PL will first look for that image in the current folder and then subdirectories BEFORE looking in the database as would occur normally.
if the file is not found in the working directory or the PL_MEDIA folder then the databases are searched for the file and it gets extracted into the PL_MEDIA folder (if found).
This enables a standalone EXE to carry some default images within itself but then extract them so the user can override/customise them.

  • paint buttons now send some tuple attributes:

_panel : Panel of the button (from panel label list) _paintid : Index of the paint object (from paint label list)

  • A new system attribute "Button Paint ID" is set while a paint object checks its visibiltiy/state attribute reference. If the object is in the paint label list, it can be used to assist in looking up visibikity for that paint object.
  • paint box inheritance has been enhanced to try preserve width/height and/or position when only one of these is changed. This will make box width/height track changes in width/height even if the position differ, and box positions track changes in position even if width/height differ.
  • routines can have longer names


  • New routine operation enables position of paint object to be set using the paint object label list.

The X and Y values specify the lower left co-ordinate of the box which bounds the paint object.

  • TRACK LOOKAHEAD change have implemented a new system parameter (Display-System Parameters) which can be used to limit the # of steps that TRACK lookahead will actually look into Portals (this doesn't affect loops since the track system knows how to look inside those).

If this value is set too low, models with many portals and few loops will lock up due to missed lookahead checks

  • TRACK Debugging There is a new "Unblock" item in the section runtime click menu which will report in detail which objects are blocking any item trapped in that section. Due to lookahead this can be quite a distance from the actual section.
  • fixed a small memory leak in routines that generated random numbers
  • fixed a nasty bug with immediate messages sent during lookahead.

If the immediate message (msg. from routine) was followed by a blocking switch, the switch would give a system error due to its TestEnter not ever being invoked (no switch decision being made). This was caused by the immediate message not resetting a flag used to signal that lookaheads have completed.
For this bug to appear, the immediate message had to be sent from within a portal so the "missing" lookahead could result in the item leaving the portal anyway.
(immediate messages can involve items MOVING during the lookahead of another item, causing strange sideeffects in the engine if they are not handled precisely)


      • Due to the model database rework, it is VERY important to backup your models and ALL DB files before using this version.

Edit notes with care to make sure they get saved as expected. There are many cases of databases being renamed/moved etc. while editing that I've tried to cover; if something strange happens and a note doesn't save, try remember the editing/saving trail you performed to assist in debugging.

  • removed text only note fields (old style multiline text boxes)

Any existing ones are now converted to "RTF" notes upon load of an older model. You may see them being converted at the top left of the model window - this will only happen when an model is loaded and updated.

  • have added a new database that Planimate will search in for model resources, the "Runtime Database". This is set in the Edit menu and enables resources (eg: notes, BMPs) to be bundled with a standalone EXE but NOT included in the EXE itself.

This gives the ability for end users to customise these resources even though the rest of the system is locked up inside the EXE.
The modeller will have to make sure the "runtime" DB is distributed along with the standalone EXE.
During editing the runtime database must reside in the same directory as the model. For a standalone EXE, the runtime database must be in the same directory as the EXE.
Its not recommended naming a runtime database with a leading "_" as that makes it a database that Planimate automatically searches anyway.
Planimate will use the runtime database (if set) to put newly created notes in.
Contents in the runtime database are not included in a standalone EXE, the database MUST be shipped together with the EXE. Otherwise the end user will experience many errors.

  • have added a new label list _Paint Objects. Paint objects can be added to this list from their edit menu. This will enable them to be commanded by a routine, opening up lots of interesting capabilities.
  • new routine operation: Set Paint Text (label string submenu)

This enables a paint object (selected using a painb object label) to have its "text" set to the formatted value (eg: label) of the second parameter in the routine.
"text" is interpreted as follows:
Text : text of the the object Button : text of the currently selected button state Image : image name that the image will display RTFNote : note name that the rtf note displays
This text is retained after the model stops/restarts so the modeller takes responsibility for initialising it.
There is no redrawing when detail is changed; the modeller can issue a repaint when all changes are done.

  • have rewritten note loading to enable notes to be in any database that is accessible to the model (same rules as icons)
  • rewrite: label list management code has been merged to enable better reuse of common stuff. This should not affect PL much but look out for any problems. The lists involved are: Object Labels, Panel Labels and the new Paint Labels.
  • when selecting a note from a database, pressing <shift> before the note selector appears will enable another database to be selected.

This enables notes to be brought nto the model from a number of databases.
If <shift> is not pressed then Planimate will default to:

  • the "runtime" database if assigned to the model otherwise
  • the model's associated "DB" database
  • the edit menu has been rearranged and I've added some details on the various items
  • bugfix: file browser with "dont change directory" option tests for directory change properly and now reports if a file in a different directory was actually selected by the user.
  • bugfix: database file import didn't check the limit counter properly. This would have caused extra garbage to be read into RTF notes but the RTF format would have usually cuased this to be ignored.


  • BUGFIX: Fixed save bugs in 4.33

(was not writing portal details to the file - models badly corrupted)
The version number was also wrong

  • SPEEDUP:Lookahead code
  • I've cleaned up the Lookahead code (TestEnter) to minimise the testing of visibility/debug flags which would slow down this time critical operation.

(now do the testing once up-front for each TestEnter search)

  • Moved special case code for multiple portal exit support out of TestEnter() so it only executes if required.
  • SPEEDUP:Portal entries

Searching was being performed on entry to every portal (flow/track/spatial) to support multiple portal entries. A cache means this searching is no longer required in the 99% of portals which do not use multiple portal entries. In the case where multiple portal entries ARE used, the system will perform as before.

  • new broadcasts "_popup opened" and "_popup closed" get sent to popup windows when they are opened/closed
  • the "Make Panel Visible" routine operation has been enhanced. If a value of "-1" is used, it goes back to the previously visible panel (like CTRL-B)
  • system broadcast processing has been reworked to use a table for some internal flags rather than many IF statements, to do with enabling some BCs to be sent without any listeners being present. This also simplifies a special case test for the timer tick BC.


  • ENGINE REWRITE - ==================

may affect run order, requires careful verification of item movement
I've rewritten unblocking in Planimate in order to speed up the item movement code which is critical to Planimate's performance.
The following functionality has been removed:

  • Portal interaction menu (selecting the way items entering are counted)
  • There is now no class specific counting of items for portals (the existing occupancy counters will remain)
  • No portal item limit/blocking of items
  • No hierarchic unblocking (since theres no longer any limit) of items behind a portal
  • the Portal "Full" state is obsolete.

This functionality was implemented before we had switches+attributes and was very simplistic - yet supporting it was very complex and slowed down ALL model code even if the functionality was never used.
Removing this code will clean things up. In the cases where you need to limit a portal's capacity, use a switch + portal attribute.
A warning will be given when a model is loaded where a portal had a capacity limit set. This is logged to the debugging file to assist in updating the model.

  • Popup option on panels enables them to remain open after the run terminates.

This is useful for "control" panels which restart the engine

  • If a portal is in "Act as Junction" mode then the junction rule is enforced even if the sections are double, however the rule is so strict that the sections end up acting as single sections.
  • Track unblocking now works for portals which are junctions but contain capacity (eg: a queue) causing the flow based unblocking to fail.

(originally capacity was not expected in a junction portal)


  • speedup:

I've made a change to the way Planimate moves items from one object to the next, by testing for recursion in a simpler way (keep a counter per object rather than using a global stack).
This might affect event ordering in models that previously worked using recursion of the move loop, something I've trying to cut back on.
I'm interested in any observed speed ups. I haven't found any bugs with the new approach - they would manifest as items stuck at places they should not be.

  • subroutines now have an item in their menubar to delete themselves
  • bugfix: cancel adding subroutine no longer crashes
  • bugfix: facility state properly reset when agent leaves it after being blocked
  • layout change to colour palette so it can be a bit narrower AND changed spelling of "Colour" to "color" in static text since the system palette and planimate label lists use that spelling anyway.


  • Enhancements to dynamic object creation:
  • if a column called _new_name is included in the command table, its formatted value will be used to set the Object Name of newly created objects.

This is a big improvement over dynamically created objects getting "generic" names and avoids the modeller having to artificially label them.
Planimate will modify the supplied name to fit within the object name length and to be unique on the panel for that object class.

  • If any additional columns exist in the command table which have names NOT starting with an "_", then Planimate will use the value in the cell on a row which crates a Portal to initialise any matching Portal attributes in that Portal's SubSystem.

This will greatly assist in creating networks by enabling the objects to be made unique and identifiable as they are constructed.

  • The modeller can now put text inside the activity state area in the status bar using the Display routine operation "Set Activity String"

This is very useful when very long processing delays occur and you want to show the user what the system is doing as well as how far it has progressed.
It can also be used for displaying modeller defined "modes" to the user. The string is appropriately reversed when the activity bar moves across it.
If the string is a single space OR ' ' then it is treated as an empty string.

  • Adding a label '-' to the user defined menubar menus adds a separator
  • new button action to copy a named table into the copy buffer/clipboard
  • bugfix:fixed silly bug with naming items in user added menu (was overwriting label list)
  • bugfix:no longer crash with certain menu command buttons if the button is clicked during a run where clicks have been enabled during run. I've updated the command handling code to be aware of being in "Simulate" mode.
  • bugfix:routine attributes in subroutines are properly identified as needing to be renamed when the attribute in a parent routine is renamed.
  • bugfix: table name when dynamic object create table is missing some columns
  • the notification of routine name in error dialog is now aware of subroutines and should report the parent and sub routine names properly
  • Strict lookahead and Strict Attref handling are no longer an option - they are ALWAYS enforced. Any models that had these options off will need to be reworked if error messages appear when they run.
  • have cleaned out code that tracks which routine is active. Tracking code was replicated for debugging and internal management purposes, wasting time and space.


  • Spatial link delete routine operation added - deletes all spatial links on the given panel
  • Table block attribute references are no longer accepted as table references in routine operations which do not properly support the block reference as a source or destination data type.
  • The modeller can now generate a customised menu bar.

The menubar is cleared using the "Clear Custom MenuBar" routine operation (under Label String) and a sub-label list of menu options is added to the current menubar using the "Add Menu To MenuBar".
When a menubar selection is made from a user added item, the new _Menu Command broadcast is sent with the label code of the selected item.
The "Clear Custom Menubar" command switches Planimate to user mode if it is not already.
CTRL-Shift-H can be used to restore the editing menu. Other PL CTRL key shortcuts are still active when the user menubar is active.
If the Clicks During Run option is on, custom menu bars remain available for selection (unlike the inbuilt menubars which are disabled during run).

  • New system broadcat _Menu Command with attribute _command is sent to the model when a commane is selected from the user defined menubar


        • CRASH BUGFIX ***

rework to avoid event re-entrancy during click-during-simulate processing, screen changes and redraws.

  • no longer pump events when determining the speed that an item will animate. This has the undesirable effect of (sometimes) closing the panel just as an item is about to animate

Hopefully this fixes the CM model issue; after a *lot* of testing I've been unable to reproduce it after closing this loophole.

  • pressing the [x] on the "delay box" when advancing to a time no longer will break out of long or stuck iterations/while loops.

This was unworkable and caused repeated "loop interrupted" messages to appear as the delay box continually signalled a close but was unable to be closed by the system (because it was stuck in a loop).
Pressing <ESC> is now the only way to break out of these endless loops.


  • have integrated the colour selector and the _colors label list. Colour names in the list will appear as tips over the colour squares and a colour is now selectable from a dropdown list.

This is in support of colour theming of models by using standard palette positions for standard interface objects, Jay's recent model email is an example of this.
Note that the default Planiamte _colors label list only names the first 16 colours in the palette. The default list may be changed if we get some standard allocations in place, this will only affect new models.


  • subroutines can now call sibling routines
  • dispatcher mode: "message for each carried item"

In this mode a dispatcher will send a message for every item that entering item is carrying.
This enables processing of stats, inspection of carried items etc. to be performed without the overhead of dropping off all the carried items then picking them all up again (using Trays).

  • note that if the dispatcher contains more than one item, performance will be reduced according to the number of carried items by the items in the dispatcher.
  • new option for broadcast dispatchers: "Wait for items to exit"

With this option on, the item sending the broadcast waits in the dispatcher until all broadcast items enter an exit.
Normally, the item waits at the dispatcher only until the initial thread from each broadcast entry completes (items reach a point of capacity).
This option is useful when you want to guarantee that all broadcasts have been completely processed before the item leaves the dispatcher, even if the processing of the broadcast takes non zero time or involves activities beyond a single thread (eg: pauseable zero delays, other broadcasts).

  • paint "other Options" menu has new option to delete all paint objects on the current panel which have been inherited from anywhere. This is also applied to all objects inherited from these objects.
  • A new routine operation (display) "Choose Colour From Palette" enables the user to customise a single colour in the colour palette.

The modeller provides the colour # to customise, this must be between 16 and the colour palette size (64)
The operation returns 1 if a colour is chosen, 0 if the user cancelled or -1 if the modeller provided an invalid colour index.


  • New feature: stoppable spatial links

All spatial links have a control attribute (like a pipe)
By default it is 1, meaning "go". If this attribute is set to 0, the link will be "stopped" with all items on the link being frozen and the end points of the link blocking any item attempting to enter them.
Whilst links still do not have "capacity" per se, this gives the modeller much more control over the use of spatial links to move items.
Its very important that the control attribute is something Planimate can "unblock" from, so portal attributes and fixed cell references are OK but item or dynamic table references are out. PL looks for the control attribute starting in the "from" portal of the spatial link.
Advanced user note:

  • If you click on an item on a stopped spatial link, the "TIME" field will show the start model date + the time the item has spent MOVING on the link.

If the link is restarted and you click on an item, the "TIME" field will show the resume time - the time the item has spent moving on the link (ie: as if the link never stopped).
This is to keep the animation calculations consistent.

  • fixed nasty FEC bug which would cause events not to be deleted from the delay FEC when doing a "flush" of pending events (Eg: clearing out a spatial link)
  • IF an item *with* a spatial link target set is about to go up to a portal with spatial links connected where no links accept the item, and that portal ALSO has flows connected to it, PL will no longer attempt to take any of the outgoing flows of that portal, or complain if there is no flows. The item will block instead. This is to support stoppable spatial links.


  • new percentage format display mode which will only show fractions if required by the number
  • fixed editing of cache settings, was originally limited to 3 digits
  • train graphs have option not to hide overlapping labels
  • train graph lines drawn with 0 thickness are now not drawn but their labels will still be shown
  • change object icon updates properly after routine editor closed
  • values formatted for fixed x,xxx.x and x,xxx.xx retain this format if the attribute editor dialog has a value with a comma in it during editing.
  • table selector has proper z-order when displayed within the attref browser within a field within the dialog editor
  • display option enables user mode users to pause in the middle of a broadcast. Some models need this to enable pausing during long zero time code.

Note that PL will not break any zero time pausing rules with this option (pauseable 0 delays are still needed for the pause to actually occur).


  • fixed editing of searches broken in g


  • Significant rewrites requiring verification of routine integrity *

Rework of internal code with

  • routines, searching, conditions, muilticonditions, dll calling, dialogs and distribution pattern dialog, lookahead code so watch for any problems with these
  • Routines can have subroutines defined within them. These subroutines share the same attributes as the main routine.

(call subrouting is under "special")
Subroutines have their own editor window (at the moment) which remembers its position separate to the main window.

  • friendlier message for unlinked buttons when in user mode with no option to select a target now
  • the lookahead undo mechanism has been rewritten to allocate memory in bigger chunks less often and to basically operate faster. Routines in lookahead will be improved
  • no longer crop paint objects upon loading to avoid them being repositioned if slightly off screen
  • system attribute enables reinitialisation of random seed without having to restart the engine
  • attempt to fix bug with lingering advance to time box. Added a new error message which warns that an attempt to pause has occured during a background thread process (eg:panel open BC) which is a Very Bad Thing.
  • Fixed a crash which occured when a hover BC caused the popup it was in to be closed.

Hover BCs were not intended for UI control and you may end up with stuck windows or laggy response on some systems due to the overheads with processing on every mouse co-ordinate change.

  • issues with message dispatchers and graphical loops identified and a demo model has been produced to demonstrated which I'll release soon


  • added check for null printer handle to avoid printing to invalid handle
  • fixed inserting rows into empty table in edit mode - was trying to send a BC in edit mode -> crash
  • percentage value format - displays values like 0.274 as "27.40%"
  • log driven graphs have new scale options to always include 0 in the x/y scales when autoscale is on
  • The colour of paths (when show paths is on and not in flow/interaction mode) can be set from the item class menu.

Selecting "None" uses the defaults.
If you override the colour for one class you may want to override it for all classes otherwise the automatic colour selection may repeat colours.


  • New support for building standalone EXEs which use a separate external InterDyne keyfile as their license. This enables the one standalone EXE to be distributed with various different runtime licenses.

It is important to specify wither an "External" or "Internal" keyfile is being used as InterDyne licenses (external file) differ from Runtime Licenses (internal).

  • The menu bar can be hidden in user mode, enabling a modeller to reclaim its space and provide their own control UI for an application.
  • fixed bug calculating gantt popup height when the block times are visible


  • Object schedules on dispatchers and portals have been removed
  • the unavail state for dispatchers and portals has been removed

Possibly a slight speed increase as these two objects are commonly used

  • redraw locking is reset upon PL stopping if a stop occurs whilst it is active


  • have rewritten the FEC to use separate lists for zero time and delay events. This should increase performance slightly as it enables the events to be managed a little more efficiently.

If you can prove its slower (vs.


) then I'd be very interested in a demo model of this.

  • FEC event reports now have longer field for object name
  • Fixed bug in model popup panel management - was not properly testing if a popup was already opening causing corruption if it was popped up several times and preventing the popup from closing
  • Popups opened by the model are now clsoed when the engine is restarted.
  • Adjusted the exact point where a panel closed broadcast is sent. Previous versions sent it at a time where no panel had proper focus, causing very funky things to happen. It is now sent after the new panel has been given focus but before the "panel open" broadcast is sent for the new panel.
  • Have added a check to the pauseable zero delay multiservers to flag an error if a pauseable zero delay is attempted in a background thread (eg: a timer tick or a panel open/closed broadcast). Pauseable activity is not allowd in these threads for obvious reasons.
  • closing log viewer no longer possible while its redrawing

Also have fixed the redraw interrupt keypress to reset properly the next time the log display is redrawn.
Also fixed the selection box display


  • Table editing enhancement

= if using tables which send after edit broadcasts, read carefully as = the options available to the user have changed
The edit broadcast capability on a table view has been enhanced to handle notifying the modeller that a range of cells has been modified by the user.
This affects table views with the "Cell Click Broadcast" set and the "Send Broadcast After Edit" option on.
Previous versions of Planiamte would disable the cut, clear and scale cell editing functions because there was no way of notifying the modeller about these events. This is no longer the case. Planimate can notify of an edited range.
The modeller can disable block edits from being made using a new option on the table view "Disable Block Edits".
Since existing models wont have "handlers" for block edits, this option is turned on when older models sending edit broadcasts are loaded. HOWEVER be aware that this option is stricter than Planimate used to be and PASTING is now considered a block operation and hence not allowed if this option is on.
If this option is off, then the modeller must anticipate edits affecting more than one cell sending a broadcast as follows:
The cell click broadcast sends _row and _col tuple values to indicate the edited cell. In addition, it will now also send _to_row and _to_col values indicating the end of a modified range (inclusive).
If a single cell is edited, then _to_row and _to_col equal _row and _col respectively. Hence existing code can be upgraded to handle a range by wrapping it in "for" loops for the row and columns.
Further notes:

  • The other tuple values set by this broadcast, _previous and _current, will be set to 0 if more than a single cell is specified in the range (ie: _row != _to_row or _col != _to_col).

In other words it is not possible for the modeller to know the previous values if a range of cells was modified.

  • the fill and index menu selections send an individual broadcast for each cell modified so the previous and current values are available
  • A cut or insert menu selection will send a BC with the range from the top left cell to the new bottom right cell in the table.
  • any row operation from the row menu (if enabled) will send a BC with the range from the top left cell to the bottom right cell in the table, regardless of the row menu item chosen.
  • new table view option to disable block edits, that is any editing operation that could modify a range of cells without the modeller being notified of the exact cell and its previous value.

This does not include fill and index because they send a separate broadcast for every cell modified.

  • new platform attributes in the Display -> System Parameters menu.

FEC Event Cache
This sets how many FEC events Planimate keeps on hand. For best model performance it should be > than the maximum number of concurrent pending FEC events.
Item Cache
This sets how many items PL keeps cached ready for use. For best model performance it should be >= the maximum number of concurrent items that ever exist in the model.

  • Extensive rework of how objects test if they are visible. This will improve the speed at which Planimate Advances To Time by reducing the number of checks
  • Rework of
  • Multiserver
  • Queue
  • Dispatcher
  • Intray/OutTray to squeeze more speed out of them (inline functions, better list management)
  • FEC tweak to try optimise the way items are placed in the FEC. Extensive testing with a large model shows there is need for much more improvement here.
  • Fixed what was a possible future bug with FEC which could have caused the message dispatcher fix in


not to always apply.

Unfortunately this will slow down the FEC slightly :(

  • Menu item to show the running debug log file


  • Gantt views have an option to suppress showing the times in the popup which appears when the gantt blocks are clicked 4.32
  • New time format mode: Day (1..); Time HHMM

This displays a value as a day number and hours/minutes
If day 1 is sunday then:
1d 0000 midnight sunday, value = 0 7d 2359 23:59 saturday, value = 6*86400 + 23*3600 * 59*60
A user can specify 2400 as a time eg: 1d 2400 interprets to 2d 0000

  • fixed line drawing changes in


to ensure that single pixel lines still are drawn. This should fix dial-chart drawing
  • new standalone EXE functionality

Planimate standalone EXEs are now produced with the use of a new DLL plugin to Planimate. Please contact InterDynamics for access to this DLL.
3 kinds of standalone EXEs can be created depending on the developer keyfile:

  • 10 day time limited
  • EXEs requiring an individual "standalone" runtime license which InterDynamics provides
  • EXEs not requiring an individual license (open)

All developers can produce 10 day time limited standalone EXEs.
Developers can apply to InterDynamics for licensing and key files to produce individually licensed and/or open licensed standalone EXEs.
Developers who currently have a newer key file enabling production of standalone EXEs have the ability to produce individually licensed standalone EXEs. These EXEs require a runtime license from InterDynamics.
To produce standalone EXEs not requiring a runtime license, please contact InterDynamics to arrange open licensing and a new developer key file will be provided.

  • message dispatcher event order clarification & fix:

If a message item triggered any broadcasts AND the message item did not enter and leave in the same thread (ie: any capacity in the message item thread) then when the message item went into its exit, it was possible that the broadcasts would be processed before the original item tried to leave the dispatcher.
For this case, I've put priority on moving the original item out of the dispatcher before any broadcast events are processed.

  • no longer support "Interdyne" exe compilation builds. The new standalone EXE functionality superseeds it.
  • new developer INIfile items under [display]

StartX, StartY
Initial position for window in screen co-ordinates. If (-2,-2) is specified, the window is centred (the usual default). If (-1,-1) is specified, Windows sets the default according to its window manager rules. Otherwise the screen co-ordinate (top left) is used.
StartW, StartH
Initial width/height of the PL window
If 1, the PL window starts maximised. When restored, it reverts to the co-ordinates as set above.


  • Crash pasting change objects - recompiled


with old compiler, seems OK.

Also turned on "Pentium" code option, it was off for the last few builds


  • fixes a crash issue with Billboard table handling

Gory detail: due to the compiler barfing at the fact that I did not include a "destructor" for an object that is being allocated in a C++ array.


  • Gantt block line linking has been changed to provide a bit more flexibility.

2 new columns can be included in the gantt table, "_nodeid" and "_link_nodeid".
_nodeid enables an identifier for a gantt block to be specified.
A block further in time can be linked back to that previous block by setting its _link_nodeid to the same value as the previous block.
Many blocks can use the same _nodeid, PL will always search for the most recent block (not including the current).
Hence to connect a series of blocks together, setting their _nodeid and _link_nodeid values to a common value (eg: consist #) will display a line linking the blocks together.

  • new display option "Fastforward when no animation"

This causes Planimate to quickly step through animation updates if there has been no animation activity (this used to be the default behaviour). The default now is to speed-regulate the animation update intervals. This option enables that to be overridden.

  • bugfix:

have changed the way panel deletion is notified to the popup panel viewer to handle notification of panels properly.
deleting model with the popup panel view visible should be reliable now


  • Made the hierarchy explorer modeless. You can leave it up on the screen somewhere and continue working in the model.

Modellers may want to put default co-ords for this in the INI file. eg:
ExplorerX=150 ExplorerY=350 ExplorerW=300 ExplorerH=400
(X,Y give the top left screen point)
These are placed in the [display] section

  • Track logic: Added a new rule enabling a train just leaving a junction to continue on the section without error message if a subsequent section also connected by junction) has become unavailable.
  • table titles can be centred
  • Have added timeouts to planimate forms/dialogs. These are intended to enable informational popups to occur and the model to continue afterward even if the user does not press [OK]

They should not be used with dialogs which require user input. I have attempted to cancel the timeout if user input is detected (eg: typing in a field).

  • Format into label has been enhanved to handle columns and tables.

If the item to format is a column or table, its name (tuple name) is formatted into the target attribute.
This enables a column name to be placed into a label list so the modeller can then work with that name

  • Updated to new compiler, code more conformant to modern ANSI C++ standards (many modules had some syntax changes).


  • The _PLERROR.TXT file (which gets written when a model error occurs) now includes portal attributes and table dimensions for the portal closest to where the error occured and those up the hierarchy at that point (ie: those in scope)
  • PL properly saves the DB from a PMB (model bundle) when it gets saved as an normal MDL.
  • Found a very elusive icon animation manager bug

When two icons were drawn next to each other but not overlapping, bits of junk were left on the screen when the "lower" icon in the list left before the "upper" icon. This is because the icon drawing code was "save-undering" an extra pixel without the animation manager realising there was an overlap.
I've corrected it (for the x-axis only) though I suspect there is the potential for similar problems with rotated icons.
To fix it properly I need to make the *rotated* icon bounding rectangle available to the animation manager. Will do this if animation "junk" continues to be an issue.

  • Have reworked the line drawing code to minimise glitches at the end of longer lines, very evident in the table view where grids are drawn.

The problem arose because Windows doesn't draw the endpoint for lines but the iFlow graphics model requires it to.

  • Have reworked table drawing more to improve display of cells. The fill colour of cells is improved (but still imperfect when zoomed.
  • Linear searching can now occur in the reverse direction


  • This and subsequent releases of PL are built using a new compiler (unless a problem with it is identified).
  • PAINT inheritance for paint buttons enhanced:

A change in the click action of a button is more intelligently handled.
Changes in an action or an action's properties are properly checked now so customisations of an action are not lost if the master is changed.
More detail:
A change in a child object's action properties/options makes that child/action unique and a change to the master's action (even if its the same type of action) wont change any property of the customised child object.
IMPORTANT: This does not apply to inherited Dialog action buttons, they are always treated as unique and wont track the master button while it has a dialog action.
HOWEVER If the master is changed from having a dialog action to another action type, ALL inherited buttons in dialog mode will be changed (the old way PL used to work).

  • fixed OK button handling in the debug dialog (wasn't properly closing)


  • have changed the breakpoint/error debug dialog
  • removed a few of the buttons at the bottom and replaced them with a fly-out menu which now enables tables, attributes and labels on the current screen to be inspected.
  • Fixed a bug which caused an invalid screen warning to occur if the panel changed broadcast was used to change the current panel


  • Planimate popup child windows (without title bar) are placed topmost now of sibling child windows so they are not obscured by existing popups and viewports
  • time scroll window now sends update broadcasts if the keys are used to shift the window as well as the mouse
  • The popup which appears when an item is clicked (or ctrl-clicked if system properties are hidden) now contains a "TRACE" line.

Selecting this line toggles trace animation just for that item on and off, very useful when debugging

  • re-enabled backing store for view panels, some models had too much flicker on table cell broadcasts which updated tables. The backing store uses memory but elimiates the flicker.


  • The graphics system now supports hugely huge bitmaps and panel work areas (limited by RAM now not by Win32's GDI)
  • Column overlay graphs have an option to remove the margins automatically inserted in the x and y axis. This will make their range compatible with gantt/train graphs when they are displayed together
  • fixed a bug introduced in


that messed up ctrl-pastes of portals when they were linked to other portals
  • The line taken counters introduced a 6% hit in engine performance so I've made them only active if the run is started in "Application" mode (editing tools hidden)
  • have done quite a bit of rewrite/cleanout of the graphing code (mostly column overlay) to try move towards a common graphing model


  • viewports/popups should properly clip against each other now
  • There is a new system-item attribute which enables trace animation to be enabled on an item-by-item basis.

This means one specific item can be tracked throughout a model, or the activity of items in a defined region or time window, as the modeller chooses.


  • column overlay view should properly updates its bounding box for y scale width
  • no longer crash on trying to deallocate counter table for an empty routine
  • Reworked the run initialisation and termination code, cleaning up internal names and function sequence.

(shared routines were not being initialised properly but it wasn't an issue until I added the routine line tracing in the previous release)

  • code rework: view panels do not allocate an animation manager (dont need it)
  • I've added some debugging to check for bitmap allocation errors. This will pop up warning messages if an image buffer fails to allocate (indicating a low memory condition or problem with the Windows API)

I've identified that the Windows system fails to allocate large bitmaps due to limitations in the GDI functions (even under WinNT) however there is another way to do it which should only be limited by RAM, so I'll give that a try in a subsequent release.
I will not be putting any effort in supporting 8 bit (256) colour systems.


  • specifiable capacity of multiservers increased to 9999
  • models with many items visible stop and change panel much faster, achieved by flushing the animation manager before hiding the individual objects/items
  • Queues and dispatcher handle capacity up to 99999

Previous versions had an editor bug which could result in -ve lengths if large values were specified

  • routine list has a new column "Taken"

this is only visible if the routine editor is opened when the run is active
It displays the number of times each routine line was executed the last time the routine was executed. This is useful for determining what code just executed preceeding a breakpoint
All routines track this usage now, the performance hit vs. previous PL versions should be minimal (report any massive change in routine speed between this version and the previous)

  • The "execute command" code recognises names starting with http:, mailto: and fto: and processes them through the shell, so the default application for these types will be used.

This enables buttons to link to URLs and email addresses.

  • new routine operation "Reverse Item Direction" (in the Message menu)

This enables an item ID and panel to be specified. If that item is found in a spatial link on the panel or a panel underneath it, its direction is reversed and the operation returns 1, otherwise it returns 0.
Reversing the item means:

  • its time to reach the end of the link (where it had entered) is the same duration it took for the item to get to the current point in the link since it entered
  • the destination is the portal the item will first arrive at (so the modeller must be prepared to take the item and assign further links to it, dispose of it, or whatever.
  • The set random seed function introduced in


now also sets the master random seed to the specified value. This means the seed value will take effect if the run is restarted by a stop/restart exit as well as restarting with a restart dispatcher and the new seed value will persist from then on until it is changed again (by user or the model)
  • lots of code tidyup to make compatible with latest ANSI standards on variable scope in loops, should not affect anything


  • Crash fix -


was a lemon.

The attribute editor was broken by the new checkbox (wasn't initialising it when it wasn't supposed to be used, causing unpredictable crashing)

  • Added new system attribute "Random Seed For Restart Run" (Run Engine)

This enables the initial random seed for the NEXT run to be set when a run restart dispatcher is used. It also enables the random seed for the current run (single or multiple) to be read (unless the modeller has set it prior to a run/restart).
Note: its OK to use incrementing seeds, internally Planimate scrambles the initial seed to ensure the streams for the successive runs dont trivially correlate.
The seed value must be an integer between 1 and 32767 (inclusive) and a hard clamp has been introduced to ensure this.


  • Create standalone application is much faster (avoids database updates if an item is already in there).

Items included in the standalone EXE database are logged to the PLANIMAT.DBG file, as well as any error messages for icons etc. that could not be found. (the messages still appear onscreen).

  • Database and file copy routines have been given much bigger work buffers so they will save/transfer data faster.
  • have fixed paste/replace code so it also adds contained portals to the object label list if their option to do so is set
  • I've added a new system attribute "User Edited Model Data" which gets set when a user edits an attribute view or table view/editor.

The model can set and reset this attribute. It gets reset when the model is saved.
Tables and attribute views have an option to not set this bit when they are edited

  • "Only to screen" broadcasts such as panel closed should now work properly if the BC is sent under model control
  • fixed a locking problem introduced in i


  • dials/charts support having a transparent background colour
  • portals have a new option

"Automatically Add Copies To Object List"
If this option is set, any copy made of the portal (by user or under model control) will be added to the object list and an index/name automatically assigned.
The original portal does not need to be in the object list.


  • added a new portal option:

"Handles Parent Messages/Broadcasts"
If this option is set for a portal:

  • The portal can contain a message handler for directed messages sent to the owning portal.

This is the same functionality as naming the portal "_!message" but means any name can be used instead of _!message for the portal which makes paste-replacing code updates safer and easier.

  • The portal can contain broadcast handlers for screen-only broadcasts sent to its parent (eg: portal clicked)

This means the handlers for these broadcasts dont have to be right at the portal which has the broadcast targetted at it.
Broadcasts like "_Portal Clicked" are not normally sent "scoped" but setting this option on a portal within the one where the broadcast would normally be received enables a limited amount of scoping.
Only one portal in a subsystem should have the this option on (Planimate will only search the first portal it finds with this option on in a given subsystem).
Portals with this option on can be nested if a single handler portal gets too busy, the inner portal must also have this option on and the same rule above applies.

  • added check for class change at routine to make sure the 2 classes have the same # of table references
  • bugfix:enhanced item attribute fix in prev version to allow class changes (as long as item attribute and table references dont change)


  • fixed trivial bug which was causing flipped (but not rotated) icons to display wrong.
  • New key file handling.

To create a "standalone application" you will require a new key file.
Your existing key file will continue to function but you will not be able to create standalone applications.

  • Fixed a small bug with background timer handling. During simulation mode, if during the test for a "pause" a background event occured, it wouldn't be processed before the pause occured, causing the timer to stall until a "continue".
  • Found a very nasty bug involving a routine which, in look ahead, set some item attributes then performed an immediate message. The undo mechanism for the attribute set conflicted with the immediate message value return, causing memory corruption.

I have rewritten the way items allocate memory. This should eliminate this problem and will also speed up the creation of broadcast and message items.


  • fixed small bug with pause key checking (main window wasn't redirecting all key events)
  • fixes to AVI clip end broadcast handling
  • BC is sent as background BC
  • properly stay in background mode to process side effect BCs rather than dropping out and back in (and generating system errors...)
  • The background timer BC is no longer disabled when pausing in editor mode anymore. Due to the event throttling this should not be required.
  • internal engine enhancement and cleanup:

These are all moving PL beyond a simulation platform and towards a real time event/data processing and visualisation platform
[advanced detail]

  • reduced the number of places where engine Contine() is directly invoked, in many cases I post the "Continue" command message to PL instead.
  • made background BC mode an explicit set up / teardown around the Continue() operation rather than passing of option bits
  • added a new interlock to prevent background updates being posted to the FEC when PL is about to go "paused". This was causing timer events to get "stuck" on the FEC until the next "Continue"
  • Removed some "Wait mouse buttons up" checks in the Run/simulate to paused transition code. I dont anticipate this affecting anything.


  • Have now implemented rotated bitmap drawing (worked around MS's bugs)

At the moment automatic rotation of items is supported, this is an item class option. The "Flip Icons" option should also be on otherwise trains etc. will appear upside down when they animate right to left.
The direction sensing code is smarter than it used to be (makes use of each bend section vector).
I've not finished updating the animation manager so rotated items in queues and dispatchers may leave crud behind on the screen. Spatial links, conveyor-road and multi-server item animation should work smoothly.
Later versions will enable the rotation of items and objects to be set by the modeller.
Rotated icons are only supported under NT/Win2K/WinXP. On ME/98/95 icons are not rotated (the APIs dont exist) but the model should otherwise run.

  • Planimate now has two Future Event Chains (FECs).

When a "real time" event such as a timer tick, network broadcast or other special broadcast (see next point) is sent, Planimate switches to the second "Background FEC". This allows side effects of the background BC to be cleared without "continuing" the run, when it was paused at a pauseable 0 delay (previously it wasn't possible to tell 0 time events apart).

  • reworked the background timer BC handling so it doesn't post multiple events to the PL FEC if PL is busy

Models are easier to pause even if the real time BC is being animated

  • fixed the background timer BC handling to properly update displays when PL is in run/simulate mode.
  • The "_panel opened" and "_panel closed" broadcasts are now sent using the Background FEC. This will get rid of the annoying "continue" when a model is paused at a pauseable 0 delay and the user changes panel.
  • no longer set background flag on BCs sent from a background BC.

Creates too many side effects. Background BCs should not be scheduling other BCs.

  • Paint Video objects have an option to enable looped playback. There is a delay between the clip repeating, this is inherent in the media player widget.
  • new routine operation "Find Formatted Label" checks whether the parameter, formatted as a string, exists in the label list pointed to by the target.

IF it does, the target attref gets set to the label index otherwise it gets set to -1


This one seems more stable

  • I've rewritten the fine timer interrupt handler to not call any functions or use any pointers (all the fine timer interrupt does is post a wakeup event to the main Planimate thread which handles the broadcast)
  • I've added a display option to disable the timer tick broadcasts. Note that the timer still "ticks" if a timer tick BC entry exists in the model, but this option prevents the broadcast being actually sent.

Timer Tick BC's are disabled by default. Turn them on when your model is debugged.

  • Reworked the "pause check" code to the following rules:

In end user mode, the pause menu will appear if the following is met:
PL is not processing a background event (timer tick, network) and (item animation is occuring OR PL is not processing a broadcast)
In developer mode, the pause menu will appear:
if animation is occuring OR PL is not processing a background event
Actually selecting "Pause" in developer mode using the background menu disables the timer tick (display options).
This is to protect the modeller from getting stuck.


== == This version involves a lot of fixes, some new internal stuff and loads == of rewrites and cleanups of old code. Look out for any new graphical == anomolies in particular. ==

  • It seems the background tick is causing corruption of the process state which I've been unable to pin down. I've fixed and rewritten lots of stuff in this release but that crash bug is still there.

I'm separately uploading a VC build of Planimate. If the SC build crashes, try the VC build. It hasn't crashed for me yet.

  • time scrollers are now optional for train and gantt graph (nneds testing)
  • new time format: Day Of Week; Time Of Day

This format enables a day, hours and minutes to be specified in the form
Eg: Sun 0000, Wed 1234, Sat 2359 and is represented as the number of seconds since midnight on sunday.
This is a useful format for entering weekly schedules.
Times such as: "Tue 2400" are accepted and become "Wed 0000"
"Sat 2400" is also accepted and wraps to Sun 0000

  • Paint Buttons now cache images in memory (like object and item's do) This means they draw much faster and opens up opportunities for animating them.
  • Paint Buttons have a new option "Real Time Tick Update" which causes PL to update their image if their state has changed (eg: in a real time tick broadcast)

This enables animations to occur using paint button states without requiring a forced repaint.
This option should only be turned on for objects which need it as it requires some background processing.

  • focus in the routine editor improved
  • fixed key handling.


broke it for the main window. I now do extra checking on whether the active window is a form/dialog or not in order for Windows to process the key events appropriately for modeless dialogs like the routine editor.
  • bugfix: trace animation is suspended once a pause is requested
  • BUGFIX: Fixed a very hard to find bug: If a screen change occured in the processing of a "background" broadcast such as the timer tick, the menubar and mouse states were left "busy" whilst the app was really idle.

This occured because the run manager was not aware they were being changed by the screen change code.

  • Event/pause checking change:

While a BC is being sent and its side effects cleared (time not moving) PL will not poll for "pause" clicks in user mode UNLESS items are animating somewhere on the screen.
This reduces popup of the "pause" dialog when dragging portals etc. but may make models hard to debug/stop (which is why I only do this in user mode).

  • Found a very obscure bug in the handling of redraws which caused the animation manager to do more redraws than necessary (object icons were being cached in the "front_icon" of the animation manager which is not appropriate as they generally dont move about, they just change state).

This bug was very hard to initially detect but was noticed by Planimate sometimes using more CPU than at other times for exactly the same animation.

  • Debug Options and Class Name dialogs now stay on top of the main window
  • Any broadcasts sent during a background event (timer tick) are also processed in "background" mode [not tested - should avoid broadcasting in a timer broadcast handler anyway]
  • Items have a new option "Auto Rotate" which rotates the item bitmap according to the direction it animates.

This makes use of the new icon rotation capabilites.
Unfortuantely due to a bug in Windows NT/2K/XP which Microsoft could not give a damn to fix (they've known about it for 4 years), the rotation messes up the mask if the icon is rotated exactly 180 degrees. I've been unable to find a *reliable* workaround for this (short of abandoning buggy closed source Microsoft Operating Systems) so I've disabled the rotate functionality for now. Eventually I'll do the rotation another way.


[advanced:for technical/dubugging reference]

  • Animation timing delay no longer involves a message pump. This gets rid of one source of potential event re-entrancy, the timing is more stable and Planimate uses very little CPU during animation as its not spinning a PeekMessage() loop.
  • Animation/screen update "dirty regions" and icon saveunder/restores are now processed using windows co-ordinates not iFlow co-ords. This is to support blit-time icon transformations such as rotation and future others.

Dirty rectangles which mostly overlap are now merged since blitting large regions is fast these days.

  • Animating Icons (which Planimate items inherit from) have been rewritten. Single item animation is now much simpler and uses double math. Multi-item animation has been cleaned up and is more straightforward.
  • Animating icons dont need to allocate a saveunder struct anymore, they contain one. This greatly reduces memory manager activity where there is a lot of animation and will reduce the memory throughput values in the memory manager statistics.
  • Saveunder code (eg: dragging objects about) rewritten; handles rotated rects properly.
  • Animation manager algorithms extended to handle changing object icons more reliably
  • scroller overlay graph change: (re-enabled scale update for column overlay graph even if scroller hidden)


  • added a new system attribute (Display) "Timer Broadcast Interval" which lets the modeller change the timing interval of the "_Real Time Tick" broadcast. A range of 10ms (100 times a second) to 1000ms (once a second) is now supported.

100 times a second will be too fast for slower systems so be careful on using the faster rates.

  • fixed routine editor
  • title
  • ESC key handling
  • buggy cancelled add of a new routine line
  • replace attribute routine att browsing
  • trace animation no longer applies to "background" broadcasts like network events, background continues and the timer tick broadcast.

Animating these BC's isn't helpful as they are real time; the modeller can still put force a screen change in the routine handler if they *REALLY* want to trace that BC.

  • quite a lot of internal rework of dialog/window code (system wide) so
  • button focus handled properly with TAB in modeless window
  • keystrokes properly handled (particularly ESC) when focus is on a button etc.
  • application properly closes modeless windows as soon as they are closed by the user
  • form positioning code reworked to handle resized form and button base row placement

Since PL doesn't have many modeless editors yet existing dialogs should not be affected.
please immediately report and messed up dialogs or key handling as a result of this EXE


  • fixed bug in toolkit which caused keys like ESC and ENTER to be sent twice to the application, this created a bug when pausing a model with these keys then attempting to continue, the model would immediately pause again.
  • The clock updates without any flicker at all now even for high update rates
  • New System Attribute (Display submenu) "Animation Update Interval" enables a model to control how often animation updates occur (0 sets none, model advances to model events only). See note below.
  • Note that


changed the way the Animation Update Interval is handled.

Planimate now always delays a minimum of 15ms every animation update interval regardless of whether there is item animation or not. This makes model time flow more smoothly especially if time based portal animation is being used.
(previous versions did not always perform this timing delay)
If a model spends a long time without animation which you want to skip, you can now set the animation update interval system attribute to make the model advance without showing the "Advance" dialog.

  • New INI file attribute in the [Display] section "DebugStepSpeed" sets how many 15ms intervals to delay between steps, default is 10 (=150ms delay between steps)


  • less overhead if the real time tick broadcast is not referenced


  • new broadcast "_Real Time Tick"

This is sent as a background broadcast to the model 10 times a second even when the model is paused, a dialog or popup is open.
A model can use this broadcast to update object icons and perform low overhead background activities. With portals cycling states, nice animation effects can be incorporated into a model.
It must not generate a model error, cause a screen change or other major event.
It is not a good idea to view the item animation on the panel processing this broadcast unless the animation speed is set very fast. The model will be hard to "stop" but not impossible if CTRL-T is held down.
If the processing of this bc takes too much CPU time the application will become very unresponsive.

  • new routine editor is now modeless

Features include:

  • the routine list can be resized and PL will remember its posn when it opens
  • multiple routine lists can be opened and left in position while the model is edited further
  • runs can be started with the routine editor open. PL will animate the steps of any routines executed
  • during animation of steps the "Pause" menu has options to force a breakpoint and show routine attributes at whatever routine line PL is currently at
  • step editor keeps routine list in sync if navigating between steps (new steps dont appear in the list until they are committed)
  • step editor remembers its position
  • step context menu enables jumping to the start and end of the current "Block" within the if/while/iterate/case structure
  • cancelling an add doesn't edit the previous step that was there
  • have reworked object redraw code to change object icons with FAR less overhead especially if the dimensions of the icons are not changing
  • portals have a new option "Monitor Occupancy Of Subsystem"

With this option on, the portal is kept aware of items entering, leaving and being created within its subsystem (and subsystems within if their portals also have this option on).
This enables the portal to indicate its "occupied" state when there are items inside.
It is also used to limit access to the portal if the "Use Subsystem Total" mode is selected for portal item limiting. However this monitoring also adds overhead to the simulation and hence hasn now been made optional.
If the model does not depend on the automatic portal state, the portal occupancy ocunt or portal item limiting based on "Use SubSystem Total" (the other modes are OK) then this option can be turned off on the portal for a performance boost.
This option is on for all portals in older models to retain compatability and on for new models as the portal state updates is good for beginners.
If this option is changed, Planimate will offer to apply the change recursively to all portals under the current one being changed.

  • bugfix: icon browser doesn't remember older DB name when model is saved if the DB name didn't start with a "_"
  • bugfix: memory leak closing a model if a table view was still open


  • fixed multiple run logging (was broken from K)


  • Fixed popup window management bug so when a "keep front" popup is closed the main window should stay at front not another applications

(bug was trying to make a child window frontmost because of a missing virtual function declaration for BringWindowToFront() so wrong fn called )

  • Added new time field format: Calendar YYYY-MM-DD HH:MM:SS
  • data set file calendar times are annotated with the date in a readable format

(the number is the # of seconds since 1 jan 1968)
If a date conflict occurs when loading a dataset from a routine operation, the differing dates are shown in the error dialog.

  • table editor allows resizing to much larger tables now but if you dont have the RAM to hold it, it will exhaust your system RAM!

(tables occupy 8 bytes per cell if they have no cell specific formatting + about 150 bytes overhead per column)

  • Table views have a new option "Single Click Cell Edit" which causes a cell edit when a cell is first selected instead of having to click it twice


  • fixed crash bug when setting format of a table column to free text in a routine
  • text imports properly into columns formatted for free text when importing from the table editor


  • Tables can be migrated to any dynamic panel that doesn't contain a table with that name, both up and down the hierarchy.

Any existing views in dynamic panels are left intact and pointing to the table, wherever it ends up (possibly violating the scoping rules) but new views cannot be added or pasted in a place where the table is not in scope.
This can lead to confusing models especially if multiple tables in the model have the same name. If moving tables around, aim to clean up its views to follow the scoping views.

  • gantt graphs have an option to "Align Row Labels At Left"


  • routine operations to set view port pos and zoom

These are under the "Display" submenu.
The routines take 2 panel references to identify the viewport, the first is the panel containing the viewport and the second is the panel the viewport is viewing.
The first panel must be specified using an attribute (eg: routine) formatted for a panel reference. Its not possible to specify using a hard coded panel reference (this is because the other 3 available "parameter" attributes are used to specify the viewport panel, x and y scroll offsets)
To update the viewport display you need to navigate away and back to the panel containing the viewport. A display redraw doesn't work (yet); this will be addressed in a future version.


  • fixed Crop/Trim Label routine operation.

It was not properly terminating the string, possible appending random junk to the end of the trimmed label


  • "Lock Drawing" is disabled automatically if an item is animated on a visible panel, in order to prevent the animation manager crashing.

Lock Drawing is intended to prevent graphs/charts/tables from flickering not to prevent items animating.

  • Deferred Drawing option for Log Driven Graph displays prevents the graph from drawing incrementally. This option only works when the run engine is active


  • column overlay displays properly with scroll bar hidden


  • gantt, train graph and log driven graph can also have broadcasts associated
  • For portals in track networks:

The existing "Track Junction Lookthrough" option has been renamed as "Route Step Lookthrough". This more accurately reflects what the option does; ie: looking ahead on the intended route of the train to check the sections are available.

  • Have implemented a new option for portals used in track networks:

"Act As Junction"
When this option is on, all connecting sections to the portal are treated as logically one section, even if they are not going to be used by an approaching train. Hence with this option on, the sections connecting to a portal can only be accessed exclusively and this is extended past any loops acting as junctions and other portals with this option set.
"Act As Junction" takes precedence over "Route Step Lookthrough" if both are set for a given portal. Mixing use of these options in close proximity of a track network is not a good idea due to the different nature of the look aheads; an "Act As Junction" lookahead wont explore "Route Step Lookthrough" portals.


  • Column overlay views can have a broadcast associated with the time scroll bar. When the scroller window is resized or its form is used, it can send this broadcast. Item attributes set are: _pos = time offset/position _width = width of the window

Other graphical views will get this functionality next version


  • Table View Scroll Broadcast: The platform will no longer send redundant broadcasts if the scroll hasn't changed
  • data set objects are saved in this order:

label lists sub label lists attributes tables

  • sub label lists can be selected and saved into a dataset and will be reloaded from the dataset.

It is strongly recommended that if you include a sub label list in a dataset, you also include the parent label list unless you are certain the parent label list will not be changing.

  • fixed long standing bug with pipes.

An extra pipe iteration was occuring at the start of the run, before run start broadcast was sent. This meant pipes could be contaminated with stuff from previous runs (ie: not starting totally empty) depending on the state of the end bins at the start of the run.

  • If an old model with invalid attribute names is loaded, details of the renamed attributes are now also logged to the planimat.dbg debug log file. This file is created in the initial working directory from where Planimate is started.

This file is cleared each time planimat.exe is started.

  • Debug Options: Added pipe attribute tracing


  • support transparent backgrounds on buttons column overlay views log driven graph views gantt views train graph views

so they should repaint propely when they change.
This comes at a price of speed; when these views are transparent much more processing is needed to redraw the background behind them.


  • table horizontal and vertical scrollbars can be hidden on a view by view basis

Scrolling still is possible using the keys and routine control

  • The table column setting "Column Title Rows" can now be 0 which will not show any title rows for the table
  • Have Implemented GRADIENT FILLS for paint rectangles and buttons

This should allow some very pretty interfaces
1. Gradients are specified by 4 additional colours to the standard "background" colour, one for each corner of the rectangle. The "Graphics" settings dialog shows these four colours in a square arrangement.
2. If these 4 colours are set identically, the standard background colour is used regardless of the colour the 4 gradient colours are set to. Otherwise the gradient takes effect and the standard background colour is ignored.
3. Picking a colour using the "Background" button also sets the 4 gradient colours to that colour.
4. !!!! Win95 does not support gradients, the normal background colour !!!! will always be used. Also 256 colour display modes are not !!!! tested and the display probably wont be very nice on these.
5. Currently gradients do not work properly for graph views. This is because graphs refresh only part of their window area to avoid flickery redraws as they update.
(Same applies to table views)
However there is an unsupported hack enabling the use of a gradient in graphs that do not animate and that the user doesn't scroll directly. First select "None" as the background colour then set the 4 gradient colours. I've not tested this on all the graph types.


  • can add item attributes from within a routine. If in flow or interaction edit, that class is selected. If an object has multiple outgoing flow types, then PL prompts for a class selection first.
  • Table views can now send a broadcast when they are scrolled which can be used to keep other table views in sync (must be different tables)

The tuple includes _rowscroll and _colscroll attributes (use Help->Broadcast Tuple Reference for this info)
The demo model "Table Scroll Broadcast" is on idBase as an example of how to do it.

  • fixed crash bug when copying object and object stats in a multi-selection. Even though they can be multi-selected, object stats are not copyable, the copy of the object stat only happens when the parent object is pasted.
  • Pipes have a new attribute "Output Scale" which scales the outgoing material as it gets dumped into the pipes output. This enables rescaling of quantities to occur without separate calculation logic.

If the pipe is run in reverse, the scaling is then applied to its input in reverse, hence keeping the total amount of material in the network consistent

  • BUGFIX: on-sort broadcast would be lost or become table click broadcast on a copied table view.
  • BUGFIX: debug log when setting paint arrow removed


  • Help menu has new option "Broadcast Tuple Reference'

This displays the different internal broadcast event types and the item attributes that are set when that event causes a broadcast to be sent

  • Gantt,Train Graph and Log Driven graph have a "Table Columns" option in their edit menu which displays the table columns the views look for and whether they are present in the table associated with the view
  • Reverse Iterate routine operation
  • Rearranged system attribute menu flyout
  • Added two new system attributes - table row and table column

This gives access to the rows/column count for the table being referenced by the overall attribute reference. The advantage is that they can be used directly in a row or column index without having to use a separate temporary attribute and a separate routine line to set it.
These attributes can determine a table from:

  • direct references within an attref
  • dynamic table references
  • item table references (if item is available)
  • implied (eg: a sort column attref in a sort knows the target table even though that table hasn't been directly specified in that attref


  • default panel size now 672 pixels. If you have a previous version INI file you wont notice this new default.
  • snapping of objects reworked so the grid follows panel area resizes. Existing models will not be on the new grid but it should be consistent from now on even with panel resizes.

In other words: the grid now aligns with the top of the window so the height of the panel doesn't affect the grid positioning.

  • fixed comma separated values when the value is -ve
  • can read and set position of time scrollers in the graphical table views (column overlay, gantt, log driven, train graphs)

The demo model "graph scroll set" in idBase demonstrates how time offset and width can be set for a graphical view (very similar to setting a table view scroll).

  • changed way double clicks are processed

PL will now wait for the mouse to release after the second click before processing the double click. This makes double clicks and screen change broadcasts work properly without false "pause" messages appearing.
-- Alot of rewrite of scroller code for the graphical views. Look out for any strange behaviour in graphical view scroll handling.


[new file format]
  • new change object file operation to create a folder from a filespec or label name

(if the folder already exists no error is given and the folder is left intact)

  • have reworked file operations in change objects. Operations affected are

[** needs testing with existing models **]

  • rename file
  • delete file
  • copy file

These used to return a result in the first data target attribute (if any).
They now use the error result attribute instead. Older models are converted to use this attribute instead of the data target.
The result codes returned depend on the error. Models must test against zero to see if an operation was successful since different error codes can be returned depending on the operation and nature of any error.

  • "fill selection" now possible in tables if a region of cells is selected. The cells are filled with the value of the selected cell when this option is chosen.
  • System attribute "Multiple Run Count"
  • is 0 for normal runs
  • is the # of multiple runs for a multiple-run session
  • Table columns have an option "Hide Repeated" which causes them to hide repeated values from appearing under each other. This can clean up complex display tables with some columns containing very similar data
  • Fixed bug in table editor, an undo caused the table to lose it row label and colour column settings
  • fixed bug loading model from command line when OS was inserting quotes into the filenames (affected PMB files)
  • showing references from table editor now hides table editor while reference is being shown then restores it
  • Routine operation (Label-String) to rename a label.

A source and target label can be specified to do the rename. If the target list already creates a label with the same name as the renamed label, the target is set to the index of the existing label, othrewise the target label string is renamed and the index stays the same.

  • table resizes and imports no longer update the table editor if its visible so they will occur much faster
  • table editor views properly resize when rows are added/removed to accomodate row labels


  • sped up scrolling of table view when scrolling to end of very large tables
  • fixed very nasty bug which involved viewports, hover bcs enabled in the vp and table views in the viewport. The hover bc "closing" code was reshowing the viewport when it was trying to shut down, causing a subsequent table update to try refresh a table view with a non existent window.

This produced a few "invalid screen" pointer warnings followed by a crash.

  • out of screen table editors are now brought back into the screen area This could happen if the model was edited with a system with high resolution or split screens then opened on a laptop with low resolution.


  • Distribution dialog enhancement - CDF (continuous cumulative distributions) can be associated with a Planimate Table (as can PDF). A new attref mode "CDF" enables the selection of a table and the column which will provide the probabilities. Column 1 of the table provides the target values.

A CDF is different to a PDF in that:

  • instead of returning individual points, it interpolates between them according to a uniform random value (0..1) and hence the returned value is continuous.
  • instead of specifying probabilities as percentages per point, a cumulative sequence of probabilities is specified. This must be increasing in row order and should start at 0 and end at 1.

The following example table will produce a distribution with 25% of the values between 0 and 5 and 75 % between 5 and 10.
0 0 5 0.25 10 1.0

  • set table cell colour property now fixed (broken in prev version by a bad double->int cast)
  • deleting a selected viewport no longer crashes platform
  • new INI options for table titles added, fixed string bug in INI which noone should have noticed (yet)


  • I've implemented a PLANIMAT.INI file to store defaults for modellers.

The file is stored in the same folder as PLANIMAT.EXE.
The INI file is read whenever a "new model" is created or a model is loaded. (Settings in the loaded model will override INI file settings)
If an INI file doesn't exist, it will be created.
After Planimate reads the INI file, it rewrites it again so newly added INI parameters in the current version of Planimate are made available to the modeller for editing.
You can use NOTEPAD to customise settings in the INI file. There is only a few at the moment but now the framework is in place I'll be able to expose more defaults in this file so a modeller can customise the platform to their liking.
=== In the future watch out for this: === If you use an older version of Planimate which knows about INI files (ie:


or later) with an INI file created with a newer version, any settings added by that newer version will be removed from the INI file by the older version of Planimate.

These INI files have nothing to do with model INI files. Models must not use PLANIMAT.INI for their INI parameters. Any older models relying on PLANIMAT.INI for this purpose must be changed to use a different file name.

  • The old registry entries for RoutineEditorWindow Width and Height are now stored in this INI file instead. The registry keys for these will be ignored in this and future versions of Planimate.
  • pasted model objects now also follow grid snap
  • broadcast exit gets name set to the broadcast, as for BC entry
  • "dont initialise run" broadcast buttons fixed, were broken in recent broadcast rework
  • RTF views now support CTRL-B,CTRL-I,CTRL-U for bold/italic/underline and support "Find" (CTRL-F) and bigger notes.
  • no longer crash on selecting column heading menu for totally empty table


  • changed grid snap
  • paint objects are pasted at snapped lowerx/y co-ord
  • newly formed boxes have all 4 sides snapped to grid
  • routine printing reworked
  • pages are now printed as queued, whether in the one routine or within the _page printed notification broadcast.

This fixes a bug in printing different panels within the _page printed broadcast handler

  • when an entry is in broadcast mode, selecting a broadcast renames the entry to the name of the broadcast
  • z-order/multiple screen fixes for:

Z order fix: Edit-Labels Edit-MultiLabels Edit-Broadcasts
Initial Position: Table Editor initial position Objects/Items palettes
These are now based at the top left oc-ord of the Planimate main window so they appear on the correct screen in a multi-screen system.


  • Create Label List From Column has been enhanced.

IF the target is a COLUMN formatted for a label list, then indicies in the target are filled to match the indicies of the labels added to the label list from the strings supplied by the source column.
In this mode, labels are not repeated, if a string already exists, its existing index is used and placed in that row of the target table.
The target table column must have the same # of rows as the table providing the source strings.


  • Fixed rectangle calc bug which caused a row of junk pixels between the status line and the Planiamte model area
  • Fixed a long-time bug with box buffer handling which caused moved or resized objects to jump to strange sizes and locations, very easily noticed with viewports
  • Popup windows with the "Ensure Visible" option on should now properly crop to the Planimate work area when the windows have no caption bar (and are hence child windows rather than independent windows)


  • Fixed ordering of hover scanning so topmost portals sense the hover broadcast first


  • I've changed the way most tuple broadcasts are sent (eg: table click, gantt click, graph click, sort complete, button state

These all need retesting to ensure I haven't broken them.
The change was to properly use the default BC handling of clearing side effects rather than forcing a specific continue/pause after epoch to achieve the same thing.

  • Portal Hover broadcasts now properly handle re-entrancy, previous version could easily crash as hover broadcasts are sent even during item animation.

Also made them process in background so hovering doesnt cause mode change flicker

  • fixed mouse reading of co-ords for portal hover and have implemented a fix to prevent double-events when a popup is opened due to the broadcast

(see HOVERPOP.MDL in note [#116] )


  • Hover broadcasts added for portals [#116]


  • Fit panel to model area now ignores hidden objects when computing the bounding rectangle
  • New time format displays relative times without seconds (if seconds are present on input fields it will still read them though)
  • First row for file reads now supported for attributes as well as tables. This allows rows to be skipped in a file when the target is an attribute
  • fixed bug in pause handling in


(If continue flag set, model would pause after current epoch)


  • Added button action to open table editor
  • these currently dont get updated if tables get renamed
  • they dont allow access to tables not in scope

These are intended to help in debugging. They have a slightly smaller memory footprint than a table view and (unlike a table view) no impact on table processing speed if a view is not open.

  • Fixed Trace Animation system attribute (started it ok but didn't stop it)
  • fixed Pausing issue with broadcast buttons with the continue run option on. They no longer do a separate continue to clear zero time events if the modeller has indicated the run should continue after that broadcast.


  • Have reworked the control keys

CTRL-B (screen history navigation) now has the following action:

  • if at front of history list, steps back one

eg: A B C D [E] => A B C [D] E CTRLB

  • if not at front of history list, the current screen is put to the front of the history list and the previous one is selected

eg: A B C [D] E => A B C [E] D CTRLB
The effect of this is that CTRL-B now acts like a toggle between current and previous screen viewed but in addition if its used along with CTRL-F and CTRL-D (forward/back through screen history) the screens can be re-ordered to put screens of interest into close proximity with each other when CTRL-D and CTRL-F are used.
eg: A [B] C D E => A C D [E] B CTRLB

  • message dispatchers have a new option

"Dont Copy Back Message Item"
When this is selected, the attributes/carried items of a destroyed message item are NOT copied back to the original item when it leaves the dispatcher.

  • navigating panels in browser no longer adds them to the history list
  • Added show/hide table editor routine operations (under display)


  • fix database model DB read (properly)


  • made pausing even more agressive - continue flag will no longer be set if a pause flag is already set
  • fixed bug introduced in "u" which caused model DB to be ignored


  • new control key shortcuts
  • CTRL-B or CTRL-D = back in history
  • CTRL-F = forward in history
  • CTRL-U = Flow mode (old ctrl-f)


  • a number of bugs with empty tables and selection tracking and the menu options have been cleared up to prevent operations on empty tables
  • Implemented multi level go back on CTRL-B (back) and new CTRL-V (forward) Stack depth is currently up to 64 screens.
  • If a thread ends in a "pause run" exit, any "continue run" set by will be reset. This only applies if the continue event hasn't already been posted to the FEC.
  • (Interdyne version only) - set default DB to point to _data.db specifically since it cant create an empty interdyne.db anymore and complains.


  • paste/append for cell edits. Note that this always appends the copied data at a new row and starting at column 1
  • Added support for Rand and Euro money formats

(the Euro symbol may have problems with some codepages, let me know if it doesn't appear properly on your system)

  • index across/down now handles incrementing calendar dates intelligently.
  • the input field accepts value formats like 10d, 1W, 1M, 1Y etc.
  • indexing by 1M or 1Y for example is recognised and the dates increment properly
  • indexing by units (treated as seconds) or days (eg: 100d) still works as expected
  • can index by a negative time period
  • Window option "Fit Panel To Used Area"

Resizes the current panel to fit around the contents, allowing for a margin which can be specified in a dialog which appears.
(not supported for dials)

  • Click-dragging in the background in object edit mode will select all objects which completely lie in the region dragged over (includes paint and views as well)

(not supported for dials)

  • Viewports support shift clicking, dragging, copying
  • fixed crash bug when a track loop was selected in a region and the region was deleted (these cannot be deleted in a region)
  • Have reworked panel code to reduce allocation overhead for paint, viewport and view management lists. This will benefit models with many portals


  • a newly added random distribution defaults to "units" for the parameters unless a time is specifically entered
  • A new unit mode 'v' can be specified in a value input field (creating attribute, specifying distribution) to force a switch to "Units" mode.

Previously once PL got into time mode, it wasn't possible to get it back into units mode.

  • fixed crash bug in modeless Table Editor (uninitialised variable) which caused crashses when double clicking or selecting "Edit Owner" on a view
  • fixed bug in time routines which caused fractions of seconds to be lost when in time mode
  • fixed Last file path option now appears in the menu


  • Last file path system attribute (warning:dont try assign to labels, path may be long)
  • fixed table editor bug in Q (wasn't properly checking for pointer when applying updates to editor, causing crash on some models)


  • Modeless table editor Editor appears in separate window, can stay open while other parts of model edited Need to implement lockouts for some edit operations during run so be careful (eg: not good idea to rename a table during a run)
  • User socket config - user can toggle socket between client and server mode


  • Fixed bug when saving model as a stand alone application or bundle The model was not being stopped first, if the run was active it could lead to corrupted date data.
  • Fixed bug (introduced in


, hover broadcasts) which caused PL to crash if a model error occurred during initialisation of the model and you used the show location button. While the location was being shown, a message was being processed which stopped the engine before it had finished initialising.


  • fixed bug with DB loading introduced in n
  • added missing buttons to socket config form


  • Now support sending a broadcast when a hover change occurs in a button
  • Now support saving and loading PMB files which combine models and their databases.
  • Fixed mess bug due to drawing triangles (arrow heads) - wrong array size
  • Fixed crash bug when using dynamic object deletion - was using delete object to look up its manager.


  • Fixed dialog handling of non editable label fields (they became editable when added calendar field)
  • Added display options to enable hiding of file name/panel/status indicator in the status bar when in user mode
  • Default new window width/height has been increased to something more contemporary (1020 * 674)


  • made it possible to use "SET" in a routine operation with the source and target being a label list reference. This allows a label list to be quickly copied (names and values).
  • cancelled file selection in change object file read or write returns -1 if a result variable is used


  • Enhanced error trapping for change object file reads, catches more data errors rather than stopping the run. Search on "File Access".


(vc build)
  • fixed crash on close for a model. Model used multi label list which contained a sub label list but I was deleting the sub label list first, causing the multi label list to crash as it cleaned itself out. Didnt cause crash with the SC compiler but a good one to be rid of).


  • pause animation menu enables debug options to be changed while an item is in flight - very useful for debugging graphical logic
  • Routine button now shows popup menu to enable selection of either viewing routine atts (like previous) or exporting routine to a file and opening it.

  • save on exit could occur randomly due to uninitialised variable
  • track restriction check was broken and always would return "restricted" when it shouldn't messing up decisions in lookahead
  • have fixed time calculation bugs in operations like "day of week" and "month of year" when the time is a -ve number (eg: times before the current model start date)


  • Adding text window to dialog box now prompts for text
  • if a table column is formatted for labels and the "default width" dialog is confirmed, the column title is now left-justified by default. This can be changed by editing the column.


  • hover state disable option for button states


  • fixed animation bugs when mouse is clicked while animation is occuring with the "Enable Mouse Clicks While Running" option on
  • Routine editor for DeleteRow/DeleteCol now will set the "count" to the Row Count / Col Count for the selected table.


  • "_panel closed" broadcasts now get sent to all closed panels including popups and viewports, when they become hidden.

As with other system broadcasts, if the panel is a view panel, the broadcast is sent to the nearest owning dynamic panel.


  • Popup item details are always fully written to the _PLError.Txt file
  • New tables default to having 2 title rows enabled


  • New System Attribute "Last Stop Reason"

This returns a numeric code describing why the run/engine stopped LAST time. This can be very useful in handling error recovery and may make handling "just loaded" situations easier than using the "_model loaded" broadcast (but that BC is still available). Also very useful in handling restart dispatchers since the model can easily know that a "control" item will be present.
The current codes are as follows:
0 Loaded/No Previous Run no previous run, model just loaded or created 1 User Stopped Run user selected stop from menu/keyboard 2 Model Stopped Run model self stopped (exit, posted stop message) 3 Platform Required platform stopped run (closing, load/save model/scenario, editing time ref) 4 Error In Model/Engine error in model or runtime engine 5 Broadcast Option broadcast set to stop 6 UI/Portal Click Option user interaction: portal clicks, 7 Restart Dispatcher restart dispatcher restarted the run (item preserved)
I've added a label list to name these codes.

  • Have implemented fine timing/profiling of a model's run. The tests give microsecond accurate measurements. These results (when enabled) appear in the report generated by the "Show Run Profile" menu option.

The debug option "Enable Event/Routine Profiling" causes Planimate to keep track of the count, average run time, peak run time and total run time of:

  • FEC events, the time scheduled events which initiate item movement, unblocking etc.
  • Individual routine operations, summarised by individual operation type (eg: Set, Increment, Search, Dialog etc...)

These stats go a long way to identifying where a model's run time is going.
Note that enabling profiling causes a model to run at about 60% its normal speed, this is due to the large overhead in calling the system to fetch the fine timer count.
Profiling must be enabled BEFORE the run is started, setting the option during the run has no effect until the run is restarted.
There is quite a bit to say about the operations and the relevance of their times, here are some initial observations:

  • the peak time for an event may be quite large. This can occur if Windows pre-empts Planimate to run another task, the system performs network activity, the event involves animation or a dialog, or data is swapped to and from the swap file during that event.

For meaningful results try perform profiling with a lightly loaded system, as much free memory as possible and without animation. Use the the "advance to time" feature to ensure as much CPU time as possible is spent within the model you are trying to profile.
Be aware those taskbar icons, especially the "fast-starts", network monitors, virus scanners and other "helpful" utilities all consume system RAM and steal the processor occasionally so they can update themselves. This can lead to huge one-off peaks for otherwise fast operations, lasting from 10 to 500ms.

  • Using "advance to time" on a panel without spatial links seems faster than on one with them, will have to investigate this.
  • the profiler quickly identified that row inserts were taking ages (20ms average) compared to everything else (20us). It turned out the insert was on a debug table with 170000 rows and 5 columns in it, ie: a 6.8MB shuffle each time.

An append to a big table will be faster than an insert at row 1. Same for row deletes, deleting from the end will be faster.
(btw:block deletion is optimised so use it instead of row by row)

  • Iteration/ifs/whiles will tend to have a large time since PL is spending a lot of time processing within them. The results are cumulative so a nested iteration will lead to a large iteration total time.
  • A large average time for "Set" could indicate Planimate has to swap to get to data (running low on memory)


  • ODBC Data source can now be dynamically looked up via an attribute/label list

If the DSN starts with a ":" the following text is interpreted using the same mechanism as the ODBC attribute parser, hence
":pMyAttribute" will use the formatted value of portal attribute "MyAttribute" as the DSN name.

  • Table Driven Entries and Dynamic Table Column Add/Remove:

Table driven entry will no longer cause crash if the "_time" column is no longer valid. However it will NOT track movement of the time column once the run has started.
Hence if using dynamic columns with table driven entries:

  • Ensure the time column ends up in the original position as at the start of the run whenever columns are manipulated
  • Dont manipulate columns in the table unless the table is empty (no rows)

Otherwise the table driven entry may produce spurious items

  • Fixed labelling of Activity State system attribute


  • I've changed Dialog forms to be ownerless topmost. This means they always appear at the top of any other windows/popups but they dont have an owner so they shouldn't mess up the Z-order.
  • RTF notes now are placed in a stand alone application.

Required some rework of way RTF notes and DB file is handled, look out for any probs.

  • Breakpoint dialog now has a "Debug" button enabling debugging options to be changed (eg: trace animation) while still at the breakpoint/current point in the thread.


  • reworked the way the attribute rename bugfix is done to prevent it messing up the model further on load


  • Have fixed issue of attref editor feeding long names to the attribute creation dialog.
      • In addition, upon load, any attribute names which are too long are cropped to the proper length and a warning message is given:

"Model Attribute "name" cropped to 20 characters"
These long names should not have been able to get in there and may cause some of the editors to crash.
Thanks to Matt for helping identify this nasty one

  • Fixed cell stat update problem. This was introduced around


  • breakpoint dialog has option to terminate the run
  • breakpoint dialog displays comment line of routine if available


  • added a new system attribute to limit how deep PL will scan a spatial net looking for the closest target.

The attribute needs to be set each time the model is loaded, it is not saved. The default is 9999999 (ie: dont limit search depth).
Setting this value means Planimate may not chose the shortest distance path in a spatial net if it contains more intermediate nodes than an alternative which is further in distance, and the node limit happens to be exceeded in scanning the shorter path.
This will be obvious in incorrect animation but should not affect the item arrival time. In other words, reducing the search depth may cause PL to chose a route which is not the "shortest". It may also cause Planimate not to find the correct route at all (if it has too many intermediate nodes) in which case PL will report a flow error.


  • sped up allocation of routine change objects
  • sped up execution of routines in "Only During Move" mode
  • sped up portal code (track list management) and less allocation needed


  • added extra check for the "intray" to enable the "drop item" feature to be used at a given tray even if some item classes dont have the "drop" attribute defined. As long as there isn't an outgoing flow for this class, an error wont be produced.


  • no functional difference but many renames of internal modules. Im releasing this to ensure no strings have been messed up, look out for any funny titles or text in menus, forms.


  • have reworked FEC management for zero time events

The FEC now will order zero time (immediate events) as follows

  • Broadcasts - have top priority (including item and system info BCs)
  • Moves and Unblocks
  • Clock resetting/restart
  • Button clicks during animation
  • Other events (0 delays etc)

The idea is to process as many activities as possible (eg: handling BCs) before making move and unblock decisions based on the side effects due to attribute/table changes.
This (hopefully) starts to bring some order into the otherwise murky world of zero time events. You still must not depend on the order of BCs being processed, unblocks and moves being performed etc.
Let me know if the new rules raise issues with models, particularly interactive ones

  • have reworked tuple allocation/memory handling. The previous version did not handle multiple tuples of the same type properly, which would have caused problems with multiple pages printed, tables sorted etc. if you used the broadcasts returned values.

This was required to get the table edit BC working properly.


  • tables have an option to send a BC whenever any cell in selected columns is modified by any means. The bc sent includes the _row and _col of the modified cell. The routine can use this information to update data, summaries etc.

If a row/column/shift operation caused the change, then _row may be 0 (indicating potentially all rows are affected) but _col will always be properly set because separate broadcast will be sent for each column with this feature selected.
In other words, a separate BC is not sent for every cell modified but only for every column modified.
To use this feature:

  • In the table editor, use the [Table]->Advanced->Recalculate Broadcast menu to select/add a broadcast.
  • For each column that you want change notification, enable the "Send Recalculation BC" option.

The broadcast is sent to the dynamic scope of the table, with item attributes _row and _col set as described above.

  • fixed bug in msvc handling of RTF notes

seems VC does not automatically flush contents of a stream when the stream is deleted. I do an explicit flush() which seems to fix it

  • label name drop down in attribute editor is now sorted by name for all label list types. This is independent of any setting for the label list.

(let me know if this causes a delay problem with very long label lists)


  • Popup forms (like the popup selection list) now lock a parent popup from closing while they are up, to prevent their owning popup disappearing before they do.


[new file format]
  • I've implemented bulk row deletes in the internal table data structures and updated Planimate table handling to make use of it.

This will make deleting a large number of rows (using a single delete row operation) from a very large table very much faster than it used to be.

      • Look out for any problems with tables when row operations are involved.
  • Display option to hide dataset load/save menu items even if datasets are in use
  • popup panels are now properly sized when the subsystem they view has a display zoom factor set on it
  • Fixed a bug in window/scrollbar management which caused unnecessary margins when a panel was zoomed to a size bigger than the display screen
  • Fixed a bug which caused dynamic table refs replaced with standard table refs to not properly forget their P3
  • Paint buttons have an option to prevent them highlighting when clicked


  • fixed handling of table cell-specific formatting, was not properly handling default format in the new editor when other cell properties such as colour were used
  • holding down control key as model loads prevents run on load, if user has an editor key only.
  • internal rewrite, should not affect PL have reworked window management code. Cleaned up basic screen drawing code. Forms now inherit from Screen() and support scrolling, menu bars


  • another closing bug fixed. This one occurred when trying to close a Planimate application which had the File Load/Save options disabled. Planimate used this flag to determine if a modified model *could* be saved, and it coudln't, it considered it a failed save and refused to close.

I've changed it to this now: If you CLOSE PL with a model in Application mode and with the "Hide Load/Save Menu Items" option ON (the default is OFF), then any changes to the model will not be saved - even if you use an editor key.
While editing a model I suggest keeping this option off and only activating it when shipping to a client.
Heres a summary table:
EXE/KEY/MODE Can Save By Menu May Save On Close --------------------------------------------------------------------------
Full/Edit Key/Editing YES YES *3
Full/Edit Key/Application *1 *2 *3
Full/Run Key/Application *1 *2 *3
Interdyne Build/ NO NO
Stand Alone Application/ NO NO
Demo EXE (any mode) NO NO

  • 1 Only if the load/save menus have not been disabled by turning on the "Hide Load/Save Menu Items" option.
  • 2 Planimate will offer to save any changes unless the "Hide Load/Save Menu" option is on in which case changes are not normally saved.
  • 3 IF the model uses "Save And Close" or the /SAVEONEXIT command line option is used, the model will be saved.
  • fixed bug in password handling, introduced in F due to a side-effect of changing the way a function is called.


  • fixed bug in right align option for paint buttons
  • bogus message on CTRL-SHIFT-H bug for standalone EXEs fixed
  • Now we have the Save As Application functionality, I plan to drop support for "INTERDYNE" compilation builds.


  • now properly handle closing a stand alone EXE. Previous versions would not close if the model had changed which could not be saved by the EXE since saving is not available.
  • now display the following message if a close box [x] is attempted on a running/animating model

"Cannot close, a run is in progress. Pause or stop the model first."

  • The "pause" menu which appears when a click occurs during animation is now suppressed if the "clicks while running" option is enabled. The right button can still be used to display the pause menu.

The background menu can be disabled altogether using the "Dont Show background Run Menu" option.

  • Updated paint button's "visible" handling to make it consistent with other objects. "Hidden" PaintButtons will now hide when running in editing mode as well as in application mode.
  • rearranged paint button menu to make it clearer that certain options apply to each state.
  • buttons can be right aligned
  • Have slightly reworked the random number generator code. Run results should still be the same as in previous versions.
      • Note *** I'm planning to switch to a 32 bit version of the current random generator (which is 16 bit), which will yield a much finer value granularity.

When this is implemented, model runs depending on random variation will change in behaviour due to the different random sequence. This future EXE will give a warning to this effect when an older model is loaded.
Let me know if you have any comments on this.


  • fixed RTF redraw bug which caused PL to consume CPU when an RTF note was redrawn. This is due to the new RTF note library requesting a redraw at an unexpected time, probably to implement transparency (not avail in PL)
  • more internal editing, window co-ordinate function names have been cleaned up, part of fixing the RTF redraw bug.



However we've put a lot of work into updating the source to work on a different Windows compiler. Model file compatability is same as


so if you find a difference between




, please report it.


  • old plain text notes will no longer save after an edit - convert to RTF notes. New ones have not been add-able for a while
  • porting to new compiler, look out for any strange behaviour particularly in the editors and option selection


  • Implemented basic string operations for labels:

Append To Label - appends a formatted value/label to a label Crop/Trim Label - extracts a substring of a label name Remove Label Extention - assumes label is a filespec with an extention, removes the last "." and everything following.

  • have created new routine operation flyout "Label/String" and moved some of the label operations which deal with string issues there as the label flyout was getting too big


  • New Display Option "Enable Mouse Clicks While Running" enables buttons to be selected while the simulation is running (not paused).

This works as follows:
A click on a button is processed whenever Windows gets an opportunity to process an event (Planimate yields to it). The button will visibly react to the click but the click message will be posted to the model FEC to be processed as the immediate next event.
The result of this is:

  • models which are routine intensive (eg: searching) will be rather unresponsive to the mouse whereas models with animation will be OK
  • models which have zero time logic without ANY capacity or intensive routines will take a while to get round to responding to the mouse click
  • The button clicks can occur and be processed before the completion of side effect actions as a result of the current operation.

This last point is particularly important. I may have to disable buttons which can influence a model's run (eg: broadcast) or handle them specially but this has not been implemented at this stage.

  • "Free Text" is now a value format mode rather than a table option. Only columns will work in free text mode, its not supported for attributes and individual table cells.
  • have completely rewritten table cell edit code to clean it up

Cell views now display and can be edited in free text mode.
All Table cell editing/Cell View editing needs to be validated to ensure I've not broken anything (ie: formatted value, label list, time dialog and free text) - it seems OK to me.
This rework will make enhancing editing of table cells much more straightforward

  • Compatibility Window MOVED

This version of Planimate will only load models saved with version


or later (model file version 306). Keep an older EXE to translate up old models.

This version of Planimate requires at least a Pentium level processor or compatible.


  • data set (scenario) saves now send the broadcast _DataSet Saved
  • changed data set load from the command line to use the same code as the model-initiated data set load


  • added new system-item attribute "Broadcast Receivers". This is set after an item is released by a broadcast dispatcher. It is set to the number of receivers that the broadcast was sent to. This includes all entries which produced an item and all sockets which sent the broadcast over TCP/IP


  • fixed bug causing crash in Find in change objects without a routine


  • The "Find->Advanced" list has a new item to find the instances of a specific routine operation. This can be used to find all times a spatial link target is assigned, a sort is done - anything that is selectable as a routine line operation.


  • Enhancement to Dynamic Object Copy enabling the object label list to be used to specify the location for the new object rather than the panel label list.

In the table defining the copy commands, instead of having a column called "_new_panel", a column called "_target_objpanel" can be used to specify a dynamic panel where the new object will be placed. This is looked up using the object label list.
In some models using the object label list may be more natural to specify a location for a copied object rather than using and maintaing the panel label list.
If both "_new_panel" and "_target_objpanel" columns exist, only the "_new_panel" column (panel label list) will be used. This is not good practice and in future having both columns may be tagged as an error so avoid having both columns in the one table.


  • BUGFIX: Spatial link routine operation "Set Link Target" was not properly clearing an internal item attribute used to track the distance the item is travelling. This would cause the computation of the spatial link time to be incorrect.

The bug did not affect using the system-item attributes to set the spatial link destination.

  • Have increased width allowed for system commands executed as part of a file access operation
  • Have created two new system attributes - Model Name and Scenario File. Numerically these return zero but if referenced in a form field OR using the new "Format Into Label" routine operation, the names can be made accessible to the modeller for display.
  • New routine operation "Format Into Label".

This enables any formatted attribute (including the string system attributes mentioned above) to be placed into a label list and allocated an index.


  • New feature: Create Standalone Application (File Menu).

This option enables a model and its resources to be packaged as a standalone executable which requires no other files to run.
When selected, it confirms that it will save the model before starting. It then:

  • Takes the current running EXE and copies it
  • adds to the copy the model (scrambled to prevent casual viewing)
  • adds the model's database (notes, icons etc)
  • adds all additional icons the model references
  • adds all additional BMPs/WAVs/AVIs/MPGs/MP3s that the model references
  • writes the result as an EXE with the name of the original model.
  • If a file called _APPBANNER.BMP is included in the same directory as the original model, it will be included in the standalone EXE and will be used as the application's about box. A template _APPBANNER.BMP file is included with this release.

Standalone EXEs are like InterDyne EXEs, they can only run in InterDyne mode. They cannot be unlocked into edit mode. They cannot save the model or load another one. They ignore any other DB files in the same directory, the resources are only loaded from the EXE.
Standalone EXEs do not (currently) need a key file to run.
The option should be used with a model which can locate all its icon resources (use display->Show Model Info to check icon and file references). Otherwise warning messages appear (but the build continues).
Media files (sounds, video) cannot be played from within another file. They are extracted to a folder created in the same directory of the EXE, called PL_Media. They are left there once used for future use. Watch out for conflicts if you have multiple EXEs in the same folder with identically named sounds etc which are supposed to be different.
Sounds are only copied into the DB if the name in the reference includes the ".wav" extention.

  • Change to media handling

Planimate can now play media files from within a database. It achieves this by extracting the files into a directory called PL_Media under the model working directory. When a media file which is not in the working directory is first selected in a Paint-Video object, Planimate now offers to copy it to the model's database. If this option is cancelled, Planimate will maintain a HARD full path spec reference to the media file instead. This will make it awkward moving the model but may be useful in a fixed setup/demo if media is being played from a CD-ROM.


Older interdyne builds still attempt to load the icons used in the object palette even though they will not be actually used. If these icons are not available, the InterDyne will take significantly longer to start up, especially if the EXE is on a network share with a large hierarchy under it. This is due to Planimate looking for the missing image files.
This has been fixed with the latest InterDyne build, but this is rapidly becoming obsolete with the save-as-EXE facility.
Showing file references while a paint image object is in the clipboard will no longer crash
Newly created paint images are not counted twice in file references


  • bugfix: time scale interval for a panel can now be set

by default this is 0, if you want to animate a viewport within a panel, the value will have to be set to 1 or a scale factor.


  • minimise option added to command execution from a change object. The option appears in the Options dialog for the file action menu, under the "File" object menu option.
  • fixed crash after model merge

Item attribute names were not being properly merged from the copy model into the loaded models. This would cause them to be doubly deleted when the model was closed, causing a gp fault.

  • fixed small memory leak which occured when arbitrary strings were loaded.


  • Have implemented an option in ODBC Read to leave the database open after the operation. This retains the connection to the DSN. If the same DSN is required again, the cached connection will be used and will be much quicker than opening a new one.

To keep a particular connection open over multiple change objects, each change object using that DSN must have the "Keep Open" option on.
Only one DSN can be kept open, a new one will override an older one.
However if a second DSN is accessed while an existing DSN has been cached AND the KeepOpen option is not on for the second DSN, the original DSN will remain cached/open.
Future Planimate versions may support caching multiple DSNs.
A modeller should close a DSN (by making the last access to it from a change object without the KeepOpen() option. Not doing so is not good practice and a warning will be logged to the Planimate debug file when the model is closed.

  • App Panels within App Panels can be included in flows


  • Password required to switch out of interdyne mode even with editor key


  • fixed long time bug in distribution pattern dialog which did not allow a stream apart from 0 once a PDF table had been assigned to a PDF distribution


  • fixed bug which caused the big string editor to appear for values as well


  • Fixed some issues with string table cell copying
  • Now support long strings with line breaks for table cell strings
  • Routine operation "force repaint" does not occur if advance time dialog is visible. This will make advance-to-time faster if the model has any force repaint operations in it.
  • Fixed bug in counting of redraws for panel screens


Any subsystem can create an object label reference for its owning portal using a new routine operation Label->Create SubSystem Label.
This is very useful in cases where a parent portal has been dynamically copy/pasted and a portal contained therein needs to also be referenced using an object label reference. A routine executing within this other subsystem can allocate and obtain a label reference for that subsystem and store it in an attribute, in effect creating a "handle" to that subsystem.
This helps avoids having to copy/paste systems in layers in order to get label references to subsystems deeper in the hierarchy which is copy/pasted


I've reworked the way server connections are handled to make the IP code more robust against unexpectedly closed connections


Initial test for initiating a URL read from a change object (FILE operation) no content is actually read from the web server yet.
The "from" spec can either be a file spec, in which case the URL is read from the first line of the file OR a direct URL reference.
In either case INI file mappings are applied to the from file name/URL


(removed older release notes from end of this file)

  • fixed another bug in TCP/IP handling which caused broadcasts to try to send over unopened server connections
  • Table fill/index operations will now stop at the edge of a selected region rather than continuing to end of the table
  • system confirms with user before changing the width of a column after a format change occurs


  • fixed bug introduced in d in IP code acting as client

yyyy-mm-dd date format is now formatted with leading zeros for mm and dd to ensure they are always 2 digits

  • broadcast buttons now support sending a broadcast to the scope of the dynamic panel they are most closely linked to.

This is an option of the broadcast (within the click action) and is on by default for new buttons as it encourages modularity.

  • paint button states are now selected by ID not by their position in the list

Each paint button state can be assigned an ID code. Older version models are assigned IDs 1,2,3 etc. and hence stay compatible.


  • I've implemented a basic web server for Planimate. It will serve simple web pages but its primary purpose is to facilitate Planimate being triggered via a URL, the completion of forms etc.

It will not cope with heavy loads (or complex pages loading multiple images) as it doesn't multi-thread its processing of requests.
To start the server, select Edit/Sockets and enable the HTTP server. Its disabled by default. If you have IIS running on your machine (or any other program already using port 80 to serve) you will have to use a different port #.
Once running the server responds during edit and run mode.
1. At the moment, just entering the address of the machine (I'll use loopback here,, assuming local testing) will yield debug diagnostics.
Eventually this will retrieve a model-default page instead and the debug will have a specific token to retrieve it.
2. Entering the name of a file in the current Planimate working directory (or a subdirectory thereof) will retrieve the file -> retrieves index.htm if it exists
The server will only serve htm,gif,jpg and txt files, for security
3. Entering a parameterised string as follows will trigger a Planimate broadcast (the model must be running)
In this case broadcast "mybroadcast" will be sent using item class "item" and if an item attribute called "attribute1" exists, it will be set to 12345. Many attributes can be set using '&' to append further assignments.
If during processing a broadcast, the model creates/writes to _www.htm in its home directory, this file will be sent back to the client. Otherwise a default _www.htm is generated and served back.
A demo model is provided to demonstrate this.


  • Implemented new time format

This format is used in SQL/ODBC dates



A new type of paint object called a "Button" has been added. This object has the ability to have a number of states defined, with an attribute reference determining which state the object appears in when the panel it is on is redrawn. States are indexed in the order that they are defined (and appear in the state menu for the button) starting at 1.
For each state, the button can have the following properties:

  • the style of border, background, text and border colours
  • the button text
  • the font used for the button text
  • the tool tip text
  • the name of a BMP image to fill the button background with
  • options whether
  • the button text should be centred or left aligned
  • the button text should be top or middle aligned
  • the button should be visible to the user
  • the button should be clickable by the user

States are given names, which are used when inheriting to propagate changes. States added to the parent are added to the children, states deleted from the parent are deleted from the children if they exist. States named unique to the children are left untouched.
I've not implemented and dealt with state ordering issues at this time.
In any case, the paint button will give modellers plenty of flexibility to create and manage dynamic user interfaces with far less complexity than previously.

  • fixed bug with ODBC diagnostic messages - the statement handle was being deleted before the debug message was displayed.


  • fixes a bug introduced in 4.27 which caused a crash if a control-paste replaced the original object which was copied.


  • Log Viewer no longer crashes with log model names
  • Added new dynamic object operation: REPLACE (command code of 3)

In this mode, _original_id specifies the object ID of the original to copy and _new_id must be set to specify the object ID of the object that will be replaced.
The new object will hence get the ID _new_id.
The _x,_y and _new_panel columns are ignored in this mode.


  • Added routine operation for track networks which returns the number of roads a section is representing
  • fixed model save/load bug introduced in


which would cause model file containing section stat views to not load if saved in


or later.
  • Planimate properly detects a disk becoming filled as a model is saved and reports an error message. Previous versions did not perform the test properly since I rewrote file saving many versions ago.


  • attribute report is properly written (was only writing 3 lines)
  • New Feature for Gantt Graph

I've added the option to place lines which connect the blocks in a gantt graph display. These can be used to indicate flow or relationships between the blocks.
To use this feature, the gantt table needs a couple of new columns:
This specifies the row index to which a link should be formed.
Planimate will link to the most recent block on that row (which must appear earlier in the table).
This sets the colour of the link line, default (if column not present) is black.
This sets the thickness of the line, default (if the column is not present) is 1.


  • clicking on a broadcast entry in paused-model editor mode now prompts user to produce an item (ie: act like a click entry)

This can be very useful when debugging a specific flow without sending the broadcast to everyone.

  • sub label lists "Sort By Name" option is now implemented

If on, the popup of labels from a sub label list is sorted alpha. If OFF the list is sorted in the order that the SUB LABELS WERE ADDED.
This enables a customised "menu" to be dynamically created with the items in a specific order.
Double check any existing sub label lists to make sure this option is ON if you want their lists to continue to pop up as sorted.

  • BUGFIX in _Page Printed broadcast sending

A bug in the way this broadcast was looked up was fixed, this bug has been there for a long time and caused Planimate to send the wrong broadcast for older model versions.
(this broadcast is used when printing from a change object, enabling the model to control the printing of multiple panels and multiple scrolling of a table view on one panel)

  • internal clean up of dial code (split up separate chart module)


  • reworked the ODBC code to clean up handle management particularly in error cases


  • If all data sets have empty names and file names and the "Save all data sets" option is not selected, the "Load Data Set" and "Save Data Set" options will not be displayed in User/Interdyne mode.
  • Added new option to tables "Clear Rows Before Saving"

This discards data in the table whenever the model is saved. This may be useful with output and log tables as it can reduce the saved model size substantially.


  • _borderstyle and _bordercolor columns can be used for log driven graphs to set the bar border in horizontal bar, histogram and gantt modes.
  • reworked graph vertical and horizontal bar clipping


  • removed the password clearing hack in


If you dont use "s" to convert models saved in Q and R, you will not be able to access the editor and administrator passwords

  • fixed bug which caused third attribute of a dynamic table reference to be remembered when switching back to a standard cell reference
  • Added "_plot modes" label list which is useful for formatting the "_mode' column in a column overlay view
  • ODBC operations have an option to not stop the run on error. A system attribute has been added to return whether an error in the ODBC operation occured, non zero value indicates an error.



This version resets the admin and editor passwords for versions saved with version Q and R.
Future versions will NOT perform the fix. If you load a model saved with version Q or R with later versions than this, you WILL NOT have access to the editor or admin passwords!!!
Reason for the problem in Q and R:
When I added the _borderstyle" list in Q, it screwed up a hash I used to encrypt the passwords, corrupting the password as the model was loaded.


  • Have changed the model format and the way that stat/views are saved

Stat views now retain the order which the modeller has arranged them in. Previous versions rearranged the views according to their type (cell,Table attfibute etc)


  • Fixed bugs in the directed message dispatcher with specific named entries
  • wrongly named function wasn't being invoked
  • memory allocation for name not properly checked before deallocation
  • Added "_border styles" label list
  • Gantt blocks now recognise two new optional columns

"_borderstyle": Specifies a value from the "_border styles" label list and determines the style of border the gantt block is drawn with
"_bordercolor": Specifies a colour and determines the colour of the border used when drawing the gantt block (note: indent/shadow borders do not use this color


  • Fixed grid views which were totally broken when displaying icons in their cells instead of RGB values
  • properly handle keystrokes when a popup/viewport has the focus
  • Directed Message dispatchers can now send messages to a message entry with a specific name rather than their own name or the default name, (When the message is directed to a portal). This will simplify the structure of complex message handlers.

The option to set the name is "Message Entry Preferred Name" in the Dispatcher Object Menu.

  • Attribute/Tables and Label lists can now be accessed via the Edit Menu at runtime. I've disabled adding and deleting attributes and tables since this could cause loss of integrity of the model run. Editing other objects should be OK during paused mode - if you find something that crashes the platform, let me know and I'll either fix or disable the option at runtime.
  • Attribute reference browser contents can be exported to a tab delimited file
  • Label references list can be exported to a file
  • graph border for log driven and overlay graph is properly computed when the scale is visible but the title is hidden
  • Added time-system attribute "Time Zone Correction (Minutes)" which may be used to adjust calendar times for the local time zone. The idea is that the internal calendar times/offsets are set in UTC then this variable can be used to shift the displayed (and entered) times from UTC to the local timezone.

The value can be changed during a run, upon the next redraw all table and item calendar times will be displayed with the new offset. NOTE: The internal value does NOT change, its an offset applied at the TimeToString and StringToTime level.
Example Values: +570 (Adelaide Time), +630 (Adelaide Daylight Time)
NOTE: If importing data or reading TCP/IP tuples with formatted times, then the current TimeZone will be applied in converting the times to seconds from the current time reference that the model stores internally.

  • TimeZone can be specified manually in the Display->Time Field Format time dialog or Run Start Date dialoge.
  • Model Edit and Simulation Calendar time reference is reset to 0 when a new model is loaded or created.
  • "Breakpoint Control" system attribute is now in the "Other" flyout
  • Internal cleanup work on Table Views and Graph Views, removed "read_only" during run flags since tables no longer use fixed structures at runtime.


  • scenarios can now be loaded along with a model in /BATCH mode

Done using the /SCENARIO=<scenario-name> command line option.
<scenario-name> must be the exact full path to the scenario file, including the file extention.
If the scenario load fails, an error code of 3 is returned by the EXE.

  • Obsolete @script command line options and old support code has been removed, this hasn't been implemented since the DOS days.


  • Paint lines now have options to enable centre and end arrow heads. The arrows can be single or double direction and outline or filled.
  • label references are now described in detail for table cell, column and item label references. Slight increase in memory requirements for specifically formatted label cells.
  • standard message and confirmation dialogs now have a forced "topmost" option to avoid them being lost behind other windows
  • have re-vamped processing of batch model runs. (running models from the command line with the /BATCH option)

The platform logs any errors to planimat.dbg and details in _plerror.txt
The EXE returns a code as follows
0 : Model completed or ran out of events 1 : Error in command line 2 : EXE path too deep 3 : Scenario load error 4 : <unused> 5 : Bad license key 6 : Error loading resources 7 : Error loading command line model spec 8 : Planimate was forced to quit by system 9 : Model run terminated by a model fatal error

  • Object,Attribute,Cell and Table Views have an option to make then "Transparent" to mouse clicks. The transparency is only in effect when the model is running or the system is in Application Mode.

[platform coding notes]

  • did some cleanups of the box/rectangle/line/region drawing code to reduce duplication and modularise the graphics level a bit more. Watch out for any graphical glitches this may introduce.
  • heavy duty internal renaming within the source code to bring internal names for attributes, various object types and other structures up to date with current names modellers know them by.

With the new names, the code is MUCH easier to read with PL experience. Now to update the module names...
This should not impact the EXE at all. Look out for any errornous names, strings etc. which were accidently caught up in the replace.


  • added extra test to check for close of "advance to time" dialog when iterating
  • Views and Paint Object Control Attribute is Now A Condition

This means a condition can be used to specify whether a view/paint object should be visible rather than just an attribute
Old models are translated to a "not equal to zero" test so they should be compatible.
The "Always true case" of "1 = 1" is used by default when no control is required and should be used if disabling an existing control condition, to ensure the significant memory used by the condition object is released. Whilst using "2 = 2" would yield the same result in the run, it means Planimate wont purge the condition object and it uses memory for no reason.


I've significantly reworked several of the "base" classes that Planimate is built on, hopefully to try get more speed out of it. ' Tests of model load/execute speed vs. previous version would be appreciated.
Tech details:

  • No longer use Singly Linked Lists for anything
  • Tables are used for master model hierarchy/panel lists
  • Table Find() has been reworked to search towards the centre
  • LinkedList Find() has been tweaked to search end points first
  • Large tables are allocated in much bigger steps to avoid fragmentation and wasted time.
  • deallocation order of panel and stat objects reversed
  • added extra test to avoid re-search for a panel when deleting them and their sub-contents


  • Have done some cleanups and optimisations to improve portal delete speeds
  • Path manager more efficient when deleting objects from paths
  • Paths for subsystems are purged before their content objects
  • Objects/Subsystems are removed from the hierarchy before their contents are deleted since their contents have no need to be updated during the delete (the contents are also being deleted)
  • Assemblers no longer get object delete messages (not needed)
  • Obsolete Event timer object deleted


  • New table colunm option enables a column to accept and display arbitrary text. This is stored separately to the underlying numerical value/format and overrides the value on display and editing.

Most routine operations (row/col insert/delete/shifting/copy) have been updated to also move the text.
Free text cannot be tupled via items at this time
Copy out is supported but not import in (yet)
Cell stats dont work properly

  • option to hide title on column overlay view


  • Popup panel buttons have another option in their click action context menu enabling the popup co-ordinates to be specified, the default of (-1,-1) uses the current mouse co-ordinate to position the popup
  • Help buttons can now have a specific help file specified as well as a section name. If a specific help file is not specified (help file name left blank) then the default help file is used - named the same as the model and with a .HLP extention.
  • Stat Views and Paint Objects now have a flyout in their edit menu "View Order" which enables them to be positioned to the back/front or before/after the previous/next object.

Currently paint objects cannot obscure attribute/table views - this will be addressed by adding a "foreground paint" layer.

  • /maximise works in interdyne mode
  • popups hide code has been reworked. Popup windows are explicitly hidden before they are destroyed to prevent them lingering


  • table selection strictly validated when a row edit occurs, this could have left a selection with an empty table, leading to a crash if the context menu copy-selection option was chosen
  • new system-other attribute "Lock Portals From Drags" enables the modeller to lock portals from being dragged at runtime even though their options setting enables this. This gives the modeller more control over when users can reposition portals in their display.
  • New Click action for buttons - "Popup Panel"

This sets a button up like a screen change except that the panel is opened as a popup rather than the main window being directed to it.
Existing buttons can have this option enabled/disabled using the "Popup panel in window" option which is a new option on the button link properties.


  • fixed bug which caused focus to point to nonexistent hidden tables when they were dynamically hidden from a panel using attributes.
  • reworked the operation of the master simulation event loop. Fixed the bug which prevented the system being paused before an event time when the advance-to time was specifically before that event time. This should make debugging time based models easier.

The master event loop is now somewhat simpler, please double check that different system (advance, real time, time scaling) are OK.

  • message items will also have info panels if the original item had one. If the original item has a hidden info panel, the message item's will also be hidden but it can be shown using the "Item Show Info Panel" item-system attribute.
  • Implemented HH:MM time of day time format


  • fixed a bug preventing the right clicks getting where i wanted them to


  • Portals and spatial links can now be right clicked when the system is in InterDyne mode


  • Changed portal click/drag broadcasts to clear all current zero time events (eg: sideeffects of the broadcast) before pausing the model again. This makes them more consistent with the other broadcasts such as table cell clicks.


  • spatial link clicks now sensed in user mode and include "_buttons" attribute
  • object palette doesn't stay at front after model run
  • Pop up panels without a titlebar now get the focus when displayed


These enhancements are intended to add more control over user interactions.

  • New Options for panels displayed as pop up windows:
  • "Auto Close When Focus Lost" Closes the popup if the user clicks on another window
  • "Ensure Visible On Display" Ensures the popup is initially displayed within the screen area
  • Change to _Portal Moved and _Portal Clicked broadcasts

These now send the following tuples - be aware that if your item had these attributes already defined, they will be now overwritten.
(General rule: Any item attribute named with leading _ may be used by a system tuple broadcast in future versions of Planimate.)
The attributes now set are:
_x : x position of mouse _y : y position of mouse _buttons : which button was clicked, 1 = left, 2 = right _panel : panel ID of panel where the interaction occured.


  • New routine operation "Formatted Width" (in the Labels submenu) will return the width in characters that the target attribute/cell would take to display. This works for label and numerically formatted values.
  • Added a new system broadcast "_link clicked") which gets sent when the user clicks on a spatial link line and the Panel Option to send spatial link clicks is enabled (suppressing the normal link information menu).

The broadcast includes the following tuple attributes:
_x,_y : The screen co-ordinate clicked _ratio : The ratio along the line where the user clicked, from near 0 (start of) approatching 1 (end of link) _from : Object label identifier of the "from" portal for the link _to : Object label identifier of the "to" portal for the link

  • In Flow Edit Mode, pressing control now causes flow arrowheads to ignore the mouse click, making it much easier to reposition an object sitting under an annow head (ctrl-drag the object)
  • Added a new optional column to gantt displays

IF this column is present in the table, it controls how thick each bar is drawn, value of 100 is maximum (normal), 1 = hairline, 0 = not drawn (hidden bar)

  • Mapper editing now will not prompt for and insert new rows when points are dragged if the table option "User Cannot Insert/Delete Rows" is selected. In this case existing points can only be dragged up and down
  • CTRL-C is a shortcut to copy for the table with the keyboard focus
  • No longer support reverting to the original values of a column when a table is set up as fixed length (not variable length) and the (now obsolete) "Retain Simulation Values" option is OFF.

This has occured because I no longer implement fixed length tables using a separate memory store. Fixed length functionality is still implemented though.
All table ops should be slightly faster.


  • Track loops have an option to call the out routine immediately after the train starts to leave. Currently stopped trains only call the out routine after the train completes its exit delay.


  • new command line option /MAXIMISE (/MAX is OK) maximises the application window when Planimate is started.
  • Have extended the "No Following Trains For 0 Loops" option for track loops
  • trains never can block at the loop (if the section they move onto is busy, the run will fail with an error
  • the loop in/out routine do not execute
  • the loop entry/exit delay have no effect
  • the loop gate does not take effect
  • loop dwells are not acted on
  • Pasting a table view no longer has possibility of pasting outside window area
  • Added new label routine operations:
  • ReIndex List With Values

This takes a label list and two columns. It changes the index values of the labels identified in the first column with the corresponding index values supplied in the second column.

  • The index values are validated, if any duplicates or invalid original index values are passed, the model is stopped with an error
  • NO TABLES, ATTRIBUTE OR ITEM label values are updated with the new index values. This means any existing label references of a particular index will be invalidated if the index values are changed with this operation. This is provided to assist in building new lists.
  • Create Panel Label

This takes an Object Label (which must be for a Portal) and returns the corresponding Panel Label Index for the portal's subsystem. If the portal's subsystem does not have a Panel Label, one is automatically allocated.


(new file format)
  • the "Display Bounds" on both column overlay and log driven graphs can now be set at runtime by right clicking on the scroller window, as in edit mode.
  • New routine operation enables a column's width to be changed on the fly. You will need to force a repaint to see the change.


[new file version]
  • Table views have a new option enabling the space reserved for row labels to be fixed at a constant value. If the value is set non zero, then space for "n" characters is always used.

This overrides the table parameter which enables the "minimum row label" space to be specified. Unlike this option, the view specific parameter will always be used even if the labels are longer than the space allowed for


[new file version]
  • have changed Application Panels so its now OK to put a zero delay single capacity multiserver into an app panel, useful for debugging.

= now allow zero delay single capacity multiservers in application panels =
A multiserver with a pauseable 0 time delay and "road view" on by default can be added from the bottom right icon in the object palette when within an application panel.

  • new Broadcast option on table views enables a broadcast to be sent after the user sorts the table view by clicking on it and selecting "Sort"

This lets the modeller know the user's preferred sort order for the table.
The broadcast is sent with the following attributes:
_sort1 _sort2 _sort3 _sort4
Each attribute is the column number (starting at 1) or 0. If the reverse sort order was selected, the attribute is the -ve column number.

  • BUGFIX - model created portals (dynamically created) have their associated views properly positioned. Previous versions would offset the views.


  • If a broadcast is sent when an attribute view is clicked, it now will set the following item attributes if they ecist

"_previous" -> set to the previous value of the attribute "_current" -> set to the value of the attribute after the edit


  • Have fixed a double redraw bug which caused popup panels to not display viewports contained in them properly


  • Loop "roads" is now an attref so it can be changed (changing while the track has trains on it will probably cause problems)
  • Loops have an option now which prevents following trains being allowed when the loop capacity is 0 (no side roads)


  • Planimate TCP sockets change:

A failed server connection now puts up a dialog and retries automatically every 2 seconds. The user can "cancel" (forcing the model to stop) or "ignore" which continues the run even though the broadcast failed over the network.
The response of the system will be a little slow, I'm not using multiple threads yet so the system may be trapped in a network call for a few seconds.


  • === DLL Calling for routines now implemented ===

This version of Planimate now enables a user supplied DLL file to be called from within Planimate as a routine executes. This can greatly speed up complex mathematical operations.
EG: On my PII-400, a CROSS multiply of a 1000x10 table with a 10x1000 table (yielding a 1000x1000 output table and involving 10 million multiply and accumulate operations took 2 seconds, including item animate time.
DLL's can only be called if they conform to the Planimate DLL API, which is now available for download. A simple matrix utility DLL is provided as a sample for developers. You will need a C++ compiler capable of producing a Win32 DLL to develop using the API. You dont need to know how to call/load a DLL (Planimate does that) and my example DLL provides a calling framework to put your code/algorithms into.
The API means Planimate can interrogate the DLL's available routines and their parameter requirements, hopefully minimising GPFs due to memory allocation issues.
Key features of the Planimate DLL calling mechanism:

  • A named function in a DLL can be called from a line in a change object routine
  • DLLs can contain a number of these callable functions (called routines)
  • Multiple attributes and tables can be passed as parameters to each routine in a DLL.
  • Multiple attributes and tables can be returned from the DLL
  • All Planimate data types are passed to/from the DLL as double precision numbers. If a DLL is receiving what should be integer values, care should be taken in converting the doubles to integers to avoid round off issues - never trunc() in this case!
  • DLLs also return an integer "result" value. This can be used to convey call success, error numbers, as defined by the DLL author.
  • table parameters can be entire table references, single rows or columns or block references (starting at the top left to the end of the table)
  • Where a DLL expects a table for a parameter, Planimate can handle passing tables, rows, columns and sub-blocks as parameters. To the DLL, it appears as a table.
  • Planimate will automatically dynamically allocate space for returned tables according to the following rules:

Returning into a table:

  • If the table has no rows or columns, it will be allocated to fit the table the DLL returns. The columns will be unformatted and unlabelled.
  • If the table contains columns but no rows, the columns will be retained and enough rows added to fit the table the DLL returns. The column count must match or a model error is reported.
  • If the table contains data, its rows and columns must match the table returned by the DLL otherwise a model error is reported

Returning into a row reference:

  • The DLL must only be returning 1 row and the column count must match

Returning into a column reference:

  • The DLL must only be returning 1 column and the row count must match

Returning into a block reference:

  • If the Top Left Cell of the block reference is NOT (1,1) then Planimate will place as much data as it can into the table without ever complaining. If the DLL's table has too many rows/columns, the extra ones are ignored. If it doesn't have enough rows/columns, the existing values in the table receiving the data are left intact.
  • DLLs which return no outputs apart from the result code are callable during lookahead, otherwise they must be called in routines that are "only during move" to avoid possible lookahead error messages.

This means that a DLL call can be part of a "look ahead" operation (eg: very complex movement logic) with the movement result/decision coming back to Planimate via the DLL result code.

  • tables are passed to the DLL "by copy" and the DLL returns data to Planimate in the same way. This means the same table can provide data to a DLL as the one receiving the result without any consistency issues.
  • The default font (until a previous model is loaded) has been set to Arial, since this font will by default scale as its a truetype font.

Let me know if the defaults for new models cause a problem. This change should not affect loading existing models.


  • histogram bar no longer gets drawn if point is to left of window margin (due to scrolling)
  • attribute view hide bug fixed


  • scale/offset option implemented for cell and block selections in the table editor
  • new switches act as item guides by default
  • Object/Attribute/Cell/Table/Graphical views can by dynamically shown/hidden using a control attribute and a repaint, as for paint objects.

Implementing proper hiding involved changing the way the views are hidden, to avoid grey boxes being left on the screen during the next redraw. Let me know if the change cause other display side effects.


  • merging model fix - broadcast label indicies properly updated where a broadcast is merged with an existing bc of the name name


  • now support icons being assigned "NULL" icon at a change object. Previously this did not hide the icons causing very strange animation behaviour
  • Run code has been fixed to properly schedule animation updates after a run-restart dispatcher takes control of restarting the engine.

Previously animation updates did not occur until after the model was paused.


  • Fixed a bug in


introduced when I did a global rename of some source code names, a token in the file loader also got renamed. This caused models containing any Log Driven graphs not to load.

If you have created/edited a model with


and ADDED any Log Driven Graph views, you will have to do a find/replace on the MDL file and change the text "LogDrivenStat" to "GraphPlotStat", otherwise your model will not load.

This will only affect you if you added a log driven graph in


. Older models/exes are OK in this regard.


  • Copy spatial link function enables template spatial links to be copied which is useful for creating spatial link-pipes. The "Copy From" specifies a spatial link object which has been preconfigued with the required visualisation options.
  • RGB table view redraws much quicker due to an optimised grid draw routine. Modifying indiviual cells will still result in slow redrawing due to the call overhead so its a good idea to not have the RGB view visible while its source data is being updated, or to use a separate working table and then table-copy the data into the view's table.
  • Have reworked the x/y scale handling code for graphs. This will now enable x axis scales to contain labels from a label list
  • Objects can be renamed to a name with different case without the platform complaining
  • drag cursor enhancements and speedup to horizontal time scroller
  • Note on "X Scale Interval" parameter

This sets the resolution of the horizontal scroller's x scale. By default Planimate choses a reasonable value but this scale parameter enables it to be overriden. If you use a very small value and the data has a large time range (eg 2 seconds with 2 weeks of data) the display and behaviour of the time scroller will be VERY VERY SLOW.


  • Interactive Overlay graphs now support sending broadcasts when points on the graph are clicked and dragged.


  • fixes pauseable 0 delay event handling which was rewritten but broken in 4.25 so I could handle event updates for pipes more efficiently.


  • new system broadcast "_dataset_loaded" is sent to the model when a dataset load completes

4.25 [new file version]
Spatial Link Pipe View
Have implemented a new option for spatial links which makes them display like pipes without the complicated attribute handling of using pipes.
The basic idea is that the spatial link gets divided into a number of sections. Each section can have its colour set as an item moves through the pipe. In addition to the section colours, separate "activity animation" can occue for non-idle sections, to graphically illustrate material flow. Since multiple items can exist in a spatial link, multiple coloured "bands" can simultaneously animate down the "pipe".
In the options of a spatial link, turn on "Pipe Display Mode"
The Edit menu will now contain 2 new entries:
Pipe Display Settings
This contains constant pipe parameters such as width, section count, and activity update settings. This menu also appears for standard pipes.
Pipe Parameters
This enables 3 dynamic attributes to be defined for the spatial link pipe:
Section Colour
The colour each section of the pipe will be set to as the item moves through it
Activity Colour
The activity animation colour (used for the entire pipe) to use
Run Control
The activity speed and direction, eg: 1 is forward, 0 is stoppped, -2 is reverse double speed etc.
These parameters are looked up whenever an item enters the spatial link, moves between sections of the pipe or leaves the spatial link. A section gets its colour set at the instant the item leaves it.
By dynamically changing these parameters as the item moves therough the pipe, some very interesting effects are possible.

Of all the parameters, the section count is the most important. IT determines how many graphical bins the pipe will be split into. The more bins, the smoother the animation but the more FEC events will be scheduled as the item moves through the spatial link, slowing the model down. This slowdown occurs if the pipe is visible or not.

  • Pipe objects editing menu has been slightly rearranged, to enable more common code to be shared between the pipe and the spatial link
  • The animation manager has been enhanced to enable items to animate over pipe animation with reduced garbage left behind. This should only affect pipes, report any graphical anomolies.


  • fixed bug with scroller (properly this time) so entering a calendar time using the dialog works.
  • label lists now have an option in the [File] button to enable them to be included/excluded from Planimate Data Sets (scenarios).

If this option is enabled, the label list's contents (indicies and strings) will be saved in the scenario file and read back in when the scenario is loaded.
Any existing content in the label list is erased when the scenario is loaded otherwise conflicts could arise.
Label aliases are currently not saved in data sets and any existing ones will be lost when the data set is loaded.


  • fixed bug with track objects - was not properly handling rectangular objects which caused the track lines not to properly centre on the objects.


  • Models which started using a _preinit or _run_start broadcast would flash a black (or garbage in some systems) window before the main animation was displayed for the first time. On restart of the run, the previous run content was drawn for an instant.

I have fixed this by forcing a redraw at the start of the run so the animation buffer is properly initialised before any animation occurs.
The forced redraw will cause a flicker each time the simulation engine / run is started/restarted, which is the original reason why I removed it. However given that modern models/applications should not be restarting the run very often (eg: as the user clicks buttons) the flicker should now be a non issue.
If the new redraw troubles your model, let me know.


  • All open model windows are now "disabled" when a model popup panel is shown
  • New option on column overlay graphs "In Place Edit" enables the graphs to be interactively manipulated as occurs in the graph view of the table editor.

This option should be used with the "Show Points" so the hotspots are visible.
With a standard mode table, the points can be raised and lowered. With a mapper, the points can be moved and new ones inserted. This With multiple column mappers this will involve interpolation of other columns and the usual mapper questions in this regard will be asked.

  • Object etc. dragging step interval can now be set

Display->System Parameters has options to set the X/Y stepping interval As previously, smooth mode can be toggled at any time by pressing the keypad [+] key while dragging an object.
BUG: seems this key is ignored when an object is being dragged off the palette

  • New Display option not to show file load/save options in InterDyne mode. This is used for InterDynes which save all their data in scenario files
  • date in x axis of scroller time range window is now properly accepted by the dialog


  • manually importing a file into a table (eg: from clipboard)

change to import filter. If an empty row is read between rows containing data, Planimate will ask the user whether empty rows should be included in the table (filled with clear values) or ignored

  • internal class name registration change - should not affect any user under any Windows platform
  • planimate fonts for new models are now consistent regardless of the operating system's default font settings. This alleviates the small Tahoma font which was the default for new planimate models under Win2000
  • user dialogs now are forced topmost of all windows including all Planimate windows/popups and all other windows
  • new display option "Include Scenario Name In Titlebar" causes the name of the currently loaded scenario to be appended to the current application title (which may be set using the InterDyne Title edit option). This will only appear in InterDyne mode, in edit mode the normal editing titlebar is shown.
  • objects positioned using the dynamic object creation are now positioned based on their centre co-ordinate being specified, not the bottom left. This makes it consistent with the object animation routine operations.


  • Dynamic Object Creation And Deletion ====================================

A model can now modify its own structure by adding portals (copying a master) and deleting portals from itself.
This is achieved using a table to provide a series of commands to the edit environment. The dispatcher "Restart Engine/Continue" mode is used to perform the edits. This mode is only available for dispatchers in an Application Panel.
Review: Restart Engine/Continue Dispatchers
Dispatchers in this mode restart the model engine whilst retaining the item within them. ALL OTHER ITEMS in the model are deleted - the run is stopping and restarting at time = 0, but the item at the dispatcher "survives" the restart and can continue through its flow.
To enable the dynamic object mode, the Dispatcher "Enable Edit Command Table" option must be selected. This option is only available once the dispatcher is in "Restart Engine/Continue" mode. A new object option will enable the dispatcher to be associated with a table, via the familiar Attribute Reference.
The following columns MUST exist in the table. The order doesn't matter and other columns can exist (and will be untouched) by the dynamic object system.
_command _original_id _new_id _new_panel _x _y _result
Each row is processed according to its _command. The following codes are now implemented:
_command = 1: COPY Object --------------------------
_original_id is the object label of the original object to copy
_new_id will be set to the new id of the object. If non zero, Planimate will attempt to use the index specified but if it is in use, a new index will be allocated and _new_id will be set to it
_new_panel is the target panel where the object will be placed. This must be a dynamic panel
_x,_y specify the lower left co-ord that the object will be placed at [this may change soon to centre co-ord - feedback please]
_result will be set to a result code by Planimate.

_command = 2: DELETE Object ---------------------------
_original_id is the object label of the object to delete
_result will be set to the result code of the delete operation
All other columns must be present as for Add, but will be ignored
IF a row attempts to delete the panel (or an owner of the panel) that is currently visible, the delete will fail.
If a row attempts to delete an object which would cause the deletion of the dispatcher executing the table, the delete will fail.

Currently Defined _Result Codes (may be extended)
0: No Error / Nothing to report. The operation was successful 1: Something unexpected happened (coding error) 2: The panel id provided was not for a dynamic panel 3: The panel id provided was not for any kind of panel 4: No source object was provided for copy/delete 5: The command code was not a recognised value, the row was ignored 6: An attempt was made to delete an object which cannot be deleted for reasons outlined above or because it is part of a network structure.
The DYNOBJ demo model demonstrates the technique using a table to create 3 copies of a portal and delete one portal. It includes label lists to enumerate the command and result names, these are not yet internal. This is a "one shot" model, once you click the button you have to reload it to revert to the original state!

  • "Scenarios" have been renamed "Data Sets"

This involved about 100 replacements, let me know if i missed one! In the source they are still called Scenarios for the time being (S_SCENAR.CPP)
Note: The modeller will have to rename the default "Scenario" name in existing models (Edit->Data Sets)

  • The window title in InterDyne mode now does not include the Planimate application name. Setting the InterDyne name will enable an application specific title.


  • Copy pasting from a model containing an Admin Only object no longer asks for the model password unless the copied selection involves the admin only object


  • Pasting a selection now selects the pasted objects after the paste
  • causing a screen change to a panel contained in a visible viewport within the main window is now supported


  • label lists have an option to "index from zero" which causes items to be allocated starting with an index from zero
  • Dynamically created label lists have the "index from zero" option on
  • backspace key goes back to previous panel in button history list but not in InterDyne mode
  • table views which are marked to send a BC after cell edits no longer have fill across/down or clear/cut rows options since these would modify more than one cell at a time making the broadcast inaccurate.
  • table click broadcast now sends "_previous" and "_current" attributes

For clicks after the edit, these are set to the previous and current value.
For clicks without the edit, both are set to the current cell value

  • table views have option to disable row edit context menu
  • table row label minimum width can now be set (default is 3) to enable a minimum row label width to be guaranteed, setting to 0 and disabling row label number display releases more space to the left of the table views

This is set in the "All Rows" flyout of the table editor

  • fixed label list assign problem in attribute code


  • new hierarchical model window browser

This enables rapid browsing of the models structure using an explorer style tree view. As panels are selected, they are shown in the main window if possible. Arrow keys enable rapid navigation, <ESC> returns to the original panel, <SPACE> or <ENTER> can be used to select the currently highlighted panel.
The browser was implemented by Craig Chandler and is his first foray into Win32, iFlow and Planimate source programming - Well Done!

  • Reading an unknown label via a network broadcast will now automatically add an unknown label if the "Auto Add Labels On Import" option on the label list is ON
  • Creating a label list now does not complain if the named label list already exists (it must be a normal label list) but instead just clears and returns it.


[initial release for testing - may corrupt models on copy]

  • This implements multiple object shift-select / copy / paste.

Multiple highlighted objects / paint objects / views can be copied in one go and pasted together. The "Copy Selected" option does the multiple copy, it appears in the selection menu.
If copy/pasting objects with cross dependencies or linkages between them (eg: Portal A and Portal B selected, Portal A has a jump to somewhere in Portal B) and you want the linkages to be updated to point to the new (copied) targets, you MUST paste the objects into a different subsystem to the objects originally copied. Otherwise the copies will point to the original targets.
References WITHIN the one portal are always updated as in previous versions.
You can do copies in two steps to achieve separately interlinked systems on the same screen. Just use a temporary portal.
Multiple objects can be carried between models. However, if you want inter-object references to point to the copies, put the objects into a subsystem and then carry across the portal. If you carry the objects as individual multiple selections, any linkages between them will be lost.
This enhancement has involved a redesign of the interlinking redirection code used during copy paste and it has not been heavily tested yet.


  • Implemented latitude and longitude formatting options
  • internal rework of formatting handling to support further extension (look out for any new formatting/value parsing bugs)


  • fixed bug with switches following switches which would cause engine to unexpectedly unravel


  • reworked viewport management so viewports spanning across objects which are being deleted are still properly closed to avoid them crashing on destruction of their viewing screen


  • format copy and format for list options now work when the target is a table column reference


  • table/cell etc. views can now be pasted into an application panel space
  • I've implemented a change to the simulation engine which enables it to process graphical loops with more than one switch in the loop(s).

Only switches, guides and change objects allowed in the loops
The switches must all be set to "only during move"
No capacity is required and none must be present for the loop to execute in one thread

  • I've added an extra report field for "Max Move Recursion Level" which gives an indication of how deep the engine is recursing. Given the previous enhancement, this should be a relatively low number (<20) and not increase with the number of iterations executed.


  • have fixed palette problems introduced in G
  • have fixed crash-on-close bug when popup windows closed using [x]
  • tcp/ip comms now properly sends large (>8k) XML documents
  • closing a popup window now sets the main window as topmost


  • have rewritten internal viewport and popup management code to simplify internal operation (and hopefully make it more robust)

All viewport/popups (particularly interactive ones) should be carefully checked.
Non trivial screen interactions (eg: flow building) also may be impacted so look out for any new unusual behaviour

  • fixed validation for column copy operations
  • reworked representation of value format/labels for
  • table columns
  • attributes (all kinds)
  • specific cell formats

This will allow for more operations dealing with formatting

  • New Routine Operations:

"Copy Format" (special)
Copies the format (units and labellist) of the parameter and sets the target to it. Formats can be copied between attributes and columns.
"Format For List" (label)
Interprets parameter as a name of a label list, looks up a label list with that name and formats target to be a label list type for that particular label list.
"Create Label List" (label)
Creates a new label list, interpreting parameter as a name to use for the new label list. It then formats "targeT" to be a label list type for the newly created label list.


  • the insert column operation will now accept a "Column" reference which can be a column for a different table.

In that case, the column is copied (with formatted) and resized to the appropriate number of rows and inserted into the target table.
This enables copying of formmated columns between tables, use of master formatting tables to dynamically build reports etc. etc.
If the "column" reference is just a scalar number, it copies the column from within the target table, as was the case previously.


  • image paint objects have new option to reset to the default size.
  • Paint images in pre version 284 models have a bounding box computed as they load to ensure its valid and properly scaled
  • hiding a panel in a routine now works (crash bug fixed) This means a popup can close itself (when a button is clicked)
  • new "Display" option to hide the run menu even in edit mode (previously the run menu was only hidden for interdyne-only exes)
  • New Panel Option menu: "Popup Options" contains the following options which control how the panel operates *when opened in a popup window* using the "Show Panel" routine operation:

"Act As Modal Dialog"
Causes the popup to act as a model dialog. Operation of the parent window is disabled while the panel is visible.
Panels in this mode always have fixed (dialog) frames and a caption bar and appear in fromt of the main window.
The "System Menu Icon" can control whether the close box appears in the right corner. The minimise/maximise icons are never shown.
"Hide Caption Bar"
Hides the caption bar, causing the panel to be shown as a child window of the main window instead. This makes it act more like a viewport except the modeller can show and hide it.
"Palette Window Style"
Draws the panel using a fixed frame and thinner caption bar. This is good for palettes. Use with the "Stay In Front" option to avoid it being lost behind the main window.
"System Menu Icon"
Shows the close box [x] icon at the top right of the caption bar
If you disable this, closing the panel becomes your responsibility
"Minimise/Maximise Icons"
Shows the minimise/maximise icons in the caption bar
Modal dialogs cannot have minimise/maximise icons
"Stay In Front Of Main Window"
Causes the panel to always be in front of the main Planimate window. This is good for palettes and is default for dialog mode.
"Stay In Front Of All Windows"
Causes the panel to always be in front of ALL windows, not just Planimate. This should only be used for alerts or very important status as it can be annoying to the user.
"Dont Show Frame"
Does not show the popup with a resizeable frame. This is useful in conjunction with the "Hide Caption Bar" option as it results in a panel appearing within the main Planimate window without any border.
Using this a popup panel can act as a programmable viewport.


  • label lists in cyclic selection mode now present the add/alias label select dialog properly when an undefined label is read
  • have added a new tag in the HTML dataset:

[this will only be of interest if interfacing to Planimate directly using XML]
... <broadcast name="broadcast-name" class="item-class" format="raw">...
format="raw' specifies the attribute values are unformatted values format="normal" is the default and specifies formatted values
A received broadcast will have the values processed as determined by the value/presence of this tag. A broadcast can be sent with undormatted values by adding "2" to the "use item" field in the change object "broadcast" routine operation (ie: the value should be 3 instead of 1 to cause attributes tso be sent without any formatting).

  • have implemented socket status display in socket list and ability to disconnected connected client/server sockets


  • allow up to 65535 to be used as a port #
  • fixed "memory tag error" when editing broadcast socket
  • associating a broadcast with a socket name of "*" will make that broadcast both receiveable and sendable on all open sockets (if sent locally)
  • associating a broadcast with a socket name of "=" will make that broadcast receivable on all sockets but it wont send on any (if sent locally)


  • after a lot of intense debugging, I've found the cause of a crash when receiving TCP/IP broadcasts. This could also explain rare crashes in previous versions when dealing with async broadcasts such as a video clip ending.

(a high priority event posted to the front of the FEC was breaching an assumption I'd made about the front item in the FEC)
Finding this bug involved adding some extra validation code to the LinkedList class (used everywhere) to guard against inappropriate list management when nodes are directly transferred from list to list.
I've decided to leave this validation in there (the speed penalty should be minimal) as it will highlight any looming crashes much earlier than they would otherwise occur.

      • If you ever see any "LinkedList::" warning dialogs APART from the "too many items" warnings (which indicate a model structure error), try determine the scenario which creates them and let me know - as with all Planimate crashes, I have zero tolerance for such things and will deal with them with high priority.

Note: As with a timed broadcast:
1. A network/socket broadcast must not cause a change in the current panel - its meant to be a background activity.
2. The animation of network broadcasts is not interruptable - if your model cannot keep up with the incoming broadcast stream (because you are animating them) then you will be blocked from stopping the model until you stop the network broadcasts (stop the sender, pull out a network cable etc...)


  • fixed (silly) load bug in label list code (had messed up version # check value)
  • fixed memory leak in XML document writer

This is the first release of broadcasts via TCP/IP. The attached models demonstrate it and should be run simultaneously on two instances of planimate running on the same PC. It assumes port 23 (telnet) is not in use.
The Edit->Sockets option enables the models to be configured to communicate via different IP numbers once you are ready to test over a network. To achieve a connection at least one server and one or more clients are required. "Telnet" can also be used as a client to watch outgoing activity from a server.
(once the models are loaded, execute TELNET and you will be logged into the server and watching its outgoing traffic.
Multiple incoming streams into a server are not supported yet.
Server sockets start listening the moment they are created/loaded (even with the model stopped). Client sockets attempt to connect when a broadcast using them is first sent, after which they remain connected until either end closes the connection (model closed, an edit of socket info requires a close).
Broadcasting with an associated "client" socket requires the socket to be open, otherwise the model stops. If the associated socket is a "server", then it doesn't need to have any active connections for the broadcast to succeed. Hence its important to choose client/server roles appropriately, depending on the order of message flow.
Currently, sockets will carry item attributes for matching attribute names but both ends must have a matching item class as well. This is required in order that the attribute matching can be performed in the socket code. Hence the classes need an identical name but can have totally different attributes, only the common ones get "tupled".
Currently I dont handle validation of incoming data (eg: ensuring labels exist). The plan is to have separate dictionary/synchronisation messages to automate the synchronisation between model label lists, etc.
Look out for problems in broadcast handling (scoped/directed) since some rework of that code was required.


I'm releasing this version to get out some minor fixes and enhancements, the Sockets/XML stuff is still not completely integrated (so dont go to Edit->Sockets yet)

  • Have implemented a new option on panels

"Act Modally When In Own Window"
This will cause the panel to act as a modal dialog if modeller code opens it in its own window ("Show Panel" routine operation)

  • Have added a new panel option "Ignore Modeller Redraws" which prevents the panel from redrawing upon a model-initiated redraw of all screens.

This may be useful in reducing flicker when a model generates many redraws, particularly if the model runs in zero time

  • Breakpoints now have a master control in the DEBUG menu

By default this option is OFF (disabling breakpoints) and it is turned off in InterDyne mode.
This option works in addition to the model-controlled master breakpoint control and the individual breakpoint control attributes

  • fixed a bug in the attribute editor which caused long label names not to match (was not setting width for combo drop down properly)
  • trace animation control is a system attribute
  • activity state can now be set using a value from 0..1 using a new system attribute
  • Have reworked a lot of code to make platform more capable of handling multiple open windows (includes viewports) This impacts
  • mouse co-ordinate tracking, click detection
  • object movement, positioning, clipping

Look out for any problems in these areas (significant more rework is still needed in this area)


  • implemented US format date display/parsing (for the HH:MM:SS format only)


  • "Release Item" dispatcher message no longer generates bogus messages at normal dispatchers


  • Have removed the "pre-init pause" state

The old "Pause After PreInit" option is now called "Pause After Run Start" and it pauses the model immediately after the "_run start" broadcast is sent and the model is completely initialised.

  • No longer give the "No Paths" warning if a model with no flows is started. The model will just start the engine and become "ready"
  • Redrawing of screen when model starts changed
  • Fixed updating of "advance" time box
  • fixed vertical queues/dispatchers (were still hairline)
  • indirect attribute references now are properly scanned for operations like table rename.
  • dragging a paint object no longer resizes, to avoid accidental resizes

Use the "Bounding Box" option in the popup to enable resizing

  • Pressing <ESC> during a resize cancels the change and restores the original box
  • New Label routine operations give the min/max index of a label list if available for the list type. If the list is empty they return -1
  • Advanced Find Enhancements
  • Finds Tables that are Fixed Length
  • Finds routines that display a dialog or contain breakpoints
  • Item/dynamic tables can still be selected even if there are no direct table references available
  • attref editor now defaults the "column" field to a column reference when selecting "Lookup" mode
  • bugs in attref select dialog when dealing with tables (and reselecting tables) fixed
  • Warning is now given if a fixed length table option (not variable length) is edited.

You should start removing "Fixed Length" tables from models as I plan to handle all tables using the "Variable Length" code in the future.


  • crashes when navigating using viewport click through should be resolved now
  • Splitters with the "Transfer Item Attributes" option "on" will now also transfer table references. The transfer is name matched and partial transfers are always allowed (the Allow Partial Transfers option is ignored for table references).
  • "Set" operation on tables now handles differently sized tables

1. IF the column count is the same but rows differ, then rows are added/removed automatically to the target table to make them the same size before the copy
2. If the column count is different as well, then columns will be copied from the original table *as long* as the target table has no columns to start with
note: column labels will not map properly if the table columns are rearranged

  • Directed Message Enhancement

A dispatcher or Routine line sending a message to a portal will now first attempt to match a message entry with the same name as the sending dispatcher/change object. If this fails, then the default entry (_!message) is looked for, as previous. If this also fails, then the platform looks for a Portal called _!message and forwards the message to it. Within this portal, specific entries may extract the message.
This enables
1. Many message types to be directed at a portal and then individually handled within via separate entries.
2. Message handling to be encapsulated in a hidden portal (must be called _!message) rather than having to have message entries/flows right at the top portal, which may be visible to end users.

  • Dispatcher and Queue capacity increased

Note: performance will decrease with more than a few thousand items in a queue or dispatcher

  • New dispatcher mode: Wait For Specific Release

Items entering the dispatcher wait there until a routine oeration message -> "Release Item" is used to release them from the dispatcher.
The "Release Item" routine operation takes 2 parameters
"Item Index" the Item ID of the item you want released from the dispatcher
"Scope Panel" If non zero, this specifies a dynamic panel which will define the dynamic scope under which the release will work. IF 0, the release will work for any dispatcher in the model.
Using this value cuts down the search space in looking for dispatchers to release the selected item from.
the operation sets a target attribute to 1 if the item was found and released, otherwise it sets the target to 0

  • Attributes are checked for any references before the "update references" dialog is displayed
  • The "Display" menu contains a "Purge Attributes" option which deletes all unreferenced portal attributes (and any views) from the model.

(attributes referenced in Billboard tables are not purged)
Use this option with care (back up your model) as it needs beta testing


  • sort alpha option now selectable for sub label list
  • log driven graphs can now have a "_mode" column. This is interpreted on-the-fly and enables the graph's mode to be changed on an overlay by overlay or even a point by point basis

A value of 0 leaves the graph in its last state, which will be the default (edit) mode at the first row.
The graph mode is global to all the overlays. If you want each overlay to have a different style, then you must specify the appropriate value in the _mode column for each point in each overlay.
The _mode values are mapped as follows:
0: no change 1: no plot 2: smooth 3: stepped 4: horizontal bar 5: histogram 6: area 7: gantt style

  • row/column operations on tables now validate for -ve row counts


  • Fixed redraw bug during animation due to the change in redraw handling (was incorrectly handling redraw of the non-client area of the main window)


  • fixed crash bug caused by error reporting code when a matched row lookup failed on a column which includes cell specific formatting
  • LabelList for attref element in Label mode can be viewed/changed with a new "List" button, avoiding having to change it back to value and back to label list
  • I prevent redraws during file dialog boxes being open. This should prevent missing paint BMP messages while browsing directories, but will lead to messy screens if the file dialog is moved. To implement this i had to change the event polling code which could lead to other reentrancy problems.
  • no longer get a refs scan error if adding a portal attribute while editing a file access target
  • editor for attrefs referencing an entire labellist now works
  • Meta Panels are now called Application Panels
  • implemented code for restart dispatcher (restart dispatchers are only available in Application Panels)
  • minor rework of background menus to make mode selection easier


  • combofield in attref editor now properly holds long labels
  • have cleaned up handling of string buffers for long labels etc. as it was too complex
  • Changing a routine steps mode does not automatically re-edit the target unless the new mode expects a different target type


  • more tweaks to default button/field handling in attribute reference dialog
  • <Dynamic> attribute references are annotated with the table selection index/attribute name
  • "Step" button in routine calculation edit enables steps to be inserted, duplicated and deleted.

Inserting a control operation (IF/While/Iterate) etc. also inserts the corresponding end-op, changing an existing operation to a control operation or duplicating a control operation does not insert a correspoinding end-op

  • crash on deleting a table from 4.23H has been fixed
  • Y scale width for gantts and train graphs can be now edited. Its an option in the Scale Parameters


  • shared routines can are now selected, setup and made private using the "Sharing" button in the routine editor.
  • New combo box drop down is used in attribute reference selector. This holds the names of the possible selections for portal/item/routines instead of having to use the browse button

Typing a partial name and pressing down arrow autocompletes and enables selection of matching completions
The [Add] button when present enables a new attribute to be added. IF the name typed in the field does not exist, the new attribute dialog will be preloaded with that name

  • Routine editor tab ordering changed

The comment field is selected by default if it is empty
A single [tab] from the comment field takes you to the OK button

  • Change to click on GANTT and TRAIN GRAPH

row1/row2 clicks were one less than expected, now they count from 1

  • I have rewritten the code which positions combo-boxes (drop downs) so it is compatible with normal fields. This means combo-boxes in dialogs would be out of alignment but I have implemented an automatic translation which will get applied the first time an old dialog appears during a run.

If the dialog is edited instead, the offset isn't applied since the editor cant tell apart combo and normal fields - you will have to fix the alignment of combo boxes yourself.


  • Routine editor now requires selection of a calculation type upfront before the routine object is added

Selection of a type falls into selection of the target (if one is needed)
The default target type is more appropriately initialised and previous types are used where possible

  • Have rearragned routine calculation selection flyouts into a more logical order (followup to review), new Numeric and Message sub menus to reduce the size of the Special submenu
  • If an object has no flows entering it, item attribute names for all item classes are added
  • Set Item Transit Time / Item Transit Target are now available as calculation operations (Spatial Link)
  • Meta panels no longer need to be named with prefix _META, they track their type internally
  • Speed up in switch between dynamic and meta/application panels


  • Fixed crash bug with spatial links

If a spatial link was deleted while an item was still on it, the pending FEC event for that item would crash the platform once processed.

  • Have started adding some defaults handling for the att-ref edit dialog.

Currently defaults for portal/item/routine etc references and tables referenced (cell/row/col/table) are retained, though the rules for more complex types and interchange of defaults between similar types will be extended.

  • row colours in tables can now use the new colours in the palette


  • Warning bug when navigating to paint owning screen fixed (was redrawing excessively)

Please report any missing redraws when editing paint objects.

  • Left click on an attribute view now performs in place edit as it used to
  • Track logic fix:

Sections were not being properly reset to "idle" after a loop entry delay completed, causing them to miss unblock messages and resulting in stuck trains

  • Track Sections Names

A new button "Update Names" in the Section Details dialog automatically sets the "internal" name of each section of track to one derived from its two end points. This assists in debugging where sections are identified by the internal name, not the full name generated from their two end points.

  • Have reworked way panels are deleted when a model is cleared/subsystem is deleted. This was done because the previous method was unreliable and could leave corrupted viewports during the deletion process which would crash the platform if a message had to be displayed during the deletion process.
  • messages reported in the "pause at event" debugging mode are now also logged


  • Writing a table with the fixed width column option now writes a totally empty cell if a column is formatted with a width of 0
  • Have increased custom colour count from 16 to 48 These are arranged in 3 banks of 16

The colour palette editor now properly updates the system when a colour palette is loaded

  • Gantt graphs now only show labels that are members of their label subset rather than showing them all
  • Fixed a bug when adding to sub label list - the list was incorrectly validating for duplicates when the Local Index option was on for a sub label list


  • To remove ambiguity from tupling names, I've changed

"Tuple Get" to "Put Tuple Into Item" "Tuple Set" to "Get Tuple From Item"
This makes the data flow more explicit but also swaps the point of view for the operation from the item to the table.
This makes more sense to me because the parameter specified along with the operation is the table, not the item.

  • Fixed attref scan bug in


  • Fixed labelling of file write "No delimiters" in dialog


  • Paint images can be stretched and scaled

Large images are now scaled down automatically rather than the system complaining about them..
Reselecting the image reverts to the original size

  • Paint images and avi objects now show the name of the target in their editing context menu
  • Ctrl-right click in paint mode always shows paint background menu even if a paint object is under the mouse
  • Have implemented right mouse button (extended keyboard) windows key for panel background
  • double clicking on a message dispatcher also flashes box around message entry to assist in locating it
  • can copy and paste most view types into panels and dynamic screens

(views pasted into dynamic screens will only paste if they conform to the scoping rules. Panels can contain views of any model data regardless of its location.

  • Off screen object location

control clicking on an object palette icon displays a popup if there are any objects of that kind on the screen. The popup names the objects and gives their co-ordinates (centre). Any objects off the screen are flagged with a '*'.
Selecting an object will highlight it with a flashing box. If the object is outside the current screen, a message is given and if confirmed, the object may be dragged into the current window area.
This enables review and retrieval of objects which have "fallen off" the modelling area due to changes in window size or positioning by model code.

  • Meta panels can now contain queues, dispatchers, in trays and out trays Meta panel switches can now block items in queues
  • Breakpoint control

Subsequent breakpoints in the same thread can now be disabled using a checkbox in the breakpoint dialog. They are automatically re-enabled upon "continue" of the run
In addition the model can read and set the "Break Point Master Control" system attribute which provides convenient control of any breakpoint(s) in the model. This works in addition to modeller defined breakpoint control attributes, enabling breakpoints at complex conditions or at certain stages in a long loop to be activated.

  • MAJOR REWORK of all object, view and paint object context menu handlers

Removed old code, all menus are now "one shot" (they dont stick around after one action. I did this to make the internal handling consistent between these objects as it was previously very messy.

  • Paint objects can be shift clicked and dragged along with other objects
  • you have to be in paint mode to shift click paint objects but the selection set is common
  • The paint Other Options -> Show All Hidden option is now fixed.
  • ANY selected objects can now be aligned and distributed using the new options in the Selection Click menu. This menu only appears when an object in a selected set is clicked with the LEFT button. The Right button always shows the individual object's context menu.
  • BUGFIX to item tables and tuples - the validation was preventing a Tuple SET
  • Migrating a routine attribute to a portal attribute now updates references in that routine to point to the portal attribute


  • multiple broadcasts with the same name no longer added
  • Update interval handling has been reworked again, implementation is now simpler and more robust
  • can handle unusual circumstances without clock advancing forward, eg: Table Driven Entries which are subsequently "cancelled"
  • Interactive View broadcasting was broken - if not all sent attributes had a matching item attribute, the received attributes may be scrambled.
  • overlay graph click now sends the original table column for _col, not the overlay column #.
  • billboard tables were not properly being terminated when the engine was stopped. This was causing a memory leak and possibly strange values in the table when stopped.


  • fixed crash due to not properly handling item cloning for itemtables


  • Fixed crash bug when a table with custom cell fonts was sorted. Sorting of formatted tables will now be much faster as well.
  • Implemented new table column option "Write Using Fixed Width"

When this option is turned on, the column is written/exported using fixed width formatting. With this option on the column width (if non zero) field and the column alignment (Left,Right,Centre) take effect when the data in that column is written.
If shorter than "width", the column is padded with spaces. If wider than "width", the column is cropped.

  • Button broadcasts no longer cause the _Run Pause / _Run Continue broadcasts to be sent when they are processed unless the "Continue Run" option is selected.



Itemc can carry references to table in a model so it can be referenced anywhere in the model.
To use an item table reference:
In the Item Edit menu, create a named table reference for the class, say called "test".
From now on, when editing a routine with that item flow involved and you select a table, you will now have "<item> test" available, enabling use of the item's reference to supply the table as well as the original tables and <Dynamic>.
Before you can use the reference, you have to point it to a table. Using a routine "SET", assign the reference as follows:

  • make "Target" a TABLE attref with the item table reference you want to set up (eg: <item> test)
  • make "Set To" a TABLE attref with the table you want to point TO

To actually use the reference, set up your cell/column/etc reference as normal but select the <item> table reference from the table list instead of a normal table.
You can clear an item table reference (so it points to nothing) by using the CLEAR operation with the target being set to a TABLE attref with the item table reference you want to clear selected. This will not clear the table itself, just the item's reference to it.
A item table reference only allows reading of the table
Clicking on an item with CTRL shows any item table references and what they are pointing to.
Column labels will be looked up on the fly but cannot be browsed in the editor, you have to enter the name manually.

  • tables can now be deleted even if references exist to them. This will assist in migrating tables around a model where a higher level table is to be deleted.

ITEM Table references

SET and CLEAR now implement for target which is an item table reference

  • vertical queues and dispatchers no longer display as hairlines if the overflow indicator is hidden
  • dynamic file name now supported for file operations file size, delete and save image
  • routine comments are now included in routine descriptions generarted via the Model Info menu option.
  • Log Driven Graph views now can send a broadcast when the graph is clicked

The following item attributes will be tupled to:
"_command" currently 1 for a click "_time" the x co-ord value (normally this is time) "_y" the y co-ord value

  • Grid View Graphs can now send a broadcast when clicked

"_row" the row clicked "_col" the col clicked

  • Overlay Graphs can now send a broadcast when clicked

"_command" 1 for a click on a point "_row" row, col of the point clicked "_col" "_x" graph x co-ord of point clicked (snapped to point) "_y" " y "


  • fixed bug causing delay box to appear on run start when it shouldn't


  • reworked the way Planimate tracks when a window is "Busy" and locked from further events. Have co-ordinated the handling of multiple windows/ viewports to prevent events getting to a window when they should not.

This was causing crashes if model runs were continued via a viewport background menu

  • "run realtime" mode now is much more transparent in operation and does not present the "pause" run menu when processing a realtime update
  • font can be selected for attribute and cell views
  • "edit order" can be specified for cell views

this moves the edit window in a predefined order between cell views on a panel as they are edited

  • the system attribute "Run In Real Time" can be used to turn on and off the realtime run mode of the engine (where the clock gets stepped along by the realtime clock)

Note on the Realtime Mode
Realtime mode involves sending a "continue" message to the engine 2 times a second. A model can use the "_Run Continue" broadcast to capture this event and perform a "background" task. This task/thread will be executed even if the user is editing a cell/attribute. It must not perform any time consuming activity and must not generate a dialog. It should be heavily validated to ensure the realtime task will not stop the model with a message under any circumstance.

  • new display option "dont show background run menu" does not display the background menu in simulate mode.


  • fixed major slowdown bug in T due to extra redraw in print check code


  • "Simulation Model" to "Application" conversion enhancement

To make it easier to convert simulation models into applications, a new display option has been added which reduces the need to replace all scheduled entries by broadcast entries.
When the new "Modeller Starts Scheduled Entries" option is turned on, all scheduled entries will no longer automatically post events when the engine is started. This will enable the model to sit at "Time Zero" as long as the modeller wants.
When the modeller wants to start the simulation run, the new routine operation "Start Scheduled Entries" can be used which will cause all scheduled entries to start processing their schedules, as used to happen automatically when the run engine was started.
The "Start Scheduled Entries" operation only takes effect once during a given run of the engine, and only takes effect if the "Modeller Starts Scheduled Entries" option was "on"

  • Find and replace implemented in the routine editor

The Replace menu appears when you right click on a line in the routine editor. It by default is applied to the line clicked to the end of the routine, this can be changed.
An original and new attref can be specified in the replace dialog, all instances of the original attref are then replaced by the new one.
Two important special cases are handled which makes the replace powerful

  • If the original and new attref are both "Value" mode attrefs, then all instances of the "Value" attref are replaced, including those used to specify rows/columns in table cell lookups, matched cells, row lookups etc.
  • If the original and new attref are both "Table" then all attrefs referencing the table (in any mode) are updated, not just "Table" mode attrefs
  • new value format to display fixed with integers with leading 0s
  • new option for file write prevents any delimiters being written between columns. this can be useful when packing together table columns
  • New routine operations

"Set Column Tuple Name"

  • Enables the tuple name of a column to be changed, much like changing the title of a column. This resets the tuple caches so tupling will find the new column. However, as is the case for inserting/deleting columns, using constant column labels to identify the column requires the engine to restart.

"TableView Row Scroll", "TableView Col Scroll" "Set TableView Row Scroll", "Set TableView Col Scroll"

  • These give the modeller access to the current scroll offset of a table view. To identify which table view, the modeller must specify both a table object and a model panel identifier. Only one tabular view of a particular table on a particular panel can be accessed.

"TableView Rows", "TableView Cols"

  • These give the modeller access to the number of rows/columns that the table view last displayed. This can change on different PCs due to differerent display drivers, font scaling and panel zoom. It is important to the printing enhancement (below) since it lets the printing code know how many rows/columns were actually rendered, so the correct scrolls can be computed
  • New system broadcast "_panel printed" is sent after a modeller-initiated print of a panel is complete for that panel. It will tuple through two item attributes:

"_page" - current page number in print job, starts at 1 "_panel" - value from the panel label list identifying the panel the modeller is currently printing

  • Enhancement to printing (making use of the new routine operations) enables a page to be repeatedly printed under model control. The model can re-submit a page in respose to the "_Page Printed" broadcast after making adjustments to the scroll of table views on the page

I have developed a model which demonstrates how to print a large table over many pages, let me know if you want it.


  • fixed bug in dispatcher - was not properly deregistering broadcast usage
  • moveable viewport (testing)
  • rework of way animation update interval events are posted to prevent "clock creep" without losing update interval scheduling
  • holding control while clicking on a section on a track changes the delete option to delete ALL tracks on the current panel


  • migrate to owner option for routine attributes (in Attribute menu in the editor) makes the routine attribute a portal attribute
  • switches now have an option to make them visible during the run


  • have fixed simulation pause/continue handling so it properly detects a run completion. This was broken in the rewrite earlier and an extra "continue" was always required when an exit wanted to "stop" a run
  • Have put an extra check into the code which posts async events (eg: video completion) to prevent it crashing the platform if a video completion occurs at an unexpected time (eg: during an error dialog)
  • new system time attribute "Real Time Of Day" gives the number of seconds that have elapsed since midnight on the current REAL day, as read from the pc clock.
  • The following system attributes were not properly being named, due to the missing "Activity Bar Colour" name in an internal table:

"Clock Visible" "Background Run" "Item Owning Item ID" "Have Current Pending Events"
Any code using these will need to be corrected.
I am surprised noone noticed this, all 4.22 is affected.


  • format for the Week, Day (from 1) has been changed to keep it distinct from time modes which number from 0

Times are now formatted like: W1 D2 12:34

  • The "Find" tool now makes a distinction between finding exits which stop the run and exits which pause the run

= The "Pause Once Ready" option has been renamed to "OLD: Pause After PreInit" since it has absolutely nothing to do with the current "Ready" mode of models.

      • It should be OFF unless you are relying on users interacting with models during the engine PreInit stage which is obsolete these days.

I would like to phase this option out. Advise if this is a problem

  • The Find system now finds table columns with matchine names/titles and also table columns set for "Clear At Start"


  • reworked scenario loading, fixed problems in prereading multiple tables


[new file format]

  • Table cell click broadcast now sends the broadcast when the space bar is pressed with the table having focus (instead of editing the cell)
  • New option on table views "Send Broadcast After Edit"

This enables the table to be edited normally but sends the cell click broadcast (including the _row and _column) after the cell has been edited.

  • implemented new time format "Week, Day (from 1) which formats relative times in weeks, days, hours and minutes.

This gives output like 1w 2d 12:34
Weeks are counted from 1 Days are counted from 1..7
NB: This is intended as an output format and does not have strong input validation at this stage


[new file version]
This release implements portal security
A portal option tags a portal and its subsystems as "Only For Administrators" You only need to set the option for one portal and it will be in effect for all subsystems within it.
This prevents the portal from being viewable unless an administrative password is provided. This is set in the Edit->Admin Password menu. The default password is "admin" (you will need to enter this to change it) and with this default, Planimate automatically grants admin access when the model is loaded (so there is no protection by default).
If the admin password is changed from its default, the admin protection is activated (after the model is reloaded). When an attempt is made to access a protected subsystem (either by direct clicking on a portal, following a jump button or a model initiated screen change), Plnimate will prompt the user to provide the password.
The protection does NOT apply to panels associated with a protected portal, so these may be linked to without the user needing the admin password.


Major Recoding
[no functional/file format changes from "k" but alot of code has been rewritten to support upcoming enhancements]

  • FEC event handling has been streamlined for high priority 0 time events. Should make things slightly faster
  • A multiserver with a zero delay now schedules a priority event which is posted ahead of any other events at the current time. This makes it much more likely that the next thread to execute after the item reaches the multiserver is the item leaving the multiserver.
  • All SAVE code has been reworked so I can now intercept the saved model data stream. This will enable me to implement on-the-fly scrambling of the model file, to prevent users looking at the model code


  • new options and behaviour for attribute stat/views and buttons

= If you run in InterDyne mode and use the Pauseable 0 Delay object, this change impacts your models!
When paused, if any current time events are pending AND the system is in InterDyne mode, then attribute views and buttons will not respond to user interaction
UNLESS their new option
"Can Send When Events Pending" (for buttons) "Can Edit When Events Pending" (for attribute views)
are on.
This builds on the premise that a model does not normally pause until all zero time events have been processed, but can be forced to pause using a "Pausable 0 Delay" - in which case new broadcasts and attribute changes could impact badly on an incomplete process.
By default, the platform now blocks these broadcasts/changes, for safety, but these options above allow the new behaviour to be overridden at which point the modeller takes the risk for ensuring integrity.

  • new system attribute "Have Current Pending Events" returns true if the FEC has any events scheduled to occur at exactly the current time - meaning that there is some unfinished activity at the current epoch which has not yet occured - either because the user has paused the model or as a side effect of activity in the current thread (eg: unblocking).

This is intended to enable modellers to check whether other 0-time activity is in progress when a new broadcast is initiated by the user interacting with the model. The modeller may want to provent this second broadcast from proceeding in such circumstances.

  • Platform change: In InterDyne mode, the paused background menu will now enable just "Continue" if the FEC has pending events at time 0.

This enables users to continue a run they paused (enabled by a Pauseable 0 Delay) without having to use the main menu "Continue"
In addition, the pause popup which occurs while a run is in progress will now only show "Pause Run" - again in InterDyne mode at time zero.


[new file version]

  • Date time dialog no longer has the NULL checkbox - still accepts "-" and <del> for entering a NULL time
  • implemented date/time editor for cell and attribute views
  • added ability to send a broadcast when an attribute view (stat) is edited. Unlike table etc. broadcasts, setting this broadcast does not stop the click from editing the attribute, but causes the named broadcast to be sent once the edit is complete. The modeller can use this to trigger an update once a field is edited.
  • sort alphabetic option now available for sub label lists (so dialog lists will be sorted)
  • Scenario loading is now prevalidated before the load starts. Made the table column error message more friendly
  • new calendar time format : Day of Week

eg: Mon, 1 Jan 2001

  • the 3 system_UI broadcasts are no longer tagged as in use by the platform (they never were) and can be removed from a model if not used. They are no longer present by default
  • fixed more pausing bugs which "i" didnt properly address


  • Table/Gantt/Train Graph click broadcasts

previously these were sent to the dynamic scope associated with the VIEW. They are now sent to the scope associated with their source table.
This makes them safer when systems are copied

  • Loading integrity issues
  • new descriptive message appears when a loaded model is too "new" and the load is avoided.
  • new main menu "model info" option - just gives version info of model without loading it
  • Error Handling for modeller debugging
  • the error dialog enables routine attributes to be browsed if a routine attribute was active at the time of the error
  • on model errors, item and routine attributes are written to the _plerror.txt file
  • calendar window now used when entering calendar times in tables

This replaces the freeform editor and enables a date/time to be selected using a calendar. The window consists of a number of fields into which numbers may be typed or arrow keys used to change values.
When the down arrow button is clicked, a month calendar appears. The month and year can be directly selected within this dialog and the appropriate month calendar will be shown from which a date can be selected.
The check box is used to signify that the date is a Planimate "null" date.
For keyboard users, the date/time window has many shortcuts:

  • arrows move between fields
  • esc cancels edit (or closes month view if open)
  • enter accepts edit
  • tab moves to next field
  • space moves to next field, stops at the enable checkbox and toggles it
  • F4 opens the month view
  • "-" or <backspace> clears the "enable" checkbox, marking it as a null time
  • numbers are interpreted directly (even for month fields)
  • "/",":" moves to next field so you can type: 25/12/2000 10:23:40 and it will be interpreted correctly
  • ctrl-c copies date to internal buffer (also into clipboard)
  • ctrl-v pastes the last copied date (from internal buffer only)

  • new routine operation - "Breakpoint"

This is useful for debugging routines, loops
It puts up the standard error dialog so attributes can be browsed, but otherwise enables the model to continue
An attribute associated with the breakpoint can be used to control if the breakpoint fires or not. This can be tied to a local variable (ie: only fire breakpoint under certain conditions).

  • rounding of time changed
  • times are now rounded down to the nearest second both for calculation and display - previously the display was being generated by rounding half seconds up.

Times before the model start run time reference (ie: -ve numbers) are also now rounded down, previously they would be rounded up.

  • attempting to extract date etc. of a null time now yields an error message
  • FIX - engine now properly animates side effect broadcasts sent as a result of a broadcast triggered by a button. Previously the broadcasts etc. were occuring but not being animated as the animation system was sensing the upcoming "pause" once the zero time activities were completed.
  • FIX - a button initiated broadcast was not properly handling the "continue" option until some interaction was made with the model.
  • background menu not shown if at time 0 in interdyne mode


  • fixed a resource/memory leak in viewport handling implemented in




  • if multiple viewports somehow attempt to display the same panel or subsystem (which is not allowed at the moment) one will display a blue background instead of the system crashing.

Also catches the case of subsystems with viewports in them viewing each other in a circuit (the hall of mirrors...)

  • chaging subsytem due to an interaction within a viewport now is valid and no longer crashes the platform
  • multiple viewports on the one panel are now reliable and interactive deletion of one actually deletes the correct one...

With these bugs fixed/trapped, I am no longer aware of any method of crashing the platform (or generating an "Unrecoverable Error" dialog) but no doubt modeller creativity will find a way before i know it :)



  • have rewritten basic graphical rectangle handling. This had to occur to remove old code which is part of the reason Planimate does not fully support multiple windows on a model.

As a result, graphs, gantts and traingraphs now work properly in a viewport.
The code rewrite affects: horizontal time scroller, vertical scrollbar on tables, table graphs, gantts and train graphs, log viewer, icon selector, the palettes, "stat" view displays in general, paint objects.
They've tested out OK but look out for any new problems in displays. No changes have been made to engine algorithms or file formats.

  • have added a new diagnostic check to catch possible source code errors with window management. Apart from ViewPorts, I'm not aware of any means of generating these.

These are now reported as "Application Warnings" and must be taken extremely seriously as they mean something has happened that I never expected. These are not modelling errors (though they may be triggered by one) - they are errors in the Planimate application itself which I place top priority in fixing
These messages are also logged to PLANIMAT.DBG

  • fixed memory corruption when a subsystem containing a train graph was copied and subsequently deleted. This would cause a crash soon after.


  • A paused model at time 0 now displays state as "Ready". The old "PreInit Paused" state (where the engine pauses once attributes have been initialised, when the "Pause When Ready" display option is on) is now called "Init Ready".

I'd like to phase out this "Init Ready" state

      • PAUSE WHEN READY should be off for usual InterDyne applications.

Is anyone using the "Pause When Ready" state? Please contact me.

  • CTRL-S now saves model when paused (this will stop and restart the run)
  • Train graph tables can now have a "_thickness" column to drive the thickness of lines. This will probably be required as dotted lines drawn as single pixel lines are very thin


  • lower margin for train graph is now computed similarly to the top margin, this should avoid large gaps at the bottom for small graphs
  • have changed the code which draws dashed/thick lines It now uses a different API calls which enables me to draw thick AND dashed lines.

Apart from not drawing thick lines, the previous api call had a bug if the first line drawn was not dashed.


  • Enhanced the "find" system

The "Advanced" button in the dialog enables you to find specific instances of objects configured as specified.
Clicking on an object name and selecting "Bring To Front" now actually highlights simulation and paint objects.

  • click Broadcasts for Gantt and Train Graphs now implemented... not tested much yet, demo model to follow



This version will require FULL testing as I have made many coding changes especially to broadcasting, table editing and run control.
There is no intentional change to how the system operates (except where noted below) so let me know if something unexpected happens with this verison.

  • Have implemented a capability which enables a modeller to set up a table view to send a broadcast when a cell is clicked instead of editing the cell.

The "Cell Click Broadcast" option in the Table View Edit popup (click outside table cell aread to get this) enables the broadcast to be associated.
When sent, the broadcast will carry two attributes which can be captured by having item attributes "_row" and "_col" on the receiving item.
These will give the row and column clicked/doubleclicked by the user.
The broadcast is only sent if the table is clicked while the model has been started. I dont intend having an option to start the run automatically see the next note.
= I am re-considering the validity of the "Handle Without Initialising Run" button broadcast option and would ideally like to phase it out.
The overhead in initialising/shutting down large models makes models using this feature feel very sluggish to users. With modern modelling techniques there should be little or no need to "stop" a model run, in fact the intention is that in InterDyne (User) mode, the model will never need to be in a "Stopped" stage from the Users point of view.
Please contact me (Rick) or Doug to discuss this if it interests you as it will impact on our evolving designs.

  • Random error message in dialog label fields has been fixed (was not properly testing for existence of label)
  • have altered system so load/save are still available during a running model. Selecting these stops the model then restarts it once complete.

If a model is loaded via the menus while one is running, the one loaded is automatically started.
<this is all part of the move to abolish the interdyne-stopped mode of the system>

  • Reworked viewport display code to prevent crash if a viewport triggered an error message during its display (eg: missing paint image) which caused a re-entrancy problem.
  • reworked the way the "protect from edit" column options and "In Place Edit" table view options are implemented. The cell menus and row menus are now more appropriate for these modes
  • Rewrote the broadcast system to merge all the broadcast sending code.

System needs testing to ensure broadcasts sent under the many differnet contexts (buttons, change objects, exits, dispatcher) and broadcast options act as expected. See above note on "Handle Without Initialisation" as well.
This is a mostly untested beta release
= Have rewritten the master event processing loop in the engine to support future developments, more consistent error trapping and clearer internal structure, including better zero time control, and real time model operation.
Every model depends on this code and could be impacted by the changes if i've missed something. In particular the control structures which hangle Pausing and the stopping of runs (normal or errored) have been changed. Please test thoroughly before commiting to it.

  • a new option on multiserver "Pauseable 0 Delay" configures the multiserver to enable a pause of the model, even at zero time (which was disallowed except for debugging in


This enables a modeller to specify "pauseable points" in a long processing sequence which runs in zero time in a very controlled manner.
Multiservers in this mode will shortly have a distinguishing appearance so the modeller can be alerted of their prescence.
Selecting this option

  • zeros the dalay of the multiserver for all classes
  • resets its capacity to 1
  • instructs the engine that a pause is OK at this object (if one has been requested by the user clicking during the run)
  • the "Run Realtime" display option now makes the model auto-continue to keep track with realtime, no matter what is active (popup, dialog etc). This can lead to real problems if a dialog is active, for example, so consider the "Run Realtime" mode experimental.

I'm not aware of any models relying on it in its previous form, let me know if you were using it since engine operation in this mode is in the process of being reworked.

  • The new system attribute "Batch Run" is true if Planimate was loaded with the /BATCH command line option
  • The new system attribute "Item Owning Item ID" returns the ID of any item which OWNS the current item if it is a message item. If the current item is not a message item, -1 is returned.
  • A model initiated scenario load/save will now prompt the user with a file selection dialog if the file name label contains a '*'. If the file name label contains an extention, it is used instead of the default SCN extention.


  • spatial links properly update co-ords for moving portals even when their lines are hidden
  • new button action "Load Model" enables a model name to be specified which will be loaded when the button is clicked.
  • copy cell for individual cells
  • reordered formatting options for table column editor to match order in attribute editor
  • rewrote model exit/saveas code to support switching models


  • Colour palette now can be saved and loaded from disk
  • Copyright on opening banner page updated - new _!SYSTEM.DB
  • item details popup now wider
  • now sort broadcast labels at entries etc.


  • New option for portals enables them to respond to clicks in interdyne mode (sending the clicked broadcast) without having them respond to drags
  • create sort index now sets identical rows to the same index value

"identical" means the source cell values are the same, not the formatted strings.


  • A new table operation: "Create sort index from column"

This fills a table column with an index indicating the alphabetic order (ascending) of the FORMATTED text in the specified sort column.
By then sorting over this index column (using a regular sort), a table can be effectively sorted alphabetically regardless of label index.
Constructing the formatting strings may take a while for long tables so it may be useful to keep the index column around for rapid alphabetic sorting, only regenerating it when the strings change.

Combined with the "create label list from column" option, this gives the modeller a lot of power to do their own re-indexing without having to write to files.

  • NEW mode for dispatcher: SEND SCOPED BROADCAST

This mode enables a dispatcher to send a specific broadcast to a hierarchy of subsystems. The top is specified using a portal in the object list.
Unlike a change object broadcast, the broadcast is sent immediately, whilst the item waits in the dispatcher. The item only leaves the dispatcher once all listening entries have produced their broadcast items and they have flowed as far as they can before encountering capacity (which ends their epoch).
A modeller can now be assured that all listeners for a broadcast have received and had a chance to process it without having to put an explicit delay in the originating items path.
The broadcast is scoped to the subsystem under the object which is specified by the attref set up when editing the dispatcher.
If an index of 0 is used, the broadcast is sent globally. However if possible use a scope to make your model scalable.
Broadcast dispatchers have a solid dashed baseline.

  • EVENT processing change

The system will now only "pause" once all events at the current time have been completed. This means all side effects from an operation will be applied at the time the model is paused.
For debugging, this can be overridden via the debug options

  • ALL DEBUG OPTIONS are turned off when the system is switched to InterDyne mode. They stay off if switched back to editing mode.
  • Queue and dispatcher drawing has been enhanced. If the "Dont Show Overflow" option is Off, OR the maximum size equals the screen size, then the numerical "overflow" icon will never be required to show. Their size now reflects this, meaning less screen space is wasted by these objects.
  • fixed crash if an error occurs during model initialisation which attempts to show modeller a screen that had not been initialised yet and send that screen a _Panel Opened broadcast.

Panel Opened broadcasts are no longer sent after an error has occured

  • Dynamic spatial link operations now properly validate that the "from" and "to" portals are on the same screen, to prevent the model becoming corrupted by spatial links attempting to connect through screens
  • Now give a reason for not loading a scenario based on a different time reference from within a routine rather than trying and causing a platform crash
  • switches default to assume no blocking
  • routines default to execute only during move
  • stat hide names is off for attribute stats (so names are initially shown)
  • Have changed scenario handling to map the default scenario name (SCENARIO.SCN) through the INI file mapping system so it can be overridden in an INI file to a modeller specified default, including a folder
  • Busy cursor now displayed when running in interdyne mode
  • cyclic selection now an option for sub label lists
  • dialog fields associated with a name sorted label list are now also sorted
  • have installed some default palette colours in the user custom colours area. These can still be overridden as required.


  • Runtime system now pauses before the next event when running to "realtime", "animation starting" or stepping through events.
  • Have prevented ghost "delay" boxes from appearing when: #1 A _Model Ended broadcast sets off a "stop" exit again #2 An error occurs during processing of the _Model Ended broadcast when the model was otherwise running in time advance mode
  • Run realtime option now implemented for relative time mode models as well the time the model is started becomes time 0
  • delete label operation added

removes a label definition from a normal label list (no effect on sub or other label list types)

  • added optional "_style" column to traingraph display (holds linestyle value) and fixed handing of the optional "_color" column to properly map the colours.
  • Draggable portals now respond to click in interdyne-stopped mode by starting the model to pass the click to the model. Like buttons, portals have an option to prevent the model staying "running" once the portal click completes. However, this may really slow down interaction - if the run has to be started and stopped for each portal click. I dont recommend working this way
  • scenario load/save now available in interdyne stopped mode


  • system attribute to show/hide clock
  • fixes the use of dynamic tables in sort operations (was not realising the parameters for the sort dependend on a dynamic table)


  • table columns copied during runtime get empty tuple label names since there is little point copying the original columns label name


  • Added new option to fields in dialogs "User Can Add Labels"

If a field is a "label list" selection type field, AND the label list concerned is not "Only Modellers Can Add" then the dialog will accept strings typed in which do not match known labels and confirm with the user that they want to really add them.
I've tightened up validation if the string entered is not known AND the "User Can Add" option for the field is off. In this case, a message appears prompting the user that the label string must be set to something already recognised.


  • Added Bitwise X-OR operation
  • Rearranged order of value format modes
  • added column # to column menu and column format copy
  • Bug fix to dialogs - I was validating the row index for cell references in fields incorrectly
  • Change to undo handling in tables to properly undo formatting changes in cells


  • New "special" routine operation supports printing of multiple panels under model control. The modeller can specify which panel (panel label) or portal (object label) to print.

Many panels can be queued for printing using this routine operation. The actual rendering and printing is started once the routine ends.
Each panel can only be queued once within the one change object (to prevent flawed logic from blowing up the printer spooler...)


  • Have rewritten spatial link dynamic colour handling
  • colours once set persist across runs
  • saving the model saves the link colours
  • the link colour can by set during editing



I have rewritten the way cell-by-cell table formatting is represented and stored.
Now support editing of cell formatting including

  • text and background colour, font and units (which overrides the column units)

This is a first release after many changes to the table code, so take care to backup previous model versions.


  • Error handling on value entry tightened, dialogs and attribute stat edits dont take on a value if it causes a validation error
  • form error handling improved
  • if an error in an input field occurs, the dialog takes the cursor to the error field and stays open rather than accepting
  • Crash bug fix:

If a newly created table column was named with a long name (> 20 characters) the column tuple name would be set to a name > 20 characters. If item attributes were now updated from the table, an item attribute could end up having a name > 20 characters which would overflow the internal buffers allowed for an item name in the name processing code.
I have added a check to prevent a long title being made a column tuple name and stopped the crash which caused us to find this (column label update) but existing item/column tuple names may still have names > 20 characters - if you notice any, make them shorter.


  • increased formatting width for multilabels to 63 characters (the limit for normal labels)
  • enhanced label list export and import mode options
  • system attribute:visible panel ID # returns the panel index of the currently visible/frontmost panel
  • PANEL objects such as paint buttons can now reference tables and attributes on the portal hierachy which owns the panel, not just the "top" dynamic screen
  • Gantt y scroller now updated properly, should work reliably
  • Cell stats also dont show zeros when column configured as such
  • activity color for status bar now programmable/readable as a system attribute
  • Directional spatial links implemented
  • an option during edit of the spatial link
  • a new routine operation enables creation of a directional spatial link

the runtime link enables two spatial links to exist between a pair of objects if they are directional in opposite directions.

  • Unreliable "continue" after pause now fixed


  • label lists have a new option "Auto-Add Labels On Import" which will make them silently accept new labels without asking the user. This enables specific label lists to automatically accept labels while others ask the user for confirmation
  • label list import dialogs now show the list nam (in dialog / in title of dialog)
  • right justify option on table columns right justifies title text on primary and second title lines
  • dont show zero option on table column leaves zero entries blank in the display (including 0 labels)
  • have implemented option in change object to enable "dynamic file names" as for the scenario load/save. The file name option in the menu enables you to specify an attref whose formatted value is used as the file name.

This works in combination with INI file remappings and the user-browse option which are applied and display the looked-up name.
In this mode, the Edit->Files Referenced will always display the LAST file accessed by the change object.


  • if the table cell selection is moved (with keys) or dragged beyond the rectangle of its parent window, the window scrolls to show the selection. Note: this is the window scrolling, not the table.

I have also installed this scrolling into the "show object" code which flashes a box around an object to show it.

  • Table selections are not lost when the window is scrolled/redrawn.

Table view selections remain when changing and returning from another panel

  • Have reworked naming of object / panel label lists. Its no longer called "Exporting" to avoid confusion with data export/import.
  • Attref editor allows length attribute names (20 characters) to be typed as well as browsed
  • when a column tuple name is renamed, you get to confirm if references should be updated


  • model info includes more in table descriptions including column details
  • have changed the pause code to handle a pause exit while processing the _run start broadcast

I removed an update i think was not needed anymore. Look out for other pausing problems particularly with menus or dialogs.

  • fixed silly bug in the "date only" code which was causing dates entered into input fields to yield a silly error message dialog box


  • "migrate to owner" implemented for attributes as for tables
  • new "Date Only" time field suppresses display of time fields in dates
  • have added checks to prevent very long file read elements (>256 characters) from crashing system. This occured when a tab delimited file was accidently read using comma delimiting, creating long strings for each read element.


  • Enclosing double quotes are now stripped for non-label data as well as label data, enabling import of double quoted values, times etc.

The "Remove Enclosing 's" option must be OFF for the double quote filter to operate, otherwise the single quote filter takes precedence.
NB: In all cases, any embedded "s are converted to 's since planimate cannot handle a " in a label field.


  • Sound files are now registered as used in the Files Accessed list
  • A label list can be constructed from the formatted contents of a table column using the "Create Label List From Column" operation.

This opens up interesting possibilities with multi-label formatted strings since they can be converted into "normal" labels and used for display, selection etc.
I do not do any duplicate handling, so if "foo" appears twice in the source column, it will be allocated 2 separate label indicies.
Indicies are allocated from 1 unless there is already something in the target label list. I suggest starting with a cleared out list.

  • New Table routine operation: "Table Sort Dialog" displays the "Sort" dialog for the nominated table
  • Any multi-column dialog now supports clicking in column titles to sort them. This is useful with the Edit-"Files Accessed" list as it sorts and groups all files with the same name together.

As with column widths, none of the editors retain the sort order, but it may be useful to browsing.
The editors should work OK with resorted lists, look out for any unexpected behaviour.

  • Update to attribute reference tracking attributes referenced in dialogs now also report the change object if the dialog is in a routine and the attribute modified flag is properly set for read only fields


BUGFIX - the continue run system attribute now works again, was broken by a change in C


  • SCENARIO LOAD AND SAVE can now be initiated by the model

New "Special" routine operations enable a routine to save/load a specified scenario.
Scenario number must be from 1 to 8 and corresponds to a scenario in the Edit->Scenarios list.
The Filename should be set to a label list with an entry containing the name of the file. The extention must also be included in the name.
The name is mapped through the INI file mapping system so an INI file can override the file name if required.
If the filename is "-" (no quotes), the file name set up for the scenario is used instead. If a given scenario set is only being saved to one file, its better to use the default name, it can then be easily changed by using Edit->Scenarios.
When loading a scenario, the scenario number doesn't really make a difference (it still has to be valid) but is provided so that the default scenario filename for that scenario number can be used (by using a name of "-" in the routine) .

  • spatial link color can now be changed (new calculation mode)

changes color of any link between two objects. If the link does not exist, nothing happens.
A redraw is required after this if the link colour is not being set for a link added in the same routine/epoch. In these cases, an automatic redraw *is* scheduled.

  • Year of date calculation operation decodes the year of the given time.

If running relative time, first year is 1 If running calendar (most models these days) its a 4 digit year.

  • viewport properly applies scroll when changing the panel zoom level

note: If viewport scrollbars are visible, the viewport may change the scroll if viewed at a high zoom out level. If scrollbars are visible, any scroll set up by the user is retained.

  • have increased the minimum viewport size to avoid small viewports being created which can no longer be edited (they get completely consumed by scrollbars)
  • routine editor retains window scroll as rows edited [this should cut down the mumbling and swearing... :) ]
  • default width used by stat views and table columns updated updated for the newer time and calendar modes to show the time fields instead of cropping them.
  • dial and paint image display

if an image fails to load ONE error message is displayed and details are logged to the planimat.dbg file

  • I now prevent image redraw of viewports at inappropriate times (while model loading)
  • routine operation menu now has separate sub section for spatial link operations
  • have significantly increased ODBC command buffer space (now 16k)
  • tupling to/from an item carried by another should now actually work
  • write to file operations now have "quote all" option to quote all fields (including titles) useful for comma separated files
  • Columns and rows of tables written to file now support formatting and the quote all option as well
  • A new system broadcast _VIDEO STOPPED gets sent to the model when a video clip finishes playing
  • have reworked broadcast system slightly so button click broadcasts put the engine into "simulate" mode while their event is being processed. It should be OK but look out for any problem with button broadcasts.


  • reading a tuple doesn't mark the table as modified in the references


  • fixes crash bug caused when a table is edited, the active panel changed and a key typed (eg: ctrl-s)

The focus was being left on the now hidden table

  • fixes crash bug with bend points. Copying a bend point did not properly copy some new management structures leading to a crash when the copied object using the bend point (spatial link) was deleted.

saved models are OK
4.21 [new file format]

  • === IMPORTANT ===

The system will now complain whenever a model is loaded which does not have both "strict attrefs" and "strict lookaheads" display options turned on. The model will still run, but the warning will always appear when its loaded.
These options were introduced before the conference last year and must be kept ON to assure integrity of the latest lookahead capabilities of the simulation engine.
The options were provided to keep older models running. These models used a different set of rules which the current engine runs only with its safety checks disabled. The time has come to abandom compatibility with the old rules.
The October conference notes include material on dealing with lookahead.
Generally its a case of setting change objects to "only during move" and switches to "assume no blocking" - unless you need to block an item at a switch in which case you have to deal with lookahead issues.
Also see release notes for


If you have problems converting your model, please seek assistance from Rick or Tony.

  • ADDED: Panel label list

Similar to an object label list except dynamic and panel screens can be added to it. As for objects, they must be uniquely named and numbered.
You export a dynamic screen or panel using its properties menu. The <ADD> button in the panel label list editor adds the current panel.
I've updated the "make screen visible" to now work with a label from a panel label list as well as a model object label list. This means you can now make panels visible by model control.

  • Viewports in panels now implemented. A viewport in a panel can view a dynamic screen.
  • viewport option enables contents to be directly edited

when activated, the viewport gets a 2 pixel margin so its edit menu can still be accessed, since lcicks within the viewport are passed to the subsystem being viewed.
NOTE: many edit operations within a viewport may still fail (add panel, flow editing etc).
I have only provided direct click viewports to enable viewports with user draggable objects to be used in InterDynes. Dont expect too much from them.

  • viewport scroll can be set numerically to help tweak exact settings when the scrollbars are hidden.
  • scrollers no longer impose view limit if the redraw is due to printing. This should mean printouts of gantts etc work as expected.
  • new performance measures appear in the run profile

Evts/model minute gives a measure of how dense the events in a model are occuring. This will depend on model structure, update intervals settings, complexity of model dependencies such as unblocking etc.
Evts/real minute gives a measure of how quickly the model is running and will be CPU and system dependent as well as model dependent.
nb: real time is measured from when the model is started and includes any time spent paused

  • item attribute selection dialog has a new column which summarises the options. The letters used are as followed and are underlined in the editor (and can be used as shortcuts):

clea[R] at start (R for reset...) [C]onstant Include in [P]opups Include in info p[A]nels [I]nteger rounded Re[T]ain on paste/replace Range Chec[K]ed [S]cenario - Used in at least one scenario

  • have done some serious rework to label subsets and the base label list code.

Sub label lists now have an option to include the "-" entry which maps to 0. This can be included even if the parent label list does not have a '-' entry, for example object and panel labels.
Local indexing code has been cleaned up a bit to handle the 0/"-" index which is a special case.
Object, Panel and Sub Label Lists share common selector code now, let me know if something is amiss with the selection process.

  • Cell properties now shift with cells when tables are sorted (not with fixed length tables though - these are being phased out since VLTs do it all now)

The table block operations should now preserve cell properties.

  • A new column option enables reset of cell properties when a cell is edited or pasted over. Using this, cell properties can be used to indicate edited (or in this case unedited) data - once the cell is edited, it loses its specific property and becomes default in appearance.
  • Cell properties now support the "use default" background colour (255 * 256) + text color
  • added "play once" option to the video/AVI playback object (the new as-yet undocumented paint object...)


[new file format]

Added table cell properties
This is a new attref address mode enabling colour properties to be programmed and read for tables on a cell by cell basis.
These are set using colour values computed as follows:
property = background_colour_index * 256 + foreground_colour_index
(foreground is the text color)
(see CELLPROP.MDL for a simple example)

I've added an option in the table editor, in the [Table]->Advanced submenu to clear all cell properties for a table
Cell properties override any row/column colour settings. But you can keep a cell's default background/foreground by using 255 for the colour index.
Current limitations:

  • as for row colours, cell colours do not update the window unless an explicit repaint of the table is forced
  • no edit time way of setting cell specific colours, its been implemented for a run time requirement



  • dynamic spatial link deletion bug fix

Fixed bug in the handling of dynamic spatial links during runtime.
The bug: If Portal A is the origin of a link to Portal B and the link is deleted FROM B as a "B <-> A" specific delete (not an "All from B" delete), A's link instance table is left with a dangly pointer.

  • new "Debug" option "Dynamic Spatial Links" logs the creation and destruction of dynamic spatial links
  • have made significant change to the way objects are deleted to ensure spatial links/tracks/pipes are removed from a subsystem before the portals, I was not strict enough on this before
  • have added a number of new system integrity checks (the "System Error" dialogs) to check model structural integrity.

If you *EVER* see a "system error:Code xx" dialog, let me know. They should never appear.

  • Linked list Add(2) message now reworded and it only appears once
  • fixed memory leak in ODBC parser


  • added new Video paint object which will place a mediaplayer into a model window. This has options to auto-play (when shown) and to show and hide the scroller and menu buttons.

NOTE: there is a bug which causes events to occasionally be lost (i think its a re-entrancy issue) which will make Planimate stop responding to the mouse in the main window. If this happens, go to a different portal, click and return. The keyboard and menu still work.

  • added ctrl-shift-i to show the item menu if an item class is selected
  • selecting the "Bounding Box" line in a paint object now initiates a resize command, this may be easier to get to than the object corners for small objects. The new mouse arrow cursors come in useful here.


  • rewrote a lot of code to handle object co-ords as floating point, particularly the positioning of objects. This is to support spatial links and handle the link distances consistently, even when the objects are very close together on the screen.

Positioning the objects with the mouse does not set to floating point resolution, only positioning them directly in the model code.

  • fixed table stat titles - should stay hidden now
  • paint object attref scanning


  • the new exit model save on exit mode never asks to confirm save, even if the modeller edited the model. The autosave will occur silently.
  • now set the "model modified" bit when viewports edited
  • rearranged the Table -> "Table" menu and added a "Paste over" entire table
  • Added more file operations to the change object -> file menu
  • delete file
  • rename file
  • copy file
  • Default button [OK] handling added for condition and multi-condition editor
  • Switch now goes into its editor when a mode is selected
  • slight improvement to file menu in change object (shows more details of configuration, remains "sticky" to enable a number of edits to be performed)
  • now support appending to table in change object file read
  • can hide title of table objects (I still allow a few pixels to click along the top to get the edit menu)


  • fixes the version string (was not updated in s)
  • fixes bug in gantt if more display rows than label rows


  • column titles for tables no longer run into the second title row
  • auto edit down/edit across in table edit no longer locks up at the last cell
  • have reworked label and attref management so labels are referenced inside attrefs can be tracked down.

Click on the line in the label references dialog which indicates the # of attrefs referencing it and it will open a list showing where they are.

  • fixed some stop/restart run handling, particularly where a run restart was attempted from a "no init" button broadcast. The run wouldn't restart until next time it was run/restarted.
  • billboards properly re-initialise attribute values when they are regenerated during a run (nb: on screen display is still not updated if the table is visible during the refresh)
  • Added new routine operation to force a repaint/update of the screen
  • Button-type paint objects can now be associated with an attribute to control their visibility. If the control attribute is 0, the object will be hidden during the run. If it is 1, the object is visible. Do not use other values, I may decide use other masked values for other functions!

NB: In stopped/edit mode, all buttons are visible In stopped/interdyne mode, buttons associated with attribute are hidden

  • gantt graphs can now have a dynamic # of rows, based on the number of elements in the label list labelling the rows. Row Offset still operates.

To use this, set the # Of Rows to 0. This isn't as useful now since i've also added gantt y scrollbars...

  • gantts no longer crash when a _color column is used (was placing colour value into wrong variable)
  • gantt y scrollbar option added

This is only useful for gantts associated with a label list and enables scrolling of the gantt over all members in the list, limiting the display to the row limit. The offset still applies, enabling members in the list to be skipped, I may change this later so i suggest leaving the offset 0.

  • new exit mode is like stop and quit except the model is also saved, useful for batch runs which modify tables in the models which you want to retain.
  • new options in the track menu enable loop in routines/out routines to be applied to all loops in the current screen
  • viewport option in background menu enables a window to another subsystem to be placed on a screen. The view can have its own zoom and scroll set, and a mouse-over message. Double clicking on the view opens that subsystem (if enabled).

I dont check for circular views yet, so dont try it...
Still has a bug when animation starts (missing redraw)... more to come on this.


[new file format]
  • when a table column tuple name is changed, references to the column in routines are now updated
  • have added an option to label subsets which enables duplicate items to be added to them

This makes them useful in labelling gantt graphs where labels need to be repeated for rows. The option is only useful where sub label lists are built on the fly.
This option should be used with the "Locally Index" option since this causes the sub label list to return unique indicies (from 1) for each member, even if the member is a repeated label.


  • New display option "User Can Bend Spatial Links"

enables user to see, move and add/delete bends to spatial links during the run

  • Have added 4 new value formats

Fixed format, with one and 2 decimal places, with and without commas

  • have added extra validation to value formatting code, if ever get a system error message, contact me immediately with details
  • If a table is being edited with the "Edit Down" or "Edit Across" mode, the auto-edit stops when a cell formatted with a label list with "Cyclic Selection" option "on" is encountered, instead of incrementing the cell behind the scenes.
  • Fill down/across editing no longer leaves trails of boxes
  • copy/pasting an exported portal now also exports the portal when it is pasted into the model
  • Added "Shift Paste" for model objects

Holding down shift while selecting "Paste" puts up a dialog enabliong multiple copies of the object to be pasted. The spacing and columns for the pasted array can be specified.


  • Have now implemented the "local index" option for label subsets

When this option is on, it causes labels in a subset to be indexed from 1 with no gaps even though their parent indicies may be arbitrary.
The order and hence index of the items in the sublist is determined by the order in which they are added to the sublist, whether by the list or by the model.

  • Parser for relative times now handles -ve time eg: -1:23, -10d
  • pause click handling for entry in item click mode now fixed
  • no longer crash if showing references for a message entry with a copy of a linked dispatcher in the copy paste buffer
  • Have added option to broadcast button which prevents the model being initialised if the run has to be started just to handle the broadcast

This prevents

  • attribute clearing
  • table clearing initialisation
  • the run from proceeding and causes the run to stop again once the broadcast has been processed

The release ZIP includes an updated SYSBROAD demo model

  • A new system attribute "Handling broadcast only" is set to non zero if the current run is being performed as result of a broadcast without initialisation.

This enables a model to catch when a broadcast button has been clicked *during* a run vs. when clicking it initiates the run.

  • Have fixed graph scale display to properly handle the default grid and scale intervals when in time of day modes.
  • The scale interval can now be overridden in the scale parameters menu

As with the other scale parameters, setting it to zero selects the auto default


fixed bug in 'n' which caused routine attribute initial values to be corrupted after a model run


<new file version>

Given the incredible number of changes I've made to the code, this version will need some serious testing.
=== === Note: Updating to this version of planimate may require some changes === to your models. The changes involve how attributes are initialised === and are intended to draw a clearer distinction between attributes === which are inputs to the model, counters and outputs. === === The system will guide you through the changes required. It will === be useful to have your previous version of Planimate available === so you can use it to browse your model during the conversion === process. ===

  • ===!!! ATTRIBUTE change [IMPORTANT] !!!===

I've made a change to the way attributes are handled. This is part of a consolidation to clean up the usage of attributes and optimise performance of the engine.
The "Retain Simulation Values" option is now the default behaviour for portal attributes and no longer is an option. That means all portal attributes persist between runs.
If the intention is to re-initialise an attribute, the "Clear" value option must now be used.
Upon loading an older model, I've implemented the following translation:
If the "Retain Simulation Values" option was "on", nothing changes.
If the "Retain Simulation Values" option was "off", and

  • the attribute is marked "constant during run", nothing changes
  • the "clear at start" option is enabled, nothing changes

BUT if neither clear at start nor constant during run were set, then Planimate now needs a way to return the attribute to its initial value each time the run is started.
Since I dont know if the modeller is doing a "Clear" of the attribute in a routine using the clear value, I cannot just set "Clear At Start" and use the last value of the attribute to set the clear value.
The loader hence has to ask the modeller to select an initialiser for the attribute, in order that the attribute can be set to the same initial value each time the run is started.
When required, the loader will present a dialog showing the attribute, its last value, its clear value and its comment. It will offer a number of options.
The options presented are:
1. "Previous Att Value" - use the value the attribute was at when the model was last saved to initialise the attribute every run. This turns on Clear At Start with this value.
2. "Previous Clear Value" - use the clear value to initialise the attribute. Turns on Clear At Start. This will usually be the best option for counters, accumulators and performance measures since the clear value will probably be zero, even though it was not used.
3. "Assume Its Constant" - assume the attribute is a user input or configuration information and wont be changing during the run. The "Constant During Run" option will be turned on.
This is the SAFEST option since the model will behave as it used to unless it needs to modify the attribute from its saved value, in which case it will complain (cant modify constant attribute).
If the model complains, the reason the attribute is modified can then be investigated and the question asked:
IS the attribute

  • an input or constant to the model (which should hence be constant)
  • a counter (which then can be initialised by using the clear value) OR
  • an output (whose value at the start of the model doesn't matter and both the constant and clear options can be left off.

  • Added a mechanism to access OBJECT ATTRIBUTES

There are 4 standard object attributes, Count In, Count Out, Occupancy and State. Most are supported by most of the objects.
Each object attribute for an object can be associated to a target using an attref. I stronly suggest only using Portal attributes, not table cells!
When the object's attribute changes (eg: its state or occupancy is changed by something) the attribute will reflect the change. I handle unblocking from this change.
To avoid confusion and unexpected results, I validate against multiple objects (or multiple attributes of the same object) logding information into the SAME Portal attribute. I dont validate this with tables, if you go straight to a table cell, you are on your own.
Its much better to go to a portal attribute and then publish the portal to a billboard, if you really MUST get the data into a table.

  • changed attribute reference editor (Attref) to select "OK" as the default button after some of the buttons (such as "browse") are used
  • reworked palette display to stop them doing unexpected things to window ordering when redrawn, including dismissing some popups before a selection could be made
  • removed extra redraw of conveyor and multiserver (road) items during screen redraw.

Apart from slightly slowing down the redraw, this would cause a re-entrancy problem in the animation manager which would cause an unexpected popup if double clicking into a portal containing a busy conveyor and cause an internal integrity check to quietly log an error to the planimat.dbg file.

  • have cut back use of the "disable stat" option, it now only applies to object stats. This saves significant memory for each portal attribute
  • have fixed reference scanning so attributes used to index a table lookup etc. are not marked as "modified" even though the destination may be modified. This tended to confuse reference browsing.


  • added second title row option for tables

with this option enabled, a second row of column titles is displayed
This enables units etc. to be shown under a column title This field is always centred


  • reading the calendar time is now valid in relative time mode,

you get the # of seconds since 1 jan 68


  • fixed dialog result code handling (broken when i added the /BATCH command line option


  • I now force an application redraw when saving an image, which enables the image to be saved even if the planimate window as hidden (and hence ignores normal windows redraws)


  • changed redraw code when run starts
  • a screen clear which shouldn't be needed has been removed, this should reduce flicker when model starts which was very noticeable when the model responded to button broadcasts
  • The model is now first drawn immediately after preinit end completes

This means that animation on the _run start broadcast will no longer leave black trails and not redraw properly.
Animation on _preinit start _preinit end _model loaded
will leave strange trails since the model is not ready to display yet and these events are intended for advanced internal initialisation only and the user should not be exposed to them in normal circumstances

  • fixed a serious memory leak in the grid view


  • implemented "save to image" change object file operation which saves the current window to a BMP file
  • now handle '-' in Time Of Day time format (HHMM)
  • removed the "/TIMEOUT" command line option it wasn't properly supported in windows
  • added the "/BATCH" command line option

This suspends showing the about box or any dialog boxes which would be encountered when running a model.
In particular:

  • message boxes are OKed and logged to PLANIMAT.DBG
  • confirm boxes (ok/cancel) are cancelled (the negative) and logged to PLANIMAT.DBG
  • "yes-no-cancel" boxes like the save dialog are "No-ed" and logged to PLANIMAT.DBG
  • Model error dialogs are not shown but the _PLERROR.TXT file is still written
  • Model generated dialog boxes are not shown and the result 0 is returned to the model


  • fixed loader to handle loading from database for InterDynes the previous way i was reading the model info was breaking it


  • Added "BREAK LOOP" routine operation Look out for problems with routine code
  • Added new command line option

/INIFILE=FILE.INI causes FILE.INI to be always processed as the default INI file, overriding any specified in any loaded models.


  • Columns of tables were being rounded when data exported or edited. This means any data processed through B will need review.

The problem occured because of a change made to the formatting code (added display rounding at a lower level) and the export/edit routines were not deselecting it.

  • CTRL-B now works in interdyne-stopped mode as well


[new file version]
  • Have added "ELSE" routine operation

IF handling was heavily modified, so keep a look out for anything unexpected in IF handling, in the editor and at model run time.


[new file version]

Interdyne mode keyed EXEs could randomly crash on startup because I wasn't initialising the window title string at the right time during system startup

  • VALUE FORMATTING and rounding code rewritten
  • Values (table column display) are now rounded after being scaled when a "minutes only"..."days only" type time format is used.

They are also rounded for the value and money formats.
BUT the rounding is NOT performed for the mixed time and calendar modes

  • routine errors in initialising now report the routine line number properly
  • paint mode ctrl click enables more object mode editing on objects
  • new "Null" system attribute enables dialog results etc. to be thrown away without having to create a dummy attribute
  • have added extra debug info when database read errors occur
  • ctrl-shift O toggles object palette ctrl-shift F toggles class palette
  • new attribute reference mode:

Matched row index
Like a matched cell or row, but returns the row # of the match rather than looking up a cell or returning a complete row.
If the match fails, it returns 0

        • change made to track object detail item attribute ***

for a section, returns: 0 = single road section 1 = first road of a multi road section 2 = second road of a multi road section

  • ctrl-b (back to last page) supported in InterDyne mode


  • The colour palette now can customise the 16 custom colours. Use the Colour Picker to set the colours of the 16 custom colours.

Select one of the custom colours and use the palette on the right to set it.
Remember these 16 colours are global to the model

  • Fixed 2 bugs in the scroller code for log driven graphs:
  • The scroller no longer puts large left margins on calendar time values (I was "snapping" to whole values which isn't appropriate for a calendar time value)
  • The scroller uses a different method to retain its position when the time frame changes (as occurs when a model with a different run and edit time reference starts/stops)
  • reworked the way the delay box is shown to prevent it getting stuck visible if an error occurs while processing a broadcast while a model with a delay box is paused.


  • Label List Selection now includes a field where a label can be typed, the list will scroll to the closest match.

Shortcuts: use <TAB> to get to the field, SHIFT-<TAB> to get back to the list in label popups which also have the "add" buttons, <SPACE> when the list has focus to select the highlighted item

  • The label list "Only Modellers Add" option now takes effect

If you want a user to be able to be add to a label list, this option must be off. If on, labels cannot be added to the list in InterDyne mode.

  • Bug Fix: Attempt to Expand A Route on an item with no route assigned was causing a crash. It now properly reports the error.


"Friendly Error Dialogs"

  • This display option causes Planimate to display a less detailed dialog when an error occurs. This dialog explains that an error which cannot be recovered from has occured.

If the system is in InterDyne mode, the program will close when the dialog is closed. Why? When a model error occurs, the integrity of the model's tables and persistent attributes is indeterminate. So the only safe thing to do is exit, restarting the model may not be enough if the modeller is relying on retained attributes or manipulating tables which cannot be recreated by the model.
A [Details] button in this dialog also enables the error details to be reviewed in notepad, making it simple to copy/paste and email the information.
If the "support" email address (added in the last version) is set, it is also included in the error report, for the users convenience.

      • !!!***

All model errors are now logged to _PLERROR.TXT, even if the "Friendly Error" option is not selected. If an item was involved, its attributes are also written. So this should be useful to developers as well.
The system attempts to create the _PLERROR.TXT file in the model working directory. If this fails (eg: the directory is read only) then the file is created in the TMP folder as indicated by Windows.
In any case, the "friendly dialog" opens the file automatically if the [Details] button is pressed, wherever it may be.


The new features in this version mean I can build a generic "InterDyne" EXE which is not specific to any given project like "FAID"

  • New Menubar option: EDIT->InterDyne Info

Can set two strings saved in the model
"Window Title" - the title that will appear in the window when in Interdyne mode. The model name may not be desirable especially if its a self contained InterDyne like FAID. If left empty, the model name is used

"Support Email" - An optional field, if set
1. It gets shown in the second about box (Help->About) under the load version info
2. It will get shown in the "friendly interdyne error dialog" which will be appearing shortly (giving a user encountering an interdyne failure somewhere to go)

  • fixed copy/paste bug which would cause a crash when copying routes
  • wasn't handling copy paste buffer route redirection properly
  • the second about box (Help->About)

displays the version of planimate which saved the model and the date last saved, as read from the first line of the model when it is loaded.
(this is not updated if the model is saved, only when a model is loaded)

  • New Time Modes

Time (Minutes), Time (Hours), Time (Days), Time (Weeks)
These scale and display the time interval accordingly, they do not show units. Values entered are scaled accordingly. Internally, the attribute is always seconds.

  • bug in form date description fixed (year was getting munged on display)


  • Paint inheritance fixes
  • When a paint screen is first inherited from a screen, any screens inherited from it will now also get the new objects
  • Added a "Delete All Visible" option in the "Other Options" menu
  • Fixed the move all and delete all "other" options to support inherited screens
  • Text button actions were not properly updating/reverting to base class


  • PAINT INHERITANCE -----------------

The paint layer of a dynamic or panel window can now inherit objects from one or more other paint screens. This enables a layout to be replicated in many screens (dynamic or panels) in a model and then edits made to the master will be automatically applied to the inherited objects.
When you add a paint object to a screen which is being inherited from, you get an option enabling you to propagate it to all the inherited screens.
The most important feature of the paint inheritance system is that individual inherited paint objects can be customised. If the master of the customised object is edited, the edits are still passed on but the customisation remains in effect. This means the colour of a button can be changed on a specific panel. If the master has its text edited or position changed, the customised object will also be altered but its colour will remain as set.
If a paint object is deleted, you can chose to have any objects inheriting from it also deleted or to have them become independent.
Inherited objects can also be made independent or reverted to their master (losing all customisations).
Inherited objects can be deleted on individual screens, they will not reappear anymore on that screen.
Special note for Button Actions:
Button actions can be customised per-instance of each button, in which case the master button should NOT have an action assigned to it. If the master does have an action assigned to it, it will be assigned to all buttons next time any characteristic of the master is edited.
A given panel can inherit from more than one screen. This enables separate management of say "background graphics" and "navigation buttons". In addition a screen which has inherited from another screen can itself be inherited from. This enables cascaded inheritance, where each level adds new detail.
The paint inheritance structure is not tied to the model hierarchy, the only rule imposed is that inheritance loops cannot be created (A based on B, B based on C, C based on A...).
It is recommended that the master paint screen(s) be carefully positioned within the model if inter-model copy/paste is anticipated. If a screen containing inherited paint objects is copied to a different model without the master being copied, the objects lose their inheritance relationship. Its a good idea to put master screens in a panel since the panel can be repositioned in the model as the need arises.
Copy pasting within a model retains the inheritance relationships.
In paint mode:

  • The background menu has an "inherit from" option to select from where paint content should be inherited.
  • Screens which are inherited from include a summary line in this menu
  • Objects which are inherited include an "Inherits From" line which names the panel from which the object inherits.

Selecting this option enables the paint object to be reverted to the master, disassociated from the master or the user to navigate to the master

  • Objects from which other objects inherit include an "Inherited <n> times" line which shows how many objects inherit from the object.

Selecting this option enables all inherited objects to be reverted to the object, all inherited objects to be disassociated from that object or navigation to the panels which contain the inherited objects.
Note that there could be objects in the copy/paste buffer which cannot be navigated to.

  • BUGFIX the "stop and restart" control bit implemented in r was not being initialised, causing the model to sometimes restart once complete without the modeller intending this.
  • BUGFIX added a check to prevent crash due to an immediate message changing a route
      • USE IMMEDIATE MESSAGES DURING LOOKAHEAD with care - they must not *** change anything except item attributes
  • Assigning a dynamic route from an empty table no longer keeps an empty route assigned to the item, the route is purged


  • Range check attributes properly initialised to zero when loading older models, they were initialised to garbage before
  • CHANGED FILE FORMAT for paint in preparation for paint inheritance Please check carefully that models saved with this version reload and paint objects work as previous.
  • Implemented a new exit stop mode "Stop Current Run And Restart"

This lets a run be restarted without having to have the option "Restart when model stops" on


  • fixed table matched column copy

(it was prevented from working if the # of columns in the tables differed which was the whole point)


  • table column tuple name can now be as long as attribute name
  • no longer ask to modify the tuple name when a column title is modified if the title is longer than a valid tuple name
  • table sort dialog handles long column names without overlapping buttons
  • Range checking has been implemented for attributes

For each attribute a minimum and maximum value (numeric) can be specified.
If the attribute is set beyond its limits (the check includes round off margins) then the model will stop with an error, this can catch integrity issues at their origin rather than them being hidden in the model.

  • Fixed crash: If a broadcast with item is made to a broadcast entry with no leaving paths, it would cause a crash


  • added an extra condtion to track logic

last road check for a loop in lookahead is NOT performed if the train has a non zero booking id

4.19N [new file version]

  • === Dynamic ODBC statements ===

ODBC statements can now reference portal and item attributes. These may be used to construct an SQL request with dynamic parameters.
SQL commands are now structured as follows:

  • Quoted text elements are treated as literal strings and processed without modification. They may contain any character except the quote itself.

eg: "Select * from authors"

  • Single quotes enable a single character including the " to be inserted

eg: '"'

  • The & is an optional (recommended) separator
  • Portal attributes references are preceeded by P, P. or P: and may included quoted text so spaces can be handled

eg: pAttribute p.Attribute p:Attribute_1 p."Attribute 1" P."Attribute 1"
These get converted to the formatted value of the attribute

  • Item attribute references are preceeded by I, I. or I: and may included quoted text so spaces can be handled

eg: iAttribute i.Attribute i:Attribute_1 i."Attribute 1" I."Attribute 1"
These get converted to the formatted value of the attribute
Statements may have line breaks etc. within them.
Example statement
"Select * from " & i.TableName & " where Author='" & i.WantedAuthor & "'"
In this example, Item attribute "TableName" will provide the name of the table Item attribute "WantedAuthor" provides an author name
The [TEST] button in the editor will now include the translated query in the query test output window.
Since the item attribute can not be read at edit time, "*" without the quotes is always substituted for item attributes.
SQL statements in old models are automatically wrapped in quotes to keep them valid.

  • scroll bar colours made more neutral

4.19M [new file version]

  • table driven entries are now usable without a class column

If a _class column is not present, the entry will produce an item of the first flow type leaving it

  • pasting into a table with a highlighted region now uses the top left corner of the region as the insert/overwrite top left point, not the current cell. This makes things a bit more consistent
  • Exit can now stop and close the model
  • customissable dialog title line
  • spatial link system now gives an error if a movement to the origin is attempted
  • fixed bug in routines introduced about v


round and trunc would give error if applied to a column
  • Both strict lookaheads and strict attrefs options are now on by default for new models and should be turned on for old models ASAP (may require some work on the model)
  • Added new time formats to support HH:MM:SS time display/input mode

Times are accepted in either format in both the new and existing time format modes. The new modes enable the default to be set for display/export purposes.

  • Resorted the format names in the attribute editor
  • The icon cache is refreshed when the image mover is dismissed. This can also be used to refresh the image cache if icons are externally changed.
  • the pipe has a new option enabling the run control attribute to be based in the target portal instead of the source. This makes implementing blocking easier.
  • handling of selection of portals when in interdyne mode changed Portals which are user draggable can now be clicked and dragged in interdyne mode - only if the model is started
  • a new broadcast _Model Loaded is sent to the model when it is first run once it has been loaded, it gets sent just after _PreInit Start which means you have to be careful what you do with it; if you need to interact with any objects (apart from Change) you should use it to set your own flag and handle it after _Run Start when all objects have been properly initialised.
  • file/odbc read mouse cursor update reworked - the wait cursor should come up more consistently
  • the table editor handles double clicks like on screen table panels
  • double clicking a new change object defaults to editing the routine
  • "Show progress file" option obsolete and removed
  • internal "Journal" code handling obsolete and now removed
  • (unused) "User View" support code removed
  • nb: deleting a spatial link deletes any items on it


  • Added ODBC option which causes labels to automatically be added to label lists rather than prompting the user


  • added "Item Last Track Road" system item attribute

returns road # item was last on from the track section it just left (1 or 2)

  • reworked item parameter storage / undo mechanism


  • fixes the "invalid structure size" printing problem


Track change

  • changed the Double Overtake handling to enable use of the other track when the normal track is unavailable due to full restriction.

Previously the other road would not be taken in this case

  • crash fixed when an item with a route assigned but with no steps is clicked upon

note that this is an unexpected condition, routes should never be empty



  • no longer crash if a broadcast with item attributes cannot carry any attributes to the target item class
  • occupancy of objects (read by attref) now initialised properly


  • fixed problems with adding new row operation (was initialising un-required parameters)


  • new calcn parameter attrefs default to constant 1, not a portal attribute




has had major changes so commit to it with care
  • file compatability window moved

EXEs from now on will only load models saved with Planimate 4.11L or later

  • new file version
  • Major rework of calculation/routine code

I have rewritten the routine management to allocate parameter attref space as required by individual routine operations. This involved reworking some 6000 lines of code, I took the opportunity to tidy up the code as well.
I've extensively tested it all with every test model I have.
This will reduce memory and disk requirements for routine-intensive models.
One model has shrunk from 17 to 12.7MB (MDL file size) and 50 to 35MB (initial memory allocation size)
It also creates opportunities for adding new calculations which have more than 3 attref parameters.

  • I have slightly reworked every module in iFlow and Planimate to enable me to more effectively use precompiled headers to speed up compilation of Planimate. This should not affect operation in any way.


  • secondary section bookings

These provide a secondary place to book sections. Unlike primary bookings, the booking id is not tested against the entering item, any item attempting to enter a section with a secondary booking will be blocked UNLESS it is accepted by the primary booking in that section.
This provides a mechanism to cast "booking shadows" which will prevent unbooked items from grabbing a section which will be required by an upcoming booked item.


  • rewrite of screen management

The Planimate window is now managed differently to enable clipping of objects outside the model area to be properly implemented.
This was a major rewrite of the window/scrollbar display handling.

  • buttons describe click action
  • paint objects describe bounding box
  • file browser window title in change object now reflects read/write operation
  • file read option "Automatically Add Labels" added to change object file operations
  • reading into a Variable Length Table using the change object now clears the table (deleting all rows) before reading

This will prevent trailing data being left in the table

  • Attribute stat display change

Can add attribute stats to any subsystem within the scope of the attribute

  • Cell stats now reflect the font and colour of the table cell they are associated with


  • font metrics fix
  • fixes alignment issues with train graph labels
  • item info panels
  • animate along with the item
  • new item attribute edit option "include in info panel" will include the attribute as a separate line in the info panel
  • the system attribute "Item Show Info Panel" enables the panel to be hidden/shown on an item by item basis


  • fixed verison #
  • cleaned up RGB grid display (was caching nodes for no reason)
  • can now add a grid view from a panel

4.19 (new file format)

  • New "Grid" display for tables

This displays a table as an array of rectangles. The contents of the rects can either be from icons/BMPs, using a label list to map index values to images, or the colour can be directly interpreted from the cell value, as an RGB value.
The number of rects is determined by the dimensions of the table. This can change during the run.
The size of each rect is determined by the table dimensions and size of the grid display object, as set by the modeller.
The system requires the rects are of equal dimensions which may not be an exact multiple of the width/height of the rectangle of the view, so the system will keep the cell array centred within this rectangle.
(set the mode using the options...)
In image mode:
A label list determines the name of the image. If the index does not resolve to a name, the cell is painted using the background colour of the grid display (which may be transparent if set to "None"
With in place editing enabled - a click toggles cells between 0 and 1
In RGB mode:
Given R, G and B range from 0 to 255, the colour of a cell is determined as follows:
value = red + green * 256 + blue * 256 * 256
In hex, the value is packed as follows:
BBGGRR, so FF0000 will give a blue pixel
If the value is set to > 0xFFFFFF or < 0, the cell is painted using the background colour of the grid display (which may be transparent).
With in place editing enabled - a click toggles cells between 0 and 0xFFFFFF (black and white)

  • The Encode RGB makes it simple to translate R/G/B values to the proper value
  • added Hexadecimal value format mode (makes working with RGBs easier)


  • screen flicker when run starts has been reduced <please report any new problems with this>
  • redraw during model load stages reduced to prevent database errors
  • scrollbar size bug for table graph when scrollbar is not full width and table is cleared now fixed


  • crash during model reload should be fixed (clock position was being updated at bad time during load)
  • unblock algorithm change completed to properly flush the unblock history list if something move, to ensure that if something moves as result of an unblock, other unblocks will be properly performed.


  • have changed unblock algorithm for portals.

It stores portals which were previously explored to avoid repetition.
Previously this history was managed hierarchically, which meant that the same branch would be re-explored completely if reached during unblock from different places (eg: multiple portal entries)
Now I only purge this unblock history list once the unblock completes. So a given portal will only be unblocked once in a given unblock call.
= much faster operation when tracks form circuits or multiple entries/exits are used.


[new file version]
  • Dial chart scale background colour can be set. This enables the scrolling chart mode to be used over different colour backgrounds without the scale being drawn using the panel background colour.
  • internal clean up of dial code, please report any new problems with dials
  • ODBC error handling for Read() extended to catch more error conditions


[new file version]
  • Table column titles can span multiple lines
  • the # of lines can be set from the Table button
  • The fonts used by tables for their contents and labels can be set on a table by table basis. The table will track the global setting if the local font is set to the same font/size as the global font (the default case)


  • File access (change object)
  • CANCEL on the user file dialog no longer elicits an error, the file oeration is simply not performed
  • The user file dialog uses the extention of the file specified by the modeller as the default, so initially only files with the same extention will be shown. This can be overridden in the usual file dialog manners.


  • Help buttons: The section name can also be a numeric context identifier. This can be used where ambiiguities are a problem or there is no index



  • supports /DEBUGODBC command line option - enables ODBC debugging
  • larger ODBC command buffer


  • support longer ODBC commands (4096 chars now)
  • dont try load models with these long strings in earlier EXEs
  • reworked exit code to clean up sending of the "_system close" broadcast


<new file format>
  • horizontal scroller reworked for gantt and train graphs:
  • scroll settings can be accessed with the right button when paused by clicking in the scroll window
  • scroll settings now set start and width rather than start and end times
  • Initial width now acts as a width limit (you can stretch the scroller past this but it will revert to the limit when the data is changed by the model)
  • formatting for -ve money now displays as ($xxx) Planimate will still import -$xxx formats but they will be displayed using the new format
  • help menu has new menu item for model specific help
  • For development version - this looks in the HELP folder for a .HLP file with the same name as the MDL file currently loaded
  • For interdyne version - this looks in the HELP folder for a .HLP file with the same name as the EXE
  • new button mode enables a help button to be assicated with a section in the model help file. The model help file is located as described above
  • new command button - print
  • the default options for exporting a table to the clipboard can now be configured (in the File menu in the table editor) and will be retained.

The defaults for all old models are formatted and column labels on, row labels off.

  • implemented note option to hide notes in interdyne mode (for development notes)
  • status bar flow/class edit operations are now properly disabled when a run is started


  • fixed bug with the new cursor handling which caused the mouse cursor to disappear it was over a disabled button (eg: in the dialog editor)
  • added a new display option "Do Not Defer Stat Updates"; when selected stat displays are updated with every change to an attribute. This will produce more flicker but is desirable when an item is animating along a flow which changes values in zero time
  • removed the check for variable length tables when loading a cell stat It was unnecessarily purging the stats; they are OK on VLTs now.


[new file format]
  • clock bug fix - it no longer makes the main window active if the main window is disabled
  • the pointer over note cursor is the background cursor rather than being indeterminite
  • note z-order on mouse down properly reflects its position over buttons so buttons behind notes dont see the click
  • note can be closed by clicking on the note button
  • the advance timebox now centres relative to screen, not planimate window. It shouldn't appear offscreen anymore
  • new option to send broadcast to model when exitting system
  • the broadcast is already sent if the model is running when a close is performed, this option will start the model if it is not running to give it the opportunity to do any finalisation
  • ability to set table text row colour, just like the row background colour
  • change object file operations have an option to show the file browser to confirm the file which will be read/written
  • the selected file name is not retained
  • a confirm is required for non append file writes to an existing file
  • The model error dialog no longer will show the browse/item/pending events buttons if the system is running in interdyne mode, to protect the user from the unknown...
  • routine change object has new icon when one or more lines may be evaluated "only during move"

NOTE: you will need the latest _!system.db for the new change object icon


  • fixed bug in animation management

was not handling hide/redraw of change object when an item is sending an instant message and trace animation is on

  • reworked screen visibility handling

to prevent invalid items left in the animation manager when the model is run minimised. A screen determines whether its contents are visible dynamically rather than tracking visibility with a state variable

  • new icon for change object with during move option or marker
  • attref code cleanup, should be slightly faster and smaller memory footprint for models
  • fixed crash if fill intermediate steps used on an empty dynamic route
  • clock no longer keeps focus as much as it used to
  • clock now lives in the menubar


  • optimised way screen containment is verified
  • matched attribute copy for broadcast - can now broadcast item to different class without the error. Matching attributes are copied
  • added a new "Scoped broadcast operation" - broadcast to a subhierarchy at the object you target the broadcast at


  • add label now returns the label index added, not ordinal index. -1 is returned if the add fails or is aborted
  • New operation "Test Label" tests whether a given index value is in use by a given label list

Puts 1 if yes, 0 if no into the target

  • can now have comments between select and case statements
  • Routine editor dialog can be scaled in size

I haven't written an editor for these fields yet - if you are comfortable using REGEDIT then read on...
Planimate now retains persistent user options in the registry, at this location:
The parameters are read when Planimate starts and written/created when Planimate exits. So dont bother editing them whilst Planimate is running.
The parameters:
EditHeightScale EditWidthScale
range from 20 to 100 and scale the size of the routine list dialog.


reports which route is being explored when the model is interrupted in the middle of a long guess intermediate steps operation


Have reworked route assignment handling; can now support setting the current route step during lookahead. So you dont need to follow a route step assignment routine with a delay before the train enters the network.


Added more model struturing rules. These will force existing modellers to come to terms with how Planimate handles movement decision making in their models. However its an essential step in keeping the modelling environment coherent.

  • New option: Strict AttRefs In Lookahead

Its off for old models, again I suggest turning it on as it removes a potential source of modeller error.
Turning this option on has this effect:
A switch in Blocking Mode following a routine which is marked "Only During Move" will now report an error.
This protects against unexpected results if the routine before the switch was setting an attribute required by the switch - but because the routine is executed "Only During Move" and the switch requires the change during lookahead, the change would not be seen by the switch.
The modeller needs to think about how the switch is being used. If its acting to route an item, simply setting the switch to "Assume No Blocking" will avoid the new error message.
This enables the switch to defer its decision to when the item actually moves - but means the switch cannot act as a gate.
If the switch must act as a gate, then the preceeding routines must be executed in lookahead - so "Only During Move" must be turned off. This in turn requires that the preceeding routines dont perform operations which cannot be performed during lookahead, like table operations. Otherwise the system will report errors. The solution is then to split the "movement" and "lookahead" activities into separate routines.


  • fixes route reallocation problem (during lookahead) which caused a gpf (introduced when i reworked the route stuff)


  • Fixed a bug which caused Planimate to misbehave badly when running models without the "Strict Lookahead Messages" options on

it would report bogus routine lookahead problems


  • many routine operations that quietly did not execute during lookahead will now also stop further operations from executing during lookahead.

I've done this to force modellers to come to terms with routine operations which can be done during lookahead vs. ones which cant - and set up routines appropriately (Run Always or Only During Move)
I strongly suggest turning on the "Strict Lookahead Messages" display option and dealing with the problem objects it reports. It will be on by default later on anyway...

  • I have made available dwell and departure intervals for timetabled train items, these can be read and set within loop entry routines and portals.

Unlike previous versions, they are also available at the portal where a route ende
TT_TEST.MDL demonstrates their use in implementing loop delays in portals


  • fixed "Delete spatial link" - was making bogus reference to P:attribute

Interdyne build changes:
-> No run menu -> No log menu -> release notes option hidden -> hardcoded title -> fit to model window on load


  • reworked ctrl-paste code to avoid problems with direct references to the thing being replaced within the thing which is replacing it
  • removed the "screen" pointer in dialogs :- dialogs can now only reference attributes within scope


  • bug fix: bad undo management if decoding a single element multi label to attributes
  • LOOKAHEAD changes

I've changed lookahead undo management significantly so that:

  • iterations, whiles, selects, ifs etc can now be performed (and undone) during lookahead
  • multilabel tupling can be done during lookahead

I've also reworked the error line display when a routine error occurs so it will support upcoming features.
This means that the platform will support executing much more complex routines during lookahead (before any item moves) - this will be required soon for the messaging during lookahead enhancements.
IT also means that EXISTING models will run slower if they have routines which contain iteration etc. which are NOT set to "Only During Move" execution.
Previous versions of Planimate would quietly skip the iteration (etc) during lookahead but versions from now on will actually execute it - unnecessarily

  • since an older model could not benefit from using complex routines during lookahead (they were automatically skipped).

SO: Make sure routines are "Only During Move" unless they are required during lookahead - because an object immediately downstream of them depends on their outcome - eg: a gating switch, variable capacity, route assignment etc.

  • In conjunction with above, I've added a display option "Strict Lookahead Messages"

Turning this on causes Planimate to stop with an error if the model attempts to execute a routine during lookahead which contains something which cannot be "undone" (eg: table operations) which means the routine doesn't get executed.
Whilst this situation doesn't compromise model integrity (I dont allow decisions to be made if the lookahead detects "dirty" attributes, and you are forced to add "capacity"), I think we should enforce some discipline and have this option "on" so modellers correctly mark their routines as lookahead or move only.


GANTT enhancements

  • Gantt graphs now only show rows for indicies which are associated with a label. So they will properly show a subset when driven from a label subset.

They still properly handle the row count and offset, the offset now determines which label # (by count) to start at

  • A new gantt option "Draw From Top" draws the gantt from the top rather than bottom-up

COPY ROW operation - expects a source and target row reference. It will copy data from columns with matching tuple names. This enables tupling between 2 tables without an intermediate item


  • loops now place trains "thrown" into them in an extra road which disappears when the train leaves


  • Item direction can be set, intended when using the "throw" capability so trains move off in the right direction

The ITEMDIR model demonstrates it

  • Significant changes to engine to support re-entrant lookaheads

(including messaging from a routine... more details to follow)


  • Now support user colours in table row colour indexing
  • Multiple window handling [experimental]
  • "Open In Window" (Portal object menu -> other) now does not crash when exitting and it animates items better than before (still some non-permanent redraw problems if you wiggle things while its animating)
  • You can open *ANY* panel or subsystem in a separate window by holding the unlikely combination of CTRL-SHIFT-ALT while doing whatever you would do to open the subsystem/panel

(click on button, double click on portal etc)
Note - currently sub windows do not handle ANY mouse clicks, so you cannot burrow leaving a trail of windows, do it by working your way out instead.

  • Now validate the source/target for a blockmove is actually within the source/target table [check]
  • A user cancelling the new add label dialog now properly returns -1 rather than crashing


[new file format] 30/5/99

New table operations

  • rebuild billboard table

brings billboard up to date after the controlling label list has been modified

  • set column target

target must be a column ref, the columns' title is set to the formatted string of the attribute


[new file format] 25/5/99

LABEL LIST routine operations added

  • Add Label - lets user add an arbitrary string to a label list. An index is automatically assigned to the new label

The target must be a settable attribute formatted for the label list you wish to add the label to. It will be set to the label index which was assigned to the label, or -1 if the operation was cancelled or a label name which already exists was entered.

  • Re-Index label list operation added

This enables a label list to be re-indexed (in alpha order) under model control
=== I DO NOT UPDATE ANY ATTRIBUTES OR TABLES WITH THE NEW LABEL INDEX === VALUES so any existing values in such places formatted for this label list will be effectively scrambled.

bug fixes:

  • stat operations (portal copy etc.) were crashing if an item class attribute stat was on the screen - fixed
  • bug in database search code introduced in version P was causing database errors due to bad lookups if there were no system databases in the working directory - fixed


FIXED crash bug from R on some machines

  • A field in the scenario management structure was not being initialised, causing random crashes on model load/new operations


= scenario management
New scenario management system

  • 8 scenario slots have been allocated, Edit Scenarios enables you to name the slots and give default file specs

If the name is empty, the slot is unused.

  • Tables and Attributes have a scenario button / option to enable selection of which scenarios they will be saved into
  • When selecting save scenario, the user picks the scenario type to save
  • In addition, the edit scenario dialog enables a "save all data" option to appear in the scenario save dialog

(this replaces the display option "Include All In Scenario"

  • SCENARIO SAVE/LOAD can occur at any time:

Loading and Saving a scenario occurs whilst the model is "initialised" and ready to run.
If the model isn't running, it is started and stopped after the scenario operation completes.
So, for scenario data to be saved/loaded properly when the model is STOPPED (not paused), the targets must be:

  • variable length tables with "Clear At Start" off
  • fixed legth tables with the "Retain Values After Run" on and "Clear At Start" off
  • attributes with "Retain Simulation Values" on and "Clear At Start" off

Otherwise the values will be cleared/forgotten as the model is started/ stopped

  • redraw of multiservers when paused fixed
  • out shelf now handles unblocking when its capacity limit attribute is changed


! column insert/delete/append operations now added for tables

  • column insert can copy an existing column, or use 0 to not copy any existing column
  • I dont suggest using column labels with any table which will have dynamic column changes
  • redraw of loops during run fixed
  • added new panel option to show loop names during the run
  • added option on table import dialog to enable resize # of columns

turn off to prevent the system offering to resize the columns in a table when importing data

  • reading the route step count of an item without a route no longer causes a error, it returns 0
  • new routine operation to insert a single step and delete all steps from an item route

The route location index needs to be an object index


  • changed the new "copy to clipboard" command

It now has a parameter, to control writing options
The value can be:
0 - use defaults (row & column labels, formatted values)
or a sum of the following codes:
1 - write row labels 2 - write column labels 4 - format the values
For example, a code of 6 writes formatted values with column labels only


models will use the default of "1" which you probably dont want.

note: For the "paste from clipboard" option, the dialog will have the options set as were applied when the "Paste from clipboard" operation was performed in the table editor. The defaults are
row labels, column labels & formatted values

  • no longer start without key file (undone change in



  • INTERDYNE VERSION EXE - shipped as INTERDYN.EXE on demand
  • Starts expecting to find a model called INTERDYNE
  • This model must be encoded using the PLENCODE utility
  • The model should be inside a DB file such as _DATA.DB

Differences for the INTERDYNE EXE

  • Only runs in interdyne mode, can never switch to edit mode
  • Does not show the planimate about box on startup
  • Can not load/save models except the (encoded) one it reads at startup
  • Does not put entries into the registry
  • Title of application is "Planimate (runtime)"
  • PLANIMAT.DBG does not get written
  • Most of the coding changes to this version were to support the "interdyne" builds, there should have been no problems introduced into the "planimate" build


  • New table calculations enable reading and writing the target table to the clipboard.

The system clipboard is updated as the item moves through the change object.

  • Importing into a variable length table (VLT) may change the number of columns; this is supported as long as you dont use column labels with such a table
  • model runtime importing into a fixed length table no longer can change the number of columns (which would have compromised integrity)

Note: as with all system clipboard operations, the system clipboard is only written to when you ALT-TAB away from planimate


  • Planimate now runs in interdyne mode if it doesn't find a key file (can load, not create, save or edit)
  • Upon startup in interdyne mode the file pick dialog appears; a model must be selected otherwise the system exits
  • "New Model" removed from menu in interdyne mode
  • tool tip text can now be associated with buttons (any click-action paint object)
  • When the mouse is over a paint object with a click action OR a tool tip, the cursor becomes a hand
  • As the model is running the mouse cursor changes to a arrow/wait cursor to indicate something is going on
  • Planimate logo panel does not display if the system starts in interdyne mode
  • Option in Edit->Schedules to purge all unused GLOBAL Schedules

USE THIS if you have been merging models together... if any used schedules then they may be multiplying like rabbits after each merge!

  • FIXED BUG in table driven entry

The table driven entry failed to work if at least 1 item attribute was not being tupled

  • message item icon transfer bug fixed - icon was being lost if the message item was carrying items
  • cloned items (used for messaging) are now reported in the debug log
  • bug fix - Selective drop option of intray would *lose* items which weren't meant to be dropped... oops!


  • have fixed name string handling to avoid crash caused by an attribute name which exceeds 16 characters (the new attribute dialog allows 20 character attribute names but the table column name code was not ready for this...

I will be increasing the standard name length slightly at some stage

  • New display option enables hiding of the run control buttons from the button bar
  • Have enhanced the way the ODBC DLL is loaded. Planimate no longer complains if ODBC is not installed... until you try and use it... and even then the error is non fatal.

SO... you no longer HAVE to have ODBC installed to run Planimate
If you are hacking it with the ODBC DLLs in the same directory as Planimate, I *STRONGLY* suggest that you remove them now to avoid future problems.
If ODBC is installed normally, you need take no action, this version should work fine.
I now keep the DLL loaded (after its first use), so ODBC operations should be faster.


  • scenario save/load no longer messes up the loading due to the table column headings
  • added new system attribute which lets model access the current mouse position

(check out the CHASEY model for a demo)


1/5/99 *** new file version
  • fixed setup bug in facility stoppage editor which would cause crash when editing stoppages using agents
  • fixed copy bug when messaging agents (introduced in




  • in trays have a control attref to determine whether an item gets dropped off


  • Agents have now been further merged with items
  • the item/agent option for an item class can now be changed on the fly for an item/agent. This means an item can act as an "agent" at an in tray in one instance and in another instance it can act as an item (and itself get picked up)

A new system->Item attribute "Act As Agent" determines how any agent-sensitive object (in tray, out tray, facility) will treat the item. The default setting of this attribute is that of the items class (set during edit of the class)
For proper operation, you must ensure that any change made to this system attribute is seen during lookahead - if set in a routine just before the object, the routine must execute during lookahead. Otherwise the item may be let in as an item when in fact you wanted it to enter as an agent.
ANYAGENT.MDL demonstrates how a single item class can act as both an item and an agent

  • new broadcast broadcast sent when a portal is clicked

_Portal Clicked
If the broadcast is not caught, the normal Attribute/Table browser appears

  • item attributes can now be updated from table tuple names (in table menu)
  • continuation system attribute (assign to 1) sets continue mode so a user event broadcast (eg:portal click) can continue the run.

Equivalent to the user button "continue" option
LINKS model demonstrates how portal clicks can be processed during a run and the creation of dynamic spatial links

  • dynamic spatial links added

Spatial links between portals can be added and removed on the fly
When adding, if a link already exists (in either direction) a new one is not added
When deleting, link(s) in either direction are removed. No error is given if no links were in place between the 2 portals.
DYNSPATIAL model demonstrates them (as well as the "proper" way to enumerate over a label list)

  • removing a spatial link with an item on it will cause a possible crash since the FEC event is not yet purged and the link for it is gone...
  • dont yet validate creating a spatial link between portals on different screens...


  • splitter edit - turning on partial attributes transfer option now turns on transfer attribute options, rather than it turning off again unexpectadly
  • Renaming a table with a long title no longer will propagate the long title into the table's tuple name (it will be cropped)
  • button blitting fixed when zoom is not 100% (button contents would shift up/down as it was moused over, depending on the zoom)
  • a subsystem can be made visible via a routine operation using the owning portal's export index
  • tuple operations to carried item implemented
  • Button bar now does not display unlinked buttons in interdyne mode

The "up" button no longer appears in interdyne mode

  • click handling on portals now handles background portals properly
  • portals can now be dragged in model pre-init (check for side effects with other objects being clicked in preinit mode)


Several new experimental enhancements

  • drag portal during pause option - enables user to reposition portals in paused mode
  • spatial links now update as portals are moved but modeller still has to force a cache refresh!
  • internal broadcast "_Portal Moved" is sent to the portal's subsystem after it is dragged
  • New 12 hour time format mode (supports import/export of 12:30 PM)
  • fixed z-ordering problem for objects vs. their stats
  • the objects were being drawn in reverse order to their views

I have made things consistent by now drawing objects in forward order so new objects (for a given object type) obscure older ones (as one would expect)

  • I have relaxed some of the clearing of fields when switching from cell to column/row modes. This will help retain settings when changing between attref modes but may cause unexpected stuff to appear in the fields (usually 0s) if you go Cell->Row->Column since the fields are not forcibly re-initialised to 1 upon entering the different table mode.

Let me know if it troubles you

  • Broadcast and dialog buttons automatically start/pause the run if clicked when the model is stopped. Experimental

      • IMPORTANT CHANGE for agents and carried item access
  • carried item indexing has been changed

0 = first (as before) 1..n = first to last (1 used to access the second item)
[needs testing]


  • implemented label list operations (SUBLABEL.MDL)


  • carry attribute selection shows all item attributes regardless of type

Track bug fix:

  • loops with steps at them were not properly advancing the route step pointer when looking ahead




incorrectly tagged models as 227, they should be v228 but wont cause a problem unless they loaded with a pre



Validation changes


Route assignments which fail a match on a non zero index now stop the model with an error rather than continuing silently. Use index 0 to unassign a route.
Change objects with empty route assignment tables will have the route assignment table removed on load to prevent model run errors

  • Fixed bug loading dialog templates (they were being saved with the wrong version #
  • Have reordered the way broadcast events are posted to the FEC (from change objects sending broadcasts). They now are now put following events at the same time rather than in front of them. This will help make broadcasts occur in the order generated - but dont let your logic depend on it!!!

Remember the zero time FEC event ordering rules - dont assume any order for FEC events occuring at the same epoch of time

  • Have fixed item messaging so the messaged item icon is retained even if the messaged item is carrying other items.


[new file version - to support saving of custom colour palette]
  • cleaned up portal state editor, deletes states properly
  • alternate entries and exits get clipped to the screen on creation
  • added another 16 colours to the colour palette

these are initially all white - at the moment you must edit the model file directly to edit them
find the section as follows:
Colors 16 ffffff ffffff ffffff : (total of 16 RGB colour values) ffffff ffffff
You can edit the 16 values. The colour information is coded in hex as follows:
Let me know if any problems emerge with colour handling. Since there are now 16 less free palette slots, bitmaps which looked fine in 256 colour mode may now look less detailed. Switch to hi-color.

  • Change Object Calculations: added trig functions, moved square and sqrt to "trig" sub menu
  • added validation to all scalar evaluations - if a calculation yields a non-rational number (eg: sqrt(-1) ) an error will be flagged and the model stopped, rather than putting the value into a table where it would wreak havoc with the import filter etc.
  • exporting a section now uses the name generated by its connection points rather than its internal "track" name

SECTION BOOKINGS ----------------

  • a particular road of a section can be booked for an interval by a train. This booking is made using a booking id, a new system attribute of items.

New calculation operations support:

  • adding bookings to a section
  • reading back all bookings from a section
  • clearing a sections bookings

Sections are read and written using a VLT which must have the following columns:
"_book id" identifier of the item which the section is booked for. an integer >= 1. Only the item whose system attribute "booking id" matches will have access to the section during the booked interval
"_from" "_to" Specify the time range over which the section is booked

BOOKING.MDL demonstrates setting up a booking, reading back the bookings and them in action.
Sections which are currently in a booked state will report this in their pause click popup. A model can also read back the booking tables for any section using the read booking operation mentioned above.
There is no lookahead in the track logic for impending bookings, they come into effect immediately and prevent further access to the track. Where foreknowledge of a booking is required (to prevent starting a service) interrogate the sections booking list by reading it back OR talk to me about implementing a lookahead readback on a section.


  • have sped up splitter operation by caching item tupling information
  • added label list dump to model info
  • have enhanced debug log:
  • the log start time now determines when debugging logs start
  • new options enabling logging of every switch decision and message send/ returns


  • control paste (bulk replace) of portals has been enhanced

now any messages coming into or going out of the replaced regions will be retained - that is any message entries within the region connected to a dispatcher outside the region or vica versa will remain associated as well as there is a corresponding object
This also applies to wormhole entries and exits


  • crash bug when browsing message entry references fixed (had broke in



  • I've reversed the internal searching code in the train graph view.

This will make viewing of huge tables (> 50000 rows) possible now as long as the train ids tend to increase over time
(cyclics should not be affected)

  • Dial display/update when stat is hidden

I've rewritten the way dial's track their visibility, so please report any new problems with the appearance (or lack of) of dials.

  • I now cache item<->table tuple mappings. Models using them heavily will run faster


  • broadcast description code buffer fixed (could cause crash when browsing references


  • attribute reference browser has been enhanced


  • Copying and pasting or control pasting a portal also copies all of the stats on its screen and pastes them relative to the new portal
  • Added new system attributes enabling a subsystem to access its owning portals graphics without having to use a label list
  • unreferenced label lists, broadcasts,, item classes and label subsets and multilabels are purged on model copy/paste to avoid proliferating junk between models
  • item attribute name browser only shows item attributes for flows which enter the change object concerned
  • New button in tuple edit dialog generates a report of the item classes and the attributes<->table columns which will be tupled


  • crawling portal fix

Portals with customised states no longer attempt to retain their X-CENTRE when their image changes at end of run.... the bottom left corner is always the pivot for scaling and state changing.
This means *IF* the model moves a portal during a run to keep it centred as it gets scaled, it will also want to re-initialise its position at the start of the run as the portal may have shifted when the model restarted (and its image changed/rescaled).
If just the state/scale is changed, the position will be retained, unlike


  • fix bug with directed broadcast error appearing
  • was looking up wrong list with the index
  • added portal "show in background" option

portal image can be shown BEHIND dials/stats so nice overlay effects can be performed
I dont background the mouse focus yet so you wont be able to get to your dials without moving the image


fixes portal/stat offset introduced when a panel is resized containing portals which have the "Move Views With Portal" option on


A directed broadcast sent to a panel without at least 1 listener is considered an error


fixes queue rectangle bug introduced in O


[new file format]

Completes update started in


Portals with customised state images and the "retain state" option on will retain their image and any scale factor when the model is stopped and also when the model is saved/reloaded
Combined with the use of BMPs for state icons, this makes Portals very powerful visualisation objects.
When a portal reverts to a different icon upon stopping or starting the model (due to re-initialisation of its state and scaling) it is kept centred automatically, unlike when the user changes its state which pivots on the bottom left point. This looks less disconerting.


  • have made changes to object (eg portal) positioning. This MAY impact current models if the size of the icons positioned differed from the default "idle" state icon

1. All position set and get commands work with the CENTRE of the object - midx, midy. This has not changed from before
2. Changing an objects icon will use the lower left corner of the object as the pivot for the new image. The MidX/MidY is now updated - if the new icon is of a different size, the centre has changed.
This is different from before where object x/y were not being updated to reflect the new centre
3. Changing the xscale/yscale of an object uses the lower left corner as a pivot. Its simple to keep the object centred by saving and restoring the midx (and/or midy) as I do in the SHIPVIEW demo

  • Have added new object attributes
  • Width and Height give the current object's image dimensions (with scale applied)
  • STATE enables user defined portal states to be read and written remotely without having to do it within the subsystem. I used this to simplify the SHIPVIEW model

STATE also enables the state of any other object to be read, dont rely on this yet as it will probably be changed/enhanced!

  • cleaned up path management code
  • empty path databases no longer created for screens during object scanning (and old ones will get purged next time you go to flow mode)
  • internal splitter path management cleaned up
  • added code to scan paths for objects to provide info to the routine editor
  • removed crop of all object y co-ords to 8 - this was used to guarantee old DOS objects weren't under the DOS status bar and is obsolete (they had to be offset-left to hide them before)
  • changed object image scaling to update object bounding box


Bug fixes
Two very similar looking but different bugs in the animation manager

  • an animation manager bug which caused items leaving a queue to interfere with each other and leave behind crud, exposed if the items were wider than standard (and hence overlapped) (I was not maintaining z-order properly when moving single items)
  • an animation manager bug which caused objects which changed their icon size to interfere with nearby icons in queues (I was not hiding the foreground icons properly)

When planimate is executing a while/iterate/search it occasionally polls the system for stop events. This poll was being done every 20000 iterations, i've dropped it to every 6000.
To stop such an operation, you must press <ESC> (dont hold it), make sure Planimate is foreground - the mouse is not polled.
A slow system may take a few minutes to get to it but it eventually will ask whether you want to stop the run.


Bug fixes

  • icon palette crash with null icon selection fixed
  • import filter

Now treats quoted empty field the same as an unquoted empty field


  • Billboard Table (option when creating a table)

Enables viewing of a number of attributes for a number of portals in a tabular manner, the columns are the attributes, the rows are the objects

  • in the Table-Edit -> Table menu associate a new billboard with an object label list

(initially it binds to all model objects, I suggest you crete a sub label list with the objects you want to view)

  • an "_object" column maps each row to a specific object
  • Create columns with names of the attributes you wish to view. The format will be automatically retrieved from the first row (first object)
  • if the number of rows does not equal the number of entries in the associated label list, the billboard will be automatically regenerated

This means you can sort (during edit) the _object column to your liking and the order will be retained until the associated label list is changed

  • The billboard contents are only active/up to date while the model is actually started. During edit they do not track the portal attributes or formats.
  • if a column has an empty label, it is left un-bound - it does not get mapped to any attributes.
  • DO NOT write to the _object column or any of the bound attribute columns - these parts of the billboard are intended read only and will be enforced as such.
  • Cell stats add now in view menu
  • Cell stats can be added to VLTs, those beyond range of table during run will not update and cannot be edited

During the run, cell stat will remain bound to the same row regardless of any row insertion/deletion (not the case during edit where they attempt to track their original row)


  • bug fix for directed broadcasts


  • reformatted condition list dumps


  • animation fix: set up of item movement vector was incorrect for items animating in block mode
  • properly disable recent list in menubar during model run
  • display option enables optional formatting of attrefs as

p.Attribute instead of pAttribute

  • portal attributes can be defined on-the-fly while editing an attref


  • table driven entry bug fixed: they were not validating against blocked items properly, causing item count mismatch errors


  • increased formatting width for condition attrefs (when shown on "if" etc
  • multi-condition has "Report" button which writes the condition description to a file and opens notepad to view it
  • Routine also now writes "report" to a file opened by notepad All conditions are expanded
  • fixes bug reporting item mismatch which caused a crash due to a badly timed redraw


  • DIRECTED MESSAGE mode in the dispatcher lets you direct a message to a given message entry. You can also direct a message to a portal as long as it contains a message entry called _!message
  • bug fix when loading spatial nets which are exported


  • instance object unblocking optimised
  • no longer have FEC check for duplicate posted events, each object tracks if it has an outstanding unblock event
  • fixed object click handling
  • debug trace enhancements - events selected in the debugging memory currently written to the Planimat.DBG file
  • extra profiling counters added
  • directed broadcast calculation operation

enables a broadcast to be sent to a single subsystem location

  • broadcasting an item no longer loses its carried items



  • I have rewritten the way objects display as the model runs. They now draw through the animation manager (as do items) which means they can be drawn transparently and animated very smoothly. So big transparent portals are now possible.
  • Multi-icon support

The icon system now supports selecting a series of icon images (ICN or BMP) for an item or object. The animation engine will then change the image as the item/object animates, enabling rolling and walking effects as things move.
The icon palette still selects a single icon, you set up an animating icon sequence using a naming convention as follows
<name> <@> <index>
where <name> is the image name, <@> is the "@" symbol and <index> is a 2 digit index starting at 01
For example, the new BMPDEMO model uses:
TRI@01, TRI@02, TRI@03 up to TRI@08
The icons must be consecutively numbered and the first in the sequence (@01) must be selected in the icon palette. The system loads until one fails (in this case TRI@09 would fail) which then sets up an 8 icon sequence.
The images may be of different sizes, but remember their origin is the bottom left corner.
The stepping between images is controlled by new item/object attributes described below

  • New system item & object attributes, icon scaling

As these attributes are intended for run time assignment their settings are not currently saved with the model and in fact cannot be edited directly, only via a calculation.
Item X Scale, Item Y Scale
These enable an item's image to be scaled in the x and y direction. They are specified as a percentage, normally 100. Be wary of large values, you will run out of memory and probably kill win95.
Item Image X Step, Object Image X Step Item Image Y Step, Object Image Y Step Item Image Time Step (ms), Object Image Time Step
These control how stepping through images is performed (for multi-icons)
If X step is non zero, the x co-ordinate divided by the value is used to index an image, the default of 8 changes the image every 8 screen pixels. Likewise for Y (by default this is 0)
The Time Step value uses the system real time clock to step images at a specified time interval (20ms is a good start) so the image will change at a regular interval no matter how fast the item is moving.
Note: Time stepping cannot be used to animate items or objects which are not actually moving. Yet.
= Consolidation of decision and comparison code
Different code was being used to evaluate

  • comparison of values in conditions
  • comparison of values in routine lines
  • comparison of values in a binary search
  • comparison of values for unblocking

This could result in different evaluation if a condition comparison is made vs. a routine line comparison, due to the way round off was being handled. Round off gets introduced when values are computed through any kind of calculation, so a calculation which should yield 15 may in fact yield 14.99999999999999 as far as the system's representation is concerned.
To make reliable value comparison possible, equality testing is now done in a consistent manner, as follows:

  • Values are considered equal if either
  • the magnitude of both is less than 1.0e-12

(an arbitrary "small number" I have chosen)

  • the magnitude of the difference between the 2 values is less than the value with the greatest magnitude scaled by 1.0e-10

This means that there is a fixed 10 digits of precision *in comparisons* made between values, so for example:
10,000,000,000.0 and 10,000,000,000.1 will be considered equal
10,000,000,000.0 and 10,000,000,005.0 will be considered different.
This means that values can be safely compared for equality regardless of their absolute magnitude. The previous approach used a fixed "delta" of 1.0e-12 which meant that comparing 2 very large values became unreliable as the inherent precision of double arithmetic is limited to about 15 digits.
Note that the internal values are still stored in full precision to avoid extra roundoff error being introduced.
Finally, be careful when doing comparisons:

  • Dont assume exact equality unless you are indexing, checking a search result etc.
  • use range bounds to trap values which are computed and may not exactly match what you expect. To check if a bin is empty, check

bin_level <= 0.0

  • If you are comparing a computed bin level to a threshold, dont subtract the two and compare the result against zero, let the system compare the 2 values directly so it will be able to determine an appropriate precision for the comparison.
  • Avoid repeating a comparison,

eg if (a > b) action if (a <= b) action
instead use a select-case (I know else would be nice). I've not noticed failure of this but given the vagaries of floating point you cant be too careful.

  • NEVER EVER repeat a critical comparison if the value has been processed in between, with the assumption that the comparison will turn out the same both times.

eg you make a decision to do something based on raw bin level
you convert the level to a percentage
you then re-check the percentage to determine if you should do the thing you originally decided to do via the raw bin level.
This is just asking for trouble and will wreak havoc if the second decision doesn't fire even though you were convinced it should because the first one fired and you have scaled your decision critera properly.
For a given value do your decision making (eg: threshold check) in one place and store the decision result separately for later stages to use.
In fact, in general you should avoid re-testing something you have already tested, store the test result the first time, use ONE select case to catch the possibilities, etc.

For those that want to know, here is the algorithm I use:
const double COMPARE_MIN_MAG = 1.0e-12; const double COMPARE_PRECIS = 1.0e-10;
// determine greatest magnitude between the 2 values
double v_scale = max(fabs(v1),fabs(v2));
// if both are very small (or 0)
if (v_scale < COMPARE_MIN_MAG) return 0; else { // the difference
double dv = v2 - v1;
// the threshold we assert equivalence at
v_scale = v_scale * COMPARE_PRECIS;
if (dv >= v_scale) // v2 is greater return -1; else if (dv <= -v_scale) // v1 is greater return 1; else return 0; // values close enough to consider equivalent }


To top off the introduction of full colour icons I have completely rewritten the Animation Manager in Planimate. The AM co-ordinates the display of the icons as the model runs. The new manager handles updating of the icons much more efficiently, important since larger icons can now be animated.
The main noticeable change (apart from faster, smoother animation) will be that OBJECTS CAN NOW BE TRANSPARENT. This is made possible since the Animation Manager now manages their images as well.
Also items now flip peoperly
Technical Details (for those interested):
The old AM used to hide and reshow icons very often during repaint, especially when they overlapped. Whilst the user doesn't see this (it happens off screen) it wasted time and poses a problem with bigger icons (which not only take longer to draw but are more likely to overlap).
I've added a mechanism where the Simulation Engine can give the Animation Manager hints about what is happening with the icon, This enables the manager to perform many optimisations as it redraws the icons in their updated positions. The "hints" include:

  • Animate this icon to a new position then hide it (eg: item entering a server)
  • Animate this icon and keep it at front, it will animate again soon (eg: item animating through a string of switches or change objects)
  • Animate icon with others in a block (eg: items on conveyors, roads and tracks)
  • Move this icon to a new position but dont bring it to the front (eg: items shuffling through a queue, repositioning an object)
  • Change the icon of this object, leave it at its current location/z-order (eg: object changing its state)

The manager code performs all these operations whilst

  • maintaining z-order of icons (newer items appear at front) Enables items AND objects to be animated very smoothly even when they overlap with each other.
  • keeping block animating items (eg: items on roads) in front of items in queues etc, objects etc, which they can animate over
  • sorting block animating items by the object they are on (makes overlaps between roads look nice and layered)
  • maintaining backing store integrity (so an item under any other item can move out and not leave any "dirty bits" behind it. Important now very large icons can have transparent parts.

In addition I had to implement re-entrancy management to prevent an internal redraw while animation was underway (eg: window resize) which would otherwise confuse the animation manager.
Let me know how it goes.


After 10 years of living with 16 colour icons, I have FINALLY rewritten the animation handling in the system, so now...

  • iconic objects and items can be rectangular and of *any* size your machine can handle
  • full colour bmps can be animated both as item icons and object icons (using the new "Animate Object" routine operation)
  • The palette browser also shows BMP images (reduced to fit the palette) but they will appear full size when selected
  • the icon editor has been banished... its a separate EXE now. yep it still only handles the 16 colour icons
  • The icon mover now takes the icon editor's place in the menu bar. It can display and move BMPs into folders and DB files.

BMP files

  • can now be selected for object and item icons
  • I support 8 bit and 24 bit BMPs, others should work too
  • Transparency is supported as follows

Any pixels that are "Planimate Grey" which means
RED = GREEN = BLUE = 0xBC (hex) or RED = GREEN = BLUE = 188 (decimal)
will be mapped as transparent... so you can have nice irregularly shaped items (and soon objects during run)
If this causes your "silverware" scans to appear with holes in them (where pixels match the transparent colour) either edit the image to avoid the transparent colour or you can force an image to never be transparent by ENDING its name with a # symbol (the hash)
I dont store in the model whether a particular image is a BMP or ICN (the old 16 colour icons). For any given image name, the system first attempts to load a BMP with that name, following the usual search of the working directory, system directory and _*.DB files therein.
If that fails, it will fall back to looking for a .ICN file. So FOO.BMP will always be loaded in lieu of FOO.ICN, even if you pick FOO.ICN from the palette.
!!!*** VIDEO MODE NOTE ***!!!
To enable arbitrary colour BMP display I've had to abandon palette management. Things will still appear in 256 colour (8 bit colour) mode but it will get ugly as more complex images are used and transparency doesn't work.
So make sure you are running High Colour (16 bit) or True Color (24 bit) if your system can support it. If not and you have a desktop, consider upgrading your video card. If you are stuck with an old notebook, 16 colour icon operation should still be OK.
In making this all possible I've rewritten or modified the following subsystems, please take care particularly with your precious image DBs:

  • DataBase management/saving/updating (to greatly speed up updates when the big BMPs are moved in/out/renamed)
  • File copying routines (used by database)
  • BMP loading / display (though paint BMPs should work as before)
  • Item icon draw/animation
  • Planimate Object bounding box / boundary management (so non square objects are possible)
  • Display Object coordinate mapping (fixed the animation trails left when animating while zoomed)
  • The icon palette/pickers/mover & their current directory management
  • Image animation routines (speed up & optimise)
  • PRINTING needs to be tested when stopped and running
  • the icon editor (now stands alone) but I had to rewrite parts of it so I could build it with the new toolkit

ALL of my testing has been under NT4 SP4 so if you experience crashes or strange displays:

  • note your video card type and display mode settings
  • try a different video mode
  • check if you are running out of resources (a real possibility under 95/98 regardless of how much RAM you throw at it)
  • check if you have the latest driver for your video card

This EXE should be file format compatible with


(which of course wont load the BMPs you can now select for object/item icons...)

SOON TO COME:- the original request that inspired this rewrite... run time scalability of portal icons in width and height.


  • item/class attributes now merge (on inter model copy)


  • activity state system attribute added

shows an activity bar in the status bar,

  • Value of 1..100 controls length of bar, 0 to reset (no bar)
  • automatically reset at start and end of run
  • otherwise its totally up to modeller how it gets used

Since this updates even when running without animating, use carefully to avoid model slowdown

  • fixed fast anmiation bug after button click
  • animation flushing added after mouse/key/menu events to fix stray state icon problems when pausing and initiating messages
  • broadcast label re-indexing on model merging now implemented
  • merged broadcast labels should no longer be scrambled


I have completely rewritten the way animation updates are applied to the screen. I now use the backing store (active while the model is running) to eliminate all flicker when objects are repositioned, images repainted etc.
To make this work, I've placed "Flush" operations at strategic points in the system. IF your model does not update as it should and it worked with version Q, let me know, I may have missed one.
This involved finding and plugging some redraw re-entrancy bugs which were lurking in the system, apparently harmless until the update order became critical with the new implementation. I think its all fixed now, screens will redraw quicker *BUT* the cost is that nothing will appear until everything has been rendered into the backing store.
There are now 3 ways to move an *OBJECT* as the model runs
1. Current Portal X/Y system attributes
This is the least efficient as you'll usually have to message into the portal to get it move. It wont flicker but will still require redraw processing for each move.
Its good where an object knows where it wants to move to as you dont have to export its identity into the object label list.
2. Object Attribute (new attref mode) - Object X/Y position
This enables the x/y pos of an object to be set in a routine, where the object can be pointed to remotely. By applying all object movements in one routine you can reduce the redraws required. All the changes can be made in one redraw "hit"
3. Object "Animation"
A new special Calculation - "Animate" enables an arbitrary object to be smoothly animated to a new X/Y position. The object will move at the default system icon animate speed.


  • implemented dependency tracking for dynamic tables referenced using a constant attribute (but no speed up in table lookup)


  • removed comment text from calculation erea for comments
  • clipping display option (default off) enables objects to be positioned off screen and to stay there even when screen area resized. Otherwise they are brought back into view.
  • the time advance dialogs no longer continue the run if they are cancelled
  • fixed byg causing attref scan errors (condition pasting)


  • fixed rectangle update on graphical dial bug


  • object attribute access now implemented as attref mode
  • stat views update in pre-init mode


  • object type now indexed from 1


  • new file mode: file size read

deposits result into first attribute in the targets list

  • returns size of file (0..2Billion) or -1 if file does not exist
  • new calculation - object type, new label list "object types" to support it returns object type for given object reference
  • conditions are retained when switching between IF to CASE to WHILE
  • conditions can be copy/pasted within a model
  • menu bar option to toggle drag mode (in Window menu)
  • image dials now have an option which causes them to auto-resize to the current iamge boundaries rather than scale the image to fit the box
  • Have relaxed the clipping of stats so portals and stats can be positioned off-screen, let me know of any anomilies with it


  • arrival time can be set for items on a route
  • "Item Time Until Arrival"
  • used in conjunction to section running time to compute the running time

the previous implementation was moving items from sensor entries immediately the entry was sensing a change in its target. If this occured in the middle of a routine... the routine would lose access to its routine attributes
The fix was to schedule an event for the sensor entry which will execute once the current event has completed.


Portal reposition option - moves portal stats when portal repositions

  • you can drag a portal without repositioning the stats by holding down shift after starting the drag
  • label list operations (partial)

new "label list" attref element mode

  • to address entire label list for new label lists
  • label clear operation - clears all entries of label list without any validation/update of tables (existing data loses label) useful if planning to import

other operations coming...


  • optional "_color" column now added, if present the colour as specified is used

if not the original colour mapping algorithm is used, which maps states to colours but avoids the background colour


to get things consistent I have reworked the row colour code so colours range from 0..15 (as for tables/graphs)
255 should be used for no colour
To avoid problems with old models, I've added the "Index colours from 1 not 0" option which gets set for old tables using row colours, and things work as before.
Do not use this option with new models, I'm imposing the discipline of indexing colours from 0 as one day the colour values will become RGB values anyway ranging from 000000 to FFFFFF (hex) - around 16 million


if a condition is performing an AND and the previous value is false, I dont bother evaluating the second argument, result will always be false
This allows condition to contain test such as
att <= table row count AND table_cell[att][1] != 0 without the second operation giving an error if the first one fails


As I have yet to receive any feedback on version G I'll assume its bug free :)

  • implemented new option "Hide Item Click Details" which hides all item click menu options except attributes.

CTRL key overrides for debugging

  • some extra item click displays added
  • Facility now has complete state and stoppage editor
  • log driven graph enhanced
  • can have many graphs connected to same table with them plotting different ranges of overlay ids

The STOCKPILE demo model shows this
The AUSMAP demo model shows whats now possible.
Its a graph, not a BMP! Sorry I lost the pen-up command around Tasmania when importing the vector data.
BTW: a pen up can be achieved by plotting a line with 0 width


This is an intermediate release for testing. Much code has been modified with graphing, all graphs need good testing.
Do not commit to this version without recourse to roll-back to a previous one

  • log driven graph

dynamic graphing capability, driven from columns in a table
to be documented, currently the following columns are recognised. Note that not all are required and they can appear in any order:
_overlay overlay #, 1,2,3 etc. _x x points - these do not need to be increasing! _y y point
if these are present, they enable color/width etc to be changed on the fly for each line drawn in a given overlay
_color use the new colour label list, 0..15 _width line width _style _yoffset

  • default label lists added for colours, line styles and boolean codes
  • table import filter has new options
  • strip trailing spaces (from labels)
  • remove enclosing '

Removes enclosing single quotes and strips any junk outside of single quote pairs, first character must be ' for this to activate

  • new facility state edit dialog (not stoppage yet)


  • Wormhole entry/exit mode:

Wormhole exits "teleport" items to their associated wormhole entry, enabling items to be moved across the model without having to flow up and down the entire hierarchy, or having to hack using broadcasts
The relationship is one to one. It can be copy/pasted as long as the portal copied contains both wormhole entry and exit within its hierarchy.
Unlike messages and broadcasts, woemhole exits support blocking and unblocking... a blocked wormhole entry will cause its wormhole exit to appear blocked to an approaching item.

  • separate pipe options control load monitoring and load limiting selection

IF load limiting is not needed, turning it off will speed up operation

  • fixed problem when dealing with message items and portal item counting
  • sensor entrys no longer produce item until the main run starts. They can be disabled for an interval after that (specified in seconds)
  • fill intermediate steps can be interrupted with <ESC> key
  • new Display->System Parameters menu
  • will have engine tuning parameters added, initial one Maximum Track Fill Search places a limit on how deep system will recurse in attempting to fill intermediate steps. 50 is probably a more reasonable number. If this is too low, Planimate will be unable to fill the intermediate steps and the track logic will complain of unreachable steps


  • This implements the Sensor Entry

See SENSEENT.MDL for an interactive demo
This entry compares a target attref (can be a portal attribute or table cell) against a trigger level.
When the target crosses the trigger, an item is produced by the entry. The entry does not produce another item until a "reset" condition fires, this enables hysterisis to be implemented.
The entry has a very complete paused-click menu which shows everything you'd want to know about its current state
An option enables selection of "immediate move" which will cause immediate activity when an attribute is changed while the model is paused

  • Implemented "stay paused" checkbox in model error dialog to assist in debugging
  • Does not appear in interdyne mode
  • After an error model integrity will have been lost and continuing the run mhilst possible (useful for some debugging) will not be reliable and any results should not be trusted
  • A new _!SYSTEM.DB is included with this version, it includes new icons for new object states (new entry modes, broadcast change object) and smaller default icons for assembler, splitter and multi-server


  • fixes bug in intermediate loop filling and adds more validation to error conditions in the intermediate loop fill routine
  • avoid using the new entry mode "Sensor" its not implemented yet


  • added route read capability; model can read route information FROM an item into a table.
  • added "Fill Intermediate Steps" command

This performs the route "guess intermediate steps" on-the-fly on the current item route
An option specifies whether loops get filled in as well. This is very useful as you can then use the "route read" operation to read the completed route back into a table, fill in the timetable times and then re-assign it as a route to the item

  • CHANGE to Fill Intermediate Steps:

Have added validation which complains if a loop appears in a route without the endpoints of the track it is on around it. This would cause the auto-route builder to build incomplete routes since it cannot handle encountering a loop without the endpoints.
DYNROUTE has been updated to demonstrate the new capabilities
<notice how timetable times for automatically guessed portals/loops are zero; modeller needs to interpolate these somehow, this model does not implement this)


  • Fixes track bugs (bad error reporting for timetable route assignment)
  • Sort broadcast list
  • Added broadcast tracking when broadcast is sent from a change object and its sent via a constant or label reference


  • route timetable times are now used to compute section running and loop waiting times


  • implemented data handling for target "object detail" Eventually this will enable specific roads/sections to be specified along with an object label reference.
  • route assignment from a table implemented

A table can load a route into an item using the "Assign Route From Timetable" option

The following columns are required in the source table
"_location" : portals and loops on the route "_arrival" : arrival time (calendar) "_departure" : departure time (calendar) "_dwell" : minimum dwell time at loop
These will be interpreted by the track logic in future versions. Currently they are available as system/item attributes as follows:
"Item Time Until Arrival"
Gives the time which must elapse before the item needs to arrive at the next step in its route. (When an item is inside a station, its step pointer is already advanced to the next step). If the timetabled time has already passed or no route is assigned, this will yield 0.
"Item Time Until Departure"
Gives the time which must elapse before the item should leave the current object in its route. This is unavailable if the currnet object was the last step in the route (the route has completed). If the timetabled time has already passed or no route is assigned, this will yield 0.
"Item Dwell Time"
Gives the minimum time which the item must spend at the current object, even if its behind on its timetable. If no route is assigned, this will yield 0.
Model DYNROUTE.MDL demonstrates some of these


  • reworked way turned around trains signal loop entry delays


  • scenario tables include column headings (as a comment)
  • "RANDOM" distribution patterns no longer get clipped at lower bound 0
  • Random seed increment can be set for multiple runs (using 0 uses the same random seed for all multiple runs)
  • Cell stats now apply view rounding as set for their source table columns
  • cleaned up debugging option flags remote debugging via TCP implemented [for debug builds only]
  • memory allocation now shown in run profile, and run profile can be reviewed in edit mode
  • reworked trip auto completion algorithm
  • use more preallocated tables
  • does not invoke search algorithm if the next step is directly reachable (no steps need to be guesses)

This will *greatly* reduce model start times and memory swapping in models with densely connected tracks


  • fixed train direction code


  • extended run profile report

= reworked FEC code handling, removed old code



  • added code to re-evaluate train direction when it stops at a loop (because the loop was a step in the route)


  • registry handling implemented

model now saves most recently loaded/saved model list

  • added "Run Profile" option in the Display menu

displays runtime engine statistics, focussing on aspects which influence model speed performance and memory usage


  • can broadcast an item from a change object (broader.mdl)


[new file version]
  • fixed crash bug when exiting (palette deletion order)
  • fixed attribute editor so reselecting label mode shows label list
  • reordered saving code so item attributes get saved after all label lists (including class lists) have been defined

Now item attributes formatted as multi-labels should reload properly

  • multi label list can now reference sub-labels and object labels needs testing


  • fixed crash bug with bmp display dials
  • fixed ordering problems on deleting label lists
  • dial displays update properly in edit of attributes this invoved some re-implementation of stat display handling


  • implemented change calculation command (Special) to reset spatial link caches/positions on all panels

Use this to force update of spatial net details after the portals have been repositioned

  • row specific table row colours
  • a table option sets the row (like row labels)
  • an option selects whether column colour overrides row colour
  • row colours range from 1..16, 0 = keep default

I've not implemented dynamic redraw on just a colour change (this would slow down displays considerably)

  • Cyclic selection option on label lists
  • enables "yes/no" type labels to be toggled by clicking in the table cell rather than having to make selection from list


  • Implemented dynamic table references by attrefs
  • This enables a table in an attref to be lookup up on the fly using names in a label list
  • can be used to implement "3d" tables

DYNTABLE.MDL demonstrates it

  • rounding option now works for item attributes
  • Fixed serious bugs with table copy/paste/undo/row insert which would corrupt memory in instances where empty tables had rows pasted into them


  • Implemented Label Subset lists
  • These are label lists which contain a subset of another label list's contents. Useful for providing selective access to members of a label list in user fields


  • Planimate will now find data in _*.DB files in the working directory as well as in the system directory. Files in the wd are searched first
  • can now browse into databases when browsing BMP paint
  • Go Back button action (like ctrl-b) now available
  • Stat displays now hide properly when panel stat/table hide option is on
  • Undo implemented on table edits (not if columns get changed though)


  • The fix in


made things worse with the hide paint option. This version finally fixes it. Any models loaded which have version 212 will have the "hide paint" option turned off on all panels

(the file version is now 213)


  • fixed panel options bug introduced in 'c'

new panels would have random options enabled


  • track fix

a section become unavailable as a train in a loop enters loop exit delay will allow the train through

  • fixed user button to set panel
  • section capacity editing disabled
  • I'll be dropping support for multi-lane sections in an upcoming version. Use spatial links instead if its a road


  • Log Viewer cleanups
  • no longer crashes on exit if selection was in progress
  • no longer crashes if class filter selection
  • printing works
  • handles loading currently logged data from a model which is paused
  • handles loading data from model which has been restarted
  • menubar rearranged
  • export option now added, export header format cleaned up
  • user button to set panel zoom
  • fixed bugs in attribute selection
  • selecting label unit format did not update properly
  • routine attribute dialog failed because widget not initialised properly
  • dialog z-orde code reworked, report any new strange behaviour with ordering
  • "godzilla clock" bug fixed (clock got bigger as maio window was zoomed smaller because I was using it to measure the clock's font metrics)


  • Change to ATTRIBUTES

An attribute (Portal,Item,Routine,Class) no longer has a Distribution Pattern dialog as part of its definition.
This distribution was used to give the attributes *initial value* a random variation. This was itself limited in that the distribution used to initialise an attribute could not reference other attributes to specify its constants.
For item attributes, similar functionality can be achieved (with more flexibility) using the "Random" operation in a change object
For portal attributes which you want to initialise to a random value at the start of a run, the system "_Run Start" broadcast can be used to trigger a routine
This change will reduce model size slightly, decrease the model's memory footprint and speed up model run starts. Model run time will probably not be affected much.

  • Attref copy now copies latest field changes and closes the attref dialog (applying the changes)
  • Gantt graph debugged
  • its now functional
  • lines extending past ends of graph are properly cropped rather than drawn to their end point which would be very confusing
  • min y value and max y value can be used to extend the graph range (eg: min y can go -ve to get more space for the lowest labels)
  • Can adjust zoom scale on a panel by panel basis

This scales in addition to the overall system zoom factor, so individual panels can have special zoom settings. Good for large high resolution report panels; no need to zoom out to see them but they will still print properly.
Please keep the nominal screen zoom factor to 100% and only change where really required. Users can then use the master zoom to make the model accomodate their displays.
NOTE: Running animation with an overal zoom NOT at 100% places much higher load on the CPU due to co-ordinate scaling and bitmap stretching

WARNING: Running with very high zoom factors (overall > 500) and very large panels is a great way to exhaust virtual memory and lock up your system!!!

  • DISPLAY OPTIONS - some are now set on a panel-by-panel basis

Many panel/screen specific display options have been removed from the global display options and added as properties which can be configured individually to each panel.
The options are now configured by the "Options" menu reached by the panel background menu


  • Problems when editing RTF notes fixed
  • prevent selection of another panel while an RTF note is being edited
  • Inplace edit RTF notes do not become active when the background is clicked
  • Added queue "stop on full" option

This is *VERY* useful for debugging - it pauses the model and shows the panel where the queue is located. The item is left in the queue so it can be inspected (if capacity follows the queue the item will move when the model continues)
Single item queues with this option on can be used to catch unexpected conditions in a run and unlike the exit, they enable the problem item to be examined


  • Table driven entry implemented, check TABLEENT.MDL for details

basically the entry feeds from a table, 2 columns must be provided _time : time of event (calendar) _class : class of item to produce (new _item class label)
Events can be posted/unposted to this table on the fly (including in paused mode) and the entry will act correctly
A scheduled item with a time < Simulation time will be produced at the current simulation time
An Entry Option allow optional logging (demonstrated in the model)
Obviously the tables need to be VLTs for this to work...


  • bug fixes to model merge


  • copy/paste ordering rearranged so trip ids are pasted in sequence


more fixes

  • Auto track time fill option now turns off as well
  • Train graph views load in panels, can be added via background menu


[new file format]
  • Fixed label list selection bugs
  • can now add train graph again
  • added item classes to label lists


  • Implemented reading via ODBC (in change object)

Model ODBCREAD and BOOKSALE.MDB demonstrate reading some records into a table.

  • "Refs" button is back into the attribute dialog
  • panel background colour now sets
  • bug when using keyboard in combo boxes in new attribute editor fixed


  • hide bend point option added
  • gantt display row offset can be specified

a value > 0 specifies how many rows to offset the display by



  • new attribute create/edit dialog
  • new table creation dialog, enables commonly set options to be set as a table is added


  • Use the right button to get the cell menu (even when in paused mode)

Note that the options in this menu change depending on what is selected and in the copy/paste buffer

  • left button dragging in a table now forms a selection, shift-dragging extends the current selection
  • can drag past edges to scroll the table
  • rows or columns are selected when you click in their heading, shift clicking extends the selection as for cell selection
  • table column name and title now can be longer
  • importing into a new column also sets the column name when the title is set. If a name exists, its not changed
  • Clipboard export problems (errors on alt-tabbing) fixed (memory allocation issue) - manifested itself under NT4
  • Delete row does not give an error if row count is 0 and row is 1, makes clearing a table always work without having to insert a row

ie: Delete row 1 for RowCount(); will not complain if RowCount() is 0

  • routine: inserting a select also inserts a case as well as end select line
  • object icon handling
  • when a smaller icon is drawn after a larger one, the original icon is properly erased
  • tables will not do complete redraws as routines execute (triggered by inserting or deleting a row); they will be updated once the routine completes. Same applies to file import.

This means you wont get trapped on a screen importing a 10000 row table with a table view updating as each row is added


  • train graph test


[new file format]
  • table format width was not being initialised when first used, now fixed
  • scenario save
  • the display option->Include All Data In Scenario option now only saves portal attributes which are not marked constant
  • pipe activity colour is now an attref for each pipe

(ie: you can dynamically change pipe animation colour)


  • y scale includes 0 option for normal graphs added

(no longer need to have fake 0 point in data to get y scale starting from 0 when auto-scaling)

  • 4 digit year option on date writes to file


  • comma delimiting option now available for reading tables
  • new pipe advanced option

in advanced mode 3 extra attributes enable

  • limiting of amount loaded via a separate load limit attribute which gets decremented to 0
  • accumulation of amount loaded/unloaded

into 2 separate attrefs which can be set independently of the actual bin the pipe uses (hense each pipe's activities can be monitored)


  • scenario load: 0 row table read now supported
  • fixed the loader bug which caused load error if an exported pipe was being loaded
  • exported pipes now appear in the multiple export object add list


  • button bar now hidden by default (display option) and completely implemented

the navigation buttons take you to the first panel found with the names as follows:
"Navigation" "Interdyne" "Inputs" "Outputs" "Run Settings" "Information"
Names may be preceeded by "_". "!" or " ", they will still match as long they are the same (case insensitive) from that point on.
note: This is an initial implementation; more options will be added as priorities see fit.

  • scenario import table bug (vlts) fixed


  • object labels are sorted by name
  • object export name default does not include leading "_" or "!"
  • fixed scan count bug with section times running
  • initial tool bar added (most buttons not yet functional)


  • removed debugging for trip step generation
  • Added new colour selection dialog from Mark
  • Implemented extensive load validation to attempt to reconstruct models which were partially loaded and subsequently saved (corrupting the dynamic hierarchy)


  • attempting tuple append on a fixed length table is now flagged as a row index error instead of corrupting the system

note: You can still TUPLE INSERT on a fixed length table, the row index must be in the valid range; all rows at and after the insert point get pushed down and the last row gets lost


  • Routine attribute renaming should now only alter the local routine
  • Multi label read implemented
  • handles reading either symbol delimited or fixed width (the multi label width parameter determines the max number of characters read per element, the last can be < this value)

New Track menu option Network details:

  • enabling the "Generate Automatically" option shows fields where section running and control info can be bound to a table named by Location Table

For each section, "From" / "To" columns of the table are interrogated. Out Time/Back Time specify the names of ITEM attributes which will determine which table column to use to get the running time
Track 1/Track 2 (Control) specify the name of table columns to use to get this information, since it cannot be item specific yet

The generated lookups from the last run may be inspected using the Track->Section Details view but they cannot be edited if the "Generate Automatically" option is on

  • New "Find" utility being developed by Mark is in the Display menu The search can have '*' and '?' included and will implicitly find strings contained within other strings

eg: searching for CDE will match ABCDE and ABCDEFG
The search is case insensitive.

  • this EXE is built using optimisation; you should notice the system runs quicker. With my new setup I can now run optimisation without waiting half the night for a build!


  • Test version for new compiler
  • had problem loading its own model (the version number needs to be advanced by 1)


  • route's have an option to guess intermediate points; this helps where a route has obvious steps but will report any ambiguity requiring either extra steps to be included or a complete route definition (with this option off)
  • trip assignment at change option has new option

local : works as before, enables a local, arbitrary route/index selection
global: uses the global route list and the index defined with the route

  • automatically tracks changes to the route list
  • new explicit "delete" button to remove the trip assignment
  • pipes now track moving portal


  • Fixed switches so they can now handle an item of the same class visiting them just after an item has moved but before the move has completed. Queues and Splitters in loops with switches highlighted this problem since they push the item out before returning (and completing) the move which caused the first item to enter them - ie. they work recursively.
  • Button message dispatching changed from direct call of function to posted message dispatch, to reduce "winding in" of the process when buttons are used to continue a run - should not be noticeable in any way
  • Dispatcher now "forgets" target when switched back to "Normal" mode
  • Entry "User Click" options changed
  • no longer puts confirm message for creating item without continue
  • fixed path validation bug when click/continue option used
  • does not report "no paths" when click on a normal entry which has finished its schedule


TABLES: GREATLY sped up block row insert and deletes

  • A new message "_system close" is sent to paused/ready model when user quits/closes planimate

Planimate must process this message without user intervention

  • can read arbitrary file length into VLT

nb: table does not shrink if less data is loaded than required but it will expand to fit total rows read

  • reading into a block offset is supported, the table is padded with rows to achieve the required block row offset

eg: if a block read is started at table row 1000, an empty table will have rows 1...999 inserted before row 1000 (the first read row)

  • fixed bug with 24hr time display - rounding caused silly time displays for times at 59 minutes and more than 30 seconds

10:59 59
This did not compromise internal data integrity


  • 24:00 is now a valid Time Of Day
  • Portal's have a new option to avoid them being ctrl-paste updated (good for the odd control subsystem on a screen with many generic stations)
  • right button click in preinit/paused in table view now handled by the table view rather than showing the background menu
  • gantt bar labels are now omitted when they are too wide for the bar (ie. many events in the view)
  • scenario extention message added


  • Terminology changes
  • "Run Pre-Init" -> "Run Ready"
  • "Exported Object List" -> "Objects List"" need a name for the "Export..." object option?
  • model can set sys att "Run Start Time Reference"
  • this forces a restart of a model; invoke with care!
  • model can set sys att "Advance To Time" to initiate/stop a fast advancement

  • fixed bug which caused "time left" box to remain on screen when error occured during run
  • scenario can now load into VLTs
  • RTF note exporting: no longer appends to file (which would "lose" the appended text anyway - use gather notes to append together.

default export/import file name is now the note name
run gets

  • "Up To Owning Screen" user button adds current screen to the "Go Back" list
  • double click on name in status bar goes to owner for panels as well
  • display option to hide "Animation Starting" message
  • display option to override table/attribute scenario setting and include them all when scenarios are saved

(the individual setting for each object is not lost and will return if this option is switched off again)

  • append row in table now sets values to CLEAR


  • splitter editor bug fixed (again)
  • gantt min/update interval and scroller updating now work properly
  • new value formatting modes:

1. Value x,xxx.xxxx Like "Value" except commas delimit every 3rd digit
2. Time Of Day HHMM A four digit time, from 0000 to 2359
Modified value parsing algorithm to handle new modes more reliably

  • now handles k,m,b in short in place edits for unit modes
  • please report any interpretatin anomalies or unexpected value mode changes.
  • "duplicate" row menu option added for user mode


  • fixed crash problem with gantt on non visible screen at start of run
  • still problem with
  • gantt min update interval not working (nothing draws if its non zero)
  • scroller forgets setting upon redraw



  • rewrote internal table structure handing
  • row insertion, deletion and table growing much quicker (using many more block memory moves rather than element by element copy)
  • tables can grow much bigger (8192 elements vs. 8) before incremental rather than binary growth increment is used
  • preallocate Planimate tables as they load, rather than having them reallocate dynamically
  • the combination of these changes ==> *** S P E E D ***

Please report any anomolies immediately - all else same as v.12k


  • fixed loading of gantts in panels (oops)
  • implemented "Real time" mode
  • the display option "Run Model In Realtime" causes the scheduler to fast-forward the model until the model's calendar time equals the "real" calendar time (from the PC clock); the model is then animated in "real time"
  • its useful to have an update interval of 1 second in this mode

(the clock window is updated nonetheless)

  • this mode wont be much use in relative time mode


  • fixed crash with old graph code
  • fixed gantt redraws on wrong panel
  • can now add gantt from panel background menu
  • password and no edit field now properly handled for labels
  • click on bar in new gantt (for popup) implemented
  • table columns have a new option item to flag inclusion in this popup
  • start/end times of event are always shown in the popup


note: this version seems to crash on a lot of models I load. I've probably broken something with the "old" graph views. Please report crashes and what was happening

  • new gantt display (add via the "Add View" button in table/graph views
  • needs testing
  • usage docs to follow

basically, it requires these labelled columns
_time -> determines x axis, should be ascending _position -> determines row # _state -> 0 = inactive, 1..15 map to system colours for now _id -> unused _label -> shown in the bar if that option selected

_time,_position & _state are required to get a display, the others are optional

  • click on bar for info on row to follow v.soon
  • some scale parameters (eg min/max values do not alter things as it currently always auto-scales itself
  • model option to restart on stop
  • model will still go to stop state if an error occurs, or a stop occurs/is selected while the CTRL key is down (to avoid getting trapped in a running model)

This option is most useful with "Pause at pre-init" and "Run on load" as the user does not get exposed to the stopped model under normal circumstances

  • password option on dialog fields (displays '*' for each character)
  • Read only option on dialog fields

nb: For list box fields, the password option is ignored and the read only option does not prevent a selection being made, it just gets ignored when the dialog is ok'ed.

  • fixed bug with spatial link: was rounding co-ords which caused running times sto be slightly > than expected (about 1%)


  • fixed bug with graph displays not being drawn properly where the graph range was between 2 graph x points

the problem was made worse by not handling drawing beyond graph's last point when the first graph point was plotted - caused bars in the gantt display

  • right button on table cell now brings up ctrl-left menu
  • table row edit menu
  • added append row
  • implemented "User Cannot Add/Delete Rows" option (was previously the "User Can Add Row" option and was not implemented
  • scroller range edit now uses format of target column
  • File remapping support
  • The Edit->Files Accessed option enables review of files accessed during runtime (via change object read/write file) and bitmap images
  • The Edit->Initialisation File option enables an ini file to be associated with the model

When the model is loaded (or this option is selected) the ini file is loaded
currently ini file only supports file name remapping and must be of form:
[FILES] <from-name> <to-name> : :
names are quoted, example:
[FILES] "TEST1.DAT" "c:\rick\sv\data\test1.dat" "TEST2.DAT" "d:\moredata\test2.dat" "c:\rick\data\test3.dat" "d:\moredata\test3.dat"


  • item attributes have options

"Include In Item Panels" -> controls whether attribute will display in item panels (not yet implemented)
"Include In Item Popup" -> controls whether attribute will display in item clicked pop up list

  • By default this is on for old models and off for new attributes
  • A leading '!' overrides this and hides the attribute anyway

This means you dont have to name private attributes with a preceeding '!' which will make tupling management etc. easier

BUGFIX: external copy of date formatted fields copies entire date


  • Attref display reworked:

Now use a prefix letter without a ':' - use capital on attribute name for clarity:
pAttribute -> portal iAttribute -> item cAttribute -> class Attribute -> routine local

  • "Real Time" system attribute translates the real calendar time into a planimate time offset
  • routine attribute copy/paste offered when routine lines are copied to a routine without any routine attributes
  • routine attributes can be defined on-the-fly by selecting "Add New" when browsing attribute names
  • graph scroller
  • handles right click (to set start/end/step/resolution)
  • responds to keypad keys left/right/home/end
  • new button editing
  • can clear push stack for screen change
  • can review/change options for broadcast and screen change button
  • can reselect menubar commands
  • "Start/Restart" button added


  • object label list index editing updates targets as for label lists
  • missing routine attribute dialog bug (once attribute deleted)
  • changed "!=" notation to "<>"

fixes (also in l):

  • pipe redrawing if model started on other scrn
  • track handling of blocked train
  • conveyor gap handling (in




  • removed PV object code from EXE - models containing PV objects will fail to load
  • fix to track logic / switches (was not resetting switches BEFORE unblocking)


[file version 196]
  • ROUTINES can now have local attributes defined and referenced via R:attribute. These are private attributes to the routine

Routine attributes get set to the initial (edit) value whenever the routine is invoked

  • Attribute and table "Refs" now mark items which potentially modify them with a '*'

Let me know of cases I've missed

  • Can add all objects on a given screen to the export list from the Exported Objects dialog

misc fixes

  • z-ordering bugs with attribute edit dialog fixed
  • "VScreen() null message" when selecting portal entry in paused mode fixed


  • fixed bug with sequential switch becoming blocked
  • fixed crash bug when copying model with table column formatted for "model objects"

note: exported objects do not get their export details copied

  • fixed crash bug when copying model with trips in it... (no one found this?)
  • new broadcasts are indexed from 1, not from the system broadcast ids
  • fixed a bug introduced recently which would cause shuttle conveyor used at t>0 to give an error

anyone using shuttling conveyors? Under consideration for removal

  • switches now load with the right icon for their mode

Note: In this version I rewrote the way the Future Events Chain (FEC) gets events placed in it to make it more efficient. After running some debugging metrics I noticed the FEC could do with some optimisations.

<file version same as


I have completely rewritten the way the Planimate engine handles looking ahead and "resetting" of switch states as it explores options. I did this to:

  • abolish "Reset scan" loop bugs when portals or tracks are tightly connected back to back (using multiple portal entries/exits) - the reset scan mechanism could not follow the specific entries that the items had taken using the previous structure
  • attempt to cut down the search overhead (the old way, after an item had moved, the engine had to do another search of the tree just explored to "reset" switches. Models should be noticeably faster now

again remember that using the "Non blocking" switch option on switches you dont expect to block items makes a big difference to performance... more so now.

  • fix the long standing bug in the engine which manifested in the following object arrangement:

b e--- / \ / |>---a c \ / \ d f---
a,c are switches, b, d are change objects, e, f are servers
If c depended on an attribute which is set differently for b and d, and a explored both a-b-c and a-d-c paths (as happens with "any avail") then c would stick to the setting it got for the first test made, which may not be the appropriate one for the path actually taken
This is now handled properly

  • consolidate the way lookahead is handled in the various places it gets invoked
  • REDRAW bug fix for attribute stats with user button messages


  • Important Enhancement to broadcasts

The system now defines and sends some broadcasts which the modeller can use:
PreInit Start
Sent when the model is about to enter pre-init stage, just before it would pause if the modeller has selected "Pause After Pre-Init".
Note this is always sent, even if the model does not pause at pre-init
A good time to do initial calculations and table imports, before the user gets to see the model for the first time (assuming run on load is enabled)
PreInit End
Sent when the system is leaving pre-init stage. If the model paused at pre-init, it is sent when the user selects continues the run.
A good time to do final cleanups to attributes which are used to post initialise objects, eg: pipe total delay and interval, conveyor
Probably not required often
Run Start
Sent when the system is about to actually start running - objects have been fully initialised, pending events are scheduled for entries etc.
A good time to "throw" items into place, preload other items into queues etc.
Run Pause
Sent when the system is about to go into pause mode, because the user or an event has initiated a pause or there are no more events.
A good time to update tables and displays that the user will be exposed to
Run Continue
Sent when the system is resuming a run. Note this is also sent at the start of the run after the "Run Start" broadcast.
A good time to validate any changes made by the user dueing pause mode
Run End
Sent when the model is stopping, either because the user has selected stop or a stop condition has been reached at an exit.
NOT sent if an error causes the stop or an exit triggers a stop using the "Stop All Runs" mode.

Note: a broadcast during pre-init (either triggered by the events or the above buttons) should avoid putting items into objects with capacity as initial item loadings and state (stoppage) for these objects has not been determined - this is done just before the "Run Start" broadcast is sent

  • increased label width to 63 character (+ 1 internal terminator)

Label selection list now dynamically resizes to the longest label

  • Handling of long labels in dialog fixed (combo box was clipping them)
  • "Comment" calculation type added (in "special")
  • Calculation display is wider, may need to shrink comment area to see it all now
  • table shows owner in "Table" button menu, can go to owner by selecting that option. Solves "Where is this table defined" problem
  • now include owning change object name in routine dump
  • routine exports (TXT file) now get appended


  • Track Logic Change

The lookahead mechanism now resets switches in portals on the other end of track sections which are explored during "lookahead" meaning that it now should be valid to have a switch immediately at a portal with many sections feeding it. The switch should no longer "stick" to the decision made for the first item which tests it.
Note: Cyclic switches will probably not work properly here since the cycling sequence will not be retained.

  • Pipe line display sped up
  • fixed bug with table redraw when the "Edit Original" option is used on a table view


P I P E S -----------

Designed by InterDynamics Pty. Ltd.
Implemented by Riccardo Macri
(C) 1998 InterDynamics Pty. Ltd.

Pipes are the third type of "spatial" connection which can be formed between portals. They compliment track and spatial links for items by providing links for attribute value flow.
The pipe's logical operation and its on-screen representation are quite distinct, hence changing the display properties does not affect the model run results, nor the model run time when advancing without animation.
Logical Model -------------

  • The pipe connects a "Source Att" in the "Source Object" to a "Target Att" in the "Target Object". These will typically be portal attributes of the source and target portals. By default the pipe looks for an attribute called "pipe" but this can easily be changed in the Pipe's Object menu.
  • "Total Time" determines the time between a quantity being collected from the source and deposited at the target (assuming "Run Control" is at 1, more on this later).
  • "Time Resolution" determines how often the pipe "samples" - in effect determining the flow granularity. If the Time Resolution equals the Total Time, the pipe does the transfer in one big "bite".
  • "Load Rate/Hour" determines the overall flow rate at which the pipe draws from the source attribute - with the proviso that the pipe will not draw the source below zero.

The pipe is composed of a number of "logical bins" in series, each bin stores a quantity representing its "level". The number of bins is computed by Total Time / Time Resolution - the finer the time resolution, the more bins.

[source]-->[ ][ ][ ]...bins...[ ][ ][ ]-->[target]
Events get generated at intervals of "Time Resolution", at every event the pipe:

  • shifts its contents one bin towards the target (implemented such that the number of bins does not affect the speed of the shift)
  • "dumps" the last bin into the target attribute (incrementing it)
  • "loads" the first bin from the source attribute (decrementing it by the load amount). The load amount is computed by:

Load Rate/Hour -------------- x Timn Resolution 3600.0
Hence the load amount is less for smaller time resolutions, since more loads are occuring per hour.
The load amount gets clamped to prevent the source attribute being made negative - ie. the "demand" cannot be met. In addition, an object option "Load Integral Values" forces rounding of the load amount, so the pipe always contains an integral quantity without any fractions.
Note: If the load amount per sample is less than 0.5 and the integral values option is on, nothing will be loaded!

Note: Decreasing the Time Resolution (yielding higher resolution) means more events need to be scheduled to keep the logcial pipe updated, this will impact on model performance.

Graphical Representation ------------------------
The graphical display of the pipe has been designed to efficiently display the state of the logical pipe without impacting on model results. In addition run speed is not impacted by complex displays if they are not visible.
The pipe is drawn using a number of straight "sections", bend points may be used to shape curves. Parameters which affect the display are collected in the "Display Settings" sub menu. These include:

  • Display Resolution: This determines the amount of sections into which the pipe is "sliced" for display purposes, in effect determining how granular material flow in the pipe *appears*.

It must be at least the number of bends in the pipe (otherwise the pipe cannot be accurately drawn) but typically a display resolution of at least 100 yields a much smoother result.

  • Border Thickness: Determines the thickness of the border lines of the pipe
  • Pipe Width: Determines the width of the pipe. Interesting effects occur with very wide and bendy pipes!
  • Activity Update: Determines the interval (in ms) over which "activity" highlights in the pipe are moved. These are different coloured bars which "chase" down the pipe to highlight material movement.

The time is in terms of *real* milliseconds, independent of model run speed.

  • Activity Spacing: Determines the spacing of the "activity" highlights in the pipe.

Nice smooth activty effects can be attained using:

  • large display resolution (200)
  • wide activity spacing (15)
  • fast activity update (50ms)
  • a model "Display Update Interval" which yields at least 10 screen updates a second (this depends on the models complexity, CPU and most frequent scheduled event).

Note that this will give a smooth effect even for a pipe with a single logical bin - in more detail:
If there are more bins than sections, some sections will show the average states of a number of bins
If there are more sections than bins, some sections will share the same bin

  • Nominal Load Rate

This gives the pipe a reference from which compute its bin "occupacy" level. This in turn is used to colour the sections when updating the pipe display.
Pipe Colours
These are in a separate sub-menu
Border Pipe border lines Empty Colour used for section if bin level virtually 0 (< 1.0e-12) Low Colour used for section if bin level < 0.25 of nominal Medium Colour used for section if bin level < 0.75 of nominal Full Colour used for section if bin level >= 0.75 of nominal Activity Colour used for the chasing "activity" bars
Note: The display settings "Set To Defaults" / "Set From Defaults" options respectively Set Defaults / Apply Defaults for the pipe graphical setting AND colour selections. The defaults are used for newly created pipes during the current session.

FINALLY: The "Run Control" Attribute ------------------------------------
This is the most powerful parameter in the pipe. The default value of 1 causes the pipe to operate as described above. Changing the value affects things as follows:

  • Setting it to 0 suspends pipe operation. The pipe gets stopped
  • Setting it to 2 DOUBLES the speed of the pipe... the sampling interval gets halved, causing the SAME loads to occur twice as fast. So the pipe doubles its flow rate.
  • Setting it to 0.5 HALVES the speed of the pipe... the sampling interval gets doubled, causing the pipe to halve its flow rate.

And now the surprise:

  • Setting it to -1 REVERSES the operation of the pipe - the target becomes the source, and the source becomes the target. The pipe now flows material backwards.

Any +ve or -ve real value can be used to scale the pipe's operating speed.
The "activity" animation also gets scaled / reversed to highlight the change in the pipes update rate.

  • Whenever* this attribute is changed, any pending update event for the pipe is removed and a new one scheduled for the newly calculated update interval (or none if the pipe is stopped, with a 0).

Attribute Reading -----------------
The pipe uses 7 attribute references which specify its operational parameters. Some of these are only read at initialisation time, others are read on-the-fly.
Only read at pre-init:
Transit Time Update Interval Nominal Load Rate
Read/updated on-the-fly
Source Att Target Att Load Rate/Hour Run Control


    • New file version 193
  • Implemented ranges on column/row operations like Sum, Avg, Min, Max

For old models these are initialised to 1..RowCount or 1..ColumnCount as appropriate if the source is a column or row respectively
These enable sub-regions of a row/column to be worked with

  • Broadcast Buttons

Broadcast buttons send a specific broadcast messages, causing interested broadcast entries to immediately produce an item (of the type of the flow leaving them).
No continue is required, the item is produced once the button is clicked and its event is processed to completion (end of its processing thread).
A "Broadcast/Continue" button continues the run once the broadcast message has been processed.

  • Matched row *** AND COLUMN *** access to tables

The MATCHED CELL attref mode enables dynamic location of rows and columns in a table, rather than using direct indexing.
For the row: A "key column" is searched for a specific "key value". The match is the row which will be used. If the match fails, an error occurs. This match is *by value* so its important that the format of the key column and key value be the same (ie. same label list)
For the column: A string match is sought between the table column label and the label of the attribute addressing the column. (If the attribute is not formatted for labels, its treated as a normal index). In effect it implements a mapping between a label list (eg: _Model Objects) and the column labels of the table.
If the label is not located in one of the table columns, an error occurs
Using the attref COLUMN INDEX mode, a model can determine whether a label matches any column of the table without an error - instead 0 is returned. This is in addition to using COLUMN INDEX to determine the index of a column label selected from that table.

  • "Dont Show Pause Messages" display option

prevents the model from complaining about "no events" and announcing that it has become "paused" which is very useful for interactive models which respond to message buttons

  • Paused click on portal -> Cached Links option now shows each link and the computed distance to it
  • Objects can directly reference the object index of their owning portal this works up hierarchy until it finds an exported portal, if none then 0 is returned
  • Table printing bugs fixed
  • Was not properly recomputing rectangle boundaries during the print. Things were made worse if the screen was at zoom of < 100% before the print.

note: some differences will still occur due to possible different printer device fonts. I lock the table boundaries and the display code fits as many rows/columns as it can depending on the current font metrics. Even different zooms will yield different results especially for non truetype fonts which only render at discrete resolutions.

  • conveyor now reads running time attributes when item first enters

This gives the model an opportunity to set up conveyor delays, as long as it occurs before the conveyor is used.

  • unless items are preloaded into it or fill gaps option on shuttle conveyor is on.
  • When adding a spatial link between portals the system prompts you to provide a name for the portal in the model object list


    • New file version 192, major changes, migrate to with care **


  • Spatial links

A new type of connection between portals, added like a track but they work very differently.

  • No capacity limit, entering item never blocked
  • Item leaving spatial link must never be blocked
  • Item does not need a trip, you set a System-Item attribute to a *final* destination (via a global label) and the item takes the shortest path there
  • section times not specified on the links, you set a total run time on the item and the animation is performed such that the item arrives at the final destination in the specified interval
  • items can have spatial link details set up through a message item
  • New table addressing modes

Instead of addressing a table by Row/Col, one specifies
Key Col, Col and Key Value
The Key Col column is searched for the value Key Value then that row is used to address the cell at column Col
Instead of specifying a row directly, one specifies Key Col and Key Value,
The Key Col column is searched for the value Key Value and that row is then the target row for the operation
In both cases:

  • If more than one row matches "Key Value" then any may be returned... dont expect any preference
  • If no rows match "Key Value" then the model stops with an error

Its intended that these MATCH modes are used where its assumed all expected keys/labels will be in the table, and the labels will be changing order meaning row order cannot be relied upon.
Performance will be slower than using CELL and ROW due to the search so only use where label lists are changing and the tables cannot be kept in index order.

  • New Attref mode enables column label index for any table to be determined
  • in "Column Index" mode you pick a table then set the column reference to "Column Label" mode

At runtime it will return the index of that column
Useful in searching across table rows rather than down

  • tables/mappers are now always addressed using Row/Col even if they have a single column. Old models with single column tables may have a zero "column" attribute which will need to be fixed.
  • placing (via meta panel) an item at a Portal will actually pass the item on to a Queue in the Portal called "_!Catch" - modeller must create this

This enables Portal object location to act as both a spatial link location and a target for placing initialising items

  • Model can query # of objects which are in the object label list (system attribute) - will be useful when remote access of object attributes is implemented
  • tweaks to formatting width for set calculations


  • Queues now properly give error when thrown items cause them to "overflow"
  • log viewer exit fixed
  • printing when paused (backing store re-enabled), not font probs yet
  • dialog centering


  • fixed "attribute" bug with endifs
  • now expects _PL_KEY.KEY for key files (_SV_KEY.KEY still works)
  • reworked label handling so object/route/broadcast label formatted columns can be imported
  • help files now expected in a sub-directory called HELP, not SV_HELP


  • about box precludes other events
  • about box only shown briefly if loading a model
  • spaces in path now handled when launching model directly from explorer
  • bugs handling long names fixed with database
  • dial message introduced in previous version fixed


  • fixed about box problem (was not looking in database)
  • fixed bug in editing first object label introduced in last version


  • dial redrawing reworked
  • fixed dial display updated to attribute value when ctrl-pasting in portal and retaining values
  • avoid flicker between previous and current value (bad for image views) when first redrawing scrn in paused mode
  • New object mode specific icons for entry, exit, change, switch, meta portal also dispatcher
  • cell ctrl-click menu has option selection to select auto across/down for multiple value table entry

problem with ghost boxes being left

  • "none" object added to object list selection
  • now have "about" box for planimate!
  • fixed memory leak in StringList (DeleteAll was not releasing string memory) mainly a problem when browsing icons
  • fixed: lost table row/column property selection in calculation when a table gets renamed
  • object label list reindexing/sorting
  • paint: removed save visible/load painting options since they do not properly save font usage info, causing problems on load. Use portal copy/ paste and the "Other Options"->"Copy All Visible" options to move paint info from panel to panel.
  • icon for loop can be specified from the track menu, no need to hack the system.db file


j 22/12/97 New Features

Enhancements * When Routine editing, Endifs, End loops, End selects are automatically added when the opening statement is added.
* Prev/Next buttons in routine edit dialog.
* File extensions now include descriptions.
* Paint image is now BMP by default.
* "
Back" option (Under Window in Menu Bar) or Ctrl-B goes back to the last screen. This is only a one level back, selecting back again gets you back where you started. Useful when a hot jump takes you somewhere you dont want to be
* F2 key edits table cells

Known Bug Minor memory leak, source not yet identified.



18/12/97 Planimate


18/12/97 New Features

Enhancements * Implemented renaming of attrefs when a portal, item or class attribute is renamed for portal attributes, only attrefs in scope are renamed for item, all item attrefs (for any class) referencing the given name are renamed.
* Implemented copy/paste of calculation lines (replaces the block move). Copy buffer is retained between change object edits but cleared when model run or refs scanned for any reason (find refs, delete attribute)
* A new "Add item" at the bottom of the routine list enables paste (right button menu) or quick add (double click)

BugFixes * Fixed dispatcher mode dialog



08/12/97 Planimate


08/12/97 New Features

Enhancements * New dialog based routine step editing (instead of the pop up list)
* Gathering RTF notes.
* Clicking in "icon area" in status bar brings up item class list
* Default field/default button/field selection of many dialogs reworked.
* Shortcuts / rework of attribute, table, label, multilabel dialogs, plus return to list after editing content.

BugFixes * More dialog ordering bugs fixed (dist pattern).
* Built using a different compiler header/library (report any unusual behaviour in previously fine dialogs).

New dialog based routine step editing (instead of the pop up list) You can use the Arrow Keys to highlight a line in the calculation list in the Routine Editor, then use the space bar to select the Line for Editing. A new dialog is now displayed, with new buttons and features.

Attribute reference dialog contents can be copy/pasted into each other.
Use the Copy Button if you wish to retain a reference for pasting. Subsequent Attribute selection Dialogs provide a paste Button.
(Once this is proven we will support multiple copied attrefs).

Gathering RTF notes There are new editing options in the context menu for the RTF Note Editor. A “Gather” operation has also been added to the Database editing utilities. You can now select all the RTF notes you want to bring together into a single RTF file.



20/11/97 Planimate


20/11/97 New Features

Enhancements * Pasted and ctrl-pasted portals retain customised pentry/pexit names if the portal name does not change.
* Space bar now selects current item in multi-list as well
* Step column wider in routine list
* No longer treat single column tables differently in editor (so column label can be used).
* Navigate menu in window menu, CTRL-N as shortcut to the screen list.

BugFixes * Crash bug fixed, portal entry/exit ctrl-paste failed due to name matching problem.
* Variable length table resize - scroll gets reset so should not get empty window.
* Pasting new table (after copying using Selectall/copy in the table button dialog) - extra button now properly labelled as "Paste" not "Copy".



11/11/97 Planimate


11/11/97 New Features

Enhancements * Editing changes

BugFixes * Splitter no longer includes extra items when "no items produced" which would cause crash if selected (cant have no-select items in list).
* Proper repaint when screen properties are changed.

Editing changes Accelerator / hot key enhancements (now started). Many dialogs now have working arrow keys in lists (focus set to list at start)

Table editing is now modal, shortcut keys on buttons and arrow keys work together.
The Space bar now has a role to play: It enables edits on the current cell of a table. You can no longer use the Enter key to edit table cells - only buttons can receive it. In a List Pick Dialog, Space moves item to other side. In an Item pick, Label pick etc: space selects highlighted item.



29/10/97 Planimate


29/10/97 New Features
Screen Visible system attribute.
Play Sounds in Planimate
Enhancements * Spawn now avoids DOS box
* Entry: Pause-click with continue option - no message shown in this mode, model immediately continues after user clicks on it.

BugFixes * None

Play Sounds in Planimate Now you can have the user, or the system play a sound while working or running a model.

There is a new Button Click-action to play a sound. This play is asynchronous to the model run, so if you need to stop it before it is finished, use another button and click action with an empty name to enable the user to stop any playing sound.
File option in a Change Object can now be set to play a sound (async or sync is optional).

Screen Visible system attribute. Screen Visible system attribute. This new system attribute can be either Read or Set. To Read: Ask the model if the screen is visible: returns 1 if visible, 2 if it is not This way you can detect what the user is looking at, and perhaps alter the animation to suit them. To Set: Assigning a value of one to the screen visible attribute makes the screen visible! You might think of using this to jump to screens if errors or interesting behaviour occurs.



23/10/97 Planimate


23/10/97 New Features

Enhancements * Portals can have names exported (no throw into portal though)
* Ctrl-paste of hierarchy over hierarchy with exported objects will attempt to transfer the export name/ids to the copied objects, where the systems match in structure and name. Unlike 'retain attributes' this works beyond the first level of the copied system

BugFixes * Load bug fixed: long export names corrupting memory



22/10/97 Planimate


22/10/97 New Features

Enhancements * Can select/browse trip and object labels
* Only on move is now the default for change objects in a Meta Panel.
* Assume no blocking for all switches in a Meta Panel.

BugFixes * Correct object export name shown in label formatted column
* System Label list title is more useful.



20/10/97 Planimate


20/10/97 New Features

Enhancements * Splitter can now transfer some item attributes and item icon
* Splitter avail in MetaPanel
* Added "Up To Owner" button action
* Longer export names supported (and default name)
* Object palette handled properly, does not stay at front
* Started adding support for "Object location" index (might be useful in loops?)
* Can edit export info within the export list, separate show and show/exit options

Planimate 4.10 18/10/97 Planimate 4.10 18/10/97 Important notes: * Compatibility window moved to 176 (last dos version) keep an older 3.90 - 4.07 EXE to convert older mdls.
* Removed track monitoring/limit/crews.
* Removed time tables.
* Removed all signal handling (Demand-Pull Assemblers), old models with signals cannot load, use old EXEs to remove them.

New Features * New name for the software product - Planimate* New System Label Lists:
_Model Routes label list enumerates all defined trips
_Model Objects label list enumerates all exported objects (The object’s index is used for place operations).
_Broadcasts label list enumerates all created Broadcasts.
* META Panels
* Capacity Switches
* ITEM Placement
* New system attributes
* New Exported Objects List
* Set Password for Editors

Enhancements * Entry: increased default limit & digits allocated increased default time range (10 "relative" Planimate years) default item interval now every minute
* Loading an older format model marks it as unsaved
* Status bar now prevents change of screen during animation, and in Interdyne mode
* “/saveonexit” command line option - saves model if not saved on exit.
* "Simulation paused" changed to "Model run paused"
* Calendar time calculations: / system attributes
* Enhancements to simulation engine
* Interdyne Enhancements:
* Internal engine change - optimisation to Move()
* Model Control: Pause/Stop enhancements
* Stack checking implemented for the key engine operations

BugFixes * Fixed entry bug (new defaults were overflowing instance short int).
* Fixed unblock bug (was doing error check wrong way around).
* Table editing rework- system adds tables/mappers to correct screen when clicking on portal, and system handles change of screen during table/mapper edit properly.
* Cannot now select meta portal into flow.
* References for tables now works.
* Dial lines should appear now on print, still needs more fixes on half oval.
* Deleting last column in a table is tolerated by graph views - an empty (no column) table will save/reload with one column in it though.
* Table read (edit and run) supports empty cells, and uses the cell's clear value
* Hid "View" selection in subsystem, menubar & prevent mode selection in status line.
* Item count now resets to 0 for exit once count limit reached.
* Printing now redraws screen once done.
* Item descriptions during mouse-drag over the palette changed.

META Panels META Panels A Meta Panel is an environment where configurations/changes to the model can be made rather than meshing these into the dynamic model itself. You can use a Meta Panel to distribute items and broadcasts around a model (and co-ordinate using broadcasts) In a Meta Panel, only a subset of objects from the standard Object Palette is available.

No queueing capacity is allowed other than at Splitters. Capacity switches handle the traditional problems now. Meta Panels are triggered into activity by using broadcast entries to listen for Broadcasts from elsewhere in the Model. You Add Meta Panels using the Object View Background menu in Dynamic subsystems. Meta Panels can be hierarchically arranged, as you do with regular Portals.

Technical note: A meta panel is a portal prefixed by name _META. A normal portal cannot become a meta panel and vica versa. A meta panel follows all the usual scoping rules for attribute/table access.
IMPORTANT: DONT use normal (scheduled arrival) entry mode in meta panels. It wont be supported later on, and your model will fail. Only use broadcasts. If your dynamic model continually needs to activate a meta panel, it should not be a meta panel...

Enhancements to simulation engine Capacity Switches
Internal engine change - optimisation to Move()
Model Control: Pause/Stop enhancements
Stack checking implemented for the key engine operations

Capacity Switches If a switch will not ever be blocked (indicated to it by the "Not Blocked" switch option) then it can safely defer decision making until an item actually moves into it - no lookahead is required past the switch by the object behind it. This means all tuple, dialog and table operations can be executed in the change object behind the switch and NO CAPACITY is required between the change object and the switch for the switch to make the right decision. In fact loops can be formed between switches (with no blocking on) and change objects without intervening queues, etc. Don’t have more than one switch in this kind of a loop.

Internal engine change - optimisation to Move() If the destination of an item movement is the same object from where the item is leaving, things are handled more effectively (recursion is avoided) which enables arbitrary length loops to be set up with the new "capacity switch" capability.

Model Control: Pause/Stop enhancements Should be more reliable. If the user selects "Stop" but animation continues, the engine is attempting to complete the current event. This can be interrupted by clicking again, the option is now shown as "Terminate" and aborts the model without completing the current event's processing.

Stack checking implemented for the key engine operations Gives descriptive error message (not error code!) Lookahead limit raised (from 10 to 1000!) but when its reached an error message is shown rather than switching to an iterative algorithm (which did not guarantee execution order).

ITEM Placement You can now “Place” an Item into an object, using the new Exit Object Mode “Place Item into Object”. This option is only avail for exits in a meta panel In this mode, the "Location" system-item attribute should be set up to point to a target. Appropriate use of the Exported Object List, and its corresponding _Model Objects Label List will enable you to “Point” to the correct object.
Items can only be placed at time 0 for now. Dont forget to assign trip/step when putting item into track objects.

New Exported Objects List New Exported Objects List A new list option called Exported Objects is now available from under Edit in the Menu Bar. This list is a collection of those objects Exported by the Modeller into this list. Items may be “placed” into these exported objects at the beginning of the model run. This option is only available for exits in a Meta panel. This enables the modeller to customise the startup state of a model, right down to specifying part-completion of processes (including track section traverses) and setting values on any item attributes that may be required to be set at the very beginning of the run. Apart from the Portal, which is a special case, only objects with a delay capability or capacity are exportable. Exportable objects are: Server Multi-Server Queue Dispatcher In Tray Out Tray Splitter Assembler Track Object Portal Items cannot yet be placed into Portals, however they are useful for identifying Route Steps. The Object Edit Menu now has a new option, called Export, where you may export an object, giving it a specific name to be displayed in the Exported Objects List.

New system attributes These system attributes enable you to “Place” an Item into an object, using the new Exit Object Mode “Place Item into Object”. (This option is only available for exits in a Meta panel).
Location Set this by making reference to the _Model Objects label list.
Item Total Delay Set first, so item knows what delay is involved

Item Delay Left Set ONLY after setting Item Total Delay, engine needs it to compute effective item entry time.

BROADCASTS A very powerful enhancement to modelling. We have a new mode for Entries (broadcast receiver) and Exit (broadcast sender). The Broadcasts themselves are collected into a list of Broadcasts. This list is available from under Edit in the Menu Bar. Broadcasts may be created from this list, or you can define them “on-the-fly” when you create a Broadcast Exit. A broadcast occurs every time an item is sent into a Broadcast Exit. A "clone" of the item (known as a Broadcast Item) gets sent to EACH broadcast entry associated with (ie. listening to) that broadcast. Apart from its own Item ID number, it is identical to the exiting Item. Unlike a Message Item, the model can do whatever it likes with the Broadcast Item, it doesn't get returned to the source of the Broadcast.
Start thinking in terms of using broadcasts to co-ordinate model-wide activities (like initialise, prepare user reports, load from files). Combined with Meta Panels this feature is intended to can help get the model administration out of the dynamic model, so that animations are more congruent.
Anticipate addition of some useful default broadcasts like:
* model finished pre-init
* model being paused
* model being continued
* (user defined) table / attribute has been edited
* return to Planimate from alt-tab
* other ideas??

Calendar time calculations: / system attributes Days in Month -> returns # of days in the month for the given date/time
Advance Month -> can advance a calendar time value +/- months (keeping the same date) NB: You will have problems if the date is say Jan31 and you advance to Feb, because you will end up in March instead. This is not currently detected so he careful. Later version will probably stop the model run when this happens.
Form Time: Translates 3 attrefs (date, month, year) into a calendar time

Interdyne Enhancements: * Objects named with leading '_' are hidden in Interdyne mode. Use of _! and !_ are also ok to keep names hidden during edit.

* Implemented model password saving/loading. Interdyne key users can edit their model by entering Ctrl-Shift-H, and providing the password (temporary only) if one was set by the builder.

Set Password for Editors Set the InterDyne editing password using the EDIT->Password option. If a password is already set, it must be entered before a new one can be entered. If an empty password is entered, empty (initial) password is assigned.



03/10/97 SV


New Features None

Enhancements * Gantt time display can have different colour.
* Label content in gantt bar is centred.
* Times are not shown if not enough space.
* Can copy one overlay's graphical settings to all (copies colour, thickness, style, not y offset).
* Can set an overlay’s properties as default for new overlays.

BugFixes None



02/10/97 SV


02/10/97 New Features
* None
Enhancements * Model Routes can be addressed as a label list <not the steps, the trips themselves> NB This is a beta implementation, so do not use until further development is completed.
* Reference tracking improved - You can click on Message Entries to show references. The reference list now shows a large number of objects properly, selecting one shows you the object.
* Reference tracking improved - You can double click on Message Mode Dispatcher to go to the screen containing the Targeted Message Entry.
* Gantt time label option enhancement - When a graph display is in "Gantt" mode, a new option appears enabling showing of times before and after gantt bar. Also, label text is no longer drawn outside of bar boundaries, to prevent overlap problems.

BugFixes * Blocked Message Entry message now includes item ref of the item which is blocked.
* Wait cursor shown on save model
* Fixed problem where many items moving from an object to a dispatcher produced an error reporting the message entry being blocked
* The Log Viewer can now be closed, using the Close Window Object, at top left of Window.



20/09/97 SV


20/09/97 New Features
* Different update interval for different screens
Enhancements * Can relocate Table column during table edit (CELL stats for the column are lost however).
* Table sort available by clicking in table view title in stopped/user mode (if option user can sort is enabled)
* Table sort sped up (check), row swapping of row labels was inefficient.
* Improved section debugging display when attref error occurs
* Advance options added to paused background menu
* Advance for interval option added in run menu - enables stepping forward by a time increment even in calendar time mode.
* Screen background colour can be set in the "screen properties" background menu.

BugFixes * Fixed shared routine allocation
* Fixed dialog z-order handling (should not lose dialog/editor behind SV window) and control bugs eg: options dialog from table editor enabled table editor to be closed.
* Gantt (horz bar) display can now handle display when the y scale min/max values are reversed from usual.
* "Interactive dials" clip to dial value boundaries when dragged by the user.
* Keys function when palettes in front.
* Dialog fields with label lists have width set so labels will never be cropped (which would cause selection failure)
* Labels for all dialog widgets can now be empty, widget wont be deleted
* Palette/window title bars work properly when dragging objects off palettes - the palette used to be called "SimView".
* Relocating the column used for row labels is properly handled.

Fixed shared routine allocation Fixed shared routine allocation so "local" attributes from point where routine *invoked* can now be accessed Limitation: If a shared routine is *not* ever used, the engine still must initialise it - and it will use the point of reference of the screen where it is defined. This will cause a problem if the routine depends on a localised subsystem attribute which does not exist at the scope level of the routine, it will then complain.

Different update interval for different screens Different update interval for different screens can be set The run menu option is the "master" and scales whatever value is set for the current screen/panel, under its Properties option (Object View Screen Background Menu). ie: Screen’s animation update interval = Screen animation update scale value x Master animation update interval. By default, dynamic screens get a value of 1, (Panels get a value of 0). Hence if the master is say "5 minutes" then all dynamic screens will get refreshed every 5 minutes per the simulation time clock, all panels will not. E.g.



12/09/97 SV


12/09/97 New Features
Change to Track Section Availability/Speed Scheduling

Enhancements * RTF note editing improved
* Increased density of time display (esp. around one->two day width) and included heuristic to avoid repeating date display multiple times.
* Many cleanups to time formatting / label formatting code, report any strange formatting problems. Eventually will support wider labels/format areas, this is first step
* Time entry filter supports times entered (& imported) as HH:MM:SS, but they will be shown as HH:MM SS.
* New Calendar time mode: "Calendar HHMM", original mode called Calendar HH:MM. Shows/parses times as HHMM with no colon, no seconds shown.
* Paint mode “Hide” works for objects again (useful for large paint objects, NB: hide state is temporary and not saved).

BugFixes * Real Time Scaling and Animation Update Interval work properly together. Animation update events were preventing accurate real delays from occuring.
* Run Menu time values properly updated when model first loaded

Change to Track Section Availability/Speed Scheduling We no longer have one individual schedule per section. Now an attribute reference dealing with Track Availability and Speed Restrictions can be associated with a Track Section in the new Section Details Option under Track in the Menu Bar. This enables references to be constructed by referring to table data, just like we do with Section Running Times. As per the previous schedule setting options, the attref value works as a percentage of SPEED, as follows:
Value State 0: section unavailable. 1..99: available but with decreasing speed slow down. 100: available, no restriction.

IF a constant of 100 is entered for the control, the section is always available, and it shows as <none>
The Section Times dialog is now the Section Details dialog:
You can now select a different item class without leaving the Dialog. Track Ordering is now performed in this Section Details dialog. The Edit Section Times/Edit Section Control button toggles selection of Section Time or Line Control editing when a line is selected.

RTF note editing improved * Right context menu now includes separate "Select" and "Edit" options.
* Left context menu (during edit) is same as selecting "Edit" from right context menu.
* Resize/drag bug fixed, does not forget position/size during editing.

* You can no longer to add "old" text note, these are becoming obsolete and will not be supported in future SV versions.

SV 4.09 10/09/97 SV 4.09 10/09/97
New Features
Multi Label List (in Edit menu)
New tuple operations:

Enhancements * Paint objects no longer move to front when clicked on, an explict menu option is added to do this.
* Save/load model names no longer converted to all uppercase.
* Flipped icon property now cloned to message items.

Bugfixes None

Multi Label List (in Edit menu) Multi Label List (in Edit menu) Multi label lists enable a number of label lists to be collected together into one cell/attribute value. They offer:
* memory efficient storage of multiple data elements in a single cell,
* ability to present contatenated strings (eg: in gantt label),
* powerful data move capability between multi labels and item tuples,
* another dimension in tables since data originally stored in several columns can now be packed into one, as long as it is discrete and has a label list associated with it.
Their disadvantage to current multiple columns:
* slower to process
* can only be decoded / encoded from an item tuple (you cannot directly address a component of a multi label as an attref)
* cannot import formatted multi labels yet
Multi labels work by packing the digits of a number of label list indicies together to form a number. This is automatically done, all the modeller has to do is nominate which label lists and how many digits each label list needs to represent all its possible index codes. Up to 6 digits are supported per label list. A total of 14 digits are available. Hence, its possible to have 14 single digit label lists combined together into a single cell (each single digit label list can hence have 10 states) For presentation, SV contatenates the label strings together. For each label list comprising the multi label, a formatting width limit can be specified as well as an additional "separator" character which may be a space, a character or left empty (no gap between labels)

New tuple operations: Decode MultiLabel To Tuple This takes the target attref (a label or multilabel) and places the label list indicies for each label list into an item attribute matching the name of the label list.

Set MultiLabel from Tuple This builds a multi label (into target). The target's label list type is examined and for each component label list, a value is fetched from an item attribute matching the name of the label list.

For these to work: * A given label list must only appear once in a multi label definition.
* Support for repeated label lists will be added later, the problem is that the multiple label lists will map to one item attribute without some extra detail (eg: location_1, location_2) added to them
* The format of the item attribute must be of the label list which it is named after. This is a "type check" to avoid accidently moving an index into a different label list's index range
* Clicking in a multi-label cell is supported for editing, importing of multi labels in a formatted manner is not.
* If a base label list (used in a multi label list) is edited (eg: indexes changed), the system will properly update all columns and attributes formatted using a multi label list that includes that label list.
* If the multi label list itself is edited (eg: label lists added, sizes changed), no attempt is made to retain value integrity of any columns and attributes formatted using that multi label list.



24/08/97 SV


24/08/97 BugFix Fixed bug in gantt y column display (was not getting name from correct column).



22/08/97 SV


Enhancements GANTT improvements * Label colour can be set for gantt, separately to bar colour.
* Gantt now shows column title next to bars instead of normal y value numbers.
* A given label is shown only once when a number of consecutive rows have the same value, using the space available to all of those rows.
* Bars extending off the right of the window are now drawn instead of missed. If the table ends with an "open" bar, it will now be drawn all the way to the right (maximum time).
* The initial scroller width (upon load) can be specified.



15/08/97 SV


'New Features
New dial display modes:
New graph mode: GANTT

Enhancements '* Auto-Run Features
* Inter-model copy/paste
* InterDyne Mode Changes
* Label list fill region option
* New Font Selections
* Only During Move routine option
* Right button implementation <still in progress)
* RTF Note Enhancements
* Table column menu change
* Table copy has changed
* Printing while paused now supported
* Can now duplicate and delete ranges of lines in the routine editor
* Iterations are interrupted after an error is reported rather than continuing with junk data
* Dialog editor now functional
* New Click action to toggle flow display
* In InterDyne mode, the "in place edit" option now takes effect to prevent editing
* During a model run the "constant during run" option also takes effect to prevent editing

Bug Fixes
* Table Row Index values of '0' were being treated as 1 and not reported as errors -
this has been fixed and may expose bugs in existing models.
* Condition detail dialog no longer can get hidden behind condition editor
* Reworked reporting of routine error line numbers - should always give line number now
* Unblocking bug fix
* Chart recorder line drawing reworked

Chart recorder line drawing reworked The Chart Recorder Line is now drawn without using an "XOR" pen so that it won’t disappear on some display drivers/printer drivers due to scaling For wrap around charts the grid will be erased at points of the old trace as it gets replaced by the new one - the grid gets refreshed as the chart wraps around. This doesn't pose a problem for scrolling charts

RTF Note Enhancements SV will now show an opening RTF note, as long as the following conditions are met:
* its called "main"
* a paint object exists on the top screen for that note
* a normal text note called main does NOT exist
In place edit for RTF note implemented, with this paint option on, user can click on note and edit its contents. To end the note edit, right click in the note and select "End Edit", or simply left click on the model background (outside of the note), or press Esc, and wait for the DB file to be updated. To collapse the note, CTRL-click in it

Inter-model copy/paste Model merge: (inter-model copy/paste) To avoid carrying over unwanted information, only "used" label lists will be merged in during a copy of a subsystem or object from one model to another.

InterDyne Mode Changes * The object cursor is not shown in interdyne mode, just the arrow
* The clock is now shown on model load, if it was visible when the model was saved
* Hot keys to flow/edit/interact mode are now disabled when in the Interdyne mode
* System reverts to object mode when switched to interdyne mode
* A new "Stopped" title/prompt appears in the window title area when in Interdyne/stopped mode

Auto-Run Features The Display Option "Run on Load" option has replaced with "Run on program start" With this option turned on, the model run will start automatically, as long as the system is in InterDyne (user) mode
The '/RUN' command line option causes SV to auto run all models loaded. This is useful when a model is also specified on the command line.

New graph mode: GANTT The Table/Mapper Graphical View now has a new graph overlay feature:
Y-Offset - enables a given overlay to be offset relative to the other lines in the overlay. This avoids having to build the offset by setting the cell data. This is important for new Gantt mode
New graph mode: GANTT Each column (overlay) is interpreted as one row in a Gantt chart. The row is determined by the new Y-Offset value. A cell's value no longer determines the y-position of the bar. Instead, it is printed inside the bar. If the column is label-formatted, the string is printed inside the bar. The bar is drawn only when there is a value greater than zero in the Cell. A value of 0 causes no bar to be drawn

New Font Selections Note Link Font: the font used for all note-links is [* note]
Graph Labels: the font used for all GANTT bar string contents

Label list fill region option The Label list Fill Region option available when editing label lists - will map indices between labels to the lower label. e.g. for the following Label List:
Label Index Foo 1 Bar 5 Nellie 10
For Attributes formatted to use this list, the following values will be mapped to labels as follows:
Value Label 1 Foo 2 Foo 3 Foo 4 Foo 5 Bar 6 Bar 7 Bar 8 Bar 9 Bar 10 Nellie 11 Nellie etc. Nellie

Table copy has changed Table copy has changed: When creating a new table, a "Paste" button will appear in the table name dialog if a table has just been copied. To copy a table select the Select All/Copy option in the Table button menu in the table editor. This enables a table to be copied to anywhere in the model with all formatting retained

Table column menu change "Title" is the title for the column
"Name" is the internal name (used in setting up tuple transfers) The "Labels" item appears when the column is being formatted via a label list and enables the list to be directly changed

Right button implementation <still in progress) Right button implementation <still in progress> Many context (edit) menus now appear immediately on the right mouse button including interact menu when still in flow mode. Left button allows in-place edit of all attribute, table and cell stats while in edit mode...

New dial display modes: New dial display modes: Image display, control knob and label list Dials associated with stats with 'in place edit' can now be interactively dragged/turned etc. If you use this feature, you have to ctrl-click on the Dial Image to manipulate it rather than move it TIP: if the original attribute's rounding option is set to "Round Units" (in the distribution pattern dialog for the attribute) then the dial will "snap" to integral values when dragged! You will find that you cannot take advantage of this feature with Table Cells, due to their being unable to have a rounding value set for them (individually).

Unblocking bug fix Switches which open on the default condition now work An optimisation in the code caused a bug in switches that used the following kind of condition checking method:
Cond 1 = 0 True if A = B (Blocks if True) Cond 1 = 0 True if C = D (Blocks if True) Default = 1 Opens the Switch
In this case, the switch could block even when the B or D values moved away from equivalence to the A or C values respectively, which results in falling thru to the default (open) condition.
Technical detail: Switches with a condition where an attribute must match a constant (att = v) invoke an optimisation which prevents them being unblocked (time consuming) unless the attribute they depend on becomes set to the value it is being matched against in the switch's condition. This failed to work properly where the switch was blocked on the condition being "true" and open on the condition being false. The unblock was not done on the the attribute *no longer being equal* to the test constant. Now an unblock is performed both when the test attribute becomes equal and not equal to the test value. The extra unblock message will slow model runs to some degree (but it will still be faster than unblocking all switches whenever the attribute changes. A benefit does arise however - since an unblock is sent when an attribute becomes != to the test value as well as when it becomes =, conditions testing for "attribute != value" can now also be optimised using this mechanism.

Only During Move routine option Only During Move routine option has now been adjusted. SimView traces through a flow at least twice when moving an item, once to determine its viability (including exploration of switch options) and once to actually move the item. When Only During Move routine option is set to "on", SimView only executes the routine when the item is actually moving through the change object, not when searching for viable paths. In previous versions, if a change object’s routine was not executed, then the model was considered "dirty", and a switch downstream of the change object that depended upon an attribute would produce and error message, due to uncertainty whether the attribute might be changed inthe dirty routine. Now when using the adjusted Only During Move routine option, the model is not considered dirty, and hence a switch downstream of the change object can now depend on an attribute.
*BUT* the modeller must remember that the routine is not invoked from the switches decision-making point of view, and in fact the Only During Move routine option MUST NOT change any attribute which would otherwise change any downstream switches decision.

SV 4.07 U and V SV 4.07 U and V 9/7/97 File Format 173 Sample Model: OBJ.MDL

New Features None

Enhancements * SVW should now handle long Model file names.
* Safe Look Ahead Options modified
* Table Editor: column menu is more descriptive
* Column menu new option: Copy Format

Bug Fixes * Printing works in SVW!
* SVW icon printing colours fixed
* Bitmap refresh when paused

Safe Look Ahead Options modified The "During Move" Run Option, which appears in the change object menu after you define a routine in a change object, has been enhanced. This option reduces the need to place objects infront of switches etc. merely to “work around” safe look-ahead protection. The default behaviour (Run Option “Always”) for a look-ahead has not changed. This will continue to protect new and inexperienced users. Whenever a routine manipulates multiple values (row, column, tuple, block), or performs a control calculation (IF, Loop etc.), the safe lookahead feature detects that the look ahead has lost integrity, and no downstream decisions, nor icon, trip or capacity assignments which refer to attributes are allowed. In this case SimView will complain, and stop the run. You need to separate these kinds of routines, and downstream decisions or capacity assignments by placing capacity between them. But now you can selectively by-pass the safe lookahead mechanism, by setting the "During Move" option, which appears in the change object menu after you define a routine in a change object. Previously this option functioned to prevent unnecessary CPU-intensive tasks being performed during a look ahead (i.e. large searches). To do this the During Move option flagged the remaining look-ahead as being “dirty”, and evaluated no further calculations. Hence the look ahead lost integrity.
The operation of the Change object “Run Option” now provides an additional useful mechanism. Now, with During Move selected, only this routine itself will not be evaluated during the look ahead step. All other routines in the thread (i.e. in other change objects between this one and the next capacity) are now evaluated. When this option is On, a routine will no longer cause an error if an attribute is referenced immediately downstream of the change object. Decisions and assignments based upon these calculations can now be made in the same look-ahead. This option reduces the need to place objects infront of switches etc. merely to “work around” this safe look-ahead protection.
IMPORTANT: You (the modeller) become responsible for ensuring that downstream objects don’t expect that change object's calculations to occur. You will need to ensure that the routine you wish to “isolate” from the look ahead contains no calculations you later rely on in the same look ahead. If you get this wrong, unexpected things will happen at switches and multiservers, and there is no way the system can debug this accurately for you. This change will not affect earlier models, since they will have been built under the strict rules.

Printing works in SVW! Second Time Lucky!! The Print dialog now appears, and you are able to print the screen when the model is not paused. If you try to print when the model is paused, you will get no print out, and unpredictable results.

SVW icon printing colours fixed Dithering of SV icons is now handled, when printing to B&W printers. Use the sample file OBJ.MDL to test your printer's handling of SVW objects.

Bitmap refresh when paused There was a bug where if you forced a screen redraw when the model was paused, the bitmap layer would not be refreshed. This is now fixed.

SVW should now handle long Model file names. Still undergoing testing with other kinds of file names, like images, dat files etc. Please report any difficulties to InterDynamics.
NOTE: This marks a further departure from the DOS version. The DOS version will load a model created in SVW with a long file name, however when saving, the BAK file only uses the 8 character name you see in the status bar.

Table Editor: column menu is more descriptive Table Editor: column menu is more descriptive

Column menu new option: Copy Format Enables the current column's formatting to be applied to a range of columns.

SV 4.07 S and T New File Format 176
New Features
Bug Fixes

New Features Printing
Track Loop Object Controls
Shared Routines in Track Loop Objects
Table title can be set separately to its name

Enhancements Portal state saved on save model
Screen resize options are now off by default.
Routine editor retains current line display when editing lists longer than the window "Windows" icon shown in multi-column lists no longer appears

Bug Fixes Two bug fixes:
The Shared Routine selection dialog is now wider, enabling the user to read the entire routine name.
Trip/attribute assignment titles no longer appear in menu list. This was causing crashes

Printing Printing in SVW is finally with us! You can print the current screen to a printer’s page, by selecting File/Print, from the menu bar. The image is rendered at the Print device’s resolution, and produces high-quality lines and images. Bitmap colours are dithered when printing in black and white. Icon Colours are rendered as either black and white, on a B&W printer, and look much better on a colour printer.

Track Loop Object Controls The release of items from Track Loop objects can now be controlled by the modeller, using a condition list gating mechanism. (Simlar to a multi-condition switch). There is one gate for each direction out of a loop. These are represented by the “Up Decis”, and “Dn Decis” Loop menu options. NB: The Up direction is aligned with the start and end points of the track object itself. Up is the same as Forward, which is a movement from the start point to the end point of the track, as indicated in the Track Object Menu. An item travelling along the Track object having begun from the start point, is travelling Forward, Up the track. Each Loop Decision Gate enables the modeller to overlay a higher level of decision making concerning item movement along tracks. There is a hierarchy of assessment in the Track Loop object. Consider a train Item moving Up the track: Prior to moving an item from the loop, the system assessesfirst the Up Gate, then the Up Decis, and finally applies the internal track movement logic rules. The modeller now has a sophisticated means of controlling the movement of trains. For example, three-way junctions, themselves containing more logic are now more conveniently set up and incorporated into a train network. Also, rules can be created, which will force an item with a clear track ahead to wait until a higher priority item elsewhere in the system moves past.

Shared Routines in Track Loop Objects Track Loop objects can now call and run shared routines whenever an item enters, or departs the Loop. The running of the shared routine ocurs regardless of the direction of movement, so you need to ensure that you include a direction identifier in your routine, if a different set of calculations is to be performed depending on the item’s direction. NB: A shared routine can be called by a loop object, but you cannot edit the shared routine via this loop reference. You will need to link the shared routine to a routine option in a change object, in order to edit the routine.

Table title can be set separately to its name Tables now have a title field, where you can enter a longer, more descriptive title for the table. Tables now have a title, and an internal Name. The internal name is referenced when doing table lookups, and the title is displayed in Views of the table.

Portal state saved on save model Current Portal states are now saved when you save a model. Thi smeans that the next time you load the model, the icons representing the portals will be the same as the ones displayed when you saved the model.

Screen resize options are now off by default. Screen resize is now always applied to current screen only. The Recurse/Panel/Dynamic options are now off by default and enable propogation of change to sub panels/sub systems.

Routine editor retains current line display when editing lists longer than the window The Calculation/routine list editor now returns you to the current line’s scroll position. This is convenient when editing a calculation list that has more lines in it than fit into the list window display area.

"Windows" icon shown in multi-column lists no longer appears A more appropriate icon will replace this eventually.

SV4.07R 16/6/97 File Format 173

BUGFIXES - Col 1, 2nd or 3rd Key sort Bug

- Col 1, 2nd or 3rd Key sort Bug Tables that were being sorted during runtime with column 1 selected as the 2nd or 3rd sort criteria resulted in inconsistent results in the second column. Now fixed.

SV4.07Q 10/6/97 File Format 173

NEW FEATURES - Basic Table Column Edit Protection
- Bulk Copy / Paste of Paint Objects
- Custom Column Backgrounds and Text

- Custom Column Backgrounds and Text Table column background and text colour can be specified, overriding the table's default. This new option is available in the column edit menu of the table edit dialog.

- Basic Table Column Edit Protection Table columns can now be protected from direct editing by the user. A new option 'Protect from Edits' is available in the column edit menu of the table edit dialog, under 'Options'. Once this option is selected for a column, cells in the column will be unresponsive to Mouse clicks or the Enter key, thus preventing the user from being able to directly edit the column. This is a useful option if you expect to have inexperienced users who may try to edit columns which are not intended for editing - e.g. calculated columns.
NB: This feature has Limitations! You can still force an edit on to a protected column using these advanced editing options:
a) holding the Shift Key while selecting one or more cells, then clicking in the selected area and choosing 'Cut' or Clear'. b) using the Ctrl Key when clicking on a cell, and then choosing 'Paste' or 'Fill/Index Down/Across'. c) Clicking on a Row heading and choosing ANY option except Copy. d) Shift-Clicking on a Column Title, and and choosing 'Cut' or Clear'.
All the above will be available to users who read manuals, and c) and d) will be available to the inexperienced user.

- Bulk Copy / Paste of Paint Objects You can now copy an entire paint layer, and choose to either merge or replace upon pasting into another dynamic screen or panel. The bulk copy option is available from the Paint View background menu 'Other Options' option, called 'Copy All Visible'. Having copied all visible objects, you would normally go to another screen, and then you select the Paste Object option. Upon doing this from the background menu, you will be prompted to choose whether to merge or replace the objects.
Merge Option The Merge option will leave all existing paint objects as they are, and paste in all of your copied objects. NB: 'Duplicate' objects are not identified as such in the merge. If you find any objects that are identical you might want to remove one of them.
Replace Option The Replace option will remove all existing paint objects in the screen and paste in all of your copied objects.

ENHANCEMENTS - Label List alphabetic sorting
- Label List Listings now continuously Sorted
- New Attribute, Table and Mapper Stat View Defaults

- Label List alphabetic sorting Label list item sorting during editing has been sped up. Previously, large Label lists took a long time to appear.

- Label List Listings now continuously Sorted The list of Label-lists is now kept sorted after cross-model merges and list renaming. Selecting a Label list and then Cancelling the selection will force a re-sort of the current list of lists.

- New Attribute, Table and Mapper Stat View Defaults Attribute and Object Stat, and Graph Stat displays have the following display defaults:
- Single Indent Border style,
- Black border colour,
- Light Gray Background colour,
- Bright Blue Text colour.
Table Stat Displays have the following display defaults:
- Single Indent Border style,
- Light Gray border colour,
- White Background colour,
- Dark Blue Text colour.

BUGFIXES - Cell Stat Row Zero reference

- Cell Stat Row Zero reference Selecting a Cell stat view in a panel resulted in a Cell Stat with a Row index of zero. Now fixed.

SV4.07P 3/06/97 File Format 172

NEW FEATURES - Export your Routine Calculation list to a text file.

- Export your Routine Calculation list to a text file. The Routine Editor now contains an 'Options' Button. The option enables you to export the entire Routine to a wide format text file for which you provide the filename.
Each export requires its own filename. The entire calculation is provided, including comments.
The full description is now also given when choosing Display/Show Model Info/Object Details, but without the comments fields.

ENHANCEMENTS - 'Control' statements are fully validated during model startup

- 'Control' statements are fully validated during model startup If/While/Select/Iterate must now all be matched by their corresponding 'End..." statements. This is checked at the beginning of a model run. In previous releases, this was not enforced, so some models may require slight adjustments to add the End statements. This is easily done by using the 'Show Object' button on the error message to move to the location of the object. A Case statement must not be placed between the "Default" case, and End Select lines.

IMPORTANT NOTICE - Cell Stats are no longer enabled if a table is variable length.

- Cell Stats are no longer enabled if a table is variable length. The use of cel stats on variable length tables has proved problematic, and the feature has been removed. Cell stats may still be applied to fixed length table cells. Upon loading an older model that contains cell stats on VLT's, SV will notify you, and its default action will be to remove all the cell stats connected to VLT's. If you would prefer to retain your cell stats by converting your VLT into a fixed length table, you will need to do this PRIOR to using this version.



31/05/97 (Not released) File Format 172


ENHANCEMENTS - Calculation Editing

- Calculation Editing Added "Insert New", which enables a new calculation line to be inserted into an existing set of lines. Reworked list editing (in DOS only) - focus now remains on the last-edited line, enabling further editing by pressing the Enter Key.

BUGFIXES - 'While' calculation not reporting a missing "attribute" reference
- Copy / Paste across models - Font Manager Error corrected
- Default in Case Statement is fixed and can now be used.
- Unexpected interruption of a run without animation.

- Copy / Paste across models - Font Manager Error corrected Copy Across Models was being prevented in many cases due to font management problems. The model merge (dos and win) code has been reworked, and font management under DOS improved.

- Default in Case Statement is fixed and can now be used. - Default in Case Statement is fixed and can now be used.

- 'While' calculation not reporting a missing "attribute" reference Has now been fixed.

- Unexpected interruption of a run without animation. On long model runs, with lots of searching, SV sometimes detected an extra keyboard presses or mouse click when checking for these, and paused the run, giving the 'Interrupted During search' message.

Now fixed.

SV4.07N 27/05/97 File Format 172
New Features

New Features - Embed a MDL file into a DB file (In Prototype).
- New control logic options in Change Object:
- New Database Admin option (EDIT->Database)

- New Database Admin option (EDIT->Database) This feature is for SVWin Only - DOS users still have to use the external utility F_Dbase.exe.
The formerly external utility for managing the contents of your DB file (images, notes and icons) has now been brought into the SVW interface, with added capabilities. Identification of the type of DB item (BMP Image, Text note, Icon) is provided to assist in identifying items to be exported or removed. You can import/export/delete database items as before, and you can now also merge database items from another database, with the following options:
- Review Copy List before proceeding Displays a list-picker dialog containing the contents of the chosen 'source' database file. This enables you to select those items you wish to merge into your current DB file. If this option is not checked, then the dialog does not appear, and all items from the 'source' DB file will be copied in to your current DB file.
- Copy Existing items only This option modifies the action of the merge, so that it becomes an 'update' action, rather than a full merge. With this option selected, the only items copied from the 'source' DB file will be those that are already present in your current DB file. Any items not currently in your DB file will not be imported. If this option is selected AND the Review option is also selected, then the List Picker dialog will display only those items that exist in both your current DB file and the 'source' DB file.
Either or both of these options may be selected, yielding four possibilities in use.
NB: Merging from a large DB file can take some time. Allow about 1 minute per MB before panicking.

- Embed a MDL file into a DB file (In Prototype). Sample Model: RUNMOD.MDL, and _HIROAD.DB
You can now embed a whole MDL file inside a SHARED DB file, using the enhanced features of the new database editor in SVW. This is in prototype only, but it is intended to evolve towards enabling a single DB file to be distributed, rather than an MDL and DB file. The sample file provided (_HIROAD.DB) contains its own MDL file emdedded into it. This model can be extracted using the command line option for launching a model. e.g. C:\SimView\SimViewW _HIROAD NB: _HIROAD is a shared DB file and hence must be located in the same directory as your SimView exe file.
You can therefore launch a Simview model that is contained in a shared library, from within a currently loaded Simview model. The MDL file itself need not be apparent, since SimView will find inside the shared DB file and automatically extract and load it. Once it has been extracted and loaded, you can place it onto the disk by saving it. Refer to the sample model RUNMOD.MDL for an example of this feature in action.

Accompanying notes: You can create a shared DB file by saving a model with a preceding underscore (e.g. _MYMOD.MDL). The _MYMOD.DB becomes a shared Library, when it is located in your SimView directory. Edit the Database for _MyMod.DB, and import a MDL file. This model can later be exported using the database editor, or launched using a command line, as described above. If you want to have icons and images for this model available, then the most efficient thing to do is to merge them into the shared DB file. (Notes are not available at this point in time).

- New control logic options in Change Object: Sample Models: GARBOT.MDL WHILEY.MDL

- IF / END IF Provides simple conditional execution of a calculation statement. You can 'nest' these if necessary. Be sure to include an 'End If' Line after the conditionally executed statement. This option is useful for user dialog prompts.

- SELECT/CASE/DEFAULT/END SELECT Provides complex conditional execution of a range of calculation statements. Can also be 'Nested'. Be sure to include an 'End Select' Line after your series of Case Statements. This option is also useful for delivering a variety of user dialog prompts.
KNOWN BUG: The Default statement is not yet working properly, so for the time being you need to use a specific Case line to define all possible default situations. This will be corrected in the next release.

- WHILE/ENDWHILE Enables arbitrary looping, basing the loop break-out on a condition rather than having a number set in an iteration. It enables a 'reverse' search/iteration capability, if you include a decrement calculation within the loop. This option is useful for user dialog prompts, the results of which can be evaluated within the loop, offering the capability to return the dialog to the user until various conditions are satisfied, before moving along to the next step in the model run. Be sure to include an 'End While' Line to set the end of your Loop.

ENHANCEMENTS - Model and DB file load time has been improved.

- Model and DB file load time has been improved. - Model and DB file load time has been improved.

KNOWN BUGS - Copy / Paste across models - Font Manager Error

- Copy / Paste across models - Font Manager Error Copying a Portal across models may cause a GPF on pasting, multiple pasting or saving after a paste, if the Source model contains an object which uses a font which is not included in the current machine. This may also occur if a default font assignment includes a font not on the current machine. Improvement in validation will correct this in the next release. (Copying across models is one of the most complex areas of the software).
The short term solution is to identify which object or default font assignment in the source model uses a font not resident on the current machine, and change to a resident font before doing the copy/paste procedure.

BUGFIXES - 'Attref Scan Count Inconsistent' message.
- Current Directory
- Shifting buttons during zoom

- 'Attref Scan Count Inconsistent' message. In Calculation editing, re-selecting a "function" mode such as Condition List or Search would not purge previous condition tests cleanly. This gave the "AttRef scan count inconsistent" message, which went away when SV was restarted.

- Shifting buttons during zoom Buttons sometimes shifted their positions on the screen after the screen was zoomed out. This was due to font scaling issues when zoomed out, and should now be fixed

- Current Directory If you browsed to load a model, and changed to another directory, then decided to cancel, the System decided the current directory was changed, and any bitmap image files being referenced lost their links, and an 'Unable to Load Image' message was posted. This is now corrected.

SV4.07M (Not released) SV4.07M (Not released)

SV4.07L 20/05/97 File Format 171
Bug Fixes
New Features

New Features - New Click Action for a Button or Paint Object.
- Time Functions

- Time Functions Newly added as calculations in the Change Object, Time Functions return a value reflecting the nature of a date value, like System Attributes can do. The returned value is applied to an Attribute. Functions available for any given Date (or Value): Time of Day (Seconds) Hour of Day (count from 0 to 23) Hour of Day+1 (count from 1 to 24) Day of Week (Sunday = 1 -> Sat = 7) (NB: If you are using relative time rather than calendar time, your model run always begins on a Sunday). Day of Month (Count 1 - 28,29,30,31 as reqd) Month of Year (count 1 - 12) Week of Year (count 1 - 53) (NB: First and Last week of the year may not be a full 7 days, since weeks are always counted from Sunday to Saturday).

- New Click Action for a Button or Paint Object. The System Command button option can invoke either DOS or Windows commands. This feature enables the user to execute a System command by clicking on a button. The model doesn't have to be running. With this feature, if the modeller can create a WinHelp file to accompany their InterDyne, then they can provide full context-sensitive help commands on any screen of the model. The user, upon clicking a "Help" button placed on the screen they are in, gets to see exactly what he/she needs to see in this WinHelp file. In other words, a help file can now be invoked from within SV at the click of a screen button, and can launch the Help file with a direction as to what Topic to open up on (context sensitivity). This is big news for those trying to provide step-by-step instructions in the InterDynes - now they can use a WinHelp file to supply the help data - either as a Help Topic in a Help file, or perhaps as a series of cue cards.

Enhancements - Optimised file copy (in database) for Windows
- Optimised SVW file reading (in loader)

- Optimised file copy (in database) for Windows DB files get updated *much* quicker.

- Optimised SVW file reading (in loader) models and tables will load quicker.

Bug Fixes - Fixed bug: bad table row/column with empty

- Fixed bug: bad table row/column with empty variable length table caused crash.



20/05/97 File Format 170

- KNOWN BUG: - Copy/Paste across models was causing problems.
If you try to use the status bar navigation feature

If you try to use the status bar navigation feature If you try to use the status bar navigation feature while a model is running (i.e. without first pausing the run) then you risk crashing SimView
- it will produce a linked list error.

- Copy/Paste across models was causing problems. The cause of this has now been found and corrected.



19/05/97 File Format 170

- BUGFIX: crash upon loading new model (font manager problem fixed)
crash upon stopping model run

crash upon stopping model run crash upon stopping model run <when using the background menu to stop while animating>

crash upon loading new model (font manager problem fixed)

Enhancements - Auto-Purging of Redundant Parameters and References
- Improved error reporting
- More Font Categories Added
- New Table column formatting option: round column value,

- More Font Categories Added Fonts can be chosen for graph legend and log viewer overview.

- Improved error reporting SV now reports the location for attribute referencing errors for attributes referenced in shared routines and dialogs.

- Auto-Purging of Redundant Parameters and References In support of the new run-start attribute reference integrity checking, the following features are now in place. Distribution pattern details now get purged for unused classes at servers / multiservers Setup/teardown delay details get cleared if a server's More Options option is turned off.

- New Table column formatting option: round column value, Once selected, a rounding value can be selected from the list.

A positive value rounds to decimal places, A negative value rounds to factors of 10.
The underlying value is retained as a full double-precision number.



changes - Version gap closed: 
New Features

New Features - Zoom in/out added, still under test but its improving.

- Zoom in/out added, still under test but its improving. Look for it under Window in the Menu Bar. Now works when in paused mode.

A window's scroll position is saved as you move between model screens and panels. Upon returning to a screen, it will be shown at the same scroll position as it was when you left it.

Enhancements - Attribute Reference Checking
- Delete portal bug:
- Item's track loop "stop" bit can now be read or set.
- Queue/Dispatcher Resource Problem in SVW
- Row delete validation added/fixed
- Table sorting:

- Row delete validation added/fixed - Row delete validation added/fixed

- Queue/Dispatcher Resource Problem in SVW The Queue/Dispatcher overflow count icon was using resources inefficiently in SVW, resulting in poor runtime performance of models with a large number of queues and or dispatchers. The overflow icon handling has been redesigned to avoid this and your models should work better now under SVW.

- Item's track loop "stop" bit can now be read or set. An Item's "stop" track control variable can be assigned/read If set, it forces train to stop at next loop until the next train through the loop crosses. This has limited workability at present, but further enhancements planned will be able to make use of this capability.

- Delete portal bug: (Was crashing on trying to save a model after deleting a portal) Now fixed. This occurred when the Portal being deleted was not informing panels owned by panels that it was being deleted. This would cause the model to lose integrity after a portal referenced by a panel owned by another panel was deleted.

- Table sorting: SV now defines a table as the target in a sort calculation and thus enables you to reference a table Column Label as a value to use in the sort. NB Currently this only applies to Ascending Sorts
- you will still need to use a Constant, Portal or Item attribute with a negative value to be able to do Descending sorts.

- Attribute Reference Checking Attribute References are checked at the beginning of a model run. Errors in portal attribute references are reported at this time. Prior to this version references were checked during the model run when the reference is actually used. Some models may now complain at run start if they contain references pointing to non-existent attributes - even if the particular reference was never made during previous runs.

- Version gap closed: This and future versions of SV will only read models with file versions > 150, this corresponds to SV 3.9V NB: This means that models saved in the last official release version of 3.8V will no longer load. You will need to use version


or earlier, back to Version 3.9V to "save-forward" your model.  If you do not have one of these versions, then InterDynamics will be happy to do the save-forward for you.



30/04/97 File Format 168
- Agents can pass items carried over to message Entry
- Enhancements

- Enhancements
- Agents can pass items carried over to message Entry
  • Agents can pass items carried over to message Entry (and back again).

    - Sample Model - DRWHO.mdl

The message item feature has been enhanced to enable an agent to pass across to its message-item agent, all items it may be carrying. These items can be delivered to an In Tray by the message-item agent, who then 'returns' empty-handed back to the original agent, who carries on with no items.
Similarly, a message-item agent can collect items, and upon its 'return', pass them across to the original agent who then sets off now carrying these items.
You could use this feature to carry around a batch of items, then pass them over to a central processing location, where they are unloaded into a Tray, processed at this location (item attributes changed etc.), then collected again by the message-item agent, and then passed back to the original agent.



29/04/97 File Format 168
New Features

New Features - Iteration in Change Object

- Iteration in Change Object
- Sample Model - MRMAGOO.mdl

In the 'Special' group of change object calculations you can now select 'Iterate'. This feature enables you do do iterations inside a change object, where previously you had to build a graphical loop in SV with paths, capacity and switches etc. You can have calculations in your change object prior to an iteration calculation - for use in initialising the loop variables, for example.
ALL calculations AFTER an iteration are included in the iteration loop. This means you currently cannot place calculations below an iteration calculation that are not intended to be a part of the iteration. In future there will be an 'End Loop' marker, enabling final calculations to be included in the same change object after the iteration is completed.
For an Iteration calculation you can set three variables, any of which can be attributes:
Index Using: This is the attribute whose value is indexed First Value: Starting value for the Index Attribute Last Value : Ending Value for the Index Attribute
The index step is ALWAYS a value of 1.
HINTS: You can adjust the current value of your index attribute during the progress of the iteration, to create a different index step. You can set your index attribute to a value that enables you to break out of your iteration loop when necessary. This enables conditional branching, but you still need to use switch objects to do this (as you do now anyway).



26/04/97 File Format 166

FOR ADVANCED TRAIN NETWORK MODELLING - New track type designation - 'Only Forward Traffic'

- New track type designation - 'Only Forward Traffic' To further support uni-directional traffic models, this option on a track object sets the track object to think of itself as only carrying traffic one way. The 'Forward' direction starts at the portal shown in the 'From' line of the track's menu. When SV looks for a track to use to send a train on its next trip step, it will only consider tracks which 'begin' from this portal. This includes Tracks that are bi-directional, (the default setup), and tracks set to 'Only forward traffic' who begin (the 'From' designation) at this Portal.
Behaviour in Lookaheads: An 'Only Forward' track will be ignored when the Track Logic does its lookahead through a portal, checking for ONCOMING traffic, (see previous version release note) and recognises that this track only moves traffic away from the portal. Loops placed in a track object with this option enabled will be used for overtaking if their capacity is > zero. Zero length loops will provide a 'signal point' where a train may wait until the next track section clears. (NB: Section running will still recognise these sections as separate, and require a time for each).
Special Behaviour: If you specify a trip in the opposite direction to this track's forward direction, and include one of its loop objects as a step in your trip, then SV will recognise that you wish to have a train move along this track in the opposite direction - thus enabling you to 'force' some bi-directional traffic flow over this track.

Use this option carefully - the fact that it is enabled is not indicated in the Track Object's main menu - you need to check under the 'Options' line in the track's menu. The fact that it is used should be noted in your model.



24/04/97 File Format 166

FOR ADVANCED TRAIN NETWORK MODELLING - New Advanced Track Logic Option in Portal - 'Oncoming Train Check'

- New Advanced Track Logic Option in Portal - 'Oncoming Train Check' This option is enabled by default. SV Track Lookahead Logic normally includes this option. You now have the choice to turn it off.

Background: When SV wants to move a train on to a track, it must first test further down the line, to ensure that no conflicts will arise that prevent the train being able to leave the track object at the other end. It is necessarily conservative. If the train in question is on a trip whose steps extend beyond the portal at the other end of our track, then SV will look at the next track object used in the next trip steps for any oncoming traffic. The assumption here is that if a train is on this next section moving toward the portal at the other end of our current track, then a deadlock is possible. SV will wait until the oncoming train is off its track before moving the current train on to our track. With the introduction of Multiple Portal entries and exits, we can now build 'one-way' tracks, which can be threaded through a series of portals. Generally, such tracks need not interact with any other independently-threaded tracks. Trains on such tracks are only expected to have their progress blocked due to a lack of capacity immediately ahead of them. Hence we often do not need to test for oncoming traffic. Disabling this feature now prevents this check for oncoming traffic (as if the trip ends at the next portal). Use this option carefully - it is embedded deeply in the portal's menu structure (like the other advanced options). The fact that it is used is not obvious, and should be noted.



21/04/97 File Format 166
- New Feature:

- New Feature: - New 'hidden' Calculation - for parallel port interface hacking
- New 'Special' Calculation - round to "n"
- New System Attribute: "Week Of Year"
A modeller can edit a zero width table directly

A modeller can edit a zero width table directly A modeller can edit a zero width table directly (just click on the cell). no need to expand the width, edit & return to zero. Reselecting units will still reset the column width.

- New System Attribute: "Week Of Year" Usage for RELATIVE time mode: gives # of weeks since start of run (like Week)

for CALENDAR (Absolute) time mode: gives week within current calendar year
NB: As far as the system is concerned, Weeks are always measured from Sunday to Saturday, no matter what day the year starts on. Hence for 1997, (1st of Jan was a Wednesday) week 1 will have 4 days, then Sunday (5th of Jan 1997) will be the beginning of week 2.

- New 'Special' Calculation - round to "n" if n is a positive value, SV rounds to n decimal places if n is a negative value, SV rounds to n multiples of 10
e.g. n=3 => 1.34567 becomes 1.346 n=0 => 1.34567 becomes 1 n=0 => 1.567 becomes 2
n=-3 => 1234.56 becomes 1000 n=-3 => 1678.56 becomes 2000

- New 'hidden' Calculation - for parallel port interface hacking NB: These are provided for hacking purposes only! The options appear only when the "calculation mode" menu is brought up with the control key held down, they are in the "special" sub-menu.
- 'Port Read and Port Write' - inp and outp routine calcs Both take a single parameter, being the port number, in decimal. For most PCs the parallel port is at 378h (hex) which translates to 888 in decimal (so the status and control registers are at 889,890) Port Read reads the current port register. It works also during lookahead, so a switch can depend on the port value. It does not unblock though, so if the port value changes, the model wont unblock an item. Port Write is a little strange, it actually writes the value in "target" (on the left of the =) to the given port. CAUTION! Be careful what port you write to... things can go screwy quite easily if you hit the wrong port. This should work under Win95 and DOS Sv. It will fail if you run SVW under WinNT. Only rudimentary testing has been done, so please report back to us immediately if it doesn't work.



2 18/04/97 File Format 166

Bugfixes fixed Insert Row bug

fixed Insert Row bug fixed Insert Row bug



18/04/97 File Format 166

FOR THE INTERDYNE USER: Runtime Table import now enables adding of labels to label lists, or assignation of aliases. This makes importing data files easier during run time.



11/04/97 21:16:33 File Format 166

Enhancements reworked field handling so in place edit fields can scroll for
reworked sorting of widgets in run time user-built dialogs
safe lookahead option always on (no longer in menu)

safe lookahead option always on (no longer in menu) This means that some older models may complain when run in this and later versions. Use the new runtime error dialog to flush out these situations. Use capacity between the change object and the following switch. Reason is that SV does not store results of Row or column operations (where many cell values are changed) for use in downstream evaluation. Basically, you need to "commit" these kinds of changes before making decisions with them.

reworked sorting of widgets in run time user-built dialogs Radio button group assignments were getting mixed up.

reworked field handling so in place edit fields can scroll for attribute/table cell/table edit

SV4.07 11/04/97 21:16:33 File Format 166
- New Features

- New Features - New Global Clear Contents Table Option

- VARIABLE LENGTH TABLES New options in a table enable the modeller to select a different kind of table behaviour. A Variable Length Table will grow (in Rows only), and shrink during the model run, if you insert or remove rows (and Tuples)
- Sample Model - VLT_01.mdl
- New Global Clear Contents Table Option

NB: VARIABLE vs FIXED LENGTH TABLE BEHAVIOURS In a Fixed Length (Standard) SV Table, the Bottom Row, or Rows, of the table is removed when an Insert Row or Insert Tuple calculation is performed. In a Variable Length Table, the Bottom Row of the table is not removed when an Insert Row or Insert Tuple calculation is performed, instead the table grows larger by the number of rows added.

In a Fixed Length (Standard) SV Table, the Bottom Row, or rows of the table is replaced when a Delete Row or Extract Tuple calculation is performed. In a Variable Length Table, the Bottom Row of the table is not removed when a Delete Row or Extract Tuple calculation is performed, however the table shrinks in size by the number of rows removed.

- New Global Clear Contents Table Option You can now choose a "Global" Table option to Clear All Contents of your Table at the start of a run. For Variable Length Tables, this means that your table will begin with NO ROWS in it at the start of a run. (SV will let you add a Row at index number 1 to begin the table off, and will not throw range errors at you).

- INSERT / DELETE ROW (Also came with Tuples)

TUPLE INTRODUCTION: A table in SV can be thought of as consisting of ROWS of data records. A Tuple is a group of attributes recorded in a table row. In SV, a Tuple comprises one or more attributes from a single table row. You can read, or extract Tuples, using Items, writing values INTO MATCHING Item Attributes. You can also write, or insert Tuples, using Items, writing values FROM MATCHING Item Attributes. SV automatically matches the appropriate Item Attribute and Table column. It matches the Column Label (NB: Not the Column Title) with the Item Attribute name. You do not need to know where a particular attribute appears in a table - i.e. what column it is in.

TUPLE CALCULATIONS The calculation list in the Change Object now has an extra category of options, called "Tuple". You can choose from the following:
Get Tuple - Read the Tuple Information on to the Item. (Write Cell Data into MATCHING Item Attributes)

Set Tuple - Write the Item Attribute Data into the Tuple. (Overwrites exsting MATCHING Tuple Data) (Non-matching cells are unchanged).

Extract - Read the Tuple Information on to the Item, (As in Get), and then delete the Row. (Non-matching cells' values will be lost).

Insert - Insert a Row into the table and Set the tuple using the MATCHING Item Attributes. (Non-matching cells are set to Zero).
E.G. You have a table with three columns, and their Column LABELS are:
Train No. Origin Destination
If you add three corresponding Item Attributes to an Item, then you can use the Tuple Operations to read and write data to this table. (NB: Doing this does not prevent you doing single-cell calcs) The advantage of this is that you need only one calculation line to set the values of three attributes. A neat thing with Tuples is that non-matching values are ignored by SV. Now, say you create a fourth column in your table, using the column label "Payload". This does not affect your existing calculations. SV simply ignores the existence of the fourth column when "Getting" or "Setting" a Tuple. Note that if you Delete a tuple, then the entire row will disappear, including non-matching Cells. Likewise when you Insert a tuple, the table cell for the fourth column will be set to Zero. (NB: NOT currently the table column's clear value).
If you then decide to include the fourth column's data in your existing tuple calculations, then you need only define a new Item Attribute called "Payload". This new attribute collects the fourth column's data. There is no need to edit any of the tuple calculations.
The obvious convenience here is in the initial structuring of a model. You can build up the data profiles carried in an Item conveniently, without incurring too much calculation list editing. You can also construct tables that will receive only selected Item Attributes into a row, in Tuple Operations. Thus you can pass information between tables readily, perhaps filtering the information, and re-ordering its sequence for a more convenient for screen display. You can use any available attribute to define the target row for a Tuple Operation. If your Row index value is out of range, you get the usual error messages. When you Insert a Tuple, the Targeted (Indexed) Row is moved DOWN, and the new Row is placed at the Target.

- INSERT / DELETE ROW (Also came with Tuples)

- INSERT / DELETE ROW (Also came with Tuples) The calculation list in the Change Object now has an extra options, in the "Table" category. You can choose from the following:
Insert Row - Insert one or more Rows into the Table. All cells in the Row will be set to Zero. (NOT currently the table column's clear value).

Delete Row - Delete one or more Rows from the Table.
You can use any available attribute to define the target row, and the number of rows to be Inserted or Deleted in the Operation. If your Row index value is out of range, you get the usual error messages. When you Insert a Row, the Targeted (Indexed) Row is moved DOWN by the number of Rows you specify,and the new Row or row set is placed at the Target. When you Delete a Row, the Targeted (Indexed) Row and the rows below it up to the number you specified is removed.



20:41 2/04/97 File Format 166

- NEW FEATURES - Ability to make a direct reference to an item of

- Ability to make a direct reference to an item of - Ability to make a direct reference to an item of a Label List in the Attribute Selection Dialog. The value taken for the item is its list index value. Benefit is to make your model's logic easier for others to follow. The sample model is a good example of this. (Previously we had to create a bunch of attributes in order to deliver this degree of traceability in the logic of a model). Sample Model - HighRoad.mdl Where is it? In the Attribute selection dialog, under the Type Button, there is now an additional option, called "Label". When you select this option, you can first of all choose a label list, and then you get to choose the specific label. Note that the new attribute type has the prefix "L:" Note also that in the "button" display for the attribute, the source label list is not mentioned. You can change the name of the Label List when it is referenced in this manner. If you change the text of the label item, this change is reflected in all of the locations where it is referenced. You will get a count of the number of times a specific Label item is referenced in attribute dialogs, when you check the Refs button. You cannot delete a label list that still had references made to it from parts of the model.



17:38 25/03/97 File Format 166 (covers 406e also)

- Connecting to Track Objects
- Limitations:
- Multiple Portal Entries and Exits

- Multiple Portal Entries and Exits
- Sample Models (These are pretty basic, and require further annotations, which will be done later). Multex01.mdl 406et01.mdl 406ex01.mdl MultiTrk.mdl Fortest.mdl Fortest2.mdl

- Multiple Portal Entries and Exits Enables the following: a) Direct control over incoming flows from specific objects located outside a Subsystem. b) Direct control over outgoing flows to specific objects located outside a Subsystem. c) An entirely new approach to handling item flows through a subsystem - you need no longer use switches and attributes to direct an item when its route through the subsystem depends upon the object from which it came into the subsystem. d) An entirely new approach to handling item flows out from a subsystem. You need no longer place switches and attributes immediately outside a Portal to direct an item when its route away from a Portal depends upon how it was processed inside the Subsystem. The "Switching" can now be done within the Portal, and the Portal Exit chosen determines the branch taken outside the Portal as the item leaves. e) Enables previously challenging (or impossible) train control logic, and capacity management issues to be handled cleanly. f) A far more congruent representation of incoming, outgoing and crossover schematics within subsystems. Multiple Portal Entries and Exits enable items to enter from the left, and depart to the right, and at the same time enter from the right and depart to the left, and enter from the top and depart to the bottom, and so on. This also makes logical constructs easier to build and follow.
You can now create as many alternate Portal Entry Objects, and Portal Exit Objects in a Subsystem as you wish. Choose the new option "Add Alternate Entry"/"Add Alternate Exit", and a new Entry/Exit is placed on the screen for you to use. Each can be assigned to be the link from, or link to, a specific object, outside the subsystem. When you assign an object to a Portal Entry, its name appears above the Portal Entry/Exit. A Portal Entry not specifically linked to an object (ie. linked to "Any") receives the items that are not directed to a specific Portal Entry. Only one Portal Entry should be set to "Any"... (this will be enforced in a later version). Portal Exits set to "Any" (i.e. no specific target object) will send items out of the subsystem along the first flow (lowest numbered path) or appropriate track leaving the Portal, as in previous SV versions. NB: Other Paths / Tracks are NOT taken, even if the lowest path is blocked.
- Connecting to Track Objects
- Limitations:
- Multiple Portal Entries and Exits

- NB: AUTOMATIC RENUMBERING ON PORTAL NAME CHANGE Each Portal Entry and Portal Exit can now be named independently. However if you rename the owning Portal (the Object containing this subsystem), then all of the Portal Entires and Exits are automatically renamed according to a special renaming/numbering system. All links to specific named objects are retained if you copy and paste the subsystem. This enables you to perform Ctrl-Pastes, without having to re-assign the Entries and Exits. If a specified object is not linked, or not present when the portal with multi entries is pasted, then the system will complain about: a) Being unable to form a link, when there is no object of that name present, or b) The absence of a link, (either Path or Track) where the object is present.

- Connecting to Track Objects
- Limitations:
- Multiple Portal Entries and Exits

- Connecting to Track Objects You can connect Portal Entries and Exits to Track Objects. To properly connect up a Track object and enable bi-directional travel, you need to assign both a Portal Entry, and a Portal Exit to it. This will enable two way flow. If your track is only uni-directional, then you need only assign an Entry or Exit, depending on the Track's direction. Note that if you connect a Portal Entry/Exit to a Double Track Object, then you will get traffic coming in from either of the two individual tracks, (Portal Entry) or departing on to either of the two individual tracks (Portal Exit). You may get more flexibility options by using two single tracks, rather than one double track - this will becme clearer with further testing.

- Connecting to Track Objects
- Limitations:
- Multiple Portal Entries and Exits

- Limitations: A link created between a Specific Object and a Specific Portal Entry applies to ALL ITEM CLASSES' with a path from the Object to the Portal. All items, regardless of Class, leaving the Specified Object and entering the Portal, will arrive at the Specified Portal Entry. As usual, you can have different paths for the different classes leaving the specified portal entry. A link created between a Specific Portal Exit and a Specific Object applies to ALL ITEM CLASSES' leading to this Portal Exit. All items, regardless of Class, passing through this Exit, will go to the Specified Object. The software doesn't complain if 2 Portal Entries are assigned to the same object. Only the earliest created (NOT earliest assigned to the object) Portal Entry will accept items. (2 exits can point to the same object - this makes sense). More validation will soon be added to prevent assigning multiple Portal Entries to the same object (or to <any> for that matter). The software currently provides no warnings if an object connected to the Portal is "left out" of the specifications, and there is no Portal Entry in the subsystem with the assignment of "Any". This object will simply become, and remain blocked. You cannot leave the earliest-created Portal Entry with an unconnected flow, even if all other Portal Entries are connected, and set to receive items from any object.
- Connecting to Track Objects
- Multiple Portal Entries and Exits

**** IMPORTANT!! Ctrl-Pasting of Subsystems assigned specific connections in a track network will probably give link warnings since the connections made are so specific to each subsystem, and a great deal of re-connection maintenance will be required if you think you will be making changes that you will have to replicate many times if the subsystem flow structure must change for some reason. Either use Ctrl-Paste only on single objects inside the subsystem, or build logic into Portals within the Portal linked into the network infrastructure, (if you think that flow editing may be required as the model progresses).

- Connecting to Track Objects
- Limitations:
- Multiple Portal Entries and Exits

ENHANCEMENTS - Beginnings of Password access to the Model.
- Enhanced Debugging Info on Runtime errors.

- Enhanced Debugging Info on Runtime errors. When a runtime error occurs, the user is given more information now.

Line 1 gives the Subsystem path, and Name Line 2 gives the Object name Line 3 gives the Item ID number Line 4 gives the Error Message Details
A "Show Location" button enables you to see the location of the object where the error was detected. Object will flash for 5 seconds. An "Inspect Item" button enables you to inspect the attributes of the item that was involved in the error, and determine which object it was in when the error was detected.

- Beginnings of Password access to the Model. (Under Author Info, but not operational yet.)



19/03/97 8:45:17 File Format 165
- New features

- New features - Capabilities:
- creation of remote message item.
- Dispatcher Object now has a new mode, called "Send Message".
- Limitations:

- creation of remote message item. Enables remote management of items in transit.

- Dispatcher Object now has a new mode, called "Send Message". Entry Object now has a new mode, called "Message Entry". When you set the Dispatcher to “Send Message” mode, you need to nominate an Entry from a list of available Message Entries. The Message Entry nominated need not be in the same subsystem. When an item enters this dispatcher, a "message" is sent to the nominated Entry, which then produces a "Message Item". This Message Item is identical to the original item except for its item ID. It contains all of the attributes and values of the original item in the dispatcher. The original item is held by the Dispatcher until the "Message Item" is taken out through an Exit object, whereupon the original item is then free to leave the Dispatcher. When the Message Item passes through the Exit, it passes back to the original item its characteristics, including Attributes, Trip details, Icon, and Class.
- Capabilities:
- creation of remote message item.

- Limitations:

- Capabilities: Many Dispatchers can call upon a single Message Entry. You can centrally/remotely manage changes to any or all of an an item's: Attributes Icon Trip details Class

- Dispatcher Object now has a new mode, called "Send Message".

- Limitations: You can not pass information back to the original item if you destroy the Message Item in an Assembler, Splitter. The original Item will be held in the Dispatcher forever if this happens.

- NB: You cannot allow a Message Entry to be blocked. (Model complains when this occurs).

- Capabilities:
- creation of remote message item.
- Dispatcher Object now has a new mode, called "Send Message".



New Features

BUGFIXES - Bug with log system and big disks (> 2GB free) should be fixed
- Track animation on blocked section bug fixed
- Track loop no longer "puts aside" train which has trip step at the loop
- Track naming conflicts fixed

- Track animation on blocked section bug fixed (used to get extraneous animation of the blocked item)

- Track loop no longer "puts aside" train which has trip step at the loop (so zero capacity should be honoured)

- Bug with log system and big disks (> 2GB free) should be fixed (but > 4G free may still be a problem - cant test either ;( )

- Track naming conflicts fixed - 2 or more tracks between the same 2 portals would get the same name which would cause problems when loading trip steps (eg: loops) specifically on one of the tracks.

New Features - Paint text/buttons - new option - to hide on interdyne flag.

- Paint text/buttons - new option - to hide on interdyne flag. A button with a click action attached to it can be set so it is seen only by a modeller. It is not then seen in InterDyne view.

Enhancements - Label list selection dialog also enables adding label alias
- The table column label now adopts its column title's name when the title is
- yes/no/cancel dialog - proper button labels for different contexts

- yes/no/cancel dialog - proper button labels for different contexts - yes/no/cancel dialog - proper button labels for different contexts

- The table column label now adopts its column title's name when the title is The table column label now adopts its column title's name when the title is first set, and thereafter (while they are identical) upon any edit of the title, the user is asked whether they wish the label to follow the title.

- Label list selection dialog also enables adding label alias


## note alot of changes this version, commit with care ### * The windows version of this release is built with full optimisation and co-processor inline code (it will still work w/o a coprocessor)

Enhancements - File loader number read rewritten

- File loader number read rewritten - got 18% reduction in load time - please report any load anomalies

BugFixes - button alignment code rewritten
- Double tracks display properly at any angle
- Fixed bug with search
- table column / overlay

- Fixed bug with search - it was causing an unblock during lookahead this caused a model to get "stuck" - the clock stopped advancing

- Track bends added A section can have one or more bends inserted into it. Bend points appear as + during edit. You can shift-click select them to drag them as a group.

- Double tracks display properly at any angle

- table column / overlay column selection in graph views now uses new scrolling list

- button alignment code rewritten (computes base line of buttons) let me know of any overlaps

SV 4.06 - Windows editor fixed for auto track build (updates properly after edit)
- default track sort mode is now manual
- section up/down time dialog has proper z-order (wont get hidden)
- win icon mover shows paths and names
- label list clear button
- export section running time can export directly into a label list, starting at a given index
- win line drawing fixed (chart horz pixels) - was not drawing to end of line
- bitmap handling/mask generation bugs fixed in icon editor (windows icon/bitmap handling consolidated a lot)
- "round/trunc/min/max" implemented for columns - you can round a complete column, also take min/max of column vs. a scalar
- zero width columns - display as just a box
- table edit fill across - will ignore any row label column encountered - nb not for index across yet
- money presentation - if a decimal isn't entered it isn't added
- windows missing clock problem (now positions at window corner by default)
- windows - smaller clock, supports drag, click on it for menu
- windows clipboard - can copy data into SV tables - either via FILE->IMPORT from clipboard or from cell "Paste from clipboard" options (these only appear in SVW if there is data in the clipboard)
- fixed "close window" bug from SV4.05 (could cause memory tag errors or lock ups when closing)



- Box clipping problems fixed for object exits
- Icon choose directory browsing now works
- Icon choose no longer retains last directory used, it starts at the model's library (unless going to icon edit)
- Graphics engine now supports "clear colour", so its available in the colour palette again
- Half-oval dials now drawn/filled
- MessageLine handling - start to give windows their own message line
- better screen redraw (reduce flicker) when repainting with a scroll offset
- Started log viewer cleanup



- Fixed winnt startup problems in SVW
- Track runtime popup menus avoid no-select text
- Track section name is now generated from adjacent stations (internal name can still be set but its become redundant)
- '"'s are now filtered in SVW
- Icon editor Load/Quit now works but it meant locking SVW's main window while the editor is running - it needs to become a separate app or DLL



- fixed icon draw problems for icons which were not a multiple of 4 pixels wide
- control-key shortcuts, mode change, run and save CTRL-O, CTRL-F, CTRL-I, CTRL-S, CTRL-P

- better name filter for exported section name
- stat double click handling (table views) fixed - to edit double click in the name area (at the top)
- stat clipping (copy/load) uses proper bounding box - should not move
- portals track their scroll position separately (not saved yet)
- "Trips" renamed to "Routes"
- wider calc description area in calc dialog
- Colour palette handling improved to handle multiple images better in 256 colour modes
- make sure images which use less colours are redrawn first (ie. in the background) If possible, try running in 16 bit colour mode, images look nicer
- Table write problems (DOS) - appears file sharing extensions broken for file write mode so they are avoided under DOS
- icon browser now has working scrollbars, text descriptions
- selecting the same icon for several states no longer loses images
- Icon mover cleanup, partially operational now under Win (needs bit more work Icon editor still flaky so be careful

SV 4.05 - Bugfix to writing of DAT files during model run

- Introduction of new Tuple handling features and new reference mechanism for tables. This will be further documented soon.

SV 4.04 - Bugfix to loading of models saved in 4.03

SV 4.03 - Paint object clipping for windows with bigger workspace now fixed
- Table import crash bug fixed - redraw happening at bad time
- Trip list sort by name button (Win version only) added
- Export of section names now exports the names of the bounding stations/loops
- Run time and edit table import file access uses sharing to avoid the brown warning dialog and its problems on some systems

SV 4.02 - Fixed table/mapper edit dialog size (so it fits on 640x480 displays)
- Continue background popup works in panels

- Added: Row operations (only in table view, not in table edit yet)

- Cut, Copy, Paste, Insert-Paste, Clear, Insert Row & Delete Row
- These work during edit and runtime without resizing the actual table
- Paste pastes whatever is in the copy paste buffer starting at the first column of the selected row [no keyboard short cuts yet]

- Shift click on a row or column selects it, if already selected it gets deselected, if something else is selected the selection is extended to include the row/column

- These are available in InterDyne mode as well

- Cell select menu now enables selection from current cell to end of table (Select To End)

- Selection click: Now support cut (copies data and clears) and Clear (sets cells to their clear value) as well as copy

- DOS wait box display fixed
- model stop bug with preinit for track stoppages and conveyor co-ords fixed
- Simulation continue background menu works in interdyne mode

SV 4.01 Mainly bug fixes

- Fixed scrollbar redrawing
- Removed flicker on resize
- Fixed grow window with scroll bars problems
- Fixed glitches in animate during scroll
- Maximise window problem fixed
- New "Palette" style for palettes & clock
- "Clock" title => "Time"
- rewrote scrollbar handling for new Win95 style scrollbars
- fixed redraw problems with fields & rtf when paused and scroll
- new notes can be added again, fixed note dialog in Win version
- Cleaned up icon-attribute lookup table dialog
- Reimplemented mouse cursor handling

SV 4.0 New Features:

New Features: "Fit to Area"
Interface Misc:
Screen Workspace Size

Screen Workspace Size Each dynamic and Panel screen can have a different workspace size

Theres an option in the Windows menu (as well as the screen properties popup) to change the size for the current screen and those within its scope (dynamic and / or panel) Resizing existing screens is possible, but shrinking a screen will squash the objects at the bottom, also large objects (eg. tables) may fall outside of the "canvas" area if a large work area is shrunk. Maximising the SV window centres the work area

"Fit to Area" A "Fit to Area" option in the menubar resizes the SV window to fit the canvas, as much as possible

Interface Misc:
- Background menu now has a "View" popup for changing mode without going to the menubar (in flow mode do a ctrl-click and use the object menu)
- Animation now continues when SV is put into background, use left click in window to pause (via menu), right click forces pause. If animating with time box, click in timebox to pause

- attref dialog has better item alignment, and has the correct Zorder so it doesn't get hidden under the dialog which created it
- wait cursors (for model load etc) are now shown
- a new "Inner" about box (no splash screen yet...)
- Calculation list editor rewritten to reduce flicker
- Many more object popups formatted more nicely (eg. PV objects, file access menu, interaction menus)

Tracks - Tracks Objects (spanning from portal to portal) are named automatically with names derived from the objects at each end. They will be renamed if the portal either end of them is renamed.

- Label update now works for attributes as well
- Routine warnings in 39X2 were extraneous and have been fixed
- scroller drag now works - but animation glitches badly if scrollers are dragged while items are actually animating
- Changes to mouse button "focus" handling, no longer process the click which activates SV (when its in the background)
- Attref scanning did not include mark object attrefs - could have caused some problems if tables were referenced at mark objects
- double click on clock now starts model in SV win (and fixes DOS preinit bugs I hope)

SV39X2 Changes Misc
Routines - Calculation List Enhancements

Routines - Calculation List Enhancements New Row/Column Calculations

New Row/Column Calculations
- Compute a value from a row or column of a table
Min,Max - give index of cell with min/max value
Sum,Sum of Squares, Average, StdDev - sllow summing etc. of row or column

- Can duplicate a calculation in a routine during edit

- Problems in routine instances fixed but still not much testing...

Misc - Attribute stats no longer clip -ve values to 0
- Track crew usage would cause crash at end of run - fixed
- Colour palette now displays the colours :)
- Keys work for graph viewer
- Path numbers now hide properly, using new drawing technique
- Portal animation for entering item handles track/non track properly (animation to edge or centre)
- Keys work for graph "browse"
- Menubar "Run Start Time" was broken in SV39X, now fixed
- Scale handling for graphs handles big fonts and clipping more nicely
- Many more Object menus formatting changes for Win, facility state/stoppage etc. Please report problems in either version

SV39X - Label import has more validation
- Table import enhancement
Clipboard (for the Win version)
Item Edit Box
Label Handling
Menu bar
RTF paint object (for the Win version)
Track Productivity Enhancements

Routines A "routine" is the new name for "Calculation List". Instead of being stored in a change object, a change object can reference a routine associated with a portal in its parent hierarchy. This means that modification of the routine will immediately be reflected in all change objects using it (assisting in maintenance).
To come: Routine "calling", parameter passing and *ITERATION*

Clipboard (for the Win version) Copied table data is put into the Windows clipboard when another application is brought to the foreground.

Label Handling - The "new index" algorithm now uses the index of the first "gap" in the index range
- The sort can reindex from 0 or 1 - it makes a guess at the right option which the user can override

** Label Alias Several names can be given to one label, to enable matching of varying forms of the same string during label import

** Target Update When the label list is modified (edited, sorted, imported), all targets using the label list (eg: table columns) are updated to reflect the change in the index values.

- Merging supported Changing the index of a label to the index of another label enables a merge of the two labels

- Table import enhancement When importing labels via a table import, an unknown label can be handled in 3 ways
- add it as a new label
- substitute an existing label for it (once only)
- add it as an alias of an existing label

- Label import has more validation - checks against the same label index being used twice
- Label import now can read just a list of names (on separate lines) which will then get indexed automatically (from 1)

Track Productivity Enhancements You can export a list of section names from the section running time dialog. This can be imported into a label list (using the "Names Only" option since no index values are written The change object "Trip assignment table" can be exported - the names and index values are written - which can be imported into a label list NB: It is intended that these linkages will become internal and automatic

Tables As well as fill down / fill across, index down / index across are available in the table editor (enabling increments to be applied down a column, for example) A Table "Select All/Copy" option in the "Table" button menu facilitates quick copy of the table Keys now work (in the Windows version) for the selected table

RTF paint object (for the Win version) Like a note but enables text with formatting (Rich Text) to be used. Text can be pasted to/from Word, Wordpad etc. using the edit control keys. NB: RTF notes appear as empty boxes under DOS

Menu bar The menu bar has been rearranged, particularly the "Edit" menu. More changes to come (including a button bar)

Item Edit Box The item edit box (top right corner) now lives in the status bar (at the bottom right of the screen) in both versions. This now clears the way for growing the workspace in later versions...

Misc "Safe Lookahead" option (on for new models) strictly checks that change objects before switches dont make changes that conflict with the lookahead system (eg: clear table or invoke a user dialog). This helps clears up strange behaviour in models which have a switch depending on a table cell value preceeded by a table-change object. Turn it on for older models and watch for warnings during its run

- Many dialogs improved/fixed in the Win version (eg: switch multi-condition)
- Comments on calculations and attributes can be added
- The Portal Entry/Exit borders are properly hidden when the Portal "Keep PEntry/PExit Hidden" option is on
- Windows now confirms save on quit of the program
- Choose Icon palette now enables selections, more robust
- display option to hold clock on end of run
- The dial "Y" scale can have a time-formatted axis
- The "Journal" options are removed for now.


  • Basic instructions on Scenarios:

Things to know about the current scenario implementation.. 1. The need to "initialise" the model now replaces the starting of the model, in preparation for editing by the InterDyne user (i.e. via the Edit Button). But there is effectively no difference between then and now.
2. You can only load or save a scenario while the model is in its pre-init (paused) state. Thus it is recommended that you save your scenario before beginning the actual run. NB: This may preclude the saving of output data into a scenario file.
3. Before point 2 will work, you need to choose the "pause after pre-init" option from the Display/Display Options list-picker dialog.
4. You also need to have the model automatically run upon being loaded. Again this is selected from the Display/Display Options list-picker dialog.
5. The model can automatically go into the pre-init paused state, but can do so only when it is loaded as a command line argument for Simview. e.g. Drag the MDL file on to the SimView.exe [or icon] in Explorer/File Manager. Alternatively, make a program item for the model file itself. If the model is loaded from the menu bar, this option does not activate.
6. During a run, and after a run is stopped, you will not be able to save your scenario - you will have to re-initialise the model in order to do so. NB: If output tables in your scenario are set to be cleared upon initialisation, their data will be lost. This may limit the ability of an existing model output table to work well in a scenario, and may require some rework of tables before output data can be preserved upon reinitialisation. A better solution will come if the ability to save a scenario at any stage is addressed.

Choose those tables you wish to have included into the scenario. Do the same for Portal and Model Attributes.
Choose an order for the information before selecting anything, because there is currently no means of re-ordering the scenario, other than removing an item and then re-selecting it to become the last on the list.
For each table (or attribute) : a) Open it for editing, b) Click on the table/attribute edit dialog's Options button, c) Select the option called "Include in Scenario".
This item will now be included into the scenario file.

To save a scenario file, first initialise the model, by starting a run. Then when the model has initialised, the "Save Scenario" and "Load Scenario" options will now be available from the File menu. Select the Save Scenario option, enter a file name, and a scenario file will be written to the disk. This file has a .SCN extension. It is a text file, and can be read by a word processor or spreadsheet.
Once created, a Scenario file may be reloaded in the per-init/paused state.
If you alter your model scenario, say by including another table or attribute, and you then try to reload an earlier scenario file, SV will warn you that the format is different, and then load what it can from the file.

Do not continue a run after the Pre-init pause by double-clicking the clock... The screen will go blank, and not recover, necessitating a 3 finger salute.
Do not stop a run that is in the pre-init pause state, as the system will also hang, requiring abandonment of the session.
See further notes on scenarios below.
New Features since SV39V5

  • Scenarios (still incomplete)

Tables and portal attributes can tagged as "included in scenario" then they collectively can be saved/loaded in the model pre-init pause state
Scenario files contain subsystem names so files are interchangeable as long as the portal hierarchy leading to the object saved is the same

  • Preinit state (option in display options)

SV "pauses" after initialisation of attributes and tables is complete (objects haven't been primed/initialised yet)
Scenarios can be loaded/saved in this state

  • Graph views now support minor axis grids
  • major grid lines are now thicker so minor grid lines are obvious
  • y axis grid spacing can be specified
  • Table Graph Views handle mouse clicks:
  • drag in graph to view points
  • let go near point to show point co-ord and overlay number
  • use left/right to select prev/next point, up/down to select overlay
  • can drag within graph to select another point
  • click outside of graph, <ESC> or press right button to leave mode
  • "Clear" operation applies clear value to table/row/col/cell/attribute setting it to its "Clear" value as defined in edit. For item attributes they are set to the value '0'

Misc bug fixes:

  • attribute link copy: attribute stats rebind to new attributes on copy
  • text alignment/grid snap in paint problem fixed
  • cell stats can now be added to panels
  • click action Save As can no longer be invoked while paused.
  • added Log Start Time click action
  • click action Run Start Time can no longer be invoked while paused.
  • after modifying table cell via edit unblocks work properly
  • menubar Model Attributes->Add adds to current window, not top screen
  • warning given if Show Dialog attepted when not running
  • Facility stoppage dist timer handling fixed (it was drawing a random number on each test of the stoppage parameter rather than drawing one value and waiting for it to be matched)

SV39W Release notes
New Features since SV39V5

  • Scenarios (still incomplete)

Tables and portal attributes can tagged as "included in scenario" then they collectively can be saved/loaded in the model pre-init pause state
Scenario files contain subsystem names so files are interchangeable as long as the portal hierarchy leading to the object saved is the same

  • Preinit state (option in display options)

SV "pauses" after initialisation of attributes and tables is complete (objects haven't been primed/initialised yet)
Scenarios can be loaded/saved in this state

  • Graph views now support minor axis grids
  • major grid lines are now thicker so minor grid lines are obvious
  • y axis grid spacing can be specified
  • Table Graph Views handle mouse clicks:
  • drag in graph to view points
  • let go near point to show point co-ord and overlay number
  • use left/right to select prev/next point, up/down to select overlay
  • can drag within graph to select another point
  • click outside of graph, <ESC> or press right button to leave mode
  • "Clear" operation applies clear value to table/row/col/cell/attribute setting it to its "Clear" value as defined in edit. For item attributes they are set to the value '0'

Misc bug fixes:

  • attribute link copy: attribute stats rebind to new attributes on copy
  • text alignment/grid snap in paint problem fixed
  • cell stats can now be added to panels
  • click action Save As can no longer be invoked while paused.
  • added Log Start Time click action
  • click action Run Start Time can no longer be invoked while paused.
  • after modifying table cell via edit unblocks work properly
  • menubar Model Attributes->Add adds to current window, not top screen
  • warning given if Show Dialog attepted when not running
  • Facility stoppage dist timer handling fixed (it was drawing a random number on each test of the stoppage parameter rather than drawing one value and waiting for it to be matched)

SV39V5 Changes
Fixed user "Dialog" bug when using item attributes
SV39V4 Changes
Table Importing during model run --------------------------------
Importing a table during model run (via the Change Object->File option) has been enhanced to support the following:

  • Tables can be imported from formatted data. The format of the column being imported into must match the format of the data from the column being read into it. Calendar times and labels are handled, labels must be already defined (new ones can not be automatically added unlike in edit mode).
  • As well as importing into "Table", a "Row", "Column" or "Block" target can be used as the destination into which data is read. "Block" enables definition of the top left corner of a rectangular table block into which data will be read, whereas "Table" starts at Row 1 Column 1.
  • An offset row/column into the source table (the file) can be specified, defining the top-left corner of a rectangular table block from which data is read.
  • A limit on the number of rows and columns to be read can be specified, without a limit SV attempts to fill to the last row/column (if the target is table or block), to the last row (if the target is a column) or to the last column (if the target is a row).
  • The source table file can have more columns (and rows) than the region which will be read given the offset, limit and target as described above.

The last 4 points mean that an arbitrary sized rectangular block can be read from a large table file.
SV39V2 Changes (from SV39T6)
1. Tables

  • The label name import filter can now handle "'s appearing in label names when deriving label lists from a table
  • Only the first 30 characters of a label name are retained
  • The "File" sub menu in the Label List editor has a "Sort" option which sorts the labels, removes duplicates and numbers them from 1
  • Its now possible to have the row label column (ie. Column 0) derived from dynamic data in the table.

In the table editor, the [TABLE] button menu has a new option "Row Label Source" which enables a column containing the row label names to be nominated.
Its a good idea to make this column the last column in the table

  • The table "Keep Simulation Values" option is on by default
  • The Table View option "In Place Edit" is now implemented. With it off, tables can be browsed/scrolled but the values can not be changed

2. Performance View => Panels
Performance View screens are now called PANELS. Some key enhancements have been made to enable them to be grouped, managed and copied much more effectively:

  • Every panel has an owner, which may be another panel or a dynamic model screen or subsystem. Ownership loops are not allowed. Thus every panel has a dynamic screen at the top of its "ancestry" tree.
  • A given dynamic screen or panel can own many panels
  • Newly added panels get the current screen as the default owner,
  • The owner of a panel can easily be changed. Any panels owned by a panel stay with that panel when its owner is changed.
  • Copying a dynamic screen (ie. copying the portal for a subsystem) will completely copy all owned panels as well, for all subsystems in the copy.
  • Copied screen-change buttons and table views will be updated to "point" to the copied version of the object they were associated with - if it was also involved in the copy. Otherwise the copies remain associated with the original object.

The panel arrangement is flexible, enabling panels to be collected together in different ways:
Example 1: Stringing panels in series
[Dynamic]--->[Panel 1]--->[Panel 2]--->[Panel 3]
Here the subsystem "Dynamic" owns Panel 1, which in turn owns Panel 2 etc. This would be a good structure to use where the user works in a way which steps along the panels.
Example 2: A group of panels
[Dynamic]--->[Panel 1] --->[Panel 2] --->[Panel 3]-->[Panel 4]
Here, panels 1,2,3 are owned by the subsystem Dynamic Panel 3 also owns Panel 4 This would be a good structure where the panels are related but not accessed in any particular order
NOTE: These structures are intended to help the modeller organise their panels into logical collections. In example 1, when you shift "Panel 1" it will "carry" with it its child panels, which can minimise work when reusing panel structures.
The structure used does not currently alter what each panel is able to access.
A later version will have button types for "Next Panel" and "Previous Panel" which will follow the owner/child panel links without requiring specific "pointing" to a given panel.
3. "Screen List" in status bar and Edit Background Menu changes
The "Performance View" section of the subsystem navigation list now lists Panels in a structured way, indented to indicate ownership much like dynamic screens are. The first panel for a given panel "tree", owned by a dynamic screen, is annotated with the dynamic screen's name.
The editing background menu (object mode) has been consolidated to support working with panels more effectively. For any screen, the background menu allows:

  • adding a new panel (which will be owned by the current screen)
  • navigating directly if there is a single owned panel
  • navigating (via list selection) if more than one panel is owned
  • navigating to the owner panel (or dynamic screen) if the current view is a panel
  • navigating to the owning portal screen if the current view is a dynamic screen

In addition to listing attribute,table and mapper counts, the portal object menu now also shows the number of panels owned by the portal's subsystem.
Misc Fixes / Changes:

  • Dialogs can now reference attributes from an arbitrary dynamic screen - ie. they now can be used on a "Panel" screen.
  • "Table Stats" are gradually being renamed "Table Views"
  • new "Run At Start" model option - will run the model when SV is started with the model on the command line
  • 4 conditions are now supported in the multi condition list
  • Extra button actions added (Log View, Save As)
  • New Key lock system requires key file to run SV, eanbles "Edit" and "Run" access levels
  • Fixed crash bug when an item re-visited a change object in the same epoch (ie. in a zero capacity loop) - this is now trapped
  • More specialised options in the portal object menu have been moved to a sub-menu
      • Important notes for SV39T6: ***

This version has seen more internal rewrite and consolidation, so please be careful migrating to it. The file format is different to T5.
In particular note the following:

  • In user mode (hidden menus)
  • you can only interact with tables and attribute stats (in place edit) when system is paused (not stopped).
  • Change to graphs:

A graph can have its scales fixed to constant points.
In the graph "Stat" menu, Parameters enables min/max x and y scale ranges to be fixed - these will only be retained if the options->Auto X Scale/Auto Y Scale are turned off first.
All graphs in older models will have the auto x scale/auto y scale option turned on, to avoid update problems with older models. This slows graph redraw down, so use a fixed scale if possible for x and/or y
Using a fixed scale for an axis which is in absolute time will probably not work yet. Let me know.

  • Font management

Once fonts were edited under windows, DOS runs of the model became ugly.
This has been addressed by tracking DOS and Windows font information separately. Initially, the DOS Text (Button) font will be guessed, which is of consequence when a Windows-saved version of a model is loaded under DOS, particularly if many font changes were made to the default font classes whilst under Windows.
Your buttons may look ugly under DOS if you did alot to the model under Windows, but fixing them should only be a one time operation. If its real bad, let me know and I'll code a once off special case for you, so you can migrate your model over.

  • Stat Copy handling

It is possible to create a cell, graph or table view in a dynamic screen well below the the screen its table is defined in. This would cause a crash when copying the portal containing the stat, this has been fixed by rewriting the way stat copy is handled. The code change was not trivial.

      • Important Reminder ***

Please report all System Errors Code messages and "Program Error Intercepted" warnings you encounter, they are abnormal and should never arise. In the latter, the only numbers I need to know are EIP/ESP:


  • graph X scale grid can be shown, hidden, x scale grid interval can be set (but its not saved yet)
  • label selection list sorted (when selecting label, not editing list)
  • double click handling consolidated to some degree (for win) Should avoid phantom double clicks problem
  • clock drawn properly in DOS if win font changed
  • Implemented dialog as a change object calc (target set to button code on exit, 1 = OK, 0 means a cancel occured and other attributes were not changed)
  • default object name font not bold under Win
  • attribute clear at start option
  • as for table, can set clear value of attribute
  • In place edit for attribute stats (during simu pause only) Option on attribute stat
  • loop delay implementation
  • set on screen by screen basis but is attref based so individual item can have different delays
  • delay is applied for entering and leaving items which are forced to wait at the loop
  • during the delay the item occupies occupancy on both the track and the loop
  • delay is not applied for entering item which has a trip step at the loop (is anyone using this)
  • Enhanced paused-click on loop shows items occupying it, a 'D' before the name indicates item is under loop delay (and it will appear on the pause-click menu for the track from which it is entering/on which it is leaving

Bug fixes

  • database dialog fixed for icon save
  • not scanning attribute properly for dialog items - gave Scan Count error
  • stat box width retained on copy/paste
  • BMP in DB should now work

SV39S Release 9
This includes both a Win32 and DOS build
Recent Dial enhancements

  • separate x and y axis
  • scroll mode (scrolls display)
  • absolute times display in x axis when in scroll mode and absolute time in use
  • min update interval can be set
  • join points option implemented properly on update (needs to be on to get solid line)

Area graph mode for tables

  • under dos may cause GPF (get me a model which does this!)

Attribute (value, table cell) Stat width and justification can be changed
Clear at start/retain simul values options are set on a column by column basis
Added "User Can Sort" table option which, if set, allows the user to sort the table when the model is paused, by clicking in its title area
Row insert/delete during paused mode (nb: doesn't resize table, just shifts data)
FEC debug window (display menu) shows pending events during simulation paused mode
Sped up table & attribute name lookup (binary list used)
Sped up switch unblocking code

  • a reference to a table cell (eg: at a switch) where the table column is "Constant During Run" will only get unblocked when that particular table column is altered


  • Use a constant attribute for the column index (at the switch)
  • Store multiple switch dependencies in different columns, not down one column

to benefit from this speedup
Binary search option added to the search dialog

  • this can speed up searches in sorted tables significantly, but requires that the data is sorted, each search element is for equality and that multiple search elements are combined using AND.

Entry can be triggered from a signal (from assembler pull or timetable)

  • supports trip assign & latency

Optimisation option to change object implemented - can specify that a "Routine" (notice the new naming) is only implemented when item moves, not during search. This speeds up lookahead but means you cant have a switch downstream to the change object without intervening capacity.
Enhanced database management

  • BMP/PCX images placed in the model's DB file will be located and loaded (the ability to do this is not integrated into SV yet, you need F_DBASE)

Enhanced dialogs - can reference any attribute in a dialog anywhere. => warning: be disciplined using this!
Added file name track option in model info

  • displays the name of all data files accessed via change objects and images (via paint objects) used in the model

SV39R, R1, R2

  • fixed bug when simulation time < clock reported (at best would print bad second time, at worst would crash when error detected)
  • current linear search speed up (no re-evaluating second condition as iterating)
  • sped up processing of multi-conditional AND (second/third expressions not computed if the combining operation is AND and the previous result is false.
  • Table block insert/delete operations implemented
  • Fixes to table/mapper display bugs with x scale in absolute time mode
  • Many font changes due to Windows work

(Eg. table/stat titles)
SV39Q3 changes:

  • EXE return result code handling:

0 : no system error (doesn't mean model didn't stop with error)
1 : error processing command line, load file bad, script name bad
2 : error processing script
3 : user hit escape during run (for demo/animate mode)

  • Fixed abs time '-' handling bug (conversion from edit to run)
  • Table write row

SV39Q changes:
-=-=-=-=-=- | WARNING | Check results and data integrity carefully with this version, =-=-=-=-=-= The changes to the time handling were not trivial.
In particular, look out for absolute times which differ between run and stopped state. I've covered Tables and Attributes, anywhere else where an Abs Time is entered which I've missed???
Also, re-verify edit time sorting is OK
Needless to say, this version uses a NEW FILE FORMAT [139] so retain previous model versions.

  • Absolute Time handling enhancements
  • Once system is in absolute time mode, the Run Absolute Time can be set separately to the Edit Absolute Time reference.
  • the Edit Absolute Time should be left at 1-jan-1970 for new models, there is no need to change it now. Eventually, I might hide it altogether.
  • Table columns and attributes in absolute time mode will retain their integrity if the Run Absolute Time is changed. This is because they are internally stored as offsets from the Edit Absolute Time and automatically translated to the Run Absolute Time reference when the model is run. Retain Values does the reverse translation (if on).
  • Do not export Absolute Time Attributes/Table Columns as seconds, otherwise you create a dependency on the current edit/run absolute time.

Instead, always Export/Import as a formatted time. Then, upon import, they will be properly translated to the current time frame. This is particularly important for exports/imports during a run, since the run time frame is now free to change.

  • Dire Warnings are given when the Edit Absolute Time reference is changed.
  • Work still needed to use abs time notation in schedules, entry arrivals etc.
  • Animate Start / Run Stop time are now specified in Absolute Time, with '-' as the default/0 case.

[NOTE: word Absolute to be changed to Calendar soon]

  • Reworked Table Sort (edit sort) so it can be applied during a run
  • does not sort labels when model is paused
  • edit-sort (no run) has been modified to use much less memory
  • test and report and strange error messages please
  • Portal has new option - "Retain State" which causes portal to remember state it was in when model is stopped. This is so model can be inspected after a run. State is *NOT* retained when the model is saved/reloaded.
  • The "states" option in portals no longer needs the ctrl-click

Renaming states now works!
(?surprised no one pointed this out before)
SV39P changes:

  • ctrl-paste of object now enables a name to be specified. Any object within the sub-hierarchy matching the name entered and type of the copied object is replaced. '*' and '?' can be used as wildcards.
  • Added attribute option "Retained On Paste/Replace" attribute option. Attributes tagged with this option will be retained for the top level subsystem of a replaced portal, during a ctrl-paste. The target attribute will have the "Retained On Paste/Replace" option enabled, if it was not already. If the target portal does not contain an attribute that the original portal had, it gets ignored.
  • event timer rewritten - supports events switching scrn to PV screen
  • Exit message handling re-implemented - allows combination of msgs, screen changes, pauses etc. events.
  • Start time specification for run appears in abs time mode if abs time mode is selected.
  • A DOS command can be executed as part of a file access operation. For file reads, the command is executed before the file is read, for writes it is performed after the file is written. This enables sub-models to be invoked.
  • "Clear value" for table columns can now be specified column by column. For absolute time columns, a abs time can be used or '-' which means the "infinite" time... a very large number which will be put last in a sort. "Zero Contents At Start" changed to "Clear Contents At Start"

NB: This version has been built with full optimisation
CTRL-Paste object merge (works for portals too) enabling merge/replace of objects, including entire sub-systems
Bug fixes for track-pv links and trip deletion
DIALOGs added as a button action, enabling attributes to be input by the user