Autobackups and Autosaves

A new recovery dialog has been made for the user to select autosaves and autobackups to load from. Contains various information on the recovery file as well as a 2D screenshot of the space.


Accessory System

Added a new AccToolAnimation that can act as the basis for accessory tool animations.

Added the AccToolVessel as a new base class for tool animation vessels. This vessel acts as the main action the animation will perform (e.g. Adding or removing accessories, reset accessories on an owner)


The following were added as SIF rows when generating Configura SIF in final package str[] generateConfiguraSifRows(DsPart part, Space space):

CG= the part's TAG2 column value in the calculations dialog
NT= package count value for the part


New: public Snapper[] getSortedChildrenF(Snapper parent, SnapperFilter filter, bool xSort=false, bool recursive=false) {
New: public Instance3D mhInstance3D(Primitive3D prim, Transform t) {
New: public void mhTransformPrimitive3D(Primitive3D prim, Transform t) {
New: public void propagateValueToSiblings(MhSnapper owner, str key, Object value, SnapperFilter filter=null) {
New: public void propagateValueToSnappers(MhSnapper owner, str key, Object value, Snapper[] snappers) {

public class MhSnapBehavior extends MhBehavior {
New:    extend public Snapper{} findIntersecting(Snapper snapper, Snapper insertSnapper) {

public class MhStepperPopulator extends MhPopulator {
New:    extend public point peekNextStep(Object obj) {
New:    public point peekNextStep(Object obj) {

New:    public class MhBayAccessorySnapBehavior extends MhSnapBehavior
New:    public class MhBayAccessoryCollisionAlternative extends MhBayCollisionAlternative

public class MhBracingBehavior extends MhGenericGfxBehavior
New:    extend public Class editSnapperClass(MhBraceInfo info, MhSnapper owner=null)

public class MhBraceInfo {
New:    extend public double height() {
New:    extend public Class editSnapperClass(MhSnapper owner=null) {
New: public class MhSideElementBracingInfo extends MhBraceInfo {

New: public class MhPropagatePropsBehavior extends MhBehavior : abstract {

# Extend off this to create shared objects to reduce memory usage.
New: public class MhStorageSingleton : abstract, replacing load, modify notice {
New: public class MhStorageGfxSingleton extends MhStorageSingleton : abstract
New: public MhStorageSingleton mhStorageSingleton(str key, symbol pkg=#:package : caller eval) {
New: public MhStorageSingleton mhStorageSingleton(MhStorageSingleton st) {
New: public MhStorageSingleton mhStorageRegisterSingleton()

New: public class MhStorageUprightFoot extends MhStorageGfxSingleton
New: public MhStorageUprightFoot mhStorageDefaultUprightFoot() {

New: public class MhStorageUprightType extends MhStorageGfxSingleton
New: public MhStorageUprightType mhStorageDefaultUprightType() {

New: public class MhStorageProfileExtrusion extends MhStorageGfxSingleton : abstract {
New: public class MhStorageIBeamProfileExtrusion extends MhStorageProfileExtrusion : abstract {

public class MhRackingConfiguration extends MhStorageRowConfiguration {
New:    extend public double firstBeamZ()

public class MhFrameShape extends MhSnapperShape {
New:    public double gaugeTh;

public class CollisionPrimitiveSet extends CollisionPrimitive {
New:    final public void operator<<(CollisionPrimitive p) {

public class MhStorageElevContentSnapper extends ElevContentSnapperG2 {
New:    extend public void updateCache(MhSnapperShape shape) {

public class MhBayLevelEditorItem extends MhBayEditorItem {
New:    extend public KeyLabelSubSet restrictedUnitLoadDomain() {
New:    extend public bool allowUnitLoad(UnitLoad pallet) {

public class MhUnitLoadEnsureClearanceFunction extends MhSystemEngineFunction {
New:    extend public point levelBoundP1(MhEngineEntry level) { 
New:    extend public MhEngineEntry defaultToKeepEntry(MhEngineEntry[] entries) {

Bay editor 3D view mode

The bay editor now has a view mode selection for its 3D view.

Bay editor view mode button

Bay editor view mode dropdown

To control what view modes are available in your bay editor, override the dialogViewModes() method in your MhBayEditConfiguration class.

     * Dialog view modes.
    extend public ViewMode[] dialogViewModes() {
        return [normalViewMode];

By default, the editor world's view modes are set whenever a bay config is selected.

public class MhBayEditorDialog extends MhStorageEditorDialog {
     * Set bay config.
    extend public void setBayConfig(MhBayEditConfiguration bayConfig) {

     * Set editor view modes.
    extend public void setEditorViewModes() {
        if (World w = mhStorageEditorWorld()) {
            ViewMode[] viewModes = bayConfig.?dialogViewModes();
            w.viewModes = viewModes;
            if (viewModes.any) w.setViewMode(viewModes.first);

MhRowAnimationInfo frame count

MhRowAnimationInfo has a new field frameCount. It works similarly to bayCount in that it displays and sets the number of frame snappers during MhRowDownAisleInsertAnimation. The property is hidden by default and can be made visible by overriding the MhRowAnimationInfo class.


 * Cantilever row animation info.
public class MhCantileverRowAnimationInfo extends MhRowAnimationInfo {
     * Factory visibility.
     * This is the property owner.
     * Owner is the properties owner (animation, snapper, etc..).
    public bool visibleInProperties(str key, PropObj owner, symbol{} attributes=null) {
        if (owner == this) owner = animation();
        if (owner in MhRowDownAisleInsertAnimation) {
            if (key == "frameCount") return true;
            if (key == "bayCount") return false;
        return super(..);
New: public class MhCantileverBaySelectBehavior extends MhSelectionBehavior {
New: public class MhCantileverRowAnimationBehavior extends MhRowAnimationBehavior {
New: public class MhCantileverRowAnimationInfo extends MhRowAnimationInfo {
New: public class MhCantileverRowSnapperAnimationBehavior extends MhRowSnapperAnimationBehavior {

New package:;
  public MhFrameShape linkedFrameShape(MhSnapper owner) {


Added a standard propdef key for the parent field, cAOCompParentPK.


Added a new global AOWksfSupportGenBehavior that can be used. The behavior can now act as a singleton so this makes it so that we don't need to make one for each worksurface.

There is a new propdef for getting a worksurface's AccessoryGenerationBehavior.

TAG4 and TAG5

Added standard TAG4 and TAG5 to be registered with AO.

Chair Insert G2

Added a G2 Chair InsertAnimation. see


Addes support for super stretch of PanelFrames. Commit - 24c22f7f

Add another way to trigger junctions to generate. This is via the validate/invalidate system using the CAOCreateJunctionsKey. This was added to fix a bug where T-Mounted panels could get disconnected, but wouldn't get a dropped call and thus would be missing junctions. This is triggered by the disconnect call on the leftSnap and rightSnap connectors.

Cleaned up and split up tryPickedUpFavorite() on PanelFrame. It now supports PropertyStretchAnimations which helps support superStretch for panels. Added a removeJunctionsOnPickUp(SnapperSelection selection) method that handles the removal of junctions during pickup.


Added a method for applying the palette. '''cm /**

  • Apply. */ extend public void apply() : abstract { // Subclass Responsibility! } '''



Palette scheme apply

Added a method for applying a palette to props schemes. '''cm /**

  • Palette scheme apply. */ extend public void paletteSchemeApply(Snapper{} snappers, Space space) '''