ReleaseNotes:Planimate 5.25 Release Notes

From Planimate Knowledge Base
Jump to: navigation, search


  • 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)