ReleaseNotes:Planimate 9.x Release Notes: Difference between revisions

From Planimate Knowledge Base
Jump to navigation Jump to search
No edit summary
No edit summary
Line 633: Line 633:
* '''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.<BR/>
* '''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.<BR/>


=== 8.99.3 ===
egion after testing and documentation is complete.<BR/>
* '''FIX''' A missing interlock was causing text formatted data views using the "Edit With Field" option to cause popup panels with the "Auto Close When Focus Lost" option selected to close when a user attempted to edit the text.<BR/>


* '''CHANGE''' Internal rework of system attribute definitions.
The definitions now  generate the wiki page:
https://wiki.planimate.com/System_Attribute<BR/> I briefly reviewed and reworded every description. Feel free to suggest any fixes or clarifications to me so I can incorporate them, don't edit the wiki page.<BR/>
=== 8.99.2 ===
* '''FIX''' Quoted relative times of the form "12:00" in routine code were (unexpectedly) being accepted as valid dates by the Windows (OS Date/Time) unit format.<BR/> The PL autoparser has been changed to test/try a time-only parse first in cases where an arbitrary/unknown format string contains ":" or the m/h/d/w suffixes.<BR/>
* '''FIX''' Pasting a relative time like "12:00" into a table cell formatted for a calendar time would result in a large negative time offset, for the same reason as above.<BR/> In this case the expected format class (ie:date) IS known so an additional check has been added to treat dates returned by the OS Date/Time parser as errors if they are before 1-Jan-1968 (an internal time epoch).<BR/>
* '''FIX''' Cleanup broadcast send in panel code during system startup and added batch system broadcast logs for diagnositcs.<BR/>
* '''FIX''' Handle start model for _test_finish broadcast properly in Linux build.<BR/>
* '''FIX''' Minor string niggles, as elicited by gcc.<BR/>
=== 8.99.1 ===
* '''SPEED''' Prevent unnecesary re-draw where a table filter is shown, the "Re-Apply Filter On Changes" option is selected and a cell is changed in a column that does not impact the current filter configuration.<BR/>
* '''SPEED''' Images used in table cells are now kept cached to speed up table display. They were previously being reloaded every instance.<BR/>
=== 8.99.0 (model version 777) ===
* '''NEW''' BringToFront() operation brings an already open popup window to the front in the window z-order.<BR/>
=== 8.98.1 ===
* '''NEW''' Item class option "Center Info Panel Text"<BR/>
* '''FIX''' Ctrl-A in multi-line fields<BR/>
* '''FIX''' Error in error message in slippy remote tile fetch thread<BR/>
=== 8.98.0 (new model version 776) ===
* '''NEW''' SignFile() enables files to be signed.<BR/>
* '''NEW''' Model Option EndUser / "Don't Show The Main Window (PBA)" prevents the main window being shown.<BR/>
* '''NEW''' NoDelimit _fileoption now enables reading entire text files into a single Text formatted column.<BR/>
* '''FIX''' Text routine attributes display in routine editor menu<BR/>
=== 8.97.2 ===
* '''NEW''' The platform and tools now support applications being delivered with time limited keys which can subsequently be easily upgraded by the user.<BR/>
* '''NEW''' Planimate now searches for license KEY files as follows in the order given:<BR/> For modellers: 1) \Users\username\AppData\Roaming\InterDynamics\Planimate\_PL_KEY.KEY 2) \ProgramData\InterDynamics\Planimate\_PL_KEY.KEY 3) EXE Folder\_PL_KEY.KEY<BR/> For compiled applications: 1) \Users\username\AppData\Roaming\PlanimateAppKeys\appname\PL_APP.KEY 2) \ProgramData\PlanimateAppKeys\appname\PL_APP.KEY 3) EXE Folder\PL_APP.KEY<BR/> where: 'username' is the user profile name of the current user 'appname' is the Application Name used when creating the PBA (must be set to a valid filename and the PBA compiled to require an external key).<BR/> The first key found in the order given is used.<BR/> This is useful because it enables Planimate/compiled applications to ship with a demonstration key which gets installed in the same directory as the EXE, then an end user can subsequently purchase an upgrade license which the platform will install for them without needing administrative rights.<BR/> The platform always uses option 1) when the user selects/pastes a key.<BR/> Option 2) is provided for administrators who want to create an "all user" installation by copying the key manually. Future versions of keys may automate this.<BR/> Previous versions used to search option 3) first for both Planimate and compiled applications.<BR/>
=== 8.97.1 ===
* '''FIX''' Default file name now appropriate for PL vs PL PBA when browsing for a key file.<BR/>
* '''FIX''' Gantt Drag Handler was using editing snap grid<BR/>
=== 8.97.0 (new model version 775) ===
* '''NEW''' Routine operation "InfoPanelRemote()" enables remotely changing an item's show/hide info panel status<BR/>
* '''NEW''' Routine operation "BrowseKey()" enables a model to trigger the user selecting a key file. This is useful for PBAs in conjunction with the s.KeyFlags variable. The new key file selected is copied to _PL_APP.KEY and placed in the same folder as the PBA EXE.<BR/> Note if the application is installed in Program Files, write access is not normally available to users.<BR/>
* '''NEW''' s.KeyFlags gives access to license key flags (for PBA)<BR/>
* '''NEW''' Activation code dialog has "Paste Clipboard Text" button<BR/>
* '''NEW''' A PL PBA needing an external key now enables the user to browse/
paste it.  At this stage this is only useful if the PBA is
running from a folder the user can write to.<BR/>
=== 8.96.2 ===
* '''FIX''' Activation code dialog fixed<BR/>
=== 8.96.1 ===
* '''FIX''' Pipe hourly rate not set when transfer on stop option used and multiple parameters changed as pipe stopped.<BR/>
=== 8.96.0 (model version 774) ===
* '''NEW''' Platform INI setting Edit/BackupFolder sets the folder where backups are placed when saving/autosaving. This can be a relative or absolute path, eg: "Backups" uses a folder in model directory, "D:\TEMP\Backups" uses a fixed folder no matter where the model is.<BR/>
* '''CHANGE''' Removed the "Inherit" option from CopyPaint() as the previous default of 1 would cause unnecessary errors when updating older models that used CopyPaint.<BR/>
* '''NEW''' Now support pasting license code as text when PL/PL applications first run or a new key is selected (Help menu). A button enables use of a KEY file if you already have one.<BR/> In the near future key files will be distributed in emails as copy/pasteable "activation codes".<BR/>
=== 8.95.0 (new model version 773) ===
* '''NEW''' Routine operation FollowItemRemote() enables item follow broadcasts to be initiated for another item (eg: one on a spatial link)<BR/>
* '''CHANGE''' After selecting a font in a multi-state button, it gives option to apply that font to all states.<BR/>
* '''FIX''' Graph scale interval calculation repetition fixed for:
- integer unit formats
- formats that hide seconds (minutes shown)<BR/>
=== 8.94.0 (new model version 772) ===
* '''REMOVE''' Paint inheritance removed because
- its not designed/compatible with the group anchoring / layout system
- modern UI is to have a single instance of the buttons and a viewport
that "roams" through inputs/outputs panels.<BR/> Existing models using it will load fine, the paint objects will be made independent and no longer follow changes to their old parent.<BR/> Routine calls to InheritPaintObjects() and DeleteInheritedPaintObjects() will result in an error during run. CopyPaint() will give an error IF the "Inherit The Copy" option is set. You might want to use "Find" to check for these.<BR/> If a model relied on referencing the paint object ID of a parent to an inherited paint object, it will need rework (uncommon).<BR/>
* '''NEW''' Double clicking the status bar "Activity" area (to the left of the item icon/status block) now toggles bettween end user / edit modes if the user has edit ability.<BR/>
* '''FIX''' The graph "Y Zero Line", if enabled, is now drawn above the graph instead of under it. This fixes vertical bars clobbering it.<BR/>
* '''FIX''' Entry name display when the broadcast name ends with a number<BR/>
* '''FIX''' Spatial links viewed as pipes were broken<BR/>
=== 8.93.6 ===
* '''CHANGE''' Setting paint property ViewOrder now accepts < 1 as first and > the number of paint objects as last. Previously out of range values were ignored.<BR/>
* '''CHANGE''' For new multiservers, option "Animate Item To Road Start" is on by default to reduce confusion if "Show As Road" is subsequently selected without an update interval ("why is item appearing to be stuck").<BR/>
=== 8.93.5 ===
* '''NEW''' Broadcast Entries show the name of the broadcast above them if it does not match the object name (beyond spaces equal to underscores and removing trailing numbers).<BR/> This is useful where name filtering is also used since both the broadcast and the object name (the filter) are now visible.<BR/>
* '''FIX''' Item info panel tips displayed item ID if first item attribute was selected. Also now manage memory more efficiently.<BR/>
* '''FIX''' Selecting an icon for a new unsaved model would cause a seg fault<BR/>
* '''FIX''' Prevent graphical issues if item road is beyond spatial link road<BR/>
* '''FIX''' The optional Road parameter in SetItemLinkTarget was out by one.<BR/>
* '''CHANGE''' SetItemTransitTarget and SetItemTransitTime have been renamed to SetItemLinkTarget and SetItemLinkTime respectively (really this time). This ensures they come up when "Link" is typed in the routine operation selector. Note that SetItemLinkTime is unnecessary given SetItemLinkTarget can set the link target, the time and the road.<BR/>
=== 8.93.4 ===
* '''FIX''' Pipes with bendpoints ratio cache initialisation leading to display (but not simulate results) errors.<BR/>
=== 8.93.3 ===
* '''CHANGE''' RepaintPaintObject() now regenerates viewport window, useful to reflect code-based changes in viewport paint object position which are not propagated to the viewport window by normal repaints.<BR/>
=== 8.93.2 ===
* '''NEW''' CreateTiles updates the status bar with progress and polls Windows events to prevent Planimate being reported as non responsive.<BR/>
=== 8.93.1 ===
* '''FIX''' Decision logic for "Terminate Run" in model error dialog was preventing it appearing for breakpoints.<BR/>
* '''FIX''' Vertical Bar graph plots would not show border if it was palette index 0 (ie: Black).<BR/>
=== 8.93.0 (new model version 771) ===
* '''NEW''' Text view properties for graph settings supported in SetViewProperty() enabling graph XTitle, YTitle and YTitleRHS to be set.<BR/>
=== 8.92.0 (new model version 770) ===
* '''NEW''' SetItemTransitTarget and SetItemTransitTime have been renamed to SetItemLinkTarget and SetItemLinkTime respectively.<BR/> SetItemLinkTarget now supports specifying the time and road to use as parameters (0 values ignored) and it supports lookahead meaning no capacity is needed before a portal exit if the routine assigns a spatial link in lookahead. A capacity is still needed if the routine assigning the target is "Only during move"<BR/>
* '''FIX''' Table cell combo when Dynamic list with No Add broke in 8.91.2<BR/>
=== 8.91.3 ===
* '''CHANGE''' For model editors, the "Pause" context menu is now shown when the "Buttons Clickable While Running" option is selected and the background of a panel is context clicked.<BR/>
* '''CHANGE''' Model option "Buttons Clickable While Running" is now on by default for new models.<BR/>
=== 8.91.2 ===
* '''FIX''' Enable selection of "None" for panel object / object name fill colours<BR/>
=== 8.91.1 ===
* '''FIX''' Combo field changes, don't drop down empty list, no single line combo option only applies if the combo is "user no add" as well.<BR/>
=== 8.91.0 (new model version 769) ===
* '''NEW''' System attributes s.DataErrorRow and s.DataErrorColumn are set when ReadFromFile() with a table fails and would have normally displayed a cell error (eg: bad format).<BR/> The ContinueOnError option is not recommended when using these as any subsequent errors overwrite the first. You can perform a second read of the file with ContinueOnError if required subsequent to an error being detected/reported.<BR/> Note these are not used for paste / import into view operations<BR/>
* '''NEW''' Panel popup option "Close Timeout If No MouseEnter" Useful when using hovering to pop up panels, providing an auto close if the mouse does not enter the popup after it leaves the hotspot (which should normally be adjacent/under where the popup appears). Should be used with Capture Mouse On Open and Close On Mouse Exit, other usage contexts are untested.<BR/>
* '''FIX''' Hover events were not being sent after a panel click due to the test for mouse down which blocks hovers depending on something that intentionally doesn't get reset on a mouse up.<BR/>
* '''FIX''' Stricter about when Paint Buttons process a click when they have no button action, now require 2 or more states and a hover or mouse down state.<BR/>
* '''FIX''' Paint object hit testing was too generous. Refactored the hit test code and moved complexity out of base class.<BR/>
=== 8.90.1 ===
* '''NEW''' Can open parent routine of a subroutine from the subroutine window<BR/>
* '''FIX''' Paint Image objects (not Buttons) were painting in an area one pixel too small. In previous versions this only affected PNG, GIF and JPG but became apparent for BMP as well since version 8.88.<BR/>
=== 8.90.0 (new model version 768) ===
* '''NEW''' Date/Time formats without seconds: "Calendar Mmm D Y hh:mm" "Calendar YYYY-MM-DD hh:mm"<BR/>
* '''NEW''' Model option Formatting / "Strict Date Import (No Hidden Fields)" By default when a datetime was pasted into a cell formatted for one of the calendar date-time modes, all the data was preserved, even if the cell was formatted for a date with no seconds.<BR/> Enabling this option will zero such extra data when pasting in data copied either from within Planimate or an external application.<BR/>
* '''CHANGE''' Have defaulted the platform font to "Arial" in the INI setting Display/SystemFontName. If you are on version 8.88 or later it does not change your setting.<BR/>
* '''FIX''' The default palette entry  #149 (PanelText) was blue, changed to black. Older models loaded with previous recent releases will have the blue and can be fixed using Settings / Colour Palette.<BR/>
=== 8.89.2 ===
* '''FIX''' Incorrect object name / background colours when loading older models. Note object text colour uses the Role colour for this purpose. IF an older model has already been saved then you will need to edit panel properties to change the colours.<BR/>
=== 8.89.1 ===
* '''FIX''' Paint button issues:
- Broadcast option editing
- Show existing text when editing button text
- Empty text allowed for paint button<BR/>
* '''FIX''' SetBendPoints() now updates internal ratios (spatial links only) instead of expecting a subsequent repaint. This works around an advance-to-time with viewport showing a map issue.<BR/>
=== 8.89.0 (new model version) ===
* '''NEW''' Table editor row option "Minimum Row Height Pixels" enables a lower limit on table row height. This is useful when graphics are being used in a table cell.<BR/>
* '''FIX''' A panel with group anchored objects can now have its minimum size increased, with the layout updated. This is useful if a modeller wants to use a bigger base panel size and retain an existing layout.<BR/>
* '''CHANGE''' Planimate is using a new source repository and the tag version is shown in the version number in the about box.<BR/>
* '''FIX''' Click handling for Paint objects (impacted Paint Map)<BR/>
=== 8.88.0 (new model version) ===
* '''NEW''' GetSharedAppDataName() is like GetAppDataName() but creates/returns the shared application data folder. This is used by installers when an "All USers" installation is done and typically is a path like "c:\ProgramData\Folder"<BR/> CHANGE GetProgramName(),GetAppDataName() and GetMyDocumentsName() and the new GetSharedAppDataName() now support the target attribute being text formatted, in which case the attribute is set to the path instead of setting s.LastAccessedDataFilePath and returning numericsuccess code.<BR/> In this case if there is a failure, an empty string is returned.<BR/>
* '''CHANGE''' The default panel width / height [Panels] section in INI options has been changed from 1016x672 to 1600x940. This will not affect existing settings.<BR/>
* '''NEW''' Expression functions GetColorA(), GetColorR(), GetColorG() and GetColorB() extract the colour components (from 0 to 255) of either an AARRGGBB value or a colour palette index.<BR/>
* '''NEW''' Paint button states are now a fly-out of the button context menu instead of a separate popupmenu.<BR/>
* '''NEW''' Dialog to change the text of a paint button state now has a checkbox to apply the change to all paint states.<BR/>
* '''NEW''' Table column option "Label Exclude Zero Label" excludes the zero index label from a drop down combo, useful for the "not set" case which you still want to display in the cell.<BR/>
* '''NEW''' Tool tips on colour samples in Graphics Properties and Colour Palettes include the ARGB code for the colour and name/colour index if its a colour index.<BR/>
* '''NEW''' Planimate now defaults to "Segoe UI" font instead of "Arial". Existing models are unaffected but will get the new font if fonts are reset in the Settings / Fonts dialog.<BR/>
* '''NEW''' INI option Display/SystemFontName sets the platform font. From this version the default is "Segoe UI", previous versions used "Arial".<BR/>
* '''CHANGE''' Have extended the Planimate colour palette / "_colors" label list. Entries from index 128 are reserved for Planimate and will be used to support theming for default buttons/views etc. These new palette entries are called "roles" as they serve as a reference to a colour for a specific task (eg: button border colour) rather than a specific colour.<BR/> Existing models will not be affected as the previous palette defaults are not changed. the new labels are automatically merged when loading a pre 8.88 model but from then on, modellers can customise the role colours as they want, configure newly added objects not to use them etc.<BR/> Note that Panel Background and Panel Text colour (for newly added panels) have a slot in the palette allocated to them but you will need to edit your existing Planimate.INI (Platform/INI options) to make use of them. Newly created Planimate.INI will use the new indexes instead of the default hard coded black and light grey colours as used in previous versions.<BR/>
* '''CHANGE''' The colour picker and Palette Editor have been updated to support the larger palette size. The default field is now the ARGB enabling hex codes to be quckly entered/pasted when needed.<BR/>
* '''NEW''' New paint buttons now default to having 3 states (Default, hovered and mouse-down) with colours defaulted to use the appropriate palette role colours for easy theming.<BR/>
* '''NEW''' Newly added Attribute/Cell views, Graph Views and Table Views now default to using the palette role colours allocated for them. Note that only the most basic default colours are set (as in previous versions) and modellers can still override and set other colour
properties specifically (the 64  extra palette slots that modellers now
can use will come in handy for this).<BR/>
* '''RENAME''' The "With Item Info" label in Broadcast() routine operations is now "Broadcast Options" and the description has been updated to indicate its a number of options from the _broadcastoptions label list. #5129<BR/>
* '''NEW''' Internal support for labellist default initialisers for routine parameters. This allows routine operations to have more useful defaults for parameters, when the definitions get to being updated.<BR/>
* '''CHANGE''' Paint Image objects no longer treat "Planimate Grey" (#BCBCBC) as transparent for BMP files (due to removal of old code).<BR/> You can convert the BMPs to PNGs if transparency is desired for Paint Image objects.<BR/> This does not affect Paint Buttons or Object/Item icons using BMPs with PL Grey transparency as such images are handled differently.<BR/>
* '''REMOVE''' No longer support ancient 256 colour (palettised) video card modes.<BR/>
* '''FIX''' Set model changed flag when palette edited from menubar<BR/>
* '''FIX''' Colour selection from the settings editor now includes colour labels<BR/>
* '''FIX''' Clicking in the treeview during a run then pressing Escape then another key would cause a segfault due to a default handler behavour when the treeview is disabled during simulate.<BR/>
* '''FIX''' column properties for text and background colour were not proerly handling AARRGGBB colours<BR/>
* '''FIX''' The list that pops up to autocomplete expression functions no longer locks open unless it was explicitly opened using CTRL-F or a DLL call is being entered. In the latter cases, Esc closes the list.<BR/>
=== 8.87.1 ===
* '''CHANGE''' InsertColumn() / AppendColumn() change in behaviour when a table has no columns and a template column with rows from another table is used.<BR/> In previous versions the new column would get all the rows from the template column IF the target table had no columns, which is inconsistent to inserting a column with existing columns but no rows.<BR/> They no longer populate rows in this case, leaving the table with column(s) but no rows.<BR/> Unchanged: If the target table does already have rows, as many rows as possible or available (whichever is smaller) in the template column are copied into the target table.<BR/>
* '''NEW''' Snap To Grid alignment context menu option (for multiple selected objects) applies the current drag snap crid to each object in the selection.<BR/>
* '''NEW''' Added filter to system tuple list (adding attributes for broadcast)<BR/>
* '''NEW''' Added filter to "All Label Lists" list, broadcast sources etc. #5079<BR/>
* '''NEW''' Option in panel context menu "Make This The Top Level Panel". It only appears when the Advanced Editing option is enabled AND Ctrl-Clicking the panel background.<BR/> This delete's the owning portal of the current panel and makes the panel the topmost panel. The existing top panel becomes a portal. This will likely create out of scope data issues and will lead to worse problems if used with a panel using local item classes defined outside of it.<BR/>
* '''FIX''' Out by one pixel in graph area clip prevented thin lines at y co-ord 0. Prevent vertical bars at zero drawing anything.<BR/>
* '''FIX''' Proximity test for distance to line for log driven graph<BR/>
* '''FIX''' When a modelling error occurs during processing a real time (eg: hover) or delicate (eg: panel transition) event, the error handler no longer attempts to stop the run since stopping the engine at that time does guarantee a stop - via a segfault.<BR/>
=== 8.87.0 (new model version 765) ===
* '''NEW''' Spatial Links and Tracks support per-road bend points. Bend points can either bend the entire set of roads (in a spaced way as in previous versions) or, now, one or more specific roads. In this case the roads(s) allocated to the bend point pass through it.<BR/> In Edir mode, the context click on a road menu now adds a road specific bend point. Its affinity can be changed by context clicking it.<BR/> Up to 8 roads are supported. This may change someday.<BR/> Using road specific bend points avoids the graphical anomolies that occur with sharp bends and bend points not assigned to any roads (ie: previous version bend points).<BR/> If one reduces the number ofg roads on a link with road specific bend points, abandoned bend points will linger which cannot be clicked until the number of roads on the link is increased or bend points are regenerated from a bend point table with correct bned point road data.<BR/> This feature is primarily intended for data driven spatial link layouts on a map although the train noodlifier has been updated to support per-road bend points and appears to work.<BR/>
* '''NEW''' Bendpoint table (used with Map) supports additional column "_roadbits" which needs to be present if you intend to support road specific bends. The values in this column are treated as a bit field:
value 0:  bend point shifts all roads (keeping them spaced) as in
previous versions.
value 1:  bend point directly positions road #1, otherwise ignored.
value 2:  bend point directly positions road #2, otherwise ignored.
value 4:  bend point directly positions road #3, otherwise ignored
value 8:  bend point directly positions road #4, .....<BR/> Values can be added, eg: "6" apples the bendpoint to roads 2 and 3. To calculate bit from road number, use: pow2(i._road-1) for cases when i._road is 1,2,3 etc.<BR/> For a single road link a value of 0 or 1 are equivalent but will have very different behaviour if the link roads is changed.<BR/> Note that a bendpoint update without the _roadbits column will lose all road specific details for bendpoints.<BR/>
* '''NEW''' Link Click broadcast now includes "_road", the road number that was clicked, a value from 1 to the number of roads for that link/track. This value should be used when updating bendpoint tables but take note of the bitmasking used in bendpoint tables.<BR/> The closest road to the click is returned.<BR/>
* '''CHANGE''' When bend point markers are visible, they now register a hover cursor change. This may be made optional in a future version.<BR/>
* '''NEW''' SetMenuBar() depth value of -1 causes rows to be ignored in the menubar table until a row with depth 0 is encountered. This reduces table bashing when using context specific menubar items. #5084<BR/>
* '''REMOVE''' Removed train car display mode. Existing references to select it via s.TrainCarMode will generate a model error.<BR/>
* '''FIX''' Dialog data reference editing<BR/>
=== 8.86.0 (new model version 764) ===
* '''NEW''' Dialog() routine operation text fields now support references so they can use text expressions, include dynamic text/value data
in the dialog etc.  #4083<BR/>
* '''FIX''' A few cleanups to the Dialog() editor and added a Close button option<BR/>
* '''NOTE''' Dialog() is being retained given it was possible to make it routine text copy/pasteable (as mentioned in PL 8.0.0 notes)<BR/>
=== 8.85.1 ===
* '''FIX''' Internal refactoring of mouse event handling to make Planimate more responsibe to simultaneous rapid mouse movement and clicking especially on maps.<BR/> The changes were widespread but simple and included internal renames and cleanup of handlers for the different edit/user modes.<BR/> This version remains compatible with 8.85.0, please report anomolies.<BR/>
* '''FIX''' Wrong version number in release notes 8.85.0.<BR/>
=== 8.85.0 ===
* '''NEW''' The broadcast from a routine operations now supports a new option for the "With Item" field: bit 4: send immediate: causes the broadcast to send immediately instead of being deferred until the item leaves the change object and reaches a point of capacity. #5080<BR/> This is like an immediate message but broadcasts are never sent in lookahead. This is experimental and the option should be used only when a dispatcher or deferring the broadcast is really impractical.<BR/> New label list "_broadcastOptions" enumerates broadcast options and they can be combined using "|".<BR/> The code for the various broadcasting routine operations has been internally merged but the operations are kept distinct as their name distinguishes their behaviour and scope.<BR/> A subtle difference which will not affect existing models is that for BroadcastToPanel() and BroadcastScoped(), if the subsystem ID is 0, the root panel is used if there is no object label at 0. Past versions would treat zero as an error in this case.<BR/> Having a change object receive an item as a result of it sending an immediate broadcast is not supported.<BR/>
* '''NEW''' Log Driven Graph configuration table "_barcount" enables auto-fit of vertical bars if used in conjunction with a -ve width value (must also be in same configuration table) for the overlay. This implements the same capability as auto-sized vertical bars as released in 8.74.0.<BR/>
* '''NEW''' DragIcon() routine operation enables an end user to position an arbitrary icon image. The starting panel x/y co-ordinates are passed via attributes or table cells which will be updated with the final position.<BR/> The icon name can include icon overlay commands.<BR/> This is useful where things are positionable by end users and avoids having to create a portal and track clicks on it.<BR/>
* '''NEW''' Link click broadcast now includes: "_bendpoint" is 0 if the click is on the link before any bend point is >0 bend point number if the click is on a bend point (1..n) is <0 bend point number if the click is on the link after a bend point.<BR/> "_bendtablerow" is set to the row number in the bend table (if any) for the associated bend point. Its set to the first row if the click is before the first bend point. It will be 0 if no map paint object, no bend table associated or the bend table does not contain the columns nor there is a row in the table matching the from/to locations. Only one spatial link in a given direction between locations is supported.<BR/> "_dragged" is set if: 1) the new panel option "Broadcast Spatial Link Handle Drag" is set
and a bendpoint was dragged  OR
2) If that panel option is not set and the user is dragging an
existing bend point (in which case the mouse is still down and you
can go straight to DragIcon() if you want to control the drag image).<BR/> In cases where a bend point is clicked/dragged, "_x" and "_y" are set to the panel co-ordinate of that bend point.<BR/>
* '''NEW''' Panel option "Broadcast Spatial Link Handle Drag" When used along with "Broadcast Spatial Link Click" option, if a drag is detected on a bend point, the regular bend point drag handler is used then the Link Click broadcast is sent with _bendpoint > 0, _dragged set and _x/_y being the new position.<BR/> This does NOT update the co-ordinates in any bend point table (used with tiled maps), the modeller must do this which will involve a call to XYToLongLat() and updating the row at _bendtablerow in the bendpoint table.<BR/> This option can be set using panel property "LinkClickHandleDrag"<BR/>
* '''NEW''' Panel option "Show Bend Markers (Run)" controls if bend points are shown on the panel during run. Only applies to Spatial links at this stage.<BR/> Panel property "ShowBendPointsRun" enables modellers to set this option (repaint needed after changing it).<BR/>
* '''NEW''' System attribute BendPointSize enables the size of bend points to be set. This affects the size of the marker or associated icon and the size of the hit test area.<BR/>
* '''NEW''' System attribute BendPointIcon is a text attribute that names an icon to use for bend points. Setting this also sets the bend point size based on the icon. An empty name restores the default marker. Modellers must ensure this icon is included in a compiled application by one of:
- placing it the model's DB
- placing it in a shared DB named in the application compiler form
- having a model object somewhere in the model use the icon
(the object need not be used)<BR/>
* '''REMOVE''' Option "User Can Bend Spatial Links" as capabilities above replacee it.<BR/>
* '''FIX''' Table automatic cell sizing mode missed margins in calculations causing the last row to be missed when there was plenty of space for it, when the selected font size was "just right" to expose this.<BR/>
* '''FIX''' Resizing notes with Group Anchor<BR/>
* '''NEW''' Group anchoring assistance:
- prompt to enable group Anchor when editing anchor options and other
objects on panel have group anchoring selected.
- prompt to set the minimum size if it isn't set already
- reset any edge anchors if user enabled group anchor on a panel
configured to auto-fit and it was not at the required size to
edit the layout<BR/>
* '''CHANGE''' Group Anchor Limit, if set > 0 or automatically calculated, is now clamped against the "Base" size instead of ignored in cases where the limit is less than the base size of the object. For a table view with automatic sizing (limit -1) the size then used will be at least the base size of the view, otherwise limited by the space required for data, all constrained by the available space determined by the anchoring.<BR/>
* '''REMOVE''' Support for s.ItemBroadcastReceivers as the wait dispatcher obsoletes it. A message will be given if an old model uses it and you can Find it by searching on its text in the Find dialog.<BR/>
=== 8.84.1 ===
* '''FIX''' A number of issues with attribute editing / reference tracking within the attribute editor. Some of these were introduced 8.72.1, #5077,#5078<BR/>
=== 8.84.0 (new model version 762) ===
* '''FIX''' Visibility Control was not being saved for the Clock View<BR/>
* '''FIX''' Using Ctrl-W to hide the sidebar would result in undocked windows if user mode was toggled.<BR/>
* '''FIX''' Event/Routine Performance Profiling (Debug option) is now compatible with older version (pre v17) DLLs. Previously the data wasn't retained.<BR/>
=== 8.83.1 ===
* '''CHANGE''' Paint Map remote tile fetch and associated display updates only occur if Planimate is in run ready/running mode. In stopped mode only existing local tiles are used.<BR/>
* '''FIX''' Paint map remote tile fetch no longer introduces long delays when the tile fetcher is being reset (panel change, tileset name change) in cases where the remote server is unresponsive.<BR/>
* '''FIX''' Paint map remote tile reports error after 6 consecutive failed tile requests. A stop/restart or change panel resets it.<BR/>
* '''FIX''' Menubar File / "Info For Model File" no longer present in user mode (appeared for modeller with Advanced Editing option selected).<BR/>
=== 8.83.0 (new model version 761) ===
* '''NEW''' The Paint Map now saves the WGET URL however it is not used in compiled applications, its use is intended for developers to build tile sets. This may change in the future.<BR/>
* '''CHANGE''' Paint Map tile rendering now done in one pass when it needs
to upscale tiles due to missing tiles at the preferred zoom  level.<BR/>
* '''CHANGE''' The Paint Map now uses multiple threads to fetch tiles from a remote tile server when the WGET URL (context menu-Edit) is set. This keeps the UI responsive. Four fetch threads are currently used. As tiles arrive the display updates (this update is rate limited). Tiles are only fetched for the current zoom level but the map will still upscale coarser tiles, in a darker grey in this mode. Hence it is useful to collect tiles by progressively zooming in.<BR/>
* '''CHANGE''' Changed the structure used to store "Text" columns in Tables to make sorting tables with text columns and 100,000+ rows viable.<BR/>
* '''CHANGE''' Combo list as used in table filters now faster with many text cells<BR/>
* '''FIX''' Using "Cut" on a portal then navigating to a panel that has a viewport to a panel in the cut hierarchy. The viewport will now be blank until the portal is pasted..<BR/>
* '''FIX''' Update the hierarchy tree to remove a "Cut" portal's hierarchy.<BR/>
* '''FIX''' Column Overlay Graph with automatic bar width (-ve percentage values) now accounts for edge margin properly, particularly important when only a few bars in the graph<BR/>
* '''FIX''' Colour Picker widget overlap with text in it.<BR/>
* '''FIX''' Button overlap in column overlay popup<BR/>
* '''FIX''' F2 full routine line edit when windows not constrained to main window<BR/>
* '''FIX''' Distribution values which are delays have time interval formatting after edit.<BR/>
* '''FIX''' Internal: Removed custom "delete" operator overload in PLDist to resolve some memory management issues, and fixed cases where shared constants were not used after a distribution edit.<BR/>
* '''CLEAN''' Separated use of popup list form, either font or advanced style options<BR/>
* '''CLEAN''' Refactored threading and mutex wrappers to clean up all build platforms.<BR/>
* '''CLEAN''' Some missing newlines in MDL file object details section.<BR/>
* '''NOTE''' Released PLDLL API update (PLDLL v@0 / PLAsDLL V7)<BR/>
=== 8.82.3 ===
* '''NEW''' PL-As-DLL API additions (now at V7)<BR/>
=== 8.82.2 ===
* '''NEW''' The lists which show Attribute, Tables and Label Lists now include a filter field. Any text in the field will prune the list to items that contain the text in the Name or Scope columns for attributes and tables, or Name or Index columns for the system managed label lists such as Model Objects, Broadcats etc.<BR/>
* '''FIX''' The image to tile maker now enables anti-alias<BR/>
* '''CLEAN''' Internal module renames MinGW (gcc under Win32) build cleanup<BR/>
=== 8.82.1 ===
* '''NEW''' the Debug Window has a new menu option to write its contents to the clipboard #3863<BR/>
* '''NEW''' Debug Window has menu option to load it with the Future Events from the Future Events List. This enables them to be browsed #2875<BR/>
* '''NEW''' The Debug and Watch windows now support the UnconstrainPopupWindows Platform Option introduced in 8.81.0, enabling navigation to them using the Ctrl-Shift-Tab introduced in that version.<BR/>
* '''CHANGE''' Re-arranged the popup when a table cell formatted for label list is clicked (the default popup with the list and field). The field now has default keyboard focus. The list auto-filters based on what is typed into the field. The Add button is now "+" and next to the field. <Tab> then <Space> is a shortcut to the add button. <Tab> <Tab> <Space> is a shortcut to the field. For 'Add', the text in the field is used as a default IF it doesn't match an existing label. The Alias button is removed as it is confusing and doesn't make sense in the context of selecting a label.<BR/>
* '''CHANGE''' The Selecting a Broadcast popup is also updated, as above. The Filtering is very useful as it handles partial internal matches.<BR/>
* '''CHANGE''' The "Data Table Column Check" option available for Gantt/Train and Log Driven Graphs now shows the columns that are missing and present separately, and you can select columns for automatic addition. It also indicates "required" columns for the view to function.<BR/>
* '''FIX''' A bogus repeated extention stripper call prevented making a compiled EXE if the Planimate EXE file name contained multiple "."s. From 8.77.2.<BR/>
* '''FIX''' Modernised look of text fields and list boxes<BR/>
* '''FIX''' Aligned fields in Attribute Edit dialog<BR/>
* '''FIX''' If the sidebar "Tools" window  has focus, it now forwards control keys (eg: Ctrl-G) to the main window and gives the focus to the main window.<BR/>
* '''FIX''' More elegantly handle Attribute and Table edits when names conflict with an existing one and/or will "obscure" one up the hierarchy. It now gives the opportunity to fix the name without losing the edit or propagating reference renames first. #567<BR/>
* '''FIX''' Minor renames to menu options<BR/>
* '''FIX''' Smoother Zoom effect when notes open, broadcasts are animated etc.<BR/>
* '''CLEAN''' Internal: Eliminate use of deprecated C++ class "strstream" Major cleanups reduce warnings from Linux/gcc to just one place: the PL DLL API where intentional funkiness is occuring with function pointers. Visual studio/Windows builds are level 3 warning free (as usual). Using managed strings instead of char arrays in more places.<BR/>
=== 8.82.0 (new model version 760) ===
* '''NEW''' Compiled EXE maker (PBA) has additional "Include DB" field. This causes all content in the specified DB file to be packaged,
in addition to the Model's DB file (if one exists).  #5061<BR/> This is useful in models where SetIconRemote() is used to dynamically load icons and such icons are in a "project wide" DB. In such cases PL is unaware to automatically identify the need for such icons.<BR/>
=== 8.81.0 (model version same) ===
* '''REMOVE''' The Clock Window is removed. You can use a Clock View on a panel which is efficient and obeys anchoring. If you want the clock in a window, you could arrange to open a small popup panel with a clock view in it.<BR/>
* '''CHANGE''' Recategorised and renamed Model Options. Somewhat more structured now.<BR/>
* '''REMOVE''' Removed "Show Note On Load" option. This used to show a note called "<Main>" in the model DB.<BR/>
* '''REMOVE''' Redundant option "Ask Dataset type on load" was for DataSet1<BR/>
* '''NEW''' Ctrl-Shift-Tab moves between top-level Planimate windows for an instance that are not owned by another window. Experimental. #528<BR/>
* '''NEW''' Platform/INI option Edit /  UnconstrainPopupWindows enables routine list windwos and table editors to have an independent z-order instead of being forced in front of the main Planimate window. This is useful with the new Ctrl-Shift-Tab hotkey.<BR/>
* '''REMOVE''' "Hide Model Load/Save Options", now redundant as these File do not appear in User Mode for modellers.<BR/>
* '''REMOVE''' Obsolete routine editor options "Include Separator for attref prefix" "Include Scope For Portal Attributes"<BR/>
* '''REMOVE''' Internal remants of old palette code that was used for Clock Window and the Advancing Time window, which was internally refactored to work without it.<BR/>
* '''REMOVE''' LockWindowUpdate() test workaround for bad video driver<BR/>
=== 8.80.4 ===
* '''FIX''' DataSet2 column testing showing unnecessary message (8.80.1) Passed automatic testing as message only appears for modellers<BR/>
=== 8.80.3 ===
* '''FIX''' Multiple issues with display of track/link multiple roads. Extra lines and gaps resolved.<BR/>
* '''NEW''' PL provides label list "_dataset_types" which enumerates the different data object types that can be used with DataSet2
and when working with data object labels.  #3788<BR/>
* '''REMOVE''' The File menu options to Load/Save model are no longer present when PL is in User Mode. They are confusing as they wont appear in a PBA and the lack of "New" in user mode led to "out by one" choices.<BR/>
=== 8.80.2 ===
* '''NEW''' The View -> Accessed Files list now includes any model loaded DLLS. DLLs are unloaded when a run is stopped unless model option "Keep DLLs Loaded On Engine Restart" is selected.<BR/> In this case, the DLL appears in the list and right clicking it (with PL in Stop mode) gives the option to unload it. #4734<BR/> Due to Windows architecutre it is not possible to fully unload a DLL that uses dotNET/CLR. PL will re-bind to the SAME instance if it reloads the DLL.<BR/>
* '''CHANGE''' No longer unload DLLs on switching to Flow or Paint mode.<BR/>
* '''FIX''' Now reload the icon cache after "Resource DB File Admin".  #3796, #3765 It is also reloaded after "Image Mover" is used.<BR/>
* '''NEW''' Icon palettes (Choose Icons, Image Mover) have hover tips. Improved messages when deleting icons<BR/>
* '''FIX''' Table Driven Entry shows available columns for time/class column name options (if linked table can be located). #3860<BR/>
=== 8.80.1 ===
* '''FIX''' Change Object / Icon now supports directly editing the icon name so overlay icon commands can be entered. Note that using this to change the current item's icon is preferred than using SetIconRemote(), its more efficient and has the benefit that Planimate can track the use of the icon automatically which assists when creating a PBA.<BR/> SetIconRemote is useful when you want to change a different item than the current or the icon name cannot be pre-determined (eg: it is dynamically built using strings based on a number of parameters).<BR/> Also fixed leak if icon was chosen but index dialog was cancelled.<BR/>
* '''FIX''' Positioning of ends of paint lines when editing<BR/>
* '''FIX''' Remove obsolete DataSet1/Scenario routines from operation browser<BR/>
* '''FIX''' Entry context menu "Arrival Details" has useful summary<BR/>
* '''FIX''' For modellers, DataSet2 operations show a message if the configuration table is missing the basic columns to use DataSet2.<BR/>
* '''FIX''' Choose Icons when no DB error<BR/>
* '''CHANGE''' Change Object context menu text reworded<BR/>
* '''CHANGE''' Increased minimum time of initial About box for PBA to 2 seconds<BR/>
=== 8.80.0 (new model version 759) ===
THIS IS A TEST RELEASE, TAKE NOTE OF CHANGES WHEN SAVING NEW MODELS<BR/>
* '''CHANGE''' Saving a model no longer creates a DB file if one does not exist for the model or its a new model.<BR/> Using the Go To button in Image Mover or Resource DB File Admin in the Tools menu are ways to create an empty DB for the current model.<BR/> This is useful during development but you still need to create a model DB to store images you load dynamically (eg:LoadIconRemote()) when making a PBA, in order for the PBA compiler to know about them.<BR/>
* '''NEW''' System attributes GanttDragAlpha and GanttDragIntensity adjust the visibility of gantt blocks whilst being dragged. Defaults have changed and are currently 160 for alpha and 80 for the intensity scaler.<BR/>
* '''NEW''' Gantt option "Show Move/Resize Mouse Cursors" changes the mouse cursor when its over blocks / edges of blocks. New view property "CursorChangeEnable" sets this option A repaint is required to update the hotspot registrations.<BR/>
* '''FIX''' Reference properties like t.table.RowCount now work when formatting themselves to text<BR/>
* '''FIX''' The way views update has been changed to not affect icons outside of their bounding box.<BR/>
* '''CHANGE''' Rewrote Paint note box handling so the note box is better handled instead of the link box. Notes now support anchoring. The link moves relative to the top left corner of the note.<BR/>
* '''CHANGE''' Tools/Image Mover no longer complains if there is no model DB for the loaded model. One will be created if "Go To Model DB" is used. Tools/Resource (DB) File Admin now suggests the model DB as a default whether it exists or not, for whatever name is entered a new DB will be created if it does not exist.<BR/>
* '''CHANGE''' Newly created notes do not ask for a DB selection and save within the model. You can use their DataBase Note context option to select a note from a DB/store in DB. Storing Notes within the model avoids need for using the DB.<BR/>
=== 8.79.0 (new model version) ===
* '''ADD''' CopyAllFromView() has option to include column labels (1 = yes)<BR/>
* '''FIX''' When making PBA icon names which start with '#' are not included. This prevents ARGB codes being flagged as errors in PBA construction. *** Hence do not name icons starting with # ***<BR/>
* '''FIX''' No longer fail if HandleDragBlock passed view with no data (overlapping gantt views with first one hidden can cause this)<BR/>
* '''CLEAN''' Internal renames (routine processor)<BR/>
=== 8.78.0 (new model version 756) ===
* '''NEW''' Item classes have option to include the item ID in info panels (these appear above item).<BR/>
* '''NEW''' "Pause" is now available as a button action, no longer requiring a broadcast. To be useful, model option "Mouse Clicks While Running" needs to be selected.<BR/>
* '''CHANGE''' Message items are now created using the Message Item icon which can be set using "Choose Icons" for the item class.<BR/> IF END USERS SEE MESSAGE ICONS YOU SHOULD CHECK WHAT IS USED.<BR/> For new models, the default message icon uses an overlay and you can do the same by right clicking icons in the choose icons list and creating an overlay command.<BR/>
* '''CHANGE''' If clicks during simulate are enabled, clicking an entry is now also supported. This is useful for click entries.<BR/>
* '''CHANGE''' Renamed entry modes and sorted list.<BR/>
* '''CHANGE''' Entry mode "User Click" now called "Click (Single Item Moves)" used to leave item at entry, it now moves just that item without continuing run, which is much more useful.<BR/>
* '''CHANGE''' MultiServers used by a single item no longer use a fly-out in their context menu.<BR/>
* '''CHANGE''' Times described by multiservers are much cleaner with defaults omitted<BR/>
* '''CHANGE''' The confirmation when user attempts to add a new stream is more informative on why they should be careful about doing this.<BR/> Using multiple streams runs the risk that the sequence from one may correlate to the other, though this should be very unlikely with the generator and how it is initialised.<BR/>
* '''FIX''' Chart scale updated properly on model load<BR/>
* '''FIX''' Can rename an object label to fix its case<BR/>
* '''FIX''' IF a model run was started whilst in Flow Edit mode, edit mode display remnants occured.<BR/>
* '''FIX''' The zoom effect with model option "Animate Messages/Broadcasts" is on<BR/>
* '''FIX''' Dispatcher size icon hide, new implementation<BR/>
* '''CLEAN''' Internal large scale renames (IFScreen,IFForm)<BR/>
=== 8.77 2 ===
* '''CHANGE''' Replaced "Stat" text from font descriptions<BR/>
* '''CHANGE''' The buttons in the Graphics dialog set the Ok button to receive Enter pressed after they are used.<BR/>
* '''CHANGE''' Newly dropped exits have their names hidden by default IF Settings/ Show Advanced Menus is selected. You can click under the exit to rename it without the leading "!'.<BR/>
* '''FIX''' Use of new anchor management was not updating when autosized panel was in a viewport. Like introduced when viewport rewritten 8.62.3<BR/>
* '''FIX''' The _run_pause broadcast is now sent when a pause occurs due to the use of the "Pause After Advance" option in the advance to time dialog.<BR/>
* '''FIX''' PBA creator handles a model not having a DB file instead of failing. Failures give more details.<BR/>
* '''FIX''' PBA maker validates a DLL is present up-front if the "Make DLL" option is selected.<BR/>
* '''CHANGE''' Internal hover descriptions of objects updated (unsed at moment)<BR/>
=== 8.77.1 ===
* '''FIX''' Deleting dispatcher setfault<BR/>
=== 8.77.0 (new model version - note load speed below) ===
* '''NEW''' The Dispatcher merges in Queue functionality and replaces it.<BR/> Large models with queues will take longer to load as they're converted.<BR/> The graphics and co-ordinate handling have been rewritten. Icons of different sizes supported in all orientation modes. Icon rotation (if AutoRotate is enabled for the item) is used. The overflow indicator works properly (had redraw issues) and queue space allocation takes into account whether it is enabled. Additional item spacing can be specified. The new Default dispatcher mode is "FIFO". The existing "Normal" mode is renamed "Any Item Can Leave". Converted queues retain their old name, and position (mostly).<BR/> Please report any speed impact, there may be optimisations possible.<BR/>
* '''NEW''' Dispatcher option "Reneg To Second Path When Full" Instead of blocking an incoming item when full, the Dispatcher will send it straight to the reneg exit over the second path leaving it (renegging works like a switch with two paths out). If that path is blocked it is a model error.<BR/>
* '''CHANGE''' The Automated Testing system (/TESTRUN command line option) now returns 100 for a success instead of 0. This makes it possible to detect seg-faults etc. as 0 is returned by the system in such cases.<BR/> Those of you with automated testing procedures of your own, please contact me fif you need an updated batch file ;)<BR/>
* '''CHANGE''' Only show "LENGTH" in item click popup for items on a route. You can still see it for other items by clicking "SYSTEM..."<BR/>
* '''FIX''' NoScrollWidth / NoScrollHeight properties for a table view return
-1 if the view is on a panel that is not visible. This can happen
if the PL window is minimised.<BR/>
* '''FIX''' Click on path arrow head is ignored in Object Mode if shift or ctrl keys are down<BR/>
=== 8.76.3 ===
* '''FIX''' About box application banner now supports optional size of 584x264 instead of 570x264 which positions the banner so there is no white margin on either side. For other image sizes the image is positioned or stretched into the central 570x264 as occurs in previous versions.<BR/>
* '''CLEAN''' Internal rename of some LinkedList functions for code readability<BR/>
=== 8.76.2 ===
* '''FIX''' Copy/paste of visible text note no longer loses text when its selected to store the text in the MDL not the DB.<BR/>
* '''FIX''' Dispatcher with alpha fill during run was overpainting itself<BR/>
* '''FIX''' Guides no longer leave a hole in path lines<BR/>
=== 8.76.1 ===
* '''FIX''' Scaling of dispatcher broadcast/message icon for new icon set<BR/>
* '''CHANGE''' RemoveFileExtention() is now compatible with Text formatted data as well as labels. #5007<BR/>
* '''FIX''' Reign in repeated errors If a model is missing its modelname.DB and an icon cannot be located<BR/>
* '''NOTE''' This version ships with an updated _Planimate_System.DB<BR/>
* '''CLEAN''' Some internal renames of view flags<BR/>
=== 8.76.0 (new model version) ===
* '''NEW''' Planimate now ships with a new set of object and toolbaricons.<BR/> Older version models will retain the previous objecticons. For such models the Tools menu contains option "Upgrade Model To Use 24x24 Version 8 Icons". When selected you are prompted to confirm the update. Refer to the text in the dialog.<BR/> The new icons are shipped in _Planimate_System.DB which replaces _!SYSTEM.DB and must be present for editing from this version onwards.<BR/> _!SYSTEM.DB is retained for backward compatibility but this version of Planimate only depends on the icons in it for models which have not been upgraded or make use of other icons therein.<BR/> The new standard is for 24x24 object and item icons but the sidebar defaults to 16x16 icons, this can be switched.<BR/>
* '''NEW''' The sidebar/toolbar icons use 16x16 versions of the new Planimate icons.
The  INI / Tools / ToolIconSize value enables selection of the size
of the icons in the tool windows, 16 or 24 gives unscaled icons.
A value such as 20 will downsize the 24x24 icon set.<BR/>
* '''NEW''' For newly added item classes in models using the new object icons, the "Carry" icon defaults to the item icon with a message overlay. If you change the item icon you can use similar notation to create your own message overlay.<BR/>
* '''NEW''' The "Go To" button in icon palettes supports both old and new system icon databases.<BR/>
* '''NEW''' Additional panel colour settings: "Object Name Colour" sets the colour of object name text "Object Fill Colour" sets a backdrop colour for objects "Object Name Fill Colour" colour to fill area under object names<BR/> A transparent version of the panel background colour works well for fill colours when objects overlay flows etc. A slightly different shade of the background colour can also be effective.<BR/>
* '''NEW''' Menubar/Panel Menu "Copy Properties" enables panel colours to be copied recursively to sub systems on the panel.<BR/>
* '''NEW''' INI / Panel options to configure the default colour for object names, and fill for newly added panels (PanelNameColor, PanelObjectColor and PanelNameFillColor(.<BR/>
* '''NEW''' Table View option "Re-apply Filter On Changes" re-applies a column filter when any change to the table occurs. This option is experimental and will have serious performance inpact on large tables. #4997<BR/>
* '''CHANGE''' The "Hide Object Borders" modeller option is now on for new models. This option is overridden and a border is shown if the object has no icon assigned.<BR/>
* '''REMOVE''' Menubar/Panel Menu "Background COlour" option has been removed, use the option in the Panel area context menu.<BR/>
* '''FIX''' Icon Menu can "Locate" an icon that uses overlay notation (the first name is used)<BR/>
* '''FIX''' The Don't Show Zero and Don't Show Clear Value column options now
prevent such values from populating the column filter dropdown  #4996<BR/>
* '''CLEAN''' Internal item class renames, default sizing handling, object redraw<BR/>
=== 8.75.0 (new model version) ===
* '''NEW''' Table column option "Show As Image" interprets the text of cells in that column as icon names and displays them instead of the text. #4747<BR/> For this to be useful, the column should be formatted as Text and set using $= assignment.<BR/> Left/Right/Center text alignment options apply to the icon. Icon overlay commands are supported. No autosizing of table so make sure space allowed for icon by choosing appropriate row lines.<BR/>
* '''NEW''' Dialog/Field option "Accept Empty Text" enables "no text" to be an acceptable entry for Text formatted data.<BR/>
=== 8.74.0 (same model version) ===
* '''NEW''' Column overlay graphs support calculating the width of vertical bars automatically. If the width for an overlay is set to a -ve value, it is treated as the percentage that each bar fills its available space, which in turn is based on the number of rows in the table and the width of the graph. #4973<BR/>
* '''FIX''' If a paint button in a hover state changes state (eg: due to a click broadcast changing it) the state change overrides the still-active hover if the new state is a "No Hover" state. #4972<BR/>
* '''FIX''' Release mouse capture upon a model stop/breakpoint dialog #4974<BR/>
* '''FIX''' Redundant viewport hide after a model stop<BR/>
* '''FIX''' HidePanel now only acts for panel in a popup not viewport  #4971<BR/>
* '''CLEAN''' Refactored column overlay graph code, now-relevant internal names Confusing internal names for panel in a popup/viewport<BR/><BR/>
* '''NOTE''' Synced VS2013 and VS2015 project settings during refactor<BR/>
=== 8.73.2 ===
* '''FIX''' IF a blocking switch with a decision depending on data that was changed within the same broadcast tree that preceeded using RemovePortal() on an ancestor of the switch (and hence the switch) it resulted in an Unblock FEC event not being properly removed, resulting in a VERY difficult to track down seg-fault at a later stage.<BR/>
=== 8.73.1 ===
* '''NEW''' Icon Overlay Script new command "E:" enables colour exchange. Substitutes a given colour with another with full alpha support. Useful with template icons.<BR/> eg: Change solid blue to transparent green: [E:#FF0000FF,#A000FF00]MyPNGFile<BR/>
* '''NEW''' Icon Overlay Script new command "R:" enables rotating (in degrees) of an icon/colour block.<BR/> Example: [W:24 H:24]#00000000|[R:45]_PORIDLE A transparent area of 24x24 is created to allow space for the rotated _PORIDLE icon's corners.<BR/> Note that you can already rotate portal and item items on-the-fly using object properties/system attributes and the item auto-rotate options. This enhancement is intended where you want to rotate a sub-component of a composited icon.<BR/>
* '''NEW''' Icon overlays can now be used with Planimate's multi-frame icon capability to dynamically composit animated icons.<BR/> Reference a multi-frame icon using a name followed by @ eg: GROUPNAME@<BR/> Then use SetPortalIcon on a dummy portal to create the frames at run start and all other references (eg: item icons) will work. For each frame use an overlay command followed by the group's name, the @ symbol and a 2 digit frame number eg:<BR/> [ 1]    SetPortalIcon(s.OwningPortalLocation,"_ENTIDLE|GROUP@01") [ 2]    SetPortalIcon(s.OwningPortalLocation,"[R:90]_ENTIDLE|GROUP@02") [ 3]    SetPortalIcon(s.OwningPortalLocation,"[R:180]_ENTIDLE|GROUP@03") [ 4]    SetPortalIcon(s.OwningPortalLocation,"[R:270]_ENTIDLE|GROUP@04")<BR/> This creates 4 sub-images for Icon "GROUP@" and if used as an item icon (set with Choose Icon / Enter Name Text for the item class) then Planimate will cycle through the images as the item moves.<BR/>
* '''FIX''' /RECENT command line option re-enabled<BR/>
* '''NOTE''' Releases will now include Planimate64.dll which is a DLL version of Planimate for use when compiling a PBA which is called from dotNET. At this stage only 64 bit DLL versions will be released.<BR/>
=== 8.73.0 (same model version) ===
* '''NEW''' Dynamic Icon Creation and Overlay  #4749 By using new naming, icons can be created on-the-fly featuring overlay, colour keying, colour filtering, scaling and RGB colour block creation.<BR/> Documentation: https://wiki.planimate.com/Icon_Overlay<BR/>
* '''NEW''' The Choose Icons selection menu has a context menu on the different icon states which has option "Locate". A nmew option has been added "Enter Name Text" which enables an icon to be directly named without using the palette.<BR/> This is useful with the new Icon Overlay capability as you can predefine a state icon as a combination of icons if you don't need to determine it all dynamically during run using SetPortalIcon() or SetIconRemote() etc.<BR/>
* '''FIX''' Note Bounding Box context menu option only available if note is visible.<BR/>
* '''FIX''' Icon palette shows file type for icons in a DB and extra highlight box to help locate highlight when image is large and opaque.<BR/>
* '''FIX''' Flip icon option for PNG images (GDI+) was flippijng out due to bad bit masking.<BR/>
=== 8.72.0 (new model version) ===
* '''NEW''' The Paint Map View now supports positioning / panning of Paint objects as well as Portals/Links.<BR/> This enables a Paint Map to have additional graphics (highlights, buttons, text .... even viewports on a map seem to work) which track the map as its panned.<BR/> This is achieved by naming an optional "Paint" table in the map paint object, the table has columns _paintid, _x,_y,_long,_lat and you add paint objects to it from their context menu (they need to be in paint label list first) or in code.<BR/> The "Reposition Objects" Change Object in the Map portal should have the following lines added (note one single repaint at the end). Assuming your paint location table is called "paint".<BR/> [ 1]    // [ 2]    LongLatToXY(l._Paint_Objects[Map],t.paint[]) [ 3]    ITERATEROWS (r.row,t.paint[])
[ 4]      r.paintobject = t.paint[r.row][c._paintid]
[ 5]      SetPaintXY(r.paintobject,t.paint[r.row][c._x],t.paint[r.row][c._y],5)
[ 6]    ENDLOOP
[ 7]    //
[ 8]    ForceRepaintPanel(s.OwningPortalLocation)    //repaint specific panel - less flicker when in viewport<BR/> If you want to get fancy and scale/hide the paint objects, this is the place to do it (as you'll find done for the portals in the Map demo model).<BR/> NOTE current implementation is not optimised for more than a few hundred paint objects unlike portals where thousands should be viable. Also strange things may happen with co-ordinate wrap for very "far away" paint objects.<BR/> These will be dealt with when a use case warrants the effort.<BR/>
* '''NEW''' PL now supports model-code copying a portal which has views of its innards on the SAME panel as the portal, where those views use visibility control references which reference data scoped WITHIN the portal.<BR/> Previously these required a stop/restart after the copy.<BR/>
* '''CHANGE''' SetPaintPosition() has been renamed SetPaintXY() and has a new optional parameter to specify the reference edge/corner (as for PositionPaintObject). Older models will set this value to 7 (lower left) for compatibility. New instances default to 5 (object center) which is useful when using paint objects on maps and is consistent with how portals etc. are positioned.<BR/>
* '''FIX''' DataSet2 file with an external file embedded croaked the load if the config table didn't have an external file row for it. In this case the embedded file is now ignored.<BR/>
* '''NEW''' Cell views now update for Text formatted columns, now possible due to refactored view code.<BR/>
* '''SPEED''' Optimised cell and attribute view updating and visibility testing (important for performance).<BR/>
=== 8.71.2 ===
* '''CHANGE''' MatchMultipleKeys() now returns 0 if the table has no rows #4929<BR/>
* '''CHANGE''' No longer close if /RECENT fails to load the most recent model.<BR/>
* '''FIX''' Now register Field/DateTime/Combo as "ModalChild" in the cell edit handler which enables a Focus Lost Auto Close popup to have a table view supporting simple edits.<BR/>
=== 8.71.1 ===
* '''NEW''' Tools menu option "Clear Routine Breakpoints" clears all breakpoints set on lines in the routine editor in the entire model. Note this does not affect BreakpointIF lines.<BR/>
* '''FIX''' Background colour applied to entire routine window<BR/>
=== 8.71.0 (new model version) ===
* '''NEW''' INI / RoutineEditColors settings: UseInvertedRoutineColorSet: A tri-state value that controls whether the "Inv" version of routine editor colours are used.<BR/> 0: (default) Planimate automatically uses the "Inv" colour set if the system Window Text colour is "lighter" than the System Background colour, as occurs when Windows is configured with a high contrast theme.<BR/> 1: Always Planimate uses the "Inv" colours (eg: "RoutineOperationColorInv") for the routine edit list window regardless of the system colour theme. This enables a dark themed routine list in environments where menus, lists etc. are otherwise light themed.<BR/> 2: Never Planimate uses the regular colour set (without the Inv) for the routine listing.<BR/>
* '''NEW''' INI / RoutineEditColors option StartPanelColorFlipped: Starts with panel colours flipped as occurs with the /FLIP commandline option. If set, EnablePanelColorFlip is implicitly enabled.<BR/>
* '''NEW''' INI / RoutineEditColors option
EnablePanelColorFlip:  Enables Ctrl-Shift-K to change the colours
used in panels to support a mostly-dark background, as enabled
by the /FLIP command line option.<BR/>
* '''CHANGE''' The unused area in a routine window now follows colour set for INI option RoutineBackgroundColor<BR/>
* '''NOTE''' Further theming may be implemented but if you want the UI dark use the a system "High Contrast Dark" theme. It does not affect the colours on panels unless you use the panel colour flip options described above.<BR/> Whilst Windows 10 (1607) includes a "Dark" option in Settings / Colors MS haven't implemented it for desktop applications.<BR/>
* '''NEW''' Routine operation PositionPaintObject() provides the positioning capability of LinkPaintObjects() without creating a link, ie: an instant "position paint object relative to parent" capability. Parent can be 0 to use the entire panel.<BR/> This avoids complex co-ordinate calculations as just edges or corners are specified.<BR/>
* '''NEW''' Log Driven Graph option "Scale Per Overlay For Area Plots" enables extra processing so area graphs with a colour gradient has it start and end at the used area of that overlay.<BR/> This adds overhead so only turn it on for gradient area graphs.<BR/>
=== 8.70.1 ===
* '''FIX''' Unchecked view-type parameter in routine operations causes silent fail<BR/>
* '''FIX''' Paint map doesn't show errors when file name is empty<BR/>
* '''FIX''' Flow editing delay, and object click menu when current step left clicked<BR/>
* '''FIX''' Route editing<BR/>
* '''FIX''' Escape key cancels selecting an object<BR/>
* '''FIX''' The correct message appears in titlebar when selecting end points for pipe or spatial link<BR/>
* '''FIX''' Crosshair cursor now visible on a black background<BR/>
* '''CLEAN''' Internal clean up of object selector<BR/>
=== 8.70.0 (model version 748) ===
* '''NEW''' System attributes "s.MouseDownX" and "s.MouseDownY" give the co-ordinate of the mouse at the time of the last mouse down, before any double click delay, button release wait etc.<BR/> These are in panel co-ordinates like s.MouseX and s.MouseY<BR/>
* '''FIX''' System error when paste-replacing a portal with an object label with a portal which has an object label.<BR/>
* '''NOTE''' When moving portals between models, references within a portal get updated more reliably if you "Cut" the original instead of "Copy".<BR/>
=== 8.69.1 ===
* '''FIX''' Graph scrollbar & scales not updating as dragged/resized when paused. Present since before 8.36.1?<BR/>
* '''FIX''' Gantt click popup required a close to dismiss it. This was introduce in 8.38.1 when the popup was extended for other functionality.<BR/>
* '''FIX''' Tools / Show System Attributes segfault<BR/>
* '''FIX''' If you upgraded to 8.69.0, the "Send _Key BCast For Nav Keys" model option MAY be On as it is a recycled bit and 8.69.0 did not clear it for older models.<BR/>
* '''SPEED''' Sort comparison avoid one level of indirection<BR/>
* '''CHANGE''' Large internal rewrite and renames to:
- make less inelegant how modal event loops (like dragging) are handled
- prevent such loops from using excessive CPU unnecessarily
- reduce unneeded classes, use static members, inline stuff
- merge function use, remove unneeded enums
- how keys and double clicks are forwarded to modal handler
- rename of event related structures<BR/> Look out for mouse/keyboard issues within graphical editing/browsing<BR/>
* '''CLEAN''' Internal renames of the panel/window interface code (even had some SimView references in there)<BR/>
=== 8.69.0 (model version 747) ===
* '''NOTE''' The following three options intended for use together<BR/>
* '''NEW''' Panel Popup option "Capture Mouse On Open" Intended for transient popup windows that are hover sensitive to ensure they receive mouse events even if the mouse leaves their window.<BR/>
* '''NEW''' Panel Popup option "Close On Escape" Causes a popup to be closed if the escape key is pressed. This should be used with transient popups for basic keyboard support.<BR/>
* '''NEW''' Panel Popup option "Close On Mouse Exit" Auto-closes a popup if the mouse has been within it since it appeared and subsequently leaves its client area.<BR/>
* '''NEW''' End User option "Send _Key BCast for Nav Keys" will send a _key broadcast for Escape. If a view with focus doesn't take the keys it also sends arrow keys, PgUp,PgDn,Home,End,Space, Tab and Enter. Note the "Close On Escape" option takes precedence for a popup.<BR/>
* '''NEW''' Linux PL can load/use Linux compiled Planimate DLLs. The demo MatMult in the repo includes a sample makefile. PL expects extension .so.1.0 and looks in the current directory.<BR/>
* '''CHANGE''' No longer show the default background context menu on left click in paused mode.<BR/>
* '''CHANGE''' Option "No Pause Messages" defaults to Yes for a new model when the "Advanced Editing" INI option is set.<BR/>
* '''CHANGE''' Internal rework of mouse capture to consolidate handling Cleanup of how the focus object receives keys, works with popup and viewport. Report any model UI issues, cleanup was needed.<BR/>
* '''CHANGE''' Adjust high contrast mode colour mappings.<BR/>
* '''SPEED''' Horizontal and vertical graph bars faster if they don't useg gradients<BR/>
=== 8.68.0 (model version 746) ===
* '''NEW''' Entries have a new mode "Table Driven Block Indexed". Like Indexed, it is more efficient than "Table Driven Remove Row" however instead of the table growing indefinitely, it has the oldest rows removed when there are more than 1024 of them, giving the best of both worlds as far as processing efficiency and memory usage.<BR/> At the time the rows are removed, the "current" row remains and becomes identified as row 1 in the "_index" item attribute.<BR/>
* '''NEW''' Clicking an Entry or Exit while paused now includes the number of items that have left / entered, respectively. This is useful for determining how active a given flow has been.<BR/>
* '''NEW''' Clicking on Change while paused includes last execute time if it has a routine that has been invoked that run.<BR/>
* '''FIX''' The combination of edit options "Open Label Combo/Date Calendar" and "Label No List If One Item" no longer triggers a pointless animation if there is only one item in the list.<BR/>
=== 8.67.0 (model version 745) ===
* '''NEW''' The Sort() routine operation now supports 4 sort columns.<BR/>
* '''NEW''' Routine operation PositionLastRow() is useful in cases where a table is sorted and you wish to insert a new row. You append the new row (or TupleAppend) then instead of calling Sort(), use PositionLastRow() which accepts the same parameters as Sort() but is faster.<BR/> A key assumption is that the table is already sorted according to the parameters and only one unsorted row has been appended. IF the table is already sorted, this operation is efficient.<BR/>
* '''NEW''' Routine operation CheckTableSorted() tests whether a table is sorted to sort column criteria compatible with parameters to Sort().<BR/> Testing is *much* quicker than was calling Sort() as Sort() performs slowest when a table is sorted.<BR/> In this version Sort() now does a pre-check too (which will benefit un-updated models) but this may be removed in the future when use of CheckTableSorted() is established.<BR/> The routine returns the first row number that is out of order, or 0 if the table is sorted.<BR/> This is provided for speed critical special cases, the time for UI related sorting is generally inconsequential and modellers should strive to code to "know" or maintain sorting up-front when speed is critical, plus use the new PositionLastRow() mentioned above.<BR/>
* '''NEW''' Debug Option "Log Sort Info" writes details about every Sort()/ AdvancedSort() including columns and ordering and where the first out-of-place row (if any) was found.<BR/> This is useful for tracking down unnecessary sorting in a model since Sort() uses the QuickSort algorithm which performs worst when the table is already (mostly) sorted. Kind of ironic.<BR/>
* '''SPEED''' Added caching/recycling of data structures used when sending broadcasts with parameters that don't initiate from an item. In the past these broadcasts were used only for time-insensitive UI but they now are used in track logic so caching is important.<BR/>
* '''CHANGE''' The value of s.AutomaticRestartAfterError is ignored unless in User Mode since it interferes with debugging.<BR/>
* '''NEW''' Command line option /RECENT causes Planimate to automatically load the most recent model. Good with a shortcut.<BR/>
* '''NEW''' Command line option /RUNPROFILE runs the model as if the Debug option "Enable Event/Routine Performance Profiling" is selected. Reports auto pop-up each time the engine is stopped/restarted or you can use the Tools/Show Run Profile option mid-run.<BR/>
* '''FIX''' 64 bit PL unable to find DLL if the path before the DLL contained the text "64".<BR/>
=== 8.66.1 ===
* '''FIX''' CreateTiles bug required tileset DB and image name to be same<BR/>
=== 8.66.0  (model version 744) ===
* '''NEW''' A new view type, "Clock" enables an attribute-view like view to be added to any panel to show the simulation clock.<BR/> This can be added from the Clock window context menu or via the Add View context menu on a panel background click.<BR/> The view follows the same format as the clock window.<BR/>
* '''NEW''' Routine operation CreateTiles() enables creation of a tileset DB from an arbitrary image file. This is useful where map-type navigation is required on a user supplied map.<BR/> In this usage, the co-ordinates are arbitrary with (0,0) being the centre of the image provided, the image is treated as the entire "world".<BR/> Given only one source image, the map will get very blocky as you zoom in. The depth of zoom is a parameter. For a 2000x1000 source image, zoom level 3 is the "nominal" resolution. (for tile maps zoom0=256,zoom1=512,zoom2=1024 etc). Hence you only want a couple of additional zoom levels from 3 with this source image size.<BR/> IMPORTANT: if an existing paint map is pointed to the target database, it must be pointed away from it (using SetPaintImage() ) before using CreateTiles(). After it can be pointed back to the new tileset file.<BR/> Return codes: 0: MAKETILE_OK
1: MAKETILE_OPENERROR  (image)
2: MAKETILE_DBDELETEERROR (in use by a paint map?)
3: MAKETILE_FILEERROR (error writing temp tile file)
4: MAKETILE_DBERRO (error putting tile(s) in DB)<BR/>
* '''CHANGE''' Added an on-load report to highlight any models using Cell views with Change Tracking broadcasts. If you're favourite model depends on this let me know. It is intended to only support change tracking for attributes. This will reduce overheads for tables.<BR/>
=== 8.65.0 (model version 743) ===
* '''NEW''' Routine operation  SetPreviousTailData Enables track taildata to be set for a road/length multiserver that a train has just left. This is useful when taildata information is not known until the front of the train leaves the road/multiserver.<BR/>
* '''NEW''' Change object profile run time logging changed to log time spent in routine code only, not recursed. Hence the note on lookahead in 8.62.2 can be disregarded.<BR/>
* '''NEW''' When the Debug option "Event/Routine performance profiling" is enabled, Change objects that take >= 1 REAL second in move or 0.1 REAL second in lookahead are now logged as "Slow" in planimate.dbg (which you can open using Tools / "Show Debug Log"), with their complete path in the model for your convenience.<BR/> The lookahead time is separately measured to move time, it may highlight opportunities to move code that does not need to occur in lookahead to only execute on item move.<BR/>
* '''NOTE''' Speed tips<BR/> On a mid range i7 the Planimate framework can execute > 20 million routine lines a second, so one real second of routine time is a lot of operations and may indicate:
- working with large tables (sorts, searches, nested iterates)
(MatchedIndexFast and BinarySearch may be useful if the data permits)
- memory thrashing due to un-preallocated row inserts / appends
(more detailed diagnostics to come for this)
- many column inserts/deletes/column tuplename renames which
cause Planimate to update column references (slow) in
the rest of the model. Using s.DisableColumnRefUpdates can reduce
many seconds of delay to milliseconds. See 8.17.0 notes.
- over-repainting (eg:accidentally repainting within a loop)
- creating/deleting objects
- messaging out to other routines
The total time for a message is about 5 to 10 routine lines worth
of execution time<BR/>
* '''FIX''' Viewport is now transparent to clicks if not connected (unless paint edit mode)<BR/>
=== 8.64.0 (model version 742) ===
* '''NEW''' Paint objects have property "Owner" which returns the first nonzero owning portal index up the hierarchy of owners. #4880<BR/>
* '''NEW''' Paint button option "Send Hover Even If No Hover State" enables paint buttons to send hover broadcasts even if they have no explicit hover state (or only one state). In this case the button does not change state. This option can be used along with a hover state in which case the hover state takes precedence and works as before.<BR/>
* '''NEW''' Paint button hover broadcast new item attribute "_hovered" indicates hover, 1 = hovered, 0 = not. Useful when there is no hover state.<BR/>
=== 8.63.2 ===
* '''FIX''' Removed extra line when tables have no column titles or filters #4878<BR/>
* '''FIX''' Viewports handle double clicks again in paint mode for model editors, like they used to. #4881<BR/>
=== 8.63.1 ===
* '''FIX''' Updating of cell views now resolves row index every table update WARNING: Avoid cell views on speed critical tables. Table Views are more efficient because they do not have the option of view data change broadcast that cell views have.<BR/> Removing view change broadcast from cell views is being considered as cell views could be implemented with lower overhead to the table they are associated with.<BR/>
* '''CHANGE''' Cell view updates now work like table views; if a resize ocfurs udpates stop until the end of a routine. This would impact stepping through code.<BR/>
* '''NOTE''' Be aware that all views hanging off a table impact performance of changes to that table since even if they are not visible the engine has to deal with them.<BR/> A future version of PL may have option to discard debugging views in a PBA.<BR/>
* '''CLEAN''' Merge code that associates panels with windows/popuips/viewports No additional breakagae was intentionally introduced.<BR/>
* '''FIX''' Typo in panel/popup options<BR/>
=== 8.63.0 ===
* '''NEW''' Routine operation LinkPaintObjects enables a paint object to be directly linked in position to another paint object (the parent). You can select the edges/corners between which the links are established as well as set a pixel offset. The default puts the linked object under the parent.<BR/> Multiple objects can be linked to a parent. Once set, the link persists even if run is stopped but it is not saved. A linked object must not have anchors set or it could be ripped apart. Likewise paint inheritance is not supported for linked objects.<BR/> The Options bits are currently unimplemented.<BR/>
* '''NEW''' Viewport option "Auto Fit To Target" causes a view port to automatically resize its area to the size of the panel. This is intended for small viewport panels.<BR/> The top left corner of the viewport is the constant when it gets resized (but a parent paint link can subsequently override it)<BR/> Obviously this option is incompatible with the Panel being configured to "Auto Fit Panel To Window".<BR/> This option IS compatible (and intended) for use with the "_panel_layout" broadcast.<BR/>
* '''NEW''' The "_panel_layout" broadcast is now also sent to viewports configured with the "Auto Fit To Target" option. This enables a model to resize views and use FitPanelToArea to then adjust the panel size which will then propagate to updating the viewports size. Then, if the viewport (now a paint object) is linked then its position will be correctly maintained after its resize.<BR/> Unlike when used with a popup, the _panel_layout handler does not need to call RefitPopup.<BR/> Resizing of viewports is ONLY performed when opening the panel containing the viewport. You cannot update a viewport's size whilst the panel the viewport is on is visible.<BR/>
* '''CHANGE''' Pixel calculations for viewport sizing<BR/>
* '''CHANGE''' Rework viewport initialisation<BR/>
=== 8.62.3 ===
* '''NEW''' Viewports are now paint objects. They are added and edited as for any other paint objects.<BR/> Right click on a newly added viewport to set its target.<BR/> Routine operations that address a viewport can now be passed a paint label as the "Panel With VIewport".<BR/>
* '''REMOVE''' Removed the very old 16 bit random number generator. This was selectable using the "Use Old Random Number Generator" Engine option. Models which had it selected will report a message when loaded and reconfigure to run with the 32 bit random number generator which has been the default for new models for over 7 years.<BR/>
=== 8.62.2 ===
* '''NEW''' Call count/times of DLL functions are now included When Debug/Event Routine Performance Profiling is enabled.<BR/>
* '''NEW''' If Debug/Event routine performance profiling is enabled, the report is automatically shown if the model restarts the engine (which clears/invalidate the counters).<BR/>
* '''NEW''' Clicking on a Change object when Debug/time profiling is enabled displays a popup with the time the change object last took to execute.<BR/> Lookahead and Enter/Move times are shown separately.<BR/> This can assist in finding bottleneck code.<BR/> Note that often (but not always depending on engine optimisation) these times include processing time for subsequent zero capacity objects. For best results, work backwards from an exit or a capacity object when investigating timings.<BR/>
* '''SPEED''' DLL loading was inefficient when multiple instances of the same DLL were used, possibly introduced 8.62.0<BR/>
=== 8.62.1 ===
* '''FIX''' Printing issues due to gdi+ resolved - gdi+ mishandles page units by default on a print device context but explicitly setting page units to pixels works around it.<BR/>
=== 8.62.0 (model version unchanged) ===
* '''NEW''' Table views now support tables with variable row height, enabled using the "Variable Row Height" option. Rows will adapt to how many lines are required to show the text in all columns in the row without clipping. In this mode ellipsis are disabled and if the column is too narrow to fit a word it will be split up. #4782.<BR/> The table "Row Height" (specified in lines) sets the minimum number of lines, typically you'd leave this at 1.<BR/> This involved changing text rendering, when ellipsis are enabled and how text position is calculated. The change impacts tables and paint buttons which use the text wrap in a box routines which in turn are based on Win32 DrawText but add missing capability to it.<BR/> Only text and label formatted columns play a role in determining variable row height, numeric/date columns are skipped, for performance reasons.<BR/> Effort has been made to be backward compatible but a visual inspection of all the different configuartions of paint and table view options is recommended!<BR/> When text data is changed in code, you may need to repaint the panel for new row heights to be calculated, but the existing handling may be sufficient - it was not changed to protect the simulator's performance.<BR/> Some basic clamping is performed to prevent a cell becoming higher than can fit in the table view's data area.<BR/> Do not expect the ability to scroll within a given cell, in this case create a viewer/editor panel and dump the text into an RTF view to enable users to read/edit cells with many rows of text.<BR/>
* '''CHANGE''' Cell text and row labels now vertically center in rows that have more space than required. #4744<BR/>
* '''FIX''' Attempted workaround gdiplus FillRectangle being broken for printing. Other issues possibly exist as printing has not been used much since PL version 5 and gdiplus was added in PL version 6.<BR/>
=== 8.61.1 ===
* '''NEW''' If Planimate fails to locate a DLL it now attempts to extract the DLL file from the DB. Such an extracted DLL file will be deleted
when the DLL is unloaded.  #4850<BR/> It is assumed the directory Planimate is running from is writeable to Planimate.<BR/> This is NOT to be used when shipping PBAs which use DLLs. These should be separately shipped and installed together with the PBA. It is also not intended for dotNET DLLs / assemblies.<BR/> Tested working with a PBA compiled to a DLL.<BR/>
=== 8.61.0 (new model version 740) ===
* '''NEW''' Added a secondary set of Pipe level monitor options/test values. So have Source Level Monitor A, B and same for target. _pipe_flags labels updated to suit.<BR/>
=== 8.60.1 ===
* '''NEW''' Added option to clear profile data in tools menu. This is useful when analysing performance of models with a lot of start up activity.<BR/>
* '''NEW''' Pipe option "Transfer On Stop" causes a final transfer of material as would have occured by a pipe update at the time a pipe is stopped (using pipe control). This prevents the last sample being lost when stopping a pipe. Note that if a limit condition is reached as part of this update, an enabled pipe broadcast will be sent even though the pipe is now stopped. Modeller's broadcast handling code can test the pipe control value to handle this case if needed.<BR/>
* '''CLEAN''' Rewrote how table views manange views, many renames for dependencies<BR/>
* '''NEW''' DLL:Added table data changed callback capability to PL/PLEngine<BR/>
* '''FIX''' Pipes with any broadcasts enabled were always sending load limit broadcasts<BR/>
* '''FIX''' PLAsDLL callback LookUpLabelDValue was incorrectly parameted in PL<BR/>
=== 8.60.0 ===
* '''NEW''' Pipe options "Broadcast Source Level Monitor" and
"Broadcast Target Level Monitor"    #4839
enable thresholds to be specified. When source/target cross this
level (either direction) a broadcast is sent.<BR/> A broadcast is not sent on run start or when a pipe starts from stopped.<BR/> This enables monitoring of stockpile levels etc. whilst the pipe continues to run.<BR/> The monitor level references can be changed dynamically, if the pipe is running and the change impacts the comparison, expect a level change broadcast when the next pipe bin update occurs.<BR/> Do not rely on exact euality as no rounding is performed in the test.<BR/> Nonitor level change broadcasts are not affected by the "Only Pipe Stop/Start resets broadcasts" pipe option.<BR/>
* '''NEW''' The pipe change broadcast now sends an additional value, "_pipechanged". This is set for any value in "_pipeflags" that has changed since the last broadcast.<BR/> This is particularly useful for the new level monitor broadcasts: "_pipechanged" indicates what changed to send the broadcast (non zero bits)
"_pipeflags"  indicates the state of the pipe<BR/> A single broadcast may convey multiple changed bits so test carefully.<BR/> The bits used for _pipechanged and _pipeflags are now: 1 : Target At Upper Limit 2 : Source At Lower Limit 4 : Load Limit At Zero 8 : Source >= Source Monitor Level 16 : Target >= Target Monitor Level<BR/> These are in the _pipe_bc_flags label list.<BR/>
* '''CLEAN''' Big internal re-organisation of the Main module with most callbacks moved to a separate module. Clean and documentation of the #define options for the Win32 EXE, Win32 DLL, Linux EXE, Linux LIB and Android build targets.<BR/>
=== 8.59.1 ===
* '''CHANGE''' DLL call interface TABLEDIRECT params now send dataobject for the table handle compatible with plengine. This does not affect existing DLLs.<BR/>
=== 8.59.0 (new model version) ===
* '''NEW''' Model/Engine option "Scope Pipe Events BCs To Pipe's Scope". If selected, pipes broadcast change events only to their scope instead of globally.<BR/>
* '''CHANGE''' Closing a routine editor now triggers the check for autosave interval.<BR/>
=== 8.58.1 ===
* '''NEW''' An embedded dotNET window (in a Paint Window object) will now get size change updates. If the parent paint object is anchored and the panel its on resizes, the dotNET control can respond and do its own dynamic layout.<BR/>
=== 8.58.0 (no model version change - DLL progress only) ===
* '''FIX''' Planimate DLL call was not reporting any errors transferring data back after calls in NON table-direct mode.<BR/>
* '''FIX''' Planimate DLL call table parameter passed with a column was not writing data back to the table (fix above exposed the error).<BR/>
* '''FIX''' Fixes to PL-as-a-dll broadcast tuple handler if run needed to start (was not handling separate thread case)<BR/>
* '''NOTE''' PL DLL calling API V20 adds PL_GetProc callback which enables use of the PL-As-A-DLL functions (and hence PL.Net wrapper) in DLLs that Planimate is calling. This is directly available but provided mainly for the C# wrapper (see below).<BR/>
* '''NOTE''' PL.Net updated to PL V8. Now PLCLR (the newly developed Planimate call dotNET bridge DLL) can use it to enable C# DLLs that PL calls to call back to PL (eg: to broadcast or access PL dataobjects on their own).<BR/> ***** And so we've come full circle *****
- dotNET/C# can call/embed Planimte
- Planimate can call/embed dotNET/C#<BR/> A new merged DLL API will be released when its ready and documented.<BR/>
=== 8.57.2 (unreleased) ===
* '''FIX''' AddPipe now supports use with an original pipe that uses a pipe configuration table.<BR/> For this to work, the target should be a cell in a newly added row in the pipe configuration table which will receive the new pipe object index.<BR/>
=== 8.57.1 ===
* '''FIX''' DLL call API now support AUTO type output only parameters and added support for I/O label list transfer. Existing DLLs unaffected.<BR/>
=== 8.57.0 ===
* '''NEW''' New Paint object "Window" provides a place for a Windows child window which along with PLCLR enables a dotNET form/control to be embedded as a modeless interface in Planimate [Experimental] Not supported in a viewport and resize support yet to come.<BR/>
=== 8.56.1 ===
* '''FIX''' I/O parameter handling in DLL call ASFUNCTION mode calls<BR/>
=== 8.56.0 (new model version) ===
* '''NEW''' System attribute s.ContinueCurrentTimeOnly. Any write to this system attribute causes Planimate to continue processing events until there are no more events at the current time.<BR/> This is intended for use in "non FEC" broadcast cases such as table view "Don't defer BC on FEC" and Gantt view "Send Broadcast On Mouse Down". In these cases a broadcast is sent immediately with no other side effects being processed.<BR/> You would find such side effects on the FEC, with PL paused.<BR/> By using s.ContinueCurrentTimeOnly=1 you can ensure other broadcasts and unblocking as a consequence of the broadcast are processed.<BR/> Up to now modellers have been able to use s.ContinueRun=1 but this would cause the simulator to continue on to future events if a simulation run was in progress which is not always desirable.<BR/>
* '''NEW''' The highlighted DLL parameter in the DLL parameter popup is now bolded and remains so if another parameter is clicked. Default column widths have been tweaked. #4800<BR/>
* '''FIX''' Ctrl-F (insert a function in the reference editor) was broken since 8.38.1. If you've never used it, it pops up a useful list of all the maths and string operations that are available wherever data is referenced - not just in a routine.<BR/>
* '''FIX''' Synchronised the code for train graphs and gantts, both have the fix width from 8.55.1. Also reduced redundant data processing.<BR/>
* '''FIX''' Rewrote the way popups are managed when editing a reference. Resolved interlock issues which caused deadlock in the routine editor when the step editor was closed whilst the parameter popup was visible.<BR/>
* '''CLEAN''' Teased apart the field based reference editor from the old dialog reference editor, now only used to insert references. Previously the two were part of the same class.<BR/>
=== 8.55.1 ===
* '''NEW''' DLL API now supports parameters which are both input and output. They are defined as PL_IO in the DLL definition table and appear and are accessed as inputs in the DLL (like TABLEDIRECT is already) except any changes made to them will be propagated back to the source data.<BR/>
* '''FIX''' Non Auto X scale for gantt now supported<BR/>
* '''FIX''' Gantt now sends right click broadcasts as well with _buttons attribute set 1=left 2=right.<BR/>
=== 8.55.0 ===
* '''FIX''' DLL parameter dialog highlights the line for the parameter the carat is currently at. Does not work for nested function parameters.<BR/>
* '''FIX''' Some cleanups to DLL parameter dialog handling<BR/>
* '''FIX''' Shift key grid override when dragging  #4795<BR/>
* '''CHANGE''' Internal rework of DLL API to support embedding dotNET/managed code The new API will be released when it is ready. Previous DLLs should be Ok.<BR/>
* '''CLEAN''' Palette caption handling<BR/><BR/>
=== 8.54.0 ===
* '''NEW''' Gantt click includes value "_drag_type" values being 1=left edge, 2=right edge, 3=center. A right click bitmask of 4 may be added in future.<BR/>
* '''NEW''' Gantt option "Send Broadcast On Mouse Down" causes block click broadcasts to be sent on the mouse down instead of on release. This supports dragging.<BR/>
* '''NEW''' Routine operation DragGanttBlock() performs the graphical drag of a block in a gantt. Works in conjunction with gantt click broadcast. Refer to "Gantt Block Move" demonstration model.<BR/>
* '''FIX''' Vertical bar graph mode can extend negative<BR/>
* '''CLEAN''' Cleanup of internal move/resize rectangle code<BR/>
=== 8.53.3 ===
* '''FIX''' Case where a table edit did not update the screen.<BR/> Detail:situation of an item animating due to a table after-click BC for a table configured with single click to edit and to show the current cell was causing the animation manager to overwrite the update to the edited cell. The way table cell selections are updated from animation buffer1 to window now uses direct blit instead of via flushing dirty rects, keeps the animation layer (buffer2) in sync and intact. Refer 8.46.1 / 8.30.1 / 8.30.1 / 8.25.1<BR/>
=== 8.53.2 ===
* '''FIX''' Train tails offset<BR/>
=== 8.53.1 ===
* '''FIX''' Co-ordinate calculation for single roads had an optimisation with incorrect logic, introduced 8.53.0<BR/>
* '''CLEAN''' Internal project file cleanup / renames, builds with VS2008,2013,2015<BR/>
=== 8.53.0 (new model version) ===
* '''CHANGE''' The code that displays roads for tracks and spatial links has been rewritten. On screen road ordering now follows new rules. Simulation logic is unaffected.<BR/> For spatial links, roads are now numbered from 1 (as for tracks)
for all cases.  This makes indexing in tables easier.<BR/> For multi-road tracks and spatial links, roads are now numbered from the top down (for a left to right link, rotate accordingly if the link is angled).<BR/>
---1---
[A]---2---[B]
---3---<BR/> Roads are now always spaced by the same distance (no double space for 2 road case). When there is an even number of roads, the road lines are offset to keep the display symmetric.<BR/>
* '''NEW''' Routine operation SetLinkRoads enables the number of roads and road spacing of a spatial link to be set.<BR/>
* '''NEW''' SetLinkColor has an extra parameter to specify which road default=0 selects all roads, otherwise 1 .. road_count valid<BR/>
* '''CHANGE''' ClearSpatialCache renamed to ClearLinkCache AddSpatialLink renamed to AddLink RemoveSpatialLink renamed to RemoveLink SetSpatialLinkWidth renamed to SetLinkWidth CopySpatialLink renamed to CopyLink DeletePanelSpatialLinks renamed to DeletePanelLinks<BR/>
* '''CHANGE''' Operations SetLinkColor, SetLinkWidth,SetLinkCost,SetLinkRoads and RemoveLink now will accept a spatial link data object passed in the Portal 1 parameter. Portal 2 should be zero in this case.<BR/>
* '''FIX''' Positioning of popup'stop left retained when ReFitPopup used<BR/>
* '''CHANGE''' The default value of TrackRoadSpacing is now 9 as this value is interpreted differently (see notes above). This keeps double tracks spaced similarly to previous versions.<BR/>
* '''FIX''' Prevent single line title box being shown in Table Views when No Margins option is selected.<BR/>
=== 8.52.0 (new model version) ===
* '''NEW''' Experimental Spatial links now have road count/road spacing settings Item has system attribute "ItemLinkRoad" [OBSOLETE CONTENT REMOVED SEE 8.53.0]<BR/>
* '''FIX''' The engine was not properly handling the _system_close broadcast when a run stop was initiated from model code. This would lock UI if the modeller cancelled the system close.<BR/> This issue was introduced by changes to reduce flicker during PL close.<BR/>
* '''FIX''' An Exit configured to "Stop All Runs And Quit" would also trigger a save<BR/>
* '''NOTE''' Merged bend display code for pipes, track roads and new spatial link roads.<BR/>
=== 8.51.1 ===
* '''FIX''' Have changed the way HTML Help is called to make it compatible with windows 64 bit (statically link, removed event relay since HTML Help runs in its own process these days).<BR/>
* '''NOTE''' HTML help does not load content properly if the CHM file is on a network drive.<BR/>
=== 8.51.0 (new model version) ===
* '''NEW''' Broadcast "_Panel_Layout" is sent to a popup or main window panel when a window is opening before the "_Panel_Visible" broadcast. It is sent at a time before the size of the popup has been finalised. This enables code to determine the size of a pop up panel as it opens.<BR/>
* '''NEW''' New view properties NoScrollWidth and NoScrollHeight return the width/height that a table view requires to not need scrollbars. The values include space for scroll bars unless the table view options to hide vertical/horizontal scroll bars are selected. #4756<BR/> This property must be used in a broadcast where the panel is visible or becoming visible (such as _panel_layout). Using this when the panel is not visible will give a platform error.<BR/>
* '''NEW''' Routine operation ReFitPopup() enables a modeller to update the area used by a popup window. This is intended to be used within the "_Panel Layout" broadcast after a model has made changes to the size of a panel whilst a popup of that panel is opening.<BR/> This is useful following FitPanelToArea() after views have been positioned/resized by modeller code.<BR/>
* '''NEW''' Table view option "No Margins" reduces margins in table views. This is useful in conjunction with the Hide Title view option. #4745<BR/>
* '''NOTE''' When a table view has no margins and its title hidden, you can access its edit menu by right ctrl-clicking on cells in edit mode.<BR/>
* '''NOTE''' ReFitPopup() is not designed to work with Anchoring. Use Anchoring to position objects given available space in a window. Use ReFitPopup to minimise a popup's size based on used panel area.<BR/>
* '''FIX''' No longer purge unreferenced attributes which have a view #4755<BR/>
=== 8.50.3 ===
* '''FIX''' Change to BrowseFile in 8.50.2 had broken when browsing for read<BR/>
=== 8.50.2 ===
* '''FIX''' The Don't Show Frame panel popup option now applies to popups configured for modal dialog<BR/>
* '''FIX''' Routine editor multiline fields allowed newlines to be pasted which would render the model unloadable.<BR/>
* '''FIX''' BrowseFile now properly sets extention of a typed file name to the selection made in the file type combo if the name entered did not have one.<BR/>
=== 8.50.1 ===
* '''NEW''' Column option "Always Edit As Single Line" forces a text field formatted column in a table configured with rows having a multi-line height to not use ENTER to start a new line. #4751<BR/>
* '''FIX''' CreateMD5Hash() now supports the LHS parameter being text formatted #4730<BR/>
* '''FIX''' Panels with popup options configured to "Act As Modal Dialog" were ignoring the "Hide Caption Bar" option, now fixed. Note that it is your responsibility to provide a way for the user to close such a popup since the window close box is hidden. #4746<BR/>
* '''FIX''' When saving a model, if the compressed result of a table column blob dump was exactly 1024 bytes, a new line inserted before the terminator marker caused the model not to load. This was fixable by removing the new line in the MDL. #4729<BR/>
* '''SPEED''' Moved table column DataWriter buffer to stack from heap<BR/>
* '''REMOVE''' Redundant option Always Load DLL From File.  #4743<BR/>
=== 8.50.0 ===
* '''REMOVE''' The ability of a Planimate executable to change itself into a DLL has been removed. See note in 8.48.1.<BR/>
* '''REMOVE''' As per note in 8.48.1, Planimate calling a DLL now always loads the DLL from a file. Please remove DLLs in DB files, they just waste space. The /DEBUGDLL command line option is obsolete and removed.<BR/>
* '''RENAME''' Command line option /MAKEEXEKEY renamed to /EXEKEYFILE<BR/>
* '''REMOVE''' Command line option /DEBUGDLL<BR/>
* '''CHANGE''' DLL call API added get window handle callback, API now at V19<BR/>
* '''FIX''' It was possible to segfault PL by using F2 to full-line-edit a Dialog() routine line. The current implementation of Dialog() does not support arbitrary attributes used for titles etc. Some safeguards have been added but the Dialog() will not be otherwise enhanced as upcoming dotNET integration makes it obsolete.<BR/>
* '''CLEAN''' Internal cleanup of startup/shutdown code<BR/>
=== 8.48.2 ===
* '''FIX''' Clearing a cell range now works correctly with ranges of filtered rows. #4690<BR/>
=== 8.48.1 ===
* '''FIX''' SetViewportZoom range checks the zoom factor provided<BR/>
* '''FIX''' A compiled PBA will only look for external DLL files in the
same folder as its EXE instead of its current working directory.  #4674<BR/>
* '''REMOVE''' FORWARD NOTICE that Planimate 8.50 will remove: 1) Ability for Planimate to convert itself into a DLL. A precompiled DLL version of Planimate will be available on request to users with an active level 4 subscription. This DLL will be selectable when making a PBA if your target is a DLL.<BR/> 2) Planimate calling a DLL purely "in-memory". Instead, your PBA's installer will need to ensure any called DLLs are placed in the same directory as the PBA executable.<BR/>
=== 8.48.0 ===
* '''CHANGE''' There was a minor memory leak when repeatedly calling a DLL function with TABLE, LABELLIST or STRING parameters. The more common functions using TABLEDIRECT and ATTRIBUTE only were unaffected.<BR/> This was introduced in 8.38.<BR/> The fix removes 8.38's optimisations when these parameter types are used in DLL calls. For speed critical applications recompile the DLL using version 17 of the Planimate call DLL API.<BR/> Note this is unrelated to using Planimate as a dLL.<BR/>
=== 8.47.1 ===
* '''NEW''' Edit/Find now has advanced find option to search for objects which may restart the model. #4642<BR/>
* '''CHANGE''' Edit/Find now searches RTF note link text, RTF note names for DB based notes and RTF note text for in-memory (non DB stored) notes.<BR/>
=== 8.47.0 ===
* '''CHANGE''' Model option "Pause After Run Start" is now ignored for runs with /BATCH or /TESTRUN command line options.<BR/>
* '''CHANGE''' When /BATCH or /TESTRUN are used, a model attempting to open a popup is now logged as an error and the run is stopped since the model cannot depend on the result of an interaction with a non-popup.<BR/>
* '''CHANGE''' s.AutomaticRestartAfterError is now IGNORED when /BATCH or /TESTRUN command line options are used. Any error ends the run.<BR/>
* '''FIX''' Protect internal SetNeedRedraw / FlushToScreen in WindowList in case user manages to call them in /BATCH mode<BR/>
* '''FIX''' Missing table update when double buffered display mode and non current cell clicked in single click to edit mode (the selection box was remaining on previous cell until after the new cell edited).<BR/>
=== 8.46.1 ===
* '''FIX''' Table views with "Single Click To Edit" de-selected in run mode were missing a display update when cells were clicked but not edited (introduced with animation layer rewrites). #4613<BR/>
* '''FIX''' Added interlock to prevent closing routine editor whilst a routine line edit was active. #4610<BR/>
* '''FIX''' Mouse down tracking rows, columns, filter columns and resizing columns was also missing a display update in run mode due to double buffered animation needing RegisterDirty / Flush in the tracking loop.<BR/>
* '''FIX''' Increase DLL parameter popup initial size #4611<BR/>
* '''FIX''' DLL parameter popup wasn't sizing properly/showing scrollbars Note this palette can be resized from the bottom right corner<BR/>
* '''NOTE''' Low level changes to dialog/UI handling<BR/>
=== 8.46.0 ===
* '''FIX''' The expression parser was removing brackets in cases like 1/(2*3) . Although the expression was parsed properly, subsequent text editing with the missing brackets would result in it not acting as expected. #4609<BR/>
* '''CHANGE''' Routine operations Add,Sub,Mul and Div used to present themselves as +,-,* and /. This became a minor problem when the ability to enter mathematical expressions within a reference was added, because it created situations like where the display of the routine operation "Sub (-)" with an expression as a parameter would not include needed brackets.<BR/> This became more of a problem when the textual parsing of routine lines was implemented in Planimate 7, a wonderful example of compounding unintended consequences of otherwise innocuous changes.<BR/> These routine operations now present as functions in routine code to clearly distinguish them from the equivalent mathematical expressions. This also resolves another potential text edit issue when these operations are used to process entire table rows/columns,<BR/>
* '''TIP''' Using routine operations Add/Sub/Mul/Div to process entire table rows/columns has always been a Planimate feature though it had become problematic with text parsing of "+"/"-" as you cannot perform arbitrary expressions on entire rows/columns yet.<BR/> Hence be aware that these routine lines are all valid:<BR/> t.table1.Column(3) = Add(t.table1.Column(2),123) t.table1.Column(3) /= 5 t.table1.Column(5) = Mul(t.table1.Column(3),t.table2.Column(1))<BR/> and they process MUCH faster than iterating in a loop.<BR/>
* '''NOTE''' A future version of Planimate may convert uses of Add,Sub,Mul and Div in routines to expressions using +,-,* and /, depending on feedback.<BR/> This version has made NO changes to the model format or internal representation of the routine, it is just distinguishing the routine operation from the expression operation in the listing of the routine code.<BR/>
=== 8.45.1 ===
* '''FIX''' The "experimental" Parameter Popup (8.38.1) for DLL calls was referencing the wrong place for output parameter information, leading to seg-fault if a DLL routine operation had less inputs than outputs. Info in the popup might also have been confusing.<BR/>
=== 8.45.0 ===
* '''NEW''' Group Anchor stretch limits can automatically determine the required width and/or height for a table view (ie: no scrollbars needed).<BR/> To enable auto max sizing for group anchored table views, set the Stretch X Limit and/or Stretch Y Limit to -1. Closes #4594<BR/>
* '''FIX''' Group Anchor stretch limits, pixel roundoff<BR/>
=== 8.44.0 ===
* '''NEW''' New anchoring options "Stretch X Limit" and "Stretch Y Limit" enable a maximum size clamp on anchor managed objects configured to resize for the given axis. These specify a limit in pixels for after which remaining space is allocated to other resizeable objects in that row/column. #4564<BR/>
* '''NEW''' Work Area menubar menu also shows minimum panel size #4585<BR/>
=== 8.43.2 ===
* '''FIX''' Dragging group of anchor managed objects propagating base layout update. Missing Refresh fixed 8.43.1 had hidden that the update wasn't occuring.<BR/>
=== 8.43.1 ===
* '''FIX''' Dragging a group of objects now prevented if at least one object is using anchor management and the panel is not at the minimum size for the layout.<BR/>
* '''FIX''' Panel / "Resize To Minimum For Layout Editing" missing refresh<BR/>
=== 8.43.0 ===
* '''NEW''' Group anchor now supports objects positioned within objects.<BR/> In the Anchor Settings, the modeller can specify a Group Number. Objects with the same group nubmer are processed together. Hence Group 1 objects have their positions determined before Group 2, Group 2 before Group 3, etc.<BR/> Objects can also be assigned a Parent Paint ID. This value is looked up in the paint label list and enables a paint object to be provide the default "edge" for anchoring instead of the panel.<BR/> This is useful in a case where a bounding frame for a user interface area is managed by a paint object in Group 1, and buttons that will be within this object, configured in Group 2, can then refer to their bounding frame. This enables much more complex layouts to be automatically managed.<BR/>
Note that the  Parent Paind ID must be an index to a paint object
which is on the same panel and which has a LOWER group number than
the object referring to it. Otherwise the setting will be ignored
by the anchor manager.<BR/>
* '''FIX''' Paint object references were not being properly updated during copy/paste of model hierarchies containing them. This has most likely been the case since version 5.<BR/>
* '''FIX''' If a non-portal was targetted for a Dispatcher broadcast target, an error in the error message report would cause user disappointment.<BR/>
* '''CLEAN''' Internal renames to clarify copy / paste model structure management<BR/>
* '''NOTE''' Code internally compatible with VS2015 apart from EXE to DLL which will be eventually replaced with distributing directly compiled DLLs.<BR/>
=== 8.42.1 ===
* '''FIX''' The label list editor was not using the correct method to search for an existing label. Likely introduced 8.30.0.<BR/>
* '''CLEAN''' Convert the code that manages memory tables to use templates<BR/>
=== 8.42.0 ===
* '''NEW''' DLL API updated to version 16, added callback HoldSectionRoad()<BR/>
=== 8.41.0 ===
* '''NEW''' Anchoring value "Group Anchoring Lock To Point" enables an object to act as if its scaling in a layout but then retain its initial size, based upon a co-ordinate set by this value. This enables more complex layouts where multiple columns of resizing views all should align but some of the views should not actually be resized.<BR/> The value sets the corner to align to after the layout is completed: 1 = top left 2 = top right 3 = bottom left 4 = bottom right 5 = center within space<BR/> NOTE that aAnchoring other objects to the edges of a "locked" object may lead to unexpected results.<BR/>
* '''FIX''' Anchoring more complex arrangements of multiple adjacent objects<BR/>
* '''CLEAN''' Commonize memory management code<BR/>
=== 8.40.5 ===
* '''FIX''' DLL API reallocate rows now commits the current rows used as set by the DLL before the reallocation, not doing so was losing the appends made by the DLL just before reallocation of the table.<BR/>
=== 8.40.4 ===
* '''NEW''' Added debug logger diagnostics:
- switch lookahead result
- switch lookahead previous cache hit
- switch lookahead cache reset
- lookahead into track result
Internal module rename/include re-org to clarify the engine<BR/>
* '''FIX''' The time range filters for the Debug Logger did not handle models with a different edit/run dates or a model that changed its run date.<BR/>
* '''FIX''' Debug Logger window now restores properly after being hidden and is less resource intensive whilst running with it minimised, even though events are still being logged.<BR/>
=== 8.40.2 ===
* '''FIX''' Called DLL reducing size of table direct table now properly propagated.<BR/>
=== 8.40.1 ===
* '''FIX''' Table paste handler now allows empty label cell text if label list option "Interpret Empty Input As Label Index 0" is set.<BR/>
* '''FIX''' Table paste handler skips empty cells for numerics, using the clear value instead. Note labels are separate and handled as described above.<BR/>
* '''FIX''' Table view Ctrl-V honours in place edit / edit during run state options<BR/>
=== 8.40.0 ===
* '''NEW''' Group Anchoring & The Layout Manager<BR/> A new anchoring system enables more sophisticated model UI layouts where multiple views can scale in a co-ordinated manner to fit the available window area. Previous versions required complex model code to maintain the layout and it was easy to disrupt the layout whilst editing the model.<BR/> The new layout system is backward compatible with previous models, which default to anchoring to screen edge only, as previous.<BR/> An object will have its position managed by the new layout manager if its anchor option "Group Anchoring" is selected and at least one edge has an anchor set.<BR/> Its called Group Anchoring because an object anchors to the closest adjacent object which also has "Group Anchor" selected.<BR/> If there is no adjacent object for a given anchored edge, the edge of the panel is used.<BR/> The layout manager can be used as follows (graphical sizing method):
- Enable Panel Options / Engine / "Auto Fit Panel To Window" and
Disable Model Options / Engine / "Globally Disable Panel Auto Resize"
- Size the PL window to a "minimum" size that supports your layout.
The panel size should adapt.
- Select Menubar / Panel / "Resize To Minimum For Layout Editing".
Assuming the panel didn't already have a minimum size, Planimate
should offer to set the minimum size for you.
(note that selecting this option sets Model Option / Engine /
"Globally Disable Panel Auto Resize").
- Create a layout of views on the panel. Paint & Viewports also work.
- Set anchors on single edges if you want to retain a margin
or both opposite edges to enable scaling.
- X and Y axis are processed separately (refer to example model).
- Don't forget to also select the "Group Anchor" option.
- You can now test your layout by disabling "Globally Disable
Panel Auto Resize". For your convenience, you can access this
from the Window menu.<BR/> You can revert to the base layout using the menubar "Resize To Minimum For Layout Editing". This restores the objects to their base position.<BR/> The manager works by striving to retain the margin to the closest adjacent object for edges which have an anchor set. If both sides of an object have anchors, the object is stretched to maintain the margins.<BR/> Where multiple such objects are in a row (or column) the manager will apportion extra space based on a ratio that the modeller can customise.<BR/> The layout manager works well for situations for which it is intended. It has known limitations:
- reflow of objects is not supported (objects rearranging in 2 axes)
- it does not attempt to handle situations where changes to one axis
create/remove a constraint on the other axis
- it does not support intersecting or contained objects
(conceivably the modeller could use its result as a starting point
to positioning unmanaged objects). Closes #4453.<BR/>
* '''NOTE''' Use of Group Anchoring with objects that use Paint Inheritance IS NOT SUPPORTED.<BR/>
* '''NEW''' In paint mode, edges of views and paint objects which are anchored are highlighted using a dashed line. If the object is not "Group Anchored" the markers are red, otherwise they are blue.<BR/> The Window menu has a new option "Toggle Anchor Markers" to hide the anchor indicators.<BR/>
* '''NEW''' Menubar Panel option "Resize To Minimum For Layout Editing". This resizes the current panel to its minimum size and disables the auto-fit of all panels using the "Globally Disable Auto Resize".<BR/> This makes it straightforward for a modeller to revert a panel to its "base" size for editing a layout, avoiding having to manually set its size and disable the auto resize.<BR/> A feature of the anchor manager is that it retains the base bounding rectangle of all objects selected for group anchoring. When "Resize To Minimum For Layout Editing" is selected, all managed objects are restored to their position as last edited. This is useful when debugging a layout where the anchoring rules mess up the layout once the panel is allowed to auto resize.<BR/> If using group anchoring, you must only edit suchobjects after selecting this option to properly size the panel. Planimate will notify you if the panel is not at its base size and you attempt to move or resize a managed object.<BR/>
* '''NEW''' Menubar Window option "Toggle Disable Auto Resize". This gives quick access to the model option Engine / "Globally Disable Auto Resize". It is useful when you want to test a layout after having worked on it with the panel size restricted to its minimum.<BR/>
* '''NEw''' The Paint Mode background context menu has a new option in the "Other Options" submenu, "Enable Group Anchor For All Anchored". Selecting this will enable the new "Group Anchoring" anchor option for all views and paint objects which have at least one edge already anchored. You will see the anchor markers change from red to blue.<BR/> This option is intended to assist modellers converting existing layouts.<BR/>
* '''NEW''' New anchor settings: "Group Anchoring X Stretch Ratio" "Group Anchoring Y Stretch Ratio"<BR/> These values apply only to objects anchored on both sides, horizontally and vertically respective.<BR/> The actual values do not matter, Planimate uses the ratio between the values to determine how additional available space is allocated in cases where multiple resizeable objects are in a row or column.<BR/> This can be useful where its desirable to have one view (such as a graph) get much more allocation to additional space than another view.<BR/>
* '''NEW''' Alt-clicking the edge of a view or paint object in Paint Mode toggles anchoring on/off for that edge. This is indicated graphically by the anchor marker display. Alt-clicking beyond the edge shows the object's Anchor Options dialog.<BR/>
* '''NEW''' Paint context menu / Other Options / "Bring Off Panel Objects Into Panel" can be used to regain access to objects positioned outside the panel's area.<BR/>
* '''FIX''' Newly added Paint/Image objects were being added to the bottom left of the panel instead of at the selected location.<BR/>
* '''FIX''' If index matching had a bad column, it would be report the error then segfault Planimate.<BR/>
=== 8.39.1 ===
* '''FIX''' Fix DLL parameter type name typo<BR/>
=== 8.39.0 (new model version) ===
* '''NEW''' Table view context options for model editors only: "Copy/Export Table With Options" "Paste/Import Table With Options"<BR/> These give access to the Import/Export clipboard options for tables that are otherwise reached in the Table Editor context menu.<BR/> These options do not appear in PBAs.<BR/>
* '''NEW''' Three new Track system attributes add flexibility to track display:<BR/>
s.TrackRoadSpacing  sets a value used to calculate spacing between
track roads (default 4.5)
s.TrackLineWidth    sets the line width of track lines (default 2)
s.TrainCarDisplay  if set, selects to show train cars instead
of noodles (default 0)<BR/> These can be changed during run though they require a force repaint to take effect. The options are not saved as they are intended to support dynamic scaling based on map zoom.<BR/> The train car/noodle toggle is useful in cases where zoom levels make train cars too small to display.<BR/> Noddle display has been defaulted since its more "established".<BR/>
* '''FIX''' Fix the math used for train car calculations, track down and eliminate an edge case which caused flicker as trains started on a road. (auto-calculation of direction failed when tip of train on track).<BR/>
* '''NOTE''' Currently train cars do not get drawn if their length is partially within a node (multiserver / entry), this is a result of doing the math properly and awaits review of Future Of Tracks.<BR/>
* '''CLEAN''' Large rewrite and merging of the track train car/noodle processing<BR/>
* '''FIX''' The changes to train item length in 8.37 caused it to be uninitialised until either a modeller set it or an item was recycled by the item allocator. This could cause random nasty train length calculations if the modeller did not explicitly set length.<BR/>
=== 8.38.1 ===
* '''NOTE''' Routine/expression editing is in experimental state due to rework. Please report any new anomolies when typing references. Models saved with this version ARE compatible with 8.30.0 in case any show-stoppers have been introduced.<BR/>
* '''NEW''' Planimate displays DLL functions in the dropdown completion list when you type the name of a PL DLL followed by ":", eg: you've typed "matmult:" and have the matmult.dll available. If PL cannot load the DLL, the editor continues without suggesting the completion.<BR/>
* '''NEW''' Experimental parameter popup when you begin typing parameters to a DLL, eg: you've typed "matmult:DotProduct(". This popup persists while you type in parameters for the call, displaying names, types and parameter comments set by the DLL author.<BR/> The popup can be positioned/resized. A future version will save its position in defaults. A future version may extend use of this popup (eg: routine, function and property parameters). DLL call nesting is not completely handled.<BR/>
* '''FIX''' Divide by zero in train car dividers (points on top of each other)<BR/>
* '''NOTE''' train car dividers were introduced 8.32.0 are still in "EXPERIMENTAL" state. They may be removed depending on feedback.<BR/>
* '''FIX''' Cancelling edit of a routine line comment was not undoing changes #4461<BR/>
=== 8.38.0 (new model version) ===
* '''NEW''' Rewrite of Planimate's internal management and calling of DLLs.<BR/> For model editors, DLL calls are now expression functions instead of routine operations. These take the form:<BR/> result = dllname:functionname(parameters)<BR/> This change has a number of benefits:<BR/> * You can call a DLL multiple times on one routine line or as part of a bigger expression or a parameter to another routine operation, or even in a condition. * The calls are performed much quicker due to caching and optimisation. This is important when the DLL will be called very often. * Calls to a given DLL's routines can occur from hundreds of places in a model (eg: at locations), this is efficiently handled. * The DLL API now allows DLLs to return a data value instead of the usual processing status code. This is useful for maths functions. * Calls to DLLs in lookahead are now supported, in the past they were skipped in lookahead. Enabling this requires the DLL developer set a flag for the operaiton.<BR/> Models with the old routine operation CallDLL() are translated to the new notation upon load, CallDLL() is no longer present.<BR/> Older version DLLs will continue to work. If you want to use function/lookahead call, you need to compile your DLL with DLL API version 15 and set the appropriate flags as demonstrated in the API demo.<BR/>
* '''NOTE''' At this time there is no UI/tips for the DLL routines/parameters. This is a high priority due in the next release.<BR/>
* '''NEW''' Model option "Use Highest Plus One For Object Indicies" causes Planimate to use the highest object index + 1 for the next added object index instead of the lowest unused index. #4458<BR/> This enables reversing the change in behaviour of version 8.30.0<BR/>
* '''SPEED''' Use smarter tests to determine if columns in a table are referenced to reduce overheads when columns are inserted/deleted by a model and s.DisableColumnRefUpdates is not being used to prevent unnecessary refreshing #4457<BR/>
* '''FIX''' Memory leak in PL's DLL callback cbTableFromDataObject handler.<BR/>
=== 8.37.2 ===
* '''FIX''' Clipping of mouse resized boxes was not properly handled. #4116<BR/>
* '''FIX''' Better reporting of missing _!SYSTEM.DB when loading sidebar. #4107<BR/>
=== 8.37.1 ===
* '''FIX''' PBA not running (8.36.1)<BR/>
=== 8.37.0 ===
* '''NOTE''' New track options are experimental<BR/>
* '''NEW''' Model option (Engine) "No Track CheckNext Lookaheads" If set, Planimate does not perform an extended lookahead when a train is otherwise ready to enter a track road.<BR/> This option should be enabled in models which implement their own train controller logic which does not require Planimate to lookahead test beyond the road the item is about to enter.<BR/> When set, s.DoingTrackCheckNext will always be zero and Track Lookahead Separator switches are redundant as the second path is always taken.<BR/>
* '''NEW''' Model option (Engine) "Don't Auto Add Blocked Trains In Flows" If set, Planimate does not add a train blocked by a track to the blocked train list if the train becomes blocked in a flow which attempted to move the train onto the track.<BR/> It does not prevent a train being added to the blocked train list if:
- the train is getting blocked whilst trying to leave a road
- the RegisterBlockedTrain routine operation is used.<BR/>
* '''CHANGE''' Have changed how item length is handled. It now is transferred/returned in messages and is sent in broadcasts. #4429 (the value persists even when TailInfo data isn't allocated on item)<BR/>
* '''CHANGE''' Routine operation "PasteFromClipboard" has been renamed to ImportFromClipboard to reflect that it performs the import/creation of table structure as available in the Table Editor's File menu.<BR/> This is very different to PasteIntoView and Ctrl-V pasting which paste data into the existing table structure.<BR/>
* '''CHANGE''' ImportFromClipboard (was PasteFromClipboard) error return codes have changed. Zero is still the "success" caes. Other errors are now values from the "_import_errors" label list. #4137<BR/>
* '''FIX''' Inadvertent center after anchor options edited for paint object<BR/>
* '''FIX''' Recent cleanup prevented scroll bar updatds when switching between panels with different panel areas, leading to no-redraw area situations<BR/>
=== 8.36.1 ===
* '''NEW''' Label list "_dllerrors" enumerates the return error codes when calling Planimate DLLs<BR/>
* '''NEW''' If a Windows shutdown occurs whilst Planimate is open with a changed model loaded, an autosave is performed. If the model is unsaved, the autosave file will be placed in the Planimate folder in the user's Documents folder. #4346<BR/> This is a last ditch attempt to save work, developers should manage Windows Update restart options to prevent rude and unexpected restarts - you can configure Settings/Update to give a notification when a restart is needed.<BR/>
* '''NEW''' Ctrl-A works in table editor/views to select all #4347<BR/>
* '''NEW''' Train graph event rows value can be set to zero in which case the highest label index in the associated label list is used to determine the display row count<BR/>
* '''FIX''' Added popup close completion check to the mouse move event handler to enable popups to close as result of hovering within the window's own area but over a object within that steals the hover.<BR/>
* '''CHANGE''' Have changed the way Planimate nags when a model is loaded with no DB present. A message is only given if a non-system icon fails to load.<BR/>
=== 8.36.0 (new model version) ===
* '''NEW''' Routine operation RepaintPaintObject has a new parameter "Clear Color". The default "255" (corresponding to no colour
in the _colors label list) does nothing.  #4344<BR/> If changed, the bounding rectangle of the paint object is filled with this colour before the paint object is drawn.<BR/> This is useful when paint objects with rounded rectangles are individually redrawn as alpha blending used in anti-aliasing the round rectangles otherwise leads to remnant pixels of the previous colours.<BR/> This is only useufl if the background colour that the paint object is on can be used, otherwise another strategy will have to be used such as full panel repaint or placing paint object into the animation layer.<BR/>
* '''NEW''' Routine operation AddTable() enables a model to add a table. #4345.<BR/>
* '''NOTE''' A very functional sqlite database interface DLL has been developed, this will be released into the Planimate Developers Tools idBase region after testing and documentation is complete.<BR/>
[[Category:Release Note]]
[[Category:Release Note]]

Revision as of 17:14, 14 September 2020

9.41.3

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

9.41.2

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

9.41.1

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

9.37.1

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

9.35.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.

9.33.1

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

9.32.3

  • FIX Linux handling of paths for some file operations

9.32.3

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

9.32.2

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

9.32.1

  • 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

9.31.1

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

9.30.3

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

9.30.2

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

9.30.1

  • 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

9.29.1

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

9.27.1

  • 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

9.26.2

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

9.26.1

  • 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

9.23.1

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

9.20.3

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

9.20.2

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

9.19.2

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

9.19.1

  • 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. https://wiki.planimate.com/Icon_Overlay
  • 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.

9.18.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.

9.18.1

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

9.17.4

  • 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

9.17.3

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

9.17.2

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

9.17.1

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

9.16.1

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

9.13.3

  • 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

9.13.2

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

9.13.1

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

9.12.3

  • 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

9.12.2

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

9.12.1

  • 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

9.11.3

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

9.11.2

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

9.11.1

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

9.9.1

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

9.7.1

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

9.7.0

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

9.3.0

  • 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.
    EXPERIMENTAL!
    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.

9.2.3

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

9.2.2

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

9.2.1

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

9.1.1

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