Overview

cm.abstract.material

A new COMPartProxy class has been added as CustomerOwnMaterials are being updated to include part information and show in Calculations. This MaterialPartProxy ties specifically to CustomerOwnMaterials.

Class Signature:
public class COMPartProxy extends CachedMaterialPartProxy

CustomerOwnMaterials are being updated in 15.0 to allow users to store part information for them. To account for this, new fields and UI features were added to the COMaterialDialog for the user to enter this information. The MaterialPartProxy stores the information entered in the dialog for the CustomerOwnMaterial.

More documentation about the utilization of this info for parts can be found in the migration notes for COMPart in cm.abstract.material and MaterialPartProxy in cm.core.material.

A new COMPart class has been added as CustomerOwnMaterials are being updated to include part information and show in Calculations.

public class COMPart extends ProdPart

As CustomerOwnMaterials are being updated to also store part information, COMPartProxy was introduced to store this information (code, description, length unit, etc.) on the material.

cm.core

Changes have been made to the circle menu to facilitate subclassing it.

cm.core.dwg

The responsibility of caching a dwg graphs bound has been moved from class DwgBspSplitEnv to class DwgBspEntry, so we can utilize the caching in places other than when we're performing a bsp split.

cm.core.part

To allow PartInfoTrees to hold any type of PartColumn, the return type of columns() has changed from PartInfoColumn[] to PartColumn[]. A new function buildColumns was also added. It is used by the Calculations dialog to build the columns of a PartInfoTree.

BlockSpace adjustments for Parts were not previously accounted for in the Calculations dialog. To account for these adjustments, changes were made in Part to allow or ignore adjustments made in BlockSpaces.

Changes have been made to PartInfoTree to allow them to hold BasicPartColumns.

cm.core.propsScheme

Fixed some general UI bugs with highlighting in the PropsSchemes dialog, and allow specify custom colors for highlighting.

cm.format.dwg

We now support materials when exporting to dwg. Materials in CET will be converted to a format supported by dwg. Textures are extracted and stored in a folder next to the dwg. Currently, we do not support exporting user materials added to xrefs. In other words, if a dwg is imported to CET and a new material is added to it and then again exported to dwg the added material will not be exported.

cm.std.tools

The tools toolbox is recieving a facelift and as a result a lot of old functionality has been cleaned up.

Compile Time Changes

cm.abstract.materialHandling

All removed/modified interfaces. See specific sections for more details on what migration changes need to be made.

