Overview

UltraLazyExtensions (a.k.a. Extension Startup)

The Lazy Extensions (UltraLazyExtension) and lazy startup behavior have been around for a few releases, but in 13.5 some improvements and fixes have been made. Refer to the Lazy Extension Reference for more information on this system and migrating your extensions.

cm.abstract.office

Panel Frame Changes

PanelFrameInsertAnimationG2 was written using the animation spawning to try and emulate the 'states' that the old animations had, but the implementation here was buggy and hacky, so it was redone from scratch and just implemented it's own state functionality so that there is more parity with the old animation, but also has all the support that G2 animations bring. Some other small bugs or odd behaviors were noted with the PanelFrame snapper and so some small changes were made as needed.

cm.core

PickShape Changes

Some classes and methods associated with REDPicker3D have been updated to include a new default, optional parameter checkForPickSurface=false to allow developer greater control over whether pick surfaces are detected during picking operations.

Note that the previous implementation implies a value of checkForPickSurface=true, while the new optional parameter defaults to checkForPickSurface=false to be consistent with other existing methods. Simply add or change the parameter to true to retain previous behavior.

Compile Time Changes

CollabG3 (CollabPro)

collab.core.g3.ui

New argument to differentiate between generic upload failures and failure due to storage being full.

//CollNotificationManager (collNotificationManager.cm)
Old: extend public void showUploadFailNotification()
New: extend public void showUploadFailNotification(bool storageFail=false)

Compiler and CM Language

The following changes have been made that affect the CM language, or how it compiles:

enum toS methods

In 13.5, enum types automatically implement a toS function, unless the -toS property is specified on the declaration. The toS method on generated box classes will refer to the unboxed toS, so the toS output on enum box classes and their unboxed equivalents will now match (by default).

Thus, if you want to implement your own toS for an enum, all you need to do is add -toS to the enum declaration and write your own toS function.

public enum foo : field access {
    foo;
    bar;
    baz;
};


/**
 * This is a trivial toS function so it can be removed in 13.5
 */
public str toS(foo f) {
    switch (f) {
      case foo: return "foo";
      case bar: return "bar";
      case baz: return "baz";
    }
}

public enum bar : field access, -toS {
    foo;
    bar;
    baz;
};

/**
 * This is a non-trivial toS function; add the -toS property to the enum declaration
 */
public str toS(bar f) {
    switch (f) {
      case foo: return "bar: foo";
      case bar: return "bar: bar";
      case baz: return "bar: baz";
    }
}

seq.setCount is now marked unsafe

The setCount function on sequences (such as int[]) is now considered "unsafe" and should not be used where alternative solutions are available.

  • If you want to clear a sequence, use clear() instead of setCount(0)
  • If you want to truncate a sequence (reduce the number of items), use truncate(n) instead of setCount(n)
  • If you want to allocate a sequence and immediately setCount (often needed when interfacing with foreign code), use the new constructor argument int[] foo(count=128);. Note that an unnamed argument specifies capacity, not count.

cm.abstract.dataSymbol

cm.abstract.dataSymbol.alternativeCatalogs

Replaced deprecated controller assignedCollection field.

// Controller (alternativeCatalogsController.cm)
Old: public int->AltCatsColl assignedCollection : deprecated;
     public str->AltCatsColl new_assignedCollection;
New: public str->AltCatsColl assignedCollection;

deprecated alternativeCatalogsOption constructor, since its use could result in buggy behavior.

// Option (alternativeCatalogsOption.cm)
Old: public constructor(str catalogCode, int portfolioId, str label) : deprecated { }

Removed deprecated alternativeCatalogsLimb constructor, since its use could result in buggy behavior.

// Library Limb (alternativeCatalogsLimb.cm)
Old: public constructor(LibraryLimb parent, symbol pkg, str key, AltCatsController controller) : deprecated { }

cm.abstract.materialHandling

ElevationG2

The elevationG2 package has been moved from cm.abstract.materialHandling.tools.elevationG2 to cm.abstract.tools.elevationG2. As such, the Mh prefix has been dropped and classes, functions, and constants previously using this prefix have been renamed. In general, "mh" has been dropped from class names with a "G2" added at the end. The new prefix used in the package is "elev". For functions, globals, and constants, only "mh" was dropped with "elev" as the new prefix. If you were previously using classes or functions from cm.abstract.materialHandling.tools.elevationG2 and are getting a lot of undefined errors in your extension, please rename them to follow the new naming convention.

Examples (Not the full list):

    // Classes
    Old: public class MhElevEnv
    New: public class ElevEnvG2

    Old: public class MhElevAutoSnapperEnv
    New: public class ElevAutoSnapperEnvG2

    Old: public class MhElevArrow
    New: public class ElevArrowG2

    Old: public class MhElevArrowSnap
    New: public class ElevArrowSnapG2

    Old: public class MhElevContentEditor
    New: public class ElevContentEditorG2

    Old: public class MhElevContentSnapper
    New: public class ElevContentSnapperG2

    Old: public class MhElevContentSnapperEnv
    New: public class ElevContentSnapperEnvG2

    Old: public class MhElevDialog
    New: public class ElevDialogG2

    Old: public class MhElevConnectType
    New: public class ElevConnectTypeG2

    Old: public class MhElevTextSnapper
    New: public class ElevTextSnapperG2

    Old: public class MhElevSpace
    New: public class ElevSpaceG2

    Old: public class MhGElevArrow
    New: public class GElevArrowG2

    Old: public class MhElevView2D
    New: public class ElevView2DG2

    Old: public class MhElevArrowInsertAnimationG2
    New: public class ElevArrowInsertAnimationG2

    Old: public class MhElevAutoDimEnv
    New: public class ElevAutoDimEnvG2

    Old: public class MhElevAutoTextEnv
    New: public class ElevAutoTextEnvG2

    // Constants
    Old: public const str mhElevTextTypeKey
    New: public const str elevTextTypeKey

    Old: public const str mhElevDimTypeKey
    New: public const str elevDimTypeKey

    // Globals
    Old: public ConnectRule mhElevConnectRule;
    New: public ConnectRule elevConnectRule;

    // Functions
    Old: public Graph mhElevGraphFrom3D(Primitive3D scene, bool filterBelow0, bool mergeMeshes=false,
                                        RangeF sliceZ=null, LineType lt=null, Color fillColor=null,
                                        function(ATriMeshF[] meshes) cleanupFk=null)
    New: public Graph elevGraphFrom3D(Primitive3D scene, bool filterBelow0, bool mergeMeshes=false,
                                      RangeF sliceZ=null, LineType lt=null, Color fillColor=null,
                                      function(ATriMeshF[] meshes) cleanupFk=null)

cm.abstract.materialHandling

   // MhUndoOp
   Old: public constructor(Space space, SnapperRef xparent, Snapper xchild)
   New: public constructor(Space space, Snapper xparent, Snapper xchild)

   // MhConfigRef
   Old: public str customName;
   New: public bool isCustom;

   // MhCollisionAlternative
   Old: extend public void appendCollisionPrimitives(CollisionResolver resolver, Snapper z)
   New: extend public void appendCollisionPrimitives(CollisionResolver resolver, Snapper z, Snapper{} visited=null)

cm.abstract.materialHandling.data

   // MhCatalogAccess
   Old: extend public void putData(PropObj owner, Object data, str dataKey)
   New: extend public void putData(MhSnapper owner, Object data, str dataKey)

   Old: extend public Object get(PropObj owner, str valueKey, str dataKey)
   New: extend public Object get(MhSnapper owner, str valueKey, str dataKey)

   Old: extend public void put(PropObj owner, str valueKey, Object option, str dataKey)
   New: extend public void put(MhSnapper owner, str valueKey, Object option, str dataKey)

   Old: extend public double getDimension(PropObj owner, str dimensionKey, str dataKey)
   New: extend public double getDimension(MhSnapper owner, str dimensionKey, str dataKey)

   Old: extend public void putDimension(PropObj owner, str dimensionKey, double value, str dataKey)
   New: extend public void putDimension(MhSnapper owner, str dimensionKey, double value, str dataKey)

   Old: extend public box getBox(PropObj owner, point p0=point0, str strW="w", str strD="d", str strH="h", str dataKey="default")
   New: extend public box dataBound(MhSnapper owner, str dataKey, point p0=point0, str strW="w", str strD="d", str strH="h")

   Old: extend public SubSet getDomain(PropObj owner, str valueKey, str dataKey)
   New: extend public SubSet getDomain(MhSnapper owner, str valueKey, str dataKey)

   Old: extend public str styleNr(PropObj owner, str dataKey)
   New: extend public str styleNr(MhSnapper owner, str dataKey)

   Old: extend public str description(PropObj owner, str key, str dataKey)
   New: extend public str description(MhSnapper owner, str key, str dataKey)

   Old: extend public void ensureSettings(PropObj owner)
   New: extend public void ensureSettings(MhSnapper owner)

   Old: extend public PartsEnv parts(MhSnapper owner)
   New: extend public void appendParts(MhSnapper owner, str dataKey, PartsEnv env)

   Removed: extend public SymNode buildSym(PropObj owner, str dataKey="default", Object env=null)
   Removed: extend public Transform symTransform(PropObj owner, str dataKey="default", Object env=null)
   Removed: extend public void afterBuildSym(PropObj owner, str dataKey="default")
   Removed: extend public void invalidateSym(PropObj owner, str dataKey="default")

cm.abstract.materialHandling.storage

   Old: public class BraceInfo
   New: public class MhBraceInfo

   // MhStorageConfigurationItem
   Old: extend public bool requiresPreviewRebuild(str key, Object value, Object previous)
   New: extend public bool requiresPreviewRebuild(str key, Object value, Object previous, Object propOwner)

   // unitLoadFunctions.cm
   Old: public UnitLoad findEqualUnitLoad(UnitLoad unitLoad)
   New: public UnitLoad findEqualUnitLoad(UnitLoad unitLoad, World w=null)

   // MhRowEntryLayout
   Old: public MhEngineConstructionEntry[] rowEntryPattern;
   New: public MhEngineEntry[] rowEntryPattern;

   Old: public MhEngineConstructionEntry startEntry;
   New: public MhEngineEntry startEntry;

   Old: public MhEngineConstructionEntry endEntry;
   New: public MhEngineEntry endEntry;

   Old: public constructor(MhEngineConstructionEntry[] rowEntryPattern,
                           MhEngineConstructionEntry centerEntry=null,
                           MhEngineConstructionEntry aisleEntry=null,
                           MhEngineConstructionEntry startEntry=null,
                           MhEngineConstructionEntry endEntry=null)
   New: public constructor(MhEngineEntry[] rowEntryPattern,
                           MhEngineConstructionEntry centerEntry=null,
                           MhEngineConstructionEntry aisleEntry=null,
                           MhEngineEntry startEntry=null,
                           MhEngineEntry endEntry=null)

   // MhRowEntryLayoutPopulator
   Old: extend public MhEngineConstructionEntry[] rowEntryPattern()
   New: extend public MhEngineEntry[] rowEntryPattern()

   Old: extend public MhEngineConstructionEntry startEntry()
   New: extend public MhEngineEntry startEntry()

   Old: extend public MhEngineConstructionEntry endEntry()
   New: extend public MhEngineEntry endEntry()

cm.abstract.materialHandling.storage.behavior

Changes to double deep behaviors

Double deep offset behavior has been removed. The bay shape will now account for the offset via the bottomStorage collision primitive.

    Removed: public class MhDoubleDeepBackOffsetBehavior
    Removed: public mhLazyGlobal MhBehavior mhDoubleDeepBackOffsetBehavior

Double deep classification behavior has been removed. This behavior was previously needed because it was possible to disconnect one or more rows in a group and the behavior was used to keep track of the classification. It is no longer possible to do this disconnect so this behavior is no longer needed. The back classification is added during insert.

    Removed: public class MhDoubleDeepBackClassificationBehavior
    Removed: public mhLazyGlobal MhBehavior mhDoubleDeepBackClassificationBehavior

Changes to after export behaviors

Linking has been pushed to the end of an engine run for the sake of performance. However, certain behaviors such as frameValidCheck relies on linking to be correct. This behavior was previously run during after export but now that is too early. Because of this, MhAfterEngineExportBehavior has been split into two different behaviors: MhAfterEngineInitialExportBehavior and MhAfterEngineFinalizeRunBehavior.

If you were previously extendng from MhAfterEngineExportBehavior, by default, you should now use MhAfterEngineInitialExportBehavior. MhAfterEngineFinalizeRunBehavior should be used if linking is required for your behavior or if MhAfterEngineInitialExportBehavior is too early.

    Old: public class MhAfterEngineExportBehavior
    New: public class MhAfterEngineInitialExportBehavior
    New: public class MhAfterEngineFinalizeRunBehavior

    Old: public const symbol sAfterSystemExport
    New: public const symbol sAfterInitialExport
    New: public const symbol sAfterFinalizeRun

    Old: public class MhRowAfterEngineExportBehavior
    New: public class MhRowAfterEngineInitialExportBehavior

    // Methods previously used in MhAfterEngineExportBehavior. Please replace them with the relevant methods below.
    Old: extend public void afterExport(MhSystemCollection system)
    Old: extend public void afterExport(MhSnapper parent, MhSnapper owner)

    // MhAfterEngineInitialExportBehavior
    New: extend public void afterInitialExport(MhSystemCollection system)
    New: extend public void afterInitialExport(MhSnapper parent, MhSnapper owner)

    // MhAfterEngineFinalizeRunBehavior
    New: extend public void afterEngineFinalizeRun(MhSystemCollection system, Snapper{} exported) {}
    New: extend public void afterEngineFinalizeRun(MhSnapper parent, MhSnapper owner)

    // Old after export behaviors and their replacements.
    Old: public class MhRowAfterEngineExportBehavior
    New: public class MhRowAfterEngineInitialExportBehavior
    Old: public mhLazyGlobal MhBehavior mhRowAfterEngineExportBehavior
    New: public mhLazyGlobal MhBehavior mhRowAfterEngineInitialExportBehavior

    Old: public class MhRackingFrameAfterEngineExportBehavior
    New: public class MhRackingFrameAfterEngineFinalizeRunBehavior
    Old: public mhLazyGlobal MhBehavior mhRackingFrameAfterEngineExportBehavior
    New: public mhLazyGlobal MhBehavior mhRackingFrameAfterEngineFinalizeRunBehavior

    Old: public class MhAdjustChildAccessoriesAfterExportBehavior
    New: public class MhAdjustChildAccessoriesAfterInitialExportBehavior
    Old: public mhLazyGlobal MhBehavior mhAdjustChildAccessoriesAfterExportBehavior
    New: public mhLazyGlobal MhBehavior mhAdjustChildAccessoriesAfterInitialExportBehavior

MhLevelEngineBehavior

The aisleOverhang method is no longer needed. Overhangs are now calculated using engine entries.

    Removed: extend public Double aisleOverhang(MhSnapper snapper, MhSnapperChangedEnv env)

MhLevelPopulateBehavior

    Old: extend public double maxZ(MhEngineEntry levelParent, MhEngine engine, CollisionPrimitive levelPrim)
    New: extend public double maxZ(MhSnapper snapper)

MhBayFrontArrow3DBehavior replaced with vessel

The MhBayFrontArrow3DBehavior used in the bay editor has been removed in favor of using vessels instead.

    Removed: public class MhBayFrontArrow3DBehavior
    New: public class MhBayEditArrowVessel

MhClearanceBehavior

A new appendCollisionPrimitives method has been added to MhClearanceBehavior and the old one has been deprecated. If you encounter issues with your unit loads missing clearances, then this is most likely the cause. Please update your code to use the new version.

    // MhClearanceBehavior
    DEPRECATED: extend public void appendCollisionPrimitives(MhSnapperShape shape, Transform t,
                                                             double elevation, CollisionPrimitive{} geos,
                                                             LayerSet classification,
                                                             Int clearanceSpecId=null,
                                                             Object env=null) : deprecated {}
    Added: extend public void appendCollisionPrimitives(MhSnapperShape shape, Transform t,
                                                        CollisionPrimitive{} geos,
                                                        MhClearanceCollisionPrimEnv clearanceEnv,
                                                        Object env=null)

cm.abstract.materialHandling.storage.engine

Removed oldULBox field

The oldULBox fields have been removed from certain functions. This was previously used to help calculate the overhang and positions for unit load population. However, the old unit load box didn't contain enough information. Engine entries are now being used to record the old unit load dimensions so these fields are not needed anymore.

    // MhAisleUpdateWidthFunction
    Removed: public Box oldULBox;

    // MhAlignLoadsToAisleFunction
    Removed: public Box oldULBox;

MhSystemCollisionEntry

MhSystemCollisionEntry has been replaced with MhEngineSystemCollisionEntry. MhBoxCollisionEntry has been removed as it is no longer used.

    Removed: public class MhSystemCollisionEntry
    Removed: public class MhBoxCollisionEntry
    Added: public class MhEngineSystemCollisionEntry

    // MhSystemEngineEnvironment
    Old: public MhSystemCollisionEntry{} collisionEntries;
    New: public MhEngineSystemCollisionEntry{} collisionEntries;

    Old: extend public MhSystemCollisionEntry operator<<(MhSystemCollisionEntry be)
    New: extend public MhEngineSystemCollisionEntry operator<<(MhEngineSystemCollisionEntry be)

MhLevelPopulateFunction

    Old: extend public MhEngineConstructionEntry createLevel(MhEngineEntry[] children, MhEngineSnapperEntry newEntry, double z)
    New: extend public MhEngineEntry createLevel(MhEngineSnapperEntry lastEntry, double z)

Step Populator Changes

MhFixedStepPrimPopulator has been removed because it was too unit load specific and we want to avoid having to use a specific populator in one case, and another specific populator in another case. You should instead use MhStepperPopulator with MhPrimPopulatorStepper as the stepper. This way, we have a generic populator that covers most cases. A useFixedStep field and argument in the constructor has been added to handle the case of MhFixedStepPrimPopulator. A limitingLayer has also been added to the constructors to give more control. The limiting layer is to have 1 prim on the start and 1 (optional) prim at the end of the populateBox, so when you start the first step, you are actually resolving against the start prim, and last step against the end.

MhUnitLoadStepPrimPopulator and MhUnitLoadFixedStepPrimPopulator2 have also been deprecated.

    Removed: public class MhFixedStepPrimPopulator
    Deprecated: public class MhUnitLoadStepPrimPopulator extends MhPopulator : deprecated
    Deprecated: public class MhUnitLoadFixedStepPrimPopulator2 extends MhPopulator : deprecated

    // MhPrimPopulatorStepper
    /**
     * Use fixed step.
     * Use this if you always have the same step distance.
     * Currently used for constructional functions, when all entries are same size.
     * Don't use this if you want each step to check against additional prim.
     */
    Added: public bool useFixedStep;

    /**
     * Fixed step point.
     * Only used if useFixedStep is true.
     */
    Added: private Point _fixedStepPoint;


    Added: public constructor(CollisionPrimitive startPrim, CollisionPrimitive endPrim=null,
                              CollisionPrimitive additionalPrim=null, bool useFixedStep=false)


    Added: public constructor(box toPopulateBox, Layer limitingLayer, vector v,
                              CollisionPrimitive additionalPrim=null, bool useFixedStep=false)

cm.abstract.materialHandling.storage.shape

The updateFlueGap method has been removed from mhLevelShape. Please use the updateFlueGap method in MhLoadToLoadDistanceBehavior instead.

Removed: extend public void updateFlueGap(MhClearanceSpec oldSpec, MhClearanceSpec newSpec)

Other changes

    // MhSiloShape
    Old: extend public void buildStructure(MhSnapper[] rows)
    New: extend public void buildStructure(MhSnapper[] rows, MhEngine engine=null)

    Old: extend public void calculateStructurePositions(MhSnapper[] rows)
    New: extend public void calculateStructurePositions(MhSnapper[] rows, MhEngine engine=null)

cm.abstract.materialHandling.storage.racking.behavior

   // MhRackingBayElevAutoSnapperEnvBehavior
   Old: extend public void appendAutoRightSideDims(MhSnapper bay, str key, point floorP0,
                           double dim, UserTextStyle ts, UserDimensionStyle ds,
                           MhElevAutoSnapperEnv[] res)
   New: extend public void appendAutoRightSideDims(MhSnapper bay, str key, ElevArrowG2 arrow, point floorP0,
                           double dim, UserTextStyle ts,
                           UserDimensionStyle ds, ElevAutoSnapperEnvG2[] res)

   Old: extend public void appendAutoElevYDims(str key, range[] rs, point start, double dim,
                           UserTextStyle ts, UserDimensionStyle ds, MhElevAutoSnapperEnv[] res)
   New: extend public void appendAutoElevYDims(str key, MhElevArrow arrow, range[] rs, point start, double dim,
                           UserTextStyle ts, UserDimensionStyle ds, MhElevAutoSnapperEnv[] res)

   // MhBracingBehavior
   Old: extend public double bracingH(MhSnapper owner)
   New: extend public double bracingH(MhSnapper owner, MhBraceInfo brace)

   Old: extend public double braceLength(MhSnapper owner, box b)
   New: extend public double braceLength(MhSnapper owner, box b, MhBraceInfo brace)

   Old: extend public line generateLine(MhSnapper owner, line2D l, box b)
   New: extend public line generateLine(MhSnapper owner, MhBraceInfo brace, line2D l, box b)

   Old: extend public line[] braceLines(CoreObject owner)
   New: extend public <MhBraceInfo[], line[]> braceLines(CoreObject owner)

   Old: extend public SymNode braceSym(line l, CoreObject owner)
   New: extend public SymNode braceSym(MhBraceInfo brace, line l, CoreObject owner)

   Old: extend public Primitive3D bar3D(MhSnapper owner, FetchEnv3D env, line ln)
   New: extend public Primitive3D bar3D(MhSnapper owner, FetchEnv3D env, MhBraceInfo br, line ln)

cm.abstract.materialHandling.storage.tools.editor

   // MhStorageEditorConfiguration
   Old: extend public bool appendNewSnappers()
   New: extend public Snapper{} generateDefaultSnappers(MhStorageConfiguration config)

   // MhStorageEditorDialog
   Old: extend public void updateContainerViews()
   New: extend public void updateContainerViews(bool zoom=false)

cm.abstract.materialHandling.storage.tools.editor.bay

Bay editor package has been moved to cm.abstract.materialHandling.storage.tools.editor.bay. If you see complaints about MhBayEditConfiguration or similar being undefined, make sure to include the new package in your package.cm.

cm.core

cm.core.parttag.partTagsInWorld

highlightedPartTagCategory, highlightedPartTag and tagToBeUsedAtInsert are now all changed from globals to getter and setter functions that takes a World argument.

The reason for the change is to store the parttag on the world instead of globally to prevent memory leaks on new drawing.

old: public PartTagCategory highlightedPartTagCategory;

/**
 * Highlighted tag category (selected in tagging dialog).
 */
new: public PartTagCategory highlightedPartTagCategory(World world) {
    return world.?getCached("highlightedPartTagCategory").?PartTagCategory;
}
new: public void setHighlightedPartTagCategory(World world, PartTagCategory tag) {
    world.?putCached("highlightedPartTagCategory", tag);
}

old: public PartTag highlightedPartTag;

/**
 * Highlighted tag (selected in tagging dialog).
 */
new: public PartTag highlightedPartTag(World world) {
    return world.?getCached("highlightedPartTag").?PartTag;
}
new: public void setHighlightedPartTag(World world, PartTag tag) {
    world.?putCached("highlightedPartTag", tag);
}

old: public PartTag tagToBeUsedAtInsert;


/**
 * Tag to be used at insert (selected in tagging dialog).
 */
new: public PartTag tagToBeUsedAtInsert(World world) {
    return world.?getCached("tagToBeUsedAtInsert").?PartTag;
}
new: public void setTagToBeUsedAtInsert(World world, PartTag tag) {
    world.?putCached("tagToBeUsedAtInsert", tag);
}

Primitive3D changes

Optimization of primitive move command to just change the 'pos' on the transform instead of creating a new transform.

Added: public Primitive3D unsafeFastMove(vectorF v); 

Added: public Primitive3D unsafeFastMove(vector v); 

Added: public Primitive3D unsafeFastMove(vector2D v);

The methods to handle this and core3D package now uses these method for move(..).

Deprecated CorePropObj methods

The following method in CorePropObj has been deprecated since 12.5 and is now removed:

   Removed: extend public void orderFactoryProperties(CoreProperties properties) 
   Use: extend public void postBuildOrderProperties(PropertyOrder order, CoreProperties properties)

PropDefs and PropInputSetting attributes

Traditionally the attributes of PropInputSettings and PropDefs have always been sync-ed during the building of core properties G2. This has been changed in 13.5 so that the attributes you provide to your PropInputSettings will no longer be copied over to your propDef's attribute set, to better separate the responsibilities between the two concepts.

If you previously have #symDef defined as an attribute in your propDef's PropInputSetting, consider putting it directly in your propDef instead. With the props syntax you could also define it as below to achieve the same result:

/**
* Props
*/
public props {
    "w" : sym=true;
}

However, we still provide some public methods to access the different attributes - you may refer to the method headers for information:

// cm/props/advanced/preCorePropObj.cm
public symbol{} allDefAttributes(PropObj this, PropDef def)
public str->Object getPropsWithDefAttribute(PropObj this, symbol attr)
public symbol{} getSettingAttributes(PropObj this, PropDef def, Object env=null)

PriceChangeEnv

Added PriceChangeEnv ( cm/core/calculation.cm ) affecting the following:

//Package: cm.core.calc
Old: public bool refreshArticleViews(World world, bool validate, function():bool interrupt, bool force)
New: public bool refreshArticleViews(World world, bool validate, PriceChangeEnv env)

//Package: cm.core.itemTag
Old: public bool updateWorldItemTags(World world, bool validate, function():bool interrupt, bool force)
New: public bool updateWorldItemTags(World world, bool validate, PriceChangeEnv env)

//Package: cm.core
Old: public alias priceChangedFun = (function(World world, bool validate, function():bool interruptget, bool force):bool)
New: public alias priceChangedFun = (function(World world, bool validate, PriceChangeEnv env):bool)

Old: public bool rebuildNativePartList(World world, bool validate, function():bool interrupt, bool force)
New: public bool rebuildNativePartList(World world, bool validate, PriceChangeEnv env)

cm.import.graphviz

Deprecated cm.import.graphviz

cm.import.graphviz has been deprecated and removed - it has never compiled properly and is missing a DLL.

Runtime/Behavior Changes

cm.abstract

BasicLegendSnapper

Cleanup of legend align classes to sync them up with core Align. Also made them public instead of private. Commit - 3cb10f15

cm.abstract.materialHandling

Aisle spacer changes

The aisleSpacerPopulate function calls have been moved to materialHandling/storage/racking/ package since MhSpacerPopulateFunction is defined there. This also means we now have new intermediary classes. The aisleSpacerPopulate calls have been moved from the parents to these new classes.

    New: public class MhRackFlueGapRowEngineBehavior extends MhFlueGapRowEngineBehavior
    New: public class MhRackAisleRowEngineBehavior extends MhAisleRowEngineBehavior
    New; public class MhRackBayRowStretchEngineBehavior extends MhBayRowStretchEngineBehavior
    New: public class MhRackBayRowEngineBehavior extends MhBayRowEngineBehavior

Row child selection behavior

MhRowChildSelectionBehavior has been added to several spawners in the abstract level such as in MhRackFrameSpawner and MhFrameSpawner. If you have added your own selection behavior to your spawner and are getting the message below, then this is most likely the cause.

   Trying to have 2 behaviors with the same key: selection

This error can cause your snappers to not be exported. To resolve this, you could either remove your own selection behavior if MhRowChildSelectionBehavior handles your case for you, or you could exclude mhRowChildSelectionBehavior from your spawner's customOtherBehaviors and keep your own selection behavior or even extend from MhRowChildSelectionBehavior.

Removed "clearanceSpecId" prop from Config Item

The clearanceSpecId prop has been removed from MhClearanceCompartmentConfigurationItem. You can get the clearance spec using the existing "clearanceSpec" prop. Any code trying to get the clearanceSpecId from the config should be updated to get the clearanceSpec instead.

   // Examples:
   Old: currentConfig.clearanceSpecId();
   New: currentConfig.clearanceSpec();

   Old: config.getValue("clearanceSpecId");
   New: config.getValue("clearanceSpec");

cm.abstract.office

Panel Frames

  • Rewrite PanelFrameInsertAnimationG2 to not spawn other animations to emulate the state behavior of old animations.
  • Return true from XXXPanelStretchEnv only if width was actually changed.
  • PanelFrame now returns isTMountable() in allowAttach() when a PTransformSnapPoint from a PanelFrame is snapping to a ConnectLine on another PanelFrame.

Worksurface

  • Changed the material used for the AOWksfSelectSupportForRemovalVessel from redPlasticMaterial3D to intenseRedMaterial3D
  • Added a method for the undo step description in abstract/office/legacy/worksurfaceTool3DAnimation.cm

cm.core

Pick Shape Changes

The following classes and methods associated with REDPicker3D have been updated to include a new default, optional parameter checkForPickSurface=false to allow developer greater control over whether pick surfaces are detected during picking operations.

Please note that the previous implementation implies a value of checkForPickSurface=true, while the new optional parameter defaults to checkForPickSurface=false to be consistent with other existing methods. Simply add or change the parameter to true to retain previous behavior.

REDPicker3D

    removed: extend public REDPick pickShape(REDShape shape, Object z, lineF ln, angle coneAngle=0deg, pointF cameraLoc=pointF()) {
    added: extend public REDPick pickShape(REDShape shape, Object z, lineF ln, angle coneAngle=0deg, pointF cameraLoc=pointF(), bool checkForPickSurface=false) {
    
    removed: extend public PickIntersection3D[] pick(line ln, bool visible=true, bool findPickedType=false, Object[] objectsToPickFrom=null, bool allowRemoveClipped=true) {
    added: extend public PickIntersection3D[] pick(line ln, bool visible=true, bool findPickedType=false, Object[] objectsToPickFrom=null, bool allowRemoveClipped=true, bool checkForPickSurface=false) {

your propDef’s attribute set,

REDCorePicker3D

    removed: extend public PickIntersection3D[] envPick(FindObjectsEnv env, line ln, bool visible=true, bool findPickedType=false, Object[] objectsToPickFrom=null, ClassSubSet subset=null) {
    added: extend public PickIntersection3D[] envPick(FindObjectsEnv env, line ln, bool visible=true, bool findPickedType=false, Object[] objectsToPickFrom=null, ClassSubSet subset=null, bool checkForPickSurface=false) {

View3D

    removed: extend public PickIntersection3D[] envPick(FindObjectsEnv env, ClassSubSet subset=null) {
    added: extend public PickIntersection3D[] envPick(FindObjectsEnv env, ClassSubSet subset=null, bool checkForPickSurface=false) {

PropsScheme 13.5 changes

In 13.5, all newly saved .cmScheme files will have 2 additional suffixes appended to the filename by default:

Scheme Group name Extension name (a.k.a. systemName) The main reason behind this is to have a clearer identifier in the scheme filename to indicate which manufacturer and extension the scheme comes from.

Take Fika Scheme as example:

  • Fika Scheme is under Group "FAM"
  • Fika Scheme's extension name is "Fika"
  • User created a new scheme labelled as "MyFikaScheme"

Output filename when saved:

  • MyFikaScheme.FAM.Fika.cmScheme Some extensions might have slightly lengthy group or extension names, and it might not look too good when they are appended as part of filename. For this reason, we have added new methods in PropsScheme class to allow customization on the group and extension naming for filename:

cm/core/propsScheme/propsScheme.cm

added: extend public str groupAbbreviation() {
added: extend public str systemNameAbbreviation() {

Updates to dll.geometry

Updated hash methods for box, boxF, line, line2D, lineF, lineF2D, plane, planeF, pointI, rectl and sizel to avoid hash collisions.

  old: export inline int hash(box& z, double precision=1e-6) {
      return (hash(z.p0, precision) ^ (4 << hash(z.p1, precision)));
  }
 new: export inline int hash(box& z, double precision=1e-6) {
      return (hash(z.p0, precision) ^ rotateRight(hash(z.p1, precision), 4));
  }