ReleaseNotes:Planimate 4.24 Release Notes

From Planimate Knowledge Base
Jump to: navigation, search

Release notes, bug fixes and misc enhancements to Planimate 4.24


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

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


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


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

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


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

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

  • Object etc. dragging step interval can now be set

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

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


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

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

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


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

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

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

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

  • "Scenarios" have been renamed "Data Sets"

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

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


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


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


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

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

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

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

  • fixed label list assign problem in attribute code


  • new hierarchical model window browser

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

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


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

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

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


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


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


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


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


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

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

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


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


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

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

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

This will allow for more operations dealing with formatting

  • New Routine Operations:

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


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

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


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

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


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

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

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


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


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

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

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

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


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

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

idkbase note 151