Old: public class MhFrameUpdateBayHeightFunction extends MhSystemEngineFunction {
New: public class MhFrameHeightChangeUpdateBayFunction extends MhSystemEngineFunction {

Old: public bool isBack2(Object o) { return evalClassification(o, sBack); }
New: public bool isBack(Object o) { return evalClassification(o, sBack); }

Old: public bool isBack(Object o) { return evalClassification(o, sBackRow); }
New: public bool isBackRow(Object o) { return evalClassification(o, sBackRow); }

Old: public MhSnapper[] getAllRowsRecursive(MhSnapper snapper, bool top=false, bool reverse=true, Snapper{} visited=null) {
New: public MhSnapper[] getAllRowsRecursive(MhSnapper snapper, bool top=false, Snapper{} visited=null) {

Old: public double mhCalculatedBayHeightForConstruction(MhSystemConfigurationItem this, MhSnapper bay, int numLevels, bool loadOnFloor=true, bool loadWithinLimit=true) {
New: public double mhCalculatedBayHeightForConstruction(MhSystemConfigurationItem this, MhSnapper bay, int numLevels, bool loadOnFloor=true, bool loadWithinLimit=true, bool forceConstruct=false) {

Old: public class MhDbgSpaceViewer extends DialogWindow {
New: public class MhDebugSpaceViewerDialog extends DialogWindow {

Old: public class MhBayCollisionAlternative extends MhDoubleStepRangeCollisionAlternative { 
New: public class MhRowChildCollisionAlternative extends MhSubSetCollisionAlternative {

Old: public class MhDoubleStepRangeCollisionAlternative extends MhCollisionAlternative {
New: public class MhSubSetCollisionAlternative extends MhCollisionAlternative {

Old: public CollisionPrimitive localCollisionPrimitive(MhSnapper this) : inline, deprecated {
Old: public CollisionPrimitive localCollisionPrimitive(MhSnapper this, MhCollisionFetchEnv env) : inline {
New: public CollisionPrimitive localCollisionPrimitive(MhSnapper this, MhCollisionFetchEnv env=null) : inline {

Removed: public bool isArm(Snapper snapper) { return evalClassification(snapper, sArm); } 
Removed: public void mhStorageRegisterFunctions(CxFunction[] functions, symbol pkg=null) {
Removed: public void mhStoragePutNextPkgLookup(symbol pkg, symbol next) {

Removed: public class MhBayAndPalletsGfxBehavior extends MhBayGfxBehavior {
Removed: public class MhCollisionEntrySnapperFilter extends MhCollisionSnapperFilter : deprecated {
Removed: public class MhBayStretchSymFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhBayStretch3DFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhDoubleDeepLevelLinkFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhLevelLinkFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhRowSystemSymFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhRowSystem2DFunction extends MhRowSystemSymFunction : deprecated {
Removed: public class MhRowSystem3DFunction extends MhRowSystemSymFunction : deprecated {
Removed: public class MhUnitLoadFixedStepPrimPopulator2 extends MhPopulator : deprecated {
Removed: public class MhUnitLoadStepPrimPopulator extends MhPopulator : deprecated {
Removed: public class MhStorageEngineStretchVessel extends MhStretchVessel : deprecated {
Removed: public class MhStorageEditorDifferentExtensionDialog extends ModalDialog : deprecated {
Removed: public class MhEngineOverrideFunctionInfo {

public class MhSnapper extends Snapper {
- Removed: extend public box localBound(symbol[] symbols) : deprecated {
- Removed: extend public CollisionPrimitive collisionPrimitive(Transform t, bool includeChildren, Object env=null) : deprecated {
- Removed: extend public void putEngineEntryDim(str key, double v) : deprecated {
- Old: extend public MhSnapper getSnapperReplacementForPickupApply() : deprecated {
- Old: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate) : deprecated {
- New: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate=null) {

public class MhSnapperShape extends CorePropObj {
- Old: extend public MhSnapper getSnapperReplacementForPickupApply() : deprecated {
- Old: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate) {
- New: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate=null) {

public class MhBehavior extends CoreObject {
- Removed: extend public bool allowTrySnap(MhSnapper snapper, MhTrySnapAlternative alternative) : deprecated {

public class MhSystemConfiguration extends CoreObject {
- Removed: extend public void showPackageInfoMismatchDialog() { }
// See Old engine removal section
- Removed: extend public symbol functionPath() {

public class MhApplyColorFrameVessel extends MhSpreadColorFrameVessel {
- Removed: extend public bool useStrictClassification() : deprecated {

public class MhAssortment extends CorePropObj {
- Removed: extend public MhEngine engine() : deprecated {
- Removed: public symbol functionPath
- Removed: public bool useEngineFuncG2 : stream=null
- Removed: extend public bool useEngineFuncG2() {

public class MhEngineManager extends CoreObject {
- Removed: public MhEngine->MhEngineRun engineRuns : deprecated;
- Removed: extend public bool useEngineFuncG2() {
- Removed: extend public void ensureConfiguration(MhEngine engine, str->Object args) {
}

public class MhEngine extends CxEngine {
- Removed: public void mhRegisterEngineFunction(MhEngine engine, CxFunction func, symbol pkg=null) {
- Removed: public void mhPutEngineNextPkgLookup(MhEngine engine, symbol pkg, symbol next) {
- Removed: final public symbol functionPath() {
- Removed: final public void setFunctionPath(symbol functionPath) {

public class MhEngineBehavior extends MhBehavior : inherit constructors {
- Removed: extend public void putEngineEntryDim(MhSnapper snapper, str key, double v) : deprecated {
- Removed: extend public symbol functionPath(MhSnapper snapper) {
- Removed: extend public bool useEngineFuncG2(MhSnapper snapper) {
- Removed: extend public void putEngineRunFunctions(MhSnapper snapper, symbol event="", Object env=null) {
- Old: extend public void fetchEngineFunctionsRunG2(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
- New: extend public void fetchEngineFunctionsRun(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
- Old: extend public MhPreprocessArgsEnv preprocessFuncArgsG2(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
- New: extend public MhPreprocessArgsEnv preprocessFuncArgs(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
- Old: extend public str->Object engineFunctionArgsG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
- New: extend public str->Object engineFunctionArgs(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
- Old: extend public bool acceptFunctionRunG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {
- New: extend public bool acceptFunctionRun(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {

public class MhEngineFunctionLibrary extends CxFunctionLibrary {
- Removed: public MhEngineOverrideFunctionInfo overrideInfo
- Removed: public symbol->symbol nextFunctionLookupPkgs
- Removed: extend public void register(CxFunction fun, symbol pkg) {
- Removed: extend public void putNextPkgLookup(symbol path, symbol next) {
- Removed: extend public void optimizeFunctionsOrder(MhSystemConfiguration config) {
- Old: final public CxFunction getFunction(str key, symbol path, bool finalize) : deprecated {
- Old: final public CxFunction getFunction(str key, symbol path) {
- New: final public CxFunction getFunction(str key) {

public class MhEngineSnapperEntry extends MhEngineBoxEntry : inherit constructors {
- Removed: extend public MhEngineSnapperEntry zeroTransformSnapperEntry() : deprecated {

public class MhSnapperApplyAnimation extends MhSnapperSpreadToolAnimation {
- Removed: extend public MhSnapper snapperReplacement(MhSnapper pickedUp) : deprecated {

public class MhBayBracingBehavior extends MhBehavior {
- Removed: extend public bool topBracing(int bayIndex) : deprecated { return true; }
- Removed: extend public bool backBracing(int bayIndex) : deprecated { return true; }
- Old: extend public Graph cross2D(rect r) {
- New: extend public Graph cross2D(rect r, double z) {

public class MhRowAnimationEngineGfxBehavior extends MhGenericEngineGfxBehavior {
- Removed: extend public GMaterial3D entryMaterial3D(MhEngineEntry entry) : deprecated {
- Removed: extend public color entryColor(MhEngineEntry entry) : deprecated {

public class MhLevelArrangeFunction extends MhSystemEngineFunction {
- Removed: public Bool maintainLowestLevel : deprecated;
- Removed: extend public double standOnZ(MhEngineEntry entry) : deprecated {
- Removed: extend public MhPopulator populator(MhEngineEntry edit) : deprecated {
- Removed: extend public bool shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit, bool isLowestLevel) {
- New: extend public bool shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit) {

public class MhAisleUpdateWidthFunction extends MhSystemEngineFunction {
- Removed: extend public box localBoundIncludingChildren(MhEngineEntry entry, Transform t, MhEngine engine) {
- Removed: extend public box localBoundIncludingChildren(MhEngineEntry entry, Transform t, MhEngine engine, LayerSet ls) {
- New: extend public box localBoundIncludingChildren(MhEngineEntry entry, Transform t, MhEngine engine, LayerSet ls=null) {

public class MhRowSystemCollisionAdjustToFlue extends MhRowSystemCollisionSolution {
- Removed: extend public void alignYToColumns(MhEngineEntryBlock[] blocks, double columnY, bool up, int &lastIndex) : deprecated {
- Removed: extend public int findBestFlueSpaceIndex(MhEngineEntryBlock[] blocks, double columnY, bool up, int lastIndex=0) : deprecated {

public class MhLevelShape extends MhBoxSnapperShape {
- Removed: extend public void unstreamStoredSpec(ObjectFormatter formatter) : deprecated {

public class MhBayEditConfiguration extends MhStorageEditorConfiguration {
- Removed: extend public void overrideFramesMaterial() : deprecated {
- Removed: extend public void overrideFrameMaterial(Snapper snapper) : deprecated {

public class MhBayLevelEditorItem extends MhBayEditorItem {
- Removed: extend public MhClearanceBehavior bayEditorLevelClearanceBehavior(double newLevelClearance) : deprecated {
- Removed: extend public int clearanceSpecId(World w=null) : deprecated {

public class MhBayEditorLevelClearanceBehavior extends MhClearanceBehavior : unstreamable {
- Removed: public constructor(double levelClearanceZ) : deprecated {

public class MhSnapperSpreadVessel extends Vessel {
- Old: extend public bool showIntervalProps(Object currentSpread=this."spreadPattern")
- New: extend public bool showIntervalProps()

public class MhRunEngineEnv {
- Old: public constructor(bool cleanup=true, bool blockImport=false, bool blockExport=false, bool blockFinalize=true, bool removeFailedEntry=false, bool showProgressBar=false) {
- New: public constructor(Space space=null, bool cleanup=true, bool blockImport=false, bool blockExport=false, bool blockFinalize=true, bool removeFailedEntry=false, MhSnapper initiator=null, bool showProgressBar=false) {
}

public class MhRowLegendInfoBehavior extends MhBehavior : abstract {
- Removed: extend public MhGridColumnEnv[] columns(MhSnapper row) : abstract, deprecated { }
- Removed: extend public str->MhRowLegendInfo[] getRowInfos(MhSnapper row) : abstract, deprecated { }

public class MhRowLocationLegendBehavior extends MhRowLegendInfoBehavior {
- Removed: extend public str{} getUniqueUnitLoadsKeys(MhSnapper[] rows) : deprecated {

public class MhBayRowEngineBehavior extends MhEngineBehavior
- Removed: extend public void putAisleUpdateFunctions(MhEngine engine, MhSnapper snapper, bool top) {
- Removed: extend public void putAisleUpdateFunctions(MhEngine engine, MhSnapper snapper) {
- Removed: extend public void putAisleUpdateFunctions(MhEngine engine, MhSnapper snapper, MhSnapper aisleRow, MhSnapper topRow, MhSnapper downRow) {
- Old: extend public MhSnapper[] propagatingRows(MhSnapper snapper, MhSnapperChangedEnv env) 
- New: extend public MhSnapper{} propagatingRows(MhSnapper snapper, MhSnapperChangedEnv env)
- Old: extend public void collectPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper[] res)
- New: extend public void collectPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper{} res)
- Old: extend public void collectSelectionPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper[] res)
- New: extend public void collectSelectionPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper{} res)
- Old: extend public void appendForcedPropagations(MhSnapperChangedEnv env, str key, MhSnapper[] res)
- New: extend public void appendForcedPropagations(MhSnapperChangedEnv env, str key, MhSnapper{} res)
- Old: extend public void appendSnapperPropagations(MhSnapper s, MhSnapperChangedEnv env, str key, MhSnapper[] res)
- New: extend public void appendSnapperPropagations(MhSnapper s, MhSnapperChangedEnv env, str key, MhSnapper{} res)
- Old: extend public void appendPropagationRowChildren(MhSnapper row, MhSnapperChangedEnv env, str key, MhSnapper[] res)
- New: extend public void appendPropagationRowChildren(MhSnapper row, MhSnapperChangedEnv env, str key, MhSnapper{} res)
- Old: extend public void finalizePropagatingSnappers(MhSnapperChangedEnv env, str key, MhSnapper[] res)
- New: extend public void finalizePropagatingSnappers(MhSnapperChangedEnv env, str key, MhSnapper{} res)

public class MhRowSnapperSpawner extends MhStorageSpawner {
// This is replaced with normal `customEngineBehaviors` call. 
- Removed: extend public MhBehavior[] engineBehavior() {

public class MhInsertHeightBehavior extends MhBehavior {
- Removed: extend public SubSet heightDomain(MhSnapper toSnapper=null) {
- New: extend public SubSet heightDomain(Snapper owner, MhSnapper toSnapper=null) {

public class MhStorageConfiguration extends MhSystemConfiguration {
- Old: extend public MhConfiguratorPreviewSpace previewSpace()
- New: extend public MhConfiguratorPreviewSpace previewSpace(bool initIfNull=true)

public class MhInsertHeightBehavior extends MhBehavior {
- Removed: extend public double resolveZPos(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
- New: extend public double resolveZPos(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
- Removed: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
- New: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
- Removed: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) {
- New: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, double elev, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) {

public class MhLevelInsertHeightBehavior extends MhBehavior {
- Removed: extend public bool updateHeightDomains(MhSnapper owner, MhSnapper toSnapper, Object env=null) {
- Removed: extend public SubSet restrictedHeightDomain(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env) {
- Removed: extend public <SubSet, SubSet> freeSpacesDomains(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env=null) {
- Removed: extend public bool isConflicting(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitiveSet ownerPrims) {
- Removed: extend public void checkInsertHeightLocked(point& p, SubSet heightDomain) {
- Removed: extend public void checkFreeSpaceAboveLocked(point& p, SubSet aboveDomain, MhSnapper firstAbove, MhSnapper owner, MhSnapper toSnapper) {
- Removed: extend public void checkFreeSpaceBelowLocked(point& p, SubSet belowDomain, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper) {
- Removed: extend public <Double, Double> calculateFreeSpaceAboveAndBelow(MhSnapper owner, MhSnapper toSnapper, double insertH, Snapper specificAboveSnapper=null, Snapper specificBelowSnapper=null) {
- Removed: extend public box boundForCalculation(MhSnapper snapper, bool toSpace=false) {
- Removed: extend public symbol[] geoSymbolsForCalculation() {
- New: extend public void toggleLockProperties(bool lock, str except=null) {
- New: extend public double updateFreeSpacesProperties(MhSnapper owner, MhSnapper toSnapper, Object env) {
- New: extend public double updateElevationProperty(MhSnapper owner, MhSnapper toSnapper, Object env) {
- New: extend public LayerSet collisionLayerToCollide() {
- New: extend public LayerSet collisionLayerToIgnore() {

public class MhConfigManager : unstreamable {
- Removed: extend public void fixInconsistenciesIfNecessary() {
- Use: extend public void updateConfigsAfterRestoredByUndo(MhSnapper current, MhSnapper original) {

Classification evaluation functions renamed

Old: public bool isBack2(Object o) { return evalClassification(o, sBack); }
New: public bool isBack(Object o) { return evalClassification(o, sBack); }

Old: public bool isBack(Object o) { return evalClassification(o, sBackRow); }
New: public bool isBackRow(Object o) { return evalClassification(o, sBackRow); }

Important to note is that the isBack() function interface still exists but the logic has been updated as shown above, so it will not throw a compilation error. Ensure that you are calling the appropriate function.

getAllRowsRecursive changes

Removed the bool reverse=true argument from this function.

Old: public MhSnapper[] getAllRowsRecursive(MhSnapper snapper, bool top=false, bool reverse=true, Snapper{} visited=null) {
New: public MhSnapper[] getAllRowsRecursive(MhSnapper snapper, bool top=false, Snapper{} visited=null) {

mhCalculatedBayHeightForConstruction changes

Added a new argument bool forceConstruct=false argument to this function. Set it to true if you want to use construction collision primitives in this function.

Old: public double mhCalculatedBayHeightForConstruction(MhSystemConfigurationItem this, MhSnapper bay, int numLevels, bool loadOnFloor=true, bool loadWithinLimit=true) {
New: public double mhCalculatedBayHeightForConstruction(MhSystemConfigurationItem this, MhSnapper bay, int numLevels, bool loadOnFloor=true, bool loadWithinLimit=true, bool forceConstruct=false) {

MhDbgSpaceViewer changes

The class MhDbgSpaceViewer has been renamed to MhDebugSpaceViewerDialog . Additionally it has been moved from cm.abstract.materialHandling.storage.tools.editor to cm.abstract.materialHandling.debug.

MhSnapper changes

Replace all overrides and calls to localBound(symbol[] symbols) with shapeBound(symbol[] symbols=null).

Removed: extend public box localBound(symbol[] symbols) : deprecated {
Use: extend public box shapeBound(symbol[] symbols=null) {

Replace all overrides and calls to collisionPrimitive(Transform t, bool includeChildren, Object env=null) with collisionPrimitive(MhCollisionFetchEnv env).

Removed: extend public CollisionPrimitive collisionPrimitive(Transform t, bool includeChildren, Object env=null) : deprecated {
Use: extend public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env) {

The deprecated method putEngineEntryDim(str key, double v) has been removed. We have previously replaced calls to this method with updateEngineEntry() instead.

Removed: extend public void putEngineEntryDim(str key, double v) : deprecated {

Replace all overrides and calls to getSnapperReplacementForPickupApply() and getSnapperReplacementForPickupApply(CoreObject candidate) with getSnapperReplacementForPickupApply(CoreObject candidate=null).

Removed: extend public MhSnapper getSnapperReplacementForPickupApply() : deprecated {
Removed: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate) : deprecated {
New: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate=null) {

New argument for invalidate engine.

Old: extend public void invalidateEngine()
New: extend public void invalidateEngine(Object env=null)

MhSnapperShape changes

Replace all overrides and calls to getSnapperReplacementForPickupApply() and getSnapperReplacementForPickupApply(CoreObject candidate) with getSnapperReplacementForPickupApply(CoreObject candidate=null).

Removed: extend public MhSnapper getSnapperReplacementForPickupApply() : deprecated {
Removed: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate) {
New: extend public MhSnapper getSnapperReplacementForPickupApply(CoreObject candidate=null) {

MhBehavior changes

Replace all overrides and calls to allowTrySnap(MhSnapper snapper, MhTrySnapAlternative alternative) with allowTrySnap(MhSnapper snapper, MhTrySnapAlternative alternative, Animation anim).

Removed: extend public bool allowTrySnap(MhSnapper snapper, MhTrySnapAlternative alternative) : deprecated {
Use: extend public bool allowTrySnap(MhSnapper snapper, MhTrySnapAlternative alternative, Animation anim) {

MhRunEngineEnv changes

MhRunEngineEnv has two new arguments, initiator and space.

The initiator argument is used to keep track of what started the engine run to determine if an actual change is needed (eg: level height increasing the bay height should not populate new levels and which should only happen if the bay is the initiator).

The space argument is used to control what engine runs are executed. If space=null, triggering mhRunEngines() will run all collected engine runs, this is the current behavior. We have now added the ability to only run specific engine runs by passing in a space to MhRunEngineEnv. See More control over which engine runs are executed using space for more info.

Old: public constructor(bool cleanup=true, bool blockImport=false, bool blockExport=false, bool blockFinalize=true, bool removeFailedEntry=false, bool showProgressBar=false) {

New: public constructor(Space space=null, bool cleanup=true, bool blockImport=false, bool blockExport=false, bool blockFinalize=true, bool removeFailedEntry=false, MhSnapper initiator=null, bool showProgressBar=false) {

MhSystemConfiguration changes

Replace all overrides and calls to showPackageInfoMismatchDialog() with showPackageInfoMismatchDialog(symbol packageInfo).

Removed: extend public void showPackageInfoMismatchDialog() { }
Use: public void showPackageInfoMismatchDialog(symbol packageInfo) {}

MhApplyColorFrameVessel changes

Replace all overrides and calls to useStrictClassification() with useStrictClassification(MhSnapper c).

Removed: extend public bool useStrictClassification() : deprecated {
Use: extend public bool useStrictClassification(MhSnapper c) {

MhEngineSnapperEntry changes

The deprecated method zeroTransformSnapperEntry() has been removed as it is no longer needed for its original purpose which was to remove a roll angle from its transform. We now handle it differently by unrolling the entry's CollisionPrimitive. If you need to unroll CollisionPrimitive objects,, call the function mhUnrollCollisionPrim(CollisionPrimitive prim).

Removed: extend public MhEngineSnapperEntry zeroTransformSnapperEntry() : deprecated {

MhSnapperApplyAnimation changes

Replace all overrides and calls to snapperReplacement(MhSnapper pickedUp) with snapperReplacement(MhSnapper pickedUp, CoreObject candidate).

Removed: extend public MhSnapper snapperReplacement(MhSnapper pickedUp) : deprecated {
Use: extend public MhSnapper snapperReplacement(MhSnapper pickedUp, CoreObject candidate) {

MhBayBracingBehavior changes

Replace all overrides and calls to topBracing(int bayIndex) with topBracing(MhSnapper bay, int bayIndex).

Removed: extend public bool topBracing(int bayIndex) : deprecated { return true; }
Use: extend public bool topBracing(MhSnapper bay, int bayIndex) { return true; }

Replace all overrides and calls to backBracing(int bayIndex) with backBracing(MhSnapper bay, int bayIndex).

Removed: extend public bool backBracing(int bayIndex) : deprecated { return true; }
Use: extend public bool backBracing(MhSnapper bay, int bayIndex) { return true; }

Replace all overrides and calls to cross2D(rect r) with cross2D(rect r, double z).

Old: extend public Graph cross2D(rect r) {
New: extend public Graph cross2D(rect r, double z) {

MhRowAnimationEngineGfxBehavior changes

Replace all overrides and calls to entryMaterial3D(MhEngineEntry entry) with entryMaterial3D(MhEngineEntry entry, MhEngine engine).

Removed: extend public GMaterial3D entryMaterial3D(MhEngineEntry entry) : deprecated {
Use: extend public GMaterial3D entryMaterial3D(MhEngineEntry entry, MhEngine engine) {

Replace all overrides and calls to entryColor(MhEngineEntry entry) with entryColor(MhEngineEntry entry, MhEngine engine).

Removed: extend public color entryColor(MhEngineEntry entry) : deprecated {
Use: extend public color entryColor(MhEngineEntry entry, MhEngine engine) {

MhLevelArrangeFunction changes

The field beamOffsetZ (and its PropDef) has been removed as it is not in use. If you have overridden this class and need this field, please add it back in as well as the PropDef.

The value for beamOffsetZ is no longer being passed in as a function argument in MhBayEngineBehavior for the "levelArrange" function. You will also need to override this behavior to pass in the argument if beamOffsetZ is still needed by your function.

Old:
    /**
     * Gather function args.
     */
    public str->Object engineFunctionArgsG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="",
                                            MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
        ...
          case "levelArrange" : {
              ...
              return props { snapper=snapper,
                    holeZDomain=preprocessArgs.get(cMhHoleZDomainPK),
                    additionalPrim=preprocessArgs.get(cMhAdditionalPrimPK),
                    squeezeLevels=squeezeLevels,
                    maintainBayHeight=maintainBayHeight,
                    beamOffsetZ=beamOffsetZ(snapper) };
          ...


New:
    /**
     * Gather function args.
     */
    public str->Object engineFunctionArgsG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="",
                                            MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
        ...
          case "levelArrange" : {
              ...
              return props { snapper=snapper,
                    holeZDomain=preprocessArgs.get(cMhHoleZDomainPK),
                    additionalPrim=preprocessArgs.get(cMhAdditionalPrimPK),
                    squeezeLevels=squeezeLevels,
                    maintainBayHeight=maintainBayHeight};
          ...

Replace all overrides and calls to shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit, bool isLowestLevel) with shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit).

Removed: extend public bool shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit, bool isLowestLevel) {
New: extend public bool shouldMoveLevel(MhEngine engine, MhEngineBoxEntry entry, MhEngineBoxEntry lastEntry, double diff, double fixedLimit) {

MhRowSystemCollisionAdjustToFlue changes

Replace all overrides and calls to alignYToColumns(MhEngineEntryBlock[] blocks, double columnY, bool up, int &lastIndex) with alignYToColumns(MhEngineEntryBlock[] blocks, MhColumnCollisionEnv columnEnv, bool up, int &lastIndex).

Removed: extend public void alignYToColumns(MhEngineEntryBlock[] blocks, double columnY, bool up, int &lastIndex) : deprecated {
Use: extend public void alignYToColumns(MhEngineEntryBlock[] blocks, MhColumnCollisionEnv columnEnv, bool up, int &lastIndex) {

Replace all overrides and calls to findBestFlueSpaceIndex(MhEngineEntryBlock[] blocks, double columnY, bool up, int lastIndex=0) with findBestFlueSpaceIndex(MhEngineEntryBlock[] blocks, MhColumnCollisionEnv columnEnv, bool up, int lastIndex=0).

Removed: extend public int findBestFlueSpaceIndex(MhEngineEntryBlock[] blocks, double columnY, bool up, int lastIndex=0) : deprecated {
Use: extend public int findBestFlueSpaceIndex(MhEngineEntryBlock[] blocks, MhColumnCollisionEnv columnEnv, bool up, int lastIndex=0) {

MhLevelShape changes

Replace all overrides and calls to unstreamStoredSpec(ObjectFormatter formatter) with mhUnstreamStoredSpec(MhSnapperShape shape, ObjectFormatter formatter).

Removed: extend public void unstreamStoredSpec(ObjectFormatter formatter) : deprecated {
Use: public void mhUnstreamStoredSpec(MhSnapperShape shape, ObjectFormatter formatter) {

MhBayLevelEditorItem changes

Replace all overrides and calls to bayEditorLevelClearanceBehavior(double newLevelClearance) with bayEditorLevelClearanceBehavior(double newLevelClearance, Box bottomPrim=null).

Removed: extend public MhClearanceBehavior bayEditorLevelClearanceBehavior(double newLevelClearance) : deprecated {
Use: extend public MhClearanceBehavior bayEditorLevelClearanceBehavior(double newLevelClearance, Box bottomPrim=null) {

MhBayEditorLevelClearanceBehavior changes

Replace all overrides and calls to constructor(double levelClearanceZ) with constructor(double levelClearanceZ, Box bottomPrim=null).

Removed: public constructor(double levelClearanceZ) : deprecated {
Use: public constructor(double levelClearanceZ, Box bottomPrim=null) {

MhRowLegendInfoBehavior changes

Replace all overrides and calls to columns(MhSnapper row) with columns(MhSnapper row, bool showDescription=false).

Removed: extend public MhGridColumnEnv[] columns(MhSnapper row) : abstract, deprecated { }
Use: extend public MhGridColumnEnv[] columns(MhSnapper row, bool showDescription=false) : abstract { }

Replace all overrides and calls to getRowInfos(MhSnapper row) with getRowInfos(MhSnapper row, bool showDescription=false).

Removed: extend public str->MhRowLegendInfo[] getRowInfos(MhSnapper row) : abstract, deprecated { }
Use: extend public str->MhRowLegendInfo[] getRowInfos(MhSnapper row, bool showDescription=false) : abstract { }

MhRowLocationLegendBehavior changes

Replace all overrides and calls to getUniqueUnitLoadsKeys(MhSnapper[] rows) with getUniqueUnitLoadsKeys(MhSnapper[] rows, bool showDescription=false).

Removed: extend public str{} getUniqueUnitLoadsKeys(MhSnapper[] rows) : deprecated {
Use: extend public str{} getUniqueUnitLoadsKeys(MhSnapper[] rows, bool showDescription=false) {

Moved classes from cm.abstract.materialHandling.engine

The following classes have been moved from cm.abstract.materialHandling.engine to cm.abstract.materialHandling:

public class MhConfigurationItemGroup { ... }
public class MhSystemConfigurationManager { ... }
public class MhConfigurationPullPropsVisitor extends PushPropsVisitor { ... }
public class MhConfigurationPushPropsVisitor extends PushPropsVisitor { ... }
public class MhPushPropsEnv extends PushPropsEnv { ... }
public class MhFlexibleTypeCheck extends FlexibleTypeCheck { ... }
public class MhSystemConfiguration extends CoreObject { ... }
public class MhSystemConfigurationContainer { ... }
public class MhSystemConfigurationItem extends CoreObject : abstract { ... }

MhBayRowEngineBehavior changes

Change collecting of propagate rows from seq to set for performance.

Old: extend public MhSnapper[] propagatingRows(MhSnapper snapper, MhSnapperChangedEnv env) 
New: extend public MhSnapper{} propagatingRows(MhSnapper snapper, MhSnapperChangedEnv env)
Old: extend public void collectPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper[] res)
New: extend public void collectPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper{} res)
Old: extend public void collectSelectionPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper[] res)
New: extend public void collectSelectionPropagatingRow(MhSnapper snapper, MhSnapperChangedEnv env, MhSnapper{} res)
Old: extend public void appendForcedPropagations(MhSnapperChangedEnv env, str key, MhSnapper[] res)
New: extend public void appendForcedPropagations(MhSnapperChangedEnv env, str key, MhSnapper{} res)
Old: extend public void appendSnapperPropagations(MhSnapper s, MhSnapperChangedEnv env, str key, MhSnapper[] res)
New: extend public void appendSnapperPropagations(MhSnapper s, MhSnapperChangedEnv env, str key, MhSnapper{} res)
Old: extend public void appendPropagationRowChildren(MhSnapper row, MhSnapperChangedEnv env, str key, MhSnapper[] res)
New: extend public void appendPropagationRowChildren(MhSnapper row, MhSnapperChangedEnv env, str key, MhSnapper{} res)
Old: extend public void finalizePropagatingSnappers(MhSnapperChangedEnv env, str key, MhSnapper[] res)
New: extend public void finalizePropagatingSnappers(MhSnapperChangedEnv env, str key, MhSnapper{} res)

MhStorageConfiguration changes

When accessing the configuration preview space, give the option whether to initialize the space or not. Also spaces are now removed from world when closing the configurator.

Old: extend public MhConfiguratorPreviewSpace previewSpace()
New: extend public MhConfiguratorPreviewSpace previewSpace(bool initIfNull=true)

Bay collision alternative

Bay collision alternative class, MhBayCollisionAlternative has been renamed to make it more generic as it contains logic that is not specific only for bay.

Old: public class MhBayCollisionAlternative extends MhDoubleStepRangeCollisionAlternative { 
New: public class MhRowChildCollisionAlternative extends MhSubSetCollisionAlternative {

Collision alternative

Old: public class MhDoubleStepRangeCollisionAlternative extends MhCollisionAlternative {
New: public class MhSubSetCollisionAlternative extends MhCollisionAlternative {

MhInsertHeightBehavior changes

Replace all overrides and calls to resolveZPos(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) with resolveZPos(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) so that it will take elevation into account.

Removed: extend public double resolveZPos(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
New: extend public double resolveZPos(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {

Replace all overrides and calls to resolveZPosSolution(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) with resolveZPosSolution(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) so that it will take elevation into account.

Removed: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {
New: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, double elev, MhCollisionAlternative alt, CollisionPrimitive ownerPrims, vector dir) {

Replace all overrides and calls to resolveZPosSolution(MhSnapper owner, double z, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) with resolveZPosSolution(MhSnapper owner, double z, double elev, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) so that it will take elevation into account.

Removed: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) {
New: extend public CollisionSolution resolveZPosSolution(MhSnapper owner, double z, double elev, CollisionResolver resolver, CollisionPrimitive ownerPrims, vector dir) {

MhLevelInsertHeightBehavior changes

Some logic in this class, MhLevelInsertHeightBehavior, has been changed/rewritten and simplified in order to support beams with no hole pitch domain e.g DistanceRange, DoubleRange.

Removed: extend public bool updateHeightDomains(MhSnapper owner, MhSnapper toSnapper, Object env=null) {
Removed: extend public SubSet restrictedHeightDomain(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env) {
Removed: extend public <SubSet, SubSet> freeSpacesDomains(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env=null) {
Removed: extend public bool isConflicting(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitiveSet ownerPrims) {
Removed: extend public void checkInsertHeightLocked(point& p, SubSet heightDomain) {
Removed: extend public void checkFreeSpaceAboveLocked(point& p, SubSet aboveDomain, MhSnapper firstAbove, MhSnapper owner, MhSnapper toSnapper) {
Removed: extend public void checkFreeSpaceBelowLocked(point& p, SubSet belowDomain, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper) {
Removed: extend public <Double, Double> calculateFreeSpaceAboveAndBelow(MhSnapper owner, MhSnapper toSnapper, double insertH, Snapper specificAboveSnapper=null, Snapper specificBelowSnapper=null) {
Removed: extend public box boundForCalculation(MhSnapper snapper, bool toSpace=false) {
Removed: extend public symbol[] geoSymbolsForCalculation() {

New: extend public void toggleLockProperties(bool lock, str except=null) {
New: extend public double updateFreeSpacesProperties(MhSnapper owner, MhSnapper toSnapper, Object env) {
New: extend public double updateElevationProperty(MhSnapper owner, MhSnapper toSnapper, Object env) {
New: extend public LayerSet collisionLayerToCollide() {
New: extend public LayerSet collisionLayerToIgnore() {

MhSnapperSpreadVessel changes

Removed argument from show interval props since we can get the spreadPattern directly.

Old: extend public bool showIntervalProps(Object currentSpread=this."spreadPattern")
New: extend public bool showIntervalProps()

MhDoubleRowClassificationBehavior moved package

MhDoubleRowClassificationBehavior has been moved from cm.abstract.materialHandling.storage.racking.behavior to cm.abstract.materialHandling.storage.behavior so it is accessible to non-racking products.

Old engine removal

Old engine (G1) is now deprecated and removed.

MhEngine changes

Remove mhRegisterEngineFunction(MhEngine engine, CxFunction func, symbol pkg=null) and mhPutEngineNextPkgLookup(MhEngine engine, symbol pkg, symbol next) as they are meant for old engine.

Removed: public void mhRegisterEngineFunction(MhEngine engine, CxFunction func, symbol pkg=null) {
Removed: public void mhPutEngineNextPkgLookup(MhEngine engine, symbol pkg, symbol next) {

Remove functionPath() and setFunctionPath(symbol functionPath) as they are meant for old engine.

Removed: final public symbol functionPath() {
Removed: final public void setFunctionPath(symbol functionPath) {

MhEngineBehavior changes

Remove functionPath(MhSnapper snapper) method as it is no longer needed to override an engine function.

Removed: extend public symbol functionPath(MhSnapper snapper) { 

Remove useEngineFuncG2(MhSnapper snapper) method as it is no longer an option to use old engine.

Removed: extend public bool useEngineFuncG2(MhSnapper snapper) {

Remove putEngineRunFunctions(MhSnapper snapper, symbol event="", Object env=null) method as it is meant for old engine.

Removed: extend public void putEngineRunFunctions(MhSnapper snapper, symbol event="", Object env=null) {

As old engine has been removed, fetchEngineFunctionsRunG2, preprocessFuncArgsG2, engineFunctionArgsG2, and acceptFunctionRunG2 have been renamed accordingly. All overriding methods and calls have been replaced.

Old: extend public void fetchEngineFunctionsRunG2(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
Old: extend public MhPreprocessArgsEnv preprocessFuncArgsG2(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
Old: extend public str->Object engineFunctionArgsG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
Old: extend public bool acceptFunctionRunG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {
New: extend public void fetchEngineFunctionsRun(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
New: extend public MhPreprocessArgsEnv preprocessFuncArgs(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
New: extend public str->Object engineFunctionArgs(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
New: extend public bool acceptFunctionRun(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {

MhEngineFunctionLibrary changes

The fields overrideInfo and extFunctionLookupPkgs have been removed as it is no longer needed for the new engine. All calls to these fields have also been removed.

Removed: public MhEngineOverrideFunctionInfo overrideInfo
Removed: public symbol->symbol nextFunctionLookupPkgs

Remove register(CxFunction fun, symbol pkg), putNextPkgLookup(symbol path, symbol next), and optimizeFunctionsOrder(MhSystemConfiguration config) as it is no longer needed for the new engine.

Removed: extend public void register(CxFunction fun, symbol pkg) {
Removed: extend public void putNextPkgLookup(symbol path, symbol next) {
Removed: extend public void optimizeFunctionsOrder(MhSystemConfiguration config) {

Replace all overrides and calls to getFunction(str key, symbol path) with getFunction(str key).

Removed: final public CxFunction getFunction(str key, symbol path) {
New: final public CxFunction getFunction(str key) {

Remove deprecated methods getFunction(str key, symbol path, bool finalize).

Removed: final public CxFunction getFunction(str key, symbol path, bool finalize) : deprecated {

MhEngineOverrideFunctionInfo changes

This class has been removed as it is no longer needed for the new engine.

Removed: public class MhEngineOverrideFunctionInfo {

MhSystemConfiguration changes

Remove functionPath() as it is no longer needed for the new engine.

Removed: extend public symbol functionPath() {

MhAssortment changes

Replace all overrides and calls to engine() with engine(Space space).

Removed: extend public MhEngine engine() : deprecated {
Use: extend public MhEngine engine(Space space) {

Remove functionPath and useEngineFuncG2 fields as it is no longer needed and no longer an option to use old engine.

Removed: public symbol functionPath
Removed: public bool useEngineFuncG2 : stream=null

Remove useEngineFuncG2() as it is no longer an option to use old engine.

Removed: extend public bool useEngineFuncG2() {

MhEngineManager changes

Replace all references to engineRuns with engineRunList.

Removed: public MhEngine->MhEngineRun engineRuns : deprecated;
Use: public MhEngine->MhEngineRun[] engineRunList;

Remove useEngineFuncG2() as it is no longer an option to use old engine.

Removed: extend public bool useEngineFuncG2() {

Remove ensureConfiguration(MhEngine engine, str->Object args) as it is meant for old engine.

Removed: extend public void ensureConfiguration(MhEngine engine, str->Object args) {

MhStorageEngine changes

Remove mhStorageRegisterFunctions(CxFunction[] functions, symbol pkg=null) and mhStoragePutNextPkgLookup(symbol pkg, symbol next) as they are no longer needed.

Removed: public void mhStorageRegisterFunctions(CxFunction[] functions, symbol pkg=null) {
Removed: public void mhStoragePutNextPkgLookup(symbol pkg, symbol next) {

MhConfigManager changes

The functionality of fixInconsistenciesIfNecessary() has been moved to a new function updateConfigsAfterRestoredByUndo(MhSnapper current, MhSnapper original). The inconsistency is caused by the undo, so it makes more sense to be fixed right after the snapper is restored by undo.

- Removed: extend public void fixInconsistenciesIfNecessary() {
- Use: extend public void updateConfigsAfterRestoredByUndo(MhSnapper current, MhSnapper original) {

cm.abstract.materialHandling.storage.mobile

Removed: public bool isPlatform(Object o) : deprecated { return isMobilePlatform(..); }
Removed: public bool isEndPanel(Object o) : deprecated { return isMobileEndPanel(..); }

Removed: public class MhMobileUpdateBehavior extends MhBehavior : deprecated {
Removed: public mhLazyGlobal MhBehavior mhMobileUpdateBehavior = MhMobileUpdateBehavior();

cm.abstract.materialHandling.storage.racking

Removed: public class MhUprightProtectorEngineBehavior extends MhEngineBehavior {
Removed: public class MhSpacerLinkFrameFunction extends MhSystemEngineFunction : deprecated {
Removed: public class MhLevelLinkTest extends MhTest {

cm.abstract.materialHandling.storage.racking.cantilever

Removed: public bool isArm(Snapper snapper) { return evalClassification(snapper, sArm); }

Changes to isArm() function

The function isArm(Snapper snapper) has been removed due to it being redundant with isArm(Object o). You should still be able to call isArm(Object o) without any compilation errors.

MhCantileverBayGfxBehavior changes

Old: extend public color bayColor2D()
New: extend public Color bayColor2D()

cm.abstract.materialHandling.storage.racking.deepstorage

public class MhDeepstorageNoOfSingleFramesFunction extends MhSystemEngineFunction {
- Removed: extend public MhEngineEntry[] sortedFramesByPriority(MhEngineEntry[] sortedFrames) : deprecated {

MhDeepstorageNoOfSingleFramesFunction changes

Replace all overrides and calls to sortedFramesByPriority(MhEngineEntry[] sortedFrames) with sortedFramesByPriority(bool rotated, MhEngineEntry[] sortedFrames).

Removed: extend public MhEngineEntry[] sortedFramesByPriority(MhEngineEntry[] sortedFrames) : deprecated {
Use: extend public MhEngineEntry[] sortedFramesByPriority(bool rotated, MhEngineEntry[] sortedFrames) {

cm.abstract.materialHandling.storage.shelving

MhShelvingCompartmentConfigurationItem changes

public class MhShelvingCompartmentConfigurationItem extends MhStorageConfigurationItem {
- Old: public double levelHeight;
- New: public Double levelHeight;

cm.abstract.part

ProdPart has the following changes to its methods, these allow for applying option adjustments:

Added: public void generateOptAdjustmentSifRows(SpecOption opt, str[] lines) {}
Added: final public PartOptionAdjustment newOptionAdjustment(SpecOption option, Space space) {}
Added: final public void putOptionAdjustment(PartOptionAdjustment adjustment, Space space) {}
Added: final public PartOptionAdjustment optionAdjustment(SpecOption option, Space space) {}

cm.abstract.unitLoad

Package Stream Renamer

Two renamer classes AbstractUnitLoadCollabG1Renamer from the collabG1 folder and AbstractUnitLoadCollabG3Renamer from the collabG3 folder have been removed. The reason for their removal is because they both were registered to be the package stream renamer of the #"cm.abstract.unitLoad" package, but each package should only have one renamer. By having two renamers registered for the same package, only one renamer is used and the other is not. It is also random as to which renamer is chosen.

To resolve this issue, both the classes mentioned above have been combined into a new class UnitLoadStreamRenamer. So, any existing class that extends from those removed classes can extend from this new class without the loss of functionality.

UnitLoadStackableTote Renamed

The class UnitLoadStackableTote has been renamed to UnitLoadCaseTote.

The reason for the change is because UnitLoadStackableTote is actually a Case Tote, and there is another type of unit load called Stackable Tote from MhStackableTote class, which made it really confusing.

Unit Load Repository

Unit load cache has been remove and this is replaced with a unit load repository instead. Unit load will still be accessible through function unitLoad(UnitLoad m) but used unit loads will be put into repository map and unused objects will be cleaned up by gc later on as by default it'll be added into a weak collection. With repository it's possible to manually control the lifetime of a unit load object and can be done by calling public void use(UnitLoad this) { which will promote unit load objects to not be collected by the garbage collector.

The following functions have been remove and replaced.

Old: public class UnitLoadCache {
New: public class UnitLoadRepository : unstreamable {
New: public UnitLoadRepository unitLoadRepository() {
Removed: public UnitLoadCache unitLoadCache() { 
// Lifetime will be handle by gc or manually remove if necessary.
Removed: public void mhPreLoadClearUnitLoadCacheHook(WorldFileHeader header) {
Removed: public void mhClearUnitLoadCacheHook(World world) {
Removed: public bool usingUnitLoad(UnitLoad ul) {

Unit load function registration is now split into two in order to have better control of default and temporary objects to populate unit load domain.

Old: public void registerUnitLoad(UnitLoad ul, World w=null) {
// Register it to container to populate unit load domain.
New: public void registerUnitLoadToContainer(UnitLoad ul, World w=null) {
// Will register unit load to be use as default.
New: public void registerUnitLoadToDefault(UnitLoad ul) {

// Include world to be more specific when looking for unitload container.
Old: public UnitLoad unitLoad(guid unitGuid) {
New: public UnitLoad unitLoad(guid unitGuid, World w=null) {

Old: public UnitLoad unitLoadFromName(str name) {
New: public UnitLoad unitLoadFromName(str name, World w=null) {

// Better variable name.
Old: public UnitLoad unitLoad(str unitKey, World w=null) {
New: public UnitLoad unitLoad(str gidHex, World w=null) {

cm.application

The following changes were made to support efforts in the facelift project:

CET's menubar now support nested menus items, which has required some changes to the menu item functions in cm/application/keyBindingMenu.cm:

Removed: public void imageItem(MenuBar menuBar,
                               str k,
                               str label,
                               Image image,
                               MenubarCB callback,
                               char c='\0',
                               bool sys=false,
                               KeyCode keyCode=null,
                               SubMenuInfo subMenu=null,
                               bool excludeFromVisibilityProfile=false) {}

Added: public void imageItem(MenuBar menuBar,
                             str k,
                             str label,
                             Image image,
                             MenubarCB callback,
                             char c='\0',
                             bool sys=false,
                             KeyCode keyCode=null,
                             SubMenuInfo subMenu=null,
                             str nestedKey=null, Removed:  ADDED
                             bool excludeFromVisibilityProfile=false) {}

Removed: public void labelItem(MenuBar menuBar,
                               str k,
                               str label,
                               MenubarCB callback,
                               char c='\0',
                               bool sys=false,
                               KeyCode keyCode=null,
                               SubMenuInfo subMenu=null,
                               bool excludeFromVisibilityProfile=false) {}

Added: public void labelItem(MenuBar menuBar,
                             str k,
                             str label,
                             MenubarCB callback,
                             char c='\0',
                             bool sys=false,
                             KeyCode keyCode=null,
                             SubMenuInfo subMenu=null,
                             str nestedKey=null, Removed:  ADDED
                             bool excludeFromVisibilityProfile=false) {}

cm.basic

The following functions have been moved to cm.win:

  • str kilometerS(double, bool, int, bool, lcid, unitMagnitude)
  • str meterS(double, bool, int, bool, lcid, unitMagnitude)
  • str decimeterS(double, bool, int, bool, lcid, unitMagnitude)
  • str centimeterS(double, bool int, bool, lcid, unitMagnitude)
  • str millimeterS(double, bool, int, bool, lcid, unitMagnitude)
  • str inchesS(double, bool, lcid, int, unitMagnitude)
  • str inchesAndFractionsS(double, bool, int, lcid, unitMagnitude, bool)
  • str inchesAndDecimalsS(double, bool, int, bool, lcid, unitMagnitude)
  • str feetS(double, bool, lcid, unitMagnitude)
  • str feetAndInchesS(double, lcid, unitMagnitude)
  • str feetAndDecimalsS(double, bool, int, bool, lcid, unitMagnitude)
  • str feetAndInchesAndFractionsS(double, bool, int, lcid, unitMagnitude, bool)
  • str feetAndInchesAndDecimalsS(double, bool, int, bool, lcid, unitMagnitude)
  • str tsuboUnitS()
  • str tsuboS(double, bool, int, bool, lcid)
  • double realInchesWithMagnitude(double, unitMagnitude)
  • str showUnitHelper(str, unitMagnitude)
  • void showUnitHelper(StrBuf, unitMagnitude)
  • int->str precisionsToLabel(distanceUnit)
  • str unitS(double, distanceUnit, bool, bool, bool, int, bool, lcid, unitMagnitude)
  • str roundToPrecisionUnitS(double, distanceUnit, bool, bool, int, bool, lcid, unitMagnitude)
  • str meterConvertToUnitS(double, bool, bool, lcid, unitMagnitude, distanceUnit, int)
  • str kgfPermm2S(int, bool, bool, lcid)
  • str kgfPercm2S(int, bool, bool, lcid)
  • str lbfPerInches2S(int, bool, bool, lcid)
  • str lbfPerFeet2S(int, bool, bool, lcid)
  • str toS(pressureUnit, unt, bool, bool, lcid)
  • str toS(weightType, distanceUnit, int, bool, bool, lcid)
  • str toMetricS(int, bool, bool, lcid)
  • str toImperialS(int, bool, bool, lcid)

cm.core

Removed the following functions because ensureSettings did not do anything.

Remove: public void addCetQLParamsFromSnapper(Snapper z, bool ensureSettings) {
Remove: public void removeCetQLParamsFromSnapper(Snapper z, bool ensureSettings) {

class Animation

Removed: extend public void hideCircleMenu(AnimationMouseInfo mi=null) {

class CircleMenu

Replaced global variable with global function. Now there is no variable to set. The function checks if there is any visible circle menu.

Old: public bool inCircleMenu = false;
New: public bool inCircleMenu() {
Old: public constructor(Window parent, Window owner,
			Brush brush=null,
			Skin skin0=null,
			FrameStyle frameStyle=noFrame,
			frame3DState frameState=frameStateUp,
			SrcRef src=#:src) {
New: public constructor(Window parent, Window owner,
			str key=defaultCircleMenuKey,
			Brush brush=null,
			Skin skin0=null,
			FrameStyle frameStyle=noFrame,
			frame3DState frameState=frameStateUp,
			bool transparent=true,
			SrcRef src=#:src) {

Now you can retrieve a circle menu by its key.

Old: public CircleMenu circleMenu(Window w, bool includeHidden=false) {
New: public CircleMenu circleMenu(str key) {

Comment: If you need to close a specific circle menu you can use the class member function instead.

Old: public void hideCircleMenu(Window w, bool fromUndo=false) {
New: public void hideAllCircleMenus(bool fromUndo=false) {

class CoreDistanceField

The new function is in the same file but is no longer a member of CoreDistanceField.

Old: final public Double scanAndCalculate(str text) {
New: public Double scanAndCalculate(str text, distanceUnit defaultUnit) {

clas enableV2ViewModeBar

The following changes were made to support efforts in the Facelift project

The global setting enableV2ViewModeBar and the class ViewModeBarV2 has been removed, as ViewModeBarV2 has been merged with its parent class.

cm/core/coreUIEffect.cm has been moved to cm/win/uiEffect.cm, which has effected the following classes and functions:

public class AbstractEffect;
public class AbstractUIEffect;
public double logEffectLambdaFunction(double lambda, AbstractEffect effect) {}
public double expEffectLambdaFunction(double lambda, AbstractEffect effect) {}
public double tanhEffectLambdaFunction(double lambda, AbstractEffect effect) {}
public double oneEffectLambdaFunction(double lambda, AbstractEffect effect) {}
public double bouncingEffectLambdaFunction(double lambda, AbstractEffect effect) {}

ViewModeButton's constructor has been been modified as follows:

Removed: public constructor(Window parent, ViewMode mode, bool normal, SrcRef src=#:src) {}
Added: public constructor(Window parent, ViewMode mode, SrcRef src=#:src) {}

cm.core.block

BlockSnapper has had the following changes to its methods:

Removed: extend public void edit() {}
Added: extend public void edit(Space[] parentSpaces=null) {}

The following functions have been removed:

Removed: public bool acceptModifyBlockInSeveralAlternativeSpaces(Block block) {
Removed: public bool acceptModifyBlockInSeveralAlternativeSpaces(Snapper snapper) {

Instead, a combination of these new functions can be used:

Added: public bool isAnyBlockInMultipleAlternatives(Snapper{} snappers) {
Added: public bool isBlockInMultipleAlternatives(Snapper snapper) {
Added: public bool isBlockInMultipleAlternatives(Block block) {
Added: public bool isBlockInMultipleAlternatives(guid blockGuid) {
Added: public void showModifyBlockInMultipleAlternativesWarningDialog() {
Added: public int showModifyBlockInMultipleAlternativesWarningPromptDialog() {

cm.core.calc

Updated/Deprecated Interfaces:

The parameter PartInfoTree tree=null was added to the constructor in CalcDoubleInputCell and CalcGridCellPopup to populate the new infoTree field.

// calcDoubleInputCell.cm
Old: public constructor(BasicPartColumn column, Part part, PartCache cache, Space space)
New: public constructor(BasicPartColumn column, Part part, PartCache cache, Space space, PartInfoTree tree=null)

calcGridCellPopup.cm
Old: public constructor(Window parent, BasicPartColumn column, Part part, Space space, rectI cellBound)
New: public constructor(Window parent, BasicPartColumn column, Part part, Space space, rectI cellBound, PartInfoTree tree=null)

cm.core.dwg

class DwgBspSplitEnv

Caching bound is now the responsibility of class DwgBspEntry. Methods and members related to caching was removed.

Removed: public Graph->Rect boundCache();
Removed: final public rect bound(Graph g) : inline {

cm.core.library

The following changes were made to support the facelift project

The Library and CompanyLibrary constructors have been modified as follows:

// Library
Removed: public constructor(LibraryLimb tree, symbol pkg, bool rebuildOnUserLevelChange=false, function() viewModeHook=null) {}
Added: public constructor(LibraryLimb tree,
                          symbol pkg,
                          bool rebuildOnUserLevelChange=false,
                          bool facelift=false, // ADDED
                          LibraryHeaderBuilder headerBuilder=null, // ADDED
                          function() viewModeHook=null) {}

// CompanyLibrary
Removed: public constructor(LibraryLimb tree,
                            symbol pkg,
                            bool rebuildOnUserLevelChange=false,
                            str companyKey=null,
                            version version=version(0, 0, 0),
                            function() viewModeHook=null) {}
Added: public constructor(LibraryLimb tree,
                          symbol pkg,
                          bool rebuildOnUserLevelChange=false,
                          bool facelift=false, // ADDED
                          LibraryHeaderBuilder headerBuilder=null, // ADDED
                          str companyKey=null,
                          version version=version(0, 0, 0),
                          function() viewModeHook=null) {}

The constructor for LibraryLimb has been changed, and LibraryLimb now stores a UIHint in a field, so UIHint fields in subclasses have been removed:

// LibraryLimb
Removed: public constructor(symbol pkg,
                            str key,
                            Image image=null,
                            bool frame=true,
                            str label=null,
                            str toolTipText=null,
                            Image toolTipImage=null,
                            SectionButton[] buttons=null,
                            SrcRef src=null) {}
Added: public constructor(symbol pkg,
                          str key,
                          Image image=null,
                          bool frame=true,
                          str label=null,
                          str toolTipText=null,
                          Image toolTipImage=null,
                          SectionButton[] buttons=null, // ADDED
                          UIHint hint=null, // ADDED
                          SrcRef src=null) {}

// AutoGroupLimb
Removed: public UIHint hint;

// ComponentLimb
Removed: public UIHint hint;

// SettingLimb
Removed: public UIHint hint;

// VoidCallbackLimb
Removed: public UIHint hint;

The UIHint class and its child classes have changed in the following ways:

// UIHInt
Removed: public constructor(bool showLabel=false,
                            bool prefer3D=false,
                            sizeI preferSize=(-1, -1)) {}
Added: public constructor(bool showLabel=false,
                          bool prefer3D=false,
                          sizeI preferSize=(-1, -1),
                          int columns=0, // ADDED
                          alignment align=middle, // ADDED
                          pointI margins=(-1, -1) // ADDED
                          ) {}

Deprecated: public class UIMarginsHint extends UIHint {}

// UIFrameHint
Removed: public pointI margins;

// UITextSideHint
Removed: public constructor(alignment textSide,
                            bool showLabel=false,
                            bool prefer3D=false,
                            sizeI preferSize=(24, 24)) {}

Added: public constructor(alignment textSide,
                          bool showLabel=false,
                          bool prefer3D=false,
                          sizeI preferSize=(24, 24),
                          alignment align=middle // ADDED
                          ) {}

// UIImageHint
Removed: public pointI margins;

Removed: public constructor(bool showLabel=false,
                            Image image=null,
                            alignment textSide=alignment.down,
                            FrameStyle frameStyle=null,
                            pointI margins=(-1, -1),
                            sizeI preferSize=(-1, -1)) {}

Added: public constructor(bool showLabel=false,
                          Image image=null,
                          alignment textSide=alignment.down,
                          FrameStyle frameStyle=null,
                          pointI margins=(-1, -1),
                          sizeI preferSize=(-1, -1),
                          int columns=0, // ADDED
                          alignment align=middle // ADDED
                          ) {}

// UIBrushHoverHint
Removed: public pointI margins;

UIBuilder has had the following changes to its fields:

Removed: public int mg;

UIGroupBuilder has had the following changes to its methods:

Removed: extend public Window build(UIBuilder uiBuilder, LibraryLimb limb, Window window) {}
Added: extend public Window build(UIBuilder uiBuilder,
                                  LibraryLimb limb,
                                  Window window,
                                  bool subsection=false /** ADDED **/) {}

UIGroupOrganizerEnv has had the following changes:

Removed: public int mg;
Added: public Margins margins;

Removed: final public int mg() {}
Added: final public Margins mg() {}

OldSchoolGroupOrganizer has been completely removed.

cm.core.part

Updated/Deprecated Interfaces:

The parameter bool ignoreBlockSpace was added to the adjustment interfaces in partAdjustment.cm to determine if a PartAdjustment should be stored or found on BlockSpaces. When set to true, the functions will ignore the space parameter if it is a BlockSpace and use the Part's space instead. When false, the functions will not ignore the space parameter if it is a BlockSpace.

// partAdjustment.cm
Old: public Object adjustedValueIfAny(Part part, str key, Space space) : deprecated
New: public Object adjustedValueIfAny(Part part, str key, Space space, bool ignoreBlockSpace=true)

Old: public void adjustProperty(Part part, str key, Object value, Space space=null, bool createIfNull=true) : deprecated
New: public void adjustProperty(Part part, str key, Object value, Space space=null, bool createIfNull=true, bool ignoreBlockSpace=true)

Old: public bool isAdjusted(Part part, Space space, str key) : deprecated
New: public bool isAdjusted(Part part, Space space, str key, bool ignoreBlockSpace=true)

class Part.cm:

The parameter bool ignoreBlockSpace was added to the adjustment interfaces in Part to determine if a PartAdjustment should be stored in BlockSpaces.
When set to true, an adjusted Part will store it's adjustment on the main Space. When false, the adjustment will be stored on the BlockSpace that it was made on.

// part.cm
Old: extend public SinglePartAdjustment newAdjustment(Space space) : deprecated
New: extend public SinglePartAdjustment newAdjustment(Space space, bool ignoreBlockSpace=true)

Old: extend public void putAdjustment(SinglePartAdjustment adjustment, Space space) : deprecated
New: extend public void putAdjustment(SinglePartAdjustment adjustment, Space space, bool ignoreBlockSpace=true)

Old: extend public SinglePartAdjustment adjustment(Space space) : deprecated 
New: extend public SinglePartAdjustment adjustment(Space space, bool ignoreBlockSpace=true)

class PartInfoTree

The columns() function now returns PartColumn[] rather than PartInfoColumn[]. This allows a PartInfoTree to contain any type of PartColumn.

Old: extend public PartInfoColumn[] columns() {
New: extend public PartColumn[] columns() {

cm.core.propsScheme

PropsSchemeDialog

Old: extend public void refreshSearchResult() 
New: final public void refreshSearchResult()  // use the new refreshSearchResultFor for specificity
New: extend public void refreshSearchResultFor(str{} keys) 

PropsSchemeOptionLabel

Old:    extend public void highlight(str target, bool ignoreCase=true) 
New:	extend public void highlight(str target, color hc, bool ignoreCase=true)

Old:    extend public void highlight(str{} keys) 
New:    extend public void highlight(str{} keys, color hc) 

PropsSchemeOptionsSubWindow

Old:        extend public void highlight(str target, bool ignoreCase=true) {
New:        extend public void highlight(str target, color hc, bool ignoreCase=true) {

Old:        extend public void highlight(str{} keys) {
New:        extend public void highlight(str{} keys, color hc) {

PropsSchemeSectionedLabel

Old:        extend public void highlight(str target, bool ignoreCase=true) {
New:        extend public void highlight(str target, color hc, bool ignoreCase=true) {

Old:        extend public void highlight(str{} keys) {
New:        extend public void highlight(str{} keys, color hc) {

cm.core.user

Removed: public void deleteUserStyle(str styleKey) {
Added: public void deleteUserStyle(UserStyle style) {
Removed: public bool saveUserStyle(UserStyle style) {
Removed: public bool saveUserStyle(UserStyle style, Url url) {
Added: public bool saveUserStyle(UserStyle style, bool newStyle=false, Url url=null) {

class UserStylesHolder

Old: public sorted str->UserStyle styles;
New: private sorted str->UserStyle styles : public readable;
Added: public void remove(str key) {

The new put method uses the key of the style. Consider using this if the key matches the key of the style.

Added: final public void put(UserStyle p) {

class UserStyle

Old: public class UserStyle {
New: public class UserStyle : abstract {

Replaces getStyleUrlPath in RegTypeCard.

Added: extend public Url getDefaultStyleUrlPath() {

class RegTypeCard

Replaced with method in UserStyle:

Removed: extend public Url getStyleUrlPath(UserStyle s) {
Removed: extend public bool addNewStyle(UserStyle s) {
Removed: extend public bool saveStyle(UserStyle s) {
Added: extend public bool saveStyle(UserStyle s, bool newStyle=false) {

class RegTypeDialog

Removed: extend public bool addNewStyle(UserStyle s) {
Added: extend public bool saveStyle(UserStyle style, bool newStyle=false) {

class ComboQuickProperty

Old: public bool edit;
New: private bool edit;

cm.draw

The following colour constants have been moved to cm.win:

public const color black(0, 0, 0);
public const color white(255, 255, 255);

public const color lightGray(220, 220, 220);
public const color gray(198, 198, 198);
public const color darkGray(145, 145, 145);

public const color lightRed(235, 175, 175);
public const color red(212, 151, 151);
public const color darkRed(210, 120, 120);
public const color brightRed(230, 100, 100);
public const color strongRed(255, 0, 0);

public const color lightGreen(114, 191, 134);
public const color green(128, 163, 135);
public const color darkGreen(110, 135, 110);
public const color brightGreen(90, 190, 90);
public const color strongGreen(0, 255, 0);

public const color lightBlue(155, 197, 230);
public const color blue(135, 177, 248);
public const color darkBlue(126, 126, 200);
public const color brightBlue(110, 110, 240);
public const color strongBlue(0, 0, 255);

public const color lightYellow(230, 231, 186);
public const color yellow(229, 231, 164);
public const color darkYellow(208, 203, 115);
public const color brightYellow(235, 230, 90);
public const color strongYellow(255, 255, 0);

public const color lightBrown(211, 200, 169);
public const color brown(192, 176, 138);
public const color darkBrown(172, 153, 110);

public const color lightBeige(205, 205, 180);
public const color beige(224, 211, 175);
public const color darkBeige(229, 204, 133);

public const color lightOrange(238, 200, 140);
public const color orange(245, 194, 98);
public const color darkOrange(220, 170, 70);
public const color brightOrange(246, 168, 33);

public const color lightPurple(213, 183, 229);
public const color purple(198, 137, 229);
public const color darkPurple(165, 114, 191);
public const color brightPurple(190, 108, 200);
public const color strongPurple(255, 0, 255);

cm.format.dwg

cm.format.dwg.dwgMaterialData.cm

Removed unused field from DwgMaterialProp constructor.

Old: public constructor(Url texturePath, CByteArray pixelData)

New: public constructor(Url texturePath)

cm.geometry

The following functions have been moved to cm.win:

  • str inchesS(box, bool, lcid, int)
  • str inchesS(line, bool, lcid, int)
  • str inchesS(point, bool, lcid, int)

cm.geometry.advanced.collision

Limited Vector Option

A field in this class has been changed to be more generic to handle more variants of SubSet.

public class CollisionLimitedVectorOption extends CollisionVectorOption {
- Old: public DoubleStepRange steps;
- New: public SubSet domain;

cm.geometry2D

str inchesS(point2D, bool, lcid, int) has been moved to cm.win.

cm.lang

str inchesS(range, bool, lcid, int) has been moved to cm.win.

cm.std.architectural

Removed the following deprecated definitions from the SelectedFloorControl class.

Removed: public CoreDistanceField elevation;
Removed: public CoreDistanceField floorT;
Removed: public CoreDistanceField ceilingH;

The following constructors in FloorViewItem has been changed. The remaining constructor should be enough for all known use-cases.

Old: public class FloorViewItem extends TreeViewItem {
New: public class FloorViewItem extends LevelTreeViewItemBase {
Old: public constructor(FloorsControl floorsControl, SpaceVolume v, SrcRef src=#:src) {
New: public constructor(FloorsControl floorsControl, SpaceVolume v) {
Removed: public constructor(FloorsControl floorsControl, symbol id, Space space, SrcRef src=#:src) {

The following fields in the FloorViewItem class was made private and moved into the base class LevelTreeViewItemBase. The fields can still be accessed through getter functions.

Old: public Space space : copy=reference;
New: private Space _space : copy=reference;
Old: public symbol volumeId;
New: private symbol _volumeId;

The following methods in FloorViewItem have been modified and moved into the new base class LevelTreeViewItemBase. In most cases this shouldn't require any action.

Old: extend public bool isOutside() {
New: final public bool isOutside() {
Old: extend public void setSpace(Space space) {
New: extend public void setSpace(Space newSpace) {
Old: extend private bool anyLevelsCreated() {
New: final public bool anyLevelsCreated() {
Old: extend public bool isVisible() {
New: final public bool isVisible() {
Old: extend public bool isLocked() {
New: final public bool isLocked() {
Old: extend public bool isSolid() {
New: final public bool isSolid() {
Old: extend public void toggleVisibility() {
New: final public void toggleVisibility() {
Old: extend public void toggleLocked() {
New: final public void toggleLocked() {
Old: extend public void toggleSolid() {
New: final public void toggleSolid() {

The following method in FloorViewItem has been moved to a standalone function outside of the class.

Removed: extend public void cloneFloor(bool onlyVolumeSnappers) {
Added: package void undoableCloneLevel(SpaceVolume volume, Space space, bool onlyVolumeSnappers=false) {

cm.std.tools

The following definitions in cm/std/tools/library.cm have been removed, as they are no longer used. If you still require some of the functionality, consider making a local copy of it.

Removed: package bool showMirror = false;
Removed: public class ShowMirrorVisibility extends LibraryLimbVisibility {
Removed: public str arrowHeadIndexToLabel(Object o) {
Removed: public str precisionIndexToLabel(Object o) {
Removed: public Object setInitialPrecision(ObjectSubSet seq, int key) {

The following definitions in cm/std/tools/library.cm have been changed to private, as they were not used outside of the file.

Old: package int->str pToLCache = null;
New: private int->str pToLCache;
Old: package distanceUnit lastUnit = distanceUnit.none;
New: private distanceUnit lastUnit = distanceUnit.none;

cm.win

The following changes were made to support efforts for the Facelift project.

SlimDoubleScrollBar has been deprecated. Set the slim parameter in DoubleScrollBar to true instead.

The following changes were made to cm/win/cardWindow.cm:

Removed: public bool delayToolboxPaint;
Removed: public taskStatus cardWindowDrawFrameCB(Task task, timespan slot, Object arg) {}
Removed: public taskStatus cardWindowDrawFlapsCB(Task task, timespan slot, Object arg) {}

FrameWindow resizing has been split into 2 separate methods.

The first method resizing0 determines the frame borders and resizing1 should perform actual re-layout logic.

Deprecated: extend public rectI resizing(rectI r, bool left, bool right, bool top, bool bottom)
Added: extend public rectI resizing0(rectI r, bool left, bool right, bool top, bool bottom)
Added: extend public void resizing1(sizeI s)

CardWindow has had the following changes:

Removed: public bool rebuildingInProgress;
Added: public int rebuildNesting;
Added: final public bool rebuildingInProgress() {}

Removed: extend public bool drawFrame(WindowPixelDevice c, bool enqueue=true) {}
Added: extend public bool drawFrame(WindowPixelDevice c) {}

Removed: extend public void drawFlaps(WindowPixelDevice c, bool dragging=false, bool enqueue=true) {}
Added: extend public void drawFlaps(WindowPixelDevice c, bool dragging=false) {}

FormattedTextArea has the following methods removed:

Removed: final public void setText(null n) {}

All predefined LegacyFrames in cm/win/legacyFrame.cm have been removed due to performance issues:

Removed: public FrameStyle redButtonFrame -> Migrate to redPenFrame
Removed: public FrameStyle greenButtonFrame -> Migrate to greenPenFrame
Removed: public FrameStyle blueButtonFrame -> Migrate to bluePenFrame
Removed: public FrameStyle grayFrame -> Migrate to stdLightFrame
Removed: public FrameStyle mediumGrayFrame -> Migrate to stdGrayFrame
Removed: public FrameStyle darkGrayFrame -> Migrate to darkGrayPenFrame
Removed: public FrameStyle unknownFrame -> Migrate to null

The fields in SubMenuInfo have been changed:

Removed: public bool visible;

The following change in cm/win/distanceLabel.cm was made to support adding yardage as a unit of measure.

Added: public str yardsS(double meters, bool showUnit=true, int decimals=2, bool decimalZeroes=false, lcid locale=lcid(-1), unitMagnitude magnitude=unitMagnitude.dist) {}

Runtime/Behavior Changes

cm.abstract.dataSymInterface

Updated:

The valueS() function in DsiPDataOption was updated to now return specialCode if there is one.

// dsiPDataOption.cm
Old: 
extend public str valueS() {
	if (_dataType.Character) return code;
	...
}

New: 
extend public str valueS() {
	if (_dataType.Character) return specialCode ?? code;
	...
}

cm.abstract.dataSymbol

Updated Interfaces:

The generateSifOptionRows function in DsPData was updated to take a DsPart as a parameter.

// dsPData.cm
Old: final public void generateSifOptionRows(SifEnv env, Option o, DsiPDataOption pO, int level=0) : deprecated
New: final public void generateSifOptionRows(SifEnv env, Option o, DsiPDataOption pO, DsPart part=null, int level=0)

Updated:

The generateSifOptionRows function in DsPData was updated to export a CustomerOwnMaterial code and description for a DsiPDataOption where appropriate.

Added:

The dsGenerateCOMPartsHook was added as part of the rawPartListHooks. It gathers CustomerOwnMaterials on DsPDatas and generates child COMParts from these materials.

// hooks.cm

/**
 * Append COMParts from Part.
 * (COMParts hook)
 */
package Part[] dsGenerateCOMPartsHook(Part[] parts, Space space) {
    for (part in parts) {
	Snapper snapper = part.owner;
	generateCOMParts(snapper, part);
    }

    return parts;
}

cm.abstract.material

Deprecated functions:

  • public void build() : deprecated
    • public void rebuild() updates the dialog
  • public void editTFCB() : deprecated
    • use public void controlCb(Control c)
  • public void updateTF() : deprecated
    • use public void update()

cm.abstract.materialHandling

MhFrameUpdateBayHeightFunction changes

As mentioned under Compile Time Changes, MhFrameUpdateBayHeightFunction has been renamed to MhFrameHeightChangeUpdateBayFunction. This was changed to more accurately reflect the logic of the class. Additionally, the function key associated with this function has already been changed:

Old: res << MhFrameUpdateBayHeightFunction("frameUpdateBayHeight");
New: res << MhFrameHeightChangeUpdateBayFunction("frameHeightChangeUpdateBay");

All calls of "frameUpdateBayHeight" have been updated to "frameHeightChangeUpdateBay" in the abstract, you will need to do the same as well in your extension.

MhBayEditorMeasurementsBehavior changes

The measurements() method has had some of its code moved out into seperate methods getBayHeightMeasurements() and getLevelHeightMeasurements().

    /**
     * Get bay height measurements.
     */
    extend public void getBayHeightMeasurements(<line, double, point>[] lines,
                                                MhSnapper owner, box b,
                                                double offset) {
        double lbh = owner.shapeBoundWithChildren(symbols=[sLevel, sUnitLoad]).h;
        double frameH = lbh;
        forChildren(snapper in owner.rootParent) if (snapper as MhSnapper) {
        
        // Frame Height
        lines << <line(b.p0, (b.p0.point2D, frameH)), offset, (0, 1, 0)>;
    }


    /**
     * Get level height measurements.
     */
    extend public void getLevelHeightMeasurements(<line, double, point>[] lines,
                                                  MhSnapper owner, box b,
                                                  double offset) {
        double last = 0;
        double lastZ = 0;
        for (MhSnapper l in owner.getSortedChildren(), index=i) {
            if (l.isLevel) {
                // Level height (between levels).
                double curr = l.toSpaceTransform.pos.z;
                lines << <line((b.p1.x, b.p0.y, last), (b.p1.x, b.p0.y, curr)), offset, (0, -1, 0)>;
                last = curr;

                // Level height - frame height.
                box lb = l.shapeBound([sLevel, sLevelFrame]);
                double z = curr - lb.h;
                lines << <line((b.p1.x, b.p1.y, lastZ), (b.p1.x, b.p1.y, z)), offset, point0>;
                lastZ = l.localBoundWithChildren.p1.z + curr;
            }
        }
    }

MhSpecificConfigurationBehavior changes

Removed specific configuration behaviors as default behaviors for the bay, frame, and level spawners.

Affected spawners:

  • MhBaySpawner
  • MhFrameSpawner
  • MhLevelSpawner
  • MhRackFrameSpawner
  • MhRackLevelSpawner

MhStorageConfiguration changes

The field preview has been moved down from MhRackingConfiguration in the cm.abstract.materialHandling.storage.racking package into MhStorageConfiguration in the cm.abstract.materialHandling.storage package.

public class MhStorageConfiguration extends MhSystemConfiguration {

    /**
     * Preview
     */
    public MhStorageConfigurationPreview preview : copy=null, stream=null;
}

You do not need to add any load code as this field is not streamed.

This class also now generates and returns a preview by default. If you do not wish to see a preview in your pre configurator, you will have to override the configurationPreview() method.

Old:
    extend public MhStorageConfigurationPreview configurationPreview() { return null; }


New:
    extend public MhStorageConfigurationPreview configurationPreview() {
        if (!preview) preview = MhStorageConfigurationPreview();
        return preview;
    }

MhEngineManager changes

New method updateSystemsAfterExport added to engine manager that runs after export instead of after the initial export. alignAllSnapped of the rows is now done in updateSystemsAfterExport instead of updateSystemsAfterInitialExport.

New: extend public void updateSystemsAfterExport(MhSystemEngineEnvironment env, MhSystemCollection[] systems,
                                                 Snapper{} snappers, MhEngine engine)

More control over which engine runs are executed using space

Currently when calling mhRunEngines(), all collected engine runs will be ran. We have introduced the ability to only run specific engine runs by passing in a space to MhRunEngineEnv. If space has been passed into the engine run env, when running engines, we will not execute any engine runs that do not match the engine related to the given space.

public class MhEngineManager extends CoreObject {

    /**
     * Run all engines.
     */
    extend public void runEngines(MhRunEngineEnv runEnv=null) {
        ...
        Space space = runEnv.space;
        for (e, list in engineRunList) {
            ...
            if (space and e != mhEngine(space, createIfNone=false)) continue;
            ...
        }
        ...
    }
}

Here are the changes we made to now use space when running engines:

  • Pre configurator previews now only run engine runs related to the preview space when populating preview snappers.
public class MhStorageConfigurationPreview extends PropObj {

    /**
     * Populate the preview snappers.
     */
    extend public void populatePreviewSnappers(MhStorageConfiguration config,
                                               MhStorageConfigurationItem item=null) {
        ...
        mhRunEngines(MhRunEngineEnv(space=previewSpace, blockFinalize=false, blockExport=true));
        ...
    }


    /**
     * Spawn preview snappers.
     */
    extend public void spawnPreviewSnappers(MhStorageConfiguration config) {
        ...
        mhRunEngines(MhRunEngineEnv(space=previewSpace, blockExport=false));
    }
  • MhSnapper validate event for sRunEngines will now only run engine runs for the snapper's space.
public class MhSnapper extends Snapper {
    /**
     * Validate 'k' (change to set).
     */
    public void validate(symbol k, Object env=null) {
        ...
        switch (k) {
          case sRunEngines: {
              ...
              mhRunEngines(MhRunEngineEnv(space=space, blockFinalize=true, initiator=initiator));
              ...
          }
        ...
    }
  • The mhRunEngines() call at every #endUndoStep event viewed by MhEngineManagerEventViewer has been changed to first collect all spaces related to the undo step and then call mhRunEngines() for each collected space.
public class MhEngineManagerEventViewer extends EventViewer {

Old:
    /**
     * Event being fired.
     */
    public bool event(symbol event, Object z, str->Object args) {
        if (event == #endUndoStep) {
            if (?UndoStep step = z) {
                ...
                mhRunEngines(MhRunEngineEnv(blockFinalize=false, blockExport=true));
            }
        }
        ...
    }


New:
    /**
     * Event being fired.
     */
    public bool event(symbol event, Object z, str->Object args) {
        if (event == #endUndoStep) {
            if (?UndoStep step = z) {
                Space{} spaces(4);
                for (MhSnapper s in step.referred) {
                    if (!s.isAlive) continue;
                    spaces << s.space;
                    ...
                    }
                }

                for (s in spaces) mhRunEngines(MhRunEngineEnv(space=s, blockFinalize=false, blockExport=true));
            }
        }
        ...
    }
}

cm.abstract.materialHandling.storage.racking

Tunnel graphics

Tunnel graphics will no longer be shown during rendering. The line that removed the tunnel from the rendering is as below:

public class MhTunnelGfxBehavior extends MhGenericGfxBehavior {

    /**
     * Tunnel 3D.
     */
    extend public Primitive3D tunnel3D(MhSnapper owner, FetchEnv3D env) {
        ...
        p.layer = not(#render);
        ...
    }

This change is made in tunnel3D() from the MhTunnelGfxBehavior class, located in behavior/mhTunnelGfxBehavior.cm. So any tunnel that uses this class and method will no longer be rendered, and this method will have to be overriden if you would still like the tunnel to be shown.

cm.abstract.materialHandling.storage.shelving

MhShelvingBayConfigurationItem changes

The method updateBayHeight() has been updated to use logic similar to other storage extensions. It relies on the mhCalculatedBayHeightForConstruction() function.

No floor level by default

We do not expect shelving products to have floor levels and so have update MhShelvingBayEngineBehavior to not generate floor levels by default.

public class MhShelvingBayEngineBehavior extends MhBayEngineBehavior {

    /**
     * Add floor level.
     */
    public bool addFloorLevel(MhSnapper snapper) { return false; }


    /**
     * * Accepts function run.
     */
    public bool acceptFunctionRun(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {
        str funcName = func.name;
        if (funcName == "bayEnsureFloor") return false;
        return super(..);
    }
}

See "New pre configurator classes" about the new `MhShelvingConfiguration class which mentioned overridden logic to support no floor levels.

Default shelving clearance spec

MhShelvingClearanceConfigurationItem now returns a MhShelvingClearanceSpec object by default for defaultClearance().

public class MhShelvingClearanceConfigurationItem extends MhClearanceCompartmentConfigurationItem {

    /**
     * Default clearance.
     */
    public MhClearanceSpec defaultClearance() {
        return MhShelvingClearanceSpec();
    }
}

cm.abstract.storage.racking.selective

Selective Racking extension changes

Selective racking extension now extends from generic Extension class.

Old: private class AbstractSelectiveRackingExtension extends AbsRackingExtension
New: private class AbstractSelectiveRackingExtension extends Extension

cm.basic

Changes / Fixes to weak collections

Previously, if a sequence was declared as 'weak', it would also clear out null values when the sequence is resized. This would cause the observed contents of the seqeunce to change at what would appear to be an arbitrary time. With this release, these sequences will no longer clean up null values on resize.

When streaming a collection with weak values, the object loses the weak value attribute when being streamed back in. This functionally meant that all unstreamed collections would not have the weak value attribute, regardless of their state before streaming. As of this release, the weak value attribute will be respected when un-streaming.

cm.core

Added:

A function to collect any additional child parts has been added to the OrderExporter. This is to catch COMParts that are appended during rawPartsListHooks.

// orderExporter.cm
extend public void collectAdditionalChildParts(Part[] parts)

cm.core.dwg

class DwgBspEntry

DwgBspEntry is now responsible for caching graph.bound.

To utilize the cache, access the bound by calling DwgBspEntry::bound() rather than DwgBspEntry::graph.bound(). The latter will always return a freshly calculated bound, while the former is cached.

Also, be mindful that you do not mutate a Graph owned by a DwgBspEntry in a way that affects it bound after its initialization, as this does not automatically clear the cache.

cm.core.graph

Fixed a bug in gText.cm where evaluatedSize() did not properly respect the scale argument. It only updated the font with the scale, bus assumed the scale for the actual size was 0.001.

You can ignore this if you do not manually call evaluatedSize. If not, note that evaluatedSize is now scaled up by a factor of scale / 0.001 compared to previous versions of CET.

cm.core.library

The following changes were made to support efforts for the facelift project.

A new automatic caching system has been added for extension libraries, so any custom caching should be removed in order to not conflict with it.

UIHints now apply to children of the LibraryLimb as well. This allows applying the same hint to all child limbs without explicitly passing it in to each one. You can still override the hint by applying a different hint to the limb.

cm.core.part

File Part.cm

semiHidden() is no longer a condition in isVisibleInMaterialList() as a way of including child parts during exports.

// part.cm

Old: 
public bool isVisibleInMaterialList(Part part, bool expand, bool child) {
    bool view;

    if (!part.visibleInMaterialList())
      view = false;
    else if (part.zeroQuantity(true))
      view = false;
    else if (part.canceled())
      view = false;
    else if (part.semiHidden())
      view = false;
    else
      view = true;
    
    return view;
}

New:
public bool isVisibleInMaterialList(Part part, bool expand, bool child) {
    bool view;
    
    if (!part.visibleInMaterialList()) {
	view = false;
    } else if (part.zeroQuantity(true)) {
	view = false;
    } else if (part.canceled()) {
	view = false;
    } else {
	view = true;
    }
    
    return view;
}

class PartInfoTree

A method for building the columns for a PartInfoTree was added. When a PartInfoTree is being built in the CalculationGridWindow, this method is called to build it's columns.

Added: extend public void buildColumns(CalculationGridWindow grid, int row, Space space) {

cm.core.user

Developers could previously add hooks for updating toolbox style treeviews when a style is updated by appending to updateToolBoxHook.

In addition to this, they would need to append a SelectWorldHooks to rebuild the treeview when the world changes (as different worlds have different saved styles).

Developers should no longer add a SelectWorldHooks to update toolbox drop downs, if they are already updated in hooks in updateToolBoxHook. All updateToolBoxHook are now called automatically when a new world is selected.

Updating via SelectWorldHooks should not cause functional issues, but may impact performance, as the update will happen twice.

cm.format.dwg

cm.core.dwg.dwgExporter.cm

Added new field to cache already exported materials.

Added: private str->DwgMaterialData cachedMaterials();

cm.win

The following changes were made to support the efforts of the facelift project.

Origin fixes

The origin of parent Windows will now be respected when doing operations like extendRight, extendBottom, extendBottomRight, and any other positioning functions, which may affect the layout of your dialogs.

Font changes

The new UI comes with a different larger font, which may affect the layout of your windows.

Improvements for Card

Hidden cards no longer get size updates from their parent parent CardWindow. This is to improve resizing performance. Instead, CardWindow will call parentClientBoundChanged before your card is shown.

To handle custom layout logic, you may can override Card's parentClientBoundChanged:

    /**
     * Parent client bound changed.
     */
    public void parentClientBoundChanged() {
        sizeI prevSize = size();
        super();
        if (size() != prevSize) updateLayout();
    }

Card are no longer constructed with a hardcoded size of (100, 100) to improve performance.

MenuBar size and margins

Upon constructing a MenuBar, you need to perform a finalize() method call.

    CoolMenuBar menu(parent);
    buildFileMenu(menu);
    buildEditMenu(menu);
    buildManufacturersMenu(menu);
    menuBar.finalize();

The finalize method call performs the following:

Call finalizeSubMenu to ensure sub menu margins consistent.

Perform an autoSize to calculates appropriate width and height.

Resize and reposition xControls as required during parentClientBoundChanged

SubWindow

SubWindows now paint the frame in repaint(mdc hdc, rectI r).

Miscellaneous

cm.abstract.materialHandling

Constant property keys

There has been an effort to replace existing str literals in the abstract used for property keys with constants. This makes the property keys easier to maintain and inspect. If you are using any of these literals in your extensions, you may replace them with the corresponding constants.

/**
 * Prop keys.
 */
public const str cMhLoadOnFloorPK = "loadOnFloor";
public const str cMhNoOfLevelsPK = "noOfLevels";
public const str cMhBayWidthPK = "bayWidth";
public const str cMhBayDepthPK = "bayDepth";
public const str cMhBayHeightPK = "bayHeight";
public const str cMhAisleOverhangPK = "aisleOverhang";
public const str cMhRearOverhangPK = "rearOverhang";
public const str cMhAddFloorLevelPK = "addFloorLevel";
public const str cMhFrameWidthPK = "frameWidth";
public const str cMhFrameDepthPK = "frameDepth";
public const str cMhFrameHeightPK = "frameHeight";
public const str cMhUprightDepthPK = "uprightDepth";
public const str cMhFootWidthPK = "footWidth";
public const str cMhFootDepthPK = "footDepth";
public const str cMhFootHeightPK = "footHeight";
public const str cMhEditedPK = "edited";
public const str cMhBottomStorageLevelPK = "bottomStorageLevel";
public const str cMhHolePitchPK = "holePitch";
public const str cMhHoleStartZPK = "holeStartZ";
public const str cMhLevelEntryPK = "levelEntry";
public const str cMhLoadEntriesPK = "loadEntries";
public const str cMhHoleZDomainPK = "holeZDomain";
public const str cMhNumBaysPK = "numBays";
public const str cMhBeamHeightPK = "beamHeight";
public const str cMhLevelClearanceZPK = "levelClearanceZ";
public const str cMhLevelElevationPK = "levelElevation";
public const str cMhLevelPK = "level";
public const str cMhUprightPK = "upright";
public const str cMhClearanceSpecPK = "clearanceSpec";
public const str cMhClearanceSpecIdPK = "clearanceSpecId";
public const str cMhRowLayoutClassPK = "rowLayoutClass";
public const str cMhRowAnglePK = "a";
public const str cMhRowAlignPK = "rowAlign";
public const str cMhPredefinedBayPK = "predefinedBay";
public const str cMhBayCountPK = "bayCount";
public const str cMhFrameCountPK = "frameCount";
public const str cMhAisleWidthPK = "aisleWidth";
public const str cMhCrossAisleDistPK = "crossAisleDist";
public const str cMhDownAisleDistPK = "downAisleDist";
public const str cMhAisleCountPK = "aisleCount";
public const str cMhOffsetFrontPK = "offsetFront";
public const str cMhOffsetBackPK = "offsetBack";
public const str cMhOffsetLeftPK = "offsetLeft";
public const str cMhOffsetRightPK = "offsetRight";
public const str cMhClosestRowPK = "closestRow";
public const str cMhTryConnectToOtherRowPK = "tryConnectToOtherRow";
public const str cMhPopulateOffsetPK = "populateOffset";
public const str cMhCollisionSolutionPK = "collisionSolution";
public const str cMhAdditionalPrimPK = "additionalPrim";
public const str cMhReversePK = "reverse";
public const str cMhBlockSpreadPK = "blockSpread";
public const str cMhBlockPopulateMorePK = "blockPopulateMore";
public const str cMhReOptimizePK = "reOptimize";
public const str cMhUnitLoadPK = "unitLoad";
public const str cMhClearancePK = "clearance";
public const str cMhStretchDirPK = "stretchDir";
public const str cMhUnitLoadKeyPK = "unitLoadKey";
public const str cMhNoOfUnitLoadsPK = "noOfUnitLoads";
public const str cMhNumAislesPK = "numAisles";
public const str cMhFootBoltCountPK = "footBoltCount";
public const str cMhBeamOffsetZPK = "beamOffsetZ";
public const str cMhLoadWithinLimitPK = "loadWithinLimit";
public const str cMhAutoULPopulatePK = "autoULPopulate";
public const str cMhRevertAutoULPopulatePK = "revertAutoULPopulate";
public const str cMhLevelLimitZPK = "levelLimitZ";
public const str cMhConfigKeyPK = "configKey";
public const str cMhLimitZPK = "limitZ";
public const str cMhFrameSnappersPK = "frameSnappers";
public const str cMhSnapperPK = "snapper";
public const str cMhHighestLevelZPK = "highestLevelZ";
public const str cMhSqueezeLevelsPK = "squeezeLevels";
public const str cMhArrangedByOtherBayPK = "arrangedByOtherBay";
public const str cMhMaintainBayHeightPK = "maintainBayHeight";
public const str cMhLevelOffsetZPK = "levelOffsetZ";
public const str cMhFlueDepthPK = "flueDepth";
public const str cMhFlueLoadToLoadPK = "flueLoadToLoad";
public const str cMhAisleLoadToLoadPK = "aisleLoadToLoad";
public const str cMhPopulateRowSpacersPK = "populateRowSpacers";
public const str cMhRowSpacerOffsetZPK = "rowSpacerOffsetZ";
public const str cMhFrameSpacerOffsetZPK = "frameSpacerOffsetZ";
public const str cMhRowSpacerThicknessPK = "rowSpacerThickness";
public const str cMhFrameSpacerThicknessPK = "frameSpacerThickness";
public const str cMhIsSiloPK = "isSilo";
public const str cMhBayEditorLevelPK = "bayEditorlevel";
public const str cMhUpPK = "up";
public const str cMhP0PK = "p0";