ReleaseNotes:Planimate 5.x Release Notes

From Planimate Knowledge Base
Jump to navigation Jump to search


  • NEW Using anti-aliased line drawing in:
    - graph lines (column overlay, log driven, train graph, gantt)
    - flow editor lines
    - track/spatial link lines
  • NEW Log Driven Graph views have a new Graph Option "Overlay Starts At 0 Not 1".
    When set, the graph view expects overlay numbering to be 0,1,2,3... instead of 1,2,3.4...
  • FIX Update routine editor menu when attributes are pasted along with lines


  • NEW Table import/export dialog have new "Comma Separated" option which reads/writes in CSV format
  • CHANGE Recent rework caused models not to be interruptable with the keyboard during animation of an item on a flow line (0 time animation). This was a side effect of using a filter to prevent undesirable events being processed as an item is animating.
    The ESCAPE key can now be used to interrupt an animating item in this situation.
  • CHANGE Removed the model building tutorial from the help menu. This will be migrated to the wiki.
  • CHANGE The more heavily wiki-text formatted options in the help menu only appear in "advanced editing" mode.
    (the text these generate is used to update the online Planimate wiki).


  • FIX s.KeyTime was not accounting for correct time offset


  • NEW System attributes

s.PBA returns non zero if running as a PBA s.KeyDate creation time for active keyfile. Useful for externally keyed PBA s.KeySerial serial # for active keyfile s.KeyName string attribute returns keyfile user name s.KeyOrg string attribute returns keyfile organisation

  • NEW Planimate about box (edit and PBA) updated


  • FIX Cleanups to RemovePortal() (track/link/pipe instances)
  • FIX The LoadModel() routine operation now sets the stop reason to "Platform Required". This is important for models that process the s.LastRunStopReason system attribute as the model is sent the model closing broadcast in a restart just before it is unloaded. It was previously setting an error stop reason which caused models which sense this to report an error before the reload.
  • CHANGE The "_Panel Repainted" broadcast has been improved.
    The broacast is no longer automatically sent. The modeller must enable it using s.EnableRepaintBC=1 This is an auto-resetting system attribute so the next panel shown (ForceRepaintPanel, ForceRepaint or switching to panel or opening popup) must be the one you want the receive the broadcast for.
    PL now does the first repaint of a model at run start just before sending the model loaded and run start broadcasts but after sending the preinit broadcasts.

  • CHANGE The _panelrepainted broadcast is now sent with properties to process silently.
  • NEW loadpl 2.2 released, now support cross-thread load/reload of model and passing optional s.LoadDataFilePath setting.
    Internal cleanups: load/load complete signal, PL_LoadModel API, various renames for code clarity. (Background Broadcasts now Silent Broadcasts)


  • NEW Broadcast "_TrainTailExit" is sent to a location on a track network when the tail of a train has just cleared a road leading to that location. It includes attributes _id, _section and _road.

  • NEW Broadcast "_TrainTailExitSrv" is sent to a location on a track network when the tail of a train has just cleared a multiserver inside the location. It includes attributes _id and _object. Note that _object may be zero if the multi-server does not a model object label, this may be OK if the location knows the multiserver the item is in by other means.
    Note that unlike for roads, no mechanisms keep a hold on a multi-server when it is occupied by a train tail. The modeller must arrange for this if required.
  • FIX Fix handling of multiservers and train length


  • REMOVE Removed the configuration and saving of DataSet1 (old scenario files). The editing and menu options are removed.
    The Label List _Model_DataSets is no longer present in PL.
    Older models will not load if they still reference this label list. They should have references removed in a previous version of PL.
    LoadDataSet continues to be supported for the time being.
  • NEW Gantt Views can now log the co-ordinates of the blocks visible to the table that drives them.
    This is achieved by setting the "Co-ord Start Column" (basic text, not a reference) to the name of the column where the co-ordinate data starts. The data is written as as 4 columns from this column in panel co-ordinates as left-x, bottom-y, right-x and top-y.
    The co-ordinates for a completed block are placed in the row which starts the block. The 4 points on other rows are set to -1.
    If the start column name doesn't match any columns or there are not enough columns, the name is ignored.
    The co-ordinates are only set on "redraw" of the gantt view, not as data is added.
    Note that the table is updated without redraw as its not intended that the end user see the co-ordinates. Do not expect to see changed co-ordinates without an explicit redraw of the table view.
  • NEW s.LoadFileNamePath can now be set using a $= operation. This will be useful when a PBA restarts itself, enabling it to signal to itself a different dataset to load.
  • NEW Table Driven (Index) mode entries have the option to cycle around instead of stopping when they reach the end of the table.
    This is enabled with the "Repeat Last Interval and Cycle Around" option.
    To avoid the final event and first event occuring at the same time, the time interval between the second-to-last and last event in the table is repeated before the cycle-around occurs. Hence this option makes most sense when the events in the table are at a fixed period and the first event occurs at time 0.
    An example where this is useful is in an hourly profile where the table contains 24 rows with times 0:00, 1:00, 2.00 ... 22:00 23:00.
  • NEW Experimental RemovePortal() routine operation
  • CHANGE Increased maximum screen length of queue and dispatcher to 32
  • FIX Socket allocation code (broken in 5.36)
  • NEW System broadcast "_Panel Repainted" is sent to a panel when its contents have just been redrawn. This can be due to the panel being shown, a force repaint, the panel redrawing due to transparent views updating or change in window size.


  • NEW Pipes can now have parts of them hidden. The new option "Hide Next Segment" on the Bend Point context menu toggles whether the segment following the bend point is hidden at runtime. The hide applies up to the next bend point.
    This property can be read/set in bendpoint tables using a column called "Hide" or "_hide". If a map is managing a bendpoint table and hidden segments are being used, the bendpoint table must include this column.

  • NEW Gantt and train graph views have option for "No Title"
  • NEW System attribute "s.AdvancingToTime"
    This is set if an advance to time is currently in progress OR Planimate is running in batch mode (without a UI)


  • NEW PL 32 and 64 bit versions now ship in the one ZIP file
  • NEW Pipe's in "Transfer Table Row" mode now handle additional blending columns in a different way. Instead of specifying an absolute range of columns for blending data, you now specify the number of additional blending columns and they start in the columns to the right of the source and target.
    The default additional column count is 0 (ie: not active). The value is specified as a reference which is read on run start, hence a portal attribute can be used if it needs to be changed.
    It is OK for the additional column count to be greater than the number of columns in the source table, PL will use what columns are actually available.
    PL will stop with an error if the target table does not have enough columns to accomodate all the columns that are used in the source. This protects against mismatched blend data transfer.
  • NEW When s.OwningPortalLocation is used in a string expression it now resolves to the object name of the owning portal
  • FIX Paint button mouse down state was not activating during run (it was being overridden by the button state control attribute). This has been a problem since pre-5.32


This version has undergone internal rewrites, enhancement and cleanups. Users of the EXE should not notice any change between this release and 5.35r (model versions are same and compatible). The new developments enable an application to embed and run multiple Planimate models (via DLLs) simultaneously, with arbitrary control over loading, model data, runs and advance-to-time of each loaded PL instance.

A key feature is that multiple running models will use multiple cores on modern processors. The changes have been carefully reviewed, nonetheless please look out and immediately report any issues with unresponsive UIs or models that do not pause/continue as expected or as in 5.35r. The PL DLL API has changed and a new version of the "LoadPL" C++ PL DLL container sample is available on request.

The dotNET wrapper is due to be updated to the new API. API details will be placed at

  • FIX Pause menu appearing right after an item click popup is dismissed with a click. This occured when the "clicks during simulation" option was enabled and an item was clicked during simulation.
  • NOTES (internal change notes
  • pause check during animation in PBA dispatches win events
  • PL DLL no longer auto-runs model upon startup
  • PL & toolkit init code cleanups
  • after set AdvanceToTime, now trigger a redraw which performs test for activating Advance Time dialog so its safe
  • DoUserCommand added lparam
  • new ID regions for toolkit/PL commands
  • Pause timer thread cleanup.
  • Boosted tick speed when a DLL
  • planidll api at V2


  • NEW Table column editor has name of table in its title
  • FIX Handling of terminate for PL as a DLL improved
  • FIX Inconsistency with directory separators between linux and WIndows


  • FIX PBA with external key file - no longer test for an "old" keyfile vs. a new EXE since the keyfile is already locked by the application name. Also allow older key type/key names.


  • FIX PBA close after initial About Box.
    The process of loading the model into the PBA can rearrange PL's font table. This was not anticipated in the About Box as it was a side-effect of its use of off-screen graphics. Just as the about box was being closed, it would revert to a previous "stale" font, causing a close dependent on arbitrary factors.
    This has been latent since 5.35g but most likely not noticed as a specific font table rearrangement is needed for it to manifest.


  • Following up on 5.35j, Track Train Length handling has been
  • enhanced and can now be incorporated into simulation logic as well as
  • just for animation of the length of trains on a track network.
  • These are notes on the specific features, a demo model will be uploaded
  • into the modellers tools area.
  • NEW Track sections now have a "Length Mode" option which enables them to be individually configured for one of two modes of operation.
    When "Length Mode" is "No" (default), the roads in the section will operate as in previous versions of Planimate, supporting loop delay holds.
    When "Length Mode" is "Yes", the new train length capabilities are used instead of loop delays.
    In this mode a road will continue to be held by a train when the train leaves that road, until the tail of the train clears the road. In this state, the road is in "Tail Wait", similar to "Loop Hold" except that it is not time based but rather dependent on the speed the train is moving.
    Planimate calculates this speed based on the length of the road the front of the train is on, divided by the running time for that road.
    Whilst the animation of the tail's motion can be made very smooth (with a low Animation Update Interval setting), Planimate performs the calculation of the time a train's tail will leave a road only when the front of the train enters a road, hence there is minimal event overhead when running without animation.
    For Length Mode to work, the Panel option "Show Train Trails" must be on and trains and roads must have lengths and non zero delays. Note that roads not in Length Mode still animate the length of the train without it affecting their behaviour.
    You can mix sections in length mode and loop delay mode though this needs care as the two different modes treat track capacity differently.
    For roads in Length Mode, if the front of a train is in a portal, its tail continues to be displayed and its item icon is shown on the node portal.
    An additional track table column "LengthMode" enables setting the mode of a section when the track network is configured, 0 = Loop Delay Mode, 1 = Train Length Mode
  • NEW A multi-server in a track node portal can act as a road for train length purposes.

    The "Set/Use Length For Tracks" multiserver option enables editing of a "Length" reference in the multiserver's context menu. With a length set, any train item passing through the multiserver will have this length included in train trail length calculations.
    This is very useful for delays at mines, ports and loop delays as it gives the train a place to go spatially and will be visually shown by the train's length gradually disappearing/reappearing as it passes theough the node.
    The multiserver must have an actual delay (not zero) and it should not be enabled unless its a track model using train length animation or logic.
    This value is re-evaluated dynamically but should not be changed in the middle of a run unless there are no trains at or near the multiserver.
  • NEW Clicking on a track during a run-paused shows a menu with information on the roads. You can now select the "Train" item and it will open the item click context menu for that item.
    This is particularly useful when a track is being held by an item inside a capacity in a network node.
  • NOTE Train length handling separated from item allocation.
    An train can now span up to 64 roads and the memory for this is only allocated when:
- train trail properties such as length/colour/width are set
- the item first enters a road on a panel with the
"Show Train Trails" panel option set
- the Item first enters a multiserver with the multiserver option
"Set/Use Length For Tracks" set
 When the length information is allocated, the item click context menu will display extra items:
LENGTH   :The length of the train
TAILCOUNT:The number of roads the train extends over
TAIL-EVT :The time a tail-update event is scheduled
(only scheduled if a tail will cross onto another
road before the front of the train is scheduled
to leave the road it is on).


  • (unreleased)
  • NEW Log Driven Graphs have a new option "Disable Overlays By Default" which will cause a data overlay to be disabled unless it explicitly exists in a supplied overlay configuration table and it has _enable set to 1.
    This simplifies getting a specific overlay without having to know all the other ID's to disable.
  • FIX Gantts and Train Graphs now support free text for their text detail column
  • FIX Gantt row click popup now supports free text
  • FIX Log driven graph text handling supports free text and should be faster
  • NOTE Internal rework of track code underway, should not change current behaviour


  • (this is an intermediate test release)
  • NEW System attribute s.PauseAfterAdvance enables the s.AdvanceToTime advance to be paused. Set before s.AdvanceToTime.
  • FIX Fix the system attribute popup when clicking on "System..." on an itme - it was stopping due to some system attributes not being available (eg: s.PipeTableRow). It now just shows 0 for these.
  • FIX An s.AdvanceToTime done in a realtime broadcast is now performed at the end of the broadcast.
  • FIX Train tail spanning over > 3 roads was not following the roads inbetween. (note internal rework for tracking tail is partially complete)


  • FIX An incorrect flag for references in expression mode caused them to be mishandled in the "Replace Reference" operation. Any reference or quoted string would be replaced if an expression or quoted string was the "From" reference, messing up the model.
    This has been resolved. Currently expressions are not matched for replacement, only single references/constants, ie: you cannot automatically replace expression "p.attribute + 1" by "p.attribute - 1".
  • FIX The Debug Logger would take an inordinate amount of time to update if it was resized when it had a large number of events. This is because the control was auto-sizing its columns so the last column fills the available space, very slow when hundreds of thousands of rows are in the list.
    The autosize of the column widths now only occurs if there are less than 10000 rows in the view.
  • CHANGE Made location in reference scan list wider and allowed more characters before it gets cropped. The INI setting [Routine] ReferenceOwnerLength enables setting the length before cropping according to your preference and display capabilities, the new default is 160 characters.


  • NEW Train Trails This version of Planimate begins to incorporate train length into models, enabling the length of the train (item) and sections to be set. Planimate uses this information to display the entire length of the train as it moves on tracks, apportioning it along the roads the train has recently visited.
    The colour and width of the trail can be set item by item.
    Currently this is purely an animation feature which does not impact on the simulation, however it will be progressed so the end of the train controls the movement logic, as an alternative to the existing "loop delay" abstraction.
    The trail of a train is only shown whilst it is actually on a track, it will disappear when a train dwells inside a portal (loop, mine etc) and reappear when the train leaves it.
    Future versions will address this, eg: via new mechanisms to register the contents of a portal for display on its owning panel.

  • NEW System attributes: s.ItemLength sets the length of a train (unit should match whatever is used for section) s.ItemTrailColor sets the colour when drawing a train trail s.ItemTrailWidth sets the width of the train trail
  • NEW Track Section Table column "Length". If preset, the configuration table will set the length of the section.
  • NEW Panel Option (Display): "Show Train Trails" This should be set for a panel containing tracks where you want to display the train's length.
  • NEW Track section "Length" setting in context menu. This is provided for diagnostic and testing; lengths should be set by using the Track Section Table.
  • NEW Routine operation "ClearTrailList" removes all sections from a train's history, used when displaying its length.
  • CHANGE The Model Option "Center Icons On Spatial Links" has been renamed to "Center Icons On Tracks/Spatial Links" and now applies to tracks as well.


  • FIX Fault caused when Advance To Time dialog appeared in a model with the "Advance Time Dialog In Main Window" option set, and the model was running in a Planimate DLL
(contained in another C++ or dotNEt  application).
 The Advance Time dialog was using the main window to position itself but this window does not exist when Planimate is running as a DLL.

  • FIX Dialog and a number of other internal services which depended on the main window which is not present when Planimate is running as a DLL
  • FIX Dynamically hidden objects/links were still responding to clicks
  • FIX The clear at start option for attributes, columns and tables now clears to the "run start date" not the "edit date" for data formatted as calendar time.


  • FIX Added testing for spatial link time assignment to detect
-ve times. A small negative value (1.0e-5) is clamped to
zero without an error message.

  • FIX Added testing for spatial link distance assignment to detect
-ve distances. A distance < 1.0e-4 will now trigger an error.

  • FIX Added test condition in spatial link code to test against it attempting to schedule a time in the past as a catch-all for distance/time related issues.
  • FIX Fixed a buffer overflow when creating a spatial link name from two long object names.
  • FIX Added an interlock to prevent the "Advance Time" window being displayed if a model set s.AdvanceToTime during a broadcast but then didn't continue the model (ie: model paused). This would cause the Advance Time window to linger whilst paused.
    This does mean PL will not show the "advance" window within a event triggered broadcast which executes a routine which sets s.AdvanceToTime then takes a long time to complete (eg: a big loop), until the engine continues onto processing other events.
  • CHANGE Support for externally keyed PBA enabled

5.35g (new file format)

  • NEW Tables hover tracking can now send a broadcast. This is selected from the table view context menu and Hover Tracking has to be enabled for the iew.
    Hover broadcasts set _row and _col attributes and are also sent for entire row (_col = 0) and entire column (_row = 0) as well as "hover clear" where both _row and _col are zero.
    Typically you will want to respond when _row and _col are both > 0
    Do not popup windows or change the panel during this broadcast. The broadcast is sent quietly in the background in real time.
    Use it to change data which updates quickly or you will end up with a laggy and unresponsive interface.
  • CHANGE Reworked the way the About box is handled when Planimate starts a Planimate Based Application (PBA).
    If an "About BMP" was selected in the PBA Compiler or there is a BMP called _APPLOGO in the model's DB, then the About box is shown before the main content of the model/PBA is loaded.
    This is an important indicator of activity and will help prevent users from launching multiple instances of the PBA as they will now get immediate feedback that it is loading.
  • SPEED The "About Box" change exposed that a cache used with DB files during load wasn't active for PBAs.
    Rework was required to enable its use when a model is loaded from a DB (as in a PBA) and that model reads other resources from the same DB.
  • FIX The RoutineFoldColor property in the platform INI file was not being properly initialised, causing folded lines to be "black on black". It was OK for the inverted colour sets.
  • FIX Added row/column indicator to infinite value test for table dates upon model stop


  • FIX A restriction which caused viewport windows to be constrained to the size of the desktop area has been eased. This would cause viewports on large scrollable panels to be incomplete when the model was on a system with a lower resolution display.
  • CHANGE The viewport option "Open On Double Click" has been renamed and slightly repurposed - it only is active for modellers now.


  • CHANGE Change to Pipe Accumulators, Out Accumulator C is now a Decumulator instead, working like In Decumulator C

5.35d (new model version)

  • NEW Pipes now support tertiary "C" load/unload accumulator targets. These work similar to the current load/unload accumulators but the additional Load Accumulator is actually a Decumulator which is decremented by the load amount instead of incremented.
    The value is not clamped against zero so it can go negative.
    These add to the B Accumulators added in 5.34i and enhance the use of pipes when individual levels and aggregate levels are being used concurrently in the supporting model logic.
    EG: All pipes in a group can use a common Decumulator to track the total amount that has been loaded by the group.
  • FIX It is now possible to interrupt Planimate searching for a path through a complex spatial network (press Esc).
  • FIX strchar operation now works for character 1 (= first character)
  • FIX Reverting a column title when reverting a column to the main table in a table view with customised columns
  • NOTE Further refactoring of Planimate code so support builds under Linux. Most of the changes to PL codebase are to fix inconsistencies picked up by the other compiles.


  • NEW "_alignment" label list
  • NEW Planimate logs its version number to the logfile. By using "Planimate.exe /debugfile /batch" you can create planimat.dbg which will contain a line like:
    "Version 5.35c (4511-655) 32bit"
    This will also work with PBA's built with this version onwards.

  • CHANGE If editing attribute/cell views with the Edit Order set up (so editing moves from view to view) then a mouse click no longer advances to the next view, only TAB or ENTER.
  • CHANGE Behaviour of Cyclic Selection
    If editing a cell view using a label list with "cyclic selection" on then PL is more flexible with how it is applied.
    If the "Edit With Field" or "Edit With Combo" options are selected, they will now take priority, overriding the cyclic selection and you get the field/combo.
    Without these options, you only get cyclic selection if
- its not an "edit down table" or "edit across table"
(auto advance)
- the view doesn't have an edit order value set
 In these cases you now get the old-skool label selection popup, just as if cyclic selection wasn't on.

  • CHANGE Changed the breakpoiont/error dialog so it has an icon in the taskbar which is useful in returning to the dialog if the modeller has got forced topmost unmoveable popups which could obscure the dialog if selected, causing the user to get stuck.
  • CHANGE /FLIPCOLORS (force dark) option reworked and when used it enables a CTRL-SHIFT-K hotkey to toggle back to standard mode
  • NOTE PL now builds with the "gcc" compiler as well,
    Having the code compile with many compilers helps pick up problems (each compiler has its own nitpicks). Some minor issues were found in this process.


  • NEW Debug logger shows formatted value for SetValue log items
  • NEW Debug logger handles incremental updates to list. If last line is selected, it will scroll otherwise it stays at current item when new ones added
  • NEW Can show debug logger from pause and breakpoint dialog
  • NEW Changed debug logger so main window is its owner to stop it getting lost. Will make this controllable in due course.
  • FIX The wrong panel was internally logged in FEC events involving an object. This was noticeable when a panel filter was applied
  • CHANGE Reduced debug log size to 500k events


  • NEW System attribute s.EnableDebugLogger enables model code to open/close the debug logger window. When closed the logged history is deleted.
    This reference does not open the window if the user cannot edit the model.
  • FIX Clicking beyond the last row in the debug logger would cause PL to close
  • FIX Calendar date/times are properly handled for the from/to log times and the event log times when the edit and run start date differ.
  • FIX Update display when log cleared
  • CHANGED Renamed "View" to "Display" in debug logger
  • FIX The LogMessage operation now has very little overhead in a PBA
  • FIX Handle resizing logger window, fitting the last column, retain position when logger is closed (with PL session at the moment).


  • This version introduces a new tool for debugging (Tools/Show Debug Window).
    The Planimate Debug Logger Window enables a developer to record, review,
  • search and filter the operation of a model, a powerful tool when developing,
  • debugging and becoming acquainted with a model's code.
  • It is deeply integrated into the Planimate Engine, taking advantage of the
  • model being available for navigation to sources of events.
  • Key features of the logger include
  • * Selectable logging of a number of key Planimate operations including item movement, broadcasts, messages and value set operations over an adjustable time range
  • * Multiple filters can be applied to the display including location, item ID, data object, time range and raw text match of the logged events
  • * Keyboard shortcuts for rapid navigation of data including skipping time, FEC event, item movement and text search
  • * Efficient - whilst deeply integrated into the PL engine, it has negligible performance impact when not in use and less than 2x reduction in model speed when logging is active. The debugger uses a fixed circular buffer of about 200MB which retains the last One Million logged events
  • * Modellers can include their own reports (including data values/text) into the log
  • * Extensible for more logging event types - a basic set is currently supported.
  • Currently the filters and display modes are accessed using context clicks
  • on the lines and the menu bar, still in early stages.
  • NEW Routine operation LogMessage(text)
    Writes text to the debug logger window and the planimat.dbg file if either enabled. Text can be a text expression including attributes and labels as well as quoted text, combined with the & character
    eg: LogMessage("Stockpile at " & p.Location & "overflow")
    note that these messages are intended for model development/debugging and should be removed from release models.
  • REMOVE Shared routine support has been removed.
    Any encountered are reported and removed. Any Change objects using the shared routine will be reported and become "empty".
    If you run PL with the /DEBUGFILE command line option, the messages are logged to the planimat.dbg file, which you can get to via the "Show Debug Log" option in the tools menu, which appears when /DEBUGFILE is used.
    You might want to use the information reported to find objects using the shared routine in a previous version of PL and use the "Make Local" option in the routine editor before migrating to this version.
    Shared routines were mainly used when PL had track loop objects. Removing them makes the platform more efficient and makes it easier to track routine calls in the new debug logger that is being developed.


  • NEW Pipes now support secondary "B" load/unload accumulator targets. These work just like the current load/unload accumulators and are useful for additional logging/control
  • CHANGE Internal rework for new trace logger (not yet available)
  • NOTE Event step debug and item movement logs to debug file (debugging options) are currently unavailable.

5.34h (not released)

  • CHANGE Viewport Sizing Viewports with the "click through" option set used to
reduce the  box made available to the
window within in order to retain a clickable border.
 This occured with the "Directly Handle Clicks" option enabled and was required for viewports to be editable in older PL versions.
 Since 5.31e, editing is always possible so reducing the window rectangle is no longer required.
 This means that viewports with "Directly Handle Clicks" enabled will now have a slightly bigger window area. The overall box of the viewport hasn't changed, just the area it can use to display the other panel.
 This has been done to eliminate single pixel offsets which occured with resizeable panels containing anchored viewports, noticeable if the modeller had set up their own border around the viewport.

  • FIX Stray column of pixels to right of the status bar cleaned up
  • FIX Table view title was slightly too wide when border style was None


  • NEW Distribution dialog has a new mode "Expression" enabling an expression to be used to specify the random generator.
    The expression can draw one or more uniform random numbers (values from 0 to 1) from the distribution's stream using the new system attribute "s.rnd01"
    This system attribute is only useable in a distribution in the new expression mode. This ensures compatibility with the undo mechanisms in the PL engine, which also revert the state of the random generator when the random routine operation is used in a routine in lookahead.
  • NEW A Planimate DLL routine can now be used in any expression within a reference.
    The new notation is:
    Simple Example: Calling a dll function called "sqrt" in a dll called "tools" in a routine line:
    p.result = tools:sqrt(p.attribute)
    Advanced Example: Creating a custom distribution (using the distribution "Expression" mode co-incidentally added in this release)
    In the distribution dialog, select "Expression" then open the editor with the ">" button. Assuming you have a PL DLL called "beta" which implements the inverse Beta CDF function as ibeta(x,alpha,beta)
    You could then use:
    The routine needs to accept only numeric parameters and have a single numeric output (separate to the return value, which is ignored).


  • CHANGE Model palette now has tips for assigned buttons. These are automatically generated based on the button's action.
  • SPEED Sped up table copy (t.table2[] = t.table1[]) in case where table2 is empty (no rows/columns) Was doing a redundant copy in that case
  • FIX Log/Train/Gantt/Column graph sizing when there is no time scroller or x scale but there is a y scale would cause the y scale to go off the bottom of the graph.
  • FIX A PL PBA now continues even if it cannot create application data directory on startup.
  • FIX Reworked message handling to fix a subtle menory corruption when windows were closed as a result of a message sent to them vs. external reasons (eg: user change panel)
    This was only noticed under the debugger

5.34e (new MDL version)

  • NEW Item class context menu option "Add Attributes For Broadcast" This will add all the item attributes that a particular system broadcast kind will set.
    At this stage it leaves them formatted as values, it might be useful to reformat object labels etc. to their label list.
  • NEW Panel option (Engine) "Broadcast Item Clicks". When set, any items clicked on the panel will send the new "_Item Click" broadcast.
    This will copy all matching item attributes to the broadcast item then set:
"_id"      : The item clicked
"_x","_y"  : The panel co-ordinate clicked
"_location": The nearest owning portal index of the panel the item is on
"_object"  : The object index of the object the item is in
"_buttons" : Which mouse button 1 = Select, 2 = Context
 In a non PBA, ctrl-clicking an item will show the inbuilt item info popup.

  • NEW Palette "Model Palette" contains 12 buttons which can be assigned click-actions by right clicking on them. Modellers can use this to store common panel jumps, broadcasts etc. for model development/debugging.
  • CHANGE The Change Folder buttons in the icon mover now use the system change folder dialog. To select a DB, select its folder first then pick the DB from the palette/combo list.
  • FIX Redraw of tracks/links/pipes whem their object is repositioned on the fly, introduced 5.34d

5.34d (new MDL version)

  • NEW Object property "ObjectHideName" enables the names of individual objects to be hidden/shown
  • NEW Object property "ObjectNameScale" enables scaling the name of an object. The default value of 100 means no scaling. The scaling is applied to the Object Name Font as set in the Font settings.
  • NEW When dragging an object the co-ordinates are shown in the titlebar.
  • TIP Pressing keypad arrow keys enables keyboard positioning Keypad + toggles smooth mode Keypad - enables numeric entry
  • FIX Empty paths left by flow editor no longer cause PL to close on model start
  • FIX When using the dynamic add object table, the _new_name column now supports using text as well as a label list.
  • FIX Setting the filename of a paint map or paint image now protects against names containing newlines, tabs or double quotes which would cause problems when the model was reloaded.
  • FIX Selecting "Show Routine" in a breakpoint immediately after a routine operation to copy portals would close PL. This was caused by the debug code not properly handling that some run context is cleared by the process of adding the new portals to the running model.

5.34c (new MDL version)

  • NEW Calendar Time format: "YYYY-MM-DD-HH:MM:SS"
  • FIX Non black vertical bars in graphs
  • FIX Missing updates for train graph and gantt if data changed during no-update interval

5.34b (new MDL version)

  • NEW Dialog fields now have separate specification of Display Width and Editing Width. Editing Width detertmines how many characters can be typed and enables longer input that the window area allows (the field horizontally scrolls). Default of 0 uses the display width, as previous.
  • CHANGE Road section type changes in track table are now properly updated in the track at runtime when a GenerateTrackTable() operation is performed.
  • FIX A free text cell containing "%" would be incorrectly processed when written to the clipboard
  • CHANGE Made the flow hover line blue instead of white so it appears on white backgrounds
  • FIX Unchecked item attribute reference would cause PL to fail after reporting an error on a missing item attribute.
  • FIX Cancelling selecting a "Runtime Resources File" then selecting cancel again in the dialog that follows will now properly remove the reference to the file.
  • FIX Dialog() is now compatible with "Text" attributes/cells
  • FIX Paint objects were re-registering tool tips in animation layer updates. This is now prevented; tool tips cannot track an object during animation layer update and require a repaint to update.


  • NEW Path context menu enables selection of all items on the active path and and selections are now shown in Flow Edit mode. This is useful for selecting a path then using the align feature of the selection menu.
  • FIX Fix flow edit handling of non rectangular objects for arrow hotspot/tool tip
  • fIX Arrow head direction for vertical lines


  • NEW Flow Editor has been reworked
    Drawing in flow edit mode no longer uses "XOR" type drawing which increases clarity, enables more styled lines and prevents overlapping lines obscuring each other
    New Drag Behaviour: If an object is dragged and dropped over an arrow of a selected path in flow edit mode, it gets inserted into the flow at that point
    Active Flow context menu has options to select previous/next objects
    Deleting an object which is one or more flow paths used to delete the whole path. It now removes it from the paths its in.
    A new algorithm is used to position path numbers
    The font used for path numbers can be customised in the Font settings.

5.33o (not released)

  • NEW Item "following"
    A mechanism has been added enabling an item's position on a spatial link/track to be used to adjust the position of a map, the idea being to keep the item centred whilst the map moves under it.
    This is achieved in model code, the operations added provide the basic support. This feature creates no performance impact if it is not enabled.
    For usage details refer to the Map Demo Model (5.33o)
  • NEW System Attribute s.FollowLimit (0 by default) This acts as a "safety valve" so a model only gets a movement broadcast when it specifically asks for one.
    When set AND an item with s.ItemFollow set takes a step on a link/track, PL will decrement this limit then send the new "_follow item" broadcast.
    *** It also causes no subsequent periodic item animation. ***
    The idea is that the modeller has an opportunity to shift/change the layout (eg: map) THEN force a repaint.
    This attribute is automatically zero'd upon pause. Only set it to 1 at this stage.
    The force repaint re-anables normal animation until another item step triggers the broadcast.
  • NEW Item System Attribute s.ItemFollow This signals to PL which item "follow".
    It can be set in code or by clicking the "Follow" line in the popup which appears when the item is clicked in edit mode.
    See s.FollowLimit on the effect of setting this.
  • NEW Broadcast "_Follow Item"
    This is sent when an item with s.ItemFollow set takes a step as described above. It includes attributes:

_panel   : Panel ID of panel item is on
_location: Object ID of link or track item is on
_id      : Item ID
_x,_y    : bottom left iFlow co-ordinate of item

To follow an item with a map:
- use map to determine (longitude/latitude) of the x/y point
- set the map's centre to (longitude/latitude)
- update the map and let map update object/bendpoint positions
- forcerepaintpanel containing the map
- Set s.FollowLimit to 1 again so the next step will be
broadcast to you
After doing this, the repaint will show the item in the centre with the map having moved under it.

NEW Viewport option : "Keep Client Size Even" This should be turned on for viewports containing a map on a panel with "Auto Fit Panel To Window" turned on.
This eliminates one pixel jitter of a followed item, which was caused by the map panel having an odd width and/or height.

  • FIX To prevent co-ordinate errors the Map Paint Object always works in an even number of screen pixels. If you set it up on a panel which has even width/height at the time of edit, make the paint object have even width/height then look at it through a viewport with the "Keep Client Size Even" then you will not get the unused row/column of pixels that will appear on the right/bottom of the map display if its size is not even.
    TIP pressing keypad minus when resizing shows a dialog of the co-ords
  • FIX Memory leak when retrieving users of a label list

  • SPEED Cleanup (further) windows message processing by using MSG structs


  • The following changes enhance the performance of the Map Paint Object
  • A new version of the MapDemo model (the reference model on using the
  • Map Paint Object) will be available in the idBase Developers Tools
  • region. It includes use of a tile DB file, easier configuration
  • and support for zoom to mouse cursor.
  • Documentation for this model is on the wiki:
  • Existing models should be compatible with this version but 2 changes
  • are recommended in existing map code:

1) Replace the 4 lines which set properties ObjectXPosition, ObjectYPosition,

ObjectXScale and ObjectYScale with one call to SetObjectPos() which is far more efficient.

2) Use the _panel_visible broadcast to update the map's position

(remove _panel_opened or other catches of this broadcast if present)

  • NEW System broadcast '_Panel Visible" is sent to a panel when it becomes visible, whether because it has been selected to the main window, displayed in a popup or is now appearing in a viewport.
    It is not sent to a panel at run start if it is already visible.
    A panel will receive this broadcast before any previous panel receives the "_Panel Closed" broadcast and before the newly received panel receives the "_Panel Opened" broadcast.
    Process this broadcast as quickly as possible and do not attempt to close the panel that is just appearing within the broadcast.
  • NEW The map "SetLongLatXY" operation now takes into account any changes to the map zoom property without needing a repaint. This enables smoother updates when using this operation to keep the map centred on the mouse when zooming.
  • NEW Map operations "SetLongLatXY", "LongLatToXY" and "XYToLongLat" now quietly do nothing if the map is not on a panel which is visible. Without a window they dont have a co-ordinate space to operate over.
  • NEW Added and renamed mouse co-ordinate access system attributes. They are now:
    MouseX,MouseY: The mouse co-ordinates in Planimate's cartesian co-ordinates where (0,0) is the bottom left pixel of the panel in the main window.
    MouseXWindow,MouseYWindow (used to be MouseXPanel/MouseYPanel): The mouse co-ordinate in Windows' co-ordinates where (0,0) is the top left pixel of the panel in the main window.
    MouseXOwner,MouseYOwner: The mouse co-ordinates in Planimate co-ordinates where (0,0) is the bottom left pixel of the first visible panel above the location where the reference is made.
    This is useful for determining the co-ordinates on a panel which is in a viewport. In this case the code needs to be in a portal under the panel.
  • NEW Routine operation SetObjectPos(obj,x,y,xscale,yscale) enables an object to be positioned and scaled in one efficient operation.
    x/y specify the objects centre xscale/yscale set the scaling as a percentage with 100 = no scaling
  • FIX Map Paint objects will now work in a popup which has been scaled.
  • NEW The graph horizontal time scroller has a tip over the "resize" area


  • FIX PBA's built with 5.33l would not "advance to time" properly and would likely have other issues due to the FEC being left in background event processing mode.
  • NEW Deferred Drawing option added to train, gantt and column graphs. This causes changes to the graph to be rendered behind to scenes (quicker) and then the graph to updated all at once.
    Future versions will auto-cache the rendered data when the graph is redrawn without the data having changed.
    Tip: for faster graph updating, set a non zero update interval as it prevents repeated updates as data in the table is changed.
  • CHANGE Graph views changed to avoid recalculating internal graph data if the table driving them hasn't changed and they haven't been moved.
  • SPEED Optimisation to graph view line/bar drawing
  • CHANGE The "Restart When Model Stops" option does not take effect when the system is in editing mode. This prevents models auto restarting when editing.
  • FIX Reworked low level event handling to fix issue with listview controls and Window 8 Consumer Preview.
    PL now works in Windows 8, previous versions would have problems with model editing, which uses the listview in various dialogs.
  • FIX Train Graph and Gantt Graphs no longer cause fault if their table has columns removed while they are visible. Streamlined redraw code for transparency case.
  • FIX Made Auto X Scale "on" by default for newly added gantt and train graphs.
  • FIX Some printer drivers not handling transparent background attribute views


  • FIX On some systems with multiple nested viewports, fit to panel and resize broadcasts enabled, nested resize broadcasts would generate system error 1134 which indicated a pause with a background-process event still pending.
    The engine now checks for this and processes to completion all such events.
    This may also clear up some cases of a missing panel resize/update that gets cleared up when continuing the run.
    In addition to the fix, the diagnostic message is no longer reported in a PBA.
  • FIX The label list combo in the attribute editor was not getting its length initialised properly causing it to pick the wrong initial label for longer labels that differed beyond the 10th character.
  • CHANGE Engine: events posted in "Background" mode such as resize, page printed etc are not interruptable in PBAs.
  • CHANGE engine: streamlined the main event processing loop by combining a few termination tests


  • NEW Implemented setting the x scale range for gantt and train graph views. The Auto X scale option is now enabled for these graphs and it is on by default. It must be turned off to make setting the x scale effective.
  • NEW Table View properties MinYValueRHS and MaxYValueRHS, can set the RHS Y axis range for log driven graphs with the secondary RHS axis enabled and Auto Y Scale disabled.
  • CHANGE Reworked how object rectangles are managed to make it easier to manage the special cases (queue/dispatcher) which dont have the bottom left as their internal origin.
  • FIX Edit time Ctrl-click/drag on a map (to drag the objects in the view) now updates the co-ordinates of the objects in a different way which hopefully achieves the goals of putting the centre of the object at the right position, keeping any object views in sync with the object and correcting any corrupted object bounding box which made it impossible to click or select the object even though it was visible.


  • NEW Scale Parameter: X Scale Label Margin
    This sets the minimum padding (in pixels) between adjacent x-scale labels.
    PL omits scale labels if they are within this margin (too close).
    Reducing this value enables scales with labels which are closer together
  • FIX The sub label list editor will now remove all members from a sub label list which are not in the "selected" list - including labels which no longer exist in the parent label list.
    Previously it would leave such labels even though they did not appear in the sub label list dialog.
  • NEW Improve Column Overlay editing including detail display, Swap To Line and Duplicate of overlay items. Scale display cleaned up to not show unsupported RHS parameters for this graph type.
  • NEW Column Overlay graphs in "Vertical Bar" mode have a new option: "Arrange Overlays Side By Side".
    This distributes overlays horizontally (based on their width) centred on their bin value. It is very useful for multi-column histograms.
    You can use the X Scale margin to add space for the bins at the edges of the graph, typically about 10% margin is enough.
  • NEW Column Overlay graph option "Allow Negative X After Margin"
    This enables the X scale to extend before 0 and is useful when using the "Arrange Overlays Side By Side" option where the first bin is at 0.
  • NEW Graph view properties: MinXValue,MaxXValue,MinYValue,MaxYValue
    This enable querying and setting the x and y data range for graphs with manual X/Y scales (the setting is ineffective if auto x/y scale is enabled).
    Reading is supported for Column Overlay, Log Driven, Train and Gantt graphs.
    Setting is only supported for Column Overlay and Log Driven graphs as Gantt and Train Graphs do their own management of the underlying graph object.
  • FIX Column Overlay graph scales update to source changes on a redraw
  • FIX Made line style names consistent between labels and selector


  • NEW Clicking on an entry in Message Entry mode now displays the time and sender of the last message received from the entry.
    A new option enables an item to be created at the entry which
triggers the code (as for clicking ona  broadcast entry). This
is useful for development/debugging.

  • NEW Pipe behaviour with broadcasts has changed.
    Previous versions would continually resend a broadcast every pipe update when an enabled trigger such as Target At Target Upper Limit occurred. If the modeller didn't stop the pipe or change the target, a broadcast storm would result.
    From this version, a broadcast for an ongoing condition is only sent once whilst that condition is maintained, For the target upper limit case, if the target drops below the upper limit then goes above it again, then another broadcast is sent (see below about this).
    If the pipe is stopped and restarted (using the pipe control attribute) then another broadcast is sent if there are any active conditions.
    if the new Pipe option "Only Pipe Stop/Start Resets Broadcasts" is set, then the pipe wont rebroadcast when the target drops below the upper limit and goes above it again - a stop/restart is needed to reset the broadcast sending.
    This change enables a modeller to be notified of a condition (such as the target reaching a threshold) but for the pipe to continue operating because the model is waiting upon other conditions to be met before taking action.
  • CHANGE Improved multi-monitor support
    Changed the window creation code to remove clamping the window width/height against the primary monitor, instead it now clamps against the virtual desktop area.
    This prevents viewports from being restricted when a window is stretched across multiple monitors or onto a monitor which is larger than the primary display monitor.
  • FIX The browse folder dialog now supports a default (currently used when selecting a DB for importing icons)


  • NEW Managing Pipes with s.PipeTableRow and the "ObjID Column" setting
    Pipes can now automatically find which row of a pipe table to use for storing their control, rate, limiting and other properties. This avoids the use of Matched Cell lookups in the pipes, which is very, very bad for performance.
    The pipe needs to be associated with a configuration table that the modeller builds and maintains. This is done by setting the "ObjID Column" pipe object setting to a column refernce of a table. This column needs to be populated with the Object IDs of all the pipes that refer to it.
    WIth this set, a pipe can then use the new system attribute s.PipeTableRow as a row index to the SAME table. This will be calculated at model start to point to the correct row for the pipe.
    s.PipeTableRow is evaluated very quickly (as quickly as a constant).
    The pipe table must NOT have rows added or removed at or above any rows that pipes are using. Appending is OK.
    A dynamically added pipe (created based on a template which references a config table) will look for itself in the table, so the entry for it needs to be added there before creating the pipe.
    You are not limited to one pipe configuration table but you MUST make sure that your pipe's settings use the table which matches the ObjID Column table.
    Clicking on a pipe in edit mode will display the table and row index that the pipe is using.
    The modeller has a table called PipeTable with columns
PipeID  : contains pipe object IDs
Control : pipe control values (0, 1)
For each pipe, setting this will put it under control of the table:
ObjID Column : t.PipeTable.Column(c.PipeID)
Run Control  : t.PipeTable[s.PipeTableRow][c.Control]

  • SPEED References to s.Clock will be faster
  • FIX Fixed a typo in the table column editor


  • NEW It is now possible to work with tiled maps without having to install a folder with thousands (or hundreds of thousands) of small files.
    Planimate's DB Admin Tool enables packaging of a tile folder into a DB file. The Map View can then be configured to fetch tiles from that DB instead of looking in folders. More details below.

  • NEW DB Admin tool has new option to import a tileset into a DB file. The DB file must be initially empty. You can create an empty DB by typing a new name when the DB Admin Tool offers to select a DB.
    You need to select the top level folder of the tileset (the one containing folders for each zoom level).
    Only one tileset can be in a given DB file. DO NOT name it with a preceeding underscore, you must specify it explicitly in the Map View object. If it has a preceeding underscore, PL will waste a lot of time scanning it for regular icons.
    A tile DB file must not be the model DB and cannot be merged into a standalone EXE, it gets shipped as a separate file which resides in the same place that the tile folder was.
    Avoid using the icon mover or DB Admin Tool on a tile DB, it will be *very* slow when there is a large number of tiles.
    Be aware that DB files are limited to 2GB in size at this time. The tiles are efficient, 120,000 tiles result in about a 150MB DB file.
    Keep a backup of your tile folder (best done in a zip or 7z) in case you plan to alter it. There is no tool to extract the tile folder from the tile DB at this stage.
  • NEW The Map View Paint Object has a new option "Fetch TIles From DB File". This causes it to treat the tileset name as the name of a DB file instead of a folder name.
    The DB Admin tool can be used to import a tileset into a DB file.
    NOTE 1: Multiple map view objects using the SAME tile DB will all load a separate copy of the DB index. With 150000 tiles this will use 15MB of RAM per view, not a great problem but it does allocate many memory objects.
    Viewports of the one paint map object are not affected.
    NOTE 2: Multiple map views with the "Cache Tiles In Memory" option and DIFFERENT tile DBs is not supported. The tile cache only supports one DB, so you will need to turn the cache option off on Map Paint objects which use a second, third etc. tile DB.
    Generally a model will only need one tile database.
  • CHANGE You can now type a name into the file dialog when opening the DB Admin tool, this will create a new DB file.
  • FIX FillSteps option for AddStaticRoute


  • NEW Routine operations AddStaticRoute and RemoveStaticRoute enable adding and removing routes (as edited under the Track-Routes menu) under model control.
    AddStaticRoute(route_name, route_id, starting_cell, step_count, fill_steps) RemoveStaticRoute(route_id)
    Both use route_id to identify which route. Adding using an existing route_id replaces that route, otherwise a new route is added. If route_id is 0, a new id gets allocated. The route_id used or allocated is returned.
    Deleting a non existent route is silently ignored.
    For AddStaticRoute:
    Starting_cell references a cell in the table. This points to the top of a column of portal object labels. 'step_count' specifies how many rows will be put into the route.
    The fill_steps option allows PL to auto complete route steps when it is instantiated. Note the route steps added remain as specified.
    It is imperative that any route modified or removed not have any items using it at the time. This is not supported and will likely result in Planimate seg-faulting.
    If the objects are not all portals and all on the same panel, a model stop occurs.

  • CHANGE Renamed the Change object File option "Write Free Text As Cell" to "Dont Binary Quote Text Cells"
  • NEW Change object File Read (DAT files) now supports reading raw data into a free text column (not quoted binary data) when the option "Dont Binary Quote Text Cells" is enabled.
  • CHANGE These routine operations can now set a text string instead of only working with label lists, depending on whether their target attribute is formatted to a label list or as text.
    AppendToLabel RenameLabel ExtractFileName ExtractFileExtention ExtractPathName

    FilesInFolder FilesInHierarchy

  • FIX Reporting of out-of-range column in Change object File Read/Write
  • SPEED Optimised route step management, reducing memory usage and model file size by removing obsolete unreferenced data and taking advantage of route steps always being portals.


  • NEW Gantt views now support an optional new column "_layer"
    This enables blocks to be positioned behind/in front other blocks.
    By default all blocks are drawn on layer 0. Adding the _layer column enables say layer 1 and 2 to be used. Layer 1 blocks will be drawn in front of layer 0 and layer 2 to be drawn in front of layer 1.
    Its important that layer numbers start from 0 and increment by 1. (each layer increment step involves another pass through the data).
  • NEW System attribute s.LastRunStopTime
    This gives the simulation clock that the previous run stopped at. It is set at the same time as s.LastRunStopReason.
  • NEW Gantt Views now support an optional column "_yoffset" enabling individual bars to be offset relative to each other on a row.
    The value is specified as a percentage of the maximum possible bar size after taking into account the global gantt bar width.
    For _yoffset To be useful, the _width of the bar must be less than 100, otherwise it has no space to move in. This is set using the existing _width column capability.

Column   Column    Result:
_width   _yoffset
100      0        The bar fills as much as of the row as the
global gantt view _width determines. This is
subsequently called its "maximum height".

50      0        The bar is half its maximum height, and centred
50      100      The bar is half its maximum hieght and top-aligned
33      -100     The bar is 1/3 its maximum height and bottom aligned
Bar labels are offset accordingly.
Used in conjunction with the _layer capability, very complex data can now be overlaid in the one Gantt View.


  • NEW Ctrl-X is now supported in the table editor/views.
    If the selection is all columns, the selection is copied then cut. Otherwise PL just beeps.
  • FIX The in-place editing field for routine editing could extend off the edge of the window if the routine step edit window had a scrollbar. This made it difficult to inspect and edit long statements.
  • FIX Planimate was not responding to loop break requests when the advance to time dialog was active (advance dialog was receiving notification but its state wasn't being tested in one instance).
  • FIX Remove some obsolete testing from route fill finalisation code
  • FIX Inner about box credits updated
  • CHANGE Renamed routine editor "Expand Collapsed Blocks" to "Expand Collapsed Blocks In Selection", reflects better what it does.


  • NEW Standalone EXE version information
    This is only available to Planimate users with a PBA Compiler key (level 4 license).
    The "version" information that Windows displays when hovering over an application or checking Property/Version of an application in Explorer has can now be set for a Planimate Based Application (PBA).
    The "Standalone EXE Creation" dialog has a Versioning button to configure the settings (which are saved with the model for next time).
    The versioning is actually performed by a separate standalone executable called "VerPatch.EXE" which Planimate calls when making the PBA. Licensed users can access this on idBase in the Planimate Development Tools region. The EXE must be placed in the same directory as Planimate's executable. It will work for both 32 and 64 bit builds.
    The way the EXE is called is specified in an INI setting [PBA] VersionCall= ...
    You should not need to modify this as the PBA builder subsitites the values entered in the UI.
  • CHANGE PBA Compiler options/settings for "App Icon", "Windows Icon", and "PL EXE To Use" are only available to users with a PBA compiler key license (level 4 license).
  • NEW Multiserver option 'Low Priority 0 Delay" This configures the multiserver so it is a zero delay but the event is posted with a low priority so other FEC events at the same time will be processed first.
    This is useful where a large number of updates are happening at a time and you want to perform some final processing after everything else is completed.
    Typically flow order, messages and broadcast-wait dispatchers can help order activity but in some cases the system is too parallel and this option can help.
    This delay mode is not pauseable and is mutually exclusive to the "pauseable 0 delay" multiserver mode.
  • NEW Can "Find" multiservers with "Pauseable 0 Delay" and the new "Low Priority 0 Delay" options.
  • NEW The 64 bit version of Planimate has new behaviour when loading DLLs which will make it easier to manage both 32 and 64 bit versions.
    If loading a DLL which doesn't contain "64", the 64 bit version will change the name to include "64". If the load fails, it will fall back to using the name as selected.
    Hence in a model that loads "MyDll.DLL".
    A 32 bit version of Planimate will only load "MyDll.DLL".
    A 64 bit version of Planimate will try load "MyDll64.DLL" first then if that isn't found, it will try "MyDll.DLL" (which then must be a 64 bit DLL for it to work).
    When using this feature and editing your model's DLL call, you will need to have both 32 and 64 bit DLLs and select the version without the "64". For example, select "MyDll.DLL". PL will load "MyDll64.DLL" automatically.
  • NEW Routine operation "ShowAboutBox"


  • NEW The Advance To Time / Advance For Interval dialog has a new checkbox "Ignore Breakpoints" which will cause breakpoints during advance to be ignored. NOTE:This gets reset when the model engine restarts.
  • NEW Can select "Clear on save" option from table creation dialog
  • FIX Pipes no longer update bin areas when hidden
  • FIX The "Replace" reference dialog now accepts a To Line > than the line count in the routine (clamping to the last actual line).
  • FIX Sidebar reset after building PBA. Change in 5.33a caused hierarchy to disappear.


  • NEW SetPanelProperty and GetPanelProperty routine operations, work with the new _panel_properties label list.
    Initially a few panel options are available as run-time settable properties, more will be added as requested.
  • NEW Engine option "Realtime BCast Within Events". This facilitates lockup/detection handling by enabling a real time broadcast to be sent while another event is still being processed.
    s.RealTimeBCInEvent enables reading and changing this in code.
    It should be left OFF for normal interactive models.
  • CHANGE Reworked pause timer handling so it can be used in /BATCH mode. Some of the changes in 5.33 have been reversed to enable this.
  • CHANGE Rework pause handling for case of item moving between objects indefinitely. It now uses the timer thread instead of just counting.
  • CHANGE Full background debugging menu is now shown in User Mode to prevent getting stuck in a model. PBAs and end user only keys will not show the debug items.
  • FIX Editing border radius for multiple selected objects now works
  • FIX Sidebar hierarchy was not being hidden when loading a model which starts in usermode. This issue was introduced in 5.32p.


  • This version has an enhanced routine DLL calling architecture
  • The PLDLL API is now at version 9 and adds new functionality,
  • makes it easier to document parameters / columns and streamlines the
  • creation of DLLs for developers.
  • PL remains compatible with DLLs supported by 5.32r. The new API is
  • recommended but to get the most out of it you will want to rework
  • your code.
  • Licensed Planimate users can contact InterDynamics for the DLL API.
  • NEW The way the routines in a DLL are specified has been streamlined removing the use of many small tables which made the code hard to work with.
    The definition is mostly set up in two multi-column tables, one defining the routine operations and the other defining all the parameters.
    The framework includes many new DLL-side integrity checks:
- initialisation time testing of DLL parameters being
defined consistently in the 2 configuration tables.
- the option to provide parameter enums in the parameter
configuration table, which ensures the enum refers
to the parameter that the DLL coder expects
- testing within the Inline functions which access the various
parameter types to ensure that the data type of the parameter
matches the function being invoked on it
(enabled in _DEBUG builds only)
- range checking and error popup services for the coder
to use (see below)
This is on top of the PL side validation that is performed on the DLL before it is called.

  • NEW New callbacks enable a DLL to access PL's value formatting/parsing services, read table and read column titles and Get/Set table cells using formatted text (including "Free Text" columns).
  • NEW DLLs can now provide comments/notes on routine parameters to PL. They can also provide expected columns names and descriptions for columns.
    Note that the PL side UI is yet to be enhanced to make the most of the new information available.
  • NEW DLL Table Direct mode parameters can be specified as input or output. This doesn't affect what they do but it helps indicate to the user of the DLL what the parameter affects.
  • NEW DLL support for "optional" parametes which can use s.NullAttribute as a placeholder instead of actual data. This helps consolidate multiple calls in cases where some variants use additional tables (eg; for logging).
  • NEW A DLL can check if PL is running as a model or a compiled PBA. This can be used to enable/disable detailed debugging messages.
  • NEW Range checking services for Table Direct columns, rows allocated and rows in use, with option to display a diagnostic message on failure. The message will include the name of the DLL parameter and the name of the corresponding Planimate table that it is associated with (in the DLL call).
  • NEW PL's DLL configuration menu "Save Mappings" and "Load Mappings" can be used to save/reload the DLL parameter / attribute reference associations. This is useful if the DLL changes but the parameter names are (largely) the same. It helps reestablish associations when an input parameter becomes an output.
  • Other features:
  • NEW The Purge Attributes menu option now offers to purge unused label lists and broadcasts as well after it has purged the attributes.
  • NEW New system attribute s.Planimate64 will be true if the Planimate executable running is a 64 bit version.
  • FIX Better support for multiple monitors Table list etc. appear on monitor with PL window.
  • FIX Reference List for SubLabel and MultiLabel lists now use same handler as for regular label lists, the references window is bigger and enables browsing
  • FIX The simulation clock used to not update on the first item animating on a flow (ie: zero time) after an advance to time when the continue/pause dialog was disabled.
    The clock is now updated not only for this case but during advance to time.
  • CHANGE A model error for a model running in user mode in a regular Planimate (not a compiled PBA) with an editor key will present full debugging options.
  • CHANGE For an editor, PL will always enable pausing of a model when processing a broadcast regardless of the "Check For Pauses During BCasts" option, even in "User Mode". This will assist when a model being deeloped gets into a loop.
    If the user has a "run only" key or is running a compiled application, the plaform will act as previously.
  • CHANGE The "Recently loaded" models list now removes entries which fail to load. It will remember all loads including models set to load in user mode. As previously, the recent list plays no role for a compiled PBA.
  • CHANGE The "Run For System Close BCast" option now only applies if the model is in User Mode or a compiled application. If closing a model in edit mode, PL wont start the engine to send the close broadcast. If the model is already running, the close broadcast will get sent.
  • CHANGE A "Show Lock" set by loading a model with the "Defer Display Until Model Loaded BC" option is reset when switching to edit mode.
  • SPEED Handling of the advance-to-time dialog improved to reduce its load on the model. Was performing unnecessary testing every new-time event. Now uses the timer thread to rate control itself.


  • CHANGE Handling of reading dates into columns NOT formatted as dates is now different for clipboard import, edit file import and DAT file reads into Tables. DataSet2 operation is not affected.
    If the column isn't formatted for a date and the "Auto Column Type" option is not on (for clipboard or edit mode file read) then dates are not read and "-" is treated as a zero.
    Previous versions would read dates and "-" into columns formatted for Units (for example) resulting in large numbers as the date was translated into the number of seconds since the reference date. It meant that "-" in numeric spreadsheet data was incorrectly handled.
  • CHANGE ImportIntoView now uses a more forgiving parser so formatted values are handled when going into cells that dont expect any formatting. This makes its behaviour consistent with importing the entire table from the clipboard.
  • FIX LockDrawing now supported for table views. Important: if you lock drawing and change structure of a table (insert/delete rows/columns) then the view will become inactive even when you unlock drawing until the next panel repaint (whether forced by modeller or a panel change).
  • FIX Table Editor "Paste Over" now handles cancel properly
  • FIX RTF note window follows anchor rules of its parent link
  • FIX Impose minimum size on creating an RTF note to avoid creating an unclickable note (it was still editabler through link context menu)
  • FIX Scoped classes causing problems when deleting panels
  • FIX File name handling (extention) could cause first save to report error loading just-saved model.
  • FIX Setting the graphics properties for multiple selected button paint objects now sticks to the states rather than being lost upon a state change


  • NEW Value formatting mode "hhh:mm"
    This shows hours and minutes for the value but hours are not limited to 23, they can extend as required.


  • NEW Portal option "Show Above Items On Links"
    This puts the portal in a layer above items that are moving on spatial links/tracks, so it will obscure the items as they approach it. Partial transparency of the portal is handled.
  • NEW End User Option "Spacebar Continues Run" causes spacebar to continue the run, like Ctrl-G but only in paused mode.
  • FIX Changing a portal's using SetPortalIcon no longer hides the previous icons.
    NOTE You must repaint using at least RepaintObjectLayer after setting portal icon(s) with SetPortalIcon.
  • NOTE If you are using RepaintObjectLayer, ensure that the portal option "Monitor Occupancy" is turned OFF and dont use custom portal states.
    SetPortalIcon() is not compatible with these and if used, it will result in flickering and (potentially) the portal crawling off the panel due to a difference in co-ordinate systems.
  • FIX Dragged object clip only applied if object is in object label list
  • FIX Image mover would display errors if "thumbs.db" was present. This is a file created by Windows. The image mover now ignores this filename. Dont call a model "thumbs".
  • FIX On "New Model" or "Load Model", the internal icon cache is cleared. This removes any failed icons (red boxes) due to missing files. Previously these remained even if the icon file became available.


  • NEW Object property "ObjectPipeEmptyColor" enables the empty colour of a pipe to be changed on the fly.
  • FIX Reworked the way that table size changes are updated to views and the table editor. There were cases where an error during an import was causing the editors to receive hover messages at a time before the load had completed and they had been given an opportunity to adjust to the new table size.
    Look out for cases where: a table size change is not reflected in a view/table editor a table size change causes slowdown in a view/table editor
  • FIX WrapExtraIndent showed junk at beginning of line
  • FIX Map positioning of objects in edit mode
  • CHANGE Clipping of dragged portals on panels with a map is disabled. This helps position map nodes with very large icons.
  • SPEED Sped up Message and Broadcast item creation by optimising the transfer of item icon and icon properties between the original and message/broadcast items.
  • SPEED Tables with many columns handled quicker when clearing


  • NEW System attribute ItemClassInfoHide (also set by item class option "Hide Info Panels For Class" enables item info panels to be globally hidden for an item class.
  • NEW Portals have option "Transparent To Clicks In Run"
    This makes them invisible to mouse clicks when the engine is running (in edit or user mode).
  • NEW GetViewProperty and SetViewProperty have a new parameter, "Index" This enables the selection of a particular view when a number of views of the same type exist on a panel.
    A value of 1 selects the matching view closest to the back of the z-order, 2 selects the second-backmost etc.
  • FIX SetPortalIocn now preserves the objects centre rather than anchoring to the lower left corner.
  • FIX Hide spatial links panel option does not apply in edit mode, only when tools hidden/run modes.
  • FIX When dataset2 loads a table, any open table editor for a table being read is closed so the loader can process the table without the editor updating (causing slow down).
  • FIX Ctrl-paste over a selected object used to cause PL to close.
  • FIX Can select "None" for shadow colour


  • NEW The routine editor context menu has an option "Wrap Long Lines" which acts as a master control on line wrapping. It acts in addition to individual line wrapping control.
    The initial setting is set from INI option [Routine] WrapLines.
  • NEW INI option [Routine] WrapExtraIndent
    This enables additional indenting of wrapped lines to be specified.
  • NEW Routine list background colours can be separately set for routine lines, wrapped lines and "folded" code block lines.
    These are set in the [RoutineEditColors] section in the INI options editor.
  • NEW Paint properties:
TextShadow   : sets shadow colour for text
BorderRadius : sets radius for rounded borders

  • FIX Mapper handles 0 row table
  • FIX Tracks support hiding at runtime (when end points hidden)


  • FIX This release fixes an error with the "Bell Curve" and "Log Normal" distributions when the new random number generator (see 5.22m) is being used.
    The new generator had too much variation for these distributions.
    For example, an StdDev of 0.5 was acting as an StdDev of 0.7.
    The model option Engine - Use Old Random Number Generator determines if the old or new generator is in use.
  • NEW Routine line "Folding"
    left/right arrows in routine list can collapse/expand wrapped lines and code blocks like ITERATE, IF and SELECT.
    collapsed lines are indicated with ah + after the number.
    Editor operations like "Duplicate", and copy are aware of collapsed lines and will operate on all the lines inside them.
  • FIX Adding routine line at end of routine now auto-advances to Add New line, as it used to.
  • FIX Made Rounded Edge border thicker to avoid stray pixels

5.32k [new model file version]

  • NEW Routine List Line Wrapping Long routine lines now wrap over multiple lines in the routine list. The wrapping updates when column widths are changed.
    The routine editor has been extensively reworked internally.
    Wrapping occurs on the internal "font change" messages which means attributes names/labels wont get broken up across lines, the breaks only occur where a change in font/colour occurs. The rules of breaking lines may be refined later.
    Lines containing wrapped content are slightly indented to the start line. This will be made adjustable later.
    The line number (which doesn't increment for wrapped lines) is only shown on the first line of a wrapped group of lines. This makes it clear which lines are wrapped.
    At this stage you can select the individual lines in a wrapped block of lines, they all are equivalent and act on the entire routine operation, not just the section of text they contain.
    Moving between lines with the up and down arrows will be enhanced to (optionally) move to the start lines, skipping the wrapped lines. The block Start/Block End commands do this already.
    Collapsing wrapped lines (and code blocks) will be implemented at some stage, the design now supports it.
    There is a limit to the length of one routine line, 64KB which corresponds to one routine line wrapping over hundreds of lines.
    The INI RoutineFormatW parameter is now obsolete but left in so previous versions of PL can still use it.
  • NEW More border styles supported for rounded objects

"Rounded"        (original in 5.32j) - no edge
"Rounded Edge"   single pixel border (paint square can have thicker)
"Rounded Shadow"
"Rounded Shadow Double"
"Rounded Indent"
"Rounded Indent Double"
The "Graphics" dialog enables the rounding radius to be set for these modes. Dont overdo the rounding.
Rounded shadow buttons show an indent border on mouse down as well as offsetting their contents. The other rounded types only offset text (and image for paint button objects).

NEW Graphics dialog has a new text shadow button (next to text button). This sets colour for "shadow" text drawn under and offset to the text. A lighter or darker grey colour can make text look smoother.
Currently only implemented for paint objects and view box titles.

  • NEW Paint button state option "Offset Content" This will shift text and images in the button 2 pixels right/down, as used when a button is clicked.
    This is useful for "pressed" button states. If this option is not used, the square border indent styles offset text by one pixel but this get overridden by the "Offset Content" option.
  • NEW "Add To Object List" on multiple selected objects adds them all to object list (non objects ignored).
  • NEW Paint buttons with align-top text mode now wrap long text ie: multi-line text buttons. Be sure to leave some space in buttons as different systems with different font scaling will result in different wrapping.
  • CHANGE The settings under Settings - System Parameters in the menubar have been moved into the Settings Editor
    "Maximum Track Fill Search" and "Item Cache" are under Model-Engine "Number Separator" is under Model-End User.
  • CHANGE Removed forced text cropping from routine step editor. Given the routine list shows entire lines, it shouldn't be necessary.
  • FIX Reworked regular shadow buttons to make them cleaner when pressed.
    A lot of the button graphics was rewritten, check for side effects.
  • FIX DragHideMouse option now works for bend points
  • FIX Prevent "Stay paused for debugging" and other debugging options except Show Location for errors during engine initialisation. PL could get unstable if staying paused during an engine initialisation error.


  • NEW Show tip over path arrow heads in flow and object edit mode
    The INI option [Edit] PathArrowTips controls whether the tips appear in object/edit mode.
    Note: If multiple classes overlap, only one is shown in the tip, (clicking on the arrowhead will indicate others).
  • NEW Basic undo in Flow Edit mode (context menu or ctrl-Z).
  • NEW In Flow Edit Mode, Home and End keys go to start/end of current path
  • NEW Rounded border style for paint buttons, rectangles, views. This is experimental.
  • FIX Clear SlippyMap bitmap cache on exit as well as on new model
  • FIX The file browse dialog misinterpreted a "dot" in a directory name as the beginning of the extention even if it was followed by a slash.
  • FIX Planimate handling of model names with "." in them improved. in cases where the model contained ".' but no MDL extention.
  • CHANGE Removed ALT key modifier for opening palettes undocked.
  • SPEED Optimised spatial link shortest path search:
    prune recursion for conditions where the target cannot be "better" than the current "best" or its an unwanted leaf node
    keep track of circular loops without using a list/search
    reduce use of intermediate tables
    use a cache of recursion depth tables

    Has reduced memory churn significantly.
  • SPEED Optimised track route intermediate step finding using similar techniques to spatial links.
  • SPEED Clean up file token lookup/matching which helps with saving.


  • FIX Fix the way icons loaded using SetIconRemote() and SetPortalIcon() are managed.
    The previous method could cause a segfault because there was the potential for the icon cache to purge icons loaded by these operations.
  • FIX The Map Tile Cache option has been rewritten and now supports a limit on how many tiles will be kept in memory. (512 tiles).
    It is strongly recommended that the tile cache option be turned on for map views.
  • NOTE Map View - Ensure the "Log" options are turned off as they cause unnecessary processing even if the log file isn't being written.
  • CLEAN Cleaned up file loader, removed obsolete code and moved some specific code to the "user login" password file handler.


  • NEW Planimate now saves a CRC/check count at the end of MDL files. After a model is saved, it is quickly re-read to verify the CRC is OK. If an error is detected, PL will report a message during the save.
    Any message during a save indicates a problem that must be investigated.
    NOTE: Due to operating system caching, this test only guarantees that the model file was written out to the operating system, not that it was actually stored/transmitted correctly.
    NOTE: CRC is not checked on load at this time but you can manually trigger a check - see next item.
  • NEW You can test the CRC integrity of an MDL file using the Tools->Model FIle Info option. This has been enhanved to include details on the CRC for the file (No CRC if its older, CRC OK or details of an error).
  • NEW Added filter tool tip option to table views. Hovering over the filter area shows a tooltip indicating its a filter and the complete filter text.
  • SPEED Have streamlined the way files are read. This improves performance for loading models and text data files. PBAs also get more memory as some buffers were not being released after load.


  • NEW INI option [Edit] DragHideMouse
    Hides mouse cursor when dragging existing objects/paint objects
  • FIX Fix DropOff, it was ignoring drop limit after change in 5.32f

  • CHANGE Object context menus now include a line with their type and name, Selecting the option edits the name, making it easier to identify and rename objects in dense networks.
  • CHANGE View context menus now include view type/owning portal/data name The graph views no longer change the titlebar
  • CLEAN Clean up some mouse related code


  • NEW Paint Map has a new field in the edit dialog, "WGET URL"
    Using this and the WGET.EXE command line utility, you can make Planimate populate a local map tileset from an OSM compatible web server as you navigate the map.
    This setting is for editing only, it does not get saved.
    Refer to the Map (Paint Object) wiki page for details.
  • NEW Table views have option "Can Edit During Simulation"
    As for attribute views, this enables the table to be clicked while a simulation is running (model option "Mouse Clicks While Running" needs to be on).
    Dont use this option if the table has rows deleted/added at the time the user can click on it (including by any resulting broadcast).
    Use of this option with "Dont Defer BC on FEC" might cause problems if the broadcast changes panels etc.
  • NEW DropOff has option to drop items in reverse order.
  • CHANGE Planimate is more flexible with the use of multiple portal entries.
    If there are multiple portal entries and they are NOT specifically associated with an object, then Planimate will now check them for a flow matching the incoming item class instead of only checking the first portal entry.
    The test is for existence of flow, not whether its blocked.
    This change should not affect existing models since the order of testing hasn't changed and older models would stop if the first portal entry didn't have a flow of the correct class.
  • CHANGE Internal code renames (PickUp/DropOff objects)
  • FIX Fix this situation:
    user changing panel to one with dynamic sizing and a resize broadcast
    panel starts setting up and doing a size update, sends itself a resize broadcast
    the resize broadcast triggered a routine which forced a repaint
    the repaint used a service that the original panel change hadn't got around to preparing yet, causing PL to close.
  • FIX Log Driven graph horizontal bar / labelled bar was broken If the bar colour was not black, it would be misinterpreted and usually no bar would display.
  • FIX Column overlay graph's legend stays with anchored graph during panel resize.
    NOTE: be careful of clipping/minimum size, this will cause the legend to lose its relative position to the graph.
  • SPEED Was able to clean up portal testenter code (unused track test status info)


  • NEW CTRL-C/CTRL-V work in the table editor.
    CTRL-V is equivalent to "Paste Over"
  • NEW Added a preview to the icon mover which shows the selected icon in a larger area so the icon doesn't need scaling.
    Hovering over the icon shows a tip with its name, type and dimensions.
  • NEW Portals have "Horizontally Flip Icon" option which causes their icons to be flipped, useful when the portal should face the other way.
  • NEW Object property "ObjectFlipIcon" gives access to the portal "Horizontally Flip Icon" option. This property only exists for portals.
  • NEW When deleting an item class, PL will report # of steps / panels using that item class in the confirm dialog. It will also name the first panel that uses the class.
  • NEW The Show References dialog now gives more information on references inside views and paint objects.
    Where previously it showed "<none>", just indicating panel, it will now show:
    ViewAction:attributename ViewControl:tablename PaintButton:State PaintAction:Rectangle PaintControl:Button
  • NEW Tree selector supports doubleclicking node to select
  • NEW Tree-view based selector for Message Entries, Wormhole Entries and Wormhole Exits
  • NEW In object mode, objects will show a tooltip with their name and type.
    This can be enabled/disabled using the INI option [Edit] ObjectTips
  • NEW Calendar date format "DD.MM.YYYY"
  • CHANGE The model tree view and options tree views now by default no longer expands a node when you single click on it.
    Clicking on the [+] or navigating in the model area still does expand nodes.
    This makes double clicks work as they should.
    If you prefer single clicks to expand tree nodes in these dialogs, set the "[Edit] SingleClickTree" INI option to true.
  • CHANGE Internal and menu renames, changing "Stats" to "Views"


  • FIX Display of Pipes and spatial links on update of bend points
  • FIX If one of the system label lists (like object label list) had a label for an object starting with an "-" then the attribute editor would select that label if the value was 0 (which formats as "-") causing an unexpected change in data.
    The combo lists for such lists now include an explicit "-" to match the "0 case" and prevent this happening.
  • CHANGE Internal renaming of all Planimate/Toolkit source code modules as many names were very old and obsolete given some have been in existence over 20 years.
    Its not expected for this to impact the EXE in any way.


  • CHANGE Objects in the model hierarchy are now sorted in "natural order"
    This improves the ordering for portals with the same name and a number on the end
  • fIX If a combo box had an unsorted list of items and one of the earlier items was a superset of the entered text, it would be chosen in preference to an exact matching item that was further down the list.
    This appeared in the old style reference dialog when the INI option TableColumnNoSort was set.


  • NEW SetPortalIcon() operation
    Changes the current icon for a portal's current state to a named icon. The portal is hidden but not redrawn, the modeller should RepaintObjects() or ForceRepaint() once all the portal's are updated.
  • NEW SetIconRemote() operation will set the current item if its ID matches the id passed
  • NEW INI settings [Edit] NewObjectX, NewObjectY set position of automatically added objects
NewViewX,   NewViewY   set position of automatically added views
The y position counts from the top and the object/view's point being its lower left corner.

  • FIX Text formatted attributes display their text in the routine attribute popup in the debug/breakpoint dialog.


  • NEW Routine operation "GetNextLinkObject(from,to)"
    Returns the next portal object index that an item will travel to on a spatial link given the from location and the final target being 'to'.
    Returns 0 if none.
  • NEW Image Mover has an "All" button that will copy ALL images from the source to destination palettes. Note that any existing images with the same name are overwritten.
  • NEW Typing a name of a DB in the file browser in the Image Mover will create an empty DB if it does not already exist. You need to include ".DB" in the typed name.
  • CHANGE Changed Replace Dialog behaviour, it now stays on current from/to button after an edit, press TAB to advance to next button.
  • CHANGE TAB/Shift-TAB work in routine step editor
  • CHANGE TAB/Shift TAB in routine list will now step forward/back through lines
  • FIX Image Mover file browser dialog now lists all supported image types
  • FIX Fixed a bug with file extention handling in the case that a name is typed with no extention for dialogs supported multiple extention types.


  • NEW This version of Planimate now uses a newer DB file format which supports names up to 63 characters instead of 19.
    Any DB files you modify or create with this version will be unreadable with older Planimate versions.
  • NEW Tracks, Spatial Links and Pipes now have the "Update Map Co-ordinates" option on their context menu if they are on a panel with a PaintMap which updates objects during edit.
    This is useful for updating bend points which are "far" from the end point portals. Refer to Map Paint Object documentation.
  • CHANGE Removed forced upper-casing of icon names
  • CHANGE "Put Into Portal" now puts the portal at the top left of the panel.
  • FIX Attribute views linked to portals will now update properly.
  • FIX Track/Pipe bend handling with paint maps now works properly.


  • NEW Portals used on panels with Map Paint Objects have a new edit menu option "Update Map Co-ordinates".
    This is useful when working with Paint Maps which position portals in edit mode (5.31l) making it easy to set the map coordinate of portals and their adjacent bend points based on their screen position.
    Documentation updated:
  • NEW Map Paint object edit menu option "Clean Node/Bend Tables".
    This option should be used when portals are deleted from a panel with a map.
  • CHANGE Planimate will now delete portals even if they are linked into tracks/ pipes/spatial links. Any such links are also deleted.
  • FIX Replace dialog from/to lines now follow selection. From/To/OK ordering when working through the sub-dialogs.


  • NEW Paint map has option "Handle Drag During Object Edit"
    In Object mode (not paint) the map view now allows dragging and zooming (with wheel) the view with a mechanism for updating portals and bend points.
    The Map responds to drags only when the CTRL key is pressed. To zoom, give the map focus with a ctrl-click first.
    This reduces impact on object editing and drag selections.
    Detailed notes on this are on the wiki.
  • FIX Cell view with out of range column no longer closes PL when a row is added to the table.
  • FIX Preallocate route step instance table when initialising routes
  • CHANGE GetBendPoints() will get all bend points (links,pipes,tracks) if 0 is passed for link_type. The table should contain an additional column _linktype.


  • NEW Clicking on a broadcast entry in run paused mode shows a popup which will display the last time and last source of any broadcast.
    Clicking on the source takes you to that object.
    NOTE: only object sources are tracked at this time.
    The menu also contains a "Create One Now" option which used to be the default action when clicking on a broadcast entry.
  • NEW Menu bar option Menubar/Tools/Show Recent Broadcasts
    This pops up a list showing the most recent broadcasts, and (where available) which modelling object generated them.
  • CHANGE The "One Or More Views" message when adding an attribute view only appears if the destination panel already has a view for the attribute.
  • CHANGE New views appear at the top left of a panel.
  • CHANGE After selecting a broadcast for a table view, if a new selection is made and the user hasn't explicitly selected when the broadcast is sent, a dialog now notifies that the option dialog will appear next and why.
    This only appears once in a Planimate session.
  • FIX Changed the way map tiles are faded when the "Progressively Fade Upscaled Tiles" and "Anti Alias Upscaled Tiles" options are used together.
    Instead of becoming more transparent, the tiles are darkened.
    This works around a graphics bug in Windows 7 64 bit (GDI+).


  • FIX "Dont Show Zero" column option now prevents 0 appearing in the label list dropdown combo's field.
  • FIX Mouse scroll broadcast should now sense continuous scroll wheels better
  • FIX A repaint occuring in a drag now works again during simulate mode (was being locked out by redraw handling code)
  • FIX Changed alpha/offset for shadow (eventually will be settable by modeller).


  • FIX Fix routine editor issue causing random PL close
    The Routine Step Editor was enhanced for resizing in 5.30e (December), causing code to be called that used a variable that hadn't been initialised at that time.
    Most of the time the variable would be NULL; PL would fail in the rare cases that it wasn't.


  • NEW Object property "ObjectHide"
    This sets a runtime property on objects which defaults to off. When set:
    ** Object Icons wont display ** Objects wont animate items to their entry/exit ** Tracks/Links wont show items in them and not show their outlines ** Pipes wont display ** Object Names wont display
    Currently implemented for Portals, Tracks, Links, Pipes
  • NEW Item Class System Attribute s.ItemClassScale
    This sets a master scale factor (as an integer percentage) for ALL items of the class of the current item.
    Changes to this will apply to all items of the class upon the next display update or redraw.
    The value resets to 100 (no scaling) at the beginning of a run. The item specific s.ItemXScale and s.ItemYScale are applied in combination with the master scale factor for the item's class.
  • NEW Have rewritten how Planimate Based Applications (PBAs) are compiled.
    The codebase that compresses & encrypts DataSet2 files is now used when compiling PBAs, making them significantly smaller when a large model was part of the application.
  • NEW Added more buffer checking to catch string issues particularly in the routine editor and in formatting references.
    Please report *any* "system error" type messages as they indicate an unexpected situation in the platform.


  • NEW Planimate Map paint object rewrite & enhancements:
    Key new features: Map can dragged with the mouse and zoomed with the scroll wheel (with some simple model support).
    Summary Of New Features:
    Option:"Log Successful TIle Request" Option:"Progressively Fade Upscaled Tiles" Option:"TMS Map Tile Format" Supports map data in TMS format as used by MapTiler.
    New Properties: "Longitude", "Latitude" (retrieves centre position) "FixedMapZoom" (control of the fixed zoom option)
    New Map Routine Operation: "SetLatLongXY()" This gets the map to determine the closest centre Longitude/Latitude which maps a pixel within the map with another co-ordinate. This supports dragging the map with the mouse.
    Refer to wiki page for details.
    Useful information on map tile formats:
    Thanks to all who have contributed to progressing this capability.
  • NEW Modeller can now receive a broadcast when the scroll wheel is turned. This is enabled using the "Broadcast Scroll Wheel Events" Panel->Engine option.
    The broadcast is sent is "_Panel Scroll" and it includes attributes "_panel" and "_scroll".
    "_scroll" is negative when the wheel is rolled up and +ve when rolled down.
    If a viewport or popup has focus, the broadcast is sent to its subsystem.
  • NEW Label list "_paneldrag_commands" has names/values of commands sent by the _panel_drag broadcast
  • CHANGE Panel drag broadcasts are now also sent during simulate/run mode if the "Mouse Clicks While Running" option is selected.
  • CHANGE GetBendPoints() and SetBendPoints() operations will now also match columns named "_x" and "_y" if "X" / "Y" are not present
  • FIX Cutting a portal with a visible subsystem (eg: from the hierarchy) would close PL
  • FIX PL now handles animating items at an extreme zoom. Previously when an item left a spatial link or track to enter a portal, it could cause the animation manager to stall (releaseable with ESC key).


  • NEW Paint properties for paint buttons with images:
    ImageFrameCount Gets the number of frames of a multiframe image/animated GIF
    ImageFrame Gets/sets current frame of a multiframe image/animated GIF. Frames are numbered from 0.
    You will need to set paint property ImageTimeStep to zero before attempting to set the frame number as the default is to step through frames automatically.
  • NEW Routine operation "RepaintPaintObject"
    This repaints a single paint object plus all the objects/items in the animation layer.
    It is useful for redrawing maps and image paint objects which are not set to display in the animation layer and which do not change position and size, but just change their contents.
    Using this can avoid ForceRepaint, leading to smoother updating when paint objects like the map view are used.
  • FIX Reindex label list would lead to problems if a subsequent file load attempted to look up labels. The lookup would fail, causing duplicated labels to be created.
    It would be OK if the model was saved/reloaded after the reindex, but by then bad references to duplicated labels could exist in tables etc.
    This issue was introduced back in 5.24m and was caused by a cache not being rebuilt after the reindex.
  • REMOVE "Select License Key File" option removed from user mode menu bar.
    Modern models shipped as EXEs do not use this.
  • REMOVE The Load and Save DataSet options have been removed from the menubar.
    These were used by DataSet1 which is now obsolete.
    The button actions supporting dataset1 are retained for now but anticipate them being removed.
  • CHANGE The "Help For Current Model" option in the edit menubar and "Help..." option in the end user default menubar now only appear IF an explicit Help File Name has been set in the dialog at Menu Bar / Edit / Edit User Model Info.
    If you had the help file the same name as the model, you'll need to edit the dialog and enter the name for the help option to be available.
  • CHANGE The /SCENARIO command line option no longer loads a dataset1. Instead it sets s.LoadFileNamePath to the string. On startup a model could test this string for non empty and use it to preload a dataset.
    NOTE: For a PBA you can omit the /SCENARIO= and just provide a filename to achieve the same effect.
  • CHANGE Command line options descriptions updated, "Planimate /?" for a listing.


  • NEW Enhancement to text expression matching as used in column filters.
    '!' now has special meaning if it is the first character of a match term, it makes the match term a "NOT" term.
    A single term such as "!foo" will match everything except "foo". Likewise "!c*" will match everything that doesn't start with the letter "c".
    When a NOT term is followed by other match terms, it acts as an excluder. For example, "!cat;c*" will match all items starting with "c" except if its "cat" since the "!cat" part removes it from contention for further matching.
    In summary: When a NOT term is before another term, it acts as an excluder of anything matching the term after the "!". When a NOT term is the last term, it acts as an includer of anything NOT matching the term after the "!".
  • NEW Options added to Paint Map
    "Disable Anti-Alias For Downscaled Tiles" (default on) etc. Fixed zoom mode now supported.
  • NEW Track speed restriction now supports running trains faster than the nominal speed of the track (restriction level 100).
    Running at a restriction of "150" will run the train at 1.5 times the speed the train would run at if the restriction was "100".
  • FIX A table with "ClearOnSave" option could cause views to generate an error when saving.
    This should no longer occur.
  • FIX Changes in 5.24i had left the "Run In Real Time" model option dysfunctional - pending events were not being processed by the regular continue timer events.

  • CHANGE The "Directly Handle Clicks" option on a viewport now only applies 1) when running model 2) when in user mode
    This makes it easier to edit viewports. It also reduce inadvertent
    editing through a viewport which is beyond their intent.
  • CHANGE Updated internal compression libraries used for DataSet2


  • NEW In another significant leap in capability, Planimate now supports displaying maps stored as multiple segmented tiles and at various zoom levels.
    The format supported is known as "Slippy" as used in Open Street Maps and is described here:
    A new paint object, "Map" is similar to a paint image except you provide the name of a folder (where the map data is located). You specify the map range to display using longitude/latitude ranges in degrees.
    You can use new paint properties to set the view dynamically. "LongitudeFrom", "LatitudeFrom" (top left (NW) corner "LongitudeTo", "LatitudeTo" (bottom right (SE) corner
    Setting a latitude range is optional. Its best to just set the centre and let the map determine the latitude range based on the longitude range.
    The map object looks after selecting a resolution/zoom of tile to give the best display. It will automatically revert to lower resolution tiles for regions where high resolution images are not available, mixing them dynamically as needed. This is optional.
    New routine operations LongLatToXY() and XYToLongLat() work with the new Map object to efficiently translate co-ordinates (in a table) between panel pixels and map co-ordinates.
    Further details here:
  • NEW Routine operations MinIndexIFMatch and MaxIndexIFMatch
    MinIndexIFMatch(Match Column, Match Key, Data Column) returns the first row with minimum Data Column value for rows where Match Column matches Match Key.
    Returns 0 if no rows match.
    MaxIndexIFMatch does the same except finding the maximum.
  • FIX Prevent viewports without click-through being draggable during a run.


  • NEW Change object -> File mode "SaveWindowImageMemory"
    This works like SaveWindowImage except the image is put into the icon/image manager with the name specified. Any existing references to that image name will update when next redrawn (or animated).
    The first data target should be the portal index of the subsystem image to capture.
    This is useful for creating dynamic buttons which display the contents of other panels in the model.
  • NEW Dial has option to "Edit Owner" which is useful when its hidden.
  • FIX Saving image of a panel no longer flickers its contents
  • FIX Standalone EXE no longer supports ctrl-alt-shift to open panel in a popup.
  • FIX Shadows shown for objects in object mode
  • FIX Better defaults for distributions when original is constant 0
  • FIX Missing redraw for advance time dialog and distribution graph
  • FIX Dials now follow anchor rules of parent views (note unlike attribute views they will stretch/sink if both ends are anchored).
  • FIX Drawing issues of log driven graph with "Defer Updates" on causing missing updates.
  • FIX Viewport "invalid handle" error message, situation as follows:

- Model contains a viewport inside a viewport
- Viewports configured to directly handle clicks
- Inner viewport has the keyboard focus because it was clicked
- Model is running and user presses Ctrl-T
Normally this stops the engine and viewports hide/reinitialise.
In attempting to hide the inner viewport, the management structure for it was locked by the key event it was processing. This prevented it closing until the event is done.
The outer viewport (unaware of inner viewports) then forcibly closed the inner window, leaving the management structure with a broken window handle. Integrity checks detected this.
Was able to intercept a message to inform the management structure of its window being forcibly deleted.

  • FIX Showing references for an attribute view clicked within a viewport within another viewport.
    Note that viewports were not designed for editing nor nesting so take care with backups if you use them for this.
  • SPEED Further speed up to panel draw/redraw and switching panels. Fixed inefficient handling of queue/dispatcher overflow counter icon (forcing redraw/memory reallocation)
  • NOTE The following Dial modes are being reviewd. Some or all may be removed:
    Lamp CheckBox Value Label Image
    The intention is improve the remaining modes with supporting bitmaps etc.
    Paint buttons and attribute views can replace these capabilities.


  • NEW Paint button state options

"Flip Image" - flips the image left/right "Image Shadow" - draws image shadow (PNG/GIF)

  • NEW Portal option for Shadow (PNG/GIF images only) (note: shadow only shown during run)
  • NEW Item class option for shadow (PNG/GIF images only)
  • FIX Status line redrawing when setting activity string now uses correct font
  • FIX Changing model animation update interval now works when triggered from a broadcast.
  • FIX Reduce repeated data when clicking on dials
  • FIX Drawing PNG/GIF images with image offsets set beyond the source image range
  • FIX Paint-Image objects now also work with PNGs
    Note: the difference between a Paint-Image and a Paint-Button with an image is that the paint image doesn't keep the image in memory.
  • FIX Glitches with rotated icons introduced 5.31


  • FIX Fix tooltip/hand cursor registration - was causing problems for buttons in the animation layer


  • NEW The Planimate Animation Engine has been significantly revamped. Code consolidation, refactoring and new graphics APIs have boosted performance and enabled new capabilities.
    Please look out for any animation issues while the new framework settles in.
  • NEW Planimate now supports "PNG" image format for icons (object/item), paint buttons and the paint image object, including full support of per-pixel alpha blending (variable transparency) with rotation, scaling and flipping capabilities.
    PNG images which are not rotated draw faster (flipping is OK). BMP is fastest unless using transparency, then BMP is same as unrotated PNG.
  • NEW Planimate now supports animated GIFs in the same way it supports multi-frame BMPs using the IMAGE@01 IMAGE@02 etc naming notation.
    Animated PNGs are not supported (not standardised) but using the IMAGE@01 naming convention should work for PNGs.
  • NEW Paint objects now support high performance animation. A new paint object option "Show/Update In Animate Layer" makes the paint object behave more like an icon.
    With this option on, the paint object will be repainted every animation update (when all the other icons get updated).
    This means any positional (x,y) or property (state, zoom, transparency) change to the paint object will be automatically reflected on screen when the next animation update occurs, with no need for a wlow "force repaint".
    Paint objects with this option on appear behind object icons but in front of views and regular paint objects.
    All the objects with the option "on" retain their relative paint z-order.
    This option needs to be used with care, particularly with the paint "Image" object and JPGs. By design, this object does not cache images in memory, which can lead to high CPU usage.
    You can turn the option on and off at any time using the paint property "ShowInAnimateLayer". Turning the option off for objects which are not changing will improve performance but can cause z-order inconsistencies if there are overlaps with other objects.
  • NEW Paint buttons support multi-frame/animaged GIFs for their state images. This looks nice for hover states.
    Paint objects default to an update interval of 100ms. This can be set using the ImageTimeStep paint object property.
    When using a multi-frame image with a paint object, the ShowInAnimateLayer option should be turned on.
    For items, the systme attributes: "ItemImageXStep", "ItemImageYStep" and "ItemImageTimeStepMS" are used to control how frames are chosen.
    For objects, the object properties are: "ObjectImageXStep", "ObjectImageYStep" and "ObjectImageTimeStepMS"
  • NEW Paint objects have new properties "Transparency" (0 = translucent, 255 = opaque) "ImageRotation" (angle in degrees) "ImageTimeStep" (interval between images in milliseconds)
    They are defined in the _paint_properties label list and can be set/read using the SetPaintProperty() and GetPaintProperty() routine operations.
    Currently they are implemented for paint buttons with an image and no frame/text/background colour.
    Currently this parameter is not saved nor editable This will be reviewed as performance is evaluated.
    The intention is to add transparency for paint button frames and text. Initially you can use images for these effect.
    Theseertise are stored per paint button state, so changing a button's state can change its appearance/behaviour
    ImageTimeStep is useful with images with multiple images such as GIFs.
    NOTE: Using rotation slows down drawing, if you have a fixed rotation and many icons, you might want to use pre-rotated images.
    NOTE: This transparency is in addition to the per-pixel transparency that PNG images support.
  • NEW Paint buttons now support being redrawn whilst pressed down. This enables use of a background broadcast to update a button via a RepaintObjects() operation, enabling animated buttons.
  • FIX There is a fix in behaviour with button hover states. If you mouse down on a button then drag to another button, the current button retains the hover selection (and continues to track mouse entering/leaving it) until the button is released.
  • NEW When editing, you can now Hide paint buttons like other paint objects. The option has been renamed to "Hide (Temporary Editing)" to reflect the intent of the option - a temporary hide to facilitate editing.
  • NEW Can edit the view order for Portals. This is useful when animating then. The order can also be set numerically.
  • NEW Paint object view order can now also be set numerically.
  • NEW Paint object property "ViewOrder" enables the view order of a paint object to be read and set by a model using the SetPaintProperty() operation.
  • CHANGE Planimate now makes use of the "GDI+" graphics framework in Windows. This library has been standard since Windows XP.
    Be aware that Windows 2000 did not include GDI+ but if dotNET is installed then it will be there.
    It may be necessary to consider this if clients are using old (and now obsolete) versions of Windows. GDI+ can be downloaded here:
  • SPEED Portal Animation performance significantly boosted. Smoothly animating 2000 portals (BMP images) is now viable. Use s.CurrentPortalX and s.CurrentPortalY to position them.
    If your model is animating over time, you dont need to ForceRepaint() or RepaintObjects() as long as an animation update interval is set.
    If you are animating in a loop, use RepaintObjects(). This now also works with paint objects with the new Animate Layer option described above.
  • FIX Icon palette behaviour when an image of a different type but with the same name is re-selected is improved but some design issues mean its best to reload PL if you change say a bitmap to a JPG as its caching can be problematic.
  • FIX Fix leak in "Fit To Size" menu option for paint buttons
  • FIX Fit To Size on paint objects now supports having a single border.
    Previously border was not taken into account.


  • NEW Routine editor lines are coloured at a finer grain. Table cell references in particular will have their row and column indicies correctly coloured
    The colour for Routine, System and Item attribute references can now be explicitly set in the INI editor RoutineEditColors section.
  • NEW Options editor shows colours and RGB values for palette entries, making it easier to tweak the routine colours.
  • FIX Custom colours being specified as #RRGGBB were being incorrectly parsed. Any INI #RRGGBB colours set up in 530n will need to be checked.
  • FIX Route list is better about retaining selection after a cancelled edit
  • FIX Model tree correctly shows object name when a pasted object is also added to the model object list
  • FIX Paint buttons were being sized one pixel too wide/high if an image was determining their size for a state.
  • FIX Planimate should no longer create PL_Media folders unless it has something to put in there.


  • NEW Pipe option "Clear 0-Time Display When Stopped"
    When enabled, the pipe will clear itself when the run control attribute becomes 0. This can be useful in some cases where you want to clearly show that the pipe is inactive.
    This option only impacts "0 time" pipes since they effectively dont have capacity/values in them.
  • NEW Can browse views of a table
    Table Editor -> Table -> Show Views, also in the context menu when you right click on a table in the table list.
  • FIX Pipes were mismanaging FEC events if a bin update triggered a control attribute change (eg: endpoint and control same attribute). This generated a linkedlist error


  • NEW You can set the page orientation and paper size defaults for a print job.
    Two new system attributes (and label lists) enable this:

s.PrintOrientation (_print_orientation label list) s.PrintPaperSize (_print_papersize label list)

If the values are 0, the default or previous value used in the current session of Planimate will be used. After a print, these values will be set to the actual selections made in the print dialog. s.PrintPaperSize can have many other values apart from the few included in the label list. If you need to preselect a specific size not offered in the default list, check the value after printing a page. NOTE: Don't add to the _print_papersize list as Planimate controls it NOTE: These attributes must be set before the first page is queued for printing.

  • NEW Column option "Dont Show Clear Value" (and property "DontShowClearValue"
    This is like "Dont Show Zeros" except it tests against the column clear value instead. This enables a custom value to be hidden from a table view display.
    This option can be used along with Dont Show Zero.
  • NEW Paint lines now have visibility control, click action and action control. They also have the option for tip text but this uses the area the line covers.
  • FIX Added an explicit "None" button to the icon selection palette
  • FIX Routine reference editor now corrects case for any attributes/ table names typed in to match the case of the actual attribute/ table.
  • FIX Row line height for copied table is now copied
  • FIX Can change "Advance For" time from within the breakpoint dialog menu. This is useful if an error occurs while advancing-to-time and you want to watch the animation.
  • FIX Closing routine editor with the window minimised no longer saves the window position as a minimally sized (but not minimised) window.


  • NEW Default colours used in the routine editor can be edited using the Model Options editor / Platform INI / RoutineEditColors section
    The colours with "Inv" at the end of their name are used when the system is running a colour scheme where window text is lighter than the window background colour.
    Colours are either decimal palette indexes (0 = black) or #RRGGBB format
  • NEW "Natural order" sorting is now default and used in:
    • label list editor
    • table column filters (drop down combo)
    • label select dialog (old style pop up)
    • dropdown combo but ONLY if "Dynamic Combo List" is selected for the table column or attribute view.

This means labels with numbers are sorted like this: 1,2,3,10 instead of 1,10,2,3

  • NEW Routine operation : UpdateLoopEntryDelay
    Sets the loop entry delay to a new value. This can be performed when a train enters a location. The delay is measured from when the original loop delay started. If no loop delay is active, the operation does nothing.
    If the new delay has expired, the loop entry end will occur at the current time.

  • FIX PL now gives a helpful error message if an attempt is made to call a DLL which is not compatible with the architecture. (ie: 32 bit versions can only call 32 bit DLLs and same for 64 bit).
  • FIX Memory leak in string management for filter list generation


  • CHANGE Re-issue changing comment split character to "//" The release notes below have been updated.


  • NEW Time Unit mode "Calendar D Mmm Y hh:mm"
  • NEW Broadcast Entry can show/browse indirect sources (eg: in routines) of broadcasts.
  • NEW Routine operation CountIfMatch This returns the number of times a column in a table contains a value
  • NEW Routine editor shortcut '{' and '}' take you to the previous/next "CASE" line in the routine.
  • NEW Menubar option Panel->Replace Reference
    Enables replacement of a reference by another reference, scoped to the current panel and its contents/subsystems.
  • NEW Option on Cell Views "Don't Follow Table Colours"
    By default cell views will follow the colour set for columns text/background in the table. Turning on this option prevents this, enabling the Graphics settings for the cell view to be effective.
  • NEW You can now "Move" and "Copy" attributes to any portal in the hierarchy (menu options via the Attribute button in the editor, replacing the Migrate To Owner option).
    NOTE: Views will remain associated with the original attribute if it goes out of scope.
    NOTE: A copied attribute could "cover" up access to the original or another attribute with the same name as it. Take care with this.
  • NEW Enhancement to routine line comments in the routine list
    If a comment line contains the text "//" (2 slashes) then that acts as a separator, controlling what displays in the routine description and comment area.

text  : displays in both areas, as usual //text  : displays on the right only, leaving the routine area blank text//  : displays on the left only, leaving the comment area blank one//two  : displays "one" on the left and "two" on the right.

  • FIX Changes in 5.30d caused inter-object references to not be properly managed when objects moved between models and deleted. This could cause a problem with a Message Dispatcher in a portal that is moved to a different model without the Message Entry which it is pointing to being also moved.
  • FIX FormatForList() error reporting had a bug when the label list was not found.
  • FIX Double clicking change object with a minimised routine edit window restores the editor window.
  • FIX Condition Table (multi condition switch) is resizeable
  • FIX Combo boxes update their list with the current selection matching the initial text in their window. This makes using the arrow keys to change the setting (without the list dropped) more consistent.
  • FIX A new 'control' column inserted by the track network build has its cells set to '100.0' (full availability)
  • FIX Copying attributes did not update internal label scope


  • NEW Expressions can use these functions to perform bitwise operations
    BitAnd(a,b), BitOr(a,b) and BitXOR(a,b)
    Treat a,b as nearest integer and perform the binary bit operation equivalent to C's "&", "|" and "^" operations.
    This can be useful when a number of states has been stored into a single number using the combination of powers of 2.
    eg: BitOr(32,64) = 96
  • NEW Pipe Broadcasts have been enhanced. 3 pipe options control what events get broadcast:

    "Broadcast: Target at Target Upper Limit" (previous PL versions had this as the pipe broadcast limits option)
    This can be used when "Source/Target Limits" is also enabled which enables the "Target Upper Limit" attribute.
    The pipe will send broadcasts when its target is at or above the target upepr limit value.

    "Broadcast: Source at Source Lower Limit"
    This can be used when "Source/Target Limits" is also enabled which enables the "Source Lower Limit" attribute.
    The pipe will send broadcasts when its source is at or below the source lower limit value.

    "Broadcast: Load Limit at 0"
    This can be used when "Load Limiting" is also enabled. The pipe will send broadcasts when the "Load Limit" attribute is depleted to 0.
    This is useful when a pipe is to stop after transferring a given amount of material.

The broadcasts set these item attributes:

_pipeid  : the pipe object index (or 0 if no index set) _pipeflags  : reason for the broadcast.

The "_pipeflags" value is a bitwise combination of values depending on what broadcast options are enabled and on the condition the pipe is in. The values are in the "_pipe_bc_flags" label list and are: "TargetAtUpperLimit" (value 1): The target is at or above the target upper limit "SourceAtLowerLimit" (value 2) The source is at or below the source lower limit "LoadLimitAtZero" (value 4) The load limiting attribute has reached 0 eg:a vlaue of 7 would indicate all 3 conditions have occured.

NOTE: If the pipe direction is reversed (control attribute -1) then source and target are reversed and the "Target Lower Limit" and "Source Upper Limit" attributes are used for limit testing.

NOTE: Broadcasts will be repeatedly sent once a limit condition is reached. You must reset the pipe's parameters or use the control attribute to stop the pipe until it is needed again.
  • NEW Label list selection popup has a checkbox to hide/show system label lists (names start with an underscore).


  • NEW Switch displays extra "Target Cache" info in its runtime click menu (this should normally never appear)
  • NEW Dispatcher runtime click menu has new "Unblock" option to assist in debugging stuck trains
  • NEW Routine operation "SetIconRemote"
    This enables setting an icon for an item somewhere else in the model. ie: you pass the item ID rather than it working on the item at the change object.
    You might have read this by querying a spatial link for its contents, or you are tracking it in a table as an item moves through the model.
    TIP: if you pass the item ID of the item at the change object (s.ItemID) then the icon of that item will be changed, no searching is needed in this case and the location can be 0.
    Location can be a portal or object id containing the item. If its 0 the entire model is searched - this is potentially very slow (see the exception above).
    Planimate only searches spatial links, tracks, multiservers, queues and dispatchers. It searches hierarchically if a portal or 0 is specified as the location.
    The icon name should be text or a label. PL will search its usual DBs for it. Dont include an extention.
    *** IMPORTANT NOTE ***
    Since PL cannot know what icons you may load, it has no way to make sure the icon is included in a compiled PBA.
    You have two options to deal with this:
    option 1: Include any dynamically assigned icons in the (modelname).DB file
    option 2: (preferred) Have a private panel in your model with an object like an exit (low overhead) configured to use the icon you will be using with SetIconRemote().
    This will ensure the icons get packaged in the PBA and has the added benefit of the icons being pre-cached by Planimate since the platform knows they are used when the model/PBA loads.
    TIP: you can copy the icon name from the combo at the bottom of the icon browser / image mover palettes.
    Note that no screen update is done by this operation. Icons will update when they next move.
    Icons in links will update on the next movement update. Items waiting in queues and dispatchers can be updated using RepaintObjects(), which is faster than using ForceRepaint()
  • FIX Fixed an issue in the expression handling that caused operations strlen(), strcompare(), strfind() and strchar() to stop with an error if their input string was a Column reference (which is valid as it resolves to the column's tuple name when treated as text).
    In previous versions this was worked around by using a temporary text attribute. This should not be necessary anymore.
  • FIX Button action with menu bar option "Advance" (time or interval) would not perform the advance if the button was clicked whilst the simulation was running (clicks during simulation enabled)
  • FIX References format more consistently in routine editor
  • FIX Dispatcher edit dialog renamed "Max Length" to "Max Capacity" for clarity
  • FIX DLL call TableDirect was passing reduced total row/column count if a cell reference was passed instead of an entire reference. The proper counts are now passed to the DLL. Note this is an unusual case as the norm is to pass an entire table refefence.


  • NEW Routine operations QuerySpatialLink and UpdateSpatialLink
    These enable items on the link to be read into a table and changes made to items already on a link.
    They both expect a table with columns:
    "ItemID": set to id of item use "-1" for UpdateSpatialLink to skip row

"Ratio": position on link (based on its nominal direction) 0.0 = start object, 1.0 = at end object use "-1" for UpdateSpatialLink to retain current position "TotalTime": total time to spend on link, use "-1" for UpdateSpatialLink to retain current total time "Direction": 0 = forward, 1 = reverse

"Stopped"  : 0 = normal, 1 = item is suspended at its current position

  • TIP: Spatial Link Times The time an item would have spent on the link had it started at its current totaltime, given its current offset, can be calculated as follows:

time_elapsed = totaltime * ratio (direction forward) time_elapsed = totaltime * (1.0 - ratio) (direction reverse)

The time an item has remaining is hence: time_remaining = totaltime * (1.0 - ratio) (direction forward) time_remaining = totaltime * ratio (direction reverse)

  • NEW Can now stop an item on a spatial link.
    This is achieved using the "Stopped" column in tables passed to UpdateSpatialLink().
    Unlike using the control attribute which stops the entire spatial link. stopping a single item does not prevent others from entering the link.
  • NEW Table column list editor now has editing of column properties when multiple columns in the list are selected, and multiple selected rows are retained for the next edit.
    This means properties including format, width, colours, font and alignment can be edited for many columns at the same time.
  • NEW Numeric operation fmod() is a floating point modulus operation
  • FIX Handling of 0 row tables in column editing


  • NEW Table columns can now be editied and reviewed using a list. This is reached from within the table edit window, under the "Column" menu item "Column Editor".
    Right clicking on a single row is like right clicking on a column in the table editor, properties can be changed and columns inserted/dusplicated/deleted.
    If the table has no columns, a right click in the list enables one to be added.
    Multiple rows in the list can be selected, right clicking on these enables delete or "Paste Over" (see below)
    The "Options" column in the list summarises a few of the column option settings, using single letters, as follows:
    C: Zero at start R: Round display P: Protect from edits Z: Dont show zeros H: Hide repeated values V: Precise value edits F: Disable column filter
    The dialog is resizeable and remembers its last position within a Planimate session.
  • NEW "Copy" and "Paste Over" column edit options.
    "Copy" makes a copy of just that column in the table copy/paste buffer. Its useful with the "Paste Over" option which requires that a single column is in the copy buffer.
    "Paste Over" enables one or many columns (using the new Table Column List dialog) to have particular properties replaced with properties of the column in the copy buffer.
    You can select which properties will be replaced, others will be left alone, including Format, Width, Alignment, fonts and colours.
    Replacing Data and Cell Properites is also an option but it is off by default. Note with these - if the copied column has more rows than the column(s) it is pasting over, only the available rows in the destination table are filled in.
  • NEW Right clicking on a table in the Table List dialog now shows a context menu with options including to edit, use the new column list dialog, rename and resize and delete the table all without having to go via the table editor.
    Note that selecting the column list dialog from this context menu will also show the table editor in the background whilst columns are being edited as the editor's services are needed by the column list dialog.
  • REMOVE Removed column property copy, its superceeded by the new "Table Column List" dialog.

  • FIX Showing system attributes in a model error that occured at the start of a run could cause PL to close if the portal being viewed had not been initialised yet at the time of the error.


  • FIX Found and fixed issue with VS2008 builds of 32 bit Planimate.
    An inconsistent setting in the build projects was the cause of the problem.
    This release is again built with VS2008 and has better performance than the VC98 build (5.30h2).
    (the 64 bit version is unaffected; 5.30h remains current for it).


  • FIX 32 bit version rebuilt with VS98 as VS2k8 compiler still has issues even without SSE2 enabled. This will be identified in due course but from now VS98 will be used for the 32 bit builds


  • FIX Fix a special case where a dispatcher with the "Look Through In Lookahead" option on was not propagating unblocks behind it if it contained an item.


  • NEW The "Advance Time" dialog which appears when PL is fast forwarding a run has been reworked.
    It now uses Windows system colours and includes:
    • model name if its not a standalone application
    • last loaded dataset name (if its been set by PL or the modeller)
    • an approximate ETA estimate
    • model time updated more regularly
  • NEW Planimate option (Run): "Advance Time Dialog In Main WIndow"
    If this is set then the advance time dialog will not be a floating popup window but instead fixed in the model's main window.
    This can be useful when many models are running on one system and the association between advance time dialogs and PL instances gets confusing.
  • NEW Planimate option (Modeller): "Disable Paint Inheritance Update"
    This prevents paint object changes from being propagated to inherited objects. It may be useful in cases where dynamic panel sizes are used along with paint inheritance.
  • NEW Added "Purge Attributes" in routine editor menu
  • FIX The calendar code now handles centuries which are not a multiple of 400 years (eg: 2100AD) as non leap years.


  • FIX This is a rerelease of 5.30e, compiled with the original 32 bit compiler (VS 98). It seems the new compiler configuration for the 32 bit build 5.30e has problems with combos, no further details available yet.
    The 64 bit release of 5.30e seems OK.


  • NOTE Due to significant rewrites, verification of run consistency with a previous stable version (5.30c) is recommended.
  • NOTE The oldest computer spec that can run PL has been increased. PL requires processors at or newer than 2003 generation CPUs which have "SSE2" instruction capabilities (which boost math performance).
    This means at least a Pentium 4 or an Athlon 64. Recent Intel Core, Intel "i" series, Atom and AMDs are fine.
    This does not affect 64 bit versions of Planimate.
    This looks like a useful guide but should not be taken as official.
  • NOTE The 32 bit version of PL is now built with Visual Studio 2008, improving performance.
  • NEW Planimate calling DLL API has been enhanced
- DLL can now query PL clock time and engine state
- DLL can post a real time tick broadcast

  • FIX If an error occurs during model initialisation, any defer draw is cancelled (if its not a standalone EXE).
  • FIX Can now break out of "fill intermediate route steps" during model initialisation, and it displays the state in the titlebar so you know thats what its doing.
  • FIX Made routine step editor resizeable and retain its position throughout an edit session
  • FIX Made more popups resizeable (like the references browser).
  • FIX Increased formatting width for references to reduce instances of cropping away of details in longer references.
  • FIX An attribute, cell or table view in very close proximity to a model object could display garbled content after an edit until the model was continued.
    This was a graphical issue and the platform now ensures such cells are redrawn cleanly.
    Previous version models might be forcing a repaint to get around this. This will still work but should be unnecessary now.
  • SPEED Significant amount of code was refactored for performance ** handling of table index validation (and clearer out of range message) ** track code (train direction check) is now lookup based ** rewrote how attribute references read and write to tables and attributes ** matched row operations reworked to improve performance particularly with column lookups. ** internal renames of code that should not affect anything.


This release marks a milestone in Planimate's network modelling abilities.

It's now possible for models to add Portal copies and Tracks to themselves "on the fly" without having to stop/restart.

It is a major step towards network models that build and update themselves from live databases (continuing to run as they do so). It capitalises on Planimate's executable data structure design and comes with a performance boost due to refactoring and cleanup.

  • NEW Routine Operation: CopyPortal(original,panel,x,y,name)
    This enables a portal to be copied and placed on a panel WITHOUT stop/restarting the simulation engine.
    The new portal's sub-systems are initialised and connected to the currently running simulation.
    The model can immediately connect the Portal with tracks/links and start using it.
  • NEW Routine Operation: AddTrack(from,to,section-type)
    This enables a track to dynamically added or a track's type to be changed on the fly.
    The track is added to the object list and the index is returned.
    The section running table is updated.
    IF the track is configured to have less roads then it used to and there was a train on one of the extra roads, the train will disappear from the model.
    Track code will be faster and less memory intensive as some cleanup and consolidation was performed.
  • NEW Routine operation: AddPipe(from,to,copy_pipe)
    Adds a new pipe. If copy pipe is none zero, its properties are copied.
    Returns the object index for the new pipe
  • NEW Routine operation: RemoveTrack(From,To)
    Removes any track starting at portal From and ending at portal To.
    If From is a track object index, it is used directly
  • NEW Routine operation: RemovePipe(From,To)
    Removes any pipe starting at portal From and ending at portal To.
    If From is a pipe object index, it is used directly
  • NEW Routine operation: GenerateTrackTable(panel)
    This generates/updates the track section running table for a panel.
    The panel should contain a track network. If a section running table doesn't exist, it is created scoped to the panel, otherwise any table that matches the configured section running table name up the hierarchy is used.
  • NEW Routine operation: QueryNetwork(Table,Panel)
    This expects a table with columns "From","To","Type","ID"
    It appends to the table a row for every track, pipe or spatial link on that panel.
    "From" is the object index of the start portal (_Model_Objects labels)
"To"   is the object index of the end portal  (_Model_Objects labels)
"Type" is the object type of the link (_object_types labels)
it will be "Track","Pipe" or "Link" (spatial link)
"ID"   is the object id of the link (_Model_Objects labels)

  • NEW Routine operation: SumIFMatch(match_column,match_key,data_column)
    Sums values in "data_column" for rows where the corresponding cell in "match_column" matches the value "match_key".
    The columns can be from different tables and of different lengths.
  • NEW Portal context menu option "Cut".
    This enables a portal to be put into the copy paste buffer without being copied, meaning that object references etc. stay intact.
    It is useful for moving portals between models and is a shortcut to the equivalent procedure of making the portal a module then importing it.
  • NEW Background menu option "Paste Once" (appears only if a portal is in the copy/paste buffer)
    This performs a paste of the copy/paste portal without making a further copy for subsequent pastes.
    Its very useful when large portals are being moved about as it avoids unnecessary waiting for the second copy to be made.
  • CHANGE AddSpatialLink(), AddDirectionalLink() and CopySpatialLink() now all add the new link to the object label list and return its new index.
    Existing models which dont expect a result will use s.NullAttribute so they remain functional.

  • CHANGE Reduced the amount of prompting that PL makes when building/updating the network details table automatically at the start of a run.
    If the network details table needs updating, PL will give a single prompt. Selecting OK will allow PL to create needed columns, add objects to the model object list and insert rows in the network details table without any further questions.
    Note that the routine operation GenerateTrackTable proceeds without any user prompting.
  • FIX Pipe parameters optimisation for constant times:
    If a quoted value (eg time) is entered into the pipe "Total Time" for example, it would remain quoted and converted at runtime, which is not optimal
    Quoted values now get interpreted to formatted numbers at edit time.
    If you see quoted values in the pipe edit menu, then edit/OK them and they will be converted to formatted values.
  • FIX Description for 'ceil()' expression operation
  • SPEED Cleaned up internal implementation of tracks, simplifying how they are represented during edit and runtime.
  • SPEED A number of significant rewrites and speed ups on how PL represents dynamic panels.
    • rewrote the way Planimate represents the model hierarchy
      (avoid maintenance of a flattened hierarchy list except on load)
    • sped up loading models with better panel management
      (panel reference handling)
    • added more hierarchy integrity checks on load
    • sped up closing Planimate (remove unnecessary DeleteObject dependency checking).


  • NEW Pipe context menu enables copy/pasting of all pipe properties, references and settings between pipes.
  • FIX The selected cell in the table editor was being incorrectly redrawn. Table Views were OK
  • FIX Maximising a popup panel with the auto fit option on would restore its position instead of leaving it maximised.


  • NEW Printing a panel that is open in a popup now works


  • NEW Table View Properties, usable with GetViewProperty and SetViewProperty routine operations.
    These enable access and setting of the bounds of a current selection in the view.
    Cells are specified in terms of cells in the view not source table cells. Cells are numbered from 1. Setting any one of these to 0 will clear the current selection.
  • NEW Table column property "RoundValues" enables access to the table column option "Round Values In Views"
  • NEW Table column property "RoundWidth" enables access to the table column setting "Rounding Width"
  • NEW Label List "_export_options" names the option bits usable with CopyToClipboard
  • NEW Routine operation ShowHelp gives access to help files in the same way that buttons can be configured to show a section from a help file.
    The names can be provided as quoted strings, labels or text formatted cells/attributes.


All older model compatibility code has been removed. This means PL will only load models which have file formats later than 604. You should use Planimate 5.25z4 to upgrade older models.


  • NOTE This is a maintenance release of Planimate 5.25. At this time the current version to license holders is 5.32m
  • FIX This release fixes an error with the "Bell Curve" and "Log Normal" distributions when the new random number generator (see 5.22m) is being used.
    The new generator had too much variation for these distributions.
    For example, an StdDev of 0.5 was acting as an StdDev of 0.7.
    The model option Engine - Use Old Random Number Generator determines if the old or new generator is in use.
  • FIX Mapper handles 0 row table
  • FIX Ctrl-paste over a selected object used to cause PL to close.
  • FIX Prevent "Stay paused for debugging" and other debugging options except Show Location for errors during engine initialisation. PL could get unstable if staying paused during an engine initialisation error.
  • FIX Log Driven graph horizontal bar / labelled bar was broken If the bar colour was not black, it would be misinterpreted and usually no bar would display.
  • FIX Reindex label list would lead to problems if a subsequent file load attempted to look up labels. The lookup would fail, causing duplicated labels to be created.
    It would be OK if the model was saved/reloaded after the reindex, but by then bad references to duplicated labels could exist in tables etc.
    This issue was introduced back in 5.24m and was caused by a cache not being rebuilt after the reindex.
  • FIX Changes in 5.24i had left the "Run In Real Time" model option dysfunctional - pending events were not being processed by the regular continue timer events.
  • FIX Status line redrawing when setting activity string now uses correct font


  • FIX FormatForList() error reporting had a bug when the label list was not found.
  • FIX Handling of tables with zero rows when editing columns


  • FIX The selected cell in the table editor was being incorrectly redrawn. Table Views were OK
  • FIX Maximising a popup panel with the auto fit option on would restore its position instead of leaving it maximised.
  • FIX Pipe parameters optimisation for constant times:
    If a quoted value (eg time) is entered into the pipe "Total Time" for example, it would remain quoted and converted at runtime, which is not optimal
    Quoted values now get interpreted to formatted numbers at edit time.
    If you see quoted values in the pipe edit menu, then edit/OK them and they will be converted to formatted values.
  • FIX Description for 'ceil()' expression operation
  • FIX Fixed garbled attribute, cell and table view displays when they were changed in close proximity to an object while paused.


  • FIX The Options edit dialog could get lost behind other dialogs particularly when editing options for fields in PL user dialogs.
  • FIX A user provided data file with an inordinate number (> 65000) of spaces at the end was overflowing a buffer.


  • FIX Table Driven (Indexed) mode Entry was not tupling the correct row's attributes to the created item.
  • FIX Table hover tracking is now more keyboard friendly. If you use the keyboard to move the selection and the mouse stays still, the hover highlighting will follow the selection.
  • FIX Table hover tracking now works with multiple table views with hover. The focus will automatically switch to table views configured to respond to hover, meaning that any keys will be handled by the correct table view.
  • FIX When dataset2 loads table columns, it no longer resets their width to the default width for that unit type.


  • FIX Dataset2 would mishandle loading dates in a model that differed in run date by more than 30 years to the date when the data was saved.
    This affected the loader. Any saved datasets with correct dates are OK.
    This problem was due to a 32 bit value overflow and has been present since dataset2 was implemented.


This version addresses a number of interrelated issues. If your model uses run restarts or datasets COMBINED with changing the run start date, then you should investigate this version.

In particular, clear values for columns formatted as dates and "null dates" lead to potential problems if a dataset2 was loaded which had been saved with a different run start date to the one currently in effect.

  • FIX There were numerous issues caused by the combination of attribute or table column "clear values" when used in conjunction with calendar times in models that change their run start dates.
    From this version, "clear values" are always ZERO for calendar time formatted data. This means a "clear" (whether explicit or as a result of inserting a new row) will always appear to clear to the current "Run Start Date" since that is what corresponds to a value of "0" at simulation time.
    Previous models AND datasets with non zero clear values on data formatted for calendar time will have the clear value silently set to zero. A message will be logged to the debug file "planimat.dbg" but this is not normally written.
    You can enable it by running Planimate with the /DEBUGFILE command line option and then inspecting the "planimat.dbg" file. YOu can include the "/DEBUGFILE" option in the shortcut that you use to launch Planimate if you like.
    Note this issue did not directly corrupt data but could have caused unexpected or invalid dates to slip into tables, eg:
    • A dataset2 is saved containing date formatted columns
    • The model run start date is changed (s.RunStartTimeReference)
    • the dataset is reloaded (PL translates the data OK)
    • a row append is performed on the table
    • the newly added date cell is left unedited or unassigned (typically unlikely in an editing UI where a user wants to set the date).
      Note this issue triggered another unexpected behaviour in the date/time picker field in cases where only the date is shown for edit. This is separately addressed in this release.
  • FIX If a dataset2 contained a date value set to the "null" date value (as occurs when you type "-" in the datetime field) and the dataset was loaded into a model with a different run start date to that used when the dataset was saved, the null time would be offset and possibly not detected as the null date anymore.
  • FIX Added a workaround to avoid PL's window being forcibly scrolled by trackpad and mouse drivers which rudely send WM_HSCROLL and WM_VSCROLL messages to applications after having corrupted the application's SCROLLINFO state structure, instead of sending MOUSEWHEEL events.
    This should stop PL's window's being scrolled by scroll wheels atc when a scroll is not necesary.
  • FIX The date time control had the behaviour of introducing hours/ minutes/seconds into a date even though it was configured to only edit years/months/days. This occured because the control substitutes the current date AND time into a field if the field is currently not a date.
    The date-time control will now strip times when editing dates without times (or seconds when editing dates which dont show seconds).
    NOTE that the platform does not take any other steps to protect a "date only" field from having hours/minutes components in it when data is put into a date cell using code, datasets, data import or standard edit controls to input data.
  • FIX Double clicking a splitter with multiple incoming item classes now enables the selection of an incoming item class, previously it was only possible to edit the first item class that used the splitter via double clicks on them,
  • FIX Indexing across/down handling of months/days on calendar dates has been rewritten to use newly available support code. It now handles incrementing dates by combinations of years, months, days etc. just like "advance run for interval" does.
  • FIX The model-initiated engine restart code was missing a redraw which left views dysfunctional if the panel didn't change. Moreover it exposed some ways to bring down PL which have been fixed.
  • FIX Keystrokes and mouse scroll events sent to a table view which was not properly drawn (eg: due to the engine restart issue - it should never occur normally) would cause a fault and close PL.
  • FIX Attribute editor no longer displays an error when selecting a calendar time mode which cannot be used for data entry, such as

"Calendar DD Mmm (no year)"

  • FIX Viewport zoom display in context menu now a percentage
  • FIX Rate formatted values were giving errors when parsed
  • NOTE The value formatting and parsing code was rewritten to manage the various formats in a table to assist in enhancement and review.


  • NEW Advanced-Find can find tables that are cleared on save of the model.
  • FIX Fixed an issue where if PL happened to be loading the font table of a model when it polls windows for events (so PL appears alive while loading a model), the status bar redrawing itself would reference an invalid font and bring down PL. Added an interlock to cover this.
  • SPEED Loader optimised to poll events less often; models should load faster


  • NEW Added a "Delete Unused" option to the broadcast list to assist in cleaning out large quantities of broadcasts which are no longer in use in a model
  • FIX Default initialisation for calendar times led to superfluous warnings when merging models in relative time mode.
  • FIX Sorting of columns in alpha mode more efficient
  • FIX Sorting of Text formatted columns now works. The 'alpha' flag is ignored for text formatted columns and they are automatically sorted in alpha mode.
  • FIX Yes/No confirm dialog has buttons swapped (Yes on left) for consistency with Windows UI standards


  • FIX Matched cells were not working properly for: SetFormat(), GetFormat(), GetFont() and SetFont() routine operations
  • FIX Dont show "hand" over click entry in model edit stopped mode
  • FIX Dial context menu includes mode and other value indication. New defaults for size
  • FIX Copy/paste attribute view now places any copied dial at same relative position to it was to the original
  • FIX Expression documentation for MatchedCell() was wrong.
    To reference a matched cell use: t.table[].MatchedCell(keyc,key,c)
    keyc -> column to look up key in

key -> a value you want to find in keyc c -> column to get data from after row has been found


This version is a release candidate for the next full release of Planimate

  • which will include new demo models and wiki based documentation. A number
  • of changes and fixes have been made to improve working with the platform.
  • NEW Change object has new icons for Message and Message/Broadcast operations. A new _!system.db is included which contains the new icons.
  • NEW "Click" entries can now be clicked in user mode. If the engine is stopped, it will be be started and the item generated.
    These entries will also show a "hand" cursor when the mouse is hovered over them during run or when stopped but in user mode.
    This makes click entries more useful in training models.
    If older models exposed a user to "debugging" entries that they were not supposed to be able to click, these need to be put on a panel which the user cannot access.
  • NEW Multiservers have an option "Animate Item To Road Start" which enables the item to 0-time animate to the start of a road. By default this is off.
  • NEW Rewrote the distribution pattern dialog editor

- layout gives ready review/access to rounding and scaling - preview plot cleaned up; properly sized, redraws cleanly - the input fields for the different modes are correctly labelled - fields that are numeric (eg: shape) dont format as time - internal code rewrite/cleanup/renames - distribution in routine follows the "units" of the target of the operation in editing as time or as a number - preview plot x scale reflects time/numeric mode - default management fixed - tab order and default field fixed (shift tab upon opening puts focus on the selection list). - title indicates item class when editing an interaction - PL now appears in task switcher when distribution dialog open

  • NEW New distribution "Equally Likely (Min/Max)" This accepts a min and max value, making it easier to specify uniform distributions where a range is known. Also useful where it will be rounded to integers.
    The value generated will be >= min and < max so (min:1 max:10) will give between 1 and (10 - precision) where precision will be 1/32768 for the old random generator and 1/4billion when the new random generator is in use.
    To generate a uniform integer, say 1 to 10 you can now use

min: 0.5 max: 10.5 Round/Units

  • NEW Debugging option "Log Random numbers to debug file". This will log all random numbers drawn during a run to the planimate debug file (run PL using the /DEBUGFILE command line option to enable it).
    It logs (time,value,stream) in tab delimited 15 digit precision raw number format.
  • NEW Entry mode "Table Driven Index". This is a table driven entry mode that does not remove rows from the source table, instead the entry keeps an index of the rows it has processed. This enables table driven entries to work directly off tables without copies having to be made of the schedule data and is also much more efficient when there are many rows driving the entry.
    Note the index is reset when the run is restarted.
    The existing "Table Driven" mode has been renamed to "Table Driven Remove Row" which helps clarify the difference between the existing and the new mode of operation.
    A new icon for this state is included in the new _!system.db
  • NEW The icon mover and icon palette selectors now have new combo-boxes which list the icons sorted by name and enabling the highlight to be moved using the list. This makes finding icons/DBs by name much easier.
  • CHANGE "Friendly" error messages, when selected via model option, are now only displayed for standalone application EXEs. This helps with testing and debugging of models in "user mode" without having to remember to turn the option on and off when creating a standalone application.
  • CHANGE Previous versions of PL turned off the debugging options when toggling to user mode from edit mode. This helped prevent releases with debugging (eg: breakpoints) left on but made debugging more difficult.
    Now the debug options are left on to assist in debugging apps.
    Standalone applications will always see the debugging options as OFF, no matter on what state they are in when a standalone application is created.
  • CHANGE A change in seeding makes runs with the new random number generator different.
    This will NOT affect runs if models are using the old generator (option "Use Old Random Number Generator" is YES).
  • CHANGE Renamed time units to indicate fields which are hidden if all 0 eg: "Time [#w #d] hh:mm" "Time [#w #d] hh:mm:ss" "Time [#w #d] hh:mm" "Time [#d] hh:mm" "Time [#d] 0h:mm (hour always 2 digits)"
    The parts in square brackets are only shown if the value or those to the left of them are non zero.
  • NEW Added the following format:
    "Time #w #d Minimal"
    This shows fields in between the smallest and largest time unit only, enabling compact time duration notations eg:
    "5d", "1d 12:23", "12:34", "00:12:34", "2w 3d", "1.50", "1w 0d 00:00:00.01"
    This format is being used for times in the distribution pattern dialog and was implemented to reduce clutter in the editor.
  • FIX Switch multiple condition editor was broken, most likely in 5.25q when changes to the multiple condition editor occured.
  • FIX Removing columns from a table driving a visible log driven graph would cause PL to fail.
  • FIX Properties list in reference editor now includes object properties
  • FIX Fixed possible font table corruption if saving with an inverted colour scheme
  • FIX Cleanup to schedule/single Entry to increase memory and file efficiency
  • FIX cleanup of change object - removed large memory and file overheads in change objects that were not doing file operations
  • FIX Expression editor avoids quoting constants stored in time formatted values if those numbers dont need quotes (eg: seconds)
  • FIX Table row operations were not being properly updated in views (eg: when the table driven entry insertede a row into the log table)


  • NEW Attribute views have new options enabling them to support label editing in the same way that table columns support. These options are:
    "Edit Labels With Field"
    If selected a non combo field is used to type in labels/text instead of a pop-up dialog.
    "Edit Labels With Combo"
    A "combo" style field is used to select or type in labels
    " Rename Instead of Adding Labels"
    If selected and a new label name is typed over an existing label, the existing label is renamed instead of a new label being created.
    " Only Select Existing Labels"
    New labels cannot be created, only existing ones selected.
    " Dynamic combo list"
    The dropdown list is updated to match what is typed into the field.
    " No combo if only one element"
    List isn't displayed if there is only one option and its already chosen
    " Confirm Before Adding Labels"
    Confirmation dialog before any new label is added.


  • FIX Dataset1 loads were not handling label lists with names which had been translated to remove spaces by the platform. They were recreating the old lists (with spaces in name) even though the tables continued to reference the new data (with fixed names)
    Fixed by forcing name translation on all label and sublabel list names loaded in dataset1 files. This means the model must be following the new naming convention for affected lists.
  • NOTE Dataset1 is obsolete and is being phased out. It will will be supported in 5.26 versions but phased out progressively over the next year. Saving will be removed first, loading later.
  • NOTE A reminder that it is a long term goal to clean up the naming of attributes, tables, columns and label lists.
    This is the internal name, not the title or label text.
    This is important for code readability, verification and also in enabling a reliable routine editor. Spaces in names can be very confusing.
    There is no current plan to enforce this - it was done for label lists because the predefined lists needed to be renamed. However modellers should keep this in mind when migrating and updating older models.
    The conventions are described here:


  • NEW Routine operation "RemapName"
    This enables text to be processed through PL's file name remapping which occurs for change->file operations. This enables substitution of matching text with entries provided at runtime in an INI file.
    Result can be a text formatted attribute or a label list formatted attribute (new label created as required).
    See for details on file name remapping.
  • NEW Added new APIs to "Planimate as DLL" interface. Now supports both regular broadcasts and "background" broadcasts which are processed silently and without UI change by the platform.
    Fixed broadcast handling to ensure side-effects completely applied


  • NEW Clipboard Export option "Use Dont Show Zero"
    (mask is 16 for clipboard routine operation)
    This causes PL to use the "Dont Show Zero" column option when putting data in the clipboard. Cells which are empty will be empty instead of their 0 value when pasted in the clipboard.
  • NEW The table editor -> Advanced option "Expected Row Limit" now shows in brackets the number of rows the table is currently preallocated for (which is different to the number of rows the table contains).
    This assisted in an important FIX: Tables with an "Expected Row Limit" set were not holding on to the preallocated memory; it was being released during the model load, rendering it ineffective.
    NOTE that this fix may push some models into using more memory since the preallocations now actually apply. To assist in this I've enhanced the Model Properties (see below) to help in reviewing allocations.
  • NEW Reformatted File->Model Properties for table displays.
    When you select "Table" it will now include current memory allocation after the table size.
    I've found it useful to paste the report into a spreadsheet and sort by the size column to identify the biggest tables.
  • FIX The routine "Replace Reference" routine editing context menu operation was not working with the new reference editing. (was using wrong class for the temporary references).
  • FIX There was a small memory leak loading column hover tips.
  • FIX Font leak in settings editor
  • FIX Prevent the sidebar context menu from editing while paused which would generally cause disappointment

  • FIX Table grow Memory allocation thresholds have been tweaked, again There was too much "jump" in table sizes.
  • SPEED optimise the storage of empty strings, eg: unused hover tips. These were being allocated as one byte memory chunks creating huge overhead on the memory manager. They are now treated as a special case by the memory allocation routines
  • SPEED Reworked table memory management to reduce large preallocations for temporary undo/copy tables. These do not grow so they dont need any extra space to grow into.
  • SPEED Removed use of 2 byte int table class, now use 4 byte for all tables. Generally this will improve speed a little.
  • SPEED Reworked how portal entries/exits are tracked by portals during run, reducing memory allocations and increasing speed of the engine.


  • FIX Datasets now support millions of labels and free text cells without

LinkedList warnings. String handling more efficient.

  • FIX The expression editor was broken in the 64 bit version due to a different behaviour in the VS2k8 compiler compared to the VC6 used for regular 32 bit releases
    (link time optimisation and identically named global inline functions defined in multiple modules).
  • SPEED 64 bit version has had some STL debugging checks disabled. Label list management should be faster.


  • NEW The way attribute references are edited outside of a routine (eg: when referenced to set object properties like Multi-server Capacity) has been enhnanced.
    A new dialog appears which enables expressions to be typed, as in the routine editor.
    F2 now enables a reference to brwosed and inserted using the older UI method, rather than attempting to edit the current reference with the UI.
    Having access to references at objects and views will make it possible to do quick calculations and offsets "as-needed" rather than having to use a lot of temporary attributes (set at a routine) to achieve the same effect.

  • NEW Planimate references now automatically convert strings to numbers using the automatic format parser.
    This is most useful in allowing dates and times to be included in expressions.
    This means expressions like:
    p,attribute + "1d" or i.hour - "0:30" or "1jan2010 12:34:55" + "1w"
    are acceptable in references alongside numbers and attributes.
    It will also work with strings generated on-the-fly so if you have set = 12 p.month = "Jan" (a string or label) p.year = 2010
then this routine line:
p.mytime = & p.month & p.year
will give the string "12Jan2010" which will then be converted to seconds in Planimate's usual way of handling dates.

  • REMOVE Distribution dialog used to have options to truncate or round values to Months/Years. These assumed 30 day months and have been removed. Previous models using these will revert to no truncation and give a warning on load.


  • NEW Item table notation has been improved.
    Where previously one used:
    s.item.tablerefname[1][2] you can now use i.tablerefname[1][2]
    For an entire table reference, i.tablename[] is used.
    The [] tells the interpreter that its an item table not an item attribute.
    This notation has been extended to regular table references as well. Non-cell references now display as:

t.tablename[] (entire table) or t.tablename[].RowCount (property of table) or t.tablename[].Row(2) (entire row)
These changes highlights table references in code and also enables item table names to be included in the hint list when you type "i."
the [] is optional when you are typing a t. reference.

  • NEW Added a popup to assist in building expressions in the routine editor.
    Pressing CTRL-F while editing an expression will pop up a list of functions that can be used in expressions, avoiding having to use separate routine operation lines for a number of math and string operations.
    If the cursor is after a "." then properties are listed instead, for example: t.locations[].RowCount
    The list includes some hints on the parameters; these wont get pasted in when a selection is made.
  • NEW The Planimate DLL call mechanism (Planimate calling a DLL) has been enhanced to support callbacks into Planimate from DLL code.
    Currently these support:

- getting PL to grow the memory allocated in a "table direct" table - popping up a message box (useful for diagnostics) - triggering a breakpoint
Note that very old DLLs (typically > 5 years) that were not compiled to use "column order" are no longer supported.
They will be easily recompilable with a more recent DLL API.
Licensed Planimate users can contact InterDynamics for an updated API.

  • NEW Change->File operation: "TestFileLines"
    This gives the number of newlines in the file. It will generally return one plus the actual number of lines in the file unless the file doesn't end in a newline, in which case it will be the actual number of lines of data.
    This is intended to give an upper bound on the number of lines in a file which can be used to preallocate table memory just before large data files are read into them.
    Preallocating memory prevents memory fragmentation and will be beneficial when reading files which could contain > 30000 rows.
  • FIX Moving a portal did not update the panel to reflect the change
  • FIX Moving a portal could create multiple portals on a panel with the same name. The moved portal will be renamed to prevent this. Existing models should be edited to avoid objects of the same type with the same name on the same panel as its not supported by the editor.
  • FIX The description in the settings editor did not update correctly if the selection was changed using the arrow keys.
  • CHANGE The boundaries at which internal tables (including model table columns) "grow" in size have been revised to try reduce fragmentation, at the cost of potentially more memory usage in some cases.
    If you are preallocating the rows in your tables, this does not impact you.
  • CHANGE The name hint list that appears as you type routine attributes now appears aligned to the input field rather than the text edit cursor, to prevent it appearing way to the right on long expressions.
  • CHANGE PL defaults (new install) to using the wiki for context help Minor updates to fix inconsistencies and some major new content has been added to the wiki.
  • CHANGE PL defaults (new install) to uses the textual routine editor (F2 opens the dialog based editor, can edit Platform INI -> Routine -> UseDialogReferenceEdit and set to 1 (this was renamed as previous name was confusing)
  • SPEED Optimise object attributes by inlining the most common code paths
  • SPEED sacrifice memory for speed by using 4 byte int for internal object variables that were stored in 2 byte shorts. Also improved structure alignment for item class step information
  • SPEED Inlined some of the base item moving code


  • NEW Units "Data W# D# (Week/Day from 1)"
    This interprets an interval (or time since run start) as weeks and days, with weeks starting at 1 and days counting from 1..7
  • NEW Units "Date D# (Day from 1)"
    This interprets an interval (or time since run starT) as days, starting at day 1.
  • NEW Units "Calendar YYYYMMDDhhmmss"
  • CHANGE Renamed unit formats for more consistency, particularly where PL is providing a letter in the format like "3d" or "D3", in these instances a "#" represents where the number will be.
    # is also the placeholder for number, replacing "x".
  • CHANGE Units change:
    The "Time D HHMM (Day From 1)" and "Time D HH:MM (Day From 1)" units have been renamed and reformatted to be consistent with the other "Day From 1" unit modes.
    They are now called "Date D# HHMM (Day From 1)" and "Date D# HH:MM (Day From 1)" respectively, and will format "0" as "D1 0000" and "D1 00:00", with the capital prefix D serving to distinguish them from the relative time "1d 0000" which is actually a value of 86400.


  • FIX Fixes font load handling issue introduced in 5.25n


  • NEW If a model sets a custom menubar and you switch to edit mode and back to user mode (ctrl-shift-h), the custom menu bar is now restored instead of lost.
    This is useful for debugging.
    If the custom menu bar has been cleared and is empty, PL will switch back to the default planimate run menubar when going to user mode.
  • NEW API additions to dotNET interface to support portal attributes
  • NEW Tools menu -> Show System Attributes gives access to the system attribute list available in the breakpoint dialog. This wont include any item specific system attributes.
  • NEW About box includes the source revision in the version number area which will assist in source code management
  • NEW Option for train graph displays "No Times In Click Popups" If enabled, it prevents times being displayed in the default info popup when a train graph line is clicked.
  • FIX System attribute window is wider
  • FIX Routine font colour management improved to avoid saving models with inverted colour schemes. Routine fonts are no longer editable.


  • NEW Change object->File
    Added new option
    "Write Free Text As Cell"
    This causes free text formatted data to be written and read as text (removing line feeds, tabs and CRs if any) instead of the default which is to write it as a data blob in order to maintain any formatting in multi-line free text cells.
    This is useful where only single line text is being used.
    (text formatted cells are already transferred in this format to/from the clipboard)

  • FIX Fixed situation where an item's route is removed in lookahead (not supported); PL reported the error but then faulted due to some code assuming the route would be there.
  • FIX Fixed a corruption of tables passed to the dotNET PL DLL function SendBroadcastTuple() which manifested itself as a crash under Win7.
    The complete DLL API has now been implemented in the dotNET wrapper.
  • FIX Fixed the following "Platform error" report situation:
    • there is a table view with hover updates enabled
    • the table has has a filter active and a rowset selected
    • in code, rows are removed from the table and some code that takes a while executes
    • the long routine code executes for so long that PL pumps some Windows events so PL doesn't appear dead to the world
    • A mouse hover is picked up (windows event) and is passed on to a table view which is in a half baked state because table rows have been deleted but it has not got around to regenerating a valid filter rowset
    • this is picked up by validation and presents a "Platform error" stop dialog reporting an out of range row index in a view filter.
      This means table hovers will not track whilst PL is processing routine code.
  • FIX Fixed the SetFilteredRows operation. If a view of the table was visible, it was not being properly informed of the row filter setting. This was not a problem unless in the one routine:
    • you put some rows in a table
    • you set a filter rowset viewing those rows
    • you remove some rows from the table
    • the table is now back to the original number of rows
      In this case PL didn't realise the filter rowset was invalid and would generate a Platform Error stop dialog reporting an out of range table row in a view.
  • FIX When saving a model PL sets working directory back to the directory it expects the model to be in, to handle cases where model code changed the directory during run. This prevents model saves from dropping models everywhere that data was loaded from.


  • FIX Planimate-as-dll broadcast callback now works in cases where the broadcast has no attributes


  • NOTE New MDL version
  • NEW You can now specify tip text on a cell, in the "Cell Specific" context menu item. Note that there is overhead in having many cells with tip text.
  • CHANGE The "Only Modellers Can Add" option for label lists is now imposed for importing data into the table from a file. This prevents a user from getting invalid data into a list in a roundabout way.
    When an unknown label is encountered, a message is given showing the label and the load continues with a zero index being used for that cell and any others with bad labels from thereon (without further messages reported).
    If you want a file read to be able to add labels to a list which is otherwise "read only" to an end user, you can

Use the column options to prevent adding labels in table views - use SetListProperty routine option to turn the OnlyModellersAdd property as required.

  • CHANGE The "Extra X Scale Margin" and "Extra Y Scale Margin" graph scale options enable an extra margin on graph scales which makes the graph look neater and helps create space for the graph labels to display in.
    Previously this was a fixed value of 2% of the data range. This can now be set per graph using the Scale Parameters -> X Margin Extra % and Y Margin Extra % values.
    The default for new graphs is now 3% which helps allow space for the top scale value to display in.
  • FIX Fixed situation where cancelling the resize of a view with ESC caused the hierarchy window to receive the keystroke, which then went "back" to the last panel in the middle of the resize.
    (this was due to the hierarchy giving focus to its child window when its parent window is disabled, perplexing behaviour).
  • CHANGE The term "Units" has been replaced by "Format" in editing UIs to more clearly reflect its function and also match the names of routine operations and properties related to value formatting.
  • FIX Rewrote Tool Tip handling. Column tips in tables now track a column as it moves without leaving a trail of tip regions
    This was previously worked around by forcing repaints or using a transparent table which forced repaints, not necessary now.
  • FIX Pasting if nothing copied would cause a fault
  • FIX Model Explorer (tree view) fixes
    • was locking itself out from updates if a model loaded as PL loaded
    • could crash on a "New model" due to attempt to regenerate itself in the middle of the model being reinitialised
    • double update upon load due to an extraneous Update() post load which was no longer necessary.


  • NEW In edit mode CTRL-C and CTRL-V now work. CTRL-C will copy one or more selected objects. CTRL-V pastes the copy buffer at the top left corner of the panel.
  • FIX Fixed a table view error which occured if modeller defined row filters were set then the table shrunk whilst it did not have a view visible (eg: advance to time). This prevented the view updating properly and it would access invalid rows in the table.
  • FIX The ClearFilter operation now clears modeller specified column filter data even if the view is not visible.
  • FIX If an "Advance To Time" has been set and the model then paused, the advance to time dialog will not be shown in cases where PL is pausing broadcasts (eg: table cell clicks). It will appear again when the model run is continued.
    This allows user UI processing to coexist with the simulation in advance-to-time mode without distraction.
  • FIX Disable the editing palettes during model load to prevent modellers building models during a long model load.
  • FIX Fixed expression parser - it would fail with a badly formed function like
  • FIX The following reutine operations have been updated to "clean up" any text they are passed before creating labels from that text. That includes
    • removing linefeed and CR characters
    • removing TAB characters
    • removing enclosing pairs of double quotes
    • converting individual double quote to single quote
      This is necessary to prevent unsupported characters getting into regular label lists. If you need special characters like " and CR then you should use the text string capabilities.
      This affects:
      FormatIntoLabel FindFormattedLabel FormatLabelIndex RenameLabel LabelRename ExtractFileName ExtractPathName ExtractFileExtention
      These all work by creating labels for their result and hence need to protect against unexpected characters in the label.
  • FIX The model hierarchy now scrolls to show the current selection after it gets regenerated, as occurs when a group of objects is pasted. In previous versions you had to scroll to find the selection.


  • NEW The BrowseFile operation can now have a description associated with one or more file extentions.
    The extention information follows the filename, separated with a vertical bar "|". This allows:
    "|FOO format files|*.foo|Older format|*.bar"
    (note the All files is added automatically).
  • FIX Fixed extention support in file browser to support > 3 letters
  • FIX Value formatting was ugly for Minutes/Hours/Days/Weeks formats when they were copied to the clipboard.
  • FIX Implemented a handler to prevent flickering when panel autofit is on and a popup is being drag-resized smaller than its preset minimum size.
  • FIX fixed autofit and resize of a popup when that popup has a scale factor that isn't unity.
  • FIX Added an event pump to clear events before a popup list was displayed (eg: the label select popup) which was closing unexpectedly onder Linux.


  • NEW Operation "CopyAllFromView" enables all the rows/columns of a table view to be copied (including any effect of customised view columns and view filters).
  • NEW New view properties for Gantt Views (in the _tableview_properties label list)
    "GanttBarOffset" "GanttTextOffset" "TimeLabelColor" "TextLabelColor"
    These give access to items set in the Gantt View Context Menu and enable the gantt to be customised on the fly.
  • NEW Gantt graph bar font can be set for each graph view. (if not set the default is to use the "Graph Labels" font as before)
  • FIX When an error in a calendar datetime occured during data import PL would not always break out after giving warning messages, depending on whether the error occured in the date or time part of the datetime.
  • FIX Previous versions of PL's file reading (eg: reading into table) would not read data followed immediately by EOF. This has been changed so data that ends with EOF will be read.
  • FIX Auto advance renabled for table editor


  • NEW New table view option "Double Click Check For BCs"
    Previous versions of PL would check if a cell click was a double click when sending a "before edit" broadcast. This was useful in some UI situations.
    Due to the slowdown in the UI this causes (waiting for the double click timeout) this is now an explicit option and is off by default.

  • FIX Copying of portals containing "local" item classes between models was dysfunctional. It now works.
  • FIX The combination of:
    • a table view cell click "before edit" broadcast
    • that view's "after edit" broadcast
    • s.EnableTableCellEdit being set
    • the table view having the "Dont Defer BC on FEC" option on
      caused PL to "continue" the run after the broadcasts were processed when in fact this was not desired. This was due to the "before edit" broadcast's interaction with the engine.
      This has been fixed but note:
      If the view's "Dont Defer BC On FEC" option is selected, then the "Before Edit" broadcast must only be used to decide whether the cell edit should occur.
      You can do pre-processing within the "before edit" broadcast (including messages from a change object) but do not depend on sending other broadcasts or unblocking. These events will be put on the FEC but not processed until a continue occurs.


  • NEW Paint button option "Pre-Load Images On Model Load"
    This causes the button's states to pre-cache any images as the model is loaded rather than when the panel containing the paint button is first displayed.
    This is useful for large images which take a while to load, its better to have the delay at the start rather than when the user first visits the panel containing the image.
  • NEW Time mode "Time D HH:MM (Day from 1)
    Displays a relative time counting the first day as day 1
  • CHANGE Time formatting modes have been renamed to improve clarify
  • CHANGE SetViewFilterRows now does not reset the filter if 0 rows are present in the filter specification column. This enables a modeller to set a filter of 0 rows.
    Use ClearFilter to reset the filter to none.

  • CHANGE Renaming a table column with the same name with different case is now recognised and handled as if a different name was entered so references can be updated
  • CHANGE In previous versions, a table view would auto-advance to the next cell after an edit unless an after-edit broadcast had been selected.
    This has now been made an explicit table view option, "Advance Cell After Edit". This option will be turned on automatically for older models without an after edit broadcast.
    It also defaults to on for new table views.
    This enables cell advance to be selected even if an after edit broadcast is in use.
  • FIX The FitPanelToUsedArea routine operation had a bad reference for the "margin" parameter which could cause inconsistent sizing at best or a fault.
  • FIX Fixed paint button state image handling. They were not properly registering their use of an image, preventing it being pulled into a standalone EXE unless the image was either included in the model's DB file (always included) or somehow displayed first.


  • NEW Routine operations "GetColumnFilter" and "SetColumnFilter"
    These enable the *filter text* for a table view on a given panel to be explicitly read and set.
    The column is specified as a table column reference. PL will locate where that column is in the view automatically, so rearranged views are supported.
    GetColumnFilter can return a result either by creating a new label (if you use a label list formatted attribute) or directly as text if you use a text formatted attribute.
    Note that filters need to be enabled for the view in advance.
    An "unset" filter is returned and set as an empty string.
  • NEW Routine operation GetDate returns the date at the start of a day for a calendar date/time - ie: it removes the hours/minutes/seconds component.
  • NEW Routine operation SetColumnTip enables setting of a table column's tip text. Tip text is stored separately to the column's title text and will be used instead of the title text if its not empty. Column tips need to be enabled for the tip text to be displayed.
  • CHANGE The following routine operations can now return their text either as a label index (if a label formatted attribute is passed) or as text in a text formatted attribute:
    FormatTitleIntoLabel FormatNameIntoLabel GetColumnSecondTite

  • CHANGE BrowseFile has been enhanced.
    The "Save Mode" parameter is now called "Options"
    A value of 1 enables "Save" style dialog instead of open (as previously). A value of 2 causes the browse to leave the default directory in the location where the last file was selected.
    The options can be both used by adding the values.
  • FIX Fix module configuration editing (runtime)
  • FIX If a cell was updated for a table with a visible view and the view had an active column filter and the change in data caused the filter to show less rows then PL would crash because the redraw of a single cell due to data update was not properly translating the data row into the view row when the filter was active.
    Report any performance changes that this version may exhibit against version 5.25d as the implementation of this fix could be a contributing factor.
  • CHANGE A 0 in place of a panel reference will return the top level panel


  • CHANGE Paint edit popups now show the tool tip text. The Add/Select state popup will show the tip text for each state as well.
  • CHANGE When a panel with a viewport which is dynamically sized was being resized by using the titlebar WHILE a single item was animating AND the resize broadcast was being processed in the event pump during the item's animation....
    it would cause the viewport to hide/reshow its window (to apply new backing store dimensions and reposition itself) destroying the (currently busy) animation manager.
    Fixed by ignoring the resize event and polling for a change in parent window size every animation update.
  • CHANGE The pause/stop menu was overly sensitive (eg: clicks on the title bar would activate it). An event based way of detecting mouse downs in the main window is now used.
  • FIX An uninitialised variable could cause viewports to respond to clicks when they were not supposed to.
  • FIX Fixed loading of very old track models; was not initialising some names properly leading to a crash on network build
  • FIX Fix error testing; if a track network build fails it does not continue building networks on other track panels.
  • FIX Creating an object label now gives opportunity to correct an object name if it is already used rather than just bailing out.
  • FIX When suggesting an object label name, PL now defaults to a name which can actually be used, it wont suggest a default which is already taken by another object.
  • FIX The hover button state (code = 8) wasnt being set since 5.25b for hover broadcasts


  • NEW Routine Operation "GetBendPoints"
    This reads bend points into a table for all links on a panel. The type of link can be specified using the _link_types label list and can be spatial links, tracks or pipes.
    The table must have 4 columns: "From","To","X" and "Y".
    Only locations with object labels will be included in the table. Any existing rows in the table are cleared.
  • NEW Routine operation "SetBendPoints"
    This is like GetBendPoints except it creates bend points where a direct link exists between "from" and "To", at co-ordinate x,y on the panel.
    All existing bend points (for the given link type) are deleted before the table is processed to create new bend points.
  • NEW Routine operation "SetViewFilterRows"
    This enables the modeller to directly specify the rows that a table view will display. These are specified using a column listing the row numbers to display.
    NOTE CHANGED "Use an empty column to reset the row filter" see 5.25f
    This option uses the same mechanism as row filters, the two have not been tested together and may confuse the user.
    You will need to force a repaint after changing the row filter.
    If the table is having rows removed, the row filter must be removed first. Invalid row indicies will be removed when the row list is first applied but subsequent modification to the table could cause a crash if it does not have the rows that the modeller provided filter is pointing to.


  • NOTE Optimisations in this version in addition to those in 5.25 enable a PL model to dynamically create 50000 portals in 10 seconds.
  • NOTE New file format, please save and reload your model to ensure it translates Ok.
  • NEW Model option (Engine) "DataSet2 Loads Object Labels By Index" and corresponding system attribute: s.DS2LoadObjectLabelByIndex
    If set, these will cause object labels referenced in tables loaded by a dataset2 load to be loaded by index rather than attempting to match name with existing objects.
    This is useful if objects have been renamed but their ordinal index remains the same (or the modeller has a mapping table they will use after the load).
  • NEW Portal click/drag/hover and panel drag broadcasts will now set an additional item attribute: "_location".
    This is set to the Object Index of the owning portal of the panel, if any.
    This can be useful in avoiding the need to have panels in the Panel Label List, using Object Labels (typically present for network nodes) instead. Its particularly useful now that portal click/drag broadcasts can be sent to parents.
  • NEW Portal option "Check Parents For Broadcast" This enables portal click/drag/hover broadcasts to be handled by its parent. Normally they are only handled by handlers within the portal involved.
    With this option enabled, PL will look for a handler using a scoped search, progressively working up the hierarchy. It starts by looking within the portal itself but if that doesnt contain a broadcast listener, it will look one level up in the hierarchy, and so on.
    This enables the handler to be in a subsystem outside a network map panel, as well as in a "handler" portal on the same panel as the network.
    The new "_location" attribute that these broadcasts set is useful for determining the portal where the interaction actually occured.
  • NEW System attribute s.UseLocale
    This enables a model to turn on/off the Support Locale For Strings end user option. This is useful when a model is doing a lot of internal processing where user labels are not involved (eg: creating objects).
    A change applies immediately.
  • FIX The window title in edit mode was being incorrectly set, resulting in "<unsaved>" appearing at inappropriate times. This has been an issue for a while.
  • FIX Prevent editing of attribute's scope whilst the model is paused and the attribute is being viewed using the debug option.
  • FIX Crash when showing system attribute debug list when an item was not present
  • FIX If a model has a model error when loaded and that model had the "defer display" option on, the option will be turned off if model options are edited to turn the "defer display" option off, enabling the model to be viewed and debugged.
  • FIX Position of module popup window now matches cursor
  • SPEED Sped up sorting of Model Object and other system label lists when displaying 10000s+ object labels
  • SPEED Sped up dynamic creation of portals by precaching/precalculating the transfer of user data columns in the creation table to the matching portal attributes of the created portal.
    Also a design bug was fixed where any matching columns which didn't match a created portal's attributes could potentially match an attribute of any of the owning portals up the hierarchy. This would leave that attribute overwritten by the attributes of the last portal created in the destination portal within it.
  • SPEED Sped up dynamic creation of portals by using fast lookup structures during the creation for existing object names and model object list members.
  • SPEED Sped up treeview generation (use std::map to speed up node<->tree node lookups)
  • SPEED Cleaned up dynamic panel so rarely used features class mapping and panel-scoped classes are not alocated managers unless they are required.
  • SPEED Rewrote the way objects are saved and referenced in the MDL file (save objects reference using ordinal index instead of name) Previous versions searched to determine the ordinal, its now generated and stored as part of a save. This will speed up saves as well as loads.


  • NEW Implemented drawing for > 3 roads on a track section
  • CHANGE Relative time formats no longer display intervals as years or months. Given that a month or year needs an absolute date to make sense, having an interval assume a 30 day month or 360 day year was an approximation taht is no longer needed given PL's support for calendar dates.
    The largest a time interval will be displayed as is now in weeks.
  • CHANGE When PL is switched to calendar time mode for a new model the initial date reference will be 1-jan-2007.
    This year was chosen as its the closest year to now which starts on a Monday, which is also day-of-week 0.
    This will only affect new models as all existing models will load with their saved configuration.
  • CHANGE The way a column is looked up by the table ColumnIndex and MatchedCell reference types has been made more consistent.
    It now works as follows:
    If the column specifier is a label, column label or text string (eg: a string constant like "test" or result of a string function) then the table is searched for a column with a matching name starting from the first column. No column index cache is used.
    This makes it easier to use ColumnIndex or MatchedCell() with tables which have their columns rearranged during a run.

t.mytable.ColumnIndex("mycolumn") or t.mytable.ColumnIndex(c.mycolumn)
are now both useable.
This may be useful where a table is being recreated by a dataset load.
In previous versions:
- Using a column label would not work for column-rearranged tables.
eg: t.mytable.ColumnIndex(c.mycolumn) would give the index of the column at run start, not where it had moved to.
- Using a text string would not work at all.

This forced a modeller to create a label list for finding columns by name in a table with dynamically arranged columns.
If a table's columns are being rearranged, you cannot use c.columnname with normal Cell and Column references.
This is because column references are validated and cached at the start of the run for performance on the more common table operations.
A column reference will not be useful if the column does not exist at the time the model is started as PL will still try to verify/cache it. In this case, use a label list or string to name the column.
If you are creating a table with many columns, you may be better off storing column indicies in portal attributes (or another table) rather than forcing the platform to search for them on every reference, using ColumnIndex() or MatchedCell()

  • SPEED Sped up the copying of portals when creating them dynamically.
    This was achieved in 2 ways:
    • If the modeller does not provide a name for the new object, PL uses a faster method to guess a name which wont be already in use (and hence need searching)
    • When assigning an object label to a newly copied object, PL will now use the object's name as a starting point (assuming that is already unique). Previously it used the object name of the original object as the starting point, requiring a lot of searching when dealing with many portals.
      For optimal performance of copies:
    • dont have a number after the name of the ORIGINAL object which is being copied
    • more importantly, try avoid any existing object labels with the name of the portal which will be copied many times followed by a number.
      eg: newname1 newname2 newname3
      By avoiding name conflicts for the object and object-label name of the copied objects, it will speed up the copies as it will avoid PL having to search for unique object/object label names.
  • FIX Models saved with bad object references due to editing flows through a viewport will now load though such flows may be a mess.
  • FIX Can no longer add / modify flows in a viewport; the flow editor is only designed for editing off the main panel.
    However interaction editing in a viewport should now work properly.
  • FIX Improper validation would cause a fault for some table routine operations if the table reference was bad (eg: out of range column).
  • FIX Fixed a very obscure bug that could occur when object references
    were saved (eg: additional portal entry/exit links)


  • NEW System attribute display popup. This is available from both the run stop/breakpoint dialog and also as the "SYSTEM" option on the item click popup menu.
  • FIX Track drawing / colours. Removed line styles


  • NEW Routine operations "Convolve" and "Normalise" are useful when working with columns of statistical probabilities.
    Normalise rescales a column so it adds to 1
    Convolve multplies and sums two columns against each other, putting the result into another column. All columns must have the same # of rows.
  • NEW Time formats "D HH:MM" and "D 0H:MM" (they dont show weeks etc)
  • FIX Viewport of an autosized panel on an autosized panel now works properly


  • CHANGE Dispatcher Any Orientation mode now animates items along baseline regardless of their height, making it easier to work with different icon heights. Right to left orientation now works properly
  • NEW Portal option "Hide Name" acts as if the name started with an underscore and hides the name.
  • NEW Portal option "Dont Animate To Exit" prevents flow items from animating to the portal exit position. This can be useful in flow based network models.
    Note that in track/spatial link models the item already doean't animate to the exit
  • FIX Tables views for a table will automatically have any filters reapplied when the inbuilt sort UI is used to sort them.


  • FIX The new time format in 5.24n was not properly maintaining dates between run stop/start (date bit wasn't set for that mode)
  • FIX bumped file version (should have in 5.24n)


  • NEW Dispatcher has a new "Any Orientation" direction mode.
    In this mode the dispatcher is drawn between its position and its exit (like a multiserver road) and items will queue in a neat head-to-tail configuration regardless of their width and the orientation.
    The item class options "Rotate" and "Flip Icons" should be turned on for best effect.
    [previous note about centering removed 5.24p]
  • NEW Calendar time format: YYYY-MM-DD HHMMSS
  • CHANGE Resizing a panel with dynamic resizing enabled will also resize the contents of any viewport which is being stretched/shrunk due to anchoring as long as the panel in the viewport also has dynamic resize enabled.
  • CHANGE YYYY-MM-DD HH:MM:SS format can import times without the :SS part
  • FIX Fixed a string-buffer leak that occured when table data import had had a value error on importing data into a table. This would report a systemerror 1167 on exit of the platform.
  • FIX Track road count now working properly
  • FIX Validation for bad references in SetViewProperty


  • NEW Routine operation "ResetLoopDelayTime" (Route)
    This resets the item's loop entry time so PL will think the item just entered when it attempts to leave. This enables an item to spend some time at a location without triggering a loop delay. Note that setting this changes the item's LoopEntryDelayStart time but does not affect any existing loop entry delay, which will complete normally unless the item leaves and cancels it.
  • NEW Routine operation "CancelLoopEntryDelay" (Route)
    This cancels any loop entry delay active for the item. Any needed loop exit delay will still be performed when the item is abie to get onto an outgoing section.
  • NEW Track control column now supported for all 6 possible track roads
  • NEW Application save dialog has new checkbox to enable creating a callable DLL. This option is only available to Open PBA license key users.
  • FIX s.ItemRouteSectionID now returns 0 instead of stopping run for cases where the route step is beyond the end of the route or there is no route
  • FIX ViewPorts now support anchors on both sides for stretching horizontally or vertically
  • FIX Removed ability to add links/tracks from hierarchy view, these are for the object context menu.
  • FIX Module configuration panel editing now works again (was broken in 5.24k)
  • FIX fix leak / triple track issues introduced in 5.24k


  • NEW Set "wait" cursor while exporting table data to the clipboard
  • SPEED Have sped up the creation and lookup of labels in large label lists. This was achieved by replacing linear searches with lookups using an associative map for th enames and a binary lookup for the indexes.
    For this to work, the platform requires that labels are internally stored in index order and will verify this for older models loaded.
  • SPEED Improved sort time for large multi column lists
  • FIX If a message occurred whilst PL was initialising (eg: informing about track table missing) and there was a paint object with a control attribute on the current panel, other error messages would appear.
  • FIX Deleting portals was broken in 5.24k, could not delete from the menu
  • FIX Section road filter is now properly reset in case where a loop hold is in effect.
    Also added a check for a missed road filter / lookahead combination
  • CHANGE SectionRoadAvail has been changed, notes below updated.
    It no longer checks other roads for the presence of the test train


  • NEW Added ability to Move a portal to a different owner.
  • NEW Can delete portals from the hierarchy/sidebar
  • NEW Basic support for new 4,5,6 track road modes. These extra roads are not supported for restriction control yet and animate over 3 visible lines.
  • NEW Routine operation "SetRoadCheckFilter"
    This enables track models to control which road(s) on a track section a train can attempt to use.
    This takes a cell reference which points to the first road # to check (from 1..number of roads available for the section). Planimate will work down the table column until it reaches either the last row or a 0 which terminates the testing.
    This operation must be invoked to set the road filter just before a train tests the section: this occurs in 2 circumstanes:
  • when checking a "next" section during track lookaheads
  • when flowing onto the next section (eg: from a capacity object) ie: the filter needs to be set whenever a train has the potential to test the section via any kind of lookahead. The section "forgets" the filter immediately after the test, by which time the train may have placed a hold on the road it wants. This operation does nothing during a "move" (the road would be already held and ready for the train).

  • NEW System attribute "ItemRouteSectionID"
    For an item/train which is on a route, it will return the section object index that the train would take if it went through a portal exit.
    Will return 0 if the section has no object index or if a viable section could not be found.
    Note the section is not tested for availability.
  • NEW Routine operaion "HoldSectionRoad"
    This enables a modeller to reserve a section for a train. It works in both lookahead and move and once the hold is set, any other attempt to set a hold will fail unless its the same train item.
  • NEW Routine operation "SectionRoadAvail". This returns nonzero if a given road in a section is available for a train to use.
    It does not check if the train is already booked on another road. If the same train is already booked on the road, it returns 1.
  • REMOVE "SectionFillEnable" property which was used to help the auto route generator for track networks is no longer supported. Since Tracks no longer contain loops (they are now portals) they can be distinguished directly in the route specification.
  • CHANGE Track - the item's last section / last road attributes are now set during the track check lookahead, so a node can know the section/road the item would be coming off of whould the move be committed.

  • CHANGE Table View: If pasting or importing data into a table where the view has a filter enabled that is blocking all data from view, the filter is disabled
  • CHABGE The default table cell context menu behaviour for "Import From ClipboarD" has been changed to always send a broadcast after the paste, even if the view is empty.
    This could occur either because no data was pasted or an active filter is filtering it all
  • CHANGE When paste insert/append or importing into a table view, if an after edit broadcast is selected and a filter is active, the broadcast will now be sent with from_row and to_row set to 0 to indicate you should validate all the rows.
    This is because the paste could affect rows outside the fitered view and hence from_row/to_row cannot be relied upon as they denote rows within the view only.
  • CHANGE Rearranged portal/module menu so more common options between them
  • FIX Column list width was being retained by customised column views but not editable. Added an edit option for it in customised column views.
  • FIX Fixed the comment field height in the routine editor


  • [new file version, new DLL API]
  • NEW Routine operation "RealTimeCallBack"
    This enables a modeller to schedule a "_Real Time Tick" broadcast to occur after a REAL time intervall has elapsed. The time is specified in milliseconds.
    This replaces the "Realtime" broadcast option and system attribute (removed in 5.24h). This approach gives more control to the modeller and reduces the chance of broadcast "storms".
    Use as follows:
    When you want to start receiving a regular broadcast, use this operation to schedule the first one.
    Upon receiving the broadcast, you can schedule the next one within the handler thread for the broadcast until you no longer want the broadcast.


  • NEW Table view option "Send Single Block BC For Fill/Index"
    Selecting this causes PL to send only a single "block edit" broadcast after a fill down or across instead of a cell-by-cell broadcast.
    This can greatly improve performance when many rows are being filled.


  • CHANGE The clock no longer shown by default when PL opened.
  • REMOVE The "RealTime" broadcast capability where a broadcast could be set up to trigger at very short real time intervals has been removed. The old system attributes for controlling this will now give errors when the model is run.
  • FIX Behaviour of tree selectors when the right button is used to select an item.
  • FIX If a user started a run from a broadcast button and that initial broadcast item was animating and the user clicked to display the animation pause menu, an errant redraw could cause the platform to fault when the pause menu was dismissed, due to some message pumping that is performed after popup menus to work around a bug in Windows where the Async reported mouse button state gets out of sync with the actual buttons even though higher level events for mouse up have already occured.
    In other words the workaround to a windows oddity was causing a redraw at a bad time.
  • FIX The "Format" option in the cell context menu has been removed when in "user" mode - - it contains options that end users should not be changing.
  • CLEAN Internal rewrite of how PL windows and controls (fields and buttons) are created and managed.
    The new method reduces overheads and will enable multiple PL DLLs. (removed "superclassing" of standard Win32 controls; no longer need WndExtra bytes).
  • CLEAN Cleanup of FEC, broadcasting and main window handling code. Rewrote the way "high priority"/immediate events are handled
  • CLEAN Reorganisation of the build projects for PL


  • FIX The new parentscope option was not working properly for broadcasts send whilst the engine is running


  • FIX A 64 bit incompatibility in the treeview code, causing some option panels not to populate.
  • FIX The "Check Parents For Broadcast" option, implemented in 5.24 and used when converting view panels to dynamic, was missing a condition which caused it to lock up when looking for the broadcast listener.
  • FIX Portal options were not being cleared properly for newly created portals.
    This also affected view panels converted into portals; these new portals can have silly options set. If you brought forward a model into any previous 5.24 version you should check portal options for any portals added since or any panels that converted to portals.
    Copies of portals were not affected.


  • [new version]
  • NEW The GetViewProperty and SetViewProperty routine operations have been enhanced.
    They now take an extra parameter to select the view type. This enables positions and basic colours of the graphical views to be set as was possible for the table views.
    You can use the new "_view_type" label list to select which type of view you want to find on the destination panel.
    The new paramter defaults to "1" which corresponds to table view, this keeps older models working OK.


  • [new model version]
  • NEW A separate title can be set for a panel, this is used as the title for popups.
  • NEW The DataSet1 configuration dialog (Data->Data Sets) has a new button to facilitate converting your model to use DataSet2.
    This button will automate the process of determining all the data objects present for a given dataset1 configuration, creating _data_object labels for them (if they are not already) and listing the objects in a newly created table formatted to be a valid DataSet2 configuration table.
    DEVELOPERS ARE ENCOURAGED to migrate away from DataSet1 as future versions of PL may not support it.
  • CHANGE The DataSet1 load/save options have been removed from the File menu in EDIT MODE, as dataset1 becomes obsolete.
    They are still available for the end user menu bar so models which nee them can get to them in user mode.
    Please ensure they are not visible if your model uses the standard end user menubar and only uses DataSet2.
  • FIX Fix treeview to also properly set text color
  • FIX Broadcast entry name only reset to broadcast name when a different broadcast is selected
  • FIX Added mechanism to set condition debug values to a clear state before every condition evaluation. This will clarify debug information in the condition dialog when clicking on a switch in pause mode
  • NOTE Internal code rework to enable PL to compile as a DLL which another program can load. This should not affect the regular PL EXEs but a few minor tweaks have been made to how things are managed internally.
    Please report any new odd behaviour


  • NEW Implemented paint option editing in the new editor as well as anchor option editing. These work for multiple selections
  • NEW Added an interface so most "list picker" style option edits are now performed with the new editor. These edits will show under the "Context Option" category in the editor and do not support group editing as support for this needs to be implemented case by case.
  • NEW Tree selector keeps selection visible even when it doesnt have focus
  • NEW New option dialog - bold values and values which have changed are underlined


  • NEW Added ability to edit multiple object options to the new editing interface. Currently this is useful for portal options.
  • FIX Fix wrong panel issue when editing panel options via hierarchy
  • FIX Name of view's data owner when viewing in the label list references


  • FIX Portal options editing crash introduced after I simplified some handing in the new editor


  • NOTE:
  • This version has undergone major internal rewrite and cleanup with an objective
  • of providing for better editing development, cleaning up the codebase,
  • speeding up management of very large models and keeping the implementation
  • directed at how PL is currently used.
  • Most notably, view panels and application panels have been removed.
  • Models saved with this version are not backward compatible.
  • NEW Beginning to introduce a new editor for options and settings. Initially this is enabled just for INI, Panel, Model and portal object options.
    Eventually this interface will be used wherever the 2 column "pick" interface was used, as well as for non-boolean options and it will enable properties of selection groups to be edited in parallel; this release is still in its early days.

  • NEW View Panels converted into Dynamic Panels
    For any loaded model, View Panels will be converted into "dynamic" panels, (panels owned by a portal). Most functionality will be retained but there may be some graphical tidy up necessary.
    The owning portals will be set to hide in run mode by prefixing their name with an underscore. Panel Label List IDs will be retained as will be viewport and "Change Panel" destinations.
    New options enable "out of scope" views to be used with dynamic panels, so no functionality should be lost.
  • NEW Scope Option for attribute/table/graphical views: The view's context menu contains a new "Stay With Original Data" option.
    This option makes it possible for a view on a dynamic panel to display data which is not "in scope" even though a different data with the same name is in scope.
    The option makes the view "stick" to the original data object it is associated with when the view is copied and another data object would be in scope.
    Note that in the case where both the view and its associated data object are copied, then the copy view will be scoped to the copy data regardless of this option.
    This option will be automatically selected for views that were in view panels.
  • NEW Views from any panel can be added to a dynamic panel via the background menu. Out of Scope Views will have the "Stay With Origina Data" scope option selected automatically.
    The panel selector now gives an indication of how many attributes/tables each panel in the hierarchy contains.
  • NEW Paint broadcast button option "Check Parents For BroadcasT"
    This option causes scoped buttons on dynamic panels to behave like buttons on view panels. If the panel doesn't contain a broadcast handler, the parent panel is chacked, then the grandparent etc.
    This option is automatically enabled for scoped broadcast buttons on view panels which are converted to dynamic panels in order that the buttons continue to function, otherwise they would look for a handler on themselves only (since they are now a dynamic panel) and result in an error.
  • CHANGE Application panels ("meta panels") are now just normal portal subsystems. Capabilities only available in application panels are now available in all panels.
  • FIX Table cell edit now will use ellipses (...) in cases where the text is longer than the field and its a single line cell. Its not supported for multiline as multiline text isnt drawn properly.
  • FIX Re-ordered panel code so popups are hidden at run engine restart before attributes caches are cleared.
    This was to prevent an error when a run restart occured whilst a popup with a paint button with states controlled by a portal attribute in the scope of the popup.

  • FIX PL was losing track of its DB file if "Save As" was used to save the model into a different directory. This problem can be worked around in older PL versions by reloading the model after the save-as.
  • FIX External file label list mechanism, used to enable files to be provided by the end user at runtime to an application, now supports JPG file types being specified.
  • REMOVE Removed the icons in the tree view since they are all dynamic panels now
  • REMOVE Lots of internal code for editing and manipulating view panels, just
    left minimum needed to load and convert them to dynamic panels.


  • NEW Enhancement to the background drag broadcast.
    If instead of dragging, the user clicks, a drag broadcast is sent with _command = 0.
    This enables handling of clicks (select and context) as well as drags on the background.
    _dx and _dy are set to the mouse co-ordinate clicked, in iFlow co-ordinate space (0,0) at bottom left in panel space co-ordinates
  • CHANGE background drag broadcast
    The drag-begin broadcast (code 1) used to send _dx and _dy as 0 Now they are set to the mouse co-ordinate in iFlow co-ordinates (0,0) at bottom left.

  • NEW Enhancement to DLL code to support returning text.
    The existing DLL API supports PL_DLLPARAM_STRING which can be used to pass a single label to/from a DLL.
    This would also work for passing a text formated attribute.
    Its been enhanced so if the destination of a returned DLL string is not associated with a label list, then it will attempt to assign it as text (just as if the $= assignment was made with that reference).
  • NEW New string system attributes have been added to retrieve information about the currently logged in user
    These are mainly intended for use in corporate environments where users log in using a domain and LDAP is in use.
    More background and a useful diagram here:
    On non domain environments (ie: standalone PC) these will all return empty strings except s.UserNameNTCompatible

    [1] s.UserName
    Retrieves the name of the user, eg: "John Smith" This name is not necessarily unique. This only works in a domain environment.

    [2] s.UserNameQualified
    Retrieves a comma delimited list of attributes and values that uniquely define the user.
    eg: "CN=John Smith, OU=sales, DC=somewhere, DC=com"

    [3] s.UserNameCanonical
    Retrieves the user identifier in an alternative format known as a canonical name.
    eg: ""

    [4] s.UserNameNTCompatible
    Retrieves a users name in an older Win NT "SAM" compatible format
    "IDSTAFF\Rick" (on a domain IDSTAFF is the domain controller)
    "LISTER\Rick" (local account on a non domain PC called LISTER)
    This is a flat way of identifying users which has been superceeded in LDAP environments which are hierarchic.

  • CHANGE Popup close broadcast is now sent just before closing the popup window so its final co-ords should be available. It was previously being send just after the popup was deallocated.
  • FIX Fix validation of SetFormat routine operation to prevent invalid format codes being assigned (which would trigger lower level system errors)
  • FIX Attempting to set a -ve scroll on a table view now reports an error instead of making the table view go strange
  • FIX "Free Text Entry" is now alias text to "Text" in the _value_formats label list. This enables previous datasets which referenced the mode by name to still load properly
  • FIX Block Move references (now cell references) were not being recognised by block move operation


  • CHANGE Free Text is now known just as "Text" Sometimes "strings" will be used in documentation; that means text also.
  • NEW Documentation on editing references has been added to the wiki
    This documents the various types of references and they way they can be used in expressions.
  • NEW 15 new text string functions have been added.
    These are implemented as part of the "expression" mechanism in Planimate rather than as routine operations. This enables them to be combined in useful ways which would be awkward if they were routine operations since they are limited to one per routine line.
    The new operations are:
    strlen(), strleft(), strmid(), strright(), strreverse(), strupper(), strlower(), strcompare(), strfind(), strclean(), strinsert(), strdelete(), strreplace(), strchar(), strasc()
    and are documented on the wiki:
    Note that strsub introduced in 5.23b has been replaced by strleft(), strmid() and strright() which have far clearer intent.
  • NEW Table column option to confirm adding new labels. This is useful when labels are automatically created if text typed in fields is not an existing label.
  • NEW Added an expression quick-reference to the Help menu. Note a function browser (like the routine operation browser) is also planned.
  • NEW Further enhancements to text assign ($=)
    If the destination is not set up for text, then any test assigned to it is interpreted as the format of the attribute/cell.
    This is useful when you want to set an attribute to a time or other formatted value in code.
    eg: p.attribute $= "12:00"
  • NEW Dataset2 can now support saving text formatted attributes.
  • REMOVE BLOCK mode references have been removed.
    In cases where they were used in a block move, a cell reference is substituted instead to specify the top left cell. Older models will be updated.
    Saving of a block from a table to a file is no longer supported. If such a reference was being used, a warning about it is given when the model loads.
  • REMOVE PDF and CDF references are now just COLUMN references.
  • FIX "Open With Combo List" now does not close the combo if the user types a label not in the field


  • NEW "Edit Order" is now available for Attribute views
  • NEW Text -experimental string functions:
    substring(string,start,length) Enables parts of a string to be extracted in a flexible way.
    reverse(string) This reverses the text of a string
    More on these later, still to be finalised.
  • FIX Free text views update when source is changed by another view
  • FIX Text attribute views work
  • CHANGE Way expression functions are saved/loaded has been changed
  • CHANGE Internal rework of attribute reference editing for upcoming expansion
  • CHANGE Internal code cleanup (source #include tree cleanup)


  • This is a first, largely untested release with string support added to
  • attributes. As a lot has been reworked, please proceed with caution.
  • Please report any strange behaviour or messages.
  • NEW Portal and Routine attributes support "Free Text", meaning attributes can store strings without needing to use a label list.
    This is progress in improving PL's string handling capabilities and in itself should help reduce need for temporary label lists when preparing a string for eg: a filename and in the future ODBC.
    The attribute editor and Attribute Views support free text but only single lines at this time, although the internal representation will work up to 16KB of text length.
    To assign to text attributes (and free text cells too) use the new $= operation.
  • NEW A new operation for assigning text has been added:"$= (SetText)"
    This operation enables assignment to a text attribute or table cell, it is not useful for labels since no numerics are involved (use the existing FormatIntoLabel for these)
    This operations supports concatenation of references to build up strings, including numeric and label attributes and cells (which will be interpreted as their formatted text).
    The new '&' operation (not to be confused with '&&' enables multiple text to be appended together. Quoted strings eg "Hello" are supported. Single quoted characters are as well for example '"' inserts a double quote.
    So if you have

p.att1 = 1,234    (values with comma)
p.att2 = "test" (label)
p.att3 = "test2" (free text)
and you use:
p.att4 $= p.att1 & " blah " & p.att2 & ' ' & '"' & p.att3 & '"'
and will get the text:
1,234 blah test "test2"

  • NEW Attribute list now shows the Units of the attributes
  • CHANGE A lot of the code in PL where text/values/labels are formatted for presentation (including routine code, reference formatting, expression parser, file reading/saving) has been reworked to avoid using "stack based" temporary strings. Instead a string cache is used.
    This is intended to reduce stack overflow problems in recursive and deep routines where text processing is involved.
    A 'system error' has been added when PL closes which reports any buffer mismanagement. Please report if this error ever appears.


  • NEW Added a "Break" button in dialogs during edit mode which will throw a breakpoint
  • CHANGE Default comparison for an IF is now "att != 0" instead of "att == 1"
  • CHANGE Enabled PL's standard dialogs and Dialog() routine operation dialogs to use modern style controls (buttons, checkboxes, radio buttons, fields)
    Note some dialogs may have overlap issues to cleanup as the modern controls are somewhat chunkier
  • CHANGE Have reworked dialogs so the button order corresponds to the way Windows arranges buttons (OK/Cancel, Yes/No/Cancel Save/Discard/Cancel etc)
    TAB order should be as before. Please report any dialog which is inconsistent with this.
  • CHANGE Route dialog now has a close button instead of the pointless ok/cancel
  • FIX Multi-line table rows did not display the last row due to offset in the
    font calculations. This was noticeable for 2 and 3 line table cells.


  • FIX 5.22q had broken creation of standalone apps due to missing updating a call to a callback function. The standalone loader was being left with nothing to do.


  • NEW Added an "Over" button in the breakpoint dialog; the routine engine now supports stepping over blocks of code/subroutine calls
  • CHANGE When an iterate or while is interrupted, PL will open a breakpoint dialog instead of the model error dialog. This enables the run to be inspected and continued.
    If you want to stop the run, select the "terminate run" check box to force it to break out.
  • NEW Engine option "Globally Disable Panel Auto-Resize"
    This prevents the propagation of resize updates AND broadcasts for all panels which have the "Auto Fit Panel To Window" option on and make use of PL repositioning objects dynamically using the anchor settings.
    This makes it easier to disable this behaviour when panel sizes and layouts are being created/updated.
    Don't toggle this option whilst on a panel which has the "Auto Fit Panel To Window" option on, having the option change whilst a potentially dynamic panel is open has not been considered.
  • CHANGE Reworked file handling during load/save model.
    Implement a read only test:

- If a loaded model is read only PL will give a
warning but continue loading
- If a saved model is read only, PL will give a warning
and put up file dialog to enable selection of another file
This is useful where a source code management system is being used to manage multiple modellers editing MDL files.

  • FIX A leak in DLL calls where 'table direct' parameters are being passed (where the DLL directly interacts with PL's table memory).
    Every call was leaking (sizeof(ptr) * #-of-columns)) bytes
  • FIX The model hierarchy view could be selected whilst there was a combo box open in a table filter/cell view, changing panel would crash PL
  • FIX When a table filter caused no rows to be displayed, the row edit menu contained inappropriate options selected which could cause a crash if the actual table contained no data.
  • FIX Fixed cancelling when prompted for the name of an item to add to a DB
  • FIX jump To Block Start (shortcut [) in the routine editor now works at an ELSE statement
  • FIX Adding a table to the Data Object list updates the editor


  • NEW Routine operation CreateLabelAlias
    This enables an alias to be added to a specified index (which must be a normal label list). The routine returns a status code:
    0: Alias was assigned (or already existed for that label) 1: Alias failed (it is already another label or an alias to another label)
  • NEW Command line execute option "Keep Child Process At Front" PL will bring the child processes main window to the front if PL gets focus whilst waiting for the child process to complete.
    TIP:If possible, prevent the user minimising the child processes window
  • FIX SetViewportScroll() now works properly if the viewport has hidden scrollbars. Previously it would not update the view.
  • FIX "Wait For Process To Complete" command line execute would cause a fault if the menubar was hidden
  • FIX Enable setting the "Application Name" when building an Unkeyed Application. This field affects what is seen in the About box


  • FIX Typo in column option
  • NEW Implement inline multiline free text cell edit in tables to enable this format a column for free text, set the number of row lines to > 1 and enable the "edit labels with field" option.
    Instead of popping up a window to edit free text, the text will be edited in-place
    NOTE: no scrollbar is shown for the field as clicking it closes the edit (since it loses focus) and I have't found a way around it.
  • NEW Experimental options "Anchor Left" and "Anchor Top" These options were implicit when "Anchor Right" and "Anchor Bottom" were off respectively. They still are.
    However, if both Anchor Left and Anchor Right are selected (for the x axis) or Anchor Top and Anchor Bottom (for the y axis) then it indicates that you want to anchor both sides of the object so they stay the same relative distance from the panel border when the panel is resized.
    This is achieved by resizing the object as the poanel resizes.
    This is useful in cases where a single object (eg: a map or table) should stretch to fit the available space (width, height, or both)

Modeller code will be  required to support multiple objects sharing
a space since no attempt is made to share/apportion space between
multiple objects.
WARNING: Automatic resizing of objects works by maintaining the distance between the edges and the margins. If the panel is shrunk so much that the object becomes zero width, it cant shrink anymore and the object will lose its positioning even when the panel is later grown again.
So ensure you set the minimum panel width/height to reasonable values which will prevent the panel being shrunk so much as to squeeze the life out of your panel objects.
Also reminder that inheriting off a panel with anchored objects is a bad idea since the objects on the inherited panels will lose their positions relative to that panel's borders when the parent panel repositions the objects on it.

NEW Command line execution in change object can now build a command line out of multiple labels and literal text. This is enabled by selecting the "Command:Set By Expression" option.
The same processor as used for SQL is used, so a command line like:
"NOTEPAD " & '"' & p.attribute & '"'
will become (if p.attribute is label: test.txt
NOTEPAD "test.txt"
p.xxxxx can be used to substitute a portal attribute and

i.xxxx  can be used for an item attribute
A future version will enable more expression terms (eg: call references) and popup completions. The existing expression editor cannot be used directly as its set up for numerical expressions, not textual content.

  • CHANGE Removed end-ellipses from multiline text fields as it messed up text display when more lines existed than could be fit into the table cell.
    (DT_END_ELLIPSES option on DrawText() causes this oddity. My bad for trusting MS to render something instead of doing it myself)


  • FIX Hide Repeated Values option in tables was broke
  • FIX ResetBillboardTable option removed
  • FIX Fix customise ICO feature; the ID allocation had a bug that upset Win64


  • NEW Change->File Execute Program now has a new option: "Wait For Process To Complete".
    This will cause Planimate to wait until the executed process closes. PL will be non-responsive but will repaint and be repositionable while waiting.

  • NEW Installed a new random number generator. The new generator generates 32 bit values instead of the old 15 bit one (which had only 32768 possible values on a uniform value).
    The way the new generator is initialised has also been improved to use a statistically better initialising generator.
    For backward compatibiltiy, the original generator is still present and will be enabled when loading older models. This is controlled by the Engine Option "Use Old Random Number Generator".
    With this option on, a model should exhibit the same random number draws as in previous PL versions. If backward compatibility of random numbers is not required, this option should be turned off.
    Note that whilst models will experience the same random sequence with the old generator selected, the preview plots between current and previous PL versions will differ. This is due to the way the preview generator is seeded.
    (During editing generators are re-initialised when the distribution dialog is opened. This does not affect runs as the generators are reseeded at run start).
  • CHANGE Enhanced File->Model properties to report on scoped label lists and their contents in the model.


  • NEW The application compiler supports customisation of the compiled EXE. The Application icon (what you see in explorer) and the Window Icon (what you see when you alt-tab and in window corner) can be separately set.
    The fields require windows format ICO files, not ICO libraries or DLLs.
    A single ICO file may contains bitmaps at multiple resolutions and colour depths. These days 16 colour icons are obsolete but the different resolutions ensure the icon looks good in the different explorer views.
    Typical resolutions include: 16x16,32x32,48x48

Vista introduces huge  256x256 size icons. They are supported too.
For more info on creating ICOs for your app:
Note than when you select the application icon the window icon field is automatically set the same. You can subsequently set the window icon to something different if you so desire, otherwise leave it the same as the application ICO.

  • NEW The application compiler can have an alternative "base" Planimate EXE specified. This is useful if you want to compile both 32 and 64 bit versions of your application.
    Be careful not to select a PL exe version which your model is not compatible with.
    To use the default (running EXE) in the compilation, leave the field blank.
    PL analyses the internal structure of the EXE you chose to compile your application with. If its a 64 bit version, the created file name has "_64" appended to it to assist in keeping track of 32 and 64 bit versions of the same application.
  • NEW Application compiler settings are now saved in the MDL file so next time you make an application, most of the settings are already set up.
  • NEW Application compiler no longer prompts to save the model before opening the compiler dialog.
    Instead, if the model needs saving, it will be saved when you OK the configuration dialog. This is to ensure any configuration default changes in the dialog get saved (otherwise an annoying double-save would be needed). If the model is already saved and no changes are made in the fields, it wont need to be saved again.
    If the model hasn't been saved yet (creating an application from a newly created model) then you will need to save it explicitly before invoking the application compiler.
  • NEW The application compiler now offers to open the folder containing a compiled EXE, once it has been created.
  • CHANGE Removed "Application Name" from end user model info. This is now one of the settings retained for the EXE maker.
    Previous settings of Application Name are transferred to the defaults
  • --
  • CHANGE The no-mans-land area to the left of the column headings/filter headings is now background-coloured using the data area background colour instead of the column heading/filter background colours.


  • FIX Merging classes/paths between models was causing the order of paths to be reversed since 5.22a.
  • FIX Dataset2 load change in J would cause exception if the dataset contained items that were not specified in the DS configuration table.


  • NEW DATASET2 Enhancement : Include External Files
    It is now possible to package files outside of PL into a dataset2 file.
    This will facilitate inclusion of multiple images, databases and other content outside of the model into dataset2 files, with the content being compressed and encrypted.
    To enable this, an optional extra column must be present in the dataset definition table: _ExternalFile This column specifies the path/filename to use and can be a label or free text.
    For a row to reference an external file, the _DataSetComponent column must have a 0 value and the 0 value must not map to a data object, otherwise the data object will take preference.
    The modeller is responsible for providing a filename both for saving the dataset (file is read) and loading the dataset (file is written). The modeller is responsible for:
  • taking care not to overwrite user's files (DataSet2 will not prompt for overwrite)
  • proper use of absolute and relative paths (remember in an application, options exist enabling the user to navigate to a different default folder than the application).
  • Ensuring filenames provided are valid and writeable
  • Checking the return code and Database defintion table result code for any errors that could occur when dealing with external files and datasets
  • NEW Added "Disable Filter" option to table columns. This prevents the user being able to filter using that column
  • FIX When used with free text, "Edit Labels With Field" option now also accepts text when the field is closed by clicking rather than pressing ENTER or TAB


  • NEW The table column option "Edit Labels With Field" now works with Free Text formatted columns. This enables free text to be edited "in place" using a single line field.
    Multiple lines and using ENTER/TAB for text within the field is not supported, ENTER/TAB act as for other cells.
    This is useful where single lines of arbitrary text (that PL will not be processing) need to be stored in a table cell.
  • CHANGE Reworked the broadcast receiver code to optimise it
  • CHANGE Added a forced unload of model loaded DLLs when switching to flow/interact or paint modes.
    This is useful when developing DLLs and the engine option "Keep DLLs Loaded On Engine Restarts" is on. Without this, the only way to unload DLLs was to restart PL.

  • FIX Broadcasts sent from an event on a view panel were not being properly received by entries on the "closest" dynamic panel. Reworked things so the events are received as expected.
  • FIX "Dont Initialise Run" option removal in 5.22g was failing when reporting the location of a button with the option on upon load
  • FIX Panel close broadcast was not being sent with the proper internal flags for popup panels; it was OK for the main window Panel Close broadcast.
    This caused side effects of the panel close broadcast (eg: sending another broadcast that was deferred until later on the FEC) not to be properly cleared.
  • FIX When a popup window was closed by the user (instead of the platform) a Popup Close (not Panel Close) broadcast was not being sent.
    Consolidated the popup allocation management code so the close broadcast would be send for the popup window.


  • FIX Table views were not de-registering resize broadcasts properly which would result in a crash when merging models together that used them but did not carry across the views in the merge.


  • NEW Column filters can now match multiple items; separate the items with ;
    So for example in a list of the standard colours, entering: *Green;*Blue would match "Blue", "Green", "Light Blue" and "Light Green"
    Note that spaces immediately after the ';' are ignored
  • NEW Table editing data export/clipboard export has a new option "2nd Col Labels". If this option is enabled and the 2nd title row option for columns is enabled, the second title row will be written to clipboard copies as well as the main column titles.
    NOTE: Importing of second title row is not supported at this time
  • CHANGE CopyToClipboard now supports the following option bits
    1: row labels 2: col labels 4: formatted 8: 2nd column label row
    add together the options you want for the options value
  • REMOVE Removed the "Dont initialise run" options for broadcast buttons and portal clicks. This used to enabling handling of events without starting the run engine but it has become obsolete as most operations these days rely on the engine being properly initialised, including error handling.
  • FIX The s.AutomaticallyRestartAfterError flag now works for errors triggered from buttons sending a broadcast.


  • NEW Added "Log Normal" distribution to distribution dialog
  • NEW The change-file operation "Execute Command" now allows use of double quotes (") and a longer command string. This is useful when passing parameters to commands where quotes are needed.
  • NEW System attribute "LastErrorFileNamePath"
    This string is set to the filename where the last model stop error is written to. It is useful when s.AutomaticallyRestartAfterError is used and s.LastRunStopReason is set to 4 (error in model)
  • CHANGE The run error report file is now always written to the temporary directory. This reduces junk buildup in the work directory.
  • CHANGE The existing system attribute s.AutomaticallyRestartAfterError now has different behaviour in a compiled application.
    With an MDL, it causes PL to automatically restart the model after showing the standard error dialog, as long as the user does not click any buttons. This is useful for developers to "break in" to a broken model.
    With a compiled EXE, PL now automatically restarts without showing the error dialog. It is up to the modeller to test s.LastRunStopReason and if the model stopped because of an internal error, the modeller MUST warn the user that something unexpected went wrong and their in-memory data may now be a pile of steaming gibberish.
    Failing to give some warning will lead to inexplicable errors and likely data corruption since the user may be triggering bugs in the model that the developer is not aware of.


  • FIX Fixed an issue with item path management, introduced in 5.22a which caused crashes on saving models.
    Some bad code caused bogus item path records to be introduced into the model's datastructure. Normally these would be ignored and purged but in the case where a portal with no flows was deleted, a bogus record-manager class (for the now non-existent subsystem) was being created. This would then write junk to the saved model which would cause the model to load OK but then crash on subsequent save if some editing action didn't trigger the autopurge first.
    Apart from fixing the root cause (a missing test when looking up paths) a number of tests have been added to help identify bad path records upon load.
    Please contact ID if your model reports a strange message when loading your model and it cannot correct it.
    Thanks to Howard for identifying this and providing a repeatable procedure.
  • FIX View panels were not being correctly placed in the model hierarchy due This messed up the display of view panels in the sidebar particularly when they were arranged in hierachies. This did not damange the model but just made view panels appear in the wrong place in the list.


  • NEW Using set (=) you can set an item table reference to a data object reference which is pointing at a table
  • NEW Routine operation "GetColSecondTitle" enables the second title row for a text to be read and placed in a label
  • NEW The advance to time dialog has a new checkbox "Pause after advancing".
    This is only available when running in editing mode and is useful for advancing to a time for debugging without having to manually pause the engine.
  • FIX object co-ordinates are now represented using a 4 byte int which will prevent wrapping at +/- 32767
    This is useful where object co-ordinates are dynamically caculated over a wide range of zoom levels


  • FIX Pipes and Spatial Links could malfunction if they received an unblock message for their control attribute as a result of the modeller changing that attribute in the _preinit broadcasts.
    They have been reworked so they only start receiving attribute change broadcasts once they are fully initialised.
  • SPEED Subroutine calls had an overhead due to memory allocation for "stacking" subroutine attributes between recursions of a subroutine.
    A cache has been added so non-recursive subroutine calls will process faster.

  • SPEED Change objects need undo buffers for undoing lookahead changes; these were being allocated in very large chunks, wasting a LOT of memory when there are 1000s of change objects. The allocation bucket size has been reduced to a more reasonable level and all buckets are retained for the duration of the run
  • SPEED A few objects in PL need to keep track of items in a list. Where possible this list is built out of the items themselves but in some cases this isn't possible as an item needs to be in multiple lists.
    These lists (reneg queue, dispatcher release, track loop delay trains) needed list nodes separate to the items to be allocated/deallocated.
    A method of recycling this list nodes has been added, just as already occurs with items and FEC events.
    This enables big runs to proceed with very little memory reallocation needed when "advancing to time".


  • NEW New value formats:
    "Fixed", "Fixed x,", "Percentage x.x%"
  • NEW IF/CASE/WHILE do not show "Event Details" in routine listing as their condition is already shown after the expression rework
  • NEW End User Option "Dont Steal Focus If Not Active"
    If this option is turned on, PL will not activate windows that appear if it is not the active application. This prevents PL popping up windows in front of other active applications.
  • NEW LabelList option: "DataSet2 Loads Labels By Index Not Label"
    With this option off dataset2 loads label references by attempting to match the label text and adding new labels if a match fails
    With this option on, the load is by index and no attempt is made to match the label text. This is useful when labels have been renamed but not reindexed.
    NOTE If a label list is specifically mentioned in the dataset2 Load definition table, then it will be reloaded anyway, overriding the usefulness of this new option.

  • NEW Engine option "Keep DLLs Loaded On Engine Restarts"
    This prevents DLLs being unloaded when the PL engine restarts. This is useful where a DLL is storing persistent state for a model whilst the model is loaded.
  • NEW Attribute editor "Attribute" button menu has a new option that enables the views of the attribute to be inspected and the panels they are on selected.
  • NEW INI file [edit] option PathInTitle if set, shows the entire directory path of the loaded model in the titlebar
  • FIX Error result setting handled properly for saveimage routine operation
  • FIX Last path is set for saveimage routine operation
  • FIX Attribute Reference editor dialog value field allows longer text so single field expressions (eg: row reference for a cell reference) can be edited using the dialog
  • CHANGE Increased the limits before PL nags about linkedlist size, table resize. Tables can be resized to 0 columns in the editor.

  • CHANGE Migrating attributes to owner in the attribute editor now requires a confirmation
  • FIX Table Views were ignoring a specific title color, always using the generic Text Color


    NOTE: this change impacts dataset2
    As part of progressing the PL coding environment, the rules for naming things are being tightened.
    In this release, the names of all label lists (modeller and system defined) must only contain the following characters:

A..Z  a..z  0..9  and _ (underscore) Note this applies to the names of label lists NOT the labels inside the lists. Old models and datasets that were created with pre-559 file version PL EXEs will be translated on load using the following rules: Spaces and other characters no longer allowed are replaced by underscore unless its the first character - then it becomes a z.This prevents modeller label lists being prefixed with an underscore. More than one underscore in a row is replaced by a single underscore For example: _Model Objects    becomes _Model_Objects Users & Passwords becomes Users_Passwords (UI)Menu1         becomes zUI_Menu1 NOTE: DataSet2 data saved with this version will have problems being loaded with previous versions of PL *IF* it uses label lists that were renamed as part of the translation to this version of PL. EG: If a dataset had a column formatted for "User IDs" then an older PL will end up with 2 lists when you load the data: "User_IDs" and "User IDs" which is most likely not what you want. Please read and bookmark this page for reference on the naming strategy: This namespace cleanup is important to enable better readability and editing of routine code; spaces and other symbols make code unreadable and complicate the editor.

  • CHANGE Names of some of the pre-defined PL label lists have been renamed, as announced above. If you have created a label list of label list names, you will need to manually update it and also manage backward compatability with any dataset depending on this list-of-label-list-names. add duplicate check except for system list

  • SPEED Label list references are stored in memory more efficiently.
  • SPEED When attributes were renamed in large models, it took a long time for PL to find references, query for updates and perform the updates to references. This has been greatly sped up by:
    Faster testing of item attribute flow usage Better management of class path data Remove obsolete tests
    In one model search/update times have been reduced from >30 seconds to 1 second which is important when many attributes are being updated/purged
  • SPEED Formatting attribute references has been greatly sped up (60x faster) This is in addition to change above.
  • FIX Fix to import into view routine operation clipboard handling (as was backported to 5.21s). This fixes issue introduced in 5.21r


  • NEW Auto Fit Panels - a.k.a. dynamic layout
    A number of new mechanisms have been introduced into PL which when used together enable models to have panels which automatically size to the window they are contained in.
    Details here:
    Sumamry of enhancements:
    New Panel-Engine option "Auto Fit Panel To Window" Panel-Work Area dialog has new "Minimum" fields Paint,View and ViewPort objects have a new "Anchor" option New "_Panel "_Panel Resized" broadcast
  • NEW Properties of table views can be read and set. These include co-ordinates and colours (including the advanced custom colours)
    The routine operations are GetViewProperty and SetViewProperty.
    This is useful in enabling a model to reposition and resize table views dynamically, ie: dynamic layout.
    As for the similar label list properties, there is a label list you can use: "_tableview properties" to refer to the properties.
  • NOTE Further to the announcement on changing the PL random generator in
    5.22 on idbase, changes will be implemented in such a way to support
    backwards compatibility.
  • This will occur in an upcoming release, not 5.22 as suggested.


  • NEW INI file option
    Sets how many characters code blocks get indented
  • CHANGE Copying from clipboard routines now use a temporary filename in the system TEMP folder and delete it after they are finished with it
  • CHANGE The standalone EXE packager will pull in DLL files into the DB as long as the "Always load DLLs from external files" option is not on.
  • CHANGE Column width limit increased to 255 characters
  • FIX Paint button images were not being updating when the image name was dynamically set due to the cached image not being flushed
  • FIX Removed bogus 'n' introduced into single line column titles with numbers shown
  • FIX Fixed a leak/attref scan error (thanks again Tom) in the routine editor. This one occured when a condition that was just a value was being translated into a comparison, as required for compatibility with the graphical editor
    eg: if (p.attribute) becomes if (p.attribute != 0)


  • NEW No clip option for table columns (experimental)
  • NEW Transparency for icons supported
    This is specified as a value from 0..255
0   = fully transparent
255 = fully opaque (default)
For objects (portals etc) the object attribute ObjectTransparency can be read/set (a repaintobjects is needed to update the screen)
For items System attribute s.ItemTransparency can be read/set

  • NEW System item attribute s.ItemRotation can be read/set to set the angle of the item's icon
    The value is in degrees

  • CHANGE Removed y offset being applied to items on a multiserver showing as "road". This keeps animation of single width roads straight
  • FIX Fixed cause of "AttRef Scan Count" errors (also could cause system error 1139)
    The field editor was not handing-off editing to the old skool condition editor dialog (eg using F2 in an IF condition), causing a leak of some undo data.
    Another thanks to Tom who tracked down the culprit
  • FIX Fixed ongoing issue of a model in an endless loop not being pauseable. PL was not clearing enough events from the Windows[tm] queue so it never got to the keypress events as other events (eg: timer) would pre-empt them.
    PL now clears the OS event queue upon every poll it makes. This should not affect model performance much but will make PL more responsive to redraws, moving its window etc even when it is simulating.


  • This version has new features and changes. Please test carefully.
  • NEW Table click broadcast enhancement
    Previous versions of PL had a "Send Broadcast AFter Edit" option which controlled how cell click broadcasts behaved.
    This has been changed into 2 new options:
    "Send Cell BC Before Edit" "Send Cell BC After Edit"
    Modellers can now select both these options and receive a broadcast both before and after a cell edit is performed.
    The table cell click broadcast includes a new attribute: "_beforeedit" which is non zero when the broadcast is being initiated "before" the cell edit.
    This is useful in this scenario:

user clicks a cell
model receives a cell click with _beforeedit = 1
model determines whether cell should be edited and sets
s.EnableTableCellEdit if it should
PL edits the cell
PL sends a second cell click BC with _beforeedit = 0
so the model can deal with the consequences of the edit

  • NEW Tables have option to show column numbers on their own row Note though the number will follow the alignment of the column labels. Also you need to set at least 2 column label rows for this to be useful
  • CHANGE Table view options will not show broadcast related options if there is no cell click broadcast assigned yet.
    When a cell click broadcast is selected, PL will automatically show the options dialog so the user can select WHEN the broadcast is to be sent, as there is no default before/after now, any combination of before/after/row and column broadcasts can apply to cell click broadcasts
  • NEW Portals can be renamed by their context menu (and also sidebar) this is useful in busy network models there portals are too close together to click under them
  • NEW Routine operations "FindColumnLabel" and "FindColumnTitle"
    This enables a column label/title to be located in a table based on any other formatted text (eg: another label list)
    Unlike the "Column Index" reference, they are not cached so they will work even if the table is changed at runtime.
  • CHANGE Object context menus display object list name if set
  • CHANGE Some tweaks to the route step editor
  • FIX Reworked some of the time code to remove pedantic compiler warnings
  • FIX Fixed a nasty couple of bugs where pasting smaller tables into the table editor would cause crashes in table editor and/or views
    Greetz go out to Tom for his efforts in finding a replicate procedure for this one


  • NEW Support "CONTINUE" routine operation
    This is used in a loop and causes the rest of the code to be skipped and the next iteration of the loop to be tested/performed.
    Its useful to filter out particular iterations from being processed
  • NEW Support "RETURN" routine operation
    This causes the routine to immediately exit (if used in a subroutine it will go back to its caller).
    Its useful to get-out fast if something isn't what you expect (avoids wrapping a lot of code in IFs)
    Consider readabiltiy when using this and CONTINUE; they should be used in clear up-front testing to avoid having to wrap all your code in an IF. Avoid burying them deep in core logic
  • FIX Bogus comma in search line text removed
  • FIX The time a model becomes paused is measured before the "animation starting" dialog is presented. This is useful when profiling an "advance to time" and you aren't around when the advance finishes
  • SPEED Cleanup and Inlined FEC code, went back to one list with priority regions Cleaned up the way PL tracks when changes during lookahead cannot undo Optimise SET operation Fast lookup for subroutine call Reduce paramters being passed around using routine handlers Inlined and optimised LinkedList (FEC uses it) Cache some routine line properties to avoid determining them dynamically Clean up iterate code Poll testing for events when advancing to time now uses new loop-end test system


  • NEW Table Columns have a new option "Dynamic Combo List" When used with the "Edit With Combo" option, it causes the combo box to dynamically generate and show a list of all the options that match what is typed by the user.
    This can be useful where there are many options making the full list too long to select from
    The "Select Existing Labels" option is also supported in which case the user must match an existing label before the field edit will close (or escape out).
  • NEW New option "Create Path Folders" for a change object->File operation configured to "Create folder".
    This will create every folder specified in a multi-level folder specification.
  • NEW System string attribute s.LoadFileNamePath
    This string attribute is set (for compiled PL app exes only) to the name of the first parameter passed to the EXE (whether from the command line or a file dropped using explorer).
    This enables a Planimate compiled application to respond to data files associated with it or dropped on its shortcut.
    The run start broadcast of an application can check the length of the attribute (routine op FormattedWidth) and then use it or format it into a label for file operations. It will be zero length if unset.

  • CHANGE Paint Button Broadcasts have a new _location attribute is set to the model object index of the
    closest portal up the hierachy that has an index set, 0 if none

  • CHANGE  the panel index that used to be sent with paint button click was always for closest dynamic panel. So if the button was on a "view panel" you did not get its index but rather the panel index of the owning dynamic panel. This has been corrected so the panel id is the actual id for the panel that the button is on.

CHANGE Renamed change object file operations, removed spaces (evantually these will be converted to routine operations)

  • CHANGE ShowPopupPanel at (-2,-2) should centre the window
  • FIX Fixed an issue where a table view with customised columns was pasted into a place where a pre-existing table with less columns picked up the scope, causing the customised view to attempt to reference columns that were not there


  • REMOVE Removed the "Round Values To Integers" option for attributes. This should be done in routine code now, and views support rounded displays.
    PL will report any attributes which had this option on when loading
  • SPEED Reworked item attribute lookups and added a caching mechanism which enables references to lookup item attribute quicker if the same item class uses the object with the reference
  • SPEED Reworked the number comparison code to use an algorithm that avoids the need for branching which speeds it up


  • FIX Table View Filter notification broadcasts are now sent when the table view is regenerated so that the filtered rows are in effect.
    The previous table rework was causing the filter change broadcast to be sent before the filtered rows had been determined, so it wasn't possible for that broadcast to query which rows were being shown
  • FIX Fix drawing of table views when the title is hidden. The smaller margin is now filled and the table border is displayed
  • FIX Reworked the way PL detects breaking out of a loop. If you are in developer mode and a model gets stuck in a loop, press <ESC> once and PL should respond within a second or 2.
    Do not press hold or press other keys or mouse events as they will delay when PL gets to process the <ESC> keypress


  • NEW Table views can send a "column width broadcast" when their columns are changed. This is useful for applications which keep track of a user's column width settings for individual views
  • SPEED Since 5.20i Planimate by default supported international locales for comparing strings. Unfortunately this has been found to slow down runs significantly so is now optional, using the end user option "Support Locale For Strings (slower)"
    This option is off by default so needs to be enabled if you are dealing with labels etc which contain extended characters
    A model that uses a lot of item attributes will be typically 300% faster


  • NEW Gantt option "Dont Show Zero Labels" prevents the gantt showing label index 0 in a bar label
  • NEW There are 3 new routine operations for searching
    Search() ReverseSearch() BinarySearch()
    capability is the same as previous versions, the main difference is the editing interface; the searches are configured with parameters and a condition like most other routine operations instead of a customised dialog box.
    Existing models will be updated to use one of these according to the options that were selected in the old search dialog
  • NEW System->Other attribute "JobID"
    This gives access to the existing command line option /JOBID=xxx where xxx is a number.
    It can be useful in passing a number to a model from the command line.
  • NEW Help menu option to generate the top level wiki page for system attributes
  • CHANGE System attributes are now internally managed using a table to make adding new ones easier and assist in generating documentation.
    The system attribute selection popupmenu is rearranged as a result.
    Additionally a few items that were previously hidden are now exposed.
  • FIX Editing expression shows dropdown suggestion in more cases than it used to
  • FIX Function key broadcasts are now sent without pausing the run engine Note: broadcasts sent whilst the engine is running are sent with the main panel id, not any popups that may happen to be open.
  • CHANGE function key broadcast will send F2 if a table view with focus doesn't claim it first
  • CHANGE function key broadcasts are sent globally, not scoped


  • FIX Fixes a bug introduced in 5.21 where a table will lose its horizontal scroll after the panel it is on is left or the model saved/reloaded


  • NEW Engine option "Always load DLLs from external files" This is useful where a DLL wont load using the PL memory loader
  • NEW Added new EndUser option "Send _Key BCast for function keys"
    This enables PL sending a new "_Key" broadcast when the function keys are pressed.
    2 attributes are set, _panel and _keycode
    _panel is set to the panel which had the focus when the key is pressed The _keycode is defined in the new label list "_keycodes"
    A broadcast is not sent for F2 because this is used by PL tables and field editors.
    A broadcast is not sent for F10 because Windows uses it to move focus to an applicaiton's menubar.


  • FIX Model explorer is locked out during paste and replace operations to avoid flicker
  • FIX Free text columns properly sorted
  • SPEED The way label indexes were automatically allocated was very inefficient and one source of slowdown for big models that create many portals.
    Dynamically created portals now get object labels allocated faster
  • SPEED Copying many portals was being slowed down by the "unique name generator" which "munges" the copied object's name so it doesn't conflict with existing names.
    A better approach now makes it possible for PL to copy/paste many objects much more quickly.
  • SPEED Broadcast entries registered slowly for many portals with broadcast entries in them


  • NEW New value unit "Value No Decimal" Rounds any decimal to a whole value
  • NEW New column option "Ignore Hover Colors" prevents hovers affecting a column
  • CHANGE Made the table editor alternate row colour a light grey rather than yellow (CellBackground2 #f0f0f0) but if you have already migrated to 5.21f your INI file will still have the old value.
  • CHANGE Now allow longer Paint text and tips (255 chars)
  • CHANGE Ctrl-clicking the "Reset Routine Fonts/Colours" button now forces defaults for non inverted display (mainly useful for me so I can save a model with dark text/light background routine editor colours).
  • FIX Loading pre version 447 models which included tracks would crash, now they load (still need updating to new track code).
    Previous workaround was to use version 5.10p etc to bring them forward first
  • FIX Fixed crash/lockup when loading an older model that used local route assignments in change objects instead of the global route list ids.
  • A note on Color and Colour:
  • Where text is read by a user (eg:dialog title) I tend to use "colour" in
  • keeping with PL's Australian origins.
  • Where text is interpreted/parsed/compiled, "color" is used in keeping with
  • standard use of color for programming APIs.


  • FIX Fixed issue which caused unexpected options to be turned on for a table view using column filters when loading an older format model (pre 5.21)
    This was caused by an internal field being changed from 16 bit to 32 bit (to store more options). Since the filter option was using bit 15, it was being sign extended into the newly available bits, effectively turning all the new options "on".
    If you have already loaded your model to post 5.21, you might want to confirm the options on any table views that had column filters turned on.
    It was not intended to enable hover tracking and hide cell borders for these tables automatically.


  • FIX Tables with no rows will still process horizontal scroll updates
  • NEW Settings->Engine options:
    "PBA User cannot CTRL-T"
    This prevents a user of a PBA using CTRL-T to stop the engine. (a developer in user mode can still use it)
    "PBA User cannot CTRL-G"
    This prevents a user of a PBA using CTRL-G to continue a run (a developer in user mode can still use it)
    Note that if the engine is somehow stopped in the PBA, CTRL-G will then work.
    "Do not poll for pause during PBA run"
    This prevents a user of a PBA from pausing simulation runs using the keyboard or mouse.
  • NEW Routine operation "Clear Filter" enables table filter to be cleared for a view on a panel of a table (or all views if the panel id is 0)
    This is useful after new data has been imported into the table.
  • CHANGE ESC no longer interrupts a long PL loop in a compiled application (PBA) This prevents users from accessing what should only be visible to developers.
  • CHANGE PL polls for pause events less often. This change accomodates modern faster PCs where polling too often wastes a lot of time.


  • FIX Fixed routine line display in references display (broken in 5.21)
  • CHANGE Routine editor shows dropdown list when backspacing through name
  • CHANGE Routine editor handles nested tables
    eg: t.table1[t.table2[1][c.bbb]][]
    CHANGE Routine editor removed field-in-button editor in condition edit dialog


  • FIX Fixed a bug in the reference formatter caused by an attempt to optimise it for large strings that was not compatible with expressions


  • FIX Fixed some border line issues with new table views and validate against invalid border styles


Its exactly 20 years since Doug & I started work on what we now call Planimate so to celebrate I've given PL a refreshed table editor The Table view and editor have been largely rewritten

  • View Option for resizeable columns (drag right border of cell to resize column)
  • Separate options to enable resize from column/data areas
  • -Double click column separator to autosize/autofit column
  • Option for hover tracking for table views has been added. This causes the current selection to follow the mouse cursor. The row, column and cell colors for the hover can be set
  • Alternate row label colours for cells and row labels make data easier to read. This is supoprted automatically by the view, modellers dont have to code it
  • Many customisable colours for the table view have been added (in the Graphics configuration dialog)
  • The Graphics configurations can be saved to files and reloaded. This is useful now there are so many colour properties. The files are saved in with a "VW" file extention
  • Table Edit windows (not views) now appear with a graphical scheme that can be edited in the [TableEditorColors] section of the Planimate INI file. The data in this section is compatible with VW files. Currently there is no per-table-editor customisation since thats what views are for.
  • Filtered views update properly when rows are added/removed
  • Cell properties edited in filtered view now apply properly to the cells in the filtered set
  • mouse wheel scrolling whilst editing a cell would do silly things
  • if a table has 0 column rows set, the table editor will still one row to facilitate editing by the modeller
  • In "single click to edit" mode, clicking on an unselected cell whilst there is a selection will clear the selection rather than initiate edit
  • dragging a selection would have an initial lag if the drag was started on the currently selected cell
  • many cases of missing redraws/updates when the tables column labels were changed or other changes made in the table editor now update both the editor and the views properly
  •  Row label size calculation is much faster, especially if only row label numbers are used
  • Row labels update properly when a filter selection changes the rows such as not to display rows needing long row numbers/row labels
  • Table views edit cells faster and with less flicker on complex panels (eg: with a lot of paint/other graphics) in cases where edit fields/ combo boxes do not extend past the borders of the table. Implemented multiple stages of selective redraw to reduce flicker/processing time).
  • NOTE the new colour properties are not yet editable by model code. This will be eventually addressed along with other view property access.
  • NEW Labels can now be up to 16383 characters long. This is useful where long strings are being processed/generated by code.
    This has required some rework of buffer management to prevent stack overflows in complex routines.
  • NEW Planiamte's tool kit iFlow now supports both RGB and palette colours specified in the one value. The colour palette will be enhanced to enable selection of colours by palette index or RGB value throughout the platform's use of colour.
    In the Graphics "VW" files mentioned above and the [TableEditorColors section of the INI file, RGB colors are specified using #RRGGBB form (in hex) whereas palette colours are decimal numbers, with 255 meaning transparent. See the INI file generated by this version of PL as an example.
    By editing the VW files generated by the Graphics dialog, you can manually bring in RGB colours at this time.
  • FIX Pressing F2 when editing a condition/search using expression now opens the correct editor. Note however that the expression has to be valid (ie: generate no errors) before PL will transition.
  • FIX The way some iFlow co-ordiante boxes were translated to Windows GDI (eg: paint rectangles) was inconsistent. This manifested itself when displaying with a zoom apart from 100% and would probably
    affect printing.
  • FIX An extra pixel added to lines to make sure they always draw has been removed as it was inconsistent. This might manifest as missing pixels in certain graph views; if this occurs let us know.
  • CHANGE Have made the default font used for table cells bigger as it was too small and did not render cleanly on systems with 120DPI fonts
  • CHANGE The status line and icon chooser label font are now set to an internally managed font
  • FIX Ensure obsolete routine operations are not selectable
  • REMOVE Route "Distance" setting; was not used for anything
  • NOTE Wholesale code rework (internal)
    Report any odd behaviour. Beyond the changes above. it might be
    attributed to:
  • Global renames of functions (particularly string) to abstract away from
    posix/C differences and MS compiler complaints
    Global renames to add some naming consistency
    More 64 bit time cleanups
    Cleanups to reduce warnings from the picky new MSVC2008 compiler
    Formatting/processing buffer sizing and handling rationalised/cleaned up


  • NEW Table views can now have resizeable columns
    Enabling the "Resizeable Columns" table option enables the columns to be resized by dragging on the column separator line
    Enabling "Column Separators" extends the column separator line up to the column label area


  • NEW Value format "RGB"
    This formats colour values as hex RRGGBB which is commonly used in graphics design.
    (internally they are represented as 00BBGGRR on x86 systems).
  • CHANGE Improved the "no outgoing flows" portal error message
  • CHANGE Cleanups to track system UI: "section details" menu option and dialog removed (the network details table replaces it) default name for track table is now "Track Network Details" automatically added section control columns have a default clear value of 100 New sections are automatically added to the model object list "Section Type" column is added to an automatically created Track Network Table Redundant naming options for track sections removed Sections are automatically added to the model object list A "Section Name" column in the track table stores the section model index

  • CHANGE Protect against multiple tracks in same direction between 2 objects since its not supported by track table


  • NEW INI file has new settings for:
StepEditorW  These set the size of the routine step editor dialog

ItemPopupW   Set the size of the item-click popup

DragGridX    Set the default movement grid
 Making the routine step editor bigger allows more space for the expression edit field

  • NEW Added some accellerator keys to the breakpoint dialog
  • FIX The locale change in 5.20i had more effects than anticipated especially on number formatting when not in a US/English locale, which caused problems with the number formatting code.
    The locale now only affects the string comparison code, as intended
  • CHANGE The "IDKBaseEnable" INI option is now renamed "UseOnlineHelp" to reflect its function
    Setting this will cause PL to use the wiki for context sensitive help instead of the local help files.
    Pressing CTRL whilst clicking a context help button toggles use of the local or online help.
  • REMOVE Obsolete routine operations for primary/secondary bookings, SetOncomingTrain and SetLookthroughJunction
  • REMOVE Track length setting - this can be managed by the modeller now


  • CHANGE Cleanup to toolkit to remove 32/64 bit compiler warnings. This should not have broken anything. Look out for any errors particularly with text handling.
  • NEW Routine operation "UnblockTrain" enables the modeller to trigger an unblock for all blocked trains or a specific train ID.
    if ID is 0 then an unblock attempt is made for all trains
    If ID is set > 0 then an unblock attempt is made only for the specific item with the matching item ID
    The detailed way it works is as follows: An unblock event gets posted to the FEC with the train ID to try. When the event is processed, if the blocked train is still in the blocked train list, it and only it will get an unblock attempt.
    This makes this operation safe even if the train already became unblocked (or even exitted the model) before the unblock message it processed.
    This operation is useful where the modeller knows a state change in a track network can release trains. If the train ID is known, then using it can avoid the platform unnecessarily testing all the blocked trains. This will improve performance in networks with many blocked trains.
  • NEW Conditions can be edited using the expression editor. They remain internally represented in the condition structures to retain compatability with the graphical condition editor and the binary search mechanisms.
    Retaining compatibility has 2 side effects:

- conditions display with AND and OR but when edited will use
&& and ||, the expression lanuage notation for AND and OR
- since the condition editor does not follow BODMAS but the expression
editor does, brackets will be automatically added to clarify the
order that evaluations are done. The current algorithm is a bit
excessive with the brackets.

FIX Handling of lower case and text sort order now follows current locale

  • FIX Planimate now treats non breaking whitespace (0xA0) as a space when trimming spaces from labels
  • FIX Removed ability to edit references when a route assign change object is opened during simulation (it can still be inspected).
  • FIX Fix track network details build not setting the tuple names of columns it newly added, causing it to add them again
  • CHANGE Better memory management when a new table is created


  • NEW Further rework to track section time handling. This affects track models. They will need minor alteration with this PL version:
    This is the final major rework of the PL track infrastructure, the supporting model code is currently being finalised.
    1. Automatically Generated Section Location Table always on
    Track sections now always use a table to control their times and restriction level. In past versions, sections could be manually configured in interaction mode.
    2. Section Time Column Specification
    The way that trains identify which column their section run time should be read from has been changed. In past versions, a modeller defined attribute was used. Now, 2 new system maintained item attributes are used:
    s.ItemTrackForwardColumn s.ItemTrackReverseColumn
    For existing models which work in 5.20g
    These attributes need to be set to the *column* index in the Network Location table where times for the train at each section will be read. PL will automatically look up the times for the section in the Network Locations table.
    This is a case of finding references to the existing item attributes that the model was using and replacing them with references to the system item attributes.
    Its important that both "forward" and "reverse" directions are set up (but they can point to the same column).
    3. Obsolete system attributes have been removed
    The following track related attributes are now remvoed and existing references will cause errors when the model is run (which assist in locating them).
    s.BookingId s.ForcedStop s.InLoopInRoutine s.InLoopOutRoutine s.InJunctionLoop
    4. Automatic creation of the Network Location table
    When the model is started, PL checks the table referenced in the Network Details dialog exists and contains the From and To columns. If it doesn't, the user will be asked whether to create it.
    These changes are part of the consolidation of the track system capabilities and will reduce resource usage and decrease run time for large track models (avoiding the use of memory hungry references and avoiding item attribute lookups for every train movement).
  • NEW End User Option "Center Icons On Spatial Links" causes ioons on all spatial links to be drawn centred rather than against their bottom left corner

  • CHANGE Label list handling of empty labels in the table editor has been cleaned up.
    A new label list option "Interpret Empty Input As Label Index 0" controls the behaviour
    Off (default):
    If an empty label is entered (eg: in a combo field) and enter is pressed to accept it, it is treated as cancel and ignored
    If an empty label is entered then it is stored as label index 0
    This helps prevent empty labels ending up in label lists due to sloppy user editing.
    Note that if a label list already contains an empty label at a non zero index, PL will attempt to continue using its index. However its recommended that empty labels be reindexed to 0.
  • CHANGE DataSet2 had the tendency to add "0" as a label for numerical 0's in the data which didnt actually correspond to a label. The label list option "Interpret '0' As Label Index 0" is now handled by the dataset2 label loader and such indicies will stay 0.

  • CHANGE The ReFilterTableView routine operation will now apply to all views of a table if the panel index is set to 0
  • CHANGE See 5.20e release notes below for new note on a change to CopyFromClipboard. This note was missed from the release and affects how the "options" value is treated.
  • CHANGE Internal rework to support 64 bit platform. This should not affect the 32 bit version.

5.20g [new file version]

  • NEW New routine operations
    allow a viewport's zoom/scroll to be queried dynamically.
  • FIX Attributes modified while DisableUndo is set no longer initiate unblocks on dependent objects/views.
  • FIX Customised table views would be lost after an undo of a table edit for their table
  • CHANGE Reworked code for setting attributes and cells to support a "no updates" mechanism in a more straightforward way. No expected model impact.
  • REMOVE Removed section booking support (primary and secondary) This can be implemented in the model directly
  • REMOVE Obsolete portal option "Oncoming Train Check"
  • REMOVE Obsolete portal option "Act As Junction"

5.20e [new MDL file version]

  • NEW Routine operation CopyFromView copies a cell or selection from a table view, like CTRL-C. The panel and table specify which table view.
  • NEW System attribute s.DisableUndo (Run Engine) enables the modeller to disable the undo/revert mechanism that normally occurs when a routine is executed during lookahead (before the item actually moves).
    Setting this non zero will cause attributes and tables altered during lookahead to retain whatever is done to them after the lookahead is complete.
    The modeller must set this value back to zero before the routine finishes or an error will be reported.
    This is intended for advanced users who are hooking into Planimate's lookahead mechanism, for example in routing trains. A previous "hack" way of achieving this functionality was to send a message during lookahead, since the undo mechanism did not extend to the message.
  • CHANGE CopyFromClipboard has different behaviour for the options.
    It now requires "options" to be set; 0 no longer defaults to using the clipboard options. The bits are: 1: row labels 2: col labels $: formatted
    So formatted with column labels needs value of 6

  • CHANGE The MatchedIndex reference type no longer stops with an error if a matching error occurs, it just returns 0.
    This enables simple searches to be replaced with matchedindex references which is both faster and more memory efficient.
  • CHANGE Routine operation ImportIntoView renamed PasteIntoView
  • CHANGE Control key navigation no longer possible in user mode, to prevent users going places the modeller didnt intend
  • CHANGE The internal type of the iterate variable in a SEARCH operation has been changed to a long integer.
    This means the search iterator variable will be treated as an integer and is limited to about 2 billion before it rolls over.
    This should not affect any existing models.
  • CHANGE The mechanism for allowing breaking out of endless loops will now work for situations where routines are calling other routines. (the breakout poll counter is only reset when an event with a different time occurs).
  • FIX Purge attributes will no longer remove an attribute that is in the data objects list
  • FIX Track Swap Ends was broken

5.20d (new MDL file version)

  • NEW Table views with the column filter option enabled have a new option in their configuration context menu to specify a "Filter Broadcast". This gets sent after a change is made to the filters.
    It is useful where an update or resort is needed after a new filter has been selected.
    As for a table click broadcast, the view column, actual column and data id are set. Refer to the tuple reference (help menu) for the actual attribute names


CHANGE Track log item parameters are no longer sent back from a message item to the parent of the message. These include:

- loop enter/exit start/end delay times
- section nominal running time (s.TrackSectionNominalTime)
- section id (s.TrackLastSectionId)
- road id (s.TrackLastSectionRoad)
These parameters, logged and maintained by the track system, were being overwritten when a message item returned.

CHANGE An item that carries other items used to be called an "Agnet" its now called a "Carrier", a clearer term.

  • CHANGE s.ItemActAsAgent has been renamed s.ItemActAsCarrier

CHANGE "Agent Drop-OfF" has been renamed to "DropOff" and "Agent Pick-Up"  has been renamed to "PickUp"

CHANGE PL no longer has the "agent" checkbox when a new class is named. This can still be set:

- from the item class context as a defaullt
- dynamically using the s.ItemActAsCarrier attribute

CHANGE Table Click Broadcast behaviour:

1) table clicks now send 2 additional attributes _from_row and _from_col pass the top left corner of any selected region. If there is no selected region, they are set to the current cell (like _row,_col)
2) the _to_row and _to_col attributes will now be set to the bottom right of any selected region even for all table clicks. In past versions, they were set to the current cell for cell clicks/context clicks.

  • REMOVE Panel display options "Show Loop Names" "Show Item Paths" "Show Agent Paths"
    are removed. Show/Hide flows from the background context menu is still supported


CHANGE Planimate no longer uses track loop objects.
Track loops are now implemented using portal logic code. Documentation and demonstration models of this capability will be forthcoming
Old models containing them will give an error on load.

Current PL license holders should  contact ID for assistance
if they need assistance porting track loops.

  • NEW Sub Label list option "User Can Add Labels" With this option selected, labels typed into table fields/combos will be added to the sublabel list and also to the parent label list if they were not already members.
  • CHANGE The reallocate table rows operation will now release the allocated memory for a table if its count is 0 and the table contains 0 rows
    This provides a way to release large allocated tables but be careful about fragmentation if you allocate/deallocate frequently.
  • SPEED inlined some table code for speed
  • CHANGE Track rework tech details:

- removed loop object
- track object reworked to assume just 2 endpoints
(trackstation) which interface to portals and
a section inbetween
- found that tracks were repeatedly saving static
data, wasting MDL space
- track runtime code uses direct references between the
section/endpoints (no lookups needed now)
- route stores pointers to Portals now since no other
object can be on route
- removed base class for section and station,
section instance and station instance
section is just a simobject (like a spatial link)
station is now standalone as its just an interface class
- station/stationinstance no longer inherit from
simobject/instanceobject since they dont use 90% of
the functionality
- section names kept more in sync with endpoints
- Added an abstration layer for the FEC to manage objects
with (so it can send loop delay notifications to
- menu cleanups to remove loop references
- loop attributes left in place but return 0
- TrackLoop and TrackStation no longer reistered
PL objects
- inlined a LOT of code
- removed a LOT of track lookups and searches that are not
needed (some might reappear as services to the modeller later)


  • NEW A new DLL data interface mode has been added, TABLEDIRECT which enables PL to pass table memory directly to the DLL which can read and write to it.
    PL must preallocate the maximum number of rows the DLL would need, but it eliminates a 2 step copy process between the DLL, the dll interface and PL itself, allowing huge tables (millions of rows) to be shared by PL and DLLs that generate and process them.
  • SPEED Have rewritten the PL FEC to optimise it for speed. All event processing should be faster. I'm interested in observed performance vs. 5.10o


  • NEW /DEBUGDLL command line option enables DLLs to be debugged using an external debugger. Normally PL loads DLLs in a way that does not enable them to be debugged.
  • CHANGE Distribution patterns supported 2 ways of generating PDF/CDFs, using an internal, hidden table and using a model table reference.
    They now just support the model table reference, which keeps the data exposed and simplifies their UI.
  • CHANGE Some optimisations to the label list code for faster adding
  • FIX Viewports inside view panels would not animate smooth because the owning view panel had an "Update Interval Scale" of 0 which could not be edited.
    It was this way since normally view panels do not contain dynamic objects to animate. View ports change all that.
    This property can now be set from the background context menu. If you have a viewport with dynamic animation, set the "Update Interval Scale" to 1, or whatever fraction of the nominal interval you want the viewport to update at.
  • REMOVE Removed the range checking option from attributes.
  • REMOVE Removed billboard tables. Old models using them will not load
  • REMOVE Menu item to access the old icon editor. You can still call up its EXE manually for the time being but future versions of PL will be abandoning the ICN format
    You can convert ICN to BMP using Tools->Resource File Admin


  • NEW Penel-Engine Option "Broadcast Track Clicks" enables a broadcast to be sent when a user clicks on a track section. This includes details on the end points, section object index and mouse co-ordinates.
    Help-Broadcast Tuple Reference-TrackClicked documents the fields
  • NEW Routine operation "TableReferenceSet"
    This will return non zero if a table reference resolves to an actual table. This is useful in testing if an item table reference is actually set to anything, enabling say a module to have optional table parameters.
  • NEW LogDrivenGraphs now also send broadcast on the right mouse button. the new "_buttons" attribute is set to 1 for left button and 2 for right button.
    This can be used to add modeller defined context menus to log driven graphs

  • NEW Table clicks now send "_buttons" as well (1=left,2=right) to be consistent with other broadcasts. _contextclick is still sent for compatability.
  • NEW Column option "No Combo If Only 1 element" will suppress a table combo dropdown appearing if the label list associated with the cell has only one member, however a cell click broadcast will still be sent. This is useful in some UI situations.
  • FIX PL no longer requires all the parameters to a DLL to be respecified if the DLL's parameter counts change. This helps when editing a model with a new version of a DLL
  • FIX PL will now pass tables with zero rows to a DLL so the DLL will still see the number of columns that were allocated. This prevents DLLs from giving validation errors.
  • FIX A buffer in the table click broadcast send code was not big enough (no reported issues with this)


  • NEW Label lists have a new option "Remove Leading Spaces" This works like the "Remove Trailing Spaces" option except for leading spaces; any such spaces from user input or imported data are removed.
  • NEW New viewport option "Wheel Scroll On Click" enables a viewport with the "directly handle clicks" option OFF to be clicked (to get focus) and then scrolled with the mouse wheel.
  • NEW Added support for out-of-scope writing to item table references.
    The routine operation "OutOfScopeWrite" enables writes to an item table reference pointing to a table which is not in scope. The item table reference concerned needs to be passed as the parameter. Write access to the table will then be allowed for that item.write access will only be granted if the item table reference is
     -- pointing to a table at the time the OutOfScopeWrite() operation is performed
     --out of scope write access is lost when the item table reference is reassigned or cleared
     --out of scope write access does not carry through message sends or returns, broadcasts or items split from the original item.


item table references can always be written to if the table is in scope at the location where the reference is used. Getting permission with OutOfScopeWrite() is not necessary in this case

This operation can lead to hard to debug code, since table access can be occuring from unexpected places. The routine operation can be searched for (using the Find routine operation capability).

A key benefit of this feature is enabling code reuse and empowering modules to operate on table data they are "called" with.

<sup</sup>FIX Module loading/model merge code now supports data object reference, including references to label lists in the data object list. Its quite complex to implement as there are 2 levels of merge needed, firstly the data object references are merged then the label lists are merged (which may merge data object lists when lists are combined).

  • FIX Using SetViewportScroll() on a visible viewport has immediate effect
  • FIX Rework scrollbar code; scrolling should be smoother in popup dialogs


  • CHANGE The HandlePopupMenu and SetMenuBar routine operations now will read 2 additional columns in the menu table, if they exist.
    IF THE MODELLER WAS USING COLUMN 4 or 5 for their own data, this data needs to be moved as the menu ops will use what is in column 4 and 5.
    The existing columns were:

column 1: depth
column 2: code            (refer to 5.09f notes)
column 3: label
column 4: disable flag, 0 = item enabled, 1 = item disabled
column 5: tick mark,    0 = no tick,      1 = ticked

**  Older models using HandlePopupMenu and SetMenuBar with additional
**  modeller data in columns after the first 3 will need updating.
 It is intended that these columns will eventually be labelled but this has not been incorporated in this release.

  • NEW Change->File option "Execute commands using shell"
    When this option is selected, executed commands are processed via the windows shell rather than the low level EXE loader.
    This enables URLs and data files to be launched, with Windows automatically determining the application to open the data files with as happens when they are double clicked.
  • NEW Change->File Option "Dynamic Command"
    When this option is selected, a command line for the execute command feature is specified using a reference, like a dynamic file reference. The default is a "0" or "1" which obviously wont achieve much. A label reference will usually be useful.
  • FIX Some of the obscure file operations might have autopurged themselves (eg: DeleteResource), now fixed


  • NEW Log driven graph data and configuration tables can now have a column _colorrgb. If this column is present, the cell provides the colour as an RGB value rather than a palette index, enabling any colour to be specified.
    This column overrides _color if both are present in the same table.
    The EncodeRGB() routine operation may be handy.
  • NEW Routine Operations InterpolateValue (Arithmetic) InterpolateColor (Paint)
    InterpolateValue can be used to compute an interpolated value between value1 and value2 based on a ratio value. If the ratio is 0.0 then value1 is returned, if its 1.0 then value2 is returned.
    InterpolateColor does the same thing except it works for RGB colour values, which represent a colour by 3 bytes packed together and hence need special handling to interpolate correctly.
  • CHANGE Internal graphics code uses more RGB colours with translation from palette colours moved to higher levels. The palette handling code should still be intact so palettised images are still supported.


  • NEW Table option "Lock Cell Format"
    This option prevents table cell formats being copied (losing the existing format) when routine code assigns a table, row or column to another table, row or column.
    This makes it easier to transfer data to a view which has customised cell formats. This option will be on for newly added tables and off for tables in previous models. Turning it on also speeds up table data copying.
    Note: when setting one table to another ie:
    t.table2[] = t.table1[]
    cell formats in t.table2 will only be retained if the 2 tables are identically sized before the assignment.
  • NEW New option Settings->End User option "Defer display until Model Loaded BC"
    This prevents a model loading in User Mode or as an application from displaying anything in the main window to after the Model Loaded broadcast has been sent. This is useful for applications which need to process some data before presenting an initial display to the end user.
  • FIX Paint palette works again
  • CHANGE Graphics internals pen/brush caching removed, some internal cleanup to support future graphics features
    Removed palette oriented pen/brush cache in preparation for supporting RGB colors in PL


  • NEW Condition editor reference buttons now use inplace field editors like the routine editor (if enabled). This enables typing of references, adding attributes on the fly etc.
    Also as with the routine editor, pressing F2 opens the full reference selector dialog.
  • FIX The menubar handler now waits for button up status to prevent bogus "pause" dialogs appearing when user menubar options trigger broadcasts (and hence the run engine) which were seeing the mouse button as down even though a mouseup event had already occurred.

  • FIX Points/blobs in graphs are now properly clipped


  • FIX If clicking on an object in a viewport caused a model error which stopped the run AND hover broadcasts were enabled, the platform would crash due to hover broadcast being sent as the run was being shutdown
  • FIX Log driven graph lockup when autoscaling was enabled but there were no points to plot
  • FIX Prevent some junk being drawn on edges of graphs when they have been scrolled


  • FIX Viewports without a view no longer block clicks
  • FIX Viewport's show flow lines when parent is a view
  • FIx Breaking out of an iterate tables loop was broken
  • FIX If a model's DB became inaccessible whilst the model was loaded (eg: network share) then PL would crash when new model was being processed even though the DB wasn't necessary.
  • CHANGE An unconnected wormhole exit now gives an error rather than acting blocked. this has enabled:
  • CHANGE The Paint Button ImageWidth/ImageHeight properties now evaluate the state attribute of the button when determining which image to return information for. This is useful as it means you can query the image information of a button before it has actually been redrawn in a changed state.
  • SPEED A lot of function inlining (preventing calls) and cleanup has resulted in reduction of core engine processing overheads:

- item create/destroy/enter/exit monitoring at portals
(whether portal monitoring was enabled or not) is faster
- all exits process lookaheads slightly faster
- class mapper/unmapper calls in portals that dont use them (ie: most)
now avoids unneded checking
- unblocking stack depth checking is faster (UnblockPrevious())
- routine case handler current-line tracking faster
(needed so PL can report which line when a model error occurs)
- iterate/iterate table current-line tracking faster


  • NEW New format "OS Percent" is like value except values are scaled by 100 and a % is appended
    Input wise, it handles values with a leading, trailing or no percent symbol.
  • FIX If a table view scroll was linked to a broadcast and that broadcast did a repaint and that repaint caused the table view to redraw and it that redraw determined that a scroll bar was not necessary then a crash would occur as PL attempted to query the now non-existent scroll bars position in the original scroll handler
  • FIX Fix reference expression parser: index was not being deleted in unexpected cases causing a leak and an attref scan error to be reported as a result
  • FIX Reworked endpoint plotting for column overlay graphs to handle closing/opening of bars at the endpoints vs. points. This should remove unexpected things at the right hand side and stray points at the LHS in point mode.


  • NEW Routine operation "SetViewportTarget"
    This enables the target of a viewport to be set dynamically.
    It takes 3 parameters: Panel With Viewport Current Panel Inside Viewport New Panel Inside Viewport
    "Panel With Viewport" and "Current Panel Inside Viewport" identify the viewport to modify.
    Current Panel can be 0 to specify the first viewport found; this is useful if the panel only contains one viewport.
    Panel With Viewport can be 0 to specify the toplevel panel
    The New Panel can be 0 to specify "no panel" in which case the viewport becomes hidden in user mode.
    Panel references can either be object list references (need to be portals) or panel list references.
    Updates are applied immediately; no force repaint is needed.
  • NEW Enhanced portal subsystem menu and hence sidebar context menu (more options available)
  • NEW Enhanced viewport editing including ability to fit to viewed portal
  • CHANGE Unlinked viewports no longer display in user mode


  • NEW A number of new value formats have been added which use the user's locale settings in the operating system (OS) to perform formatting and parsing of values.
    These are particularly useful in interfacing to other apps which expect data in a local locale format.
    The new formats are: "OS Date Time", "OS Date", "OS Time", "OS Currency", "OS Value"
    NOTE: Since these formats are locale/user specific, a formatted DAT file written using these formats may not be readable by an instance of Planimate running in a different locale.


  • NEW The Switch mode "Lookahead Separator" has been repurposed to "Track Lookahead Separator".
    In this mode a switch will forward track "checknext" lookahead tests out the first outgoing path. Any other tests including normal item lookaheads and movements are directed out the second outgoing path.
    The "Assume No Blocking" option works on the second path. Track CheckNext tests (out the first path) do not depend on the setting of this option and are always performed. Things are easier to work with if the assume no blocking option is on.
    This mode is useful in track models where the modeller is adding logic to Planimate's track "far" lookahead rules. It makes it easier to separate the "far lookahead" flow from the actual item movement flow.
    The suggested method:
    Separator switches after portal entries connected to tracks should have assume no blocking off
    Separator switches after modeller capacity/wormhole entries etc (where the modeller is triggering the track checknext lookahead) should have the "assume no blocking" option on. Otherwise they are more complicated to work with (you have to lookahead twice, second time without track checknext).
  • NEW A new routine operation "EnableTrackCheckNext" enables a tracks modeller to convert a standard Planiamte lookahead (eg: when an item is about to leave a capacity in a portal) into a track lookahead detectable by the "Track Lookahead Separator" switch mode.
    This is useful where items are being transferred between different track networks, eg: using wormholes.
    The operation executes during lookahead and is automatically undo by Planimate when the lookahead thread unwinds behind the change object. If PL is already doing a track lookahead or an item is actually moving, the operation does nothing.
  • CHANGE Switches no longer cache decisions made during track lookahead. This shouldn't affect existing models as the track lookahead mechanism already purges the cached decisions. This change makes the EnableTrackCheckNext routine operation work properly for switches in the track lookahead path (following the separator, which already works ok).
  • CHANGE The switch has been optimised. Some switch modes are now more efficient in cases where the switch is used by the same class in succession.
  • NEW RHS Y Scale for log driven graphs.
    This enables graph data with 2 different Y scales to be pllotted on the one graph. The 2 scales are autocalculated and displayed separately, one on the left and right sides of the graph.
    To use this first enable the RHS Scale option in the scale options. You will need to use the Overlay Configuration Table added in 5.09r to specify that a given overlay should be processed using the RHS scale. Add a column "_rhsscale" and set this to 1 for the overlays
  • CHANGE Log driven graph - data overlays which are not enabled will no longer affect the autoscale computations.


  • NEW Switch mode "Lookahead Separator"
  • NEW Added a test for a track logic condition where a loop exit delay end is being sent where the item no longer has knowledge of the section that it had come from (lookahead issue).
  • CHANGE Renamed system attribute "DoingLookahead" to "RoutineInLookahead" to more accurately reflect what it is signalling - ie: a routine is being executed during lookahead, not item movement.
    This will also be set for messages sent from a routine in lookahead.

  • CHANGE Adjustment to y scale values to make them consistent with y scale labels
  • FIX Log Driven Graph handling of overlay 0 fixed. This overlay is not plotted but can still be used to set scale ranges.
  • FIX Fixed an issue that could crash when a hover broadcast was sent whilst PL was busy initialising the model (eg: doing track route fill intermediate steps at startup)
  • FIX Fixes the undoing of random numbers generated doing lookahead; the random generator was not being properly reversed, causing it to generate a different random value during move. This affected code where an attribute was set during lookahead and immediately used in a blocking switch with no intervening capacity. The attribute of the item would be inconsistent with the path it took.
  • FIX Fix the DLL loader crashing if the DLL wasn't found
  • FIX Added 2 checks to detect if a train is transferred from one track portal to another (eg: through a wormhole) and that train had a loop entry delay under way. In this case it is important that the destination also have loop delays enabled so PL properly handles the loop delays on both ends. If the option is not consistently set then PL will now report an error.
    Previous versions would become erratic due to a loop delay end event being unable to associate with a road to make "clear".
  • SPEED reworked the track fill steps recursion stack handling to use a faster table and avoid allocation of memory until its actually necessary


  • NEW 5.09z introduced cell writes to item table references that refer to a table that is "visible' or in scope. It is now extended to allow row and other operations as well.
  • FIX Portal copy/paste was broken in 5.09z


  • NEW New system attribute s.RouteTestRow (Track submenu) enables a modeller to query which row of a Route Selection table is being tested. This is useful when the change objcet multiple route test capability (added in 5.09y) is being used, as it enables the modeller to access other data they are storing in the table.
    The value is the row number from the table.
    This value is set only during lookahead for change objects immediately downstream of the change object that is testing routes from the table. Otherwise this value should not be relied upon for any purpose.
  • NEW Subsystems and Panels in the model explorer are sorted by name
  • NEW Item table references can have values written to them if the table referenced by the item is in scope at the reference doing the writing


  • NEW Table->Advanced->Expected Row Count
    This value enables a modeller to specify how much row memory should be allocated for the table upfront.
    If a table is going to grow to a known mumber of rows, performance can be greatly improved by setting this value so that the table is allocated right from the start. This avoids the table having to reallocate itself as more rows are added, which wastes time and worse, fragments the system memory into small, useless chunks.
    Setting this value too high will waste system memory so take care.
    The Routine operation AllocateTableRowMemory does the same as this setting, except it can be dynamic. This value is useful where the expected maximum size of the table is known upfront.
  • NEW Table->Advanced->Default New Column Format
    This enables the initial format of newly added columns to a table to be specified. This can include label lists. This is useful for tables which import from data which adds columns which should be of a particular format.

  • NEW The route selection dialog in the change object now enables a number of routes to be specified and they will be tested sequentially, with the first "accepting" route taken by an item.
    The routes to test are specified in column 1 of the table. The reference must be to the entire table. The rows in this column should be set to the route IDs to test.
    An additional "row limit" attribute can be set. This provides a convenient means of limiting the number of rows tested. This is useful because the table needs to be prepared and available during lookahead, during which time rows cannot be added/removed from a table. The default of -1 for the row limit will scan all rows in the table.

  • CHANGE The route selection dialog has been cleaned up
  • CHANGE Previous versions of Planimate enabled a train route assignment using a table of routes hard-coded in the change object by the modeller. (local table mode). This mode of operation has been removed. Route selection is now always made using the global route IDs associated with the routes.


  • FIX Routine operation "RegisterBlockedTrain" works way up hierarchy of portals until it finds a portal that is connected to a track network.
    This ensures that the same portal gets registered by the modeller and by the track network itself


  • NEW New routine operation "RegisterBlockedTrain" enables a modeller using tracks to register that a train has become blocked for reasons the track system is unaware (eg: modeller's own lookahead has determined the train should not move).
    This operation should be used in lookahead.
    The train is registered at the current portal the routine that executes this operation is located. The portal exits of this portal will be unblocked when the track system attempts an unblock. Hence the train should be reachable in a reverse direction from the portal exits (ie: without an intervening capacity) otherwise the unblock message will never reach the capacity at which the train is waiting.

  • FIX Exporting of free text cells to clipboard removes new lines AND carriage returns to prevent cells being broken up. (There isn't a standard way of bringing multiline text into cells via the clipboard).


  • FIX Track error 1156 no longer occurs if a train is blocked multiple times on different tracks (due to complex lookahead) at the same portal. This works around the error where lookahead is being used to test multiple outgoing tracks from that portal and the engine has had Move() recursed (as part of the lookahead) which caused it not to reset the item's blocked history upon a subsequent test of a track.


  • NEW Table and Graph Views without a title show a tool tip in edit mode when the mouse is near the top where the context sensitive menu appears. This is useful in identifying the view and also finding the location for the context menu
  • NEW Cell Views can now have a broadcast associated to send aftor an edit, like attribute views
  • NEW PL will attempt to show more detail following an internal error 1156 error (track system train being blocked at 2 locations).
  • FIX Label lists used in attributes in routines now identify the owning object
  • NOTE Partial work on RHS graph scales underway; editors and data saving/loading are present but not actually used yet.
    Report if any existing graph code is broken compared to 5.09t


  • FIX Autosave with alternate filename now works properly
  • FIX "Immediately Copy To System Clipboard" now works with customised table views


  • CHANGE Autosave of models (if enabled has been changed:
- it saves to modelname(AUTOSAVE).mdl hence not disrupting
the modellers explicitly saved files and backups
- it does not save the DB to the autosave files
- it does not clear the "saved" flag
- it does not clear tables which are set to clear before save
This should make autosave more useful as a backup and less intrusive to work flow.
  • CHANGE A force repaint routine operation is ignored if a repaint is already underway. This was made possible by the modeller doing a force repaint within a table row scroll broadcast being sent by PL as it first showed a table view.
  • NEW "Run Behaviour" Option "Immediately Copy To System Clipboard". Normally, data copied from tables in PL stays internal to PL until focus is switched to another application, at which point it is copied to the windows system clipboard.
    This was needed on older systems where copying to the system clipboard used precious system memory and was slow.
    With this option on, the copy to the system clipboard happens as sson as the data is copied.
    This option is useful where modellers implement the ctrl-v handler for pasting and they want internal PL data, copied with ctrl-c to be available (ie: the data needs to be in the system clipboard).


  • CHANGE The Log Driven Graph has been rewritten. It now supports the configuration of overlays being defined dynamically using a separate configuration table. This means graph configuration details do not need to be provided as extra columns in the source data, potentially saving a lot of memory for large data sets. Other new features:
- a scale factor for Y can be provided as well as the offset. This is
useful for plotting data with different ranges
- plots can be enabled/disabled/reformatted without changing the
source data table
- data path has less overhead so it should be faster
Note that the "End Point Sets Colour" option is no longer supported. For horz bars and lines, the start point sets the colour/width/line style. For vert bars, points and labels, the current point sets their properties.
Older models that used the end point to set properties for bars and lines will need some work.
The plot mode names have been changed.
Documentation is here:
Due to the separate overlay configuration table, it is now viable to consider plot modes which require more parameters to specify. There is now future possibility for:
- plotting with icons/bitmaos instead of points - other properties such as text rotation - 3D transformation of plots
enabling/disabling overlay does not alter scale
Note there may be impacts on column overlay graphs These need testing
  • FIX "Show Location" is greyed out in the error/breakpoint dialog if the error is occuring at a time where a panel change would break the platform, for example an error whilst a panel is being drawn.
  • FIX Planimate table views were sending scroll update broadcasts whilst they were searching for the correct scroll offset to show a given cell. This created an "elevator effect" when scrolling a large table AND a scroll broadcast was used AND the scroll broadcast did a repaint.
    PL now only sends the scroll broadcast once it has determined the correct scroll offset for the table view.


  • FIX Find list now goes to correct object when list has been sorted
  • FIX Fix a crash bug in table editor -> wasn't handling case of a font change making no rows visible when updating its titlebar


  • NEW Find capabilities for change objects performing FILE actions, ODBC and route assigns
  • NEW Options under Settings->End User
Hide Title Bar   : Shows main window without the title bar in user mode
Hide System Menu : Hides the system emnu and close box in user mode (equivalent to command line option /NOCLOSE)
Maximise On Load : Maximises the main window when loading a PBA ONLY (equivalent to command line option /MAXIMISE)
  • NEW The model INI file can include a section to configure sockets
    [Sockets] "socketname" "ip-addr" "port-number"
    "ip-addr" is ignored if the socket is configured as a server and should be set to ""
  • CHANGE Planimate and Planimate PBAs no longer create a PLANIMAT.DBG file by default. Use the /DEBUGFILE command line option to have PL create the file, which is useful when debugging.
    The "Show Debug Log" option in the tools menu is now hidden unless this commandline option is used.
  • CHANGE Removed the old "Run Reports" (RUN files) that PL generated as they are obsolete given the way PL is now used. If you miss it, let me know.
  • NEW Enabled alternate code for blitting icons for non WinNT systems. Rotated icons may look strange but it makes PL usable under WINE when its in Win98 mode


  • FIX Saving standalone EXEs is now available again with more recent keyfiles issued. Restrictions still apply if you do not have an "open PBA" keyfile.
  • FIX If a table with a column formatted for freetext but containing no rows was copied, PL would fall over when the model was saved.
  • FIX Enabling the Pause At Events debugging option whilst Model Clicks While Running (engine option) is enabled will give a helpful message and not enable the option. These options cannot be on together.


  • FIX Fixed a crash due to a buffer overflow when setting the tuple name of a table column from routine code. Planimate will now complain if an attempt is made to set a tuple name longer than the allowed limit (currently 32 characters).
  • FIX Fix a crash when editing expressions and "[]" were inappropriately used, also fixed some leaks in error cases which could cause "scan count" warnings to appear until the model was reloaded into a fresh instance of PL
  • FIX Fix a crash when a bend point in a pipe, spatial link or track was selected and the link was directly deleted (not via the multiple selection).


  • NEW Column properties TextColor and BackgroundColor
  • NEW Routine operation "FormatNameIntoLabel" retrieves the internal (tuple) name of a table or column and makes a label out of it. If the label already exists, its index is returned.
  • CHANGE Routine operation "FormatTitleIntoLabel" now returns the index of an existing label instead of creating a duplicate.
  • CHANGE SetFormat accepts an entire labellist as its label list name parameter, resulting in the label list's name being used.
  • FIX GetFormatListName was adding duplicate labels. It now returns the index of any existing label
  • FIX Fixed a typo in a route error message
  • CHANGE Have set up the old to redirect note requests made by older versions of Planimate (when the option to use the web for context help was used) to the appropriate page on
    This means older versions of Planimate will also have access to the material on the wiki and the idkbase server can be decomissioned.


  • NEW Default label list "_value formats" lists the names of the formats returned by GetFormat()
  • NEW Routine operations GetFormat() and SetFormat() enable the format of a data target to be retrieved. The format is a number corresponding to the formatting option. The _value formats label list enumerates the formats supported.
    The SetFormat operation includes a third parameter which is ignored unless the assignment is for a "Label" format which which case it should name the label list.
  • NEW Routine operation "ReFilterTableView" reapplies any active filter to data that has changed in a table (eg: after a sort). It gives no error if there is no filter active.
  • NEW Routine operation "GetFormatListName" will create a label of the name of the label list that the given data is formatted for. This is useful when GetFormat() indicates the format is for a labellist and you want to know which one.
  • NEW Paint state change broadcast sets _paintid to the index of the paint object

  • NEW Some Help menu item enhancements to facilitiate getting useful content out of PL to feed the new wiki
    Help->Show All Labels: shows all user label lists and their contents Help->Show all Routine operations: shows all routine operations.
    The text includes formatting comamnds for the wiki.
  • CHANGE Routine Operation "FormatForList" is recategorised under special to match the other meta-formatting operations
  • CHANGE Planimate now uses the new knowledgebase at the URL is configurable in the Planimate INI file and will be set up automatically when you run Planimate.
    By default Planimate will use the internal help file and ctrl-clicking a context help button will use the wiki.
    Setting HelpIDKBaseEnable=1 in the INI file reverses this behaviour, making the wiki the default.
    The IDKBase code has been removed from PL.
  • FIX Had incorrectly labelled the "Write Column Labels" option in the Change Object->File Write options
  • FIX Column filter dropdown font now matches the column font
  • FIX Planimate was not bumping the INI file version when saving an updated INI file.
  • FIX If an import from clipboard was performed in the table editor into a table with existing rows and one of the columns was formatted for free text and a message needed to be displayed during the import (eg: missing label) PL would give LinkedList errors as the view would try to redraw what it thought wwre the existing rows but which since had been deleted

5.09k [new MDL file version]

  • NEW A new column property and associated label, RotateTitle enables title rotation of table columns to be set at runtime


  • CHANGE In object editing mode, with the "show all paths" option enabled, arrow heads over objects no longer take the click. This makes more sense as in object mode, objects should have the click precedence.
  • FIX Fixed the CTRL-V broadcast from 5.09i, it wasn't putting the key code in the right attribute. Made _contextclick = 2 for key events.
  • FIX Selecting multiple objects no longer snaps to a square box when the shift key is pressed


  • NEW Added new routine operation "GetMyDocumentsName" which returns a path including a specified filename and folder name within the My Documents folder. The folder is created if it doesn't exist.
  • NEW Table click broadcasts now include the Data Object List index assigned to the table (0 if none assigned) in attribute "_dataid". This is useful where a number of tables send the same broadcast and you want a way to tell which table the broadcast is for.
    A future version will include an operation to convert a data object index into a table reference
  • NEW Typing CTRL-V in a table view with cell click broadcasts enabled can now send a cell click broadcast, as if the view was clicked, but with a new attribute called called "_key" set to the ascii code of CTRL-V (22).
    This enables a modeller to handle the paste request, typically using the paste routine op introduced in 5.09e.
    The broadcast will only be sent if the System->Modeller option "Enable Table Key Event Broadcasts" is enabled. This is so old models dont get confused by unexpected "cell click" broadcasts. Before enabling this option, modellers should update existing cell click handlers to test if "_key" is non zero, to determine if the event is an actual table click or a command key press. This is best done in the code that checks for _context (right mouse button) clicks.
    Other keys may be added in the future.
    If just a cell is selected, its location is set in _view_row, _to_row etc.
    If a cell range is selected, then the cell range is set, top left in (_view_row,_view_col) and bottom right in "_to_row,_to_col) ie: the actual current selection isn't sent. This is because if the user has some cells highlighted, they'd expect a paste to occur into those cells. For ranges, the modeller can pass this info to the PasteIntoView routine operation.
  • CHANGE Renamed routine operation "GetDocumentName" to "GetAppDataName" to more accurately reflect what it does - that is, create a folder/ file specification within the user's Application Data folder.
  • CHANGE Change object->File write operation now has separate control over including row and column labels. In previous versions, one option controlled the presence of both
  • NEW Experimental "Rotate Title" option on table columns, draws the title vertically. The Row Title lines table option is useful in making more space for the titles.


  • NEW /NOCLOSE command line option prevents close box, windows menu icon and min/max box. This is useful where PL is an embedded application
  • CHANGE Fixed bug in message entry selector which caused a lockup if a message entry had a long name. Also made the pick dialog bigger
  • CHANCE Internal clenaup of startup window code and removed some unused network code


  • NEW Routine operation "ForceRepaintPanel" enables a repaint of just one panel. This is useful when the panel is in a viewport and you dont want to repaint everything
  • NEW Object property "ObjectDraggable" can set this property at runtime. This is useful for portals
  • NEW Panel option "Broadcast Background Drags".
    When this is selected, drags in the background of a panel are broadcast to the panel as Broadcast "_Panel Drag"
    The following fields are sent:
_panel    : the panel index of the panel clicked
_command  : 1 = drag starting _dx,_dy are 0)
2 = drag update   _dx,_dy are delta
3 = drag end      _dx,_dy are final delta
_dx,_dy : delta dragged, from the starting point _keys : key down flag bitmask 1=shift, 2=ctrl, 4=alt _buttons : button down state, 1 = left button, 2 = right test this with a bit mask as future versions may have combined values

This is useful in implementing draggable map displays
  • CHANGE Planimate object co-ordinates are now stored as integers instead of double precision values. Any models that depended upon fractional object co-ordinates will need to be reworked.
    In the past spatial link models where objects were placed on top of each other required fractional co-ordinates, now that the link cost can be set explicitly, the fractions are no longer needed.
  • FIX Cleaned up paint object runtime property/text setting to be more efficient if the paint object is not on a panel with any other panels inheriting from it


  • NEW Routine operations "HandlePopupMenu" and "SetMenuBar"
    HandlePopupMenu enables a selection to be made from a hierarchic popup menu. The value is returned immediately and it can be used in lookahead (useful for advanced debugging).
    SetMenuBar enables a complete modeller customsied menubar, with hierarchic menus, to be built in one step. It superceeds the "ClearCustomMenubar" and "AddListToMenu" routine operations.
    Both these operations take a 3 column table as a parameter (the table can have more than 3 columns but only the first 3 are used).
    The columns are: depth: sets the depth of the submenu, 0 = top level label: the text label for the menu item
id   : return id for menu item

The menu structure is defined by enumerating the menu items in prefix order, for example for:
File Edit Tools ------------------- New Cut Add--->Table Load Paste Label Save Reset Quit

depth label id 0 File 0 1 New 1 1 Load 2 1 Save 3 1 Quit 4 0 Edit 0 1 Cut 5 1 Paste 6 0 Tools 0 1 Add 0 2 Table 7 2 Label 8 1 Reset 9

Notes: - typically it will be useful to use the same list & format for column 2 and 3, so the command names and handler names are common - A label of '-' is a separator - Dont use a separator as a submenu - Menubars can not have selection items at their top level, (depth=0), only submenus. Popup menus do not have this restriction - sub menu items need not have an ID set as they are not themselves selectable
  • CHANGE The step editor will be sized bigger to support editing the ImportIntoView routine operation without scrollbars, but it needs to be the first routine line edited when the routine is opened as the step editor gets cached while the routine list is open
  • CHANGE Reworked the status bar to show the item message area even when the activity indicator icon has been hidden
  • CHANGE For table columns formatted with the "Open With Combo List" option, the combo will close completely when a click outside the list occurs, instead of just collapsing the list.
  • FIX Folder names with "."s in them were causing problems for the icon mover (and probably other places) these should be resolved


  • NEW Routine operation "ImportIntoView"
    This operation enables the modeller to trigger importing of the current Windows clipboard into a table view. It is intended to be invoked in a routine triggered by a cell click in a table view
    The operation takes the following parameters:
Table  : this should be an entire table reference
Panel  : A portal or panel label referring to the panel containing the
view of the table
TL Row : These specify the top left cell into which data will be TL Col : pasted
Options: Unused at the moment
Rows Read : These specify the number of rows and columns read from Cols Read : the clipboard. If an error occurs, then they refer to the cell where the error occured, relative to the
Return result: This is 0 if there were no errors, otherwise the following values are currently defined:
1: undefined error 2: error placing clipboard into temp file 3: disk full while writing clipboard 4: no data in clipboard 5: incomplete rows encountered 6: formatting problem for values 7: undefined label or label lookup failure
If the clipboard data extends past the columns in the table, the extra columns in the source data are ignored
If the clipboard data extends past the rows in the table, new rows are appended to the table EXCEPT if a row filter is active, in which case the extra rows are ignored
Views with customised column arrangements/formats are supported; the data is placed in the table according to the column arrangement of the view.
If the view has an active row filter, then the data is pasted into the rows that are currently visible as if they were contiguous.
Cell specific formats are recognised and used in formatting incoming data (including labels). This can assist in moving "report" type tables back into PL.
Free text cells are supported but not new lines etc within them
Labels are added automatically unless the table column has the "Only Select Existing Labels" option or the label list has the "Only Modellers Add" option and the platform is in User Mode. In these cases, unexpected labels stop the import and return the undefined label error code
  • CHANGE The routine framework now supports up to 8 "parameters" per routine operation which is an improvement from the originally designed 3. Greatly reduced the number of places in the code where theres code dependent on this limit.
    This means more advanced routine operations can be added with more parameters without having to use tables etc. to carry the parameters.
  • CHANGE New category in the routine editor "Table View" as we've got quite a few operations specific to them


  • NEW Pressing SHIFT while forming a box or resizing a box and dragging the mouse will make that box into a square. This is useful for forming circles.
  • NEW Graph mode "Point" for plotting points. The width parameter sets the radius of the points. Note there is no clipping to the graph bounding box.
  • NEW Routine operation GetFilteredRows Returns a list of values which are the rows visible to the user due to the row filter settings. If no row filter is being used, this returns an empty table.
  • CHANGE Renamed TableViewRows and TableViewCols (routine operations) to TableViewVisibleRows and TableViewVisibleCols respectively. Existing references are automatically updated
  • NEW Routine operation "TableViewRows" returns the number of visible rows in a table view. This may differ from the number of actual rows in the table if there is a row filter active
  • NEW Highlighting and copying rows whilst a row filter is active will now only copy the visible rows
  • CHANGE Have renamed the attributes sent with the "cell clicked" broadcast to enable existing code to keep working when customised views are used.
    "_row" and "_column" are now called "_view_row" and "_view_col". These are the row/col from the view's perspective that was clicked
    "_data_row" and "_data_col" are now "_row" and "_col" These are the row/col from the source table's perspective.
    Any model with customised views, which used _data_row and _data_col to reference the original table needs these references renamed to _row and _col respectively. This not automatically done by the platform.
    If in doubt, check for any item attributes called _data_row and _data_col.
    Note that _to_row and _to_col continue to refer to the end of a selection from the view's point of view. These have not changed.
  • CHANGE Allow longer command line for execute from a change object (255 chars)
  • CHANGE Allow longer command line for execute from a button
  • CHANGE Internally defined table row labels are no longer supported. Using a "Row Label Column" is still supported Any row labels encountered during a load are logged in the debugging file and a message is given
  • CHANGE Transposed table writes no longer supported.
  • CHANGE When a file is written using comma delimiting and quoted fields are not forced, Planimate will strip commas from value fields even if their formatting inserts them. If its a label which contains a comma, then Planimate will automatically add quotes as needed.
  • FIX Second title row alignment changed If the main title is right aligned, second title is now right aligned otherwise its centred


  • NEW System Attribute "LoopDelayOverride" (Track) This enables a modeller to instruct the PL Track Engine to ignore track portal loop delay testing and assignment when an item is doing a TestEnter on a portal exit leading up to the track.
    It is useful where a modeller is doing advanced lookahead in evaluating possible train routes and the loop delay mechanism needs to be temporarily disabled in order that the modeller receives notification whether a route is actually viable.
    Note that a special mode dispatcher is also required for this option to be useful, see below.
    PL will revert any changes made to this attribute during lookahead. Ensure any "Move" code does not leave this attribute in a non zero value or portal loop delays will fail
  • NEW Dispatcher option "Look through in lookahead" (note its an option, not a mode)
    This experimental option enables a modeller to look past a capacity object during lookahead but have that object assert its capacity on the item when the item actually moves through it
    Used together with the LoopDelayOverride attribute, this option enables a dispatcher in a portal on a track network to "catch" a train that is testing viability of routes on the track network in lookahead but at the same time, needs to respect and wait for loop delays before it can leave the portal.
    In previous versions, it wasn't possible for a route to be assigned and tested in lookahead within a portal that is using loop delays.
    The engine would give an error because an item at a capacity object before the route assignment could not hold a section in loop delay since no commitment to the route had been made.

  • FIX Label list references in the undo buffer (eg: a column using a label list from a table that had been modified) would crash if selected in the references browser for the label list. PL now gives a helpful message instead.


  • CHANGE Log a warning in the PLANIMAT.DBG file for any loaded portals with both the Act As Junction and Does Loop Delays on. This combination isn't accomodated in the logic design and any such warnings should be investigated


  • CHANGE The application name is now shown in the about box for internally keyed standalone EXEs


  • CHANGE Routine editor step description for conditions, dll calls and other special cases more useful
  • NEW Planimate routines calling DLLs is enhanced
    Strings and entire label lists can be parameters and return values in a DLL call. This opens up a lot of opportunties for processing of data outside of Planimate where very high performance is needed.
    The DLL SDK demo has been updated and is available to anyone who is interested. Please email InterDynamics for further detail.
    Previous version DLLs are supported (but see the next note)
  • NEW Previous versions would load and unload a DLL for every time it was called. This has been changed and a given DLL will remain loaded after its first invocation whilst PL is in run mode.
    There are impacts of this is:
- multiple calls to any routines in the same DLL file will be
much faster because it is remaining mapped in memory.
- any static data altered by code in a DLL will persist for the run (including model triggered run restarts) which can be very useful but requires careful planning by the implementor of the DLL.
I suggest a specific "initialise" routine be included in any DLL which keeps any static data within itself so the modeller can get the DLL into a know state..
Note that after each routine call, Planimate calls the DLL to deallocate any of the input/output transfer buffers allocated by that DLL routine call.
  • NEW Planimate network broadcasts can now operate over UDP instead of TCP. The advantages of doing this are that there is no connection setup/teardown (and associated delays) and if the network isn't available, PL will not stall until a timeout.
    Sending these broadcasts is very efficient and will have minimal impact on the speed of the run.
    The disadvantages are:
- there is no guarantee of receipt of data nor ordering.
Packets are more likely to arrive in a lightly loaded internal
LAN than over the internet. However your application must
cope with lost or misordered packets.
- one is limited to the amount of data in a broadcast that can
be sent. A safe limit is about 1400 bytes. 3 attributes with
average names and various formats take about 300 bytes. Most of
this is initial overhead. Note that this overhead will include the
model's name, item class name and the broadcast name so avoid really
long names if space is critical.
Each additional attribute uses the following # of bytes: # of characters in name + # of characters for its formatted value + 5
- comms is only one way (from the "client" socket to the "server" socket, for two way comms you need to set up a client and server socket at each end.


  • NEW Routine display window includes a "Last Invoked" field above the list which shows the simulation time at which the routine was last invoked (in lookahead or move)
    This field is reset when the engine restarts
    This is useful for verifying that a given routine has been executed when expected.
  • NEW Table columns have a new options "Open With Combo List". This causes cells with combo boxes to open with the list down when the cell is clicked.
  • FIX Dialogs in Yes/No/Cancel mode were not returning -1 on cancel due to an extra validation
  • FIX GetColumnProperty now works when passed a column as well as a cell reference
  • CHANGE Column and block selsction broadcasts now set the _data_row and _data_col fields as well. For a block broadcast, this corresponds to the top left corner of the block


  • NEW New Change Object->File Write option "Write precision as displayed" causes formatted tables to be written using any column specified display rounding.
    By default this is not enabled (to prevent unexpected loss of precision) but in some cases the format as displayed is desired
  • NEW Routine operation "SetLastDataFile" enables the last data file read/written to be explicitly set. This is useful if the filename is being shown in the titlebar and you are using DataSet2 (which does not set this name).
  • FIX In the case where a number of pipes used matched cells for their source limiting together with control attributes in the same table a pipe updating its source limit could mess up the scheduling of the other pipe events.
    Reworked things in the pipe event handling to prevent this interaction
    The use of matched cells with pipes isn't recommended but if you want to use it then performance will be much better if the control attributes come from a table which is not changing very often.

  • NEW Modeller defined dialogs have a Yes/No/Cancel button configuration clicking Yes returns 1, No returns 0 and Cancel returns -1.
    Clicking the [x] to close the dialog returns -1 as well


  • NEW Planimate can now import DLL's into a model's DB file and execute routines in them without extracting them. This means a standalone EXE can be shipped with some code in DLLs which remain hidden.
    A modeller needs to put the DLL into the model's DB file (not a shared DB file). Use the Resource File Admin menu option.
    The file browser for the DLL Call selector can also browse into DB files.
    Its a good idea to keep the original DLL files away from the folder with the model to guarantee the right version (the one placed into the DB file) is read during editing and building of the standalone EXE.
    Remember that the standalone EXE builder will not include the DLL unless its placed in the model's DB.


  • NEW Routine operation "TrackSectionType" returns the type of a track section, using the "_section types" label list
  • NEW Route system attributes are now available during lookahead at the location which is the last step in the route. This is useful in enabling processing of the entire route at the last location during lookahead.
    s.routestepidnex at the last location will be set to 1 past the number of steps in the route. This is consistent with the route step index always pointing to the next step in the route once you the train enters a location that was in the route.
    The modeller can assign the route step index 1 beyond the last step, important if the modeller is "exploring" the route during lookahead.
    Attempting to obtain the location while the index is beyond the last step will result in a model error, since logically the route has "finished" and there is no next step.
  • CHANGE Have cleaned up the portal's lookahead code; this involves tracks, spatial links and normal item flows. There should be no noticeable difference; possibly a speed increase.
  • CHANGE Removed re-initialisation of menubar when clearing for a custom menubar which should remove the flicker as long as the custom menubar is added immediately after the clear
  • CHANGE Increased the maximum # of steps in a route to 512


  • FIX The new Advance to time dialog was adding a random offset to the time entered. An internal field was not being initialised properly


  • NEW The title of the free text editor form can be set by the modeller using the "SetFreeTextTitle" routine operation.
    This can be set in a pre-edit cell click broadcast, enabling the title to be dynamically changed for different columns and rows.
  • NEW Ctrl-Enter in the note editor dialog closes/accepts the edit
  • FIX If an error occurred while resolving a reference used in a dataset, it could crash the platform - fixed
  • FIX Dataset2 loader has extra validation against a dataset file which results in no header XML being read.


  • FIX If a table view had a scroll set and the target table had columns removed, the platform would crash if there was only one column in the table OR if a fixed number of columns was specified.


  • FIX Pasting paint objects clips them against the panel so they wont paste outside of the viewable area
  • FIX Pasting objects now pastes them relative to the place where the mouse was originally clicked, not where the mouse is at the time the option is selected from the context menu


  • CHANGE PL no longer warns when loading an "older version" model and no no longer marks it as modified by default (there is no need to save a model to "upgrade" it if just running it).
    You can restore the message (reworded) by setting the new WarnOldVersion INI value to 1.
    [Edit] WarnOldVersion=1
    This defaults to 0 to reduce distractions for first time users.
  • FIX Restored use of the red block when PL cannot load an icon. It was defaulting to a 0x0 empty image which didn't give visual feedback of the load error.


  • FIX Printing of panels containing cached BMPs/ICNs was broken (JPGs and Paint-Image objects were OK). This is now fixed.
    Printing of partially transparent icons will print white for the transparent parts; the Win32 printer api does not guarantee services that are needed for layering and doing it using an offscreen buffer could potentially use too much memory when printing large panels on high resolution devices.
    If you want an exact image of what you see on the screen, use a screen capture or Planimate's in built save panel to BMP routine operation.
    The printing operation is intended for high resolution printouts of tables and report panels (does font substitution) rather than an accurate rendering of the graphics/transparency.
  • CHANGE Special case handling for replacing a reference in a routine:
    If the 'from' and 'to' are both table references, then any matching references to the 'from' table name (cell, column etc) will be replaced with the 'to' table name EXCEPT if the from or to references are dynamic or item table references.
    In this case, only exactly matching references will be replaced.
    This is because dynamic and item table references use extra fields to specify them which are not available in all the reference types.
  • FIX Comparison testing for references was comparing fields which are not visible/used in some modes, leading to lack of a match when the references were actually the same.
  • FIX Fixed a few editors which could generate "invalid screen" errors if used from the context popup when right clicking on a portal in the sidebar (choosing icons, object attribute mapping).


  • NEW Routine operation "GetProgramName"
    This retrieves the folder where the currently running PL EXE (or standalone EXE) is located and appends a given filename to it.
    The resulting file/path is available in s.LastAccessedDataFilePath
    This is useful where a Planimate based applications wants to read or write a file in the same directory as the program EXE (which is common to every user on the system) instead of the Documents And Settings area (which is specific to every user).
    Note that on some corporate environments, writing to the program directory will be restricted.
  • NEW Referencing s.NullAttribute (system null attribute) in a place where Planimate expects a label reference will now resolve to an empty string rather than a 0. This can be useful sometimes in string operations.
  • NEW Delete confirmation messages for portals include the portal's name
  • FIX Fix a memory corruption when the "Model File Info" option was used. An incorrect string buffer was being passed and being overwritten, corrupting the model in memory.
  • FIX Fix printing of foreground object icons


  • CHANGE Removed the automatic redraw after a table's row or column scroll is set by code. This was causing flickering when printing.
    If a modeller is setting a table view's scrolls and the view is currently visible the modeller now needs to force a repaint once the new settings are made. This is not required when printing.
  • FIX Enhanced broadcast handling to prevent a "page printed" broadcast handler from processing windows events, causing unexpected redraws and other things to happen in the middle of a print job. This was an issue for the "_page printed" broadcast handlers.
  • FIX The "point browser" option was not being put into the correct menu in the Graph Options dialog. This made it look like it was on when it was off. Selecting OK in the dialog with it in the "enabled" menu actually enabled it.
  • FIX The updated animation manager was not allowing object icons to correctly print as it was rendering them into offscreen buffers during a print job.


  • NEW A new Advance For Interval/Advance To Time dialog
    You can toggle between advance to date/interval within the dialog
    Advance for interval remembers the separate components of intervals like 2M 5d without collapsing into a single value.
    IT correctly advances by months and years specified, based on the current calendar time.
    This means:
- advancing by "28w" will retain "28w" next time you advance
- advancing by "1Y 1M" will actually advance by 1 year and 1 month
based on the current calendar date
- fractions are allowed, so you can advance 1.5M
This will be interpreted as 1 "calendar" month plus 0.5 of a "relative" 30 day month = 15d.
The dialog also works in relative (non calendar) time modes.
  • CHANGE Rework of the calendar time code to better support dates beyond the year 2035.
    Planimate will now read the system date correctly if its set beyond 2035.
    A model can now have edit and run start dates beyond 2035.
    Previously, a run could pass year 2035 but not start at a date beyond it due to 32 bit overflow. The representation of start dates has been changed to 64 bit values, eliminating the constraint.
    There is a hard coded limit at year 3000AD. Please let InterDynamics know if you need to model beyond this year.
  • CHANGE Rework of IDKBase code to use new 64 bit time code. This wont affect anyone unless you are using a VPN connection to the server to access the knowledge base directly.
  • CHANGE 4 digit years in menus and clock
  • CHANGE The default calendar edit base time is now 1-jan-2007.
    Note that Planimate still starts in "relative" time mode, as previously. this is the initial date that will be suggested when a new model is first switched to calendar time mode.
    This default only applies to new models when first switched to calendar time mode.
    The date is common to previously chosen start dates in that its a Monday.

  • FIX Pressing ESC on the pause/continue simulation dialog is now like selecting pause


  • NEW System attribute s.CPUID
    This returns a value identifying the type and revision of the CPU. This is intended to help modellers secure their models from copying.
    Its not a unique CPU serial number as modern cpus do not support this
  • NEW System attribute s.SystemID
    This returns the volume serial number of the drive containing the Windows system32 directory. It may be useful to modellers wishing to help secure their models from copying.
    Note that a user can set the volume serial number of a drive.
  • CHANGE The condition editor confirms before allowing a "None" selection to wipe all the conditions under it.
  • FIX Adding/Removing columns from a view when column filters were enabled would cause a crash


  • NEW The portal attribute list and routine attribute value list (accessed during a breakpoint) now have an additional display of the "raw" value of the attribute. This is always formatted as a value with 15 digits of precision, so expect to see long fractions in calculated values.
    This is useful for displaying to the developer the underlying index for a label as well as values whose formatting otherwise strips the precision
  • NEW Routine operation "SetOncomingCheck" enables the "Oncoming Train Check" portal option to be set/cleared by the modeller.
    For Portals which are not acting as a junction, this option may be turned off. It should remain on for portals acting as a junction.
  • FIX Removing columns from a scrolled customised table view would cause a crash if there remained no columns in the scrolled region


  • FIX The ICN to BMP converter will no longer overwrite any BMP with the same name as an ICN in a DB file. It will report a message and continue on, leaving the ICN. (now working)


  • CHANGE Default of INI option "UseFullAttrefEdit" is now 1.
    This will only affect when starting without an INI file and keeps PL consistent with the tutorials.
    Experienced users will want to set this option to 0 if starting with a new install.
  • CHANGE Inner about box credits


    The 2 large about box BMPs for editor and standalone compilations have been converted to JPGs and included as resources within the PL EXE itself. This makes the EXE much smaller and means the
_!system.db  need no longer contain a _PLBANNER.BMP which will
reduce its size too.
This was done to prevent the main about box depending on an external BMP in the _!system.db file (which could have been tampered with).
_PLBANNER.BMP should be left in _!system.db if you plan on using older PL EXEs in the same directory.
Note that whilst the EXE is smaller, there isn't a saving when its compressed as the BMPs were compressing by 95% or so.


  • NEW Routine operation "ExtractIntoFormat"
    This operation enables a sub string of a label to be extracted and either interpreted as a formatted value or placed into another list. Its parameters specify the reference to format (usually this would be a label) and starting and ending character positions.
    The characters are numbered from 1. If the ending character is 0, the last character in the string is used.
    The result should be an attribute or cell.
    If the result is formatted as a label list then a label for the extracted string will be matched or created if it doesnt already exist and the result set to its index.
    The extracted substring is trimmed to remove leading and trailing spaces and enclosing double quotes. If it ends up being an empty string then the index/value 0 is returned and no label is added.
    If the result is formatted as a value, time etc. then the substring will be parsed using that format.
    If there are any parsing errors (eg: bad data) then the value 0 will be returned.
  • NEW Log driven graphs have a new option "Point Browser On Mousedown" which, when enabled. will show the x and y points in the titlebar upon a mousedown as occurs for the Column Overlay graphs.
  • CHANGE Defaults for Planimate INIs changed. This only affect you if you start without an existing INI file:
    EditorPaletteStatus=1 RoutineEditorRatioW=80 RoutineEditorRatioH=80 TableTitleLines=2 HelpWebSite=""
  • CHANGE Default expiry date for time limited standalone EXEs is now 5 days. Users with an Open PBA license can override this.
  • CHANGE Internal rework of StringToValueErrorStatus handling


  • NEW Dynamic panels have a new option "Show Spatial Links In Background" This is similar to the portal option "Show In Background" and causes the spatial links on that panel to be drawn in the background layer, behind views instead of in front.
    This is useful where portals and links connecting them should be shown behind views which overlay them.
  • NEW New routine operation "GetDocumentName" enables the modeller to read and write files into the "Documents And Settings/user/Application Data" folder for the currently logged in user.
    This is useful for saving user specific defaults and settings for an application.
    It takes 2 parameters, Folder specifies the subfolder within the user's Application Data folder and Filename is the name of the desired file within to read or write.
    The folder will be created as required and ensure it is writeable. If successful, the result attribute is set to a non zero value and the s.LastAccessedDataFilePath system attribute is set to the entire folder/file specification, ready to use in a file operation.
    If the operation returns 0 then either a bad folder name was specified or the system policy does not allow applications to write to their documents and settings area, in which case an application should continue gracefully.
  • FIX Column filters would fail if there were more than 32767 rows in the table. This limitation has been removed
  • FIX Column filters would generate the column filter dropdown list VERY slowly if there were many unique labels in a column (> a few thousand).
    This has been greatly sped up using a binary sort/merge.
    Up to 100,000 unique labels are now displayed in a filter's dropdown list. Wildcards will still select any others not in the list. This is 100x the limit of other table editing applications.
  • CHANGE Speed ups/rework of existing internal string list code
  • CHANGE Removed old PV tokens and merged several source modules, rearranged the code base.


  • NEW Routine operation "ListRoutineCode" will create a text file with the text of the routine code of a given change object (by name)
  • CHANGE The "DescribeRoutineData" and "ListRoutineCode" routine operations will now also look for the change object with the given name in a subsystem with the "Handles Parent Messages/Broadcasts" portal option enabled (and any sub portals within with this option on).
    This enables the modeller to bury the routines out of top level nodes
  • CHANGE Reworked number formatting code.
    Table cells formatted as values are copied to the clipboard with 12 decimal digit precision instead of the default 4 as appears in the table view.
    This affects the "Value" and "Value With Commas" formats ONLY, other formats like fixed, times and money are written to the clipboard as shown.
  • CHANGE Handling of the "Display Rounding" column option
    Columns formatted with a fixed number of decimal places eg: "Fixed xxxx.xx" will not have the display rounding value (specifiable in a column) applied, since the rounding is already implied by the number of decimal places that the mode is fixed to.
    For columns formatted as "Value" and "Value With Comma", +ve values of "Display Rounding" set the number of decimal places shown, -ve set rounding to units/tens etc and 0 rounds to whole.
    This does not affect the underlying data, cell edits or file/clipboard writes. Its useful for presenting data in summarised or precise form.
  • FIX Arrow keys can be used in a popped down combo list without it closing
  • FIX Notes on 5.07o filter were slightly inaccurate - fixed
  • FIX No longer crash if adding a column overlay to a single column table with act as mapper turned on


  • NEW Tables Views have an option to enable "Column Filters"
    This shows an extra row under the column titles. Clicking cells in this row enables filter text to be entered or possible labels/values chosen.
    Simple wildcards like * and ? can be used to match text strings and individual characters.
    The filter applies/updates when a filter cell is edited. f cells are edited, they remain in the set even if they no longer match the current filter settings. Reselecting any filter column will reapply the filter to the updated data.
    The drop down lists in the filter columns show the possible labels/values for that column that are not "blocked" by any other filtered columns
    If a row is inserted, the filter is cancelled but reselecting any of the filter columns will reapply the filter settings (which remain visible)
    If a column is inserted or removed, the filter columns are reset.
    The "Combo List Width" column option also applies to the filter list, if it is opened.
    Filter settings are not saved
  • NEW Added column option "Edit Labels With Combo" which enables labels to be selected and entered using a dropdown/field "combo" box.
    This avoids the clunky popup for selecting labels that PL has used in the past.
    If the label list has the "Only Modellers Can Add" option on and the system is in "User" mode then the combo will only enable selection of a label in place using a dropdown list, otherwise labels can also be typed.
    Any "new" labels typed are automatically added. If the "Rename Labels Instead Of Adding Labels" column option is enabled, then typed labels cause a rename instead.
    This option overrides "Edit Labels With Field" option; the difference is that there is a dropdown list of possible selections
    The F2 key and alt-down are keyboard shortcuts to dropping down the list.
  • NEW Table columns have a new option "Only Select Existing Labels". This works with the new "Edit Labels With Combo" option and prevents text being typed into a cell, only the list selections can be chosen.
    This augments the label list option "Only Modellers Add", enabling users to add labels in some cases and only select labels in others.
    It doesn't work with the old popup label select dialog.
  • NEW Column property "ComboListWidth" and edit option "Combo List Width" enable the width of the drop down list in the new combo label to be specified. If 0, the width of the cell is used.
  • CHANGE The "default" label lists that PL provides for a number of properties and options are now rebuilt upon load of a model to ensure the latest PL labels are present in them.
    This means any changes made to these lists will not persist.
    The "_colors" and "_external files" lists are excluded from this
  • CHANGE Column option "Edit Labels In-Place" has been renamed to "Edit Labels With Field" to distinguish this option from the new "Edit Lables With Combo".
  • CHANGE ShowPanel routine operation renamed to ShowPopupPanel to be consistent
  • FIX The table scrollbars now do not "jump" if you click within the scroll bar "thumb"
  • FIX Tables will no longer cause a crash if a table view is too small to fit at least one column.


  • FIX Dataset2 did not correctly merge system label list formatted columns. A column formatted for _Model Objects created a new label list eg: _Model Objects2 upon load.
    The merge has been reworked to use the existing system list.
    If a label is in the dataset that no longer is in the system list (eg: a portal deleted) it will be replaced with 0 since the dataset loader cannot modify the system label list.
  • CHANGE standalone exe's now have lowercase "exe" extention
  • CHANGE removed the old "list mode" that cell views would use to select their table cell if the table only had one column.
  • NEW SetPaintImage routine operation enables the image of paint buttons states to be set. SetPaintImage and SetPaintText both work for paint Image objects.


  • NEW Paint Buttons showing images now enable the modeller to set the range of image pixels which are displayed. The image will then be stretched (or shrunk) to fit the paint image objects rectangle.
    The advantage of doing this instead of using a viewport is that it is very fast and efficient; the image is only loaded in memory once and large animation buffers for the entire scrollable area are not required.
    The new functionality is enabled at runtime only using the following paint properties (only useful with a paint button with an image selected). Use the paint property label list and the SetPaintProperty/GetPaintProperty routine operations.
    ImageWidth,ImageHeight: return the size of the current image file, in pixels
    ImageXOffset,ImageYOffset: can set/read the top left pixel of the image to display (normally 0,0)
    ImageUseWidth.ImageUseHeight: set or read the number of pixels to show within the paint image, normally both are 0 which causes the default entire width/height of the image to be used.
    These attributes are not saved and revert to zero when a model is loaded. They do not propogate with inheritance but this may change.

  • CHANGE 5.07l's release note about "Extract Data References" said that references are not repeated. This is not the case, I have decided to repeat references if they are used for both read and write.


  • NEW Routines have a new File menu option "Extract Data References"
    This will extract all references to data in the routine code into a text file and show it.
    The file has 5 tab separated columns: full-reference read or write indicator table name (if any) row reference column reference
    References are not repeated. If a reference is read AND written then it is only shown as "write".
    Constants and expressions are not shown but the fields within an expression will be, if they are non constant.
  • NEW Routine operation "DescribeRoutineData"
    This enables the description described above to be extracted from a change object and written to a file for later processing.
    It takes 3 parameters Panel -> panel or owning portal of a subsystem where the change object is object -> the change object's object name text filename -> file name to write the report to


  • FIX Clicking outside a calendar entry field now accepts the data again (this was broken in the 5.07h table cell handling rewrite)


  • FIX Can now paste replace on the current visible panel again


  • FIX Broadcast Button click handler now clears an internal "pause pending" flag in the engine to enable further animations after an animating item doing a broadcast is interrupted.
    Previously, a "continue" was required to reset the flag

  • FIX If a broadcast button is clicked to start a run and then the animation of that broadcast is interrupted by a pause click, the engine will now not produce errors
  • CHANGE (APPLIED to 5.07h)
    Table scroll bars are bigger to make them easier to grab on modern higher resolution displays


  • NEW Table views have a new "fixed columns" property which enables a number of columns on the left hand side to be held fixed whilst the rest remain scrollable.
  • CHANGE Table editor enhancements CTRL-Z maps to undo
  • CHANGE A new default "Edit Mode" for table cells: "Automatic Enter/TAB advance"
    When a cell edit is completed with a TAB or ENTER then the cell to the right or underneath is selected respectively (only for value or date cells).
    The "Edit Single Cell" option can be selected to prevent the automatic advancement
  • CHANGE Pressing TAB in the table view selects the cell to the right
  • CHANGE Using the shift key with the arrows extends the selection in a table. Using the ctrl key as well selects to the end of the table.
  • FIX Expresisons were not testing for divide by zero


  • FIX Paste Into Replace (<ctrl> + Paste Into) will now work whan using the sidebar treeview context menu. It currently prevents you from doing this when the current visable screen is in the hierachy of the "Paste Replace" root portal.


  • NEW Sidebar Treeview Context Menu The sidebar tree view now has a context menu for Dynamic and Application panels. There is also a new context menu option "Paste Into" for Portal objects (Dynamic and App) that will paste compatible options into the selected Portal. Pasted objects using this option will appear in the top left corner of the target panel
  • CHANGE New Object Selection Behaviour When using the mouse drag multi object selection you can now modify the selection behaviour.
- Clicking on the background will clear the current selection
- ClicknDrag creates a selection group containing the selected objects
erasing any exiting selection groups
- SHIFT+ClicknDrag Adds selected objects to the  current selection
- CTRL+ClicknDrag Subtracts selected objects from the current selection


  • NEW PL no longer prompts the modeller to apply a default width when a column unit mode is changed; this was annoying and the width can be set manually as required.
  • CHANGE pressing 'c' in the routine list view inserts an empty (comment) line
  • CHANGE Removed forced clipping of paint-text objects to the visible work area.
    This caused them to lose alignment with other objects when a panel was resized
  • CHANGE The "Focus" is now cleared when a click in a panel background occurs.
  • CHANGE Basic mousewheel support for table views and dialogs.
    This will only operate if a mouse driver is not installed which translates scroll events into scrollbar events.
    (some mice come with drivers which do this translation to enable x axis scrolling; it might be an option to enable/disable this)
    (scroll wheel support in Windows(TM) is a bit of a dog's breakfast)
  • CHANGE Focus handling in dialogs with icon palettes (icon mover, selector) to facilitate the scrollwheel working as it should
  • FIX Clicking in the subsystem name no longer hides the panel-explorer if it is visible.


  • CHANGE Setting the zoom of a visible viewport will now update the viewport immediately. If zooming in, the zoom is centred on the centre of the current view (as much as possible)
  • FIX The "Hide from Sort" column option introduced in 5.07a was working in reverse - fixed (so the default "off" state for this option allows the column in the sort menu)
  • FIX Dragging windows over the Planimate work area often left bits of garbage in the margins. This was unpredictable and caused by the Windows window manager not consistently sending EraseBackground messages.
    Many applications "fix" this by forcibly redrawing everything all the time but this causes flicker especially when animating panels.
    Have fixed by explicitly clearing the margin areas as part of the panel redraws rather than trusting the windows notification. This seems to have fixed it whilst retaining the clipping of objects within the active panel work area.
  • FIX No longer flash a "default" object when adding a track/pipe/spatial link
    This distracting and caused problems on large networks when scrolling was required.


  • NEW Resource File (PL model databases) administration dialog has a new option that will convert all the ICN format files in the selected DB file into BMPs
    This can be useful for converting icons so they can be edited with modern graphics editors which support > 16 colours
    The old ICN files are removed from the DB
  • FIX Track Portals and the s.LoopExitDelayStart attribute
    The "LoopExitDelayStart" system-item attribute was being set for all on-track portals at the time a train tested the portal exit (to leave).
    Its been changed so it only gets set where the portal is configured to use loop delays.
    This means
- the "Act As Junction" and "Use Loop Delays" portal options
should not be used together
- for code in a non loop-delay portal, the s.LoopExitDelayStart time will properly represent the time the item started leaving the previous object
- for code in a loop-delay portal, the s.LoopExitDelayStart will only be valid up until the last point of capacity in the portal before the portal exit... so you can use it before a queue just before the portal exit but not after the queue (since the item would have "tested" the portal exit which needs to set this attribute as a loop exit delay could potentially be starting.
  • FIX Crash if a missing routine attribute was reported at startup and the modeller tried to use the "Show References" to open the containing panel (half-baked runtime failed during redraw of icons)


  • NEW Support JPG and GIF as "icons". This means they can be selected for object and icon states and as paint button states.
    Unlike paint images, icons are kept cached in memory and are usually rendered by the animation manager if they are object or item icons.
    Transparency for these types used as Icons is not supported. It may come at a later time, as may multiple image GIF loading.
    related rework:
- rewrote icon palette to support multiple types
- reworked icon classes to track icon type for loaded icons
- reworked standalone EXE creation to use the icon type info
- cleaned up image loading code and bitmap classes
  • NEW It is now possible to read and set the columns that a Table View displays dynamically using the routine "GetTableView" and "SetTableView" operations.
    These both expect 3 parameters:
- the table the view is for
- the panel the view is on
- a configuration table.

The configuration table needs to contain a column called "_basecolumn".
For GetTableView, rows in this column will be set to the column indicies of columns in the table view. If the table view does not have customised columns, then there will be one row for each column in the table.
For SetTableView, each row in the configuration table should have a column index from the parent table in the order you want them to appear in the view.
Rows should not be repeated.
If the table has no rows then the table view will be set to its default view of the parent table (without customised columns).
Modellers need to force repaints after customising a view if that view was visible..
  • FIX "Retain on paste" attributes now retain their clear value, min and max value and all their options settings
  • FIX ODBC fix for SQLConnect where a NULL username and/or password were passed - this caused a crash with some ODBC drivers.


  • NEW Routine Operation "BrowseFile" enables a "browse to file" dialog to be presented to the user. A default file extention (eg: *.DAT) with or without path can be provided. A second parameter specifies whether a load-style or save-style file dialog should be used. The return result of the routine operation is non-zero if a file was actually selected by the user (they didnt cancel). In that case, the resulting file spec can be retrieved using:
s.LastAccessedDataFile     : file name only
s.LastAccessedDataFilePath : file name with path
This operation is useful when prompting the user to select a file to use in the dataset operations introduced in 5.07
  • NEW Panels have a new "Child Window Style" popup option to cause them pop up as child windows to the parent window (contained and clipped against the window) rather than popup windows (able to exist outside the parent window).
    Previously this style was automatically enabled for windows without a titlebar or border. By making it explicit, the modeller can have borderless, titlebar less popup windows. These are useful because unlike child windows, they can be partially transparent.
    For older models, this option will be automatically turned on if the popup was set up with no border and no title bar, so they should behave the same.
  • NEW New label list "column properties" used in conjunction with the "GetColumnProperty" and "SetColumnProperty" routine operations enable a number of properties of a table column to be changed in modeller code. This is useful for building and controlling UI tables under program control.
    These routine operations alter the table itself and will not update any customised views of the table.
  • NEW Column option "Hide From Sort Selection" will prevent the column from being selectable in the sort menu for the table. This replaces the hiding of columns when their Width is 0
  • CHANGE Columns with a zero width are no longer hidden from the table sort menu Use the "Hide From Sort Selection" option instead
  • CHANGE The PLDLL interface has been enhanced to support column ordered table data. This is a new option in the DLL SDK and enabling it may reduce the need to reformat data in a DLL's implementation, increasing speed.
    If you are using the Planimate(r) DLL SDK, contact ID for an update.
    Older DLLs built with the previous SDK remain compatible.
  • FIX The expression parser did not handle "-" properly in expressions such as "p.x - (p.y + p.z)" It would accept and process the expression properly but would present the expression without the brackets. A subsequent edit would commit the wrong expression and cause "p.x - p.y + p.z" to execute which was not the desired result.
  • FIX A long lurking bug in track code has been fixed.
    If a train was doing a loop delay at the time a run was stopped, it could cause an application fault.


  • NEW DataSet 2.0 framework
    This adds new routine operations to save and load data. Refer to the attached word doc for more details.
    Old style datasets are not affected and will be eventually phased out.


  • NEW Routine operation "Set table row height"
    Sets the number of lines of text each table row displays. Useful when free-text is being used.
  • FIX Columns formatted as free text now work properly with the "Copy Format" context menu option in the table editor
  • FIX Width of table selector when adding a table view now accomodates the full length of the table name instead of cropping it


  • NEW Paint property "TextWidth" in the paint property label list
    This is a read only property that enables a modeller to determine the width required for the current text in the paint button.
    The actual button's width is not changed.
    This is useful where the modeller wants to examine a number of paint objects, determine the maximum width, then set all the objects to that width. In this case, the "auto width" option should be off for the paint objects.
  • NEW Routine operation "SetPaintTip". This enables the tip text of a paint button to be changed dynamically.
    It is similar to the "SetPaintText" operation in that a parameter can determine whether it sets all states or the current state only. (relevant for buttons only)
  • FIX The way that close-on-click popup panels were being closed was generating recursion in the "DeActivate" message handler. Though this was not noticeable to end users, it triggered debugger errors.
    Have reworked the way popup panels close to avoid this.
    Popups need to be tested in the various ways they can appear and be dismissed; this also includes viewports (which should not have been affected but use the same codebase).


  • FIX Pipes with the "Adjust update interval to reduce errors" option selected no longer give errors if they are running with an hourly load rate set to 0.
  • NEW The routine line editor will now edit long references in a multiline field. This means very long references can be displayed completely in the editor.
  • CHANGE Title of Planimate window - "Planimate" now substituted by "Planimate(r) by InterDynamics"
  • FIX Window title - removed the dangly "-" when "Ready" in edit mode
  • FIX CTRL-Enter does not introduce an unexpected link break in a single-wrapped multiline field (eg: used in the expression dialog)
  • FIX A leak in the expression parser when the entered expression had errors with the use of square brackets has been fixed


  • NEW "//" is a shortcut to adding a comment in the routine operation selector
  • NEW Alignment of values in "hr min" unit mode is now more consistent
  • NEW A new column option "Precise Value Edits" will cause the edit field for that column to display the current value with up to 12 digits of decimal precision.
    This option is useful where a table column displays data rounded to a couple of decimal points but the complete precision of the values must be preserved if the data is edited.
    Commas and trailing zeros (after the decimal) do not appear in the field with this option on.
    This option only takes effect with the "Value" and "Fixed" formats.
  • NEW System attributes "MouseXPanel" and "MouseYPanel"
    These return the co-ordinates of the mouse cursor relative to the TOP LEFT corner of the Planimate work area. They are useful when creating or positioning a popup panel window as this is the co-ordinate system that panels are positioned with.
    This value is also not affected by the scroll or zoom of the current panel in the main window.
  • NEW System Attribute (Engine) - "User Mode"
    This is set non zero if the editing tools are unavailable (ie: the system is in user mode or a standalone EXE)
    This enables a model to adapt its UI/operation for a developer or an end user
  • NEW Label list option "Interpret '0' As Label Index 0"
    This is useful where labels can sometimes be arbitrary digits and you want them treated as strings except for "0" which will be always interpret as label index 0 (usually the "empty" label)
    This also takes priority over the "No Numbers" label option, ie: "0" will be allowed but no other numbers.
    Note that it must be a "0" and not "00", "+0" or "0.0"
  • NEW New popup panel option "Raised 3D Edge" gives a popup a raised edge like a popup menu. This option should be used with the "No Caption Bar' option also selected.
  • CHANGE Have changed the way text in paint buttons with the "Fit To Text" option selected is aligned.
    With the Fit To Text option on and a default button, text is centred with a margin on either side. The margin is now computed based on the size of the font in the button, rather than being fixed.
    If either or both of "left align" or "right align" options are on, then no margin is added to either side of the button.
    This is useful where buttons with hidden borders are being used to construct an interactive menu and you dont want extra margins on either end of the button.

  • CHANGE I've made some changes to the value formatting code.
    If a table column has the "Round Value In Views" option enabled, the "round Digits" is a +ve number and the units is "Value" or "Value With Commas", then enough decimal places are always shown to the specified precision and trailing zeros are not stripped.
    Previously, this combination would only show up to 4 digits of precision and trailing zeros were removed.

  • CHANGE The field width overflow indicator in formatted values is now always ">>>"
  • FIX If a portal was copied and that portal used a scoped class that was defined further up the hierarchy (and hence not included in the copy) then that portal was pasted into a new model, then the platform would crash.
    References to the class were not being properly purged from the copy/pasted portal
  • FIX In certain error circumstances, a model could attempt to broadcast to itself before it was completely initialised at run start, eg: if a missing attribute error occured while the viewer was looking at a panel containing a table with a scroll broadcast.
    I have changed the initialisation order to only enable the internal system broadcasts after the engine is fully initialised.


  • Routine enhancements and fixes
  • NEW "CopyFont" routine operation enables fonts to be copied between columns and table cells
    REMINDER: When any cell in a column has a customised font/colour/fornat then every cell in that column uses a lot more memory and the table processes row operations much slower.
  • FIX Expression parser would crash during editing if there was an error in a typed expression within a function (objects in memory were getting multiply deleted).
  • FIX Routine editor menubar is now updated when a new routine attribute is added in the textual editor


  • FIX Fixes a bug in the routine editor introduced in 5.06h which prevented adding operations without a target.


  • NEW Panel Width and Height object properties (useful for a portal) are now writeable, enabling a panel to be resized dynamically
  • NEW The reference text editor in the routine editor will now prompt if you want to add an unknown attribute (portal, routine or item if a flow is available) as they are typed.
    The prompting occurs either when a character that cannot be part of an unquoted attribute name is typed, or when ENTER or TAB are pressed and the unrecognised attribute name is the last name in the expression.
    It doesnt prompt if name text is edited in the middle of a reference; insert a whitespace after the name delimiter to get it to prompt you if you really want to add the attribute. This is to prevent incessant nagging as text is typed/revised in a reference.
    During any given edit, it will only ever prompt once for a given attribute name/type combination, again to prevent nagging.
    Tables, Columns and Label lists cannot be added on-the-fly.
  • NEW A new INI value
    [Table] TableColumnNoSort=0
    If set, table columns wont be sorted by name in the routine dropdown column list. This might be useful where a specific order helps identify the columns rather than just the names
  • NEW Routine operation "GetPaintProperty"
    Enables a paint property, as determined by the property index from the "_paint property" label list to be read.
    Note that some properties are only valid once the paint object has been initially drawn, for example width and height which may depend on the current paint object text and the current font mapped.
  • NEW Routine operation "DeleteAllPaintObjects"
    This deletes ALL paint objects on the destination panel. All paint objects inheriting from these objects are also deleted.
  • NEW Routine operation "FitPanelToArea"
    This resizes the work area of a panel to fit the objects contained within, with a specifiable border margin.
    Note that some objects do not report their size correctly until they are initially drawn (as for GetPaintProperty notes above).

  • NEW Time mode "xxhr yymin"
    This is primarily an output mode intended for displaying an interval as integral hours and minutes - example:
    3hr 16min 1hr 10min 12min
    Times are rounded to the nearest hour/minute.
    days/weeks are shown as hours.
  • NEW _Data Object label list
    Tables, attributes, label lists and sub label lists can have a label associated with them in this list.
    This will be used in DataSet Version 2.

  • FIX RowCount default for DeleteRow was not being set properly for a dynamic table reference


  • NEW The End User option "Enable reading decimal commas" option has been renamed and now causes values to be displayed with commas instead of decimal point characters.
    It applies to formats except scientific and the latitude/longitude formats.
    If using decimal commas, do not forget to change the number separator from "," (Settings-> System Parameters) otherwise the number processor will get confused.


  • NEW A new object property for track sections has been added:
    A modeller can use this to instruct Planimate on whether a given section is "explorable" when Planimate does a "fill route steps" routine operation to resolve the exact route a train will take.
    This is uesful where there are optional track configurations being explored, since the tracks for all the variations need to exist. The multiple tracks would normally create ambiguity errors.

    For this to be useful, the "guess intermediate steps" option for the (sparsely defined) route should be off; the modeller should configure the sections using this property then trigger a "FillRouteSteps" for the train, so Planimate can build a non ambiguous route.
    When a model starts/restarts, all sections default to SectionFillEnable=1 (enabled for searching). This state is not saved as part of the model. Hence existing models should work as before.
    The setting of this option only affects the route step filler and has no impact on the train motion logic for existing routes and trains in the network
  • FIX The expression system now properly handles a table column index being a sub expression with another reference (eg: a cell reference) without giving a warning.
    NOTE: The editor doesn't suggest the correct column names for certain uses of nested table references. It will work if you manually type the correct column reference.


  • NEW Dispatcher mode "Send Dynamic Broadcast"
    In this mode a dispatcher sends a broadcast to a scope set by a reference, as for the normal broadcast.
    Unlike the normal broadcast, the type of broadcast sent is determined dynamically by another reference.
    This reference should be set to an attribute which has a valid broadcast label index, to identify which broadcast type to send.
    Modellers should use this mode only where absolutely necessary as PL will not identify the dispatcher as a broadcast source since the type of broadcast sent is indeterminate at edit time. It can make a model difficult to understand and debug.
    Document your intent when using it.
  • FIX Label suggestion list updates as you type more of the label in
  • CHANGE Saving an image on a panel different to the current panel no longer generates a flicker as the current panel gets resized to match the panel being saved


  • This version addresses a few issues with importing and reading data
  • FIX Importing data into a table with a different number of columns to the data and with an automatic resize could cause erratic behaviour, sometimes crashing the platform.
    The import processor was using the incorrect # of columns after the resize, possibly overwriting memory.
  • FIX The table importer will no longer complain if the last cell in a row is followed by an EOF instead of a new line before the EOF
  • FIX The table importer will strip trailing spaces from values to prevent them causing errors in the number perser.
    For labels, the modeller can select whether trailing spaces are removed or not in the label list.
  • FIX The auto-type check in the attribute value dialog will not use a value spacer as a formatting hint unless the default spacer is a comma or the value is of "Value" type to start with.
    This prevents the auto-typer getting confused in countries where long numbers are spaced with spaces instead of columns.
  • FIX Item table references were not working at runtime because the table name was not being properly pre-processed, as of 5.06a.


  • NEW When inheriting new paint objects onto a panel, they are placed in front of any existing paint objects on that panel but behind any un-inherited paint objects on the panel.
    This keeps "local" paint objects on a panel in the foreground
  • NEW Pop-up suggestions when entering a labellist and a label member both work
eg:  l._colors[   will pop up a list when the [ is typed
  • NEW Pop-up suggestions when entering a column reference for a table now works
eg:  t.table[1][c. will pop up a list when the . is typed
(unlike for labels, a column label cannot be assumed as the column reference is sometimes an attribute, value or expression)
  • NEW Paint objects and all the View types have an "Action Control" condition. This is similar to the View Control condition, except it controls whether the object will respond to clicks. This is useful where system state determines whether an otherwise visible object should be sensitive to clicks.
    When the View Control condition is false, the object effectively becomes transparent to all clicks in it.
    For Paint Objects, this applies in all modes except Paint Edit.
    For the views, this applies when the editing tools are hidden and in run mode.
    By testing the "HaveCurrentPendingEvents" system attribute, a view can be prevented from being modified if there are any scheduled events on the FEC.
  • NEW Label lists have a new option "Remove Trailing Spaces". This removes trailing spaces on labels typed, pasted or imported into the label list. This supplements the "Remove Trailing Spaces" option available when setting up a file read.
    Trailing spaces are not limited for label aliases.


  • This version contains mainly fixes to 5.06A as testing of the new code
  • continues.
  • NEW new object properties ObjectPanelWidth and ObjectPanelHeight enable the width and height of a portal's subsystem to be read
  • FIX Selection of "Label" attribute field mode now works again in the graphical attribute reference editor
  • FIX Extraneous quoting for labels containing a decimal in the second character fixed
  • FIX BitXOR operator is consistently formatted like the other bitwise operators
  • FIX Parser now reports if the label list name is bad for a label reference
  • FIX Parser now handles functions when mixed with other operations
eg:   0 - t.datatable.ColumnIndex(c.Origin)
is useful for a reverse sort column index
Also extraneous brackets no longer are put around functions
  • FIX Memory leak in parser


  • This is an initial test release; a significant rewrite has occured which needs
  • to be tested for compatibility with existing models.
  • The expression parser and its integration into attribute references has been
  • rewritten.
  • The key new capabilities are:
  • - Any of the graphically specified attribute references can also be represented and edited textually, a big step towards a consistent routine "language".
    (The graphical editor is still supported and is being enhanced next)
  • - Expressions can be used for individual fields of a reference, such as the row and column index of a table.
    This enables references such as
    t.mytable[r.whichrow + 1][c.Column]
    In previous versions, temporary variables would be required to do this,
  • - A framework for strings without labels is in place
    Expressions can handle any string without the need for a label list. This will be used to enhance PL's string capabilities in the future.
  • - Functions with multiple parameters are supported.
  • - PL will do its best to represent a typed-in expression as an equivalent attribute reference that would have been selected graphically.
    This is important as there are many optimisations for the attribute reference objects.
  • - Future framework for advanced references (eg: referencing data from within an external database, calling a DLL)

  • As an example of the enhanced function capability, the following additional
  • functions can be used in any attribute reference.
  • min(x,y) : minimum of 2 values
  • max(x,y) : maximum of 2 values
  • atan2(x,y) : arctan; useful for finding angle of a line
  • hypot(w,h) : find the length of a line with width and height
  • The following basic "types" are recognised:
p.   Portal attribute
i.   Item attribute
r.   Routine attribute
l.   Label list
k.   Class attribute
s.   System attribute/property
c.   Column label
t,   Table reference
  • All the other references build on these.
  • Further documentation will be posted to the knowledge base, in the meantime
  • the routine editor's display shows the textual form of any reference
  • edited with the graphical editor.
  • Any previous model using *expressions* with cell references will not load.
  • (these were very crude and I dont expect many people to have used them)
  • This version saves in a new model file version
  • Table column labels must be preceeded by "c." in all cases.
  • System and Object Attribute names have had the spaces removed from them
  • Spaces can be used in attribute/table names without quotes being required.
  • Trailing spaces are always removed
  • eg:
( counter   + 3) / 5
  • will expect the portal attribute to be called "in counter"
  • A popup reference to functions is to be added.
  • I am interested in any load issues or reference display problems in your
  • existing models so please let me know.


  • NEW New Animation Manager
  • The Animation Manager and a lot of the supporting graphics code in
  • PL has been rewritten.
  • The previous manager was designed in an era of slow CPUs and video blit speeds.
  • The algorithms it used did not scale well to handling many items and animating
  • portals on larger work areas.
  • The new manager opens up new possibilities for the future, though for this
  • release the focus has been to get current PL capabilities working under the new
  • framework.
  • The new manager uses more CPU and video bandwidth for simple models, but scales
  • more linearly with complexity than the previous one.

  • New capabilies:
  • - Models with many items moving will animate far smoother
  • - Changing of portal states/icons is much faster and has far less impact on the animation smoothness. Special effects with animating portals can be mixed with items animating over them without flicker
  • - "zero time" animation with a high animate speed proceeds much faster, making it easier to "fast forward" through models with animation on
  • - Item info panels impose less overhead on the animation
  • - Item and Object icons can have time-dependent multi-state icons associated. These will animate even if the item or object is not moving or changing state, as long as time is passing or an item is moving.
    This means the icons of multi-servers in "busy" state, portals in certain states as well as items waiting in a queue can have multiple BMPs associated with them and they will cycle between the images.
This is done by naming the BMPs like:  TEST@00 TEST@01 TEST@02 and
selecting TEST@00 as the icon. PL will then load the other images
together for that image.
  • - A default multi-state image time-advance of 100ms has been set for objects; the model can set this at runtime for an object using the "Object Property" attribute references.
  • - the issue of "missing" items until a "continue" when changing panels has been resolved
  • - items use less memory and there is far less memory throughput for models with a lot of animation (reducing memory fragmentation)
  • - pipes are now rendered with a graded smoothing of the colours within
  • - The end points of pipes no longer overwrite the object they connect to
  • - attribute and cell views with a transparent background will redraw properly (though they impose an overhead when updating)
  • - the new engine should not cause any slowdown in "advance to time" performance of the simulation engine
  • - animating items should never leave debris (sometimes happened with auto-rotating items)
  • Considerations and caveats:
  • - A 1GHz PIII class system with 128MB RAM and AGP video is minimal if animation quality is important
  • - WinME, Win98 and Win95 are no longer supported; no icons will display
  • - The "No Backing Store" dynamic panel option is no longer supported
  • - All dynamic panels will now allocate twice the memory for animation buffers.
    For a 32 bit colour setup, the amount of memory allocated will be:
    width * height * 4 * 2 * zoom-factor
    eg: a 3000x2000 panel will require 48MB at a 100% (normal) zoom


CHANGE Positioning an already visible popped up panel now uses co-ordinates consistent with creating it (see 5.05p). CHANGE Reading the Top and Left Window co-ordinate of a panel window has been updated to reflect the positioning changes. Popped up panels (either child or popup) now return the relative offset to the top left corner of the active work area. NEW The main planimate window can have its co-ordinates read and set. This is done using the same routine operations as for popup panels, ie: PanelWindowLeft and PanelWindowTop read position ShowPopupPanel to set the position (with panel already visible in the main window) In this case the co-ordinates are returned as Windows screen co-ordinates. This enables a model to reposition the main PL window. Doing this may be very user unfriendly so make it optional


NEW Option on attribute and cell views "Repaint Panel After Edit" This causes the view to schedule a panel repaint after a user clicks and edits the field. This is useful where a panel display has fields and objects which indirectly depend on the attribute (eg: visibility control) and avoids need for a broadcast to be set up just for a repaint. This option should be used only where required as it will introduce some lag or flicker on panels with complex displays, images or graphs. NEW Value formats Calendar Day Month Day Month HH:MM These are for cases when the year is unimportant Modeller beware: Columns formatted with this format cannot be imported from formatted files or datasets. The dataset will give an error on load and abort the load. (Datasets 2.0 will work). Clear values for these columns cannot be edited once this format is selected. Select a normal calendar format first to change the clear value, then change the format back. The date/months can be edited with the calendar picker but the user may need to expand the calendar to chose a leap year if they want February 29th. CHANGE SPATIAL LINK USERS TAKE NOTE: The spatial link run/stop control has been changed:

  • The value now matters and is used to scale the item time. eg: 1.0 uses the nominal time, 0.5 doubles the time, 2 halves the item time.
  • The minimum "on" value is now 0.01. Any lower value and the spatial link is considered stopped.

The scaling occurs only once, as the item enters the spatial link and changes will not affect that item whilst its on the link CHANGE Made a global change to the dialog code which will attempt to position a dialog so that it does not get covered up by the task bar (on systems which do not have "auto-hide" on. Look out for any side effects particulary on small screen systems with a multi-line taskbar. CHANGE Popup panels (popup, palette and child window styles) are now all positioned upon creation relative to the top left corner of the Planimate work area instead of the overall window or the screen. This should help in more accurate window positioning when the Planimate window is on a second display or when there is margin around the active area due to a large display. Have not changed the reading or updating of co-ordinates at this stage, will wait for feedback on the current change first. FIX Paint button hover broadcasts now support the "send broadcast to global scope" paint button option. FIX The condition editor was displaying portal attribute scope (if enabled) in the buttons, where they should have not been.


CHANGE Gantt block click popup now auto-sizes to the width of the longest string FIX Maximising a table window now updates its window properly FIX In the routine editor, the attribute name suggestion popup responds properly to a line being double clicked. This did not work before as it was originally only a keyboard accellerator NEW Right clicking in an open field in the routine editor open the full attribute reference dialog. This is an alternative to F2 FIX Gantt block click popups (and other similar popups) now get the correct number of rows shown in the window FIX Panel title updated after a dataset operation within a routine FIX The "Include Scope In Portal Attributes" option no longer messes up the routine list or the routine step editor


NEW Rewrote the track loop delay mechanism to support modeller interfacing to the section hold mechanism from a portal. Selecting the portal option "Track:Does Loop Delays" enables loop delays for a portal. The delays used are set by the references in the Track menu, just as for Track Loop objects. It works as follows: A train entering the portal starts a loop entry delay on the section it entered on. If the train immediately leaves the portal (within 0.1 seconds of its entry time) then the delay is cancelled and there is no entry or exit delay. If the train cannot leave the portal (eg: next section prevents it) or it is held in the portal (eg: in a multiserver) then the inbound section will undergo the loop entry delay (being unavailable to other trains during that period). When the train eventually tries to leave the portal, the following occurs:

  • if the loop entry delay hasn't finished yet, the train will be blocked from leaving (and the incoming section continues to be held)
  • once the loop entry delay finishes, the train is further blocked from leaving for the loop exit delay (and the outgoing section is held in loop delay)
  • once the loop exit delay finishes, the train can leave the portal onto the outgoing section.

Apart from being blocked from leaving, a train is free to move about inside the portal while the loop entry delay is under way. Portals with loop delays require a capacity for the train to wait at. This can be a standard dispatcher or a multiserver configured for items to not block each other (the default). A queue is not recommended unless the trains must leave in a specific order. If a train enters a loop delay portal and the item is subsequently destroyed (eg: in an exit) then any section with a loop entry delay is immediately released. Loop delays are not compatible with portals set to "Act As Junction CHANGE The portal "Route step lookthrough" option is obsolete and is removed; any use of it is replaced by "Act As Junction" which has the same effect.


FIX Menu bar hide option fixed FIX Appropriate title for data set selection when selecting a dataset for a load


NEW 'i' also inserts line in the routine editor CTLL-D deletes the current line in the routine editor NEW INI file option for developers: [Routine] UseFullAttrefEdit=0 IF you set this to 1, PL will always edit attributes using the full dialog editor instead of in-place. CHANGE Routine Step Editor Changes IMPORTANT Instead of <TAB>, <F2> now opens the full dialog attribute reference editor. This is in line with other popular spreadsheet applications. <TAB> key now advances to the next row in the step editor FIX Routine Step Editor now enables opening the full editor if the field is empty, instead of displaying an error and forcing some text to be in the field FIX Startup code for standalone EXEs now starts the model after the about box has finished. This is to avoid the model start broadcasts popping up dialogs before the about box had been experienced. FIX Resolved a co-ordinate issue in the window manager that prevented panel updates being performed. This affected redraws when transparent paint objects were used, for example transparent hover buttons AND there were margins around the work area. CHANGE Rewrote the popup-at-mouse positioning code to account for the taskbar when positioning a popup (eg: inital position for the routine step editor) FIX Pop up list windows were not getting sized properly. Have reworked this code to improve things; they have many combinations and options and are affected by the system window scheme; they will need some verification. This was evident in the size of the gantt click popups. FIX Potential crash after a gantt or train graph click-popup due to the nodes being regenerated after a redraw FIX Window bug where all Form based windows (dialogs, info popups) were forcing the main window to unnecessarily redraw. This fix will reduce flicker and make PL graphs much more responsive when they are clicked. (all windows were causing parent windows to recompute their margins when this is only required for child windows such as the Planimate work area in its container window). CHANGE Update to change in 5.05d Popup windows set to close on loss of focus will now close even if they are caption bar less (child windows) however such windows will close if they contain fields. Hence a caption-bar less popup window set to auto close should not contain fields the user will click in. Popup windows with a caption bar are not affected.


NEW Loops have a new option "Act As Transparent Junction In Lookahead" This option only takes affect if the loop is currently setup for zero roads otherwise it is ignored. It tells the track system to not perform lookahead tests from the point of view of this loop but rather step to the next object and continue lookahead tests there. It also makes the loop "transparent" to oncoming train checking (as would be expected for a 0 capacity loop acting as a junction) so trains on the other side of the loop will be "visible" when capacity lookahead (CheckNext) tests are being done. With this option on, it should avoid situations where distant trains are "released" when another train passes a 0 capacity loop acting as a junction (ie: an optional loop that is currently disabled and shouldn't be logically affecting the network) NEW Help menu has an option enabling another key file to be selected. If the key file is useable, it will automatically be copied to PL's settings folder. CHANGE Time formats The format Time HH:MM SS no longer hides the seconds if they are 0 nor hides the HH:MM if they are zero. This is to increase consistency for end users. CHANGE If the current key file is unuseable, PL will give the error message then offer the file browser so another can be selected. This is useful when key files expire CHANGE No longer disable/re-enable main window at startup as it causes flicker FIX Time format "Time HH:MM (no seconds)" now properly "sticks" when selected. FIX For some routine operations (eg: Sort) the incorrect routine operation was selected in the field if the modeller selected the routine operation browser for an existing routine line.


FIX The UI state was getting confused if a dataset was loaded that required the model's Run Date to be changed. This occured because changing the date requires the engine to be stopped and started, the latter was changing the state unexpectedly. This would not have been noticed in models that processed the "dataset loaded" broadcast.


NEW System attributes (prefix "s.') are now suggested and handled in-place in the routine attribute field and browser FIX Tuple copy of matching columns where the original and destination table is the same table should now be supported


This release adds a browser to assist in typing in attribute names in the routine step window. It signifies the completion of new UI capabilities to improve the editing of routines. NEW This adds a dropdown list which suggests attribute names as portal, item or routine attributes are typed into the routine step details window. The list drops down after the type of attribute has been specified (eg: "p." or "i." or "r.") and updates as text is typed. Names with spaces are handled (they get quoted when inserted) The list only appears after the initial "type" of the attribute and the "." is typed and is not part of another name or within quotes. You can use the list even in an existing expression to choose a different attribute by selecting the "old" name you wish to replace (but not the space after it) then typing say "p." for a list of portal attributes. Up and down arrow keys can be used to select an attribute and pressing SPACE or ENTER will insert the highlighted attribute name (if eny) An upcoming release will add support for system attributes, labels and cell references in expressions. FIX Fixed precedence of / over * in expressions. This was causing brackets to disappear in cases like a / (b * c) which then evaluates as (a / b) * c. Now / and % share a higher precedence than * This affects modellers who use the expression capability to type in formulas.


NEW Added context help buttons and idkbase content for the new routine editors NEW Routine step editor supports pressing TAB on a line to go directly to the attribute reference editor rather than in-place edit. This is useful if you know that a table needs to be selected for a line FIX Small negative numbers no longer display as "-0". This is a display change only and if your code is testing against 0, then you will need to account for roundoff. FIX Routine Delete-All (from the menu) didn't set the Undo state FIX Z-order of portal state edit dialog was not properly maintained and it could be lost behind the main window FIX PL now disables the main window at startup while the "about" box is up to prevent the click that closes the about box being interpreted as a region select FIX 2 routine operations had the same name (FormatIntoLabel)


Further progress on routine editing: NEW The routine editor now supports direct editing of attributes and mathematical expressions in the routine step details window. When an attribute reference is selected for edit (eg: the "target" in many operations), the following types can be entered directly "in-place":

  • constant numbers eg: 12345
  • portal attributes eg: p.attributename
  • routine attributes eg: r.attributename
  • item attributes eg: i.attributename
  • an expression eg: p.attribute + i.attribute * 2 + 1
      • Once this field is open, you can press <TAB> to use the *!* full attribute reference dialog. If the field contents are valid, *** it will transfer them to the dialog.

If the reference does not support editing in place (ie: not one of the above) then the attribute reference dialog opens immediately. An upcoming PL version will include a data browser/dropdown to enable attributes to be quickly entered in the field. NEW The '/' key can be used to edit the comment of the currently selected routine line in the routine list. After an edit, it auto-advances to the next line. This makes it easy to add comments to existing code "/" was chosen because in C and Java, "//" signifies a comment. NEW The '/' key can be used to edit the comment of the currently open routine step window. FIX Multiple highlighted routine lines when debugging with a routine window open FIX Attribute References in Object Property or Expression mode were not discarding of any previous table reference string FIX Icon picker and mover realigned for new form code FIX Column title clicks no longer sort the step editor fields FIX Formatting of breakpoint statements in a routine has been cleaned up FIX Dont show extra formatting commands in the routine operation comments field


This version addresses a number of requests on the BZ list CHANGE Pressing ENTER in the routine list no longer closes the window but rather edits the current line. (it was too easy to accidently close the editor after closing a step editor). CHANGE A Loop Up/Down Decision is now considered "not in use" if there are no decision tests made, regardless of the "default" value of the decision. This change should not affect any models. CHANGE If a breakpoint occurs during the "advance to time" mode, Planimate will now drop out of that mode while the breakpoint dialog is open to make it easier to inspect the model. FIX multiple step columns appearing when the routine window is minimised and restored. FIX A different subsystem can no longer be selected in the hierarchy explorer while graph points are being examined. FIX Added an interlock to prevent routine list commands being executed while the routine step window is active. This could lead to crashes if the routine window was closed whilst a step was being viewed FIX Non-floating viewports have their co-ordinates udpated properly when the main window is resized; this was causing them to lose their position temporarily when the main window was bigger than the required panel area and it was resized. FIX An auto-close popup panel containing a view will no longer close when that view is clicked for editing. This was fixed by making the panel watch for deactivate events rather than killfocus events. FIX The label option to directly read numbers as label indicies will now do so quietly, without asking any questions about adding labels until an actual label is encountered.


Continuing the rework of the routine editing to reduce cumbersome editing, the routine list and step editor have been rewritten and now have the following capabilities

  • A single level of Undo on editing lines in the routine has been added. This is available via the context menu or using CTRL-Z
  • The "Routine Step" window is now a popup and has no OK/Cancel buttons; it closes when you click outside it or press ESC or ENTER. Changes are now always committed but can be undone with the Undo feature.
  • When the Routine Step window is open, the left and right arrows can be used to step through the details of other routine lines. An "undo" following this stepping will undo all changes to details made while the Routine Step window was open.
  • The routine editor has the following tweaks
  • The selected routine line auto-advances after an edit
  • The initial selected line in the "Routine Step" popup is the one after the "Operation" line
  • More routine colour categories are now supported:
  • "Routine Constants" sets the colour of constant values
  • "Routine Scoped Attributes" sets the colour of attributes that have scope beyond the routine
  • "Routine Local Local Attributes" sets the colour of attributes local to the routine (ie: routine attributes)

If your model was saved with 5.05 or later, you should reset the routine editor fonts if you want to see the new default colours and styles.

  • The step menu has been removed from the routine editor menubar as its functions are available in the context menu and in shortcut keys
  • Mathematical operations (like + and *), comparisons (like <= and >) and logical operations are now shown using the "Routine Control Statements" font style. This helps them stand out from routine attributes which could include these characters.
  • Logical operations have been renamed to make them consistent between routine operations, conditions and expressions.

"Not Equal" is now shown as "!=" "Equals" is now shown as "=="

  • These shortcut keys are supported in the routine list: "[" Jump to start of code block "]" Jump to end of code block "-" Toggle disable/enable of line "A" Edit routine attributes "D" Duplicate the current line "E" Edit details for the current line SPACE Edit details for the current line "M" Show the context menu for the current line CTRL-C Copy selected range CTRL-X Cut selected range CTRL-V Paste copied rows at the current row CTRL-Z Undo the last edit INS Insert a new row at the current row DEL Delete the current selected row range ESC Close editor ENTER Close editor UP Previous line DOWN Next Line
  • These shortcut keys are supported in the step detail popup UP Previous step detail line DOWN Next step detail Line LEFT Previous routine line RIGHT Next routine line ESC Close step popup ENTER Close step popup SPACE Edit details for the selected step line

NEW Value format: "Value with commas, no decimal" FIX An empty subroutine will no longer cause the parent routine to be deleted FIX Text displays which included an "&" now display as expected rather than treating the ampersand as an accellerator underline


FIX The routine editor now overrides the custom colours on the highlight line. Otherwise the selected line is difficult to read on a dark text/light background setting.


[new file version]

This version is the result of more heavy development of the new routine editing environment. It adds colour coding of routine code which can greatly enhance readability. NEW Routine editor now uses multiple colours/fonts/styles to show the lines in a routine. There are 6 customisable categories: "Routine Operations" The style used for row numbers, the names of most routine operations "Routine Control Statements" The style used for code flow-control statements such as IF and ITERATE "Routine Value References" The style used for values and references to attributes "Routine Table Reference" The style used for references involving a table "Routine Label References" The style used for references directly referencing a label list "Routine Comments" The style used for comments These may be customised in the Fonts dialog. The styles are saved along with the model. Note that colours set in this dialog are now retained. For a new model (or one which didn't have any routine fonts defined yet) Planimate will detect if you are using an inverse Windows colour scheme and use an appropriate style. A new button in the font dialog enables the routine operations styles to be reset to the EXE defaults. This is useful when loading a model created under a different windows colour scheme. I will someday support styles being put into the INI file; this is challenging due to the large number of parameters which specify a font. CHANGE The "Routine Operations.txt" file shipped with 5.05 is no longer necessary as its obsolete and I now have a method of compiling it directly into the EXE. I still manage the "master" routine operations in a spreadsheet. Contact me if you'd like to contribute to the style (eg: better comments on the routine lines). CHANGE More reformatting of routine operations. Operations which had a table as the "result" now have the table as the first member in the bracketted list. The intention is that "=" should only apply to values.


This is a first release of major rework of Planimate. Appreciate any feedback. A new routine editing environment is being built. This version includes:

  • a new routine operation selector
  • a new routine step editor
  • a table driven routine definition system

There is more to come; I wanted to get something out so feedback could start coming in. The release includes a TXT file "routine operations.txt" which must be placed in the same directory as the Planimate EXE. This file contains a database defining the routine operations and is in the process of being populated. Eventually this file will be rolled into the EXE once it settles down. For now, you can use this version of Planimate to edit and release using 5.04G as the model format or engine capabilities have not changed. NEW ROUTINE EDITOR REWRITE The routine editor now uses an external database table to drive the editing and display of the routine lines. A new selector for routine operations has been written to replace the hierarchical menus. This has the following features: 1. Two lists show routine operation categories and operations. Selecting a category will set the operations list with the relevant operations. "ALL" is included as a category. 2. Notes on the currently selected routine operation, how its formatted, its expected parameters and comments are displayed in a field at the bottom of the selector dialog. 3. There is a combo-box field into which routine operations can be typed. As text is typed, the operations list is filled with any matching routine operations (from any category) sorted in order of match depth 4. Some operations such as Set or Inc can be matched either by typing their name or by the notation indicated in brackets, so "=" can be typed for Set, "+=" for Inc etc. 5. If the text typed exactly matches an operation, it gets highlighted and placed at the top of the operations list. Other operations may still be in the list if they contain the entered text. 6. IF an operation is highlighted, the comments field pertains to it. If no operation is highlighted then the comments field pertains to the topmost operation in the operations list 7. Pressing enter/OK selects the highlighted operation. If none is highlighted then it selects the first operation in the operations list. This enables rapid keyboard selection of operations by typing the minimum needed to get it to the top of the operations list 8. Using the up and down arrows on the combo-box field navigates the routine operations in alphabetical order, updating the category, operations and comments areas. This is useful for browsing operations by name when the category is not known by the developer 9. The tab order of the fields is arranged for speed: Initial: Combo-field, then operations list, then OK button. ENTER can be used at any time to select the highlighted or topmost operation. 10. TeXt CaSe is not considered in matching routine operations. Generally the following rules are used:

  • Most operations are named in MixedCase (sometimes called CamelCase)
  • Scientifc operations and math functions are in lower case
  • Execution control operations are in UPPERCASE

Benefits: Increase modeller productivity and speed Assist in becoming aware of related routine operations An in-built cross-reference to the routine operations Support mouse and keyboard users NEW Routine Line Editor The editor which appears when a routine line is clicked has been reworked Instead of buttons, a list enables the operation and parameters to be selected and edited. Double clicking a line shows the appropriate editor The comment can be typed in "In place" by selecting its line. The arrow keys and space bar can be used to select and edit a line. Ehe ENTER key closes the step editor The extra step editing buttons have been removed CHANGE Improved the report of a label list's users CHANGE A major rewrite of the way fields, buttons etc. are positioned in all the Planimate editing and user dialogs. This will affect the layout of all dialogs slightly. The new method embodies the way co-ordinates are measured in the Win32 environment and makes reliable positioning of widgets easier. Multi-line fields in particular were reworked.


NEW 2 new track rules have been added which are proving to increase train throughput with train fleeting type situations. A new Engine Option "Enable June2006 Track Enhancements" enables these new rules so existing models can be tested with and without this option. CHANGE 1:Change to track rules IF a train is doing a loop exit delay as a train behind it doing a lookahead, its considered viable capacity for the train behind to start moving towards the loop. CHANGE 2:Change to track rules IF a train is looking ahead at a loop with only one capacity slot left, that loop now responds "yes" to the train if it is followed by a non-single track with at least one train heading in the same direction as the original train. Otherwise, it recurses the test on the next object along the track, like before. FIX Routine operation to set paint text no longer changes the bounding box of the paint object; this required the paint object to be visible.


NEW The data importer now supports comma delimited data with commas inside quoted strings NEW Comments can be associated with lines in a multiple condition list (including the "default" line). This will assist modellers in documenting their intent for the conditions and under what circumstances they expect the default case to be taken. NEW Space key or double clicking on a line in the multiple condition dialog is now a shortcut to eiting that condition. NEW The "Accept Incomplete Tables" file read option will now also accept tables with less columns than the expected number of table columns. This enables data with variable trailing columns to be read CHANGE Stand-alone application EXE's have their window auto-sized to fit the initial panel's work area as much as possible. This is useful for creating "utility" applets with small windows. CHANGE Reworked the startup code so the clock is not visible unless its needed when a planimate application EXE is loading SPEED The "Matched Copy Row" routine operation has been sped up using a table-to-table tupling cache. This will speed up the transfer of matching columns between two tables with different column arrangements. Careful handling has been included to reset the cache should either the source or destination tables have their column structure changed during the run. SPEED Have reworked the way routine lines are executed to gain more speed.

  • overheads of the routine-line profiling debugging option have been reduced when that option is not turned on (the usual case)
  • code has been re-arranged so the CPU can better predict which branch to take in tests for errors (which normally would not occur).

SPEED Have reworked the way routine "SET" is processed. Made the special case tests (setting a label list, setting an item table) process faster and put the set attribute=attribute case in a place so it will process with much less overheads. This will speed up all models that use routines. FIX When the background is clicked and dragged to select a group of objects, no grid snapping occurs for the selection box. This enables the edges of the panel to be reached. FIX Rework of startup code so standalone applications running in /BATCH mode are supported. This enables batched execution of Planimate based applications without a GUI being presented to the user.


NEW The routine editor supports multiple line selections for cut and delete. The range between the first and last selected rows is used, even if not all rows within it are selected. NEW Routine editor shortcut keys: CTRL-C -> copy selected row range CTRL-X -> cut selected row range CTRL-V -> paste rows INSERT -> insert rows 'F' -> Jump to block end 'D' -> Jump to block start 'E' -> edit current line SPACE -> edit current line DEL -> delete rows (confirms first) - deletes between first and last selected rows, even if some rows not selected

Editor's please note

A selected range spans from the first to the last selected rows. Deleting a range will delete ALL rows in that range, even if they are not selected. NEW The mouse cursor indicates "busy" when datasets are being saved and loaded NEW A new option on a Label List "Treat Numeric Values As Indicies" enables importing of label data where some entries are raw index values and the modeller wants them to be treated as such. SPEED Attribute Referenes now store control information in 32 bit values rather than 8 bit values, to increase access speed. SPEED Portal and Routine attributes values are now faster for reads, as fast as constant and label values. (attributes used for table row/column references get no speed benefit) SPEED Routine Attributes are now potentially MUCH FASTER than portal or item attributes for writes. This is because PL now takes advantage of the fact that they do not have views or unblock dependencies. Routines with long, speed critical iterative loops should use routine attributes then write the results back to item or portal attributes once they are done. The speed advantage is lost if rounding or range checking is enabled for the routine attribute; PL then has to do the full processing. SPEED Sped up writing to table cells by inlining a key part of the table code FIX Interactive inspection of switch conditions was not showing label reference values, this is now corrected. FIX Initial positioning of the sidebar on some displays was incorrect. Changed the way it gets calculated. FIX The "Log Viewer" menu item will now execute the correct EXE; previous releases would execute "PLanimate.EXE" if it existed, causing an error message to appear. This was fixed by quoting the entire file spec passed to the Windows shell. FIX A routine editor opened during a run now shows the comments in the correct column when the run is stopped. FIX Routine operation Matched Row Copy propagates updates to the cells which have been updated. This is now done cell by cell rather than for the entire row. Also fixes the screen update issue.


NEW A new option in settings->End User "Enable Reading Decimal Commas" This enables Planimate to read numbers/money where a comma is used as a decimal point, as is the case in European databases. Numbers with normal decimal points will still be read OK. This only affects reading numbers, they will still be displayed with a decimal point once in Planimate. It is intended to be used with the number separator enhancement in 5.03n which must be set to a non-comma character. This change involved rework of the S_TIMEFM module which does all the number and money conversions and the auto-format detection in PL. Its been tested but be on the lookout for any issues with data entry and/or import. FIX Debugging with the routine editor open during a run was broken in 5.04b and is now fixed. The new code has the benefit that routine "taken" information is available even if the routine editor was not open at the time the model was run - very useful for "after the fact" checking. I believe it will also execute faster on modern procesors as I'm avoiding an branch test which would cause a hiccup in the flow of instructions through the processor's pipeline. This is important when one considers that this code is performed for every line of every routine in the model.


NEW Value format x.xxxxxx% for those times when a percentage really needs to be precise. CHANGE The y-scale on graphs no longer loses its format for values when the yrange is < 0.01. Doing this was useful when the existing formats did not have precision displays < 0.01 but is no longer appropriate. NEW IFs, WHILES and Conditions in routines can now be viewed while the model is paused, like the switch. CHANGE Routine "Taken" information is now always available for all routines, even if a routine editor was not open for the routine (its better to just do the count than to test whether to do it first)


BUGFIX Fixed data copy to the clipboard which 5.04 broke CHANGE No longer truncate numbers < 0.0001 upon imput or import from clipboard


This release has no new features, however significant rework of the iFlow toolkit has occured.

  • Due to cleaned up windows message processing, the UI will be a bit faster
  • More error checking has been added for window message processing
  • New standard functions for processing number<->string conversions
  • Underlying toolkit (largely) supports Unicode (but PL doesnt yet).

SPEEDUP Have inlined table index processing code. This seems to make table-intensive routine code about 10% faster.


BUGFIX The number separator introduced in 5.03 defaulted to a "." instead of ",".

      • IMPORTANT *** If you saved your model using 5.03n, you'll have to change it manually, (settings->system parameters->number separator)


CHANGE Relaxed a restriction preventing icons being loaded from an external file in a standalone EXE. IF the icon name contains a "\", PL will now look in an external folder for the icon before searching its database for the image. This is useful for the Table Grid View where icons can be referenced with a label list. The list can name the icons as say "images\my_image.bmp". PL will then look in a subfolder called "images" to the directory where the EXE is from. BUGFIX Fixed the now famous "Attref scan count" issue. Thanks to the numerous people who reported how to reproduce it. Copied conditions were not being properly cleared at the start of a run due to the magic that occurs to enable the condition editor to view the attribute states when a switch is clicked at runtime. This caused the copied conditions to leak into the ether and trigger consistency/safety checks. NEW The number separator character can be changed from the default "," This is set under Settings -> System Parameters -> Number Separator


BUGFIX Graph scales would lockup when the graph consisted of a single -ve Y value and the option to extend the y-range was on. It was messing up the yrange. The scale code is protected against this and the y-range extender has been fixed.


BUGFIX Scenario option in previous release was busted


NEW Option Settings->End User->Ask DataSet Type On Load This causes PL to put up the dataset type selection dialog before a dataset is loaded. This is useful where the user is dealing with a lot of dataset files with different extentions and wants to load a particular type. BUGFIX Paste condition is cleared before an attref scan to prevent scan count errors during editing/renaming of attributes when there is a condition in the copy/paste buffer


NEW New option in Setting->Engine to unblock trains in FIFO order instead of the default LIFO order


BUGFIX routine editor and multiple screens. Show the step editor before editing the initial target attribute to ensure it has correct co-ordinates BUGFIX About box positioning tracks monitor main window is on BUGFIX Panels popped up by the model now appear on the monitor containing the PL main window (if they are independent floating popups) NEW Added a debug option to report whenever an object (Exit or Dispatcher) initiates a restart of the run engine Note that automatic restart-after-stops are not reporting, this option can be turned off in the settings BUGFIX After an exit restarts a run, it was possible that some zero time unblock events could be posted to the FEC, giving the user errors when they attempted to interact with the model. After the engine restarts, the engine now clears zero time events before returning to the user. This might break old models which expect the run to pause after a restart from an exit but I think the new behaviour makes more sense. It will pause after the zero time events are processed.


[new file version]

NEW Routine operation: Iterate Table Rows This makes it easy to iterate an attribute over every row in a table, from the first to the last. The modeller specifies an iterator attribute (routine attributes are most efficient) and a table. Apart from the convenience, it is also faster. Unlike the standard iterate operation, setting the iterator variable will NOT affect the loop; the change will be ignored when it comes around to doing the next iteration. This helps gain a bit more speed. NEW Debugging for switches in Attribute, Condition or Multiple Condition mode. Clicking on the switch in run pause will show the attribute/condition including the last values of the attribute reference. This should assist debugging condition logic and switches which are not acting as expected. In all cases, the value shown is the last value the attref returned (including during lookahead) and not the current value of the data that the attref refers to. BUGFIX Run In Realtime now works again (was using the wrong FEC) It got broken during the V5 updates when a second FEC was added for async network events. CHANGE Run In Realtime will now still advance the simulation clock if there are no pending events on the FEC. This is useful where an incoming broadcast or a conditional test in the _Run_continue broadcast will generate activity and the clock should be moving. CHANGE When an attribute, cell, table, column overlay, gantt, traingraph, log driven or grid view was in a portal copy and pasted to a new location in the model (eg: through a paste-replace) it would update its reference only if the data object it referenced was copied along with it. otherwise it would remain pointing at the original data, even if that data became out of scope in its new location and there was new data to replace it. I've redone it so when an attribute, cell, table, column overlay, gantt, traingraph, log driven or grid view gets pasted, it will re-bind itself to the "closest" data object to it matching the name of the original data object. If none exists, it will remain pointing to the original (now out of scope) data object. This only applies to views in dynamic panels; the ones in view panels dont update, for now. This might change one day. CHANGE Rework how attribute values are read. This is to allow the previous read value of an attref to be retained as efficiently as possible, needed for item attributes. We all hope I haven't broken anything here. CHANGE Reworked the way table scrollbars are handled so they are more intuitive to users. Clicking outside the thumb area now scrolls instead of jumping to the position clicked, like the OS scrollers do. If "3d Proportional Scrollbars" is enabled, the scroll amount is a page of rows, otherwise it is 10 rows. If the mouse is held down over a second, it autoscrolls. NEW Table views have a new option "No Cell Menu" which totally disables the cell click menu. If a cell click broadcast is enabled, it will be sent instead when the cell is right clicked, with the "_contextclick" item attribute set to 1. NEW System attribute "Model Needs Saving" The modeller can set/reset this to control whether PL will prompt to save the model upon exit. This is only useful for models used by editors, obviously a standalone EXE isn't going to be saving any models. BUGFIX Left handed mouse XP option should be now supported. One of the Win32 functions wasn't consistent when the mouse buttons are switched. NEW A warning message given if some objects in a multi-select could not be deleted CHANGE Improved dialog for changing column width after a format change; dont bother showing it if the width is not changeling.


BUGFIX Data file close check was reversed after a lockfile/dataset file open error BUGFIX TCP server sockets write to multiple connected clients. Reading from multiple clients is supported but may cause problems if packets are fragmented and they overlap. This would more likely happen with packets > 1KB over the internet. Probably wont happen over a LAN. BUGFIX Removed the 5.03c ODBC error 12 hack. Its not necessary if the "Local Table" attref is set to s.Null Attribute for ODBC operations which Insert or Update data rather than retrieving data. BUGFIX Restoring a hidden Table Editor window now redraws properly. (the hidden window was still setting the window's client rect, causing it to exclude the entire client from redraw as a minimised window has no client area.)


BUGFIX Major bug in subroutine/attribute management would cause platform crash particuarly if the platform was attempting to report an error in the model


NEW Support for recursion in SubRoutines. SubRoutines can have "local" routine attributes defined. Each call of a subroutine gets a new copy of these attributes, meaning that if a subroutine calls itself (recurses) then the recursed instance will not overwrite the attributes of the instance calling it. The local attributes of a subroutine are always cleared when it is called. Since we dont have parameter passing to routines yet, inputs and outputs to subroutines will have to be via routine attributes defined in the main routine. These remain "global" to all instances of a recursed subroutine. The included demo model demonstrates using recursion to derive the n'th value of the fibonacci sequence. SPEED: String comparison has been sped up where testing for a match. This should speed up models with many item attributes SPEED: Now avoid keeping unnecessary "undo" information for routine attributes. This should speed up routine attributes accessed during lookahead. Note: accessing a routine attribute is faster than accessing an item attribute CHANGE Have doubled size of gantt block click window so longer labels are OK CHANGE formatting of routine export text cleaned a bit


NEW Expression parser rewrite Numerical expressions are far more powerful, include logical operators, comparisons, references to table cells (with column label) and labels.


CHANGE ODBC Error 12 is no longer reported to temporarily get around using the "fetch" operation to insert.


BUGFIX Tracks system unblock fix An unblock was not occuring after a train went through a loop with a loop entry delay set but no loop entry delay was actually required


BUGFIX Table cell click BCs didnt have enough memory allocated for the newly added info in 5.03 NEW Multi-column lists now have full-row selection (eg: routine editor, table/attribute lists) NEW Tool tips added to list fields which are too narrow for their column NEW MAJOR REWORK OF THE WINDOWING SYSTEM

  • changed the way the main planimate window is managed; now any needed scrollbars are placed at the edge of its available space rather than within the bounding rectange of the actual panel area.

This will reduce the need for scrollbars and look more sensible when a panel is larger than the screen area in one direction only

  • reworked the repaint of the "explorer" window to avoid flicker (InvalidateClientArea rather than a forced Show)
  • reworked the sidebar splitter code to avoid unnecessary forced repaints and made distinction between updating the splitter bounding rect and responding to its movement
  • reworked the clock to prevent it causing flicker of the main window as it repainted; did this mainly by setting flags so it doesnt become activated when clicked or moved (causing the main window to have to lose and regain activation)
  • Impose clipping on the sidebar objects to prevent them overrunning into the status bar

Probably some graphical glitches left; look out for anything new or weird with window display or mouse click handling. CHANGE No longer round numbers < 0.0001 to 0 upon entry or import NEW Cell views now support using a dynamic column reference as well as a dynamic row reference this will make it easier to have cell views pointing at columns using a column label NEW Table views have an option to send the cell click broadcast when an entire row and/or column is selected. To distinguish from editing broadcasts, this broadcast is sent as follows: Click on an entire row: _row set to the row, _col set to 0 Click on an entire column: _col set to the column, _row set to 0 When these options are enabled, the modeller must ensure to update the broadcast handlers to check for cases where _row or _col are 0 NEW Table broadcasts include a new attribute _contextclick which is set if the broadcast occured because of the context mouse button (usually the right button). This is useful together with the row/column click notifications BUGFIX Lines properly clipped to panel area upon creation BUGFIX RTF windows properly clipped to panel area upon creation BUGFIX Mouse-forming of a box no longer does freaky things if the box extends into the no-mans-land window area (outside the panel work area) BUGFIX Row/column selection now updates table window title bar CHANGE Have reworked the form resizing code to manage relocating buttons when the form resizes automatically instead of coding each case-by-case Enabled resizable modal dialog NEW Attribute/table and some labelt dialogs are now resizeable (they dont remember their size or column settings yet) BUGFIX Crash merging models with sub label lists being referenced should be now fixed (wasnt updating owner of temporary Sub label list to the new one before merging)


This version introduces Customisable Table Views Tables can now have a column arrangement, colours and formatting customised for each view of the same table. By default this feature is off for a table view; click in its column line to bring up a query dialog to enable the customised view mode for that view. Once a view becomes customised, it will not reflect columns rearranged, added or reformatted in the source table, it holds on to its own format. A view can contain multiple instances of the same column with different colours/formatting. Table click and scroll broadcasts send their "_row, _col, _to_row, _to_col, _colscroll, _rowscroll" values in view co-ordinates. For a cell click, there are additional attributes set: _data_row and _data_col, which will be the "actual" cell in the source table that was clicked. Table click broadcasts sent for a block of cells will have these new attributes set to 0; A block in the view may not correspond to a contiguous block in the source table (since columns can be rearranged in the view). Deleteing all columns in a view reverts the view to non-customised. Tables with customised views should not import data with the dynamic column resize feature since it may reallocate columns in the table first, messing up the customised view(s). Different views of the same column can not only have different formatting but also different label lists assigned. Routine code access to the table and import/export/dataset operations will always use the format as defined in the table. Interactive copy/paste from the view of the table uses the formats defined in the view. Routine-level access to a filtered "view" of a table will NOT be provided as this will be implemented by a new table type designed for this porpise, with the working name of a "Record Set". There should be little impact on model run speed when no views are visible as the processing for the customised views is only done on table display/editing/user interaction and not in the model runtime engine. Some options and table-level settings would make sense being customiseable per view but were skipped for this release as focus was put on the key support code to make the views possible. Cell specific formats (eg: cell colour, format, font) are supported but the cell specific format information is stored with the table, not the view. This wont be changed for now. The precedence for formatting and display of a table cell is:

  • cell specific format/colours
  • row colour (if Column Colour Precedence is off)
  • view customised format/colours
  • column customised format/colours
  • row colour (if Column Colour Precedence is on)


CHANGE The "Model Loaded" broadcast was being sent too early, before dispatchers were initialised. It is now sent AFTER the "Preinit End" broadcast but before the "Run StarT" broadcast, at which time the engine is properly initialised. BUGFIX Pauseable 0 multiserver does not allow its time to be changed from 0 BUGFIX Second title text can be set to empty string once set NEW Routine operation to set a paint object's property A few properties are supported (use the new Paint Property Label List to select the property) including co-ords, colours and rotation. Modeller needs to repaint after updates are complete. Inherited paint objects are updated BUGFIX Fixed font manager comparison to also compare underline and strikeout flags


NEW If a broadcast button is clicked while PL is doing a "real" delay (advancing time until the next event time) then the pending event is pre-empted so the broadcast can be processed, after which the platform will continue to delay until the next event. BUGFIX "Hierarchic Files In Folder" routine operation now works when passed a relative path BUGFIX Expression editor properly quotes names with spaces in them NEW Change->File Operation "Delete Empty Folder Hierarchy" Will delete all empty folders it finds within the specified folder and deletes the specified folder if it ends up empty. Whilst this does not delete files, modellers must still be careful to call this with an intended folder.


BUGFIX Removing all lines in a routine and closing the routine editor now purges the routine even if its a shared routine. The routine will only be deleted when all routine attributes and subroutines are also removed. Hence dont leave a routine (especially a shared one) empty otherwise all references to it will be lost. BUGFIX Icons updated for change objects if a shared routine is deleted BUGFIX No longer crash if deleting a shared routine and a change object using that shared routine is in the copy/paste buffer NEW The modeller "redraw lock" is ignored if printing. This should enable use of the redraw lock flag to reduce flickering when multiple panels are printed. NEW Subroutines can be renamed. The calls to the subroutine are not updated and will need to be edited; this allows a subroutine to be "swapped" with another. BUGFIX Change object icon indicates a routine is associated when a routine is associated with no routine lines but with subroutines or attributes defined (which prevents it being removed). NEW Modeller INI file options:\ [Routine] AutoSizeOperationColumn=1 AutoSizeCommentColumn=1 Turning these on enables the routine editor to auto size these columns to fit the contents when the routine editor is first opened and theres something in there to resize to. BUGFIX Reworked the loop routine selection dialog so it has an explicit "None" button to avoid accidently losing the routine association. NEW Routine line comments can be much longer NEW Switches display path numbers that lines in a multiple condition table correspond to


BUGFIX The change to broadcasts in 5.02b broke the continue/pause behaviour of broadcast. Its now fixed so a broadcast will now only process events at its current time unless an explicit "continue run after broadcast" button option or routine line is executed. Check interactive broadcast buttons; if you expect a run continue then it has to be specifically requested. BUGFIX Fixed a nasty bug when an error occured during lookahead and PL attempted to display an error dialog, triggering further errors in views (controlled by attributes) which would obscure the previous, real error. Furthermore, if a viewport was involved, the platform would crash. BUGFIZ Viewport zoom offsets were being messed up when the view containing the viewport or the viewport itself were not scaled to 100%

  • fixed offset save/restore code to account for the current zoom
  • ensure that when zoom is changed, current zoom is stored before the window's zoom value is changed (by hiding the window before the zoom is changed)

NEW Menu for a attribute view has an edit for any attached dial (in case the dial is lost)


BUGFIX Change Object->File->Save Image can now accept an optional data target. IF provided, it is treated as a portal/panel reference, enabling the modeller to specify a single panel to save instead of the currently visible one. NEW Change Object->File->Delete Folder option added Will delete the nominated folder only if it is empty NEW Routine operation "Hierarchic Files In Folder" This creates a list of path/file names for all files matching a simple wildcard specification, searching in the current folder and all folders under it. A starting folder can also be specified (relative or absolute). The returned list of files include their full paths, new label-string operations below can assist in processing these as required. The Path/File spec can be something like "*.DAT" - returns all DAT files in current folder and below "data\*.DAT" - returns all DAT files in data subfolder and below "C:\data\*.DAT" - returns all DAT files in absolute location and below CHANGE The "Append To Label" and "Rename Label" have been extended in the way their target can be specified. Existing models should not be affected. See next note. NEW Label String Operations: "Append To Label" "Rename Label" "Extract File From Path/File" "Extract Path From Path/File" "Extract File Extention" These share common usage in taking a "source" attribute (in string form) and performing a string operation on it, putting the result into a supplied "target" attribute/label list. SOURCE: Is interpreted as a formatted string. Usually would be an attribute formatted as a label but could be a formatted number, an internal system string attribute. If its a table row, the cell's formatted strings are concatenated together. TARGET: Must be an attribute/cell formatted for a label list. The label list will receive the new label and the attribute will be set to the label code for the label in the list. The initial value of the attribute is important. If the attribute is set to a label code for an existing label, that label will be replaced with the result of this operation. If the attribute is set to a non zero label code which has not been used, a new label will be created with the result of this operation, usingthe given label code. If the attribute is set to zero, a new label will be created with the result of this operation and attribute will be set to a newly allocated label code. EXCEPTIONS (override the above): If the result of this operation is an empty string, attribute will be set to 0 and no label will be added to the target label list. If the result of this operation is an existing label in the target label list, the attribute will be set to the label code of the existing label. LABEL STRING Operations: "Append To Label" Appends the source string to the target label (if any) "Rename Label" Replaces the target label with the source label. Can also create a new label if the target label code is 0. "Extract File From Path/File" Treats source as a file/path specification and sets the target to just the file name. eg: "C:\My Models\NewModel\Data.DAT" would result in "Data.DAT" "Extract Path From Path/File" Treats source as a file/oath specification and sets the target to just the path (everything before the last "\" eg: "C:\My Models\NewModel\Data.DAT" would result in "C:\My Models\NewModel" The trailing slash is removed unless it is preceeded by a ":" or is the first character in the string. "Extract File Extention" Returns everything following the rightmost "." in the source string. If there is no "." then an empty string is returned (label code 0). eg: "C:\My Models\NewModel\Data.DAT" would result in "DAT" More string operations will be added to this in future versions


BUGFIX Reworked reading of model file info to prevent buffer overflows BUGFIX Unblocking blocked trains from a switch based on a condition which posted an FEC unblock event was broken and the unblock never occured. This would manifest itself as trains unnecessarily blocked. Have reworked the unblocking code CHANGE The way track junctions book following sections and test for capacity has been cleaned up. They now book sections (linked by junctions) first then perform capacity testing on the nodes acting as junction and beyond the last junction. Fixes issue of a junction portal not getting a lookahead message if its next to a capacity portal. NEW Error message added: If a junction portal flows a lookahead path into internal capacity rather than out its portal exit, this is deemed broken behaviour because its supposed to link to the next section as the portal *should* have no capacity as far as lookahead is concerned.


NEW Added a counter for individual blocked train unblock attempts FIX Error message for "train turnaround at a junction" now includes details to assist in debugging NEW Clicking the ROUTE NAME line in an item's detail popup open another popup listing the routes steps, highlighting the current step. Note if you drag the item route list, you'll find the item popup is still open underneath it and it will still respond to scroll wheels.


NEW A new track lookahead rule has been added. When loops are checking if a train can enter them, they look for other "oncoming" trains at portals with the "oncoming train" flag set. The new rule is: if the train wanting to enter a loop comes from a portal with the "oncoming train" option set, there is no need to test for other trains approaching that portal - since the train doing the test is already in the portal and will be creating capacity there when it heads off towards the loop. This rule fixes a deadlock resulting from a loop not letting a train in because other trains were approaching the portal that the train was in.


BUGFIX Loop Exit Delay End was broken (being stored/read from the wrong attribute) BUGFIX IDBase client reworked to not re-request lock on note if no attachments are to be sent


NEW Routine operation "Send Named Immediate Message" This enables a message to be sent to a specifically named entry at the destination subsystem - very useful in network models where you want to invoke a "method" at a given location. CHANGE Cleanup of messaging code, named messages from routines or dispatchers will now resolve faster


CHANGE TRACK REWORK Older models that do advanced stuff in their in/out routines may need updating due to changes here. As well as speed ups, these changes will make train movement logging much more straightforward to implement.

  • Loop Entry and Exit routines (if selected) are now called for all loops in the model, even if they are "acting as junctions" (optional loops).
  • The loop exit routine is ALWAYS invoked before any loop exit delay is performed. Any loop configured to execute a loop exit routine after the exit delay will give a warning message upon load (logged to planimat.dbg) and be reconfigured.
  • The LoopEntryDelayStart timestamp is now (properly) made before the loop entry routine is called
  • Trains "thrown" at a loop get the LoopEntryDelayStart and LoopEntryDelayEnd times set to the current time
  • Trains ending their route at a loop will call the loop exit routine so their last step gets properly logged.
  • New Track system attributes. These simplify management of routines executed as trains move through the network:

"Track Loop In Routine Active" This is set if the currently executing routine is being executed as a loop entry routine. Otherwise its 0. "Track Loop Exit Routine Active" This is set if the currently executing routine is being executed as a loop exit routine. Otherwise its 0. "Track Loop Acting As Junction" This is set if the currently executing routine is either an Entry or Exit routine AND the loop is acting as a zero capacity "junction" (optional loop) for the train currently moving through it. Otherwise its 0.

  • Loops no longer support an attref for # of roads. A model can set the # of roads by setting the loop's Capacity (object attribute).

Existing constant attrefs are converted to a number. Non constants give a warning (logged to planimat.dbg) upon load and the value 1 is used. Note that setting the loop capacity object attribute does not persist between runs; the loop resets to the initial # of roads specified at edit time upon an engine restart.


BUGFIX Actually remembered to bump version number and file version number (should have been increased in 5.02c) SPEED The way broadcast items are allocated has been rewritten - much less duplication for a new item setup, means faster broadcast processing. SPEED PL now has a separate item cache for every item class. This means items can be recycled much faster because PL knows they are ready for use for that particular item class. Also inlined the cache code so items will pop out even faster


REMOVE Train arrival/departure/dwell times which used to be stored in internal route tables PL no longer uses arrival/departure/dwell times stored in internal item route tables to override track section running times. Removed very messy route depart cache code so track models should be a little faster REMOVE System-item attributes for train forced arrival/departure/dwell times removed. PL will warn if these are referenced; use the "Find - advanced - attribute reference" in the previous PL release to find and remove these attribute references. You can continue using the model even with the warnings; it will complain at any object actually using them during model run. NEW A number of new system-item attributes are maintained by Planimate to assist track modellers in generating graphs and logs, minimising the extra model code (and speed impact) that the modeller needs to put into the track code. Please refer to Planimate Knowledge Base note 313 for details on these attributes. CHANGE Moved track specific system attributes to their own flyout in the system attribute select menu SPEED Inlined route manipulation into item code for further speed NEW For routes ending at a loop, the loop's exit routine is now called so its final section travelled can be logged. This might confuse older models which did not expect the exit routine to be called for a train ending its life at a loop. NEW Item click popup - wider time fields, new fields for train time logging


BUGFIX Memory leak for object attribute name when an attribute is associated and logging with an object CHANGE Have reworked the broadcast code so sideeffects of a broadcast without the "Continue run after broadcast" option on are processed outside of the broadcast handler. This shouldn't affect operation of broadcasts but means the release note about this for 5.02a can now be ignored.


CHANGE: Attempting a run restart while a broadcast is processing is now not allowed as it messes up the engine. Existing models that do a run restart (eg: to change the run start date or allocate objects or load a dataset) will produce an error message if they break this new rule. To fix old models:

  1. 1: (If its a dataset load - this is not needed for dispatcher)

If a dataset is being loaded by a routine directly in a broadcast thread, isolate it with a 0 delay multiserver.

  1. 2: Ensure that user click broadcast buttons that could trigger a restart (typically buttons that broadcast to continue a run) have the "continue run after broadcast" option ON.

If this option is OFF then the broadcast is still "pending" while PL is clearing zero time events and you will get an error, even with zero delay multiservers isolating the thread. Taking care to use the "continue" option with broadcast buttons is also important if you want the run to be pauseable in zero time because in end user mode, PL wont pause while a broadcast or its sideeffects are being processed. BUGFIX Small leak in modeller set message in status bar BUGFIX Explorer window now not continually updated during a ctrl-paste BUGFIX CTRL-Paste will not replace the originally copied portal, this would (sometimes) confuse the platform when the replacement match was recursive.


(built with VC)

NEW Find (Advanced) for a specific attribute reference. You can also use "wildcards" by using the system->null attribute as a field placeholder which will then match any constant/item/etc in that field of the attref. Good for finding unusual table references, all references to a specific object attribute etc. NEW Track unblocking rules refined:Here is exactly when a track unblock occurs:

  • train leaves loop it was waiting at (but only if no loop exit delay)
  • loop exit delay ends
  • section control attribute changing with section becoming idle
  • train leaving section and entering loop with no loop entry delay
  • loop entry delay ends
  • train leaving section and entering a portal
  • train leaving non "act as junction" portal and entering section
  • a portal entry for a portal on a track gets unblocked (but NOT if the unblock was propagated from the track through the portal. This one is so a switch at a portal entry can unblock the track.

Can YOU think of one I've missed??? SPEED For reference in case of strange behaviour bugs

  • Optimisations assuming PL is running in an environment with VM
  • FEC event processing streamlined - less redundant checking of pause, zero time flags
  • Old unused track object unblocking code cleared out
  • Track loops cache information to avoid having to look it up to determine use of gates and exit conditions every single time
  • Some debug options removed (from release builds)
  • Time-profiling-enabled check code sped up
  • Object input paths pruning rewritten to avoid unneeded memory reallocation during run start
  • Object input/output links now cache object instance pointers to speed up item movements through objects
  • Sped up destination object/flow search for item movements
  • preferred links only format names if they have an error to report
            • - routes now use preallocated tables (limit of 256 steps per route) to avoid memory thrashing
  • Added routeinstance cache so route info objects can be recycled
  • sped up FEC event cache; no longer impose cache size limit on FEC
  • inlined switch decision reset list; now uses a custom table structure that will be quicker
  • Planimate table sorts are now more efficient; use preallocated index tracking tables (if the table is < 50000 rows) and validation of the sort is more efficient.
  • The item recycler now sniffs around a bit for an item with the same class in its past lifetime as the new one being asked for. This can avoid reallocating item attributes/item tables.
  • smarter posting of track unblock events (see above)


SPEED Optimisations assuming PL is running in an environment with VM FEC event processing streamlined Old track object unblocking code cleared out Track loops cache information to avoid having to look up/test use of gates and exit conditions Some debug options removed (from release builds) Time-profiling-enabled check code sped up Object input pruning rewritten to avoid unneeded memory reallocation Object input/output links now cache object instance pointers Sped up destination object/flow search preferred links only format names if they have an error to report routes now use preallocated tables (limit of 256 steps per route) Added routeinstance cache so route info doesn't get reallocated sped up FEC event cache; no longer impose cache size limit inlined switch decision reset list Planimate table sorts are now more efficient; use preallocated index tracking tables (if the table is < 50000 rows) and validation of the sort is more efficient. The item recycler now sniffs around a bit for an item with the same class as the new one being allocated. This can avoid reallocating item attributes/item tables. NEW Find (Advanced) for a specific attribute reference. You can also use "wildcards" by using the system->null attribute as a field placeholder which will then match any constant/item/etc in that field of the attref.


CHANGE: The "end time" for a run is now taken as the time that the engine finished processing events, not the time the run is stopped. this makes profiling much easier.


BUGFIX Crash in F (broken table code)


BUGFIX Distribution patterns used in routines that executed in lookahead did not properly "undo" possibly leading to lookahead and move not matching (if the random variable was depended upon in a blocking switch) SPEED Reduced memory allocation "thrashing" when splitters are used with different outgoing item classes to the incoming item and there are NO common item attributes to "tuple" SPEED Reduced memory allocation "thrashing" when table tupling is used and there are no matching attributes (don't know why it would be used... but its fixed anyway) SPEED Optimisation where a routine has the "Only During Move" routine line as the first routine line - now processes as quick as using the "Only During Move" routine option. (the line is used instead of the option when the modeller wants code "only during move" not to mark the thread as "dirty", preventing decisions based on attributes further down that thread). SPEED (possibly) optimised the way internal tables are searched SPEED Built with VC and set "inline all possible functions" flag


BUGFIX Hidden objects not selectable in drag NEW ctrl-click table button in attref dialog shows the table editor for that table NEW New format modes for Percentage (x.xx) without % and Parts Per Million without the "ppm" NEW Second column title text of table can be set in a routine NEW "FIND" ability for label references with no label for the index/value (in the Edit->Find->Advanced button list) This will search the model for any constant label references that do not map to a label string. It shows the attribute reference browser to assist in browser though sometimes the bad reference can be very deep (eg: within a scalar for a field inside a distribution pattern dialog). Note: references with a value of "0" are not treated as "Bad" even if a label for 0 does not exist. NEW When an attribute reference listed in a references list is double clicked, if the reference is in a routine then the routine object will flash then the routine editor will be opened.


BUGFIX Buffer overflow if labels > 64 characters used in many places such as graphs, attribute value/clear value etc. CHANGE Made fact that row count set to 0 in a gantt uses row labels more obvious in dialog and status menu CHANGE The Label List selection list is now substantially bigger NEW Model DB can contain help (CHM) files, PL will look in there as well when trying to locate a help file NEW Modeller specified model help file name and standalone EXE support InterDyne settings has a new field for help file name. This sets the application (modeller supplied) help file, overriding the default use of the model's name if this field is empty. The extention (".CHM") is optional; PL will strip any extention and add ".CHM" to whatever name is supplied. PL will look in DB files to locate this help file. If a modeller wants to ship a standalone EXE with a help file inside it, import the CHM file into the model's DB file (Tools -> Resource File Admin) before creating the standalone EXE. Planimate will then unpack the CHM file into the PL_MEDIA subdirectory when the user first accesses it. NEW System attribute returns windows multimedia timer. The value is in milliseconds with 1 ms accuracy, useful for profiling. Note this value wraps to 0 when it reaches 2^32 (about every 50 days NEW Units format "ppm" (parts per million) 1000000ppm = 1 unit. One decimal digit is allowed. NEW Run profile logging for: Routines Invoked By Track Lookahead gives routines invoked in track testenter OR track checknext Routines Invoked By Track CheckNext Only gives routines invoked in track checknext (far lookahead) only Routines Invoked By Track Loops in/out routines as trains move (never done in lookahead) Blocking Switch Decision In Lookahead blocking switches that had to make decisions (lookahead) NEW Paint image select file dialog now shows all supported image types by default NEW Clicking on a multiserver icon (or its head in "road" mode) during run (not user mode) enables you to browse its items, showing item entry time, class, id and time-till-departure. Clicking on a line will show the item details for that item.


BUGFIX Leak in jpg/gif/... code fixed NEW New system attribute (Engine) "Automatic Restart After Error" [Experimental] If the model sets this attribute to 1 during a run AND the "Restart When Model Stops" option is enabled, then PL will attempt to restart the model if a model error occurs. This is intended for special cases where model errors in some runs are unavoidable (eg: a modeller managing multiple runs of a network directly rather than using PL's inbuilt mechanism). It is not to be used for general modelling or catching file errors. It will not work if the "Friendly Errors" dialog is enabled or any other dialog appears, apart from the standard "model error" dialog appears. When an error occurs, the model error dialog appears for 10 seconds. If the user clicks/closes the dialog then the restart will not occur, otherwise the dialog closes and the model restarts. The modeller should check and act on the "last stop reason" system attribute (if they are relying on restarts a handler for this should already be there). Upon a restart this attribute gets reset to 0. The modeller should only set it non zero after the code that proceeds it has been proven robust. BUGFIX After a dataset is loaded and its broadcast is sent, any other current time events (created eg: because switches depend on the data loaded) are now cleared before returning to the user. BUGFIX Copying a subsystem with paint objects and table references to them The copied tables will now point to the copied paint objects CHANGE Internal change to broadcasts to avoid recursion of Continue() form within a broadcast handler if the system was in simulate mode when the broadcast was sent (eg: loading a dataset in a routine). CHANGE Internal change: subsystem knows owner is only a portal


NEW Support for JPG/GIF/WMF/EMF (windows metafiles) in paint image objects. These are rendered straight from the file to the display (so huge files should be OK and wont need the memory of an equivalent BMP) Currently not supported for icons/paint button states (these use memory cached BMPs) Not supporting animated images CHANGE Importing into DB file : no longer need to specify "type" if the extention is recognised by the DB system CHANGE exporting from DB - sets file extention form its type CHANGE selecting files from DB reworked to retain original extention of the file so it can be correctly reloaded CHANGE New percentage mode is now NEW New system attribute (Engine) gives access to option whether "Animation Starting" messages will be presented to the user.


NEW Pipes have a new option to send a broadcast when a pipe event occurs. Pipes with this selected will send the new "_Pipe Event" broadcast as a global broadcast. It will tuple match to the following item attributes: _pipeid : the pipe object index (or 0 if no index set) _pipeflags" : a value as folows: 1: Pipe destination is at target limit This indicates the destination of the pipe has become very close or >= than the pipe's "target limit" (meaning within 1.0e-12 of it). If the modeller takes action on this broadcast, they must realise that in some unlikely circumstances, the target attribute may be short by up to 1.0e-12 of the intended limit. The broadcast is sent every pipe update iteration once the target limit is reached, hence the modeller should stop the pipe and/or clear the target within that broadcast thread to avoid getting stormed with broadcasts. NEW Pipe option "Adjust Update Interval To Reduce Errors" BACKGROUND Pipes move values from one place to another by generating events at regular intervals and subtracting/adding to the source/target according to a specified hourly rate. Numbers in PL are represented using C double precision values (64 bit). These have a precision of about 14 decimal digits. This precision limit becomes a problem when the pipe is transferring in small amounts to end points which contain a large value. For example a pipe may be set up to transfer at a rate of 1750 units per hour, at a sampling resolution of 10 seconds to a target already containing 2 billion units.

1750 / 3600 * 10 = 4.86111111111111 (the number recurs but in memory would stop after 14 digits or so)

When the pipe dumps the first quantity into the target it does:

2,000,000,000 . 000 000 000 000 00 + 4 . 861 111 111 111 11 ^

but due to the 14 digit limit, the result will lose the smaller fractions of the value being added because its a large value and runs out of precision (about where the ^ is) Over time these errors accumulate, leading to noticeable misbalance in the system and comparisons against expected limits failing. Ways to alleviate this problem include:

  • keep sources and targets as small as possible (eg:have a separate accumulator for your "entire" stockpile)
  • dont sample more often than necessary (the more frequently it samples, the smaller the values moved)
  • dont code/expect exact quantities with pipes, allow a margin of error either way

An additional and significant improvement can be gained using this new option. WHAT THE NEW OPTION DOES Given that the hourly rate for the pipe is known, PL adjusts the transfer amount per sample to a value which takes less precision to represent. To compensate for this, the update interval is adjusted slightly, in order to keep the hourly rate the same. So basically it trades off accuracy in the amount transferred against the accuracy of the sampling interval. This all assumes that a "real world" model does not get troubled by the sampling interval not being exact. EXAMPLE In the case above, the amount per sample becomes 4.859375 (looks strange because truncation is done in base-2 math) and the sampling interval becomes 9.996428571429 (expect up to 0.1% variation from what is specified) Test case: Set up to transfer 100 million units to a destination containing 2 billion, at rate and sampling as specified above. With this option off, you end up with surplus of 1.124 units. This would cause matching problems if you were testing the result against a hard-coded number, mess up material balances etc. With this option on, the values are accurate to the display resolution. NOTE: The precision limits are still there and will still manifest themselves when the ratio of bin level to transfer amount per sample is high. Initial testing suggests a ratio of 100 million to 1 should be OK NEW Clicking on a pipe in paused mode displays useful information in high precision, including its transfer rate per sample and update interval. CHANGE "Animation Starting" and a couple of other dialogs are redone so the buttons can be customised with labels more specific than "OK" and "Cancel" (all the system dialog provided). BUGFIX Fixed crash bug when cell stats point beyond a table's columns at run start (because the table shrunk during the run) NEW Value format: Percentage XX.XXX always displays at least 2 leading zeros and 3 decimal places NEW Spatial links have option to hide them individually. They are hidden in end user and run mode but will always be visible in edit mode.


NEW Attrefs have a new mode "Expression" where an expression can be directly typed in. Expressions follow BODMAS rules so a*b+c*d will evaluate as (a*b)+(c*d). Unneeded brackets are removed. Expressions can include constant values, attribute references and some basic math functions. Expressions can include: +, -, *, / and ( ) the following single value "functions" are currently available: sqrt(x) square root sqr(x) square (x * x) fabs() removes the sign of x so its always positive round(x) rounds x to closest integer trunc(x) removes fraction of x, leaving just integer part ceil(x) lowest integer which is >= x floor(x) highest integer which is <= x exp(x) e to the power of x ln(x) natural log of x log10(x) base 10 log of x pow10(x) 10 to the power of x pow2(x) 2 to the power of x cos(x) sin(x) trig functions, x in radians tan(x) acos(x) asin(x) arc-trig functions, return radians atan(x) Attribute references: Currently expressions can include attribute references as follows i.attname : item attribute p.attname : portal attribute r.attname : routine attribute s.attname : system attribute If "attname" contains spaces or non alphabetic/numeric symbols, it must be quoted: examples: p.attribute i."next location" s.clock s."run number" Expressions are "parsed" when OK is entered so any syntax errors will be picked up during editing. Run time speed should be faster than the equivalent code using multiple routine lines. Attribute names are not validated until run time. FIX: Browsing then cancelling a paint button state image file gives the option to remove the currently associated image (if any). BUGFIX: Drags of viewports in user mode - stopped no longer possible


NEW System attribute "Last Scenario Path" returns full path of data set file accessed


BUGFIX Fixed object property "Capacity" name string (now appears in menu)


NEW: Tuple Increment and decrement routine operations like tuple set except they increment/decrement the table row with the item values rather than setting it


NEW: Pipe Table Row Mode A new mode is supported for pipes which is useful when material blending needs to be tracked. This is only supported for pipes with a zero delay (version


) which transfer directly between source and target. In this mode pipes still transfer between source and target values (with limiting etc operating the same). The values are now cells in tables. Most likely they will be cells in the same column but different rows of the same table (but this is not forced). Every time a transfer occurs, other columns in the source table will also be transferred, proportional to the amount of the source that was transferred. For example, the source value can be total tonnes and the other columns can be a breakdown of this total into its components. As the source "flows" to the target value, the components will also proportially accumulate in columns in the target row. No tuple matching is performed: columns must match if 2 different tables are used for source and target. To use this feature:

  • ensure the pipe Total Time is 0 (otherwise it doesn't work)
  • select the "Pipe Table Row Mode" option for the pipe
  • set up the source and target references as table cells (preferably to the same column but different rows in the same table)
  • The pipe context menu will include new menu items to select "Additional Data Column Start" and "Additional Data Column End" so the modeller can specify the range of columns that the pipe will transfer in addition to the source/target.

They defaults to column 2, assuming the primary source/targets are in column one. If this column range overlaps either the source or target columns then those columns get skipped to avoid "double transferring". Note that the cells referenced can be changed on-the-fly but the modeller needs to plan this extremely carefully! BUGFIX: Co-ordinate handling code fixed so hovering over an RTF/non click through viewport no longer sends wrong hover co-ordinates to the main window


BUGFIX: forgot to bump the file version number; models created in U wont read in earlier versions BUGFIX: Spatial Links with the optional Pipe View options could not handle stopping/starting the pipe animation if there no items moving on the spatial link (ie: the link was stopped). I've changed it to read the "pipe control" attref every display update interval. However this means that the "pipe control" attref cannot reference an item (which it most likely would not have). Pipe activity colour and section colour *can* continue to reference item attributes as they are computed as each item crosses a pipe "bin" boundary. NEW: Object Attribute attref "Capacity" Can be used to read the capacity for: Track Loops: (returns # of roads in addition to main line) Queue returns maximum length Dispatcher returns maximum length Multiserver returns last capacity multiserver tested against Can be used to set the capacity for: Track Loops: Sets # of roads (see below) NEW: Track Loop "Capacity" changes: As described above, the # of roads of a loop can be read and set as its "Capacity" object attribute. The value set here overrides the capacity set up during edit and is NOT retained after the run stops. (This may change in the future). Currently loops use an Attribute Reference to determine their capacity on-the-fly. I want to phase this out as its inefficient having to resolve an attref for something that doesn't change very often. Existing models that use say a table cell lookup to read a loop's capacity must be re-coded to set the loop's capacity using the Capacity object attribute instead. A future version of PL will ignore the attref for the loop's capacity UNLESS it is a constant. If its not a constant, a default of "1" will be used for the loop's capacity when the model is read with the future version of Planimate. BUGFIX: Pausing during 0 time graphical loop and advance to time dialog visible (developer mode only) Zero time graphical loops could not be interrupted during advance to time. I've changed it so: It now works like this: The first attempt to <ESC> or close the advance to time dialog sets the "paused" flag as it used to. If the model doesn't then pause and you press <ESC>/close the advance to time dialog again, then PL displays the pause menu, enabling you to either change the debugging options (useful to enable "allow pause at same time events") or to forcibly stop the run. CHANGE:Have reduced poll-check interval for PL in advance-to-time from 500 to 5000 events (as CPUs get faster, more events can be processed per second and we want to poll less often during advance-to-time). Have changed "iterate check interval" from 50000 iterations to 100000. These should improve performance during advance to time but not impact pauseability on modern cpu


NEW: "Reallocate Table Rows" routine operation (table) Allocates memory for the table so it will fit the number of rows specified. This is useful when you know how big a table is going to grow and can be quite important when there are more than 8000 or so rows and many columns. If the table's allocated memory has already grown past the number of rows specified here, this operation is ignored.


Experimenting with window transparency It gets specified as a value from 1..255, 255 = opaque and turns off the transparency mechanism for that window (saves resources). It only works under Win2K and WinXP. On older systems, it is ignored. NEW: Transparency of the clock can be set by clicking on it NEW: Transparency of a panel when it gets popped up can be set in a routine operation (display). It can also be set as a panel property. This only works for popup windows and not child windows. NEW: Transparency of main window when Planimate is active and inactive can be set in the INI file eg: [Display] ActiveTransparency=254 InActiveTransparency=180 Note that with transparency "on", animation will be jumpy. I haven't found the mechanism to change the transparency update interval yet. Also there is a flicker when transitioning an open window from no transparency (255) to some degree of transparency so you may want to use "254" instead of "255" for close to no transparency.


NEW: Pipe enhancement: 0 delay pipe If a pipe is set with a "Total Time" of 0, it now opeartes in a new mode where it transfers directly between the source and target attributes without using any intermediate bins. This mode eliminates issues of "run off" and existing "stuff" in the pipe. The pipe will still animate (as a single logical bin representing the quantity being tranferred every sampling interval). 0 delay pipes support the reversing and limiting capabilities of delay pipes and are more efficient processing-wise. NEW: Pipe enhancement: source and target limiting A new option on pipes enables "Source/Target Limits". This enables limits to be placed at the source and target ends of the pipe. The lower limit can be used to prevent the pipe draining its source below a specified value. This is useful in situations where the source cannot be completely drained by the pipe. The upper limit can be used to prevent the pipe overfilling the target. When this limit is reached, the pipe effectively becomes "blocked" and stops "flowing". The block applies to the whole pipe (no packing of pipe contents occurs). These limits work in addiiton to the Load Limiting function. The limit values are re-read every pipe update iteraction.


BUGFIX: Attref editor now knows owning object so it can browse item attributes through the Add button (useful for switches) NEW /jobid="xxx" command line option. This sets the "jobid" field in XML packets sent by PL and is useful when determining where an XML packet has come from. Currently PL does not read this field; its useful when an external server is co-ordinating PL runs. BUGFIX: Resizing panels now properly updates loops and bend points BUGFIX: Selection regions include bends and loops (they cannot be deleted or copied in a multiple selection)


CHANGE: Table key-to-edit now responds to '$' and '.' NEW: Planimate will now save model backup files into a subfolder called "Backups" if that folder exists within the folder where the current model is being saved BUGFIX: Reworked PL engine simulation engine state to prevent track system errors and subsequent crashes as the model engine shuts down NEW The row used by a cell stat can now be dynamic The row is determined when the panel containing the cell view is shown. Hence cell views with dynamic rows values should not be logged. REWORK Fixed a few cell stat bugs which would have caused memory corruption if tables had less columns than the cell stat was set up for. Had to add lots of new validation to support dynamic rows. NEW Run Engine System Attribute to control fine timer tick option on/off NEW Paint buttons have new option to cause hover broadcast to be sent globally (to whole model) rather than to the scope of the button. BUGFIX Z-order fix for shared routine name dialog NEW OK/Cancel buttons in attribute editor So now if you [x] an attribute dialog, you are cancelling it not closing it. NOTE Cancel only useful for "Cancelling" a change to the name/value or checkboxes; if you change the units then the fields are commited and cancel wont revert to whatever the attribute definition was previously set to.


BUGFIX: Test for model version broken in O when clearing the new hide about box bit


NEW: "Hide About Box" option in Settings->End User Enables the about box to be hidden in standalone EXEs (PBAs) This option will only be available to internal ID developers who have been issued a new "never expires" developer keyfile.


NEW: PL now looks for a "Section Type" column in the track table specified in Network Details. If this column is found, PL uses it to read/set the track network section types. The column should be formatted using the "_section type" label list. When the run starts, PL will treat the column as follows: If the value is "-" then PL will read the section type from the track network. This should be default value for the column in order that existing networks are properly set up in the table. If the value is not "-" then PL will ensure the section is changed to the value in the table when the run is started. CHANGE: Section table window now bigger. Section table now includes section type to assist with debugging. NEW: Section Type label list - used for specifying section types FIX: Batch mode no longer shows clock Also does not perform event polling (testing for pause) which could lead to bogus popups NEW: Multiple backups of models kept Planimate now keeps multiple BAK versions of a model. This may be useful with the autosave feature. The most recent backup is the ".BAK" file, then older versions will ripple through .BAK.1, .BAK.2 ... up to the number of backup files specified in the INI file SaveBackupCount value (default is 10) If SaveBackupCount is 1, you only get one ".BAK" file (like before) INI File setting: [Edit] SaveBackupCount=nnn nnn is the # of backups to keep when saving the model default=10 value range:1..999 NEW: AutoSave for models Automatically saves the model if a given number of minutes has passed since the model was modified. AutoSave currently only occur when:

  • the run is started (in editor mode)
  • toggling to "User Mode" from "Editor Mode"

Auto saves do not occur if in user mode. Autosave is off by default, it can be enabled from the INI file [Edit] section: AutoSaveInterval=nn

  1. of minutes between autosaves of the model during editing, 0 = disable default=0 value range:0..600


FIX Have reworked the way PL determines the "Application Data" folder in order to avoid users of NT being forced to install Internet Explorer.


FIX Fixes a crash on exit if help was open and the target PC uses a Pentium 4 with hyperthreading or multiple processors.


NEW help buttons for change object icon/route and odbc dialogs CHANGE Attref Separator option is now on for new models


FIX: Save/Save As shortcut label in menubar CHANGE: "Remove Button" renamed to "Remove Button Action" for paint buttons CHANGE: Default posn of portal exit now close to portal entry BUGFIX: Paint button Hover broadcast properly deallocated when button deleted NEW: Free text cells get written to the clipboard as text (not hex) with newlines and tabs within converted to spaces. FIX: Toggling smooth/stepped dragging with key now updates menu bar


NEW: Launch Log Viewer option in Tools Menu Launches: "Planimate Log Viewer PBA.EXE" NEW: Option for file read/write at change object "Remain in directory of chosen file" Causes PL to not return to the default directory when a browser is used in a change object to select a file. This option only takes affect for PBAs (standalone EXEs) to prevent PL losing track of where the model being edited and its DBs are.


FIX: Help topmost fix, msgs on failed help load


NEW Routine operation (Table) "Set Cell Text" Use this to copy "Free Text" between table cells. Source and target must be table cell references, both in columns formatted for free text. You need to force repaint to reflect changes in free text formatted cells on any currently visible table. NEW Button paint objects have resize to text/image option NEW Button command click action for "About" NEW New table view option not to show the current cell NEW Portal tool tips (set from portal edit menu) NEW Tables can have a font specified for data on a column by column basis, using the column "Cell Font" option. The font selected here overrides the Default Table Cell Font (if set) and is overridden by the cell specific fonts The "Cell Font" option in the Table menu is renamed to "Default Cell Font" NOTE that the Default Cell Font is used in sizing cells for the table view so it should be set for the "largest" font if you then override the fonts for each column, so the cells will be big enough


FIX: Table saves row height value FIX: Path editor doesn't allow a step to be repeated between paths. Also tool tip generator and flow line preview reflect this rule FIX: Show on load note (must be called main) now actually shows NEW: Spatial link routine operation to set the link cost of a spatial link requires spatial link cache flush operation


NEW: Seetings Menu option "Edit INI File" opens the platform ini file NEW: Triple track section types (testing) Train movement between portals seems OK Section control table building should be in place Now with working section control for third track CHANGE: Removed scroll wheel handling (without driver) for the time being BUGFIX: help ids for get integer dialogs - default help button for id 0 no longer shown NEW: New routine file option "Allow Empty Cells" enables the column option "Dont Show Zeros" to take effect for tables written to a file. (normally all values are written out). BUGFIX: Object positioning when creating objects dynamically was out by 1 pixel due to different ways of getting middle pixel of even # of pixel icons - now more consistent. CHANGE: Table cell editing changed so a click outside a cell area does not trigger a cell edit


NEW: New row option "Row Height" sets the row height in lines (found under table editor row menu) NEW: Cell text will now wrap to the number of rows (specified by row height). Long text will be truncated (similar to long column names) CHANGE: Table columns formatted for "Free Text" are now written to DAT and DataSet files. Free text cells are written to the file as a single (potentially large) hex cell. which looks something like this: 0004:21222300 Before the colon is the byte count, followed by hex character pairs for every ascii character. Last one is always "00".

      • NOTE***

This will affect reading existing DAT/DataSet files IF the tables they are read to contain any columns formatted for free text. (they will fail to read). They would have probably failed anyway if the user had entered quotes, new lines or tabs in the free text.


NEW: Spatial links have a new option "Link Cost" This enables the modeller to set the "distance" of the link directly (default 0 uses screen distance). This is useful where you have a short link connecting nodes but you dont want items to take that link as a "short cut" unless you specifically nominate an object on that link as a target.


BUGFIX: Fixed the issue of the sidebar area being reserved when a model changes from user mode to editor mode even when the sidebar may be hidden. BUGFIX: Fixed context links for dialogs that read integers BUGFIX: Double quotes in fields converted to ' (if you paste one in) BUGFIX IDKBase Updates menu no longer gets updated by idKBase while the mouse is down NEW: Added option to display cell borders on a grid view NEW: New context help links in various dialogs NEW: Added support for mousewheel scrolling of panels for machines win95 and above NEW Time Format: "C time" DAY MON DD HH:MM:SS YYYY as C standard libraries write BUGFIX: Routine step editor was re-enabling closing of routine list while editing an attribute reference BUGFIX Positioning of portal entry/exit now checks subsystem panel Pentry always at top left, Pexit at bottom right. NEW: IDClient.xml can be placed in the Planimate application data folder and it will be found NEW: IDCLIENT.xml can contain a new parameter "auto" which if set to 1, causes an automatic login the first time idKBase is accessed. Subsequent attempts to open will show the login dialog. to use this, edit idclient.xml as follows:

port="8118" auto="1" name="....


NEW: Added more context ids/help buttons for Data menu windows BUGFIX: CTRL-I and <TAB> key are now distinguished in RTF editor (idBase) NEW: Can send an immediate message from a loop entry/exit routine CHANGE: IDBase references changed to IDKBase to distinguish the knowledge base from the IDBase file area. CHANGE: INI file IDBaseMenu is now IDKBaseMenu. If you had set it to 1, you need to set it again for this release. NEW: 3 Way help system Clicking a context help button shows help from local help file CTRL-clicking a context help button shows help using the new IDKBase web site. This opens the default system web browser and should work through firewalls if normal web access is permitted. CTRL-SHIFT-clicking a context help button uses the IDKBase client to connect to the database (enables editing - requires IDKBase account) A new [Help] Section in the INI file contains an option HelpIDKBaseEnable = 0 by default. If you set this to 1, then the actions of the CTRL-click and CTRL-SHIFT-click are reversed (ie: CTRL-click uses IDKBase to edit note, CTRL-SHIFT-click opens web site). NEW: [Help] section in INI file contains a string HelpWebSite="...." The default site is the InterDynamics help web set. This should not be changed unless you have arranged a proxy site to deliver Planimate help to you.


BUGFIX: Centred label now uses plot colour rather than label colour BUGFIX: FIle Mneu properly generated in user mode


BUGFIX: Very narrow points in area graphs used to be missed (when viewing a broad time range with a lot of fine data). Now they get plotted as a vertical line. NEW System attribute "Visible Portal Index" If the main visible panel is a subsytem of a portal with an object label, that label index is returned. If the top level window is visible, 0 is returned. Otherwise the value is -1 BUGFIX: Icon and Route assignment dialogs at a change object no longer become lost behind the main window. NEW Plot mode "Centred Label" - works for log driven graphs This draws just the label string, centred horizontally at the plot point. This enables placement of annoations/labels within the graph. If you want to reference this mode using the _Plot Modes label list in an older model, add "Labels" with index 8 to the list.


NEW: Context help support added for item pickers and list pickers and links in most PL uses of these dialogs are now in place


NEW: Gather capability in IDKBase search windows (File menu) Collects together the notes in the window and writes them to a text file


CHANGE: Entry no longer allows distribution for batch size to be edited Older models will still work but new entries wont be able to have a distribution assigned to the batch/item limit. This is NOT the inter-arrival time - that can still have its distribution edited. CHANGE: Planimate now looks for PL5_MAIN.CHM for its help file NEW: Control clicking on a context help button will now open IDKBase instead of showing help from the local help file. This will hopefully help make authorship and updating from within Planimate easier. IF a context help item does not exist for the item you've selected, then you will get an error message then PL will ask if you want to create a new note. Dont try create notes yet - the IDKBase server EXE needs updating and I'll populate the database with some items I've already written. (to author notes you need a valid IDKBase login)


BUGFIX: Deleting objects in a flow was also crapped up by the 4.98 fix to module merge (because more code was dependiong on an owner pointer that is now cleared after the object is removed from its manager)


BUGFIX: Deleting multiple selections of dynamic objects caused crash (changed place where I deregister the multiple selections - owning panel was unknown due to a change made for model merging)


NEW: Logger channel column header section has an extra column at the end This affects the format of log files. The column is called "Attribute Type" This is a string which is set to the type of object/property being logged for that channel. Possible settings are: "Count In" Logging in count of an object "Count Out" Logging out count of an object "Occupancy" Logging occupancy of an object "State" Logging state of an object "Portal" Logging a portal attribute that is not associated with an object attribute "Cell" Logging a table cell Other labels may be added in the future.


CHANGE: Default icons are now 16x16 BUGFIX: Change column position dialog now displays correct column count. CHANGE: Disabling routine lines during run now doesn't get toggled by a double click on the row but rather a popup menu appears in which you can select enable or disable. BUGFIX: Crash during merging in module fixed (was not NULLing owner of the merged-in portal) CHANGE: Major rework to file location handling:

  • PLANIMAT.DBG is now placed as follows

First an attempt is made in the EXE's directory. If this is not writeable then an attempt is made in Application Data/InterDynamics/Planimate If this is not writeable an error is given but PL continues and tries the working directory as a last resort (in case its different than the EXE directory) Previous versions wrote to the working directory. The idea is to keep the debug file close to the EXE if possible.

  • Planimate looks for the developer's INI file as follows:

First in Application Data/InterDynamics/Planimate/Planimate.INI If thats not found, then in the EXE directory Planimate.INI if thats not found, then in the EXE directory Planimat.INI If any of them are found, Planimate will write back updates there. If no INI file is found, Planimate will write Planimate.INI to its application data directory. These changes makes working with older versions that overwrite Planimat.INI a bit easier as the newer version will favour Planimate.INI and the older version uses Planimat.INI.

  • Planimate searches for model resources (DBs, BMPs etc) as follows:
  • the current directory (where the model or standalone EXE is
  • the EXE directory (where system DB is)
  • the subdirectory PL_MEDIA under the current directory (if it exists)
  • the Application Data/InterDynamics/Planimate directory

As well as affecting models this means PL will find key files in the Application Data directory. However a keyfile in the Planimate EXE's directory will take precedence.

  • Key file loader no longer works with _SV_KEY.KEY file. The key file is usable (for now) if you rename it to _PL_KEY.KEY

The key loader will now look in Application Data\InterDynamics\Planimate for key files as well. Note that it looks in the working directory first so its possible to have a "local" key for special purposes. If a key is not found, PL now puts up a file browser so the user can select a key file to use. The file used is copied into the Application Data planimate folder or the EXE folder for older versions of Windows. If upon attempting to proceed with that key, PL discovers its not valid (eg: its expired, is not a valid key type etc) then PL will delete the copy it just made in order that the user gets another opportunity to pick a key file next time they run PL (avoids users having to locate Application Data ....) BUGFIX: Running PL with a runtime key with advanced options set (unusual but possible to generate) allowed editing until the first entry into end user mode (after which it would not switch back to edit mode) BUGFIX: Menu bar with tools hidden fixed (was not updating properly leading to an empty Run menu in Application mode


BUGFIX: Special handling added so an immediate message sent during a track lookahead (useful for making permanent changes to attributes/tables in lookahead) wont mess up the original train's route information (section tokens were being discarded)


BUGFIX: When a user defined menu was used and the model was changed back to editor mode from user mode the side bar would be redrawn before the menu was regenerated. Thus the sidebar would be pushed down for the menu. Now fixed. NEW: New INI file option "ModuleFolder" defines the folder Planimate will first look in when loading a module. ModuleFolder="Modules" (will look in {exe path}\Modules) BUGFIX: End User menu display options were being ignored (ie Hide Load/Save Model) NEW: New End User option "Hide Window Option", Hides the window menu when in end user mode.


NEW: fixed cell stats logging and label list management NEW: "Graphics" menu option now availalbe in the multiple selection menu that appears when a group of objects is left clicked. This enables the "graphics" properties of all the selected objects to be set at once, which means border style, background, text and border colours and gradient colours. The graphics dialog will default to the graphical settings of the object that was selected first in the selection group. Only paint objects and views have "Graphics" properties, other selected objects will be unaffected by this option. NEW: The defaults for the "graphics" copy/paste buffer can be set using new options in the INI file (styles are numbered from 0 as they appear in the menu, colours are numbered from 0) [Edit] DefaultBorderStyle=5 DefaultBorderColor=0 DefaultBackgroundColor=15 DefaultTextColor=0 DefaultTopLeftGradientColor=7 DefaultTopRightGradientColor=7 DefaultBottomLeftGradientColor=7 DefaultBottomRightGradientColor=7 NEW: Routine op to set Column text alignment mode can be set Index codes are: 0 = left 1 = right 2 = centre


NEW: The "Save Window Image" change object File operation can now write to the clipboard. Supply a filename of just "-" (using the dynamic filename option and a label list) and instead of the bitmap being written to a file, it will be placed into the clipboard, from which the user can paste the image into a graphics application. CHANGE: Comparison precision changed from 1e-10 to 1e-12. This means equality checks require 12 digits of precisions to match If a model computes one value from fractional components and compares it to a number computed differently, they may not exactly match. Solutions include using "Round" on the computed numbers and avoiding code that expects *exact* values to be reached, but rather tests for thresholds being crossed. BUGFIX More issues with data menu items when viewing application panel fixed BUGFIX Added alternative "go back" handling for panel navigator when its docked - the existing mechanism broke when the navigator is in the dock because the navigator never gets activated/deactivated message. These means go back (ctrl-b) and ctrl-d/ctrl-f will work for all panels visited using the docked navigator. CHANGE: Cell-Stat Views no longer "track" their cell as rows are added/deleted from the table. They stay hard-coded to the cell they were initially associated with CHANGE Change object menu "lookahead" option now more descriptive and uses a flyout rather than the option popup CHANGE INI files now support strings New INI setting [INI] DefaultFolder="." Sets initial working folder for PL (default is the folder set by the shortcut, which is usually the exe's folder NEW: If the display option to not auto start scheduled entries has been selected and the model hasn't started the entries yet, then a new item in the paused background click menu enables the modeller to start them. NEW: Table routine operation "Purge Duplicate Rows" Removes any identical rows after the first one encountered. Comparisons are made using Planimate's rounding rules (now 12 digits precision). This will create issues for values over 12 digits long, with different round off error or with long multilabels.


BUGFIX About box shows user bmps properly for PBAs BUGFIX Issues in routine editor of condition editor enabling parent windows to be clicked/closed causing crash now fixed (Screens were propagating "Enable()" up to parent Screens; now dont do the propagate if the parent screen is also a Form class) BUGFIX Views (eg table) will not copy paste between models directly; (they need to be in a portal with their table) this is now checked, (including multi-selections) and the copy/paste buffer is discarded if it contains a view when another model is loaded BUGFIX: Planimate Help menu commands would only find the Planimate help file if there was no model loaded (ie current path = exe path) now works with model loaded. CHANGE: Planimate will now first search for a folder called "Help" under the search path to find help files.


NEW About box shown for all versions of PL including standalone applications (gets shown for 5 seconds) NEW Application key files for creating internally keyed applications become unusable after the EXE is a year newer than the application key. NEW Planimate has more sophisticated INI file handling To better support multiple users, the INI file is now created by default within the users "Application Data" folder. I still support INI files in the EXE folder however, so no action is required if you are happy with the INI file where it is. The INI file has also been renamed. The search works as follows:

  • look in the EXE directory for "PLANIMATE.INI" If not found, then
  • look in the EXE directory for "PLANIMAT.INI" If not found, then
  • look in "Documents And Settings\(username)\Application Data\InterDynamics\Planimate" for "Planimate.INI"

If all these fail to find an INI file, then PL will default to creating one in the Application Data folder, as above. If PL does find an INI file, it then writes back to that location.


CHANGE: More changes to about box Application name is shown at top left of application bitmap area for standalone exes No nags on expiring of PL Model End User ("InterDyne") key files A keyfile with an application name associated can only be used with a standalone EXE with that application name (not as PL End user key) PL Modellers do not get option to create applications with external key files UNLESS they have ability to create unkeyed applications. It is intedned that most developers would create/ship PBAs which have been internally keyed with a PBA license key. BUGFIX Display of routine atts and purging during copy to a sub-routine fixed BUGFIX IDBase menu status once connected BUGFIX Data attribute/table items now always available and bind to closest dynamic screen's data when in a view panel CHANGE "Average" field for constant value distribution now labelled "Value" NEW Breakpoint/error dialog now remembers its position during a PL session NEW "Step" button in breakpoint dialog - next routine line executed will be breakpointed before it executes BUGFIX "Draw from top" gantts now work properly with the y scrollbar CHANGE: most recent list of models available in user mode again NEW Value format "Scientific" formats values as: 1.23


-003 Unlike all other value formats, no clipping or rounding is performed on numbers read/written using this format. Currently is fixed at 6 decimal digits of precision. NB: PL is not intended for processing of very small or huge numbers and most of the other formats do rounding/clamping of values to protect modellers and users from some roundoff issues.


CHANGE: Reworking about box, inner about box and PBA about box NEW: Basic List of Logged Stat Displays under View menu select "View Logged Stats"


CHANGE: Modules looking for module configuration screens will no longer search within other modules. CHANGE: Object names are updated in the treeview when a new object name is created CHANGE: date testing for keyfiles fixed NEW: ability to enable/disable lines in a routine (ie: comment them out) [somewhat tested] this is intended for immediate debugging and wont be saved in the model file. If you want something persistent, then use an IF. Lines are disabled using their context menu during edit or by double clicking or right clicking on them during simulate A disabled line has a "-" in front of its line number Disabling a WHILE, SELECT or ITERATE disables all code within it (this isn't indicated though) Disabling an IF disables its ELSE as well Disabling an ELSE disables just the else part Disabling on an ENDIF, ENDWHILE etc is ignored. Disabling a CASE is not yet supported I am interested of any speed difference in routine processing with this release compared to


. Disabling a line in an instance of a shared routine during simulate will be lost when the run restarts, otherwise disabled lines persist between runs.


NEW: Routine operation Spatial link - Add Spatial Link Bend enables a bend point to be appended to the current bend points of any spatial link going from one designated portal to another. This is intended for models which construct spatial link networks on the fly. There is no way to remove a bend point; recreate the link as required. CHANGE: "Use mouse position" co-ordinate for popping up a panel in a routine change from (-9999,-9999) to (-1,-1) as what is used in a popup panel button click action. Models using (-9999,-9999) introduced in


need to be updated

CHANGE: Table scrollbars remain operational if the mouse leaves their region as the mouse is dragged. NEW: Easier to delete a distribution scaling value (delete button in attref dialog) NEW: Note in routine editor given for bitwise and modulus re: 14 digit limit BUGFIX: Fixed PL showing and forgetting about the "advance to time" dialog if an error occured durng the initialisation of the model. BUGFIX: Locating broadcast button paint objects from the broadcast now implemented 4.97 NEW: Edit -> End User Model Info has new "Application name" field. This sets default application name used when creating a keyed standalone EXE. NEW: Key file format. Now have account name field. Names can be longer New format key files are 248 bytes. key files now have up to 50 char names new fields for account name and application name in key files and demo/edu version bits date testing performed for demo/edu/runtime versions PL still compatible with older key files (account name = user name) Newer key files implement expiry/aging No longer need DLL to make standalone applications You will need special key file to create internally keyed standalone EXE - contact TonyG about this CHANGE: Panel (Dynamic / Application) Object names appear in the treeview. An ini option controls this: TreeViewObjectNames=1 (1 to turn on, 0 to turn off)


CHANGE: When using the "Show Panel" routine operation you can now specify popup coordinates of -9999, -9999 and the popup will show at the mouse cursor position. (Only works with popup panels that dont have the caption bar hidden as popup windows with caption bar hidden use coordinates based on the panel not the windows desktop)


NEW: INI Option [Edit] SwitchVisibleInRun=1 If set to non 0, newly added switches default to being visible during the run, otherwise they default to hide during run. NEW: ctrl-e when editing toggles object/paint modes CHANGE: Routine operations Modulus, Bit AND,Bit OR and Bit XOR are now performed using 64 bit integers so there is no 4 billion limit. Beware of roundoff issues - beyond 14 digits you will lose precision in units. CHANGE: Delete Paint routine operation has an option to also delete paint objects that were inheriting from the paint object (default = 1 = yes) BUGFIX: Restoring minimised routine editor column issue fixed BUGFIX: Loss of focus on user dialog editing in a routine fixed BUGFIX: Scoped broadcast in application panel not broadcasting to dynamic panel that owns the application panel fixed BUGFIX: Queues and dispatchers paste properly in a group paste


BUGFIX: Routine attribute list title was broken, often causing crash BUGFIX: Paint delete all inherited missing screen repaint BUGFIX: dispatcher was updating rect before loading overflow flag


CHANGE: Palettes that are visible will reload and appear after saveing model as standalone application BUGFIX: Model merge crash fix Merging of labels was broken if a class merge occured with item classes that had item attributes that referenced label lists (an internal list of all label list references was being corrupted)


BUGFIX: A serious engine bug which caused blocking switches in "first available path" mode not to properly retain the switch caches of following also-blocking switches. BUGFIX: Fixed bugs with restarting run and attribute views not being properly reset during the restart. Caused a crash BUGFIX: Fixed bugs with model copy views - were not getting log channel initialised properly, also caused a crash. NEW: Object property "rotation" sets rotation of object bitmap units of one tenth of a degree CHANGE: Setting an objects xpos or ypos Object property no longer animates or updates the object. This enables multiple updates of objects to be performed without flicker (a force repaint updates the positions). NEW: Routine option Display->Repaint Dynamic Objects this can be used to update dynamic objects which have been positioned/ scaled/rotated using the object attributes. It updates all the objects in one hit using the animation manager. This should result in a smooth update and the ability to create very nice animations using objects. This routine operation also speed-regulates to keep update speed consistent on different hardware (by releasing empty CPU time to other tasks). It should be invoked in a master timing loop every "frame" you wish to show.


CHANGE: Added an extra column to the log header table. If a logged attribute is associated with a label list, the label list name is now in column 4 of the channel header If a logged attribute is associated with the Object State Attribute of an object, then the name of the object is passed as a label list name - eg: "_MultiServer States" This enables log viewers to associate the column with a state label list for each object class (which the log viewer must maintain) CHANGE: 0 width columns are not offered in the sorting column setup list BUGFIX: Was writing garbage in log header for the hour of the date NEW: PL now only shows the focus cell for table views which have the keyboard focus NEW: Context help buttons being added - not yet functional


NEW: INI file option [Display] PaletteTitleDocked=1 If set to 0, palettes wont have titles while in sidebar BUGFIX: Palette state in menubar properly updated if palette closed while not docked NEW: Typing while a table view has the mouse focus now goes straight into the cell for the table. NEW: Dynamic object menu option for all objects that can be assigned object attributes. "Log Attributes To File" A dialog will allow the user to select object attributes to log to file. If an attribute has not be assigned one will be created. NEW: Editor Palette. Brings some of the menu commands into a palette. Its display is controlled with the ini options: EditorPaletteX=0 EditorPaletteY=0 EditorPaletteDocked=1 EditorPaletteStatus=0 SidebarEditorPalettePos=0 BUGFIX: The sidebar splitter can no longer be dragged outside of the Planimate window. NEW: Selecting an attribute in the routine editor menubar brings up its editor NEW: Infrastructure for help buttons in dialogs added. BUGFIX: Label lists with names starting with "_" no longer offer the scope button in their editor. They should not be moved from the top of the hierarchy. NEW: Attribute lists name their owner in titlebar BUGFIX: IDBase finds its XML file (should be in EXE dir) regardless of current working path CHANGE: Renamed "Broadcast Messages" list "Broadcasts" NEW: Ini option to disable help buttons [Edit] NoHelpButtons=0 If zet to 1, help buttons are not displayed in dialogs NEW: Routine operation to format into label at index Label String -> "Format Into Label/Index" This allows modeller to specify label and index for a label added to a list. If an existing label already exists at the index, it gets replaced


BUGFIX: Times written in log files were broken BUGFIX: Message when calendar time needed fixed CHANGE: Full Text table cells no longer written out when a table is exported. They would corrupt the table as a delimited format doesn't mix well with a format supporting new lines and tabs. NEW: <Insert> key while viewing a routine brings up menu to insert a new routine operation CHANGE: Tab order in routine step order to make it quicker to get to the routine operation buttons BUGFIX: Deleting paint objects in a group of selected objects now also deletes any paint objects that inherit from them. Note that PL doesn't ask to confirm as when a single paint object is deleted. NEW: Dragging in background in Paint mode enables a selection to be made as in object mode. All objects are selectable (as in object mode) but only paint objects are sensitive to clicks and drags, not modelling objects. This mirrors object mode. CHANGE: Views are now sensitive to clicks in paint mode. This makes it easier to position them while creating paint content. CHANGE: Views default to white background/black text


CHANGE: Long Label Support I've increased buffers to support much longer labels 4k byte temporary string handling buffers (up from 512 bytes) 1k byte label text (up from 64 bytes) Some UI elements like editor's context popups will look silly with long labels so be careful where you use them. Long labels are primarily intended for internal use, such as file paths and URLs NEW: New Label String Routine Operation: "Label Character" enables modeller to read the ascii code of a given character within any formatted value (doesn't have to be a label). This is useful for special processing, looking for delimiters etc. Works well in conjunction with using Formatted Width (to get the width of a formatted value/label) and Label Trim (to extract a substring of a label string) NEW: Can now message into a module and the class remapping will work. You need to manually set up the remapping (portal menu->data->class mappings) as the platform doesn't prompt to do it automatically as when you are flow editing. BUGFIX: Message entries now properly count message items entering their subsystem. Previously this was missed causing the portal's occupancy to go -ve when the message item went through an exit


      • A Number Of Changes require modeller attention if
  • loading models using the _Log broadcast or _Logged Attributes label list
  • loading models containing tables without the "Variable Length" option on

CHANGE: The "Variable Length" table option is no longer supported. All tables are assumed and treated to be variable length by the run engine. This does not affect end user options to not resize the table but affects the way tables are treated when rows are appended/deleted during a run or a "clear" is performed on the table. An old model with the "Variable Length" option off will report a warning upon load. The warning will also be logged to the debug file. NB: Planimate has been warning about turning off the Variable Length option on tables for a while now. Older models may have had this option "off" as tables used to be "fixed length" by default. Older versions of PL have a "Find" function to locate fixed length tables. Obviously this is no longer useful and has been removed. If you want to "Clear" a table without deleting its rows, you can achieve this by using the arithmetic "Clear" operation on the entire table. NEW: Table file reading supports reading data formatted on a cell by cell basis. This requires the new option described below. NEW: Option in file reading in change object "Read Over Existing Table Contents" With this option "on", PL will not clear a table before reading into it. Instead, PL will attempt to read the file based on the formats of the existing cells in the table. This is VERY useful combined with using cell specific formats in a table. The modeller can specify what format data should be read in on a cell-by-cell basis (including different label lists). This option replaces the behaviour of reading into a table with the (now retired) "Variable Length" table option turned off. With this option on, PL doesn't read data past the rows already present in the table. CHANGE: Logging option on an attribute view is now "Change Broadcast" New option "Record Changes To Log FIle" will write a log file of changes to the attribute (NOT IMPLEMENTED YET) CHANGE: Renamed internal lists

  • the broadcast "_Log" is now called "_Value Change"
  • the Label List "_Logged Attributes" is now called "_Change Tracking"

If you have used this mechanism (introduced in


) then you will need to manually replace these strings in your model - match/replace including the quotes: "_Log" -> "_Value Change" '_Logged Attributes" -> "_Change Tracking" Alternatively remove references to the "_Log" broadcast and "_Logged Attributes" label list before upgrading the model.




change also affected BCs sent from graphs. Have updated Train, Gantt and Log Driven graph click handling

CHANGE: Log Driven Graph has new initial scale options CHANGE: Trig Menu in routine selector is now called Math BUGFIX: Reindexing reworked for: Labels SubLabels MultiLabels Object Labels Panel Labels Paint Log Labels Broadcasts (was not properly occuring meaning that model merges would mess up) BUGFIX: Paint palette now uses paint palette INI settings for co-ordinates (if not docked) and docked state, rather than using object palette BUGFIX: Lockup in displaying model object list when object/subsystem names were very long fixed CHANGE: Updated application banner resource in PL


BUGFIX: A change in


caused an attribute view formatted to a label list with cyclic selection AND configured to send a broadcast to now put up a bogus "pause run" menu when clicked.

I've fixed this by ensuring that cyclic selection actions wait for the mouse button to be UP before proceeding. (In previous verisons the cyclic selection occured on the mouse down). BUGFIX: Clicking objects off palette created flickering - fixed BUGFIX: Default for command button click action was invalid and would cause a crash if selecting a command for a new button was not performed CHANGE: Renamed "Gantt" graph mode (in Column Overlay Graph) to "Labelled Bar" to distinguish it from the "Gantt" view. The Labelled Bar mode is useful where the overhead of the Gantt View is not desired as it does not keep a copy of the gantt nodes. NEW: Attribute and Cell Views have new option "Cen Edit During Simulation which enables them to be clicked upon/edited in simulate mode. The Engine Option "Mouse Clicks While Running" must be on


BUGFIX: z-order of gantt parameters dialog fixed BUGFIX: flow hover line over object connected to spatial/pipe appears properly BUGFIX: crash bug if a module was loaded but not pasted (produced a system error and corrupted the target model file) BUGFIX: new ibeam cursor causing more problems than tool tips on fields are worth. Removed it. Tool tips seem OK under XP. BUGFIX: Queue/Dispatcher bounding boxes had slight calculation error causing their width to be offset and hence vertical lines through them not to be straight BUGFIX: double redraw when changing panels fixed - avoid unnecessary menubar rebuild function call. This prevents the flicker and and speeds up panel changes CHANGE: View edit menus have new layout CHANGE: The object palette now supports dragging OR clicking objects off the palette, either case lets you drag an object about and place it. This keeps the UI consistent with the paint palette yet lets users who like dragging get their fix. CHANGE: Help files can now be located in the model file directory, not just the executable directory 4.96 NEW: INI file options that effect the order that widows are displayed in the sidebar. The higher the number the higher the sidebar position. [Display] SidebarTreePos=1 [Palettes] SidebarObjectPalettePos=4 SidebarPaintPalettePos=3 SidebarClassPalettePos=2 NEW: Paint palette now includes icons for adding links and viewports. Its called the Paint & Link Palette NEW: The paste from clipboard routine operation now has an option to show or not whow the configuration first (1 = show the ui). The table editor has a new option to edit the default clipboard import configuration. BUGFIX: If you typed key while dragging object off the object palette it would confuse the message pump. Planimate would continue thinking it was in a drag (even though you can use it) and would not quit. BUGFIX: Tracks no longer enable a ghost rectangle in the lower left corner when using drag-selects NEW: Added hacked ibeam cursor to resources so tooltips work properly in fields (used by idbase currently) BUGFIX Forming a track/spatial link/pipe wont flash the origin object. Has a new cursor too BUGFIX: Model INI file (not PLANIMAT.INI) now defaults to the model's name CHANGE: Small UI enhancements and consistency fixes

  • irrelevant dynamic options hidden in panels
  • section details dialog z-order fixed

BUGFIX: Loading a module will now merge in any resources in its DB file into the current model's DB file. Any existing resources with the same name and type are replaced. CHANGE: Object Menu cleanup

              • IMPORTANT ************* ** ** A lot of basic UI stuff has been messed with this version. ** Please take note of the TO BE TESTED section below ** **

NEW: Planimate confirms when starting a run with trace animation on NEW: Object attribute Out count was counting negatively, now it counts +ve BUGFIX: Crash on adding object to a view panel now avoided CHANGE: No blocking between items option is on by default for new servers CHANGE: "Advanced editing" is no longer an option saved with the model. IT can be toggled using the "Settings" menu and a default set in the PLANIMAT.INI file. BUGFIX: Zoom animation when a note is closed now visible NEW: Improved interface to adding an RTF note:

  • first draw box for the note
  • then select note file

Note then appears. The note "link" is placed at the bottom left of the note and named with the note file name. Cancelling either step aborts adding of the note. REWORK: Flickering Flickering when switching modes and updating menubar now reduced. This involves the menubar rework below and may introduce missing update bugs if I've missed an action that can cause something to change state. NEW: Paint palette (in progress) NEW: Ini file now at version 2 BUGFIX: Changing a class's scope or name properly udpates the menubar and class palette


BUGFIX: Class Submenu under "View" menu now populated NEW: Servers have an option to prevent a blocked item from blocking other finished items. This makes it act more like a dispatcher when many items are finished and one is blocked.


CHANGE: The Panel Option "Include in Module Configuration Panels" had now been changed to two options: "Include in Module Edit Configuration Panels" "Include in Module Runtime Configuration Panels" Allowing display panels to be include in the modules runtime popup menu BUGFIX: Crash on merging a module containing panels fixed NEW: ODBC option to strip trailing spaces from data has been added. WARNING:Review options on ODBC objects. The bits were not properly enumerated. This would most likely affect the "Keep database open" option. NEW: "Line to target" shown when linking spatial/pipe/track network objects


NEW: INI file has a version number. From now on PL EXEs wont overwrite the INI file if it has a newer version than they write. NEW: INI file includes some comments CHANGE: The way paint buttons display images has been changed. If the button has a border, the image is now shown WITHIN the border box of the button (ie: a 1 pixel margin on all sides) in order to leave the border intact. If the button is set for no border, the image extends all the way to the bounding box of the button, as in previous versions. This affects only multi-state buttons; I've left paint images objects as-is. NEW: Save BMP file operation can now save another panel's image to file. A data target may be included which should be formatted as a portal or panel reference. PL will then activate this panel, grab its image then save it. The panel must not be already visible in a popup. NEW: Save BMP file operation now has option to show file browser first, enabling user to specify target BMP to save to. NEW: When a module (portal with "module" option on) which has internal classes is included in a flow, PL will check if there is a mapping for the current class being edited. If there isn't it will offer to allow an internal class to be selected. If the module only has one class, then PL will create a mapping automatically without prompting the user. This simplifies the use of modules with a single scoped class within them. CLEAN: Removed obsolete step usage tracking code in flow/path database Loads and copies might be faster


NEW: Portal / Application Panel option "Act As Module" Panel Option "Include in Module Configuration Panels" Turning on "Act As Module" will cause the Portal to search for subsystems containing the "Subsystem is Module Configuration Screen" flag. These substems are presented in the Portal's context menu and will popup when selected. It is recommended to have the popup options "Stay in Front of Main Window" and "Ensure Visable on Display" are turned on for the Configuration Screen subsystems. BUGFIX: Fixed the shortest queue switch mode BUGFIX: Object Palette now removes itself from the sidebar before being deleted to create stand alone exE CHANGE: Agent pickup/dropoff objects changed in palette (the icons were already correct) CHANGE: Agent Pickup/Dropoff menus simplified (attributes available at objects menu) CHANGE: Switch option "Assume No Blocking" is now "Switch Cannot Block Items" and is accesible directly from the switch popup menu BUGFIX: Table browser is bigger NEW: If a change object has the same name as a system broadcast eg: "_run start" then it will now act as a broadcast receiver for that broadcast. The following special conditions apply:

  • The change object must have no flows associated with it (ie: it must stand alone)
  • An item class called "_bc" must exist and it will be used to carry any matching broadcast attributes
  • The item created within the change object is immediately destroyed after the change object processes the broadcast
  • Change objects that receive broadcasts have a new icon assigned to them

NEW Dispatcher has option to show its broadcast/message icon during run CHANGE Vertical queues and dispatchers now are 16 pixels wide CHANGE Right click on an object not in a flow in flow edit mode now gives a popup message rather than a modal dialog


NEW: Paint object click action "View Objects Interaction Menu" tries to open the named objects interaction editor. The command will search within its scope looking for an object that matches the specified name. BUGFIX: Hiding the button bar while the side bar is visable now redraws the splitter bar correctly. BUGFIX: Multiserver with a capacity set to 0 sets itself to "Unavail" state now (assuming no items present or blocked in which case the busy/ blocked states take priority BUGFIX: Flow editor previews the result of a "replace object" properly


(new model file version)

BUGFIX: Track junction enhancement from


now actually works. Have cleaned up testenter/lookahead code for sections so track models should be a bit faster.

UPDATE: Sped up track portal code by caching section pointer at run start NEW : Flow editor now response to clicks not holds. Makes flow editing quicker NEW : Can click on entry while editing a flow and a new path is automatically started. Clicking on an entry with an existing path selects that path UPDATE: Removed "Full" state from portal's state tables BUGFIX: Should prevent system errors while terminating a track model with booked sections


NEW: Dispatchers display an icon in their corner in some modes: Broadcast dispatchers display the _DISBC icon Messaging dispatchers display the _DISMSG icon These icons will be available for download separately in the Planimate 5 region. Drop them in your planimate folder. Note:Icons will be changing often as PL5 nears release CHANGE: Fit to model area now takes into account the sidebar presence and width CHANGE: Class icon in status bar is now to left of the class name NEW: Track junction enhancement - a train automatically enters a section it has a token on (because of a junction) without needing to do a further lookahead test which could cause the train to get stuck mid-junction. BUGFIX: Fixed tests for routine editors positioned off screen which was giving bogus message on dual screen systems 4.95 BUGFIX: Class remapping now works for items created within a local scope (eg: an item created inside a module)


CHANGE: Entry schedule/arrival can be edited with right click CHANGE: Multiserver 0 delay option can not be turned off when it is in an application panel CHANGE: Redundant "Add" button in paint and log label lists removed CHANGE: "Create Standalone App" is now in the Advanced Edit menu CHANGE: Queue and Dispatcher now are 16 pixels high so flow lines are straight NEW: Typine '@' while filling in a date time popup sets the field to the current date and time Typing '#' while filling in a date time popup sets the field to the current date and time 0:00 BUGFIX Palette update after a run particularly if the palette was not docked was broken in y


BUGFIX: clamp width of condition description in condition editor to prevent button growing BUGFIX: merging with scoped classes fixed BUGFIX: menubar status fixed when hierarchy explorer opened BUGFIX: Can reference log label list BUGFIX: Better management of sidebar during run. The sidebar no longer needs to be hidden, the palettes get disabled. Reduces flicker CHANGE: Tables in Mapper mode identified as "Table" not "Mapper" in the titlebar


  • bugs in managing palettes in application mode fixed
  • memory leak for deleting hidden splitter
  • palettes being shown when loading a "tools hidden" model
  • crash when closing due to an update being made to palettes which were already deallocated
  • explorer window not being tracked when in interdyne mode
  • reduced flicker in sidebar when switching to/from interdyne mode
  • to toggle a palette being in the sidebar/floating now use the ALT key when it is displayed.

(CTRL was causing problems eg with CTRL-T and CTRL-H)

  • changes to portal hierarchy (during edit or initiated by model) will be faster if the explorer window is visible or docked.


CHANGE: *** old models need attention for this *** Graphs using columns called _thinkness and _link_thickness need to have those columns renamed. Planimate now expects the columns to be called _width and _link_width respectively REWORK: ICON BROWSER PALETTE OVERHAUL:

  • "Choose Icons" palette:
  • state selector rewritten
  • cell highlighted clearly
  • icon name has more space
  • handles scrolling better (for custom portal states)
  • right click on a state shows "Locate" option which will point the RHS palette at the folder/DB where the icon is located and hihlight it
  • DataBases which dont contain any ICN or BMP files are not displayed since there is nothing to select there. They are displayed in the icon mover.
  • model's database is not opened by default if its empty
  • funky focus issues fixed
  • ability to select invalid states fixed (clicking in the scrollbar area)
  • The "Change Directory" button in palettes has been renamed and works more as expected - selecting a DB opens it, selecting an icon displays its folder. The file type filter now includes BMP, ICN and DB files.
  • "DB" files are now referred to as "Resource Databases" in file browsers
  • Scrollbars work properly in the palette browser particularly when "lo cating" icons

CHANGE: In Tray renamed to Agent Drop-off Out Tray renamed to Agent Pick-up NEW:Panel navigator, sidebar and palettes

  • sidebar is only available during edit. During runtime and application mode it gets hidden and its state is restored when going back to edit
  • during run if a navigate is performed, the modal navigation dialog is used (the sidebar cannot be shown as it may contain the editing palettes)
  • ctrl-N when the explorer is docked gives it focus and the keyboard can be used to explore. <ENTER> or <SPACE> returns focus to the Planimate model window. ctrl-W can be used to show/hide the sidebar including the explorer.

ctrl-N when the explorer is not docked shows/hides it.

  • focus after using palettes is returned to main window

CHANGE: "Text Format" changed to "Text Alignment" in view menu


BUGFIX: Fix for Bad String Load Error (Enum order of routine commands was altered)


CHANGE: Newly added Log Driven Graphs will behave differently The modeller can determine if the colour/thickness/linestyle and yoffset of a drawn segment is taken from the starting point or ending point of the segment. By default it is now taken from the starting point which makes it consistent with gantt and train graphs. A new option on the view, "End Point Sets Colour" is on for older models. It is off for newly added graphs. BUGFIX: Sorts where rows matched as identical could result in those rows swapping positions in repeated runs of the same model due to the random nature of the sort when things match. To prevent this, I've added an internal check which uses row order as the final sort criteria if 2 rows match all the conditions the modeller has specified. I also applied this fix to the "create sort index" operation. NEW: Tables with transparent backgrounds should display properly. These can look cool over gradients etc. but will be very CPU intensive to redraw. Not recommended for tables which update often. Basic editing and value updates of the table should redraw properly NEW: Object and Class palettes are now dockable in the sidebar To make the palettes dock use the new ini file options Sidebar related inifile options are now:- [Dislay] SidebarW=200 // Initial width of the sidebar SidebarStatus=0 // Currently unused TreeViewDocked=0 // 1 = Dock the tree view in the sidebar TreeViewStatus=0 // 1 = Tree view is visible when Planimate loads [Palettes] ObjectPaletteDocked=0 // 1 = Dock the object palette in the sidebar ObjectPaletteStatus=0 // 1 = Object palette is visible when Planimate loads ClassPaletteDocked=0 // 1 = Dock the class palette in the sidebar ClassPaletteStatus=0 // 1 = Class palette is visible when Planimate loads ObjectPaletteSize=0 // 0 = 6x2 (new style) 1 = 4x3 palette (old style) The defaults are to show palettes in the sidebar. If the ctrl key is held while showing a palette, it will appear opposite to the default in the ini file. NEW: INI defaults for palette (when not docked): [Palettes] ObjPaletteX=0 ObjPaletteY=0 ClassPaletteX=0 ClassPaletteY=80 NEW: Key press combination to show / hide the side bar <ctrl> <w> while in edit mode NEW: Routine operation under "Label" Create Sub Label List Has three inputs Format Result - Attribute to format to new sub label list List Name - Name of new list (label) Parent List - Parent list for the new sub label list


BUGFIX: incorrect "Another exists" messages for paint label list reworded BUGFIX: Loading of ovals broken in


now fixed

NEW: Support for logging of attributes. Attribute/Cell Stat views now have a "Log" option. This adds them to a new global label list, "_Logged Attributes" When a "logged" attribute changes during a run, the platform will now send a new global broadcast "_Log" with the following item attributes: _logtime - the time of the log event. Normally the clock but it can be different if the modeller artificially sends log BCs _logvalue - the new value _logid - the index of the event in the "_Logged Attributes" label list. Note: the initial value of the attribute does not currently generate a log event. This proved problematic but might change in later versions NEW: Clock colour can be changed using the "Graphics" menu when the clock is clicked upon in editing mode. Clock now defaults to white in new models Gradients, border style and transparency are not supported. CHANGE: The default "Calendar" start date for new models is now 1-jan-2001. This is a Monday.


NEW: Basic "Module" load capability. New File menu option "Add Module To Current Model" enables simpler merging of models. Selecting this option

  • saves the current model
  • enables a "PMB" saved model to be selected
  • loads that model and merge with original model
  • leaves user with the "module" ready to be pasted (the original model is not resaved after the merge)

This option requires that the model which is the module is saved as a PMB file and only has one top level portal. No other objects are carried through the merge process. NEW: In "Advanced" mode, new portals have pentry/exits hidden until they are included in a flow or have tracks/spatial links/pipes first connected NEW: System broadcasts cannot be deleted or renamed NEW: Tracks menu only visible if there are tracks on the main screen NEW: Title and behaviour of colour palette different when its selected from the edit menu. In this case you dont select a colour so clicking on a colour just updates its name in the field at the bottom. NEW: Updated "no interaction details" dialog and object click menu BUGFIX: fixed a paint copy bug when paint objects were using a condition The new condition editor was not setting the proper owner on copy of the condition. This would be unnoticed in all cases except where the special scope gets overriden as in paint objects with the "parent scope" option on. NEW Update interval is set to 10 and a message is given if a track/spatial/pipe is added and its still 0 UPDATE Table "Act As Mapper" is on by default NEW: Paint ovals now inherit same abilities as rectangles, buttons (visibility control, click action, hover text) NEW: A new table option enables the table's comment to be displaywd in the table when the table is empty - this includes when the table has no rows NEW: Object step menu has "Start new path here" option


NEW: *** Important For Editors *** Some items in the menu bar are now in a new ADVANCED menu A new "UI:Advanced Editing" display option enables/disables the advanced menu When loading older models, Advanced Editing is turned on Otherwise new models use the [Edit] AdvancedEditing flag in the INI file. This defaults to 0 so new users of Planimate dont see the advanced stuff. Existing users will want to make sure they have: [Edit] AdvancedEditing=1 note this is a new section in the INI file and previous PL versions will remove it NEW: INI file option [Edit] AssumeNoBlocking IF 0 (default) then:

  • new switches are blocking switches
  • new routines invoke lookahead If set to 1 then PL acts as previous ie:
  • new switches are assume no blocking
  • new routines invoke only during move

This makes it easier for new users of PL to work with blocking switches and routines. BUGFIX: Runtime Paint Copy label assignment fixed BUGFIX: label list, broadcast editors manage focus better after an edit BUGFIX: Alternate portal entry/exit properly cropped to screen when created UPDATE: Descriptions for clock/time formats NEW: Item palette tool tips and keepfront fix NEW: Renamed menu bar items NEW: defaults and misc changes:

  • Portal Options ON for new portals: Retain State After Run
  • Item Options Flip Icons ON by default
  • All Splitter Options ON by default


NEW: paint object menu now shows object label name and index if its set NEW: paint label references now shows co-ordinates (middle) of paint object to help locate it BUGFIX: paint object copy properties validates against attempt to copy own properties BUGFIX: if dragging an object from the object palette, releasing over the object palette does not drop an object CHANGE: default window width for new panel is now 1016. If your INI file has another value it gets retained NEW: INI file option to display the IDBase menu - by default its off but power users can enable it to enable put under [Display] : IDBaseMenu=1 (PL will add an entry in your INI file for this so check for it) NEW: INI file option determines if new models/portals get flows displayed. It is on by default, to disable under [Panels]: ShowFlowsInNewPanels=0 NEW: INI file option enables flow editing tool tips to be disabled: They are on by default, to disable under [Display]: ShowFlowEditToolTips=0 CHANGE: FLOW EDITING: left click on arrow head now goes into flow edit mode for that path. right click on arrow head goes into interaction mode (as before) If there is only one class for the path, the class is selected without the popup being displayed. BUGFIX: main window "Topmost" bug after using palette fixed BUGFIX: Many Forms, Item Pick and List Pick dialogs that could become hidden behind the main window now have proper owner set


NEW *** palettes now act on the mousedown not mouseup *** NEW: Loop menu has better display of train status The train name may be prefixed by one or more of the following letters: L : Train is in loop enter/exit delay l : Train is undergoing a forced dwell/delay at the loop G : Train is blocked by the loops out gate F : Train is forced stopped (priority pass is pending at the loop) Trains blocked from moving by any of these conditions are not registered in the blocked trains list. NEW:

  • Tool tips in the flow editor
  • indicator line in flow editing to show where the flow will connect to
  • right click on class palette icon enables item class properties to be set
  • info panel y offset can be specified for an item class
  • info panel frame style/background/text colour can be specified including support for gradient and transparent styles
  • Column title tool tip option - displays column title in a tool tip when hovering over the column's title
  • Listeners AND sources browsable at buttons and entries Note that button sources reports 1 extra due to an internal copy button used in inheritance tracking
  • An attribute range check error is now processed as a breakpoint instead of a hard stop if break points are enabled. Otherwise its processed as a hard stop.
  • Animate speed and time scaling can be set via system attributes (under Display/Mouse submenu)


  • not possible to drag objects off screen (clipping was broken in move)
  • class palette now works
  • track unblocks dialog has a "cancel" button to let you out of debugging messages. Pressing cancel turns off the debug option and continues.
  • "Paste Over" in table row menu now unavailable if no rows in the target menu



  • Conditions now have a new implementaiton featuring the ability to include brackets and to have an unlimited number of comparisons in the condition.

The brackets enable the evaluation order of the condition to be set, otherwise the ordering is as in previous versions of Planimate - expressions are evaluated in the order they are encountered. The new condition editor features:

  • one comparison per row with vertical scrolling when there are many rows
  • indenting to show the condition struvture
  • buttons on each row to add opening and closing brackets
  • horizontal scrolling when the brackets get deep
  • comparison rows can be easily duplicated and deleted using the menu on the "bracket button" at the left of each row
  • Validation to prevent OK on conditions with incorrect or incomplete matching brackets
  • A status line at the bottom indicating if there are outstanding brackets to close or a bracketing error
  • A summary of the expression near the bottom wher A,B,C etc are substituted for the attrefs, enabling the comparison logic to be quickly reviewed without the distraction of the attrefs being compared
  • copy and paste capability enabling conditions to be copy/pasted to other objects or to/from multi-conditions
  • A "Report" button which formats and displays the condition in full into a text window for review and documentation purposes

The multicondition and search functions also use the new condition code. The multi-condition dialog has been reworked to accomodate the new condition editor. The rows in the multi-condition now have a context menu for editing so some of the editing buttons at the bottom of this dialog were removed. The search dialog has also been reworked to accomodate the new condition editor.


  • the /SHARES file mapping option no longer complains if a share is being mapped and the share already exists (code 85). This is to avoid issues with systems that remember the previous share between sessions.
  • file locking: was passing deallocated string to unlink()


NEW: INI file option is now available to determine whether the Navigational tree view appears in a side bar or floating window. INI option: TreeViewDocked Values: 0 = undocked (floating window) (default) 1 = Docked NEW: Command line option to compile a stand alone exe format:- planimat /MAKEEXEKEY="key_file" "model_file" key_file the key_file for the planimate pba model_file model file to be compiled both key_file and model_file must be present for a successful compilation


NEW: Can browse listeners of a broadcast directly at a broadcast button. This shows all listeners regardless of scope; they may not actually receive the BC if it is a scoped BC. NEW: Table column menu option "Show References" Shows all table references that can *potentially* read/affect the column This includes:

  • direct hard cell reference
  • cell reference via column label
  • all cells via a variable in the column index
  • row references (eg: as used in tupling)
  • entire table/block references
  • use of the column as a matched cell matching source

References from dynamic table references and item carried table references are not shown though for the latter, the assignment of the item table reference should be shown. Let me know if any other ways of referencing a column have been missed NEW: Sorting Enhancements

  • The sort edit window now supports up to 8 sort columns and each column can be sorted either Numeric (index order) or Alphabetic (formatted string order) It now displays column numbers if the columns have no label

When selecting a new column in a sort dialog, if the column has a label list associated it defaults to "Alpha". The user can change it back to "Numeric" if its desired to sort the label list column by the index.

  • The "Table Sorted By User" broadcast now sets "_sort5" .. "_sort8" attributes as well
  • A new routine operation "Advanced Sort" is available. In addition to specifying a target table, another table is passed which contains the configuration information for the sort as follows:

Column 1 contains the column #s for the sort keys Column 2 contains the forward/reverse flag (0 = forward, 1 = reverse) Column 3 contains the numeric/alpha flag (0 = numeric, 1 = alpha) This table can contain up to 8 rows, the maximum number of sort columns supported.



  • Large/long runs of Planimate which had a large memory throughput would cause Pl to crash on close. This was because the report written to PLANIMAT.DBG was overrunning its buffer.



Now do centralised blocking management

  • trains which become blocked are added to a global blocked train list. This list is ordered by oldest waiting train.
  • The list is now being unblocked "Newest Train First". This was found toI resolve a deadlock in the test model I'm working in and achieve better throughputs. Ideally I wanted to unblock oldest train first. This issue will be further investigated.
  • the new menubar option Track->Blocked Trains option enables this list to be viewed. If a train is double clicked/right clicked, a "blocked reason" for it being in the list is displayed. The reason display is greatly improved.

IF clicking on a train causes it to "disappear" from the list then the train was no longer blocked and was able to move. This should not normally happen so report it if you notice it.

  • There is also an "Unblock All" button to attempt to unblock all items in the list. This should not be normally ever needed but would highlight any missing unblocks in the PL code.
  • It might be necessary for me to provide a modeller "initiate unblock" if section availabiltiy is based on an attref that PL does not normally send unblocks for. Table cells refs are OK.
  • The list includes columns for time train became blocked (VERY useful), train id, blocking track location, route, step etc.
  • Trains in the track blocked list might actually not be on a route! I've (hopefully) handled the situation of a train being in a queue followed with an assign route change connecting straight to a portal exit. Hence while the train is blocked, the route isn't actually assigned yet but the platform knows a track has blocked it and keeps it in the track blocked list anyways. This involved new code in the core PL engine so existing models will be slightly slower.
  • theres also a new debugging option which will cause PL to report all "blocked reasons" as unblocks are attempted (useful when stepping along a run).
  • have rewritten track code to accomdate this new unblocking

Also made logic changes to:

  • "Stopped" trains / priority passing (cleanup)



  • (CVS release only) - has the track unblock list code but the old track instance code which doesn't make use of it yet

Uploaded so I can compare old and new track instance code without other differences


  • new Routiner operation Set Junction Mode (Route) enables the "Act As Junction" option on a portal to be set (1) or reset (0) by the modeller.

This is useful when a portal is a junction in some scenarios and has "capacity" in others.


NEW: Option to hide the "Print" menubar option (in application mode) BUGFIX: Fixed a VERY NASTY and hard to find bug with paint inheritance. If a hierarchy including base and inherited paint objects was copied AND the "Scope Control Attributes To Parent" option was on AND Paint objects used a visibility control condition AND The parent hierarchy occured after the child hierarchy (in the order of portals in the model) THEN ... the copy hierarchy was left with a stale parent scope pointer. This would cause a crash if the original hierarchy was subsequently deleted (eg: because the copy was being moved to another model) as the scope pointer is needed during the model merge process (its used to resolve label list references so unused label lists can be purged during the model merge). I now make sure all child objects have their scoped updated if the parent object experiences a change in its parent (as may happen during the situation above - in the RedirectObjectLinks() handler). BUGFIX: Rearrangement to INI attribute list to prevent crash when reloading model. CHANGE: Track options These changes are intended to make existing track models work more reliably with the latest track code in previous releases without needing modification. New track code is being developed but this is not released yet.

  • Track system now always runs in "compatability mode" so I've removed the compatability mode modelling option. The new way of capacity testing described in the 4.93 release notes is temporarily disabled - I'm not aware of anyone using it,
  • "Act As Junction" and "Route Step Lookthrough" options now both do exactly the same thing. Eventually Route Step Lookthrough will be retired.

This is a temporary hack so existing models are more likely to work with the


/h enhancements

  • Made unblockign a bit more "agressive" (still old style)

CHANGE: Code cleanup (instance object construction) - should not affect users


REWORK: More changes to track Route Step Lookthrough, simplifying the search because unblocking doesn't support it properly yet. NEW: New system label list _system_colors containing list of indexed system color descriptions NEW: Routine Operation "Get System Color RGB" the returns the RGB value of the specified system color These two additions can be used along with "Set Palette Colour" to keep a Planimate interface compliant with the current windows theme.


FIX: Panel Selector tree resizing issue has been fixed.


REWORK: New Route Step Lookthrough method introduced in 4.93 was causing a problem with an RCM. I've changed it to something that seems more sensible and the model seems to run OK now.


NEW: Model Explorer now opens "docked" in a sidebar. The width of the sidebar can be adjusted to allow a persistant "explorer" view. The default sidebar width is stored in the planimate.ini file SidebarW=200 The sidebar can also be displayed by default using the ini file SidebarStatus={0 / 1} 0 = off, 1 = on (Those with high enough resolution may want to try these ini settings) SidebarW=200 SidebarStatus=1 StartW=1230


BUGFIX Get palette colour was broken


NEW: Routine editor can be opened from within a breakpoint NEW: Routine operations "Set Palette Colour" and "Get Palette Colour" This enables colour palette entries to be directly set. Palette entries are numbered from 0 to 63 (in future this may change) and colour values are a number which encodes RGB as follows: colour_value = R * G*256 * B*256*256 HEW: Routine operation "Set Item Area String" This enables the text of the "Item Area" in the status bar (where the item class name appears during editing) to be set. It may be useful to provide additional status/context information to the user as this field is quite large.


NEW: All help files are now assumed CHM (Html Help). Planimate will load HTML Help upon its first use. If not available (ie: not installed) it will give an error. Versions of windows from Win98 on include HTML help in their default install. NEW: double clicking label references in the label reference list now opens the table editor and selects the column if the reference is from a column NEW: Routine operation "Files In Folder" (Label/String) This enables a modeller to get a list of files in a given directory matching a certain type into a label list. The target specifies the label list into which matches are appended. (there is no check for duplicates already in the list). The "Path/File" should be a label specifying the source folder and file filter eg: c:\windows\*.INI would give all "INI" files in c:\windows The Path/File string is mapped through the filename mapper (File Name Remapping) as occurs for change object File operations so names may be overidden at runtime using the INI file and "|" can be used to separate multiple fields which are separately overridden REWORK: Ownership tracking for attrefs in routines reworked to enhance tracking of these. Should not affect anything.


BUGFIX: Months in day validation fix when importing times (bug from


) 4.94

  • New routine operation: "Enable Editing" (under table) - works on columns

This enables a modeller to control where columns in a table are editable by clicking on them. Useful with dynamically constructed tables or where different access levels control edit access, without having to mess with broadcasts.

  • Major rework of code to:
  • Safeguards to idicate if a release EXE contains some libraries compiled with debug options on
  • make compile with Visual Studio 2003 (VC7) (now builds with 3 compilers)
  • Move core code modules into iFlow (TCP/IP, XML, Calendar Time processing)
  • Remove memory leaks with idBase
  • Prevent idBase updating the menubar when its being browsed
  • Rework code using obsolete "streams" functionality (affects TCP/IP, XML and RTF notes)
  • Manage windows notifications a bit more orderly
  • Experimental:idBase is integrated into Planimate. Its in the menubar for developers. This will be made optional later.

People with an idBase knowledgebase account can put their idclient.xml file into the working directory to simplify login. (will make it default to the EXE directory in a future release) = note: new file version but if you dont use the new routine operation then you can edit the MDL and change 419 to 418 and it should be OK in



  • moving of modules to move TCP/IP and XML stuff into iFLow
  • rework of old stream code so we can compile with VC7 and other compilers


  • Planimate can now display, input, import & export calendar dates beyond 2035. The current limit for input is 3000 AD

This means long term runs which go beyond 2035 will now display calendar dates without issues. The file format has not changed from


so if there are any issues noticed, you can step back to the previous release until I address them.

There are these following limitations:

  • The PC clock must be before 2035 AD, if the model uses it.
  • Timestamps in key files are limited to 2035
  • The Edit Calendar Date Reference and the Run Start Date reference must both be before 2035 AD (ie: the model can "run" past 2035 but it cannot have time "0" as a date beyond about Jan 2035)

These will be addressed in due course and require a change to the MDL format which is why I didn't do them yet.

  • Internal cleanup - millisecond handling during time processing
  • Internal cleanup - signed and unsigned values being mixed in internal code causing warnings in MSVC


  • Fixed a memory leak when a label list is loaded from a dataset file
  • Fixed a crash which occured if a portal copied during run contained paint objects which were controlled by portal attributes


  • no button effect doesn't disable default ENTER handling of buttons
  • report added for model objects, panels and paint label lists. This creates a text file which can be copied/pasted into tables etc.
  • table references now include routine code and comment
  • fixed bug in opening help files in standalone exes


CHANGE: Significant rework of the paint inherit code re: Copy of all paint objects. Done so paint objects know their inherit owner BEFORE their scope is initialised. !!! All paint inherit operations (editing and runtime) are affected !!! and must be carefully tested NEW: Run Engine system attribute "Active Broadcast Index" returns label index of the currently active broadcast or 0 if none active NEW: Routine operation "Format Title Into Label" - formats the target's title into a label. Implemented for tables and columns. NEW: The routine logical comparison operators "Equal" and "Not Equal" now will compare 2 entire tables. If the tables have the same dimensions and the VALUES in the cells match (using the precision limited comparison rules for numbers in PL) then the routine operation returns "1" otherwise "0" NEW: Settings button in breakpoint dialog enables animation speed and routine stepping (if routine editor visible) to be changed within a breakpoint


NEW: Holding CTRL as the model restarts only prevents the restart if the system is in edit mode. This prevents a user CTRL-T-ing a model and having it enter "engine stopped" state NEW: Scrollbars have proportional thumbs and a more 3D border style (Unfortunately I cannot make them respond to mouse scroll events without replacing them with windows scrollbars and rewriting table views to be more like viewports) BUGFIX: File locks fixed when multi word tags are used CHANGE: If a table view has "No Block Edit" option on then the "Auto" cell submenu which includes fill and index options is not shown NEW: Display option "3d Proportional Scrollbars" enables table scroll bars which have a thumb which resizes proportionally to the amount of data in the view. NEW: Paint buttons have a new option which when selected, will cause that button to be "clicked" if the user presses <ENTER> on that panel


NEW: Ability to map network resources when running under a different account When /LOGIN is used to run a PL session in a different user account, it causes a new user context to be set up which will not have any of the shared drives of the original account mapped. PL can now perform this mapping process using an additional command line option: /SHARES=<ini file name> The file spec specified can be the model INI file (but does not need to be). The file should have a section called [shares] and within that, one or more local drive / network name pairs, both in double quotes. example: [shares] "o:" "\\laptop\work1" "p:" "\\pippa\media" If any of the shares fail to map, PL will give an error and not load. NEW: Pressing close box on the tree explorer now stays at the destination panel instead of reverting to the original panel <ESC> key will close and revert to the original panel


NEW: "Retain on paste/replace" table option This will cause a table in a replaced portal to be "retained". This is achieved by copying the table data, options and column formatting from the original table to the table replacing it. BUGFIX: The "Advance to time" dialog properly handles redrawing after a large time offset has already been advanced BUGFIX: When copying data to the clipboard from tables, PL will now allocate and use a file in the user's temp directory rather than the working directory. It also deletes the file as soon as PL is done with it. NEW: <TAB> is equivalent to <ENTER> for a standalone field such as in a table cell click BEW Routine operation "Initiate Edit" (under special) Begins editing of a view (Currently only table cell views) This routine op requires a panel/portal reference which may be a popup. It will initiate editing of cell views, chosing the view with the lowest non zero "edit order" value. This acts as if the user clicked upon the field and simulates a form setting initial focus on a field. The edit occurs while the routine is executing - ie: the current item has not left the change object; the routine is suspended at the line of this routine operation.


NEW: Data sets are now a label list, so they can be referred as labels in a routine rather than just as a number NEW: System attribute: Owner Of Panel Visible This returns true (1) if the panel containing the current panel from where the attref is scoped is visible, otherwise it returns "2" for false. This is useful for event handlers which reside in a subsystem "under" a panel which an end user sees/interacts with. It enables routine code to determine if the subsystem immediately above is visible without requiring object or panel indicies.


NEW: Now support 30 data set files The "Save All" data set ID is now 31 - any models using "9" to save all must be updated BUGFIX: Dial display bug in



BUGFIX: Management of palette icons cleaned up to prevent bogus load error messages after a standalone exe was created


BUGFIX: Better display of "private" cells BUGFIX: Cleanup/rewrite of some of the stat/view code to try simplify it a bit Dials now follow the control attribute for the attribute view. The view can still be separately hidden using its "Make Hidden" option (and recovered using the Edit->Views menubar option) NEW: Dials can dynamically change colour of pointer/label text according to an attribute. This attribute has the same scope as the portal attribute or table cell the dial is associated with


BUGFIX: Dataset read and write (routine control) - now will remap filenames that include a '*' NEW: I'm using locking for dataset file writes and reads (routine only) During a write, no-one else can open the file for read During read, no-one else can open the file for write If an "open" (either read or write) fails, it waits 3 seconds and retries, up to 5 times. IF you need more timeout on your file (ie: takes 20 seconds to read) let me know


BUGFIX: Dragging a portal with run active should now retain its state icon during the drag NEW: System string attribute to get the current computer's name. Useful for identifying file locks NEW: File lock management added (change object->file) 2 new file modes are supported: "Acquire File Lock" and "Release File Lock" A file lock is a file that an instance of Planimate keeps open to enable a mutual exclusion (mutex) mechanism to be set up. This is often useful in database applications where you need to lock multiple users from accessing a resource simultaneously. In this case the lock would reside in a shared directory. (note: The supporting network must support file locking) Planimate opens/creates a lock file with shared read and exclusive write permissions. This means other instances can read the file but not control it. The Acquire File Lock operation works as follows:

  • The target file (specified directly or via a label) is the lock file. It is suggested that a ".LCK" extention be used. THIS FILE WILL BE OVERWRITTEN so ensure it is not pointing at a data file.
  • If present, the first data target will be interpreted as a string and written to the file, as a "tag" to help identify who has the lock.

It may be useful to use the recently added ability to specify a table row here so an informative line containing user name, time and computer name can be written.

  • If the lock is successful, the error result target is set to 0, otherwise a non zero error code (see below) is set. If an error occurs, detail of this error is available as a string in the new system attribute "Last Lock File Error". If the error is that another user has the lock, then this attribute will contain the "tag" and should be displayed to the user.
  • If acquiring a lock fails, the system will sleep 3 seconds and try again. It will do this 3 times before returning a failure.
  • It is valid to acquire a lock on a file multiple times. In this case the lock file is "verified" (against the original tag) to ensure the lock is still valid. A lock can be lost (unknown to PL) if a network outage occurs or the server is rebooted.
      • Hence it is a good idea to verify locks which have been open for a long time at strategic times; eg before starting a data write after an edit session.
  • Locks persist when the simulation engine stops/restarts

The Release File Lock operation works as follows:

  • The target file specifies the lock file to close. If this file is currently in the known lock list, it is verified that it in fact still has the correct "tag" and the file is closed and deleted.

If verification fails or the file was not originally acquired (or previously went stale and was removed from the lock list), an error code is returned (Stale Lock). Both lock operations set the "Last File Accessed" system attribute to the actual name of the lock file, mainly to assist in debugging and diagnostics. The Edit menu contains a new "File Locks" option which will list any current open lock files and their tags. The locks are also verified. Both lock operations will return status codes from the following table: 0: Indicates the lock was acquired/confirmed or released without problem 1: Failed to acquire a lock; either the lock file is in use by another instance or there is a network problem. More detail is in the "Last Lock File Error" system attribute 2: Attempt to release a lock on a file that this instance did not have a lock registered 3: Stale Lock. This can occur either when reacquiring (verifying) a lock or releasing a lock. It indicates that the lock file is no longer valid perhaps because of a network outage. It is recommended that lock files do not get kept open "all day" but rather that user interfaces are designed such that a user acquires a lock only when they are ready to make a change. This will help reduce stale locks.


BUGFIX: If the routine editor was positioned off screen by someone with a bigger work area, it gets brought into view when opened. BUGFIX: Copying a portal between models and CTRL-pasting over another portal in a different model caused a crash. I have resolved this (by not referencing the original portal after the ctrl-paste) NEW: Columns have a "keep private" option. This will keep the display of the column empty in a view and cause "*"s to be displayed for editing the value/label in a field. It does not affect the popup label list so it should be used with the "Edit Labels In Place" option. No protection is provided for copying the column into the clipboard (the option is intended to make password entry possible where you would start with an empty cell) NEW: Planimate can run in a different user account than the user that launches it. This means Planimate can have access to data which the user cannot access from explorer. This works as follows:

  • The shortcut which launches Planimate needs to include the /LOGIN=filespec command line option, where filespec points to a password file. This file is generated using the ODBC Password Generator EXE (mentioned in release notes for 4.91J)
  • The generator EXE is used to create an encrypted file for Planimate containing the username and password of an account on the local machine to use
  • If a domain controller is used, the username entered in the password generator can be of the form "user@domain"
  • If /LOGIN is user and there is a problem opening the file or verifying the password, an error will be given and Planimate will close
  • Under Win2000, the user account which launches Planimate must have SE_TCB_NAME privilege and in some cases SE_CHANGE_NOTIFY_NAME as well

The target account must have SE_LOGON_INTERACTIVE privilege 4.93 TRACK NETWORK CHANGES: A significant rework of the track rules was made. This was done to resolve situations where an item in a section following a junction following a loop following another loop was preventing movement from the first loop in the chain, due to over zealous lookahead. By default existing models will have a new Modelling Option "Engine: Older Track Lookahead Method" turned ON. Turn this OFF to activate the new algorithm. Other Track related changes:

  • big cleanup to the lookahead/junction testing mechanism. Junction testing is now separate, done at section testenter time rather than depending on loop CheckNext to invoke it. Should improve "Route Step Lookthrough" with portals.
  • Removed the "max track lookahead" control variable
  • new System attribute "Doing Track CheckNext Lookahead" and portal option "Handles Lookahead Tests"

More Detail -----

These are experimental and should enable advanced track modelling to be performed. The detail below assumes thorough knowledge of the tracks system's operation. When a track object (eg loop) wants to try move a train to another object, it does 2 tests:

  • TestEnter: Checks for capacity at an adjacent object
  • CheckNext: Checks further down the track for impending congestion (I often call this Track Lookahead which is different to Planimate item-on-flow lookahead)

By turning on the new portal option "Handles Lookahead Tests" and testing the system attribute "Doing Track CheckNext Lookahead", the modeller can give a controlled response to the CheckNext tests that the track network propagates. For portals with the option off, Planimate will take default action. If the portals have either of their junction options on, PL will step to the next object along the route (includes intervening loops) and try test that. Using this flag a modeller can tell the track systme whether a portal is safe to consider moving towards, even if the train is some distance back and not directly "TestEntering". By directing the incoming train item towards an exit, the portal indicates it is safe to proceed towards it. By directing the incoming train towards a blocked path eg: a guide with no other flow, it indicates not to proceed. By directing the incoming item towards a portal exit, it indicates that the test should be repeated at the NEXT object along the train's route. Its important to realise that this path is only "tested" by the lookahead mechanism - an item entering should never actually move along it! That is enabled by testing the system attribute "Doing Track CheckNext Lookahead" using a non blocking switch (so the test is done during lookahead). This mechanism should only be used with the "older track lookahead' modelling option (provided for compatability of existing models) switched OFF

  • Enhanced Track Unblocking debugging. Portal, loop and section menus contain an "unblock" option. This will report why a train is blocked, starting at the first object to report the blockage and working back towards the start of the unblock.

NEW: Routine operation "Create Password Hash" This (label) routine operation takes the formatted string of 3 attrefs and creates a 32 character hash using the RSA MD5 hashing algorithm. A modeller can use this to scramble passwords which can then be stored as in label lists without need to obscure them in datasets. This is used as follows:

  • Let user enter username/password. The password is stored in a temporary label list as cleartext
  • Use this new routine operation to create a hash of the password. This is what gets retained in say a "passwords" label list.
  • Clear the temporary label list - so the cleartext password is lost
  • When a user "logs in" do the same thing (so you end up with a hash of whatever they typed) then compare the 2 hashed strings

The hash is secure; even if a user knows the hash, they have no easy way to determine which password to use to create the hash that is expected. HOWEVER... further security is necessary to prevent users "copy pasting" known hashes (eg: their own hash for which they know the password) to a different user (with say different access level) which they want to impersonate. Hence, to create a secure hash, the 3 fields of this routine operation should be used as follows: Field 1 should be set to the username. The modeller should retain this separately (in cleartext) Field 2 should be set to the entered cleartext password, which the modeller then discards (as described above) field 3 should be set to a "secret" application/version/zone specific name or string. This string should not appear in datasets, panels or be guessable. The reason for this is described below. Using all 3 fields to generate the hash prevents a user copying their hash over a different user and logging in as them using their own password. The third field is useful to prevent a diligent hacker from using their username/password/hash to hack another application which uses this mechanism but they have no rights to access. NEW The Format Into Label routine operation has been enhanced. If the source is a table ROW specification, then the contents of the cells in that row will be appended together to form a label. This is very useful in constructing say file names and paths. No delimiters are added between the columns but a modeller can dedicate certain columns to being delimiters. This gives maximum flexibility in how the cells get "packed" together. The 63 character label string limit does apply so be careful in your design. NEW: File name remapping (as used in model INI files to map internal file names to external file names/paths) has been enhanced. One or more vertical bar (pipe symbol "|") can be used to separate parts of a file name so they are remapped separately. So a file name like "theroot|thefolder|thename.dat" can be used with "theroot" and "thefolder" being separately remappable. The text following the last '|' is not remapped, however it is OK to use "theroot|thefolder|thename.dat|" to make it all remappable. NEW: Ctrl-A can be used while paused (developers only) to cause the engine to advance/process ONE FEC event only. This will be even more useful when I add a rolling FEC display window .... After this event then engine returns to paused (even if other zero time events are pending. Pause/continue BCs are not sent for this key. NEW: Items ignore clicks if the shift key is down. This enables a modeller to click on objects under the items. BUGFIX:A warning is given if a portal is copied between models and the calendar time references for the portal and the new model's differ (potentially scrambling any dates inside hte portal) BUGFIX:Fixed model merging issues with scoped item classes being looked up as "global" when they should not have been (causing bogus merging to occur) BUGFIX:Fixed issues with references to scoped classes being saved by name not by ordinal (class attribute references) causing possible incorrect loading if scoped classes had same name as global classes NOTE:Class label list name lookup and socket broadcast<->class mappings are only supported for global classes BUGFIX: Rewrite and cleanup startup code; fix standalone key bug BUGFIX: Alignment of field and combo LHS was out by 1 pixel This is inherent in Windows and I've put in an adjustment for fields to compensate BUGFIX: Label lists, Sub Label Lists and Multi Labels were not being properly updated when copied to a different model. If an attempt to edit them was made without the model having been saved/reloaded, a crash would occur BUGFIX: Panel selector and Dynamic panel selectors were swapped about


BUGFIX: "Find" would crash if trying to locate a table column. It now brings the owning dynamic panel to the front. NEW: Private item attribute option These are relevant to class mapping. If a subsystem contains a class with private item attributes, these attributes are not set or returned to the "external' item class which is being mapping into or out of the subsystem. BUGFIX: Fixed comment display in attribute listing dialog BUGFIX: Table comments are now included in model report NEW: Implemented tupling across classes when mapping classes into and outof a portal. This applies to both item attributes and item table references. Matching names get mapped unless the INTERNAL item class has the "private" option set for the attribute/table reference. A new "Report" button in the class mapping overview will display a summary of the attributes/table references that the internal class is allowing to be tupled and indicating which ones are actually matched by the external class. BUGFIX: Data set file name browsers (menubar and routine generated) now use any extention provided in the filespec as a default for any new filenames typed in without extentions rather than defaulting back to ".SCN" BUGFIX: The "default" dataset name used when loading a dataset using the menubar is now set to the first used dataset's default filespec and extention, rather than defaulting to an SCN file IF a data set has not yet been saved in that PL session. This will make life easier for users if the modeller is not using the ".SCN" extention in their datasets and the menubar dataset load/ save options are being used NEH: The file browser shows the file type instead of just putting "Selected Files" in the file type dropdown BUGFIX: More careful about locking out the model explorer browser when stuff is happening where a panel change is undesirable (eg: positioning an object, editing a note) BUGFIX: Item Table references now get renamed when the item table ref in a class is renamed BUGFIX: Item table references also merge when 2 item classes are merged during a paste BUGFIX: Using SET with 2 tables should now completely copy a table if the target table is totally empty (no rows, no columns) Also should work if the target table has the right # of columns but no rows NEW: The "Round to N" operation is now useable for entire columns as well as individual numbers NEW: When naming a subroutine in a call, there is now a dropdown to select existing routines from BUGFIX: Fixed bad code in the "redirect" of object labels when a portal is copied (from


). Might work properly now :) NEW: Now "redirect" panel and paint object labels when a portal is copied BUGFIX: Copying lines from subroutine will now copy the parent routine's attributes and offer to include them when pasting, just as occurs when copying lines in a parnet routine. NEW: After routine lines are pasted and PL has asked and copied parent routine attributes, it now offers to do a purge of unreferenced routine attributes. NEW: Now use a hierarchy selector for the selection of panels as button targets, inherit bases etc


BUGFIX: Paint objects & Control Attribute Scope Another related issue fixed - was not re-initialising paint objects which were run-time inherited, causing their attrefs to fail. Also was not re-ionitialised temporary copy paint objects created during the run as part of the inheritance update process


BUGFIX: Paint objects & Control Attribute Scope An internal update is performed after a change to a paint object's options by the copy properties operation. This should fix scoping issues


For testing

  • NEW: Paint objects have a new option "Scope Control Attribute To Parent"

When this option is set, the visibility control and state control attributes (where present) for the paint object will be looked up using the scope of the parent object of an object instead of the scope of the paint object itself. This means that paint objects throughout a model can share a control attribute located in scope of their ancestor object without the control attribute having to be in scope of every paint object in the model that wants to use it.

  • NEW: Object label "redirection"

When a portal is copy/pasted, the platform will now update any object references (ie: object label list labels) within the portal to point to the copies of the reference. This will help keep copied portals intact when they reference objects within themselves using labels. This will also work when a portal is copied to another modem, however it is known that the object label names chosen may not match the object name when it gets pasted, particularly for the "top level" portal; something to be aware of.

  • BUGFIX: Copy pasting between models was broken when references to the class label list were used (and maybe in other cases) as the platform was not properly handling a structure being "unavailable' during the copy/paste process
  • cleaned up object label list to make it directly store SimObjects. This removed a lot of old testing and error handling code
  • rewrote way that attrefs are "scanned" for updates, initialisation etc



Spatial links, pipes and shared routines were broken in


  • SPEEDUP: Setting attrefs now faster as the "is it writeable" test has been sped up
  • SPEEDUP: Comment lines are skipped in the routine handling code which should speed up models with many comment lines/separators



No visible new features in this release and file format hasn't changed since


Rewrote AttRef code - there is now a distinction between the "data scope" that an attref has data access to and the "owning scope" within which it exists. Now make use of the structures introduced for scoped label lists. Included rework of:

  • all routine operations
  • special operations such as search,conditions,multiconditions
  • simulation objects like multiserver, pipes, spatial links, trays
  • paint objects (visibility, state control)
  • views (visibility)

Each Attref will now use 8 bytes of memory more (additional caching) I've optimised the code so constant-during-run attrefs and normal table references should be noticeably faster. The rewritten code will enable better copy/paste and more scoping options to be considered.


  • BUGFIX: Wait for broadcast dispatcher option fixed:

The item would wait forever if ALL broadcasts were processed in 0 time

  • BUGFIX: fixed bug in resizing boxes with mouse introduced with



  • BUGFIX: reworked object hierarchy to make it possible to directly report which paint object causes an attribute referencing error and to properly highlight objects if they are not on the current screen

Known bug - if a paint object causes a referencing error as the result of a force repaint, the paint object will be identified and the routine name/line of the calling routine will be shown but not the object containing the routine.

  • BUGFIX: When an paint object is set to another paint object using the copy paint properties routine operation, objects which inherit from the object being updated will also get updated with the *changes* that the target object experienced.
  • BUGFIX: table editor crash when trying to edit a column which was referring to a label list which had become out of scope
  • NEW: Pressing an arrow key while dragging an object switches to keyboard movement mode (so you can let go the mouse button and continue moving the object with the keyboard.

Capslock should be off so the keypad can be used. <ENTER> accepts or <ESC> cancels. Co-ords are displayed in the titlebar

  • NEW: Pressing keypad "-" enables the co-ords of the currently dragged object to be entered numerically

Co-ordinates are specified using the planimate canvas co-ordinate system (0,0) is at the lower left of the panel area If a resize is active, the width/height of the object can also be changed 4.92 This is a first release of significant new functionality in Planimate for initial testing. SCOPED ITEM CLASSES AND CLASS MAPPING These are a key part of the Version 5 we are moving towards. Scoped Item Classes: -------------------

  • Item classes can be scoped to a portal (currently in item class edit menu)
  • This means that their flows can only exist in the scope of that portal
  • This keeps the portal self contained. Copying the portal will create a separete item class for the copy and the 2 will be isolated from each other
  • Scoped item classes will have access to scoped label lists (which global item classes do not) encouriging the modularity further

Class Mapping: ------------- The idea here is to provide a mechanism where a module (a portal) can be pasted into a model, carrying with it not just attributes and tables but also label lists and item classes (with their attributes) which it uses internally. The goal is that the module can be pasted (singly or multiply) into another model without any of its internal code interfering with existing model code, or with multiple instances of itself. Scoped item classes are an important part of this as even if common global class names were somehow agreed upon, different modules would need different attributes and use the same named attribute differently. By scoping, this usage is kept local and isolated. To work within an existing model, a mechanism is required to "map" the existing, outside or "external" classes in a model to the private, local or "internal" classes in the module being pasted in. This is provided by the "Class Mapper" and is a new option in the edit menu for a Portal. The class mapper specifies how external classes are mapped to internal classes in the module as items enter (and also the reverse when items leave the module) Items can enter a portal in the following ways: 1. via flows 2. via a apatial link/track 3. messaging to the portal 4. via a broadcast 5. via a wormhole 6. via a throw Methods 1 and 2 are currently mapped by the class mapper. As the item enters portal it gets "translated" to an internal item for the portal. As it leaves, it gets translated back to the external item. Method 3 will be in a later release. 4 should already occur due to the existing broadcast mechanism for class translation (see below though). 5 and 6 wont be supported for modules as they are not modular by nature. The translation process involes copying matching item attributes (see below) as occurs in "tupling" with tables and between different item classes. An external item survives while an internal item is inside a portal where a mapping has occurred. It gets put "aside" until the item leaves the portal whereupon its attributes are updated. This whole process works both in lookahead (looking into the module/portal to determine if it has capacity, the module looking "out" to see if there is capacity for an item that wants to leave) and "lookthrough" (looking right through a module with no capacity to see if what is on the other side has capacity for an item to move. It should also work recursively (modules inside modules). It has been challenging to ensure the mappings undo changes to the item attributes during the lookahead process at both incoming and outgoing interfaces and this needs testing. Upcoming enhancements/fixes

  • At the moment, all item attributes with matching names are copied when translating external to internal and coming out again. This can expose what should be "private" attributes within the module so a "keep private" item attribute option is planned to enable the module builder to specify exactly which item attributes feed in/out of the module
  • A report of the class mappings and matching attributes which a given module will transfer. This report will help document the "API" of the module and help ensure that all expected attributes are properly defined in the external scope
  • Carried items to be transferred between the external and internal items on the way in/out
  • The ability for a module to produce an item without one entering and the class mapping to properly occur as the item leaves the module
  • Table references to be treated similar to item attributes as described above
  • If a class is mapped, the module is not able to assign routes/link targets for the external item. A mechanism to enable this needs to be developed (though this raises the issue - how does the module know about the external network)
  • A mechanism to "insulate" modules from scoped broadcasts is intended. This will prevent a module having its internals activated by modeller broadcasts in the model it is pasted into unless those broadcasts are specifically targetted at it.
  • Get the actual inter-model pasting working smoothly

This mechanism will slightly slow down items entering and leaving a portal even if scoped classes are not used. I can probably optimise this if it has a great impact. As far as I know existing models that dont use scoped classes should not be affected (run wise) by the new mechanism and I'd appreciate testing to confirm that this is the case.


  • BUGFIX: "Full Edit Menu With BC" also applies to the table's row select menu - ie: makes it available when cell click broadcasts are being sent.


  • NEW: Table view option "Full Edit Menu With BCs"

This shows the full editing context menu when a table cell is right clicked even if an edit broadcast is being sent. This option is automatically turned on for models saved with


AND the "Dont Defer BC on FEC" option on, since the intention of the latter option is to enable BCs to be sent on edit whilst retaining full editing of the table under modeller control, with the context menu retaining all its options.


  • NEW: new system (display) attribute "Enable Table Cell Edit"

This enables the modeller to decide whether a cell edit should occur whne a table cell is clicked, using the cell click broadcast. If the model sets this attribute nonzero while processing a table cell click broadcast (before edit) then the edit will actually occur. If this attribute is not set, the edit will not occur (as is current). This attribute is reset to 0 before each cell click broadcast gets sent. It is only valid to set/read this attribute in the initial thread of a cell click broadcast. For this feature to work, the table view option "Dont Defer BC on FEC" must be enabled. This forces PL to send the BC immediately rather than waiting until a "safer" time. With this option "on" the modeller MUST NOT close the panel containing the table view as a result of the cell click broadcast, otherwise the platform will crash.

  • BUGFIX: panel window reading now returns correct co-ordinates (client based) for child windows
  • BUGFIX: Popup windows can now be closed using the close box while the model is running


  • New file format, save and reload models with this version before proceeding to use it
  • NEW: ODBC data source Username and Passwords These can optionally be read from an external file. This file is scrambled and generated by a small separate executable.

To use the external file, in the username and password fields preceed the filename with an "@" and append an "|1" for the username field and "|2" for the password field. eg: for username you might have @mypassfile.dat|1 The filename can be remapped in the model's INI file as is possible with other files referenced in Planimate. This enables the end user to keep the exact path of the file out of the model/standalone EXE.

  • NEW Added YYYYMMDD time mode
  • NEW debugging - animation speed can be changed from the background run menu
  • NEW routine operations under "Display" PanelWindowLeft, PanelWindowTop

Return the co-ordinates (windows screen co-ords, top left of window is origin) of the given panel (if its visible). This can be used to re-open the panel at the position when it gets hidden. If the panel is not visible (-1.-1) is returned.

  • BUGFIX: sensor entries correctly reported if there is an attribute reference error (eg: table row error) in their reference
  • BUGFIX:draggable popups are now also draggable when PL is paused
  • BUGFIX: attribute editor handles selection of a different label list without having to change mode back to values first
  • BUGFIX: sub-routine editor edits parent routine attributes when attributes is selected from the menu (subroutines should not have their own attributes)
  • BUGFIX: Paint buttons
  • if dynamically sizing to text and have a bitmap set, the border is determined before drawing the bitmap
  • tooltip is registered after rectangle has been updated not before
  • background colour (if set) is shown before background image and the border (if set) is shown after

This means that buttons can be used with transparent bitmaps and a background colour instead of the background colour being 'hard coded' into the bitmap (which caused problems if the background colour in the bitmap was (0xBC,0xBC,0xBC as this is the transparent colour)

  • mouse down state image is properly shown when the engine is running (backing store is in use)
  • BUGFIX: Routine attribute dropdown updated after a line is edited (in case routine attributes were added)
  • BUGFIX: File loading had a leak if an attempt was made to load a model which was older or newer than supported, and it did not properly clear the database cache if a model load failed to occur.
  • CHANGE: rewrote item interaction saving to support multiple classes with the same name (to support scoping)
  • CHANGE/BUGFIX: scope of control attribute for views is now the same as the scope of the data for the view, rather than the scope of where the view is located.
  • SPEEDUP sped up/inlined counting of items as they enter/leave objects


  • properly check whether to send BC on a row append in an empty table view (if a user appended a row to an empty table, could cause crash)
  • panel link checks if in edit mode for popups as well as normal panel links.

The message to "add a link now" indicates that it wont be inherited (doing an inherit at "click" time isn't supported by the framework).

  • edit -> label list can be selected when viewing a panel (uses the dynamic scope of the panel being viewed)
  • creating new label lists now has handling for selecting global or local scope rather than defaulting to local scope (new checkbox)
  • label lists can be moved to a different scope
  • scope added to item classes (not fully implemented yet, dont use)
  • PLANIMAT.INI file only gets read once when Planimate starts up
  • Added INI file items for the object palette posistion and icon size.

ObjPalCellLimit sets the icon size, if 0 the default (currently 32) is used.

  • New display option "Edit: Include scope for portal atts" will include the owning portal name in portal attribute references in routines (if avail)
  • Have renamed the options in the "display options" dialog to try get some order in there and the picker lists are kept sorted.
  • Attribute display popup (debugging) is wider
  • The run background menu contains a new option if a routine window is open and a routine is being stepped through, "Change Stepping Interval"

This enables the stepping speed to be altered as the routine executes. The setting made here is specific to the currently active routine window and will remain in place for that window until that routine window is closed. (ie:the INI default is used when the routine editor window is reopened)

  • extra internal debug checking during ocpy/paste, proper checks to handle copy/paste of label lists between models. If any new "system error" type messages appear, the debugging has caught something that was slipping through before.
  • display and debug menus, Display Options now renamed Modelling Options


  • The popupmenu code no longer locks screen redraws while a menu is being tracked. This will prevent the blank screen during routine type selection
  • paint buttons have a new option on each state: "Mouse Down State"

If a state of the button has this option set, then instead of changing the border style when the button is moused in, the button will switch to this state instead. This gives the modeller more flexibilty in how the button looks when the user actually clicks in it.

  • Panels have a popup option enabling them to be draggable at runtime from any position IF they dont have a normal dragbar and the click is not on any button.

If the panel "Palette Style" popup option is also set, the window will be a popup rather than a child of the main window as is the default for windows without a titlebar. This option is useful for creating "remote control" type panels.

  • Attribute and Cell Views have a new option "Broadcast to View's Scope"

This causes view edit broadcasts to be scoped to the scope of the closest dynamic panel to the view rather than the scope of the attribute which owns the view.

  • 4.33 version Entries in scheduled arrival mode with a loop point set now get a very large "end time" set to prevent them from "drying up"
  • Scheduled entries which have no outgoing flow no longer stop the run with an error
  • New _!System.DB included with the proper planimate logo BMP therein


  • Added extra handling in the switch loader so old switches which contained a time schedule (even if they were not using it anymore) can be read without errors


  • search window wider to accomodate wider attribute names
  • changed way tables are brought up to date after a routine operation so scroll broadcast processing does not cause IFTableVoid errors (as for



  • bugs with change object icon defaults fixed
  • fixed a very long standing bug: If icon selection palette was moved (or a redraw was required of the main window) after the last instance of an icon in the model was changed to another icon, the redraw would cause a crash
  • routine options dialog z-order fixed
  • new object palette icons

Mattias has provided some nice new icons and buttons for the object palette. (time to leave 16 colour land)

      • You will need to start using the _!SYSTEM.DB provided with this EXE ***


  • more work on scheduled entry reading when loading 4.33 models
  • fixed bug with INI file RoutineFormatW note: this value sets the size of the formatting area to format into (in characters) for each routine line


  • Scheduled entries should now be a bit more compatible with older version entries when loading 4.33 models. If on a periodic arrival a "loop" point was set, then the item limit is now set to "infinite" (-1) so the entry wont "dry up" after one item.
  • The modeller can set the minimum formatting width for the routine editor's display of routine lines in the INI file

[Routine] RoutineFormatW = xxx Run this version to create the default entry (0) in your INI file.

  • Items inspected in breakpoints always have details and attribute displayed
  • Label lists have an option to not clear the list when it gets imported from a file
  • a forced repaint is done before a breakpoint dialog is shown
  • swapped name and scope columns in in scope/name lists so the name gets selected not the scope


  • fixed table column bug (tables referencing label lists caused a crash when Planimate lost focus and transferred the data to the system clipboard because the copy table didn't have an "owner" to determine its scope from)
  • side effect of above fix: when a panel/portal is deleted, any table in the copy/paste buffer is deleted.


  • entries in single event time mode now "start" properly if a delayed schedule entry start is used
  • fixed a bug in the distribution pattern dialog editor if it was cancelled
  • Have reworked code so sections and loops "know" their connecting objects rather than having to fetch them from a table. This will speed track networks up.
  • This version will now read 4.33 models which still contain object stats (it quietly eats the stats) so they dont need to be removed.

New Track Options (from



  • 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.


  • wider fields in condition and decision dialogs to support the longer attribute names
  • palette has bigger cells and hover labels; partial progress towards new palette design


  • The width of names has been increased to 32 characters

This applies to: o Planimate Modelling Objects o Label, Sublabel, Multi label (the list names, not the labels .... yet) o Attributes (Portal, Item, Routine) o Item class Names o Table names o Column tuple name o Route names o Routine/subroutine names PL now stores these names in fixed arrays rather than dynamic strings so models will use more memory but incur less fragmentation of RAM.

  • Updates to handle the longer names include:
  • status bar now resizes according to width so it can fit long class names
  • splitter editor, item class editor, item class selector
  • Attribute reference formatting field is wider
  • Routine editor field trimming
  • double clicking on a splitter edits interaction for first class entering it
  • Tables, Attribute and (new) Label List browsers use more common code and include a "scope" column.

(Edit -> Label lists will enable view/selection of all label lists in scope)

  • Routine Editor: Have reworked the field trimming code for each routine line, so now more of the attributes in a routine line will be shown if the space is available.
  • available width updates as the window is resized
  • longer attrefs will be trimmed proportionally more than shorter attrefs
  • A number of objects/structures have been coalesced to reduce memory allocations, fragmentation and increase speed.
  • this includes significant recoding of:
  • Entry, Exit, Change (Icon), Dispatcher, Queue, Multiserver, Splitter
  • Table (tuple cache), Table and column dependency lists,
  • Routine Loading
  • Conditions and decisions
  • Cleanups to the attribute/table/label managers to commonise code and remove lookups that are no longer needed (due to new scope code)
  • Rework item code for speedup and allocations
  • items that are "destroyed" in an exit are kept in a cache for quick re-use. This cache has been extended so
  • if the item was carrying items, the "carry list" is retained if the item doesn't change class.

This means if only a few instances of an item class every carry items, and there are many other instances of that same class which dont, then its best to either:

  • not destroy the "carrier" items, re-use them OR
  • make the carrier items a different item classes.
  • if the class of the re-used item hasn't changed, internal tables used to store attributes and item-tables are kept allocated
  • A structure used for info panels was being allocated for all items if any item attributes were set for info panel display.

This structure is now only allocated if the item is actually made visible with the Show Info Panel option "on".

  • the item's code has been "inlined" much more giving more speed
  • Table title width has been increased and the create/edit fields are now consistent for the maximum length they allow
  • Sped up and reduce memory of label references:

The new "scoped labels" meant references to these (millions in large models) were both too slow and using more memory. I've reduced memory usage where the reference isn't referring to a label (eg: its a constant scalar or attribute) I've increased speed by added a cache during runtime.

  • Fixed a big bug introduced in


which caused run performance to gradually degrade. Blocking switches were mismanaging an internal cache causing a memory and speed leak as the cache list grew
  • The loading of many objects has been reviewed and optimisations/cleanups done to reduce unnecessary allocation/copying during the loading process.

This will result in faster loading and less memory fragmentation.

  • clean up to table row name handling (sloppy when first non empty row label was added or loaded)
  • Run profile shows more internal model metrics which come in useful when determining where the memory is going.
  • sped up checking for user breaking out of an iteration/search
  • speed up: The simulation clock is now a faster-to-access global variable
  • sped up condition/comparison code (separating comparison and logical tests, integer only for logical tests), inlining, rework the double comparison code to avoid wasted evaluation in doing a "max()"
  • Distribution Pattern dialogs had to be reworked to be compatible with scope and still be efficient when a distribution was not actually being used

  • Cleanups to supporting scoped label lists.

Still to be done:

  • Saving/Loading scoped label lists from data sets
  • Migrating lists between levels
  • Handling "Put into subsystem" for top level lists (they stay at the top)
  • Creating label lists on the fly located in a portal

notes: As models get bigger, the number of allocated memory blocks causes performance problems in the memory allocation system. Planimate deals with this in several ways including unused event and item caches, coalescing as much as possible into tables and using "contained" objects rather than pointers to allocated objects. The challenge is to trade off

  • a linear increase in memory usage vs
  • an exponential slow down in memory manager performance due to the increaing number of objects.


2 fixed bug - copied splitters lost their split information


(built with MSVC++6.0)

This versions adds support for scoped label lists (like attributes/tables). The menubar "Edit->Labels" continues to contain existing label lists (global) which will remain global (for now). A portal/portal entry will have a "Labels" option to enable a label list to be created within that subsystem. Scoped label lists will "osbsure" any label lists further up (or global) with the same name, as for attributes and tables. To be added:

  • migrating label lists between levels in a hierarchy
  • ability to create "global" label lists which will automatically become scoped when the top level model is "put into a subsystem"
  • inspecting/editing label lists in the current scope via the edit menu.

This release involved significant rewrites. It's been tested with some of our recent and biggest models so loading/runtime seems OK. I've not tested editing very much. NOTE: I'm expecting modellers should be able to migrate to using this series if their model loads and runs OK. Feedback that it is robust is essential as I diverge away from 4.33

  • Distribution pattern

Removed lots of old code for setting units/format which was not being used but was causing a lot of interaction between distributions and the label list code

  • Cleaned up the editing of units/labels in the code, only done in one place now using a consistent data structure
  • rewrote all code pathways which involve label list references to include a "scope" which is the dynamic panel from which the reference originates.

This will enable scoped label lists just as we have scoped attributes and tables. The change was significant and any code involving label lists must be watched carefully, particularly when scoped label lists actually start being used (rather than only the global ones as current). Sub/Mult label lists have been enhanced to support a parent label list which is scoped. This means a subsystem using a private sub label list coukd be moved to a different place where a different parent list is in scope and the sub label list would now work with this instead.

  • reworked the way objects are used which makes the model database smaller and faster (contained tables rather than a pointer to allocated tables)
  • model merge: no longer purge unused label lists from the copied object during the merge. Eventually this will be done in a "create module" operation.
  • label list merging no longer gives option to create a new unique list. If a list needs to remain "unique" then a scoped list (private to the module) would be used.


  • fixes loading of models with non scheduled entries
  • has the vertical scrollbar fix as in



This is Planimate


/k with old code/obsolete code removed. Some of the remaining objects have been significantly changed. Warning are given about incompatability but "where" is not always shown. Notwithstanding this, a few recent models I've tried do load. This version will only read models saved under Planimate


or later.
  • REMOVED Single Server, Conveyor, Faciltiy, Mark, Record, Assembler
  • REMOVED the log viewer
  • REMOVED the logging system (wrote files for the log viewer)
  • REMOVED object stats/views. [Any model containing these will not load]
  • REMOVED "Global" Time Schedule support and
  • REMOVED Attribute references to global schedules
  • REMOVED Switch in schedule mode
  • REMOVED Multiserver reference to schedules [Any model containing these will not load]
  • REMOVED changling a class at a change object includes item's "Original class" tracking
  • Collapseed and streamlined internal object tables in Planimate, removed all supporting code for the above. Platform should be faster and smaller.
  • REWROTE TCP/IP support (sockets, URL processing) rewritten to use latest TCP/IP modules which I developed for idBase, enabling merging.
  • REWROTE Entry Object (Schedule Mode handling):
  • Removed support for multiple classes in schedule mode (first class leaving is now used)
  • Removed multi-line schedule mode. Just a single schedule mode "line" now and it gets edited on Object mode
  • Shortcut: double click on Entry now edits its details (the item production details, selects broadcast).
  • Converted "Schedule" mode into 2 new modes:

"Periodic Arrivals" Produces items between a "Start Time" and an "End Time" with the item IAT and the item limit count being specifiable from a distribution. Only single items per IAT, no batches produced anymore. Use a splitter if a batch is required. Make sure entries in "Periodic Arrivals" mode do not become blocked. Future verisons will complain about this. "Single Time Arrival" Enables one or a batch of items to be produced at a single time. A time and item count can be specified. [old versions are mapped as much as possible to the new entry modes]

  • REWROTE Switch Object

REMOVED - switch interactions:

  • attribute selection mode no longer has flow specific remapping, flows are mapped numerically 0 = block, 1 = lowest path etc.
  • distrubtion seleciton mode now always distributes evenly, no flow specific probabilities.
  • priority selection, absolute path removed
  • runtime code completely cleaned up and much more efficient
  • BUGFIX - cyclic selection for assume no blocking switches started at the second path leaving the switch instead of the first
  • Remaining switch modes: First Available: Chooses first flow which is not blocked Random Choice From Available Path: Randomly chooses between all available paths Shortest Queue Chooses the first shortest queue (or queue with empty object following) Sequential Cycles between all paths, whether available or blocked Attribute Attribute indexes which path to take Condition Single condition selects go/no go (or take second path) Multiple Condition Uses a ocndition table to determine which path to take