ReleaseNotes:Planimate 9.x Release Notes

From Planimate Knowledge Base
Jump to: navigation, search



  • FIX Added exception interlocks for: MessageBox*(), AdvanceToTimeDialog() and Dialog() so these can be used without system errors in models where events trigger routines whilst a routine that pops up a dialog is active.


  • FIX Added interlocks when calling a method in a c# class to enable other PL routines to run in parallel without a system error.


  • NEW Table column filter will match numbers typed without commas on columns formatted with commas.

9.41.0 (model version 810)

  • NEW Routine operation CopyTable() acts as table copy using "=" but also works with item table references instead of assigning the reference.
  • NEW LoadedAssemblies() routine operation is useful to enable showing the loaded c# assemblies versions. It reports if PLCLR is unable to load which will indicate a missing PLCLR DLL or the expected Visual Studio runtime is not installed.
  • NOTE An upcoming version of Planimate WILL REQUIRE the Visual Studio runtime and eliminate the need for the PLCLR DLL. This will enable Planimate to more tightly integrate with dotnet.
  • FIX Setting options for multiple columns in column editor handles null clear time option properly.
  • FIX Changing from calendar to non calendar format resets clear value if it was the null time.

9.40.0 (no model version change)

  • NEW View / Show Loaded Assemblies menu bar option will display DLLS and their versions loaded by the PLCLR dotNET interface.

9.39.0 (new model version 809)

  • NEW Tables Column option "Clear Date Cells To Null Date Instead Of 0". For Date-Time formatted columns, this causes the default cell value to be the not-set time sentinel value rather than the run start date. This sentinel is the numerical value 99,999,999,999,999.0 and is displayed as "-".
    Note on DataSet2: A column saved with this option set will only set the option (and hence use the sentinel clear value) if it the dataset load is creating the column. Otherwise the setting of the already-existing column takes precedence.
  • CHANGE New models now use 1-Jan-2018 as the default epoch date when switched to calendar mode. Like the previous default 1-Jan-2007, this year starts on a Monday.
  • SPEED Changed clear value handling so code that references it often may be faster.
  • REMOVE Removed support for Model INI files and the /INIFILE command parameter. File and string handling within Planimate renders its limited capabilities obsolete. Loading an older format model with this setting will report it.
    Model INI file is not to be confused with the Platform INI file.

9.38.0 (new model version 808)

  • NEW FolderExists() operation returns non zero if a given path is valid and exists.
  • NEW Map paint object has option to take/process co-ordinates as linear 0..1 instead of longitude/latitude.
  • NEW PL supports running a dotNET call in a separate thread to keep the UI alive during long calls. This is only for calls which do not use any UI and is supported with calls to methods via instance handle attributes only.
    This is enabled by setting s.PLCLRThreading to 1 before the call. You must reset it after the call or corruption is very likely if a dotNET call which does UI is made at a future time.
    s.PLCLRThreading = 1 p.myhandle.DoSomethingThatTakesAWhile() s.PLCLRThreading = 0
  • CHANGE PLAPI and PLCLR update: Removed MessageBox() and instead use the callback to PL PL now registers the callback right upon DLL load. This enables UI thread interlocking when an error causes a message to pop up whilst a DLL call is running in its own thread.
    This will not affect older DLLs but older versions of PLCLR should not be used with s.PLCLRThreading.


  • CHANGE Updated manifest to flag PL as non DPI aware which seems to prevent dotnet CLR from overriding the DPI scaling when PLCLR starts. Tested under Win10 latest only. Should not affect Win7 but consider support for it deprecated.

9.37.0 (new model version 807)

  • NEW Model option Advanced / "Enable Error Restart In Batch/Test Mode" enables the existing restart on error functionality when running in batch or test run mode.
    Proper handling of errors becomes the modeller's responsibility and care must be taken to stop/close the run in the error handler.

9.36.0 (new model version 806)

  • NEW Value Format DD/Mmm/YYYY hh:mm:ss
  • FIX Cancelling the "Save Changes" dialog when PL closed with a unsaved model would close PL anyway. Probably introduced 9.31.0.


  • FIX ShowPopupPanel() at (-1,-1) now properly positions at mouse and and at (-2,-2) centres on the current screen the main panel is on.
  • FIX Dispatchers using reneg times did not support the item class being deleted, resulted in a fault when the model was saved.
  • NEW Option "Replace With Class (Scoped)" in the flow edit mode panel context menu enables another class to be selected and all paths and interaction details for the current class on the current panel and those within will be changed to the selected class.
    If existing paths exist for the new class, they will be doubled-up If existing interaction details exist for the new class, they are retained.
  • NEW Class context menu option "Add Attributes From Another Class" enables another item class to be selected and its item attribute definitions will be copied if they do not exist already.
  • REMOVE Internal ODBC support has been removed. A DLL is available that provides tihs functionality.

9.34.0 (new model version 805)

  • NEW Graph Views now have a new option to synchronise between graphs the y graph area as well as the x area and the scroll time range.


  • NEW Option in Table clipboard export "Raw" and fileoption "RawForDebug" writes values unformatted with extended precision to expose very tiny differences in floating point representation.
    These will expose numerical noise in floating point values that do not normally impact decisions in Planimate due to its rounding rules. Sorting is an exception as mentioned below.
  • NOTE The table sort operations use the full precision of the values. If you depend on the sort order based on rounded values, use an operation like RountToN(t.MyTable.Column(c.ColumnName),6) this example would round to 6 digits of precision.
    This may be important if data is coming from a combination of different origins (like text based import and calculations) and you require that values that look the same are treated the same, which can be important when you have a secondary sort criteria.
  • NEW PLAsDLL API v10 added CreateTable, DeleteTable and InsertColumnNamed APIs.
  • FIX Linux version strip name from path now slash agnostic

9.33.0 (new model version 804)

  • NEW AdvancedSort() now supports filtering which rows from the Sort Info table to use. The call includes a new filter value. A 4th column in the Sort Info table is required when this feature is used, which occurs when this value is set non zero.
    This is useful where a model requires various sorts and maintaining individual tables or shuffling data becomes unwieldly.
  • NEW AdvanedSort() now has a new parameter "AsText". If set, Sort Info column 1 (which identifies the sort column in the data table) will be matched as text instead of a number.
    This is useful with Free Text and particularly Labels as a textual match ensures the column is found even if its moved and an error will be reported if the expected name is not found, catching typical errors during development.


  • FIX Linux handling of paths for some file operations


  • FIX Using a "Click (Single Item Moved)" Entry in conjunction with code that triggers breakpoints would leave the engine in the wrong state. (breakpoint handler assumed run state; not valid for a click entry).


  • FIX A popup of a panel configured to auto-fit now imposes the minimum panel size instead of allowing the popup to be shrunk smaller than the specified minimum size.
    This issue was likely introduced in 9.1.1 for a High DPI workaround to an odd behaviourin Windows.


  • FIX Redraw performance issue with Dial Views redrawing too often when the source data hadn't changed.
  • FIX Turning off Run Profiling and running caused a fault

9.32.0 (new model version 803)

  • FIX Clock View animation layer option added 9.31.1 wasn't being saved
  • SPEED Internal rework of visibility test speed sensitive code


  • NEW View Order line in a view's context menu now indicates the relative position of the view (higher is more frontmost). This is against all views on the panel, not just view's of a given kind.
  • NEW View list now shows centre co-ordinate as well.
  • NEW Clock View option "Show In Animate Layer". This is a toggle in the properties fly-out.
    Normally Clock Views update EVERY time step but this can constrain speed when the "Display Update Interval" is set much greater than the event interval in the model.
    This option causes Planimate to update the clock view at the model's animation update interval instead of on every clock change.
  • TIP For attribute and cell views of rapidly changing data, you may want to turn on "Show In Animate Layer". Table Views do not update on every data change so this is not needed for them.
  • FIX Line dash patterns now implemented. Paint lines use anti-alised GDI+. Paint lines support dash patterns scaled by their width.
  • FIX View control hiding of views in animation layer.
  • FIX Clock View's weren't properly named in Panel / Views list
  • TIP Turn off "Monitor Occupancy" for visible portals that do not need to reflect their contents, speeds up running with animation visible.

9.31.0 (new model version 802)

  • NEW Setting s.ExitWithCode will cause Planimate to close and return the code to the calling process, it acts as a stop exit. Do not expect lines following this to execute in the routine and restarts are ignored.
    Note that values 1..31 are reserved for Planimate internal errors and 100 is used by the automated testing command line option.


  • FIX FileLines() fixed.
  • FIX Fault in Help / Show Expression Reference (since 9.23).


  • NEW Cell view option "Send Cell Click BC Instead Of Edit" causes a table cell click broadcast to be sent without an edit, instead of the after cell click that is normally sent.
  • NEW A cell view of a table cell with a tool tip set will now have that tip when hovered over.
  • FIX Added additional interlocks in pause event polling to prevent cases of system error 1181 when a panel doubleclick triggered a resize broadcast routine whilst PL was processing a routine.
  • FIX FileLines() is now more accurate and handles an unterminated final line properly (it previously was an approximation and always added one whether there was a final unterminated line or not).
  • FIX Dropping a file without an extension onto PL in edit mode would cause a fault.


  • FIX Work around issues with ListView to reduce flicker in routine editor, particularly related to restoring the scroll position.
    Flicker will still occur if the Platform INI option Edit / DoubleBufferListViews option is NOT selected so ensure it is enabled.
    A future PL version will remove this option and make it implicit.

9.30.0 (new model version 801)

  • NEW Portal Option "Auto Flip Moving Icons" horizontally flips the portal's icon if its moving from right to left.
  • CHANGE Renamed item "Flip Icon" to "Auto Flip Moving Icons"
  • NOTE Updated VS SDK


  • FIX The /HELP or /? command line options were not working under Windows.

9.29.0 (new model version 800)

  • NEW BrowseFolder() enables a model to ask the user to select a folder. Returns non zero if one chosen. An initial path can be specified as well as the title. Use s.LastAccessedDataFilePath to access the path selected.
  • FIX Text and routine portal attributes are now supported in attribute dumps.

9.28.0 (new model version 799)

  • NEW New date/time format "YYYYMMDD hh:mm:ss"
  • CHANGE Increase table row allocation width space to 8 digits (Table Editor / Advanced menu)
  • FIX Table Editor menu option "Select All/Copy" for a table with no rows now works (useful when copying table structure).


  • CHANGE Routine editor now has unlimited undo's. Note it still will clear the routine edit undo buffer at the same instances that the previous version did.
  • FIX Table editor Paste/Replace All was not updating dependencies leading to problems if the pasted data had less rows than a visible table view.

9.27.0 (new model version 798)

  • NEW GanttPopup() enables a model to trigger a click on the gantt block that shows the default popup. This is useful if a gantt view is configured to broadcast and you want to still show the default popup in some cases. You will typically pass s.MouseX and s.MouseY for the X/Y co-ordinate.
  • NEW Implemented a text based Find (Ctrl-F) and Replace (Ctrl-R) in the routine editor.
    At this stage it is line based and multiple matches on a given line are replaced as one.
    As Planimate requires routine lines to be parseable on edit, any lines broken by a replace will report an error and be converted to comments.
    Undo (Ctrl-Z) reverses all changes made by a given session with the Replace dialog. This might be desirable given the mess this can create.
    The original replace reference is still available in the routine list context menu.
  • FIX Very long standing and subtle lurker When a model was merged with another (pasting in a portal), three global distribution constants, used to optimise/cache common distribution values (constant zero, constant one and the uniform zero-to-one used in switches) were not getting their scope updated, leading to a segfault when a subsequent enumeration of references attempted to use the scope (eg: show references for a table column).
    The model would be fine once saved/reloaded. (thanks Jay for the repro on this nasty one).
  • NEW Tools/Open Program Folder opens the folder where Planimate is running from. This is useful now that local installs run from a folder buried in the by-default hidden user profile/AppData/Local folder.
  • CHANGE PL will now create the backup folder for saved models, giving a message when it does so. It will report a failure to create the path as well and just use the current directory as a fallback.
    It only tries creating the innermost folder in the path. By default Planimate uses a folder called "Backups" in the model's directory. If you don't want your BAK files in a separate folder, use Settings / Platform Options / Edit / BackupFolder and change it to an empty string.
    TIP:You can specify a full path such as d:\MyFolder\PLBackups and all backups for all directories will be placeed there, in this case you need to ensure that d:\MyFolder at least exists.
    NOTE:PL is unable to create folders on the top level of the system directory eg: C:\PLBackups as Windows has chosen to require administrative priviledge to work with the top folder of the system drive.
  • CHANGE Moved "Purge Unused Attributes" to the Attribute menu in the Routine Editor Window.
  • CLEAN Remove an unused reference formatting flag that should not affect things


  • CHANGE It was possible to use CopyPortal() to create portals with names exceeding the 32 character limit. Also column names exceeding 32 characters were present in a model.
    The loader now crops such names as encountered and reports them as encountered.
    As the names may be used in references elsewhere in the model (which will not be cropped) this cropping may reuslt in these references failing when the model is run. You can use Find within Planimate to locate them or use a text editor to find/replace the reported names in the MDL file.
  • FIX Icon load errors were not being properly logged.
  • FIX Case of missing interlocks for routine processing when polling for events during a long routine which reported system error 1181 in cases where a mouse event etc. started another routine.


  • CHANGE Rewrote the sidebar to support more size-defaulted resizeable panes

9.26.0 (new model version 797)

  • NEW GetcolumnTip() retrieves a column's tool tip.

9.25.0 (new model version 796)

  • REMOVE The in-built multiple run support has been removed given production models manage runs themselves. Related menuj items and system attributes are removed.
  • CLEAN Engine control (particularly related to model finishing conditions). Stop Exit actions renamed for clarity.
  • FIX Stop exits configured to Stop Run And Exit no longer restart the run if the Restart After Stop model option is selected.
  • FIX Modeller selecting "FOrce Terminate" while PL is stuck in a routine loop no longer requires pressing Esc to terminate.
  • DEBUG Can show pending FEC events from the context menu of a running model without pausing it.

9.24.1 (new model version 795)

  • NEW Table views have option "Send Before-Delete BC" which sends a table click broadcast before a range of rows are deleted or cut.
  • NEW To support the new delete broadcast and assist with other table clicks, a new item attribute "_click_type" is set by table click broadcasts. Along with the new label list "_tableclicktype" one can now test for:
    BeforeEdit: broadcast being sent just before a cell is edited AfterEdit: broadcast being sent after a cell is edited Change: user has taken action that changes a range of cells BeforeDelete: About to delete range of rows Key: Ctrl-V key event being broadcast (deprecated) NoData: Click in non-data area of table
    The pre-existing item attributes remain supported but new code should use the _click_type" attribute to make processing cases clearer.
  • FIX The To Row/To Column values were one past the end of the table when the PostDelete table click broadcast was sent.
  • CHANGE Table View option "Don't Defer BC on FEC" renamed to "Don't Defer 'Before Edit' BC" as it only applies to this particular case of the table click broadcast.
    As in previous versions, this option exists so you can selectively set s.EnableTableCellEdit, if you are changing panels in the broadcast this option must be off.
  • NOTE This version superceeds 9.24.0


  • FIX PolyPathFinder returns single row in case of being at target

9.23.0 (new model version 794)

  • NEW Expression operation EarthDistance() returns the distance in metres between two co-ordinates (in degrees) on the Earth.
    This is useful in enabling specifying speed of animating portals on maps in terms of kilometres per hour.
    Support for other celestial objects will be added as required.
  • NEW PolyPathFinder has the additional option to use world co-ordinates in distance calculation. This is important given how latitude impacts longitude and the relative difference even at the equator.

9.22.0 (new model version 793)

  • NEW PickUp and DropOff objects have a new option Don't Defer Events" which causes them to act immediately (using recursion). This enables them to be used in immediate message flows which is extremely useful in a modelling pattern that enables a message sent from a change object to interrupt and reschedule a delay, all within the message, without requiring any blocking switches etc.
    This option should be usually off if an immediate message is not involved as cases involving many items may reach the recursion limit.
  • NEW System attribute s.ItemIsMessage enables a switch to direct items of the same class differently, depending on whether they are a message. This is extremely useful following a splitter used to duplicate a message item. The splitter returns the original message item and the duplicate, and the switch can direct them to different paths.
  • CHANGE Have changed the routine grammer used to access an attribute of a carried item. Older models will automatically use the new grammer. To access an item attribute called "location" of the first carried item, you now use:
    r.result = i.Carried(1,i.location)
    Carried items, combined with PickUp, DropOff and s.ItemActAsCarrier are useful in creating an immediate item to item data transfer.
    This change was made simply so the editor would auto-suggest item attribute names for the carried item's attribute.
  • NEW The Tools/Generate Model Structure report option now has the option to base the report at the current panel instead of the entire model.

9.21.0 (new model version 792)

  • This version introduces new capabilities which combine to simplify
  • arbitrary animation over an area or map without requiring links or tracks.
  • NEW System broadcast "_Animation_Update" is sent to a visible panel during every animation update interval (as set in the Run Menu). This is enabled by the panel option described below and is a scoped broadcast.
    This broadcast enables nodes (portals) on a panel to efficiently reposition themselves as time passes without needing to trigger repaints.
    The following rules and restrictions apply:
  • * Only use this broadcast to reposition the portal. Any reposition must be with SetObjectPos() only.
  • * Never use this broadcast for anything that impacts the simulation including decision making, model logic or completion testing impacting the model's logic.
  • * Do not repaint anything in this broadcast the platform will update your portal at its new position automatically.
  • * Do not trigger any UI, popups or panel changes during this broadcast.
  • * Do not use with code that has the potential to trigger errors and keep the update code minimal.
  • * Do not rely on the broadcast having been sent at any specific rate or order.
  • * Linked views to the portal need the "Animation Layer" option selected for them to follow the portal. Keep these to a minimum as they are redrawn many times a second.
  • * Don't rebroadcast from this broadcast.
  • * If you want links/pipes to graphically follow the moving portal then don't use this new broadcast.
    The platform is mid animation update during this broadcast and its possible it may be unable to recover if the above guidelines are not followed carefully.
    A reference area based animation model designed for genericity will be placed in the Developer Tools region on idBase.
  • NEW Panel option Engine / "Broadcast Animation Updates" enables a panel to send animation updates. This is scoped to the panel and intended for panels conaining portals which will update their position as described above.
    It is adviseable not to have panels with this option on inside each other as it creates the situation where objects receive unnecessary broadcasts.
  • NEW Routine operation "PolyPathFinder" generates an efficient route between points inside an area bounded by a polygon, given source and destination co-ordinates, which themselves may be inside or outside the region.
    If the source is outside the region, a waypoint is included to the closest edge or vertex of the polygon bounding the region.
    If the destination is outside the region, the closest vertex of the polygon is used.
    The polygon bounding the region is passed in a table which must contain at least 3 rows, with the points defined in a clockwise direction. An implicit line connects the last row to the first. Points must not be repeated and the polygon can not contain any points which appear within the previously defined interior (twists in the boundary line).
    The first 2 columns of the polygon table are used regardless of their name. The points are assumed to use a cartesian co-ordinate system which means this operation is compatible with either Planimate panel co-ordinates or longitude/latitude.
    The generated Waypoints table has data placed in the first 3 columns regardless of column names, that being: x or longitude, y or latitude and the row number in the polygon table if applicable for that waypoint. Other waypoint columns are permitted and will typically be x/y columns for the map's LongLatToXY operation (this is a separate operation to the route generation).
    The first row is the staring position and the last row is the ending position which as defined above is always within the region.
    This operation should return a positibe number on success. If the returned number is not > 0 then routing failed which typically occurs because of a twist or repeated point in the polygon. The waypoint table may contain a partial solution in this case.
  • MEW Portal option "Clickable During Simulation" enables a portal to receive clicks and drags whilst the model is simulating (requires Clickable During Run and/or Moveable During Run as well).
  • CHANGE When throwing an item at a portal, a catch Dispatcher can now be named either _!catch or _catch, keeping the name visible.
  • FIX Repositioning a Dial View on the fly selected for Show In Animation Layer.
  • FIX A number of flow editor graphical issues.
  • RENAME Renamed "Place Item" Exit mode to indicate what needs to be set before the item flows into it.


  • FIX Views were having graphic settings reset after editing options. Introduced 9.20.1.


  • NEW Platform INI option Edit/DoubleBufferListVIew By default on, this turns on double buffering for lists, reducing flicker. This may introduce other artifacts on some systems particularly editing long routines.
  • FIX Prevent spaghettified dials when min and max values are set the same.
  • FIX Label list editor shows name of list in titlebar

9.20.1 (new model version 791)

  • NEW Dial views are now incorporated inside Attribute and Cell views when the "Show Dial Instead Of Value" option is set. Selecting this option in a view now causes a dial to *replace* the value display. The view is reconfigured to center the title (now an option) and have a transparent containing frame for the dial.
    This enables dial controls to be used wherever an attribute/cell view is, including on maps tracking nodes and working with anchoring.
    The "Animation Layer" option is supported, very useful for efficient display of multiple scrolling chart recorders.
    Editing: Right clicking on the title area, you access the view's context menu. Right clicking on the dial, you access the dial's context menu. If the view title is hidden, you can use the "Edit Owning View" option in the Dial's context menu. TIP: keep the title until the underlying view is configured (visibility control etc.)
    To move a dial around, either drag by the title, control-drag it or move it around in paint mode (where the dial does not use the drag for its internal tracking).
    Disabling "In Place Edit" prevents the dial responding to left clicks and drags in all modes.
    Run: The references in the dial are scoped to the same scope as the view's source of data, as also used by the view's visibility control etc. A future version may enable View Scope for these all.
    Upgrading: Older models are updated as follows: if the view ownign the then-separate dial was explicitly hidden, it becomes the dial view. Otherwise a copy view is created so both value and dial remain visible.
    The debug log file will note any panel and data object that contain views that were upgraded when loading with this version.
  • CHANGE Expanded how Conditions determine a "hard coded True" which in cases like editing Visibility Control will cause the condition to be removed if its a single comparison hard coded with only constants, rendering the condition redundant eg: (123 == 123).
  • FIX Rewrote the code that tests a model's CRC/checksum. Certain control characters appearing in labels from imported data were causing an integrity check error on save. Expanded on the CRC messages as appear when File / Info For Model File is used.
  • FIX Views associated with OS Date and OS Date Time data will now edit with a datetime control.


  • FIX Better handle model errors occuring whilst Planimate is in the middle of a panel open, scroll or other broadcast that is processed silently in "real time" with the expectation that the operation is not interrupted.
  • CHANGE For PL-As-A-DLL enable LogMessage() to be written to the planimate log file if the DLL is instantiated with the /DEBUGAPI and /DEBUGFILE command line options.


  • SPEED Icon overlay command "[B:1]" converts the in-memory representation of a loaded image to use GDI instead of the slower GDI+.
    This is useful on panels where there are hundreds of network nodes which use a PNG but do not require translucent alpha blending.
    Use "Choose Icons" and add the icon command text in front of the state icon name(s), by context clicking on them.
    It will also work for dynamically loaded icon images.
    This page on the Planimate wiki documents the icon command system.
  • FIX Icons with overlay commands are now also refreshed after the Icon Mover is closed.
  • FIX DayDate() and TimeOfDay() now introduce less rounding error, it was previously of the order of 1e-7 seconds.

9.19.0 (model version unchanged)

  • Note changes to double click handling to avoid latencies.
  • CHANGE Greatly reduce flickering in routine editing and moving between lines whilst the step editor is open. This impacts other lists like used in the options editor.
  • CHANGE Remove flickering when editing the colour palette.
  • CHANGE Log Driven Views now perform an additional search for their configuration table in the scope of the view if they fail to find it in the data table's scope. This enables configuration tables to be kept close to views they are associated with.
    Note that the reference editor will not autosuggest tables not in the usual scope (data table) however a table name can be entered and the binding verified using the "Config Table Column Check".
  • NEW Double clicking a colour palette button selects that colour.
  • CHANGE Double clicks on views are handled differently internally. Generally you need to double click the title to open the owning data.
  • CHANGE When paused, simulation objects no longer display their runtime context menus on left clicks, only right clicks.
  • CHANGE Gantt and train graphs no longer absorb double clicks when configured to broadcast.
  • FIX Prevent double clicks on some objects editing whilst paused.
  • FIX Toggled selections were not updating panel (from 9.18.0).
  • CLEAN Changed the way simulation objects receive double clicks.
  • REMOVE Panel option "Don't Allocate Backing Store". Panels are always triple buffered in memory. When visible, graphics memory for a panel is: width * height * zoom% / 100 * 4 * 2.


  • FIX Paint Nap objects were not tracking becoming hidden
  • NEW INI setting Edit/TextEditor sets the name of the text editor to invoke when Planimate shows reports and other text files generated. Typically this will need to be a full path to the executable unless it is in the system PATH, like notepad is.
  • NEW INI settings for RoutineEdit: RoutineSelectBackColor, RoutineSelectTextColor (RoutineSelectBackColorInv and RoutineSelectTextColorInv if the inverted colours are selected) configurethe colour of selected items in the routine editor.


  • FIX Touch gesture translation enabled whilst still supporting pan and zoom when enabled for a panel.
  • FIX Ctrl-F in routine editor (show functions, from 8.15.2)
  • FIX Fix display glitches if panels changed in flow edit mode (9.18.0)
  • NOTE New Map handler portal with gesture support in development.

9.18.0 (model version unchanged but older versions will ignore new options)

  • SPEED A Major refactor of how Planimate works when the run is stopped. Panels are always rendered using memory buffers, resulting in faster, flicker free display updates.
  • NEW Panel options: "Hide Object Names (Edit)" "Hide Object Borders (Edit)" "Hide Object Tips (Edit)" Are useful on panels with hundreds or thousands of objects when heavy manual editing is required and a further speed boosts are needed. They do not impact run.
    The "Hide Object Names" option also avoids having to use !Bang hiding names for object names to be hidden whilst the run is stopped.
    The "Hide Object Tips" option will speed up working with maps in edit mode.


  • NEW The model hierarchy treeview will group portals with similar prefixes which can be very useful when a panel contains hundreds of portals.
    A prefix is delimited by "-" or "_" and the new INI value "Tools/ExplorerMaxPrefixDepth" sets the maximum number of characters before any found delimiter that will be considered a prefix (6 default).
    Grouping is only performed if a given panel contains more portals than INI setting "Tools/ExplorerMinGrouping" (default 32).
  • NEW When a portal context menu is accessed through the model hierarchy, the redundant "Enter Sub-System" option is replaced with a "Locate" option that opens the parent panel and flashes the portal.
  • CHANGE Enter Subsystem / Locate now also appear in module portal context menu
  • CHANGE Include guide lines when locating an object to assist on busy panels.
  • FIX Prevent breakpoint/error dialog offering option to change panel if a model error occurs within a drag handler during which changing panel isn't possible. #5255
  • FIX RepaintObjects now interprets value of 0 as the topmost panel


  • FIX Pipe fill no longer cropped by object rectangle if the object has no icon assigned #5254
  • CHANGE Object context menu also shows index for object #5253
  • FIX Reference errors in views (particularly during startup) assist in locating the view.


  • NEW Added "Update Map Co-ordinates" to multiple selection context menu when the panel contains a Paint Map and multiple objects are selected. This enables bulk updating of object longitude/latitude co-ordinates, based on the screen pixel position of the object.


  • FIX Robustified c# method invoke when parameters are incorrect.
  • NEW PLCLR: Added Int64 and boolean column support
  • FIX PLCLR: More useful errors when invoking a misnamed property
  • FIX PLCLR: Optional parameters

9.17.0 (new model version 790)

  • NEW GenerateUnique() creates a filtered list of an existing table column into another table's first column, with each entry only appearing once. Both Value and Text column types are supported and the output column is reformatted if required for text. Values and text will be sorted as a side effect of this operation, natural order sorting is used for text.
  • FIX DescribeFont() was incorrectly formatted in routine lines
  • NOTE Updated comments for PurgeDuplicateRows() to indicate it does not compare text formatted columns and performance will be poor if a large table contains text formatted columns.
    Optimisations of this operation are possible but it may involve different duplicates being purged (eg: it would not be the first row being retained as is current).


  • FIX If during a CopyPortal() operation an error occured due to an out of scope attribute, and the user was viewing the target panel or navigated to it via the breakpoint dialog, a fault would occur due to the portal paste being incomplete at the time the error was reported (repaint issue).

9.16.0 (model version 789)

  • NEW Routine operation "DescribeFont" returns a comma separated field describing the font for a table column or table cell passed as the data parameter.
    This is formatted as: FontName,Height,Weight,ITalic,Underline,Class where: FontNAme is the font's name Height is the font height in points (72 points per inch) Weight is the boldness, typically 400 is regular, 700 is bold etc. Italic is non zero if the font is italic Underline is non zero if the font is underlined Class is Default, Fixed, Variable.
Example return text:  Gulim,16,700,0,0,Variable
  • FIX Linux version builds

9.15.2 (model version 788)

  • This is development in-progress of new dotNET integration.
  • NEW Planimate can directly reference C# class instance properties and call methods without having to specify a call to PLCLR. Method return values are supported and the new syntax leads to far more readable routine code.
    This works with the new "Instance" format for portal attributes. The routine editor is able to auto-suggest property and method names from a dotNET DLL.
    For example, typing "p.handle." will produce a list of all available methods and properties for the DLL/Class that the portal attribute was configued for (when "Instance" was selected for its format).
    During run, PLCLR:New("dllname","classname") needs to be used to instantiate a dotNET class instance. A future PL version will avoid this repetition.
    Example routine code ( p.myinst is a handle returned by PLCLR:New() ):
    // reading a property r.width = p.myinst.Width
    // reading a text property p.mytext $= p.myinst.SomeTextProperty
    // setting a property p.myinst.BackgroundColor = l._colors[Blue]
    // calling a method p.result = p.myinst.MyMethod(s.Clock,t.mytable[])
    Notice that for setting/getting properties and method return values:
  • * "=" is used for numerical values
  • * "$=" is used for Text
  • * For Values, PLCLR automatically translates Planimate numbers to/from C# double,int,bool,DateTime,Color
  • * values, text, tables, rows, columns and label lists can be used in method parameters and are automatically returned for "ref" types.
  • * LHS of "=' supports just Values and Text at this time.
  • * For method calls to methods that return void, the LHS of the '=' will be set to 0 for '=' and empty string for '$=. It is recommended to use s.NullAttribute in such cases and a future version may make the return value optional.
  • NEW Unit format: "Instance" for use with C# classes and the PLCLR DLL. The underlying value is a number, used to store the instance handle (as returned by PLCLR:New(). The dll/class name is stored as text in the attribute and can be accessed using $= if required.
  • NEW The dotNET API (PLEngine) now provides Resizetable() and uses it in SetFromDataTable() so you don't have to prepare the Planimate table rows beforehand.
  • NEW PL-As-A-DLL API added PL_ValueToARGB which is like PL_ValueToColor except it returns an ARGB (32 bit unsigned) instead of #AARRGGBB text.
  • NEW The PLCLR dotNET interface now supports new automatic translations from Planimate numbers when passed as values, either as method parameters, or used with dotNET properties.
    A value sent/received to a DateTime is assumed to be a Planimate calendar time and the calendar time translations are automatically handled.
    A value sent/received from a C# Color is assumed to be a Planimate color (both colour index and ARGB forms are supported).
    This eliminates C# code having to call PLEngine to do the translation, and is extremely useful in interfacing C# properties directly to Planimate.
  • FIX System close and (if active) Test Finish broadcasts were not being sent if a Stop All / Close Exit was used to stop the run. (since 9.12.1).
  • CLEAN Merged redundant string list code
  • SPEED Resizing tables with text columns with more than several hundred thousand rows was inefficiently handled.

9.14.0 (model version unchanged)

  • FIX Table column horizontal scroll was incorrectly calculating the last visible column in cases where narrower columns followed wider columns, causing scrolling horizontally to be inconsistent.
  • NEW Added date/time offset system attribute and format unit classifier API to PL-as-DLL (and dotNET) API (v9).


  • FIX Paint Windows (used to embed dotNet controls and windows) now position correctly when used in a viewport with anchoring.
  • FIX Time scaling run mode now brings display up to date every update interval.
  • CHANGE Remove the tone after a break/stop dialog


  • FIX Any brackets not shown in expressions with multiple divides causing the expression to be incorrectly interpreted if subsequently textually edited or copy/pasted.
  • FIX Breakpoint dialog showing warning first if the panel it was on processed visibility broadcasts and the breakpoint occured during an advance to time.


  • CHANGE Adjusted vector grow thresholds (improve memory usage for table columns).

9.13.0 (model version 787)

  • NEW Tables have option (Advanced) to send a broadcast when their size crosses a predetermined threshold. This is useful for log tables as it can be used to append the log to a file and clear the table. The broadcast includes _panel, _dataid and _rows (new number of rows).


  • FIX Fix sensor entry unblock to be compatible with new routine handling.
  • SPEED Some optimisations to multiserver capacity change unblock handler
  • SPEED Constantify simulator visibility in Linux version


  • FIX Improve how Planimate breaks out of multiple recursed routines when a model error occurs and the modeller selects to "stay paused". in the run stop dialog.


  • CHANGE Reworded the "System Error" dialog to be somewhat clearer that the error being reported should not be ignored. Only one error is now reported for a given session.
  • CLEAN Rewrite routine processing and error handling (extensive)
  • CLEAN Internal rename of system error labels
  • FIX Sub-routine now have access to owner object context which enables broadcasting from a subroutine.
  • CLEAN Internal clean up (tail handler, engine state, item attributes) Renames


  • NEW Added more profiling
  • NEW Added logging of table tuple cache clear
  • FIX PL_GetCellFormatted() API fixed


  • FIX A hitherto rare condition in the Planimate Application stream compressor which resulted in it making a PBA which reported an error on load (integrity checks were being triggered).
    The issue was precipitated by large data tables which could not be further compressed.
  • NEW Bumped PLAsDLL to version 8, added PL_GetCellFormatted.


  • FIX Forcing an unblock restart or a train moving during unblock would miss re-testing the first train in FIFO order mode.
  • FIX Efficiently handle recursing change object subroutines.
  • CHANGE PL DLL API adding ValueToColor()

9.11.0 (Model version 786)

  • NEW Track roads support directly setting the section running time. If a road determines s.ItemTrackForwardColumn or s.ItemTrack ReverseColumn (as needed by train direction) is zero, it will use s.TrackSectionNominalTime for the running time, instead of looking up the SRT table and setting this system attribute, as happens currently.
    The system attribute can be set any time before an item enters a track road, it is read as the item enters the road.
    To avoid potential confusion, it is recommended that models avoid mixing use of SRT and directly set running times.
  • CHANGE More detailed time profiling for linear search, internal renames and minor performance improvements.

9.10.0 (model version unchanged)

  • CLEAN Reference and routine processing code Rename attribute reference related classes Temporary strings managed using stack object
  • CLEAN Linear search, reference to integer conversion Internal cleanup for future re-architecting plans.
  • REMOVE Exported functions when compiling EXE (still present for DLL)


  • FIX Case where an "items created vs. items destroyed" mismatch was erronously reported if a Restart Dispatcher was hit upon by multiple items.
  • CHANGE Planimate now loads a couple of multimedia libraries as-needed (used for Beep() and Paint-Video Objects). This simplifies running Planimate on Windows Server which may not include the DLLs concerned.
  • SPEED Clean up string handling in expressions and the item recycler.

9.9.0 (model version 785)

  • REMOVE Mapper "Limit Action" option on tables. RemapValue() now always clamps to end points
  • REMOVE Obsolete save data properties in MDL when saving tables.
  • SPEED Optimise RemapValue()
  • CLEAN Clean up table dependency update of views.
  • CHANGE The Table cell change callback (to dotNET) now sends the table's dimensions (rows/columns) in r/c for the TCC_RESIZED case. This avoids a couple of callbacks to find out how the table resized.
  • FIX FilesInFolder() and FilesInHierarchy() work under Linux. Note path slashes returned will be "/", input of "\" is Ok.
  • FIX Problematic quotes in the routine definition table (appeared in some routine operation comments).

9.8.0 (model version 784)

  • NEW Command line option /MONITORTARGET and /MONITORINTERVAL enable a UDP endpoint to be specifed for remote monitoring of run progress. The default interval is 5 seconds.
  • NEW Debug log files now always end with "ExitCode:" line which reflects the return code for the process.
  • FIX Time format YYYYMMDDhhmmss was missing the seconds on display. IF you depended on the missing seconds, please advise InterDynamics and a new format will be added.
  • REMOVE /DEBUGPORT, /DEBUGIP command line options.
  • REMOVE /BATCHTIMEOUT command line option, capability is now redundant.
  • REMOVE TCP/IP Sockets / broadcast link This capability is better implemented as a dotNET DLL, Please contact InterDynamics for support on this.
  • REMOVE Clean up diagnostic messages in debug file on first model load.
  • CLEAN Command line path handling
  • CLEAN Internal rewrite of formatting code buffer handling to enable it being called by multiple threads.
  • CLEAN Removed old TCP/IP and threading code
  • CLEAN Debug file handling (works as well as default stdout in Linux)


  • NEW Include more diagnostics in Planimate.dbg
  • CHANGE Modeless Stop/Breakpoint dialog still stays on top


  • NEW Command line option "/RANDOMSEEDOFFSET" shifts the master random seed of all runs in a session. For example: Planimate.EXE /RANDOMSEEDOFFSET=5 will run by default as if the random seed was 5+1 = 6. If the model used s.RandomSeedOnRestart=100, the model would run as if the random seed is 5+100 = 105.
    This offset is transparent to the model and is intended for use by the Cloud Run System so it can perform different runs on any model without the model needing any alteration.

9.6.0 (model version 783)

  • REMOVE DLL CODE: TableColumnInfo "option_bits" property, used with PL_GetColumnInfo and PL_SetColumnInfo, is no longer supported. (the plaform ignores SCI_OPTIONBITS in the callback).
    This is due to new method of managing table column options.
    Existing DLLs will run but not read or impact table column options. Future PLDLL releases will rename these fields.
    Contact InterDynamics if you require a DLL to manipulat Table Column options.
  • CHANGE Rewrote the way Table View and Table Column options are stored. The settings editor handles them in a different way.
  • NEW Table Column Option "Exclude From Clipboard In User Mode" will prevent a column being copied for all copy operations. This is useful to prevent certain columns being copied out of a table even though you want the column to show in a view.
  • NEW Table view option "Context 'Copy All' Copies Column Titles" makes "Copy All" from the context menu on a cell click also copy column titles;
  • NEW Table view options "Only Show Copy Options In User Mode" only shows "Copy All" or "Copy Selection" in table view context menus.
  • CHANGE Refactored setting editor to support non graphical object owners. Renamed internal labels for model options
  • FIX Linux version compiles, now a non-static build so it cal call DLLs.
  • FIX Linux version reports item details on a model error. As a NEED_FOR_SPEED build, however, it does not have access to the full call context.

9.5.0 (model version 782)

  • NEW s.PanelWindowX / s.PanelWindowY return the top left co-ordinate of a popup (or main window) associated with the first found parent panel. (-9999,-9999) is returned ir no panel found.

9.4.0 (model version 781)

  • CHANGE RunCommand() routine operation now returns a different error code. Use Edit/Find to see if this impacts your model.
    Value -1 is now returned if the command could not be executed (used to be 1).
    If the "Use Shell" option is set, 0 is returned on success (as before).
    Otherwise, for successful execution of a non "Use Shell" program, the program's return value is now returned. Typically this is zero but some tools will use specific non zero values to signal things.
    Generally existing code should be fine if you compare against zero to detect an error.


  • NEW Debug option "Modeless Stop/Breakpoint Dialog" enables panels to be changed and change objects to be opened on panels whilst the error stop / breakpoint dialog is open.
    The stop/breakpoint dialog becomes floating so you may need to Alt-Tab if it becomes hidden behind the main panel.
    System broadcasts such as panel open are suppressed whilst navigating with this option, as are button clicks. Hence map zoom/pan navigation is not possible in this interrupted state.
    Other unexpected actions may lead to a segfault - please report.


  • NEW Ctrl-click on a track for modellers overrides click broadcasts
  • FIX No longer auto-save mid-run when routine editor closed


  • NEW Ctrl-click on a spatial link for modellers overrides click broadcasts
  • FIX Don't flag error if loading multiple images using @XX notation if the model does not have a DB (since it will inevitably fail a load after the last image in the sequence).
  • NOTE Internal project file clean up (lib order same, obsolete header folder for some build combinations. Changed sha256 implementation used.


  • FIX Fix some cases where a non zero PBA key sub code could cause problems

9.2.0 (model version 780)

  • NEW RealTimeCallback() now supports an object/panel reference to limit the broadcast receiver scope. This enables multiple independent real time callback events to be simultaneously scheduled, so long as they are scoped to different panels. This is useful when adding animations to models that will continue to work in paused mode.
    A Panel value of zero makes the callback broadcast global as in previous versions.
    Do not dynamically delete portals that are the target of a pending real time broadcast callback..
  • CLEAN Internal cleanups (size_t format)


  • NEW Panel / PopUp option "No Scroll Bars" creates a popup window which will not show scroll bars nor incorporate them in sizing calculations.
  • FIX Override higher default minimum window size constraint imposed by window manager on high DPI screens even when the application is being scaled up (seems a Windows bug).
  • FIX Font scaling calculation as manifested in "Advance To Time" from 9.1.0
  • FIX Zoom calculation potential math overflow case
  • FIX Hour/minute time format was incorrectly rounding times in cases where there were seconds >= 30 and the minute was 59.

9.1.0 (model version 779)

  • NEW GetCellXY() enables the window co-ordinate of a given corner of a visible table cell (as returned in _view_row and _view_col by a cell click broadcast) to be determined.
    This is returned in co-ordinates that can be used to show a popup, based on 0,0 being the top left of the main window active panel area.
  • SPEED Have rewritten transformation from panel to window co-ordiantes to use integer math when applying Planimate's panel zoom settings.
  • SPEED Now using VS2017. 64 bit version slightly faster, 32 bit more so.
  • CLEAN Cleaned up a few x64 mode Win32 API call niggles picked up by VS2017

9.0.0 (model version 778)

  • NEW Column setting "Input Character Limit" enables a modeller to impose a character limit to Text formatted columns when the Edit With Field option is used.

egion after testing and documentation is complete.