cet.runtime

Timeout changes for CET updates

mcCheckForUpdatesHandler.cm

Added new arguments to the abortTimedOutInstallation method in the MCCheckForUpdatesHandler class.

Old: final public void abortTimedOutInstallation() {
New: final public void abortTimedOutInstallation(bool failed=false) {

Also some interfaces were updated in the cm.extension package. Please refer to the documentation for those changes as well.

cm.abstract.conveyors

Interface name changes

We have updated most of the public classes in this package to start with the same prefix of "AC". We have also updated public globals and functions to include "ac" or "AC" in their names.

Classes:

OldNew
ACConvSeqPropDefsVisitorACConveyorSeqPropDefsVisitor
AbsConvChargeCTACConveyorChargeCT
AbsConvDischargeCTACConveyorDischargeCT
AbsConvSideChannelCTACConveyorSideChannelCT
AbsConvDivertCTACConveyorDivertCT
AbsConvCenterLineCTACConveyorCenterLineCT
AbsConvMergeCTACConveyorMergeCT
AbsConvTakeawayCTACConveyorTakeawayCT
AbsConvEndCTACConveyorEndCT
AbsConvTransferCenterLineCTACConveyorTransferCenterLineCT
AbsConvTransferCTACConveyorTransferCT
ConvComponentVisitorACConveyorComponentVisitor
ConvBedLocalBoundVisitorACConveyorBedLocalBoundVisitor
ConvCollectBedsVisitorACConveyorCollectBedsVisitor
ConvWidthObserverACWidthObserver
ConveyorBedACConveyorBed
ConveyorBedSequencerACConveyorBedSequencer
ConveyorBeltACConveyorBelt
ConveyorComponentACConveyorComponent
ConveyorCurvedBedACConveyorCurvedBed
ConveyorGraphicsEnvACConveyorGraphicsEnv
ConveyorMergeBedACConveyorMergeBed
ConveyorGenericPartColumnACConveyorGenericPartColumn
ConveyorElevationChangePartColumnACConveyorElevationChangePartColumn
ConveyorChargeElevationPartColumnACConveyorChargeElevationPartColumn
ConveyorDischargeElevationPartColumnACConveyorDischargeElevationPartColumn
ConveyorPitchPartColumnACConveyorPitchPartColumn
ConveyorRedPickerACConveyorRedPicker
ConveyorRollersACConveyorRollers
ConveyorStraightBedACConveyorStraightBed
ConveyorTakeAwayBedACConveyorTakeAwayBed
ConveyorTransferBedACConveyorTransferBed
ConveyorWedgeBedACConveyorWedgeBed
DetailPropertiesFactoryACDetailPropertiesFactory
DetailPropsButtonsPropertyFactoryACDetailPropsButtonsPropertyFactory
DetailPropertiesUIACDetailPropertiesUI
DetailPropsDialogACDetailPropsDialog
AcShape2DLinePrimitiveACShape2DLinePrimitive
HingedBedACConveyorHingedBed
ConvObserverACObserver
ConvStretchEnvACConveyorStretchEnv
CutRuleFactoryACCutRuleFactory
UnitClassACUnitClass
LengthUnitACLengthUnit
LengthUnitMACLengthUnitM
LengthUnitCMACLengthUnitCM
LengthUnitMMACLengthUnitMM
LengthUnitInchACLengthUnitInch
LengthUnitFeetACLengthUnitFeet
SpeedUnitACSpeedUnit
SpeedUnitMpSACSpeedUnitMpS
SpeedUnitFpMACSpeedUnitFpM
SpeedUnitMpMACSpeedUnitMpM

Fields & Methods:

public class ACConveyorBehavior {
Old: extend public SpeedUnit speed(Snapper z) {
New: extend public ACSpeedUnit speed(Snapper z) {

Old: extend public <range, SpeedUnit>[] speeds(Snapper z) {
New: extend public <range, ACSpeedUnit>[] speeds(Snapper z) {
}


public class ConveyorBed extends ConveyorComponent {
Old: extend public ConveyorBedSequencer seqr(Snapper z) {
New: extend public ACConveyorBedSequencer seqr(Snapper z) {

Old: extend public ConveyorBed next(Snapper z) {
New: extend public ACConveyorBed next(Snapper z) {

Old: extend public ConveyorBed previous(Snapper z) {
New: extend public ACConveyorBed previous(Snapper z) {

Old: extend public void appendRoller2D(PropObj owner, GInstance gs, ConveyorRollers rollers) {
New: extend public void appendRoller2D(PropObj owner, GInstance gs, ACConveyorRollers rollers) {

Old: extend public void appendBeltTopSidePath(APath2D path, ConveyorBed prev, ConveyorBed next, Snapper owner) {
New: extend public void appendBeltTopSidePath(APath2D path, ACConveyorBed prev, ACConveyorBed next, Snapper owner) {

Old: extend public ConveyorBedSequencer newSectionSequencer(ConveyorBedSequencer parent=null) {
New: extend public ACConveyorBedSequencer newSectionSequencer(ACConveyorBedSequencer parent=null) {
}


public class ConveyorBedSequencer extends CorePropObj {
Old: extend public ConveyorBed operator<<(ConveyorBed bed) {
New: extend public ACConveyorBed operator<<(ACConveyorBed bed) {

Old: extend public void _append(ConveyorBed bed) {
New: extend public void _append(ACConveyorBed bed) {

Old: extend public void _insert(int i, ConveyorBed bed) {
New: extend public void _insert(int i, ACConveyorBed bed) {

Old: extend public void _remove(ConveyorBed bed) {
New: extend public void _remove(ACConveyorBed bed) {

Old: extend public void append(Snapper z, ConveyorBed bed, bool addZone=false) {
New: extend public void append(Snapper z, ACConveyorBed bed, bool addZone=false) {

Old: extend public void insert(Snapper z, int i, ConveyorBed bed, bool addZone=false) {
New: extend public void insert(Snapper z, int i, ACConveyorBed bed, bool addZone=false) {

Old: extend public void remove(Snapper z, ConveyorBed bed) {
New: extend public void remove(Snapper z, ACConveyorBed bed) {

Old: extend public void seqrEvent(symbol event, ConveyorBed bed, Snapper z) {
New: extend public void seqrEvent(symbol event, ACConveyorBed bed, Snapper z) {

Old: extend public ConveyorBed next(Snapper z, ConveyorBed bed) {
New: extend public ACConveyorBed next(Snapper z, ACConveyorBed bed) {

Old: extend public ConveyorBed prev(Snapper z, ConveyorBed bed) {
New: extend public ACConveyorBed prev(Snapper z, ACConveyorBed bed) {

Old: extend public ConveyorBed chargeBed(Snapper z) {
New: extend public ACConveyorBed chargeBed(Snapper z) {

Old: extend public ConveyorBed dischargeBed(Snapper z) {
New: extend public ACConveyorBed dischargeBed(Snapper z) {

Old: extend public ConveyorBed[] sortedBeds(Snapper z) {
New: extend public ACConveyorBed[] sortedBeds(Snapper z) {

Old: extend public ConveyorBed bed(Snapper z, str key) {
New: extend public ACConveyorBed bed(Snapper z, str key) {

Old: extend public ConveyorBed bed(Snapper z, int i) {
New: extend public ACConveyorBed bed(Snapper z, int i) {

Old: extend public point nextBedConnectPos(Snapper z, ConveyorBed bed ) {
New: extend public point nextBedConnectPos(Snapper z, ACConveyorBed bed ) {

Old: extend public ConveyorBed centerBed(Snapper z) {
New: extend public ACConveyorBed centerBed(Snapper z) {

Old: extend public ACZone nextZone(Snapper z, ConveyorBed bed) {
New: extend public ACZone nextZone(Snapper z, ACConveyorBed bed) {

Old: extend public ACZone newZone(Snapper owner, ConveyorBed bed, bool force=false) {
New: extend public ACZone newZone(Snapper owner, ACConveyorBed bed, bool force=false) {

Old: extend public bool needsNewZone(Snapper owner, ConveyorBed bed) {
New: extend public bool needsNewZone(Snapper owner, ACConveyorBed bed) {

Old: extend public void applyStretchEnv(ConvStretchEnv stretchEnv, symbol event=null, Snapper z=null) {
New: extend public void applyStretchEnv(ACConveyorStretchEnv stretchEnv, symbol event=null, Snapper z=null) {

Old: extend public void applyStretchEnvs(ConvStretchEnv[] stretchEnvs, symbol event=null, Snapper z=null) {
New: extend public void applyStretchEnvs(ACConveyorStretchEnv[] stretchEnvs, symbol event=null, Snapper z=null) {

Old: extend public CutRuleFactory cutRuleFactory() {
New: extend public ACCutRuleFactory cutRuleFactory() {
}


public class ConveyorComponent extends Component {
Old: extend public ConveyorBedSequencer seq(PropObj owner) {
New: extend public ACConveyorBedSequencer seq(PropObj owner) {
}


public class ConveyorGraphicsEnv extends PropObj {
Old: public ConveyorBedSequencer seq;
New: public ACConveyorBedSequencer seq;

Old: public constructor(Snapper z, ConveyorBedSequencer seq) {
New: public constructor(Snapper z, ACConveyorBedSequencer seq) {
}


public class ConveyorRollers extends ConveyorComponent {
Old: extend public void appendRollers2D(GInstance gs, ConveyorBed bed) {
New: extend public void appendRollers2D(GInstance gs, ACConveyorBed bed) {

Old: extend public void appendStraightBedRollers2D(GInstance gs, ConveyorStraightBed bed) {
New: extend public void appendStraightBedRollers2D(GInstance gs, ACConveyorStraightBed bed) {

Old: extend public void appendRollers3D(FetchEnv3D env, Snapper z, ConveyorBed bed, Primitive3D[] prims) {
New: extend public void appendRollers3D(FetchEnv3D env, Snapper z, ACConveyorBed bed, Primitive3D[] prims) {

Old: extend public void appendWedgeBedRollers3D(FetchEnv3D env, Snapper z, ConveyorWedgeBed bed, Primitive3D[] prims) {
New: extend public void appendWedgeBedRollers3D(FetchEnv3D env, Snapper z, ACConveyorWedgeBed bed, Primitive3D[] prims) {

Old: extend public void appendStraightBedRollers3D(FetchEnv3D env, Snapper z, ConveyorStraightBed bed, Primitive3D[] prims) {
New: extend public void appendStraightBedRollers3D(FetchEnv3D env, Snapper z, ACConveyorStraightBed bed, Primitive3D[] prims) {

Old: extend public void appendCurvedBedRollers3D(FetchEnv3D env, Snapper z, ConveyorCurvedBed bed, Primitive3D[] prims) {
New: extend public void appendCurvedBedRollers3D(FetchEnv3D env, Snapper z, ACConveyorCurvedBed bed, Primitive3D[] prims) {
}


public class ConveyorStraightBed extends ConveyorBed {
Old: extend public void appendHeightChangeLines(GInstance gs, ConveyorGraphicsEnv env, Snapper z, point[] fillPositions) {
New: extend public void appendHeightChangeLines(GInstance gs, ACConveyorGraphicsEnv env, Snapper z, point[] fillPositions) {
}


public class ACZone extends CorePropObj {
Old: extend public ConveyorBed bed(Snapper z, str key) {
New: extend public ACConveyorBed bed(Snapper z, str key) {

Old: extend public ConveyorBed[] zoneSortedBeds(Snapper owner) {
New: extend public ACConveyorBed[] zoneSortedBeds(Snapper owner) {

Old: extend public ConveyorBedSequencer seqr(Snapper z) {
New: extend public ACConveyorBedSequencer seqr(Snapper z) {

Old: extend public void applyStretchEnv(ConvStretchEnv zoneEnv, symbol event=null, Snapper z=null) {
New: extend public void applyStretchEnv(ACConveyorStretchEnv zoneEnv, symbol event=null, Snapper z=null) {

Old: extend public ConvStretchEnv zoneStretchEnv(Snapper z) {
New: extend public ACConveyorStretchEnv zoneStretchEnv(Snapper z) {

Old: extend public void updateBed(ConveyorBed bed, ConveyorBed prevBed, Snapper z, Object env=null)  {
New: extend public void updateBed(ACConveyorBed bed, ACConveyorBed prevBed, Snapper z, Object env=null)  {

Old: extend public void setBedLengths(Snapper z, double[] lengths, ConveyorBed[] changeBeds) {
New: extend public void setBedLengths(Snapper z, double[] lengths, ACConveyorBed[] changeBeds) {

Old: extend public void conveyorAddOrRemoveBed(Snapper z, double[] lengths, ConveyorBed[] changeBeds, int firstChangeBed, int insertIdx) {
New: extend public void conveyorAddOrRemoveBed(Snapper z, double[] lengths, ACConveyorBed[] changeBeds, int firstChangeBed, int insertIdx) {
}


public class ConvStretchEnv extends PropObj {
Old: public ConveyorBedSequencer seqr;
New: public ACConveyorBedSequencer seqr;

Old: public ConveyorBed[] changeBeds();
New: public ACConveyorBed[] changeBeds();

Old: public CutRuleFactory factory;
New: public ACCutRuleFactory factory;

Old: public constructor(Snapper z, double targetL, ACZone zone, ConveyorBedSequencer seqr=null, CutRuleFactory factory=null, str{} keepIntact=null) {
New: public constructor(Snapper z, double targetL, ACZone zone, ACConveyorBedSequencer seqr=null, ACCutRuleFactory factory=null, str{} keepIntact=null) {
}


public class UnitClass {
Old: public constructor(UnitClass c) {
New: public constructor(ACUnitClass c) {

Old: final public UnitClass operator+(UnitClass c) {
New: final public ACUnitClass operator+(ACUnitClass c) {

Old: final public UnitClass operator-(UnitClass c) {
New: final public ACUnitClass operator-(ACUnitClass c) {

Old: final public UnitClass operator=(UnitClass c) {
New: final public ACUnitClass operator=(ACUnitClass c) {

Old: extend public bool same(UnitClass c) {
New: extend public bool same(ACUnitClass c) {
}

Functions:

Old: public ConveyorGenericPartColumn acGenericPartColumn(str attr) {
New: public ACConveyorGenericPartColumn acGenericPartColumn(str attr) {


Old: public ConveyorBed[] convSortedBedComponents(Snapper z) {
New: public ACConveyorBed[] convSortedBedComponents(Snapper z) {


Old: public SubSet acCalcZone2DLengthDomain(Snapper z, ConveyorBedSequencer sqr=null, double step=5mm) {
New: public SubSet acCalcZone2DLengthDomain(Snapper z, ACConveyorBedSequencer sqr=null, double step=5mm) {


Old: public bool acIncorrectElevCh(double length, ConveyorStraightBed bed) {
New: public bool acIncorrectElevCh(double length, ACConveyorStraightBed bed) {

Enums:

The enum absConveyourTransDir has been renamed to acConveyorTransDir.

Globals:

OldNew
absSuperRollerRefinementacSuperRollerRefinement
absHighRollerRefinementacHighRollerRefinement
absMediumRollerRefinementacMediumRollerRefinement
cAcElevPKcACElevPK
cAcLengthPKcACLengthPK
cAcLength2DPKcACLength2DPK
cAcBFPKcACBFPK
cAcEndElevPKcACEndElevPK
cBeforeBedRemovecACBeforeBedRemove
cBedRemovedcACBedRemoved
cBedAppendedcACBedAppended
cBedInsertedcACBedInserted
cBedPosChangedcACBedPosChanged
cBedLengthChangedcACBedLengthChanged
cBedElevationChangecACBedElevationChange
cAcConvBFChangecACConvBFChange
cConvBedSequencerKeycACConvBedSequencerKey
absConvChargeRuleacConvChargeRule
absConvDischargeRuleacConvDischargeRule
absConvEndRuleacConvEndRule
absConvWedgeRuleacConvWedgeRule
absConvCenterLineRuleacConvCenterLineRule
absConvSideRuleacConvSideRule
absConvSupportRuleacConvSupportRule
absConvTransferRuleacConvTransferRule
absConvCenterLineTransferRuleacConvCenterLineTransferRule

For the connect rule globals modified above, we did not change the connect rule IDs.

Catalog-excel compilation changes

The class ACCatalogDialog has been removed as it was a work-in-progress dialog, and has been replaced with ACLocalCatalogCreatorDialog that has a design UI design.

Updated interface for function Url[] acUserCompileEssentialCatalog(Window parent, Url url=null, bool singleUnit=false, bool recurseDir=false) with a new Class fileOpClass=null argument.

Old:
public Url[] acUserCompileEssentialCatalog(Window parent, Url url=null, bool singleUnit=false, bool recurseDir=false)

New:
public Url[] acUserCompileEssentialCatalog(Window parent, Url url=null, bool singleUnit=false, bool recurseDir=false, Class fileOpClass=null)

Side accessory connectors

The connect rule absConvSideAccessoryRule has been removed and replaced with acConvSideAccessoryRule.

Old: absMhLibConvSideSnapRule = makeConnectRule("absMhLibConvSideSnapRule", ACConveyorSideChannelCT, null, pkg=(#"cm.abstract.mhLibrary"));
Replaced: acConvSideAccessoryRule = makeConnectRule("absConvSideAccessoryRule", ACConveyorSideChannelCT, null);

cm.abstract.dataSymInterface

class DsiPData

The following method is modified, as getting matching External References with matching E-KEY from a single option is no longer accurate.

Old: extend public ExternalRefType[] optionExternalsFromExtKeys(Option option, str{} usageTypes=null) {
New: extend public <ExternalRefType, str>[] optionExternalsFromExtKeys(str{} usageTypes=null) {

The following method is renamed:

Old: extend public Bool dbg_forceDsApplyLogic() {
New: extend public Bool forceDsApplyLogic() {

class DsiApplyConstraintsEnv

The following field and method in DsiApplyConstraintsEnv is removed as they are no longer used:

// Field
Removed: public str[] syncGroupIds;

// method
Removed: final public void appendSyncGroupId(str id) {

Changes to DataObj class uniqueKey

In 17.0 Minor, a new method collectExportUniqueKey() was added as part of the improvements to catalogue DB3 format saving. The main intentions were to :

  • Collect uniqueKeys more efficiently and reduce memory usage.
  • Generate a shorter and more accurate unique string identifier for DataObj. These changes has improved performance during the DB3 saving process.

However, this resulted in two different unique key implementations for each DataObj subclass. Hence, we are consolidating both methods into a single source of truth.

When is migration required?

Migration is required if you have a custom DataObj subclass (e.g., DsPData) that overrides the uniqueKey() method. The migration steps are:

  • Move the uniqueKey generation logic from uniqueKey() to writeUniqueKey().
  • Respect the includeClassId flag if the class is part of the unique key. It is recommended to use class.id as it is usually shorter than class.name or class.toS.
  • Remove the uniqueKey() method from the class as it is no longer overridable.

Important note: Do not call uniqueKey() within writeUniqueKey() directly/indirectly and vice versa, as this will result in recursion.

If you encounter a compile error related to uniqueKey() calls, add the following use statement to package.cm.

use cm.abstract.dataSymInterface.catalog;

Interface changes related to uniqueKey

The following field in DsTableDataG2 class is renamed due to ambiguous naming:

Old: public str uniqueKey;
New: public str tableUniqueKey;

collectExportUniqueKey() in DataObj has been renamed to writeUniqueKey(), and is now an abstract method.

Old: extend public void collectExportUniqueKey(StrBuf b, bool includeClassId=true) { }
New: extend public void writeUniqueKey(StrBuf b, bool includeClassId=true) : abstract { }

For DataObj class and its subclasses:

  • collectExportUniqueKey() is now renamed to writeUniqueKey().
  • uniqueKey() is no longer abstract and is now final. It always generates and returns the unique key using writeUniqueKey().
  • uniqueKey() method is removed in all DataObj subclasses
Old: extend public str uniqueKey() : null="null", abstract {
New: final public str uniqueKey() : null="null" {

// In cm/abstract/dataSymInterface/catalog/dataObj.cm:

    /**
     * Unique key.
     * A unique key is used to uniquely identify this object from other objects.
     * 
     * (It's known to be used to prevent duplicate append to SQLite databases)
     */
    final public str uniqueKey() : null="null" {
		static StrBuf buf();
		buf.clear();
		writeUniqueKey(buf);
		return buf.toS();
    }


// cm.abstract.dataSymInterface.catalog
public class DsiAddProductRefType extends DsBaseCodeType {
public class DsAliasType extends DsBaseCodeType : unstreamable {
public class ApplicationAreaType extends DsBaseCodeType : unstreamable {
public class DsBaseCodeType extends DataObj : abstract {
public class DsBaseExternalRefType extends DsBaseCodeType : abstract {
public class DsBaseNameType extends DsBaseCodeType {
public class DsCardConfig extends DsBaseCodeType : unstreamable {
public class DsClassificationRefType extends DsBaseCodeType {
public class DsClassificationType extends DsBaseCodeType : unstreamable {
public class DsConnectorType extends DsBaseCodeType : unstreamable {
public class DsConnectorRefType extends DataObj : unstreamable {
public class DsConstraintTable extends DsBaseTableG2 {
public class DsCustomOptionType extends DsBaseCodeType {
public class DsCustomInquiryType extends DsBaseCodeType {
public class DsCustomProdDataTable extends DsBaseTableG2 {
public class DsCustomTable extends DsBaseTableG2 {
public class DsVersionPolicy extends DataObj : unstreamable {
public class DsWire extends DsBaseCodeType {
public class DsExternalRefKeyType extends DataObj : inherit constructors {
public class ExternalRefType extends DataObj : unstreamable {
public class PrdExternalRefType extends ExternalRefType {
public class OptExternalRefType extends ExternalRefType {
public class DsiFeatureRefType extends DsBaseCodeType {
public class SFeature extends DsProductType : unstreamable {
public class DsiLayoutDomainType extends DataObj {
public class DsiLayoutType extends DsProductType {
public class DsLeadTimeProgramType extends DsBaseCodeType : unstreamable {
public class MaterialQtyType extends DataObj : unstreamable {
public class SMaterial extends DsBaseExternalRefType : unstreamable {
public class DsMeasureParamType extends DsBaseExternalRefType {
public class MeasurementType extends DataObj : unstreamable {
public class MtrlApplication extends DataObj : unstreamable {
public class NamedPoint extends DataObj {
public class DsNoteType extends DataObj {
public class OFDAHeaderData extends DsBaseNameType : unstreamable {
public class OFDAHeaderData extends DsBaseNameType : unstreamable {
public class DsiCodeRangeType extends DataObj {
public class DsiOptionRangeType extends DsBaseCodeType {
public class Option extends DsProductType : unstreamable {
public class PlacementOriginType extends DataObj : unstreamable {
public class PlacementType extends DataObj : unstreamable {
public class PriceTypeSeq extends DataObj : unstreamable {
public class PriceType extends DataObj : unstreamable {
public class PricelistType extends DsBaseCodeType : unstreamable {
public class ProductCatalog extends DsBaseNameType : unstreamable {
public class ProductLevel extends DsBaseExternalRefType : unstreamable {
public class DsProductType extends DsBaseExternalRefType : unstreamable {
public class DsiRangeType extends DsBaseCodeType {
public class DsRuleType extends DsBaseCodeType {
public class DsSectionConfig extends DsBaseCodeType : unstreamable {
public class DsTableDataG2 extends DataObj {
public class DsTableType extends DsBaseCodeType {
public class DsTableHeadType extends DataObj {
public class DsTableRowType extends DataObj {
public class UsageType extends DataObj : unstreamable {
public class VersionType extends DataObj : unstreamable {

// cm.abstract.dataSymInterface
public class DataCatalog extends DataObj : unstreamable {
public class DataCatalogs extends DataObj : unstreamable {
public class DsiPData extends DataObj {
public class DsiPDataOption extends DataObj {
package class DsiPDataCustomOption extends DataObj : abstract {

// cm.abstract.dataSymbol.ui.libraryBuilder
public class DsCustomLibrary extends DataObj : unstreamable {
public class DsLibBuildDataObjSeq extends DataObj {
package class DsCustomLibraryType extends DsLibBuildDataObj : unstreamable {
public class DsLibNewLDataObj extends DsLibBuildDataObj {
public class DsLibBuildShrinkType extends DsCustomLibraryType {
public class DsLibBuildMultiMemBtnType extends DsLibBuildDataObj {
public class DsLibBuildMemBtnType extends DsLibBuildDataObj {
public class DsLibDisplayType extends DsLibBuildDataObj {
public class DsLibImageDisplayType extends DsLibBuildDataObj {
public class DsLibDataCatalogType extends DsLibBuildDataObj {
public class DsSymbolInfo extends DataObj {
public class DsLibraryData extends DataObj : unstreamable {
public class DsLibrarySearchData extends DataObj : unstreamable {
package class DsLibraryFavLibData extends DataObj : unstreamable {

// cm.abstract.materialHandling.data
public class MhPData extends DsPData : replacing load {

The following debug flag is removed as it is no longer relevant after the uniqueKey changes:

In cm/abstract/dataSymInterface/database/dsSqlExport.cm:

Removed: public bool dsiOptimizeDb3Export() {
Removed: public void dsiSetOptimizeDb3Export(bool v) {

Remove uninstalled catalogs

The following interface changes have been made to facilitate the functionality to remove related catalog files when an extension is uninstalled.

cm.abstract.dataSymInterface.registerCatalogs.cm

Old: public void extensionRegCatDB3File(int cid, str dbFileName, str catCode,
					function(Object o) completeCB=null,
					function(Object o) outOfDateCB=null) {
New: public void extensionRegCatDB3File(int cid, str dbFileName, str catCode,
					function(Object o) completeCB=null,
					function(Object o) outOfDateCB=null,
					symbol sourcePkg=#:package : caller eval) {
Old: public void dsiRegisterEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null, bool offlineTurnOnAll=false) {
New: public void dsiRegisterEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null, bool offlineTurnOnAll=false, symbol sourcePkg=#:package : caller eval) {
Old: public void dsiRegisterEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null,
					    bool offlineTurnOnAll=false, bool ignoreSyncCycle=false) {
New: public void dsiRegisterEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null,
					    bool offlineTurnOnAll=false, bool ignoreSyncCycle=false,
					    symbol sourcePkg=#:package : caller eval) {

Also some interfaces were updated in the cm.abstract.dataSymbol and cm.extension packages as part of this change. Please refer to the documentation for those changes as well.

Performance improvement for loading db3 files in catalog creator

We have updated the sql import functionality in catalog creator to leverage more caching to improve load performance.

The following interfaces have changed to facilitate this.

class DataCatalogDBWrapper

Old: extend public void recreateCollection(DataObj oh, int ownerID, Field f) {
New: extend public void recreateCollection(DataObj oh, int ownerID, Field f, str[] bufList) {
Old: extend public void recreateUnaryColl(UnaryCollection coll, Field f, DataObj oh, str refTable, int ownerID) {
New: extend public void recreateUnaryColl(UnaryCollection coll, Field f, DataObj oh, str refTable, int ownerID, str[] bufList) {
Old: extend public void recreateMap(BinaryCollection m, Field f, DataObj oh, str refTable, int ownerID) {
New: extend public void recreateMap(BinaryCollection m, Field f, DataObj oh, str refTable, int ownerID, str[] bufList) {

cm.abstract.dataSymbol

Part Measurements and Generic Codes

DsPrdMeasurementColumn now stores its measurement type as a string:

Old: public dsMeasurementType mType
Old: public str mTypeS
New: public str mType

Replace mTypeS reads with mType. Code that requires dsMeasurementType should convert the string with dsiStrToDsMeasurementTypeEnum().

Both constructors have a new optional package argument:

Old: public constructor(str mType)
New: public constructor(str mType, symbol pkg=null)

Old: public constructor(dsMeasurementType mType)
New: public constructor(dsMeasurementType mType, symbol pkg=null)

Added: public double dsUnitConvertFactor(distanceUnit distUnit, str mTypeS)

class DsPData

The following methods have been removed in DsPData class as they were deprecated or no longer in use.

Removed: public str->(str->(< double, double>)) propagateStretchInfo: copy=null, stream=null, deprecated;

Removed: public void postApplyConstraints(DsiApplyConstraintsEnv env) {
Removed: extend public void verifySyncGroupContainer(): deprecated {
Removed: extend public void specOption(DsSpecOption[] sOptions, Space space, Option o, DsPDataOption pDataOption, int level, bool choosableInCalculation) {
Removed: extend public bool trySetDsProp(Snapper snapper, SetSnapperPropertyEnv env) {
Removed: public str graphicalSpecialCacheKey(Object obj) {
Removed: extend public void generateAdditionalOptionRows(DsiPDataOption dataOpt|, DsPart part, SifEnv env, Space space, bool recurse=true) : deprecated {
Removed: extend public void generateOptionalNoOptionRows(SifEnv env, SFeature f, DsiPDataOption selOpt) {
Removed: extend public void generateOptionalSelOptionRows(SifEnv env, SFeature f, DsiPDataOption selOpt) : deprecated {
Removed: final public void generateSifOptionRows(SifEnv env, Option o, DsiPDataOption pO, int level=0) : deprecated {
Removed: extend public void clearPropagateStretchInfo() : deprecated {
Removed: extend public void updatePropagateStretchValue(str key, str stretchMeasureParam, double length, double delta) : deprecated {
Removed: extend public double propagateStretchValue(str key, str stretchMeasureParam) : deprecated {
Removed: extend public bool symStretch(SymHandle handle, PreCorePropObj owner, str measParam, bool stretchEP, point p, AnimationMouseInfo mi) {
Removed: extend public void apply(DsPData data) {

The following method has been renamed in DsPData class as part of the constraint changes in 17.5.

Modified:
Old: public Bool dbg_forceDsApplyLogic() {
New: public Bool forceDsApplyLogic() {

class DataSymbol

The following methods have been removed in DataSymbol class as they were deprecated or no longer in use. The method completeBuild() is now replaced by buildConnectors().

Removed: extend package DsConnector[] nodeConnectors() {
Removed: extend public bool nodeConnectorExists(point pos) {
Removed: extend public bool completeBuild(bool defaultMats=true) {

Some connector-related interfaces are now changed to public. Certain unused method arguments are also removed.

Old: extend public void buildConnectors(point{} pos, bool updateSpace) {
New: extend public void buildConnectors(bool updateSpace) {

Old: extend public void buildConnectors(point{} pos) {
New: extend public void buildConnectors() {

Remove uninstalled catalogs

The following interface changes have been made to facilitate the functionality to remove related catalog files when an extension is uninstalled.

cm.abstract.dataSymbol.registerCatalogs.cm

Old: public void registerDsEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null) {
New: public void registerDsEmbeddedCatalog(int cid, str dbFile, str{} offlinePrdCatalogs=null, symbol sourcePkg=#:package : caller eval) {

Also some interfaces were updated in the cm.abstract.dataSymInterface and cm.extension packages as part of this change. Please refer to the documentation for those changes as well.

cm.abstract.draw

The following legacy classes have been removed. We recommend migrating to one of the more recent measure animation classes such as CoreStraitDrawMeasureInsertAnimation, ChainDrawInsertAnimation or ChainDrawInsertAnimationStart.

If migration is not feasible, you will need to maintain your own local copies of the removed classes.

Removed: class CoreMeasureLineInsertAnimation
Removed: class CoreMeasureLineInsertAnimationLast
Removed: class CoreMeasureLineInsertAnimationStart
Removed: class CoreMeasureLineInsertVessel
Removed: class DrawChainMeasureInsertAnimation
Removed: class SingleChainDimInsertAnimation

class DrawMeasure

The forcedAngle parameter of the following methods has changed from Angle to Orientation. Existing calls that pass an angle value (for example, 5deg) still work: it is converted to an orientation around yaw. Update overrides, typed function references, and callers that need pitch or roll to use Orientation.

Old: extend public void setSpaceP0(point p, Angle forcedAngle=null, bool updateD=true) {
New: extend public void setSpaceP0(point p, Orientation forcedAngle=null, bool updateD=true) {
Old: extend public void setSpaceP1(point p, Angle forcedAngle=null) {
New: extend public void setSpaceP1(point p, Orientation forcedAngle=null) {

cm.abstract.materialHandling

MhPopupToolbarModelItem moved to core

The following classes have been moved from cm.abstract.materialHandling.ui to cm.core and have been renamed.

Old: MhPopupToolbarModelItem
New: PopupToolbarModelItem

Old: MhMultiTogglePopupInfo
New: MultiTogglePopupInfo

Old: MhMultiTogglePopup
New: MultiTogglePopupWindow

Old: MhMultiTogglePopupToolbarModelItem
New: MultiTogglePopupToolbarModelItem

Additionally, there have been several interface changes made to the classes within the class hierarchy. PopupToolbarModelItem has had any fields and logic related to on/off images moved down to the child class MhMultiTogglePopupToolbarModelItem. It is also no longer an abstract class.

Old:
public class MhPopupToolbarModelItem extends ToolbarModelItem : abstract {


New:
public class PopupToolbarModelItem extends ToolbarModelItem {
    Removed: private Image _onImage : copy=reference, public readable;
    Removed: private Image _offImage : copy=reference, public readable;


Old:
    extend public void showPopup(ContextualViewToolbarModel model) : abstract { }
New:
    extend public void showPopup(ContextualViewToolbarModel model) { }


Removed:
    extend public void syncImageToState(ContextualViewToolbarModel model) { }


Removed:
    extend public Image onImage() {


Removed:
    extend public Image offImage() {
}


public class MultiTogglePopupToolbarModelItem extends PopupToolbarModelItem {
    Added: private Image _onImage : copy=reference, public readable;
    Added: private Image _offImage : copy=reference, public readable;


    Old: public function(ToolbarModelItem, ContextualViewToolbarModel):MhMultiTogglePopupInfo[] infosCallback;
    New: public function(ToolbarModelItem, ContextualViewToolbarModel):MultiTogglePopupInfo[] infosCallback;


Added:
    extend public void syncImageToState(ContextualViewToolbarModel model) {


Added:
    final public Image onImage() {
    extend public Image defaultOnImage() {


Added:
    extend public Image offImage() {
    extend public Image defaultOffImage() {
}

MultiTogglePopup has had an unused constructor removed.

public class MultiTogglePopup extends Control {

Removed:
    public constructor(Window parent,
                       MhMultiTogglePopupInfo[] infos |, 
                       // Inherited arguments.
                       Font font=controlFont,
                       Brush brush=whiteBrush,
                       FrameStyle frameStyle=noFrame,
                       frame3DState frameState=frameStateDown,
                       pointI origin=(0, 0),
                       bool selectable=true,
                       pointI pos=(0, 0),
                       sizeI size=(0, 0),
                       pointI margins=(0, 0),
                       alignment align=middle,
                       ControlGroup group=null,
                       bool popup=true,
                       bool shadow=true,
                       str key=null,
                       SrcRef src=#:src) {
}


Replace with:
    public constructor(Window parent,
                       MultiTogglePopupInfo[] infos,
                       MultiTogglePopupToolbarModelItem item |, 
                       // Inherited arguments.
                       Font font=controlFont,
                       Brush brush=whiteBrush,
                       FrameStyle frameStyle=noFrame,
                       frame3DState frameState=frameStateDown,
                       pointI origin=(0, 0),
                       bool selectable=true,
                       pointI pos=(0, 0),
                       sizeI size=(0, 0),
                       pointI margins=(0, 0),
                       alignment align=middle,
                       ControlGroup group=null,
                       bool popup=true,
                       bool shadow=true,
                       str key=null,
                       SrcRef src=#:src) {

MhStorageConfiguration changes

Removed a duplicate UnitLoad unitLoad() method. Replace overrides to it with UnitLoad unitLoad(Object env=null) instead.

public class MhStorageConfiguration extends MhSystemConfiguration {

Removed:
    extend public UnitLoad unitLoad() {
        return getValue(cMhUnitLoadPK).?UnitLoad;
    }


Replace with:
    extend public UnitLoad unitLoad(Object env=null) {
        UnitLoad res = getValue(cMhUnitLoadPK, env=env).?UnitLoad;
        if (res) return res;

        for (compType in orderedCompartmentTypes()) {
            if (UnitLoad ul = compType.compProps.unitLoad) {
                return ul;
            }
        }

        return null;
    }
}

MhShelvingBayAdoptionBehavior changes

Updated interface for bool validLevelPosition(point2D levelPos) with a new Snapper owner argument.

public class MhShelvingBayAdoptionBehavior extends MhAdoptionBehavior {

Old:
    extend public bool validLevelPosition(point2D levelPos) {
New:
    extend public bool validLevelPosition(Snapper owner, point2D levelPos) {
}

MhSystemExportFunction changes

Updated interface for bool exportFailed(MhEngineEntry entry, box exportedBound) with a new StrBuf error=null argument.

public class MhSystemExportFunction extends MhSystemEngineFunction {

Old:
    public bool exportFailed(MhEngineEntry entry, box exportedBound) {
New:
    public bool exportFailed(MhEngineEntry entry, box exportedBound, StrBuf error=null) {
}

Unit load population changes

Changes have been made to support modifying the population direction of unit loads. MhUnitLoadConstructionalPopulateFunction has a new field Point populateOffset that can be passed in as an argument, using this field value in vector populateVector() if there is any. This field previously existed in the subclass MhDeepstorageUnitLoadConstructionalPopulateFunction but has now been moved here.

Point unitLoadPopulateVector is also a new field in MhEngineLevelConstructionEntryInfo so each level can have a different direction. MhLevelConstructionalPopulateFunction has been updated to check for this value of each level entry info and pass it into "unitLoadConstruction".

Multi-racking framework changes

In 17.0 Minor we added a new package cm.abstract.materialHandling.storage.multi that is meant to contain most of the code related to the multi-racking framework that utilizes multi-bays and multi-frames. In 17.5 Major we are further expanding on the framework as well as moving multi-racking related code from other packages into the multi package. This section mainly cover interface changes made to improve the multi-racking framework. For new features related to this, see the "Multi-racking framework changes" section in the New Features pages.

1. Moved code

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

Behaviors:
MhMultiBayEngineBehavior
MhMultiBayStretchEngineBehavior
MhMultiSplitRowAnimationEngineBehavior

Engine:
MhMultiEntryArrangeFunction
MhMultiEntryUpdateShapeFunction
MhMultiEntryUpdateClassificationFunction

2. Engine functions changes

The following engine function keys have been modified. If you have implemented multi-racking, ensure you search your codebase for the following old keys and replace them.

Old: multiBayPopulate
New: multiBayConstruction
Now associated with class MhMultiBayConstructionalPopulateFunction

Old: frameConstruction
New: multiFrameConstruction
Now associated with class MhMultiFrameConstructionalPopulateFunction

MhMultiBayConstructionFunction has been renamed to MhMultiBayConstructionalPopulateFunction.

MhMultiBayConstructionalFunction has been removed. It is to be replaced with MhMultiBayConstructionalPopulateFunction.

MhMultiFrameConstructionFunction has been renamed to MhMultiFrameConstructionalPopulateFunction.

MhMultiFrameConstructionalFunction has been removed. It is to be replaced with MhMultiFrameConstructionalPopulateFunction.

Removed method in MhMultiFrameEntryConstructionArrangement double calculateSpacerZSpacing(MhSpacingItem spacingItem). This logic is now handled in MhSpacingItem method double calcZSpacing(double frameHeight).

3. Other changes

For MhMultiRowConfiguration, the implementation of calcDepthFromAisles(MhRowAnimationInfo info, int numAisles) has been moved into the method that was calling it, calcWidthFromAisles(MhRowAnimationInfo info, int numAisles).

public class MhMultiRowConfiguration extends MhStorageRowConfiguration {

Removed:
    extend public double calcDepthFromAisles(MhRowAnimationInfo info, int numAisles) {


Updated:
    public double calcWidthFromAisles(MhRowAnimationInfo info, int numAisles) {
        // need to reset from previous time rowLayout.current was used
        rowLayout.current = 0;

        double aisleW = info.aisleWidth;
        if (aisleW == 0) aisleW = aisleWidth().safeDouble;

        double firstRowDepth = rowDepth(rowLayout, first=true);
        double lastRowDepth = rowDepth(rowLayout, last=true);
        double overhang = rearOverhang().safeDouble;
        double systemD = (aisleW + firstRowDepth + lastRowDepth +
                          info.offsetLeft + info.offsetRight + overhang*2);

        if (numAisles > 1) {
            double middleRowDepth = rowDepth(rowLayout, middle=true);
            for (x in 1..numAisles - 1) {
                systemD += aisleW;
                systemD += middleRowDepth;
            }
        }

        return systemD + 0.01;
    }
}

MhSpacingItem has a new argument for its constructor used to set the frame spacer count.

public class MhSpacingItem extends MhFramelinePatternItem {

Old:
    public constructor(MhSystemConfiguration config, Double d=null) {
        ...
        frameSpacerCount = config.getValue(translateKey(cMhFrameSpacerCountPK)).?int;
    }


New:
    public constructor(MhSystemConfiguration config, Double d=null, Int spacerCount=null) {
        ...
        if (spacerCount) frameSpacerCount = spacerCount.v;
        else frameSpacerCount = config.getValue(translateKey(cMhFrameSpacerCountPK)).?int;
    }
}

Multi-bays are now also intended to hold the "bottom level" (level at z=0) to allow for unit load insertion on the floor. We updated bay config logic to work better with this. In bay config behavior, reduced the cases where false is returned for shouldPutConfigToManager. Previously for a child-bay, as long as the parent multi-bay had a level child it would not put the child-bay config into the manager. We have omitted the case where the parent multi-bay has a bottom level with no unit loads so child-bays will still be config owners for this case.

public class MhBayConfigBehavior extends MhStorageConfigBehavior {

Old:
    public bool shouldPutConfigToManager(MhSnapper z) {
        ?MhSnapper parent = z.parent;
        while (parent) {
            if (parent.getChildren(levelFilter).any) return false;
            ?parent = parent.parent;
        }
        if (!z.getChildren(levelFilter).any) return false;
        return super(..);
    }

New:
    public bool shouldPutConfigToManager(MhSnapper z) {
        // Check if parent has level (false if yes).
        ?MhSnapper parent = z.parent;
        while (parent) {
            Snapper{} children = parent.getChildren(levelFilter);
            for (child in children) {
                if (child.isBottom) { // If parent has bottom level with loads.
                    if (child as MhSnapper) {
                        if (child.snapperInfos.any or child.getChildren().any) {
                            return false;
                        }
                    }
                } else { // If parent has any other (non-bottom) level.
                    return false;
                }
            }
            ?parent = parent.parent;
        }

        // Check if bay has levels (false if no).
        if (!z.getChildren(levelFilter).any) {
            return false;
        }
        return super(..);
    }
}

Engine function key update

A typo has been fixed in a function key. If using the key systemColumGrouping in your codebase, ensure this is updated to systemColumnGrouping.

Old: systemColumGrouping
New: systemColumnGrouping

MhBayShape changes

Removed method void appendLevelBracketPrimitives(CollisionPrimitive{} prims, Transform t=null).

public class MhBayShape extends MhBoxSnapperShape {

Old:
    public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env) {
        ...
        appendLevelBracketPrimitives(geos, env.?transform);
        appendTopApproachPrimitives(geos, env);
        return set;
    }

New:
    public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env) {
        ...
        appendTopApproachPrimitives(geos, env);
        return set;
    }


Removed:
    extend public void appendLevelBracketPrimitives(CollisionPrimitive{} prims, Transform t=null) { // FIXME 17.5 remove
        /* CUT THIS OUT  Thu Apr 30 13:29:18 2026 /kenng
        // Dont let the level brackets go past first hole
        Layer bracketLayer = geometryLayer(owner, sLevelBracket);
        box bracketBound(rect(point2D0, w, d).grown(0.01), 0, holeStartZ - holePitch/2);
        CollisionPrimitive bracketPrim = mhGetBoxCollisionPrimitive(bracketBound, bracketLayer, t);
        prims <<? bracketPrim;//mhInstanceCollisionPrim(bracketPrim, null);
        * CUT THIS OUT /kenng */
    }
}

MhRowShape changes

Removed method bool buildRowEntryLayoutCheckExactMatch.

public class MhRowShape extends MhSnapperShape {

Removed:
    extend public bool buildRowEntryLayoutCheckExactMatch() {
        return false;
    }
}

MhBasePropsSchemeData changes

The class MhBasePropsSchemeData has been moved from cm.abstract.materialHandling.behavior to cm.abstract.materialHandling.storage.

Feature snapping changes

The class MhFSGridFeatureSearchSnapAlternative has been renamed to MhFeatureSearchSnapAlternative as it is no longer just used by MhFSGridRectInsertAnimationG2. It is now also used by MhRowInsertAnimation and MhRowInsertToolAnimationG2.

The class MhFSGridSpaceVolumeSnapperFilter has been renamed to MhActiveSpaceVolumeSnapperFilter.

These changes are to allow racking insert animation to feature snap to unmovable snappers as well as to set the animation's elevation to the feature points elevation.

Old: public class MhFSGridFeatureSearchSnapAlternative extends FeatureSearchSnapAlternative {
New: MhFeatureSearchSnapAlternative

Old: public class MhFSGridSpaceVolumeSnapperFilter extends ActiveSpaceVolumeSnapperFilter {
New: public class MhActiveSpaceVolumeSnapperFilter extends ActiveSpaceVolumeSnapperFilter {

MhSnapperAbsMezzEngineEntry changes

Removed method void removeSnapper(AbsMezzEngineEnvironment env, Snapper{} removed, Space space) as it was a duplicate method of a base class. Replace with bool removeSnapper(AbsMezzEngineEnvironment env, Space space).

public class MhSnapperAbsMezzEngineEntry extends AbsMezzForeignEngineEntry {

Removed:
    extend public void removeSnapper(AbsMezzEngineEnvironment env,
                                     Snapper{} removed,
                                     Space space) {}
}

Configuration tooltip changes

There were two methods for generating property tooltips for configuration tabs so we have combined them. MhStorageConfigurationItem method str getToolTip(PropObj propertyOwner, str key) has been removed and MhSystemConfigurationItem method str toolTip(str key, PropObj owner) has been renamed to str getToolTip(str key, PropObj owner). You should be overriding str getToolTip(str key, PropObj owner) for tooltip implementations.

public class MhSystemConfigurationItem extends CoreObject {

Old:
    extend public str toolTip(str key, PropObj owner) {
        return null;
    }

New:
    extend public str getToolTip(str key, PropObj owner) {
        return null;
    }
}

public class MhStorageConfigurationItem extends MhSystemConfigurationItem {

Removed:
    extend public str getToolTip(PropObj propertyOwner, str key) {
        return toolTip(key, propertyOwner);
    }
}

Catalog-excel compilation changes

Updated interfaces in MhExcelCatalogFactory. The creation of ToC and population of features have been decoupled from the writing of db file. MhExcelCatalogFactory is also now an abstract class.

public class MhExcelCatalogFactory : abstract {

Old:
    extend public void process(bool showProgress=true,
                               str startingSheetName=null,
                               bool createToC=false,
                               StrBuf error=null) {
                    ...
                    populateCatalog();
                    createDb(createToC);
    }


New:
    extend public void process(bool showProgress=true,
                               str startingSheetName=null,
                               bool writeDb=true,
                               bool createToC=false,
                               StrBuf error=null) {
                    ...
                    populateCatalog();
                    populateFeatures();
                    cat.updateDependencies();
                    if (createToC) finalizeToC();
                    if (writeDb) createDb();
    }


Old:
    extend public void createDb(bool createToC=false) {


New:
    extend public void createDb() {
}

Debugging

We have consolidated most of the existing MH debug dialogs into a single dialog. Each of the old dialogs now exist as a window (tab) in the new Debug Dialog.

See "MH Debug tools revamp" in the New Features page for more info.

The following public interfaces have been modified.

Old: void showMhDebugDialog(Window parent=null)
New: void showMhDebugDialog(Window parent=null, str selectToolsCardKey=null)

Added: MhDebugDialog mhDebugDialog()

If showMhDebugDialog is passed in a selectToolsCardKey, it will open the dialog to that specific tab. Any existing code to open a specific debug dialog should be updated to use this function instead. For example, replace dbg_showDebugBehaviorsDialog() with showMhDebugDialog(selectToolsCardKey=cDbgBehaviorStoreKey).

These are the list of keys we use for the debug windows described below.

public const str cDbgEngineTrackerKey = "dbgEngineTracker";
public const str cDbgEngineVisualiserKey = "dbgEngineVisualiser";
public const str cDbgClassViewerKey = "dbgClassViewer";
public const str cDbgBehaviorStoreKey = "dbgBehaviorStore";
public const str cDbgConfigManagerTrackerKey = "dbgConfigManagerTracker";
public const str cDbgLinkedNeighborsKey = "dbgLinkedNeighbors";
public const str cDbgConfigurationsKey = "dbgConfigurations";
  1. Behavior Debug

The following public interfaces have been modified.

Old: class DebugBehaviorsDialog
New: class MhDebugBehaviorStoreWindow

Removed: void dbg_showDebugBehaviorsDialog()
Removed: void showDebugBehaviorsDialog(Window parent=null)

Added: MhDebugBehaviorStoreWindow mhDebugBehaviorStoreWindow()

The TreeView used to represent the behavior debug window has been revamped. The TreeViewItems now have a shared base class MhDebugObjectItem that has a field Object obj to contain a reference object for the item to have a reference to the relevant object, similar to the previous MyObjectItem. For behaviors, the referenced object will now be MhBehaviorController instead of the Behavior object and assortments will now be MhAssortmentController.

Old: class MyBehaviorGroupItem
New: class MhDebugBehaviorGroupItem

Old: class MyObjectItem
New: class MhDebugObjectItem

Old: class MySpawnerItem
New: class MhDebugObjectItem

Old: class MyBehaviorItem
New: class MhDebugBehaviorItem

Removed: class MyEngineFunctionItem
  1. Class Viewer

The previously named "Debug Functions/Behaviors" is now the Class Viewer tab of the Debug Dialog.

The following public interfaces have been modified.

Old: class MhDebugMaterialHandlingDialog
New: class MhDebugClassViewerWindow

Removed: void dbg_showDebugMaterialHandlingDialog()

Added: MhDebugClassViewerWindow mhDebugClassViewerWindow()
  1. Config Tracker

The config tracker was a private class that has now been made public.

The following public interfaces have been modified.

Old: private class MhConfigManagerTrackerDialog
New: public class MhDebugConfigManagerTrackerWindow

Old: MhConfigManagerTrackerDialog mhConfigManagerTrackerWindow 
New: MhDebugConfigManagerTrackerWindow mhDebugConfigManagerTrackerWindow()

Removed: void showConfigManagerTracker()
  1. Configurations

Previously the Debug Configurations dialog had public interfaces to open it but was never added to the debug library. It is now a tab in the Debug Dialog.

The following public interfaces have been modified.

Old: class DebugConfigurationsDialog
New: class MhDebugConfigurationWindow

Old: class MyConfigurationGroupItem
New: class MhDebugConfigurationGroupItem

Old: class MyConfigurationItem
New: class MhDebugConfigurationItem

Removed: void dbg_showDebugConfigurationsDialog()
Removed: void showDebugConfigurationsDialog(Window parent=null)

Added: MhDebugConfigurationWindow mhDebugConfigurationWindow()
  1. Engine Tracker

This has been moved from cm.abstract.materialHandling.engine to cm.abstract.materialHandling.debug.

The following public interfaces have been modified.

Old: class MhEngineTrackerWindow
New: class MhDebugEngineTrackerWindow

Old: void updateEngineTrackers()
New: void mhDebugUpdateEngineTrackers(str event)

Removed: void showEngineTracker()

Added: str->MhDebugEngineFunctionTracker dbgEngineFunctionTrackers()
Added: void dbgRegisterEngineFunctionTracker(MhDebugEngineFunctionTracker eft)
Added: void dbgUnregisterEngineFunctionTracker(str key)
Added: MhDebugEngineTrackerWindow mhDebugEngineTrackerWindow

Old: class MhEngineFunctionTracker
New: class MhDebugEngineFunctionTracker
  1. Engine Visualiser

This has been moved from cm.abstract.materialHandling.engine to cm.abstract.materialHandling.debug.

The engine visualiser was a private class that has now been made public.

The following public interfaces have been modified.

Old: private class EngineVisualiserDialog
New: public class MhDebugEngineVisualiserWindow

Removed: void showEngineVisualiser()
Removed: void showEngineVisualiserFunctionSelectorWindow()

Old: void updateEngineVisualiser()
New: void updateEngineVisualiser(str event)

Old: DebugCollisionPrimitiveVisualizer
New: MhDebugCollisionPrimitiveVisualizer

Removed: MhEngineVisPopulatorData dbg_getPopulatorData()
Removed: void dbg_resetPopulatorData()

For updating populator data to be displayed in the visualiser, we no longer use dbg_getPopulatorData() and dbg_resetPopulatorData(). Instead a new cache MhDebugEngineVisEngineFuncDataCache dbg_getEngineVisFuncDataCache() has been introduced and this cache now holds the populator data. Use the below interfaces instead. This cache is also intended to hold other data related to engine functions for visualisation purposes, currently the other type of data being entries that failed to export.

Added: MhDebugEngineVisEngineFuncDataCache dbg_getEngineVisFuncDataCache()

Added: void dbg_resetEnginVisFuncDataCache()

Added:
public class MhDebugEngineVisEngineFuncDataCache {

    extend public MhDebugEngineVisPopulatorData getPopulatorData(Vector direction=null) {
        if (direction) {
            if (!populatorData) {
                populatorData = MhDebugEngineVisPopulatorData(direction.v);
            } else if (populatorData.populatorDirection != direction.v) {
                populatorData.populatorDirection = direction.v;
                populatorData.steps.?clear();
            }
        }
        return populatorData;
    }


    extend public void appendPopulatorData(Vector direction, MhDebugEngineVisStepData stepData) {
        getPopulatorData(direction).add(stepData);
    }
}
  1. Linked Neighbors

The global dbg_snapperLinks to enable snapper link 3D graphics drawn by the MhDebugLinksBehavior is now toggled whenever you open or close the Debug Dialog.

The following public interfaces have been modified.

Old: class DebugLinkDialog
New: class MhDebugLinkWindow

Removed: void dbg_showDebugLinkDialog()

Removed: void showDebugLinkDialog(Window parent=null)

Added: MhDebugLinkWindow mhDebugLinkWindow()

Old: class MyObjectItem
New: class MhDebugLinkItem

Aside from the new debug dialog, there are some other interface changes reltaed to debugging.

Removed global bool dbg_statelessCollCache and replaced with bool _spawnerBehaviorCollCacheEnabled. This is now exposed to the debug library toolbox as the toggle "Enable Spawner Behavior Collection Cache".

Removed: bool dbg_statelessCollCache
Added: bool mhSpawnerBehaviorCollCacheEnabled()
Added: bool mhEnableSpawnerBehaviorCollCache(bool v)

cm.abstract.mezzanine

AbsMezzEngineEntry changes

The function bool removeSnapper(AbsMezzEngineEnvironment env, Space space) has been moved from subclass AbsMezzConstructionEngineEntry to base class AbsMezzEngineEntry.

public class AbsMezzEngineEntry {

Added:
    extend public bool removeSnapper(AbsMezzEngineEnvironment env,
                                     Space space) {
        return false;
    }
}

AbsMezzStructureLinesGenerator changes

Removed deprecated methods.

public class AbsMezzStructureLinesGenerator {

Removed:
    extend public bool shouldOnlyGenerateSecondary(AShape2D shape) {
        if (env.engineEntries.empty) return false;

        AShape2D sh = shape.toPolyline();
        RectConcat rc();
        for (e in env.engineEntries) if (e) rc << e.bound.transformed(-env.spaceTransform).rect;
        rect r = rc.bound;
        
        rect sb = sh.bound();
        return sb.coveredBy(r);
    }


Removed:
    final public void generateOuterLines(line[] res, AShape2D shape, angle dir, double extLength=0, double offset=0, double threshold=0) : inline {
        APolyline2D[] shapes = mezzToPolyline2D(shape);

        bool clockwise = shape.clockwise;
        for (sh in shapes) {
            if (first) clockwise = sh.clockwise;

            AShape2D osh = sh.mezzGrow(clockwise xor !sh.clockwise ? -offset : offset);
            AGeometry2D[] geos = osh.explode();
            line2D refLn = line2D((0, 0), dir, 1);

            //bool outline = clockwise == sh.clockwise;
            for (ALine2D g in geos) {
                line2D ln = g.v;
                if (ln.isParallel(refLn)) {
                    if (angle(ln.direction()) != dir) swap(ln.p0, ln.p1);
                    if (accepts(res, ln, threshold)) res << line(ln, 0);
                }
            }
        }
    }
}

Renamed constant

The constant cAbsMezzTransverse has been renamed to cMezzTransverse.

Removed class MezzXDistanceSnapperFilter

The class MezzXDistanceSnapperFilter has been removed.

cm.abstract.mhLibrary

class MhLibDataSymbol

The following method is modified followed by changes in DataSymbol class.

Old: public void buildConnectors(point{} pos, bool updateSpace) {
New: public void buildConnectors(bool updateSpace) {

Removed constant

Removed constant absMhLibConvSideSnapRule. Replace with acConvSideAccessoryRule from cm.abstract.conveyors.

cm.abstract.office

Extensible Type Elevation Merging

The change is additive, so most subclasses require no source updates. A subclass that already declares a member named collectMergers may now conflict with or override the inherited method. If the method is intended to customize merging, update it to the compatible signature:

extend public void collectMergers(TypeElevation{} mergers)

Otherwise, rename the existing member to avoid the inherited interface.

cm.abstract.part

Query Dialog Sidebar and Model Import

The part import window has been renamed and now derives from the tab-window API:

Old: public class ProdPartQueryImportWindow extends QueryImportWindow
New: public class QueryProdPartImportTabWindow extends QueryPartImportTabWindow

Update references and subclasses to use QueryProdPartImportTabWindow.

Part import customization has moved from ProdPartQueryDialogBehavior to the new QueryProdPartImportTabBehavior:

Added: public QueryProdPartImportTabBehavior prodPartImportTabBehavior()
Added: public class QueryProdPartImportTabBehavior extends QueryPartImportTabBehavior

Removed: public SubWindow initImportWindow(QueryDialog dialog, Url url=null) // from ProdPartQueryDialogBehavior
Added: public QueryPartImportTabBehavior queryPartImportTabBehavior() //  to ProdPartQueryDialogBehavior

Overrides of getImporterEnv(), beginGridDragAnimation(), or getValidDragRanges() must move to a QueryProdPartImportTabBehavior subclass. Return that behavior from an overridden ProdPartQueryDialogBehavior.queryPartImportTabBehavior().

Part Dimensions and Special Creation

The following physical-measurement methods are now defined on AbsPart:

Added: extend public double volume()
Added: extend public double depth()
Added: extend public double height()
Added: extend public double width()

These methods return meters and are distinct from the renamed Part.maxDepth() hierarchy method documented under cm.core.part.

ProdPartCreator has a new optional constructor argument and extension points:

Old: public constructor(PartData data, PartOption[] options=null)
New: public constructor(PartData data, PartOption[] options=null,
                        customizationType optionHandling=customizationType.none)

Added: public customizationType optionHandling
Added: extend public void processOverrideOptions(ProdPart part)
Added: extend public void processAdditionOptions(ProdPart part)
Added: extend public CustomOptionSpecial createCustomOptionSpecial(Part part, PartOptionItem opt)
Added: public bool containsAnySpecials(PropObj s)

ProdPartQueryDialogBehavior.queryPartImportTabBehavior() now requires a QueryDialog argument, matching the corresponding cm.core.part.query API.

cm.abstract.unitLoad

Unit load interface changes

Removed deprecated functions.

public color[] wongColorPallet() : deprecated {
    return wongColorPalette();
}


public color[] tolColorPallet() : deprecated {
    return tolMutedColorPalette();
}

Removed unused constant cMhJPPalletGroupKey. Replaced with cMhAPACPalletGroupKey.

Removed deprecated method in UnitLoad. Use str cacheKey3D(Object owner, FetchEnv3D env) instead.

public class UnitLoad extends CoreObject {

Removed:
    extend public Object[] cacheKey3DArgs(Object owner, FetchEnv3D env) : deprecated {
        Object[] args();
        args << env.detail;
        args << env.reason;
        //args << gid;
        for (k, v in getPropsWithAttribute(#gfx)) args << v;
        return args;
    }
}

Removed deprecated method in UnitLoadDialog. Use CoreObject{} getAffectedObjects(UnitLoad[] unitLoads) and bool usesLoad(CoreObject obj, UnitLoad[] unitLoads) instead.

public class UnitLoadDialog extends DialogWindow {

Removed:
    extend public CoreObject{} getAffectedObjects() : deprecated {
        return getAffectedObjects(null);

        /* CUT THIS OUT  Wed Oct 30 11:31:42 2024 /kenng
        CoreObject{} affected();
        for (s in mainWorld.?spaces) {
            forSnappersAndChildren (snapper in s) {
                if (!snapper.isSystemSnapper and snapper.isComponentSnapper) {
                    if (hasLoad(snapper)) affected << snapper;
                }
            }

            for (v in s.vessels) if (hasLoad(v)) affected << v;
        }
        
        return affected;
        * CUT THIS OUT /kenng */
    }

Removed:
    extend public bool hasLoad(CoreObject obj) : deprecated {
        return hasUnitLoad(obj);
    }
}

Removed deprecated method in UnitLoadPallet. use Primitive3D outerBoards3D(Object owner, FetchEnv3D env, double th) instead.

public class UnitLoadPallet extends UnitLoad {

Removed:
    extend public Primitive3D outerBoards3D(Object owner, FetchEnv3D env) : deprecated {
        return outerBoards3D(.., topBoardTh/2);
    }
}

cm.core

cm.core

Split-view Resource Label

The $twoViewsMenuLabel resource has been removed. Use $horizontalViewsMenuLabel or $verticalViewsMenuLabel according to the layout.

Removal of Legacy Contextual View-Switch Toolbar Models

Legacy 2D and 3D toolbar model classes were removed, and split-view switching now requires an explicit layout orientation.

cm.core.contextual2DViewToolbarModel

The following class has been removed as part of Removal of Legacy 2D and 3D Contextual View-Switch Toolbar Models effort:

Removed: public class ContextualMultiViewSettingsModel extends ViewSettingsToolbarModel
Removed: public class ContextualMultiPopupViewSettingsModel extends ViewSettingsToolbarModel
Removed: public class Contextual2DViewSettingsModel extends ViewSettingsToolbarModel

actualSwitchToSplitView() now requires the desired orientation:

Old: actualSwitchToSplitView()
New: actualSwitchToSplitView(multiViewState.horizontal); // 2D above 3D
New: actualSwitchToSplitView(multiViewState.vertical);   // 2D left of 3D

cm.core.contextual3DViewToolbarModel

The following class has been removed as part of Removal of Legacy 2D and 3D Contextual View-Switch Toolbar Models effort:

Removed: Contextual3DViewSettingsModel

View changes should instead be initiated through MultiViewArea.switchState(..) or actualSwitchToSplitView(..) as appropriate.

Split-View Orientation and Divider Interface Changes

Split-view enum values and divider fields were updated to support distinct horizontal and vertical layouts, while deprecated view states were removed.

cm.core.multiViewArea

Previously, the existing top/bottom layout was represented by multiViewState.vertical, which caused confusion about whether the name described the divider or the arrangement of the views. The naming has now been standardized and any code using multiViewState.vertical for the original top/bottom layout must be updated to multiViewState.horizontal. If the desired view state is left/right, then multiViewState.vertical should be used.

The existing split-view enum and divider field were renamed to identify them explicitly as horizontal-layout interfaces:

Old: drawingViewType.viewSplit
New: drawingViewType.viewHorizontalSplit

Old: MultiViewArea.dragDivider
New: MultiViewArea.horizontalDragDivider

Use the new drawingViewType.viewVerticalSplit value and MultiViewArea.verticalDragDivider field when working with the left/right layout.

The following deprecated multiViewState enum values have been removed and have no direct replacement:

Removed: multiViewState.verticalPaper2D
Removed: multiViewState.verticalPaper3D
Removed: multiViewState.vertical3D
Removed: multiViewState.horizontal3D

cm.core.spaceVolume

Combined functions of the name spaceVolumeUpdateObjects. Use the function spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter=null, bool undoable=true, Snapper{} visited=new Snapper{}, bool force=false) that has an additional SnapperFilter filter=null argument.

Old:
public void spaceVolumeUpdateObjects(Snapper z, vector u, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {
    spaceVolumeUpdateObjects(z, u, filter=null, undoable=undoable, visited=visited, force=force);

Old:
public void spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {

New:
public void spaceVolumeUpdateObjects(Snapper z, vector u, SnapperFilter filter=null, bool undoable=true,
				     Snapper{} visited=new Snapper{}, bool force=false) {
}

Preserving Part Adjustments When Resetting Item Tags

The following public interfaces have been added:

Added: extend public Part[] Snapper.rawParts()
Added: extend public bool Snapper.resetPartItemTagInfos()
Added: public bool TaggableSnapper.resetPartItemTagInfos()
Added: public int askUserAdjustedPartMigration(Part[] adjustedParts)

Snapper.resetPartItemTagInfos() returns true by default. Custom snappers can override it to perform their own part-tag reset preparation or return false to cancel the surrounding item-tag reset.

cm.core.part

Query Dialog Sidebar and Model Import

QueryDialog no longer exposes a generic right-side window. Use the tab API instead:

Removed: public SubWindow rightWindow;
Removed: extend public SubWindow rightWindow();

Added: public QueryTabContainer tabContainer;
Added: extend public str activeTabKey();
Added: extend public QueryTabWindow activeTab();
Added: extend public void openTab(str key);
Added: extend public void closeActiveTab();

The old import window has been renamed and now participates in the tab framework:

Old: public class QueryImportWindow extends QuerySubWindow
New: public class QueryPartImportTabWindow extends QueryTabWindow

Old: extend public void setImportFileUrl(Url url)
New: extend public void setImportFileUrl(Url url, bool invokeCb=true)

The constructor no longer accepts an initial Url. Pass fileFilters when constructing the tab, then call setImportFileUrl() if an initial file is needed.

Part-import methods formerly overridden on QueryDialogBehavior have moved to QueryPartImportTabBehavior. This includes file-filter and importer factories, validation and cleanup, file-change handlers, and grid drag/drop handling. Migrate custom overrides to a QueryPartImportTabBehavior subclass and return it from queryPartImportTabBehavior():

public class MyPartImportTabBehavior extends QueryPartImportTabBehavior {
    public <str, str>[] getImportFileLabelsAndSuffixes() {
        return super(..) + [<"My Parts", "*.myparts">];
    }
}

public class MyQueryDialogBehavior extends QueryDialogBehavior {
    public QueryPartImportTabBehavior queryPartImportTabBehavior() {
        return MyPartImportTabBehavior();
    }
}

The following QueryDialogBehavior entry points have been replaced by the tab API:

Removed: extend public SubWindow initImportWindow(QueryDialog dialog, Url url=null)
Removed: extend public void initImportWindowEvents(SubWindow importWindow)
Removed: extend public SubWindow rightWindow(QueryDialog dialog)

Added: extend public QueryTabBehavior[] tabBehaviors()
Added: extend public QueryPartImportTabBehavior queryPartImportTabBehavior()
Added: extend public QueryModelImportTabBehavior queryModelImportTabBehavior()
Added: extend public SubWindow activeTab(QueryDialog dialog)

QueryControlWindow.importButton and its importBtnClicked event have been removed. Open the part-import tab with dialog.openTab(corePartImportTabBehavior().key()), or provide the desired tabs through QueryDialogBehavior.tabBehaviors().

The QuerySubWindow constructor now exposes the standard window arguments. Calls that passed a brush positionally must switch to a named argument because the second positional argument is now Font:

Old: QuerySubWindow(parent, myBrush)
New: QuerySubWindow(parent, brush=myBrush)

QuerySubWindow now calls the new overridable initEvents() method during construction. Subclasses should override that method for event wiring and call super(..) where appropriate.

Part Hierarchy Depth and Physical Dimensions

The recursive hierarchy-depth method on Part has been renamed so AbsPart.depth() can represent a physical measurement:

Old: final public int Part.depth()
New: final public int Part.maxDepth()

Replace calls that inspect the deepest child level with maxDepth(). Do not replace physical-dimension calls: AbsPart.depth() is a separate double value measured in meters.

Generic Part Codes and Export Data

The following interfaces have been added:

Added: public str BasicPartData._genericCode
Added: public str BasicPartData.genericCode()
Added: public void BasicPartData.setGenericCode(str value)
Added: extend public str PartData.genericCode()
Added: extend public void PartData.setGenericCode(str value)
Added: extend public str Part.genericCode(Space space=null)
Added: extend public str Part.adjustedGenericCode(Space space=null)
Added: extend public str PartProxy.genericCode(Part part)
Added: extend public PartTag Part.tag(str categoryLbl, World world=null, bool ignoreCase=false)

The OFDA hooks xmlMeasurements(str prefix, XmlStreamBuf buf) and xmlUserDefined(str prefix, XmlStreamBuf buf) have moved from ProdPart to the base Part class. A new xmlMeasurement() helper writes a measurement value and its type, system, and unit attributes.

Query Dialog API Follow-up

Query tab factories now receive their owning dialog. Update overrides and direct calls:

Old: extend public QueryTabBehavior[] tabBehaviors()
New: extend public QueryTabBehavior[] tabBehaviors(QueryDialog dialog)

Old: extend public QueryPartImportTabBehavior queryPartImportTabBehavior()
New: extend public QueryPartImportTabBehavior queryPartImportTabBehavior(QueryDialog dialog)

Old: extend public QueryModelImportTabBehavior queryModelImportTabBehavior()
New: extend public QueryModelImportTabBehavior queryModelImportTabBehavior(QueryDialog dialog)

The first argument to alignCenterY() is now the reference window rather than part of the rest sequence:

Old: public void alignCenterY(rest: Window[] controls)
New: public void alignCenterY(Window this, rest: Window[] controls)
Added: public void alignCenterX(Window this, rest: Window[] controls)
Added: public void alignCenter(Window this, rest: Window[] controls)

Part Owner Identification

BasicPartData

Old: public Snapper snapper : copy=reference;
New: private PartSourceInfo _sourceInfo : copy=reference;
Old: public void setOwner(Snapper z) 
New: public void setSourceInfo(PartSourceInfo info) {
Old: public Snapper owner()
New: public PartSourceInfo sourceInfo()
Old: public Snapper{} owners()
New: public PartSourceInfo{} sourceInfos() 

All direct access of the snapper field have been changed to owner method.

FlattenedPartData

Old: public Snapper{} snappers : copy=shallow;
Old: private str{} _sourceIds;
New: private PartSourceInfo{} _sourceInfos;
Old: public Snapper{} owners()
Old: final public str{} sourceIds()
New: public PartSourceInfo{} sourceInfos()
Old: final private void appendOwnersFrom(PartData data)
New: final private void appendSourceInfosFrom(PartData data)

Part

Removed:  private str _sourceId; // sourceId is stored on PartData now.
Added: extend public PartSourceInfo{} sourceInfos()

PartData

Added: extend public void setSourceInfo(PartSourceInfo info) : abstract
Added: extend public PartSourceInfo sourceInfo() : abstract
Added: extend public PartSourceInfo{} sourceInfos() : abstract
Added: extend public void setSourceId(str id)
Added: extend public str sourceId()
Added: extend public str{} sourceIds() 

The following methods have been updated to use PartSourceInfo and are no longer abstract

extend public void setOwner(Snapper z)
extend public Snapper owner()
extend public Snapper{} owners() 

Preserving Part Adjustments When Resetting Item Tags

The following public interfaces have been added:

Added: public bool Part.blockAdjustmentMigration
Old: final public void Part.migrateAdjusmentKeys(str oldKey)
New: final public void Part.migrateAdjusmentKeys(str oldKey, bool markOldPending=false)
Added: final public str Part.userItemTagInfoKey()
Added: extend public ItemTagInfo Part.userItemTagInfo()
Added: extend public ItemTagInfo Part.defaultItemTagInfo(bool putToWorld=false)
Added: final public bool SinglePartAdjustment.pendingSilentRemoval()
Added: final public void SinglePartAdjustment.markPendingSilentRemoval(bool value)
Added: public str untokenizedArticleCodeStr(Part[] parts, str breakS)
Added: public Part[] adjustedParts(Part[] parts, bool updatePartTags=true, Space space=null)
Added: public Part[] indTagModifiedParts(Part[] parts)

Existing one-argument calls to migrateAdjusmentKeys() remain valid. Pass markOldPending=true when the old adjustment may still be used by another flattened part; CET will remove it silently once it is no longer active.

cm.core.part.query

Multiline Query and Article View Text

The public description control on PartMakeSpecialDialog has changed type:

Old: public FormattedTextField descrTF;
New: public FormattedTextArea descrTF;

Code that replaces, stores, or passes descrTF as a FormattedTextField must use FormattedTextArea or a compatible common control type. For example, subclasses that replace the control should migrate their initialization:

Old: descrTF = FormattedTextField(this,
                                  font=smallSystemFont,
                                  frameStyle=flatFrame);

New: descrTF = FormattedTextArea(this,
                                 font=smallSystemFont,
                                 frameStyle=flatFrame,
                                 lineBreak=true);

cm.extension

Timeout changes for CET updates

bgInstallHost.cm

Added new arguments to the abortAfterTimeout method in the BgInstallHost class.

Old: final public void abortAfterTimeout() {
New: final public void abortAfterTimeout(bool failed=false) {

Also some interfaces were updated in the cet.runtime package. Please refer to the documentation for those changes as well.

Remove uninstalled catalogs

The following interface changes have been made to facilitate the functionality to remove related catalog files when an extension is uninstalled.

class EmbeddedCatalogHost

Old: extend public EmbeddedCatalogInfo dequeueCatalogToRegister() {
New: extend public <symbol, EmbeddedCatalogInfo> dequeueCatalogToRegister() {

Also some interfaces were updated in the cm.abstract.dataSymInterface and cm.abstract.dataSymbol packages as part of this change. Please refer to the documentation for those changes as well.

cm.format.xml

XML Short-Tag Attributes

The XmlStreamBuf.shortTag() overloads now accept optional XML attributes:

Old: final public void shortTag(str tag, str value)
New: final public void shortTag(str tag, str value, <str, str>[] args=null)

Old: final public void shortTag(str tag, int value)
New: final public void shortTag(str tag, int value, <str, str>[] args=null)

Old: final public void shortTag(str tag, double value)
New: final public void shortTag(str tag, double value, <str, str>[] args=null)

Each tuple in args is written as an attribute name and value. Existing two-argument calls retain their previous output.

Example:

buf.shortTag("Measurement", 1.25,
             [<"type", "width">, <"unit", "meter">]);

cm.recovery

More specific error reports

The following interfaces have been changed to facilitate better categorization and more information for crash reports now.

cm.recovery.recoveryBits.cm

Old: public void sendBitsBugReport(str subject=null, Url drawing=null, Window parent=null) {
New: public void sendBitsBugReport(ErrorDialogArgs args=null, str subject=null,
			      Url drawing=null, Window parent=null,
			      str stackTrace=null, CallStack callStack=null) {
Old: public void sendFeedbackReport(ErrorDialogArgs errorDialogArgs=null, bool forceCrash=false) {
New: public void sendFeedbackReport(ErrorDialogArgs errorDialogArgs=null) {

For crash reports use sendBitsCrashReport reports instead.

cm.statistics

statsPartsDB.cm

Added new arguments for the PartEntryOption constructor to support part anlytics for Material Portal Textile manufacturers.

Old: public constructor(str code, str description, str groupDescription=null, int level=1) {
New: public constructor(str code, str description, str groupDescription=null, int level=1,
			str mMatPortalCompanyId=null, str mMatPortalCompanyCode=null,
			str matPortalSku=null) {

Also some interfaces were updated in the cm.win package as part of this change. Please refer to the documentation for those changes as well.

cm.std.draw3D

The following classes have been removed because they are no longer used in the base repository. Most were legacy implementations or experimental code and were not intended for public use.

If your project depends on any of these classes, you will need to maintain your own local copies.

Removed: class AFaceAnonymousOwner
Removed: class AFaceConeOwner
Removed: class AFaceCylinderOwner
Removed: class AFaceDoubleOwner
Removed: class AFaceFaceOwner
Removed: class AFaceNurbOwner
Removed: class AFaceOwner
Removed: class AFaceSphereOwner
Removed: class AOwnedQuadeFace
Removed: class AOwnedTriFace
Removed: class AngleDraw3DMeasureInsertAnimation
Removed: class BaselineDimensionInsertAnimationG2
Removed: class ChainDraw3DMeasureFilter
Removed: class ChainDrawRemoverAnimation
Removed: class DiagonalDraw3DMeasureInsertAnimation
Removed: class Draw3DBox
Removed: class Draw3DConvertToSolid
Removed: class Draw3DEdgeMeshHelper
Removed: class Draw3DFace
Removed: class Draw3DFaceMeshHelper
Removed: class Draw3DMeasureLineChainInsertAnimation
Removed: class Draw3DMeshEditor
Removed: class Draw3DMeshHelper
Removed: class Draw3DMeshStretchAnimation
Removed: class Draw3DMixedLine
Removed: class Draw3DNurbs
Removed: class Draw3DNurbsCPConnector
Removed: class Draw3DPolyMixedLineInsertAnimation
Removed: class Draw3DProfile
Removed: class Draw3DProfileArcTangent
Removed: class Draw3DProfileEditor
Removed: class Draw3DProfileEditorAdd
Removed: class Draw3DProfileEditorMove
Removed: class Draw3DProfileEditorRemove
Removed: class Draw3DProfileEditorToggle
Removed: class Draw3DProfileGrab
Removed: class Draw3DProfileGrabEdge
Removed: class Draw3DProfileGrabVertex
Removed: class Draw3DProfileSnapper
Removed: class Draw3DProfileSnapperFilter
Removed: class Draw3DRevisionCloudInsertAnimation
Removed: class Draw3DRevisionCloudPaperInsertAnimation
Removed: class Draw3DSolid
Removed: class Draw3DSolidData
Removed: class Draw3DSolidStretchBox
Removed: class Draw3DSolidStretchObject
Removed: class Draw3DVertexMeshHelper
Removed: class DrawBoxEdgeDepthInsertAnimation
Removed: class HorizontalDraw3DMeasureInsertAnimation
Removed: class MeshSolidData
Removed: class ProfileSnapperFilter
Removed: class SolidSnapperFilter
Removed: class StaticHorizontalDraw3DMeasure
Removed: class StaticHorizontalVerticalDraw3DMeasure
Removed: class StaticHorzVertDrawMeasureInsertAnimation
Removed: class StaticVerticalDraw3DMeasure
Removed: class SweepSolidData
Removed: class ThickProfileSolidData
Removed: class VerticalDraw3DMeasureInsertAnimation

The following classes have been deprecated because they are no longer used in the base repository. They will be removed in a future release.

public class DiagonalDraw3DMeasure extends Draw3DMeasure : deprecated {
public class Draw3DMeasureLine extends Draw3DMeasureBase : deprecated {
public class Draw3DMeasureLineChain extends Draw3DMeasureLine : deprecated {
public class Draw3DMeasureLineEndSnap extends Draw3DMeasureLineSnap : deprecated {
public class Draw3DMeasureLineStartSnap extends Draw3DMeasureLineSnap : deprecated {
public class SingleChainDraw3DMeasure extends ChainDraw3DMeasure : deprecated {

The following class interfaces have had their visibility limited.

Old: public class Draw3DMeasureLineAnimation extends DrawStretchAnimation {
New: private class Draw3DMeasureLineStretchAnimation extends DrawStretchAnimation {
Old: public class Draw3DMeasureLineStartSnap extends Draw3DMeasureLineSnap {
New: package class Draw3DMeasureLineStartSnap extends Draw3DMeasureLineSnap : deprecated {
Old: public class Draw3DMeasureLineEndSnap extends Draw3DMeasureLineSnap {
New: package class Draw3DMeasureLineEndSnap extends Draw3DMeasureLineSnap : deprecated {

The following functions have been removed because they are no longer used in the base repository.

Removed: public AFaceOwner getOwner(AFace z) {
Removed: public Draw3DProfile profile(Snapper z) {
Removed: public Transform transform(Snapper z, line mouseLine) {
Removed: public point intersectP(Snapper z, line mouseLine, Transform it=null) {

The following variables have been removed because they are no longer used in the base repository

Removed: public bool transparentSolids = false;

class StaticDraw3DMeasure

Renamed some interfaces to make them applyable to both 2D and 3D.

Old: public bool isUpdateAssoc2D : copy=null, stream=null, ignore modify notice;
New: private bool _assocPosInvalidated : copy=null, stream=null, public readable, ignore modify notice;
Added: final public void invalidateAssocPos() { _assocPosInvalidated = true; }
Old: extend public void updateAssoc2D(bool force=false) {
New: extend public void invalidateGraphicsAfterAssocChange(bool force=false) {

StaticDraw3DMeasure now uses dimensionAlignment instead of the old dimAlignType property to indicate direction and what to measure. The old type only described 2D layout as horizontal, vertical, or diagonal. dimensionAlignment also works for 3D dimensions.

A dimensionAlignment value has two parts: what the dimension measures, and which direction the dimension legs extend in. For the old 2D values, use these replacements:

dimAlignType.diagonal -> dimensionAlignment.euclideanLocalY
dimAlignType.horizontal -> dimensionAlignment.deltaXGlobalY
dimAlignType.vertical -> dimensionAlignment.deltaYGlobalX

Some references to the old type still exist on ChainDraw3DMeasure for backwards compatibility, but the underlying static-measure mechanism now uses dimensionAlignment.

The following definitions were removed or replaced:

Removed: extend public void updateRot(dimAlignType value) {
Removed: extend public void setMinLegLength(double length) {
Old: quick property `dimAlignType "dimAlign"`
New: quick property `dimensionAlignment "dimensionAlignment"`
Added: extend public dimensionAlignment currentDimensionAlignment() {

Calls or overrides of updateRot(dimAlignType) and setMinLegLength must be updated. For association changes, replace setting isUpdateAssoc2D with invalidateAssocPos(), and replace calls to updateAssoc2D() with invalidateGraphicsAfterAssocChange() at the prior refresh point. There is no public readable replacement for isUpdateAssoc2D.

class DimensionInsertAnimation

The standard dimension insertion path now uses DimensionInsertAnimation for both 2D and 3D. Code that checks for subclasses or configures the old static/two-click insertion animations should be reviewed. The old TwoClickMeasureInsertAnimationStart class remains available for compatibility, but the standard toolbox and key bindings now start DimensionInsertAnimation with numClicks=2 or numClicks=3.

The new common animation inserts StaticDraw3DPowerMeasure by default. If an extension derives a dimension class and uses this insertion path, override instantiateNewDimension() in a derived animation so that a new dimension of the extension's class is created:

public DrawMeasure instantiateNewDimension() {
    MyDimension dim();
    dim.d = getInitialLineLength();
    return dim;
}

library.cm

Removed unused function.

Removed: public Library stdDraw3DLibrary() {

cm.std.print.template

The following classes have been removed because they are no longer used in the base repository. Most DrawTemplate<..> classes were near-identical duplicates of the corresponding Draw<..> classes in cm.std.draw3D, and we recommend using those instead. For example, replace DrawTemplate3DArc with Draw3DArc.

If migration is not feasible, you will need to maintain your own local copies of the removed classes.

Removed: class DiagonalDrawTemplate3DMeasure
Removed: class Draw2DRefPointVessel
Removed: class DrawStretchablePolylineInsertAnimationG2
Removed: class DrawTemplate3D2SidedDoubleRect
Removed: class DrawTemplate3D2SidedDoubleRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3D2SidedRect
Removed: class DrawTemplate3D2SidedRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3D3SidedDoubleRect
Removed: class DrawTemplate3D3SidedDoubleRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3D3SidedRect
Removed: class DrawTemplate3D3SidedRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3DArc
Removed: class DrawTemplate3DArc2LineInsertAnimation
Removed: class DrawTemplate3DArc3PointsInsertAnimation
Removed: class DrawTemplate3DArcRadiusAngleInsertAnimation
Removed: class DrawTemplate3DArcTangentAngleInsertAnimation
Removed: class DrawTemplate3DBackgroundRect
Removed: class DrawTemplate3DBackgroundRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3DBackgroundRectEdgeDiagonalInsertAnimation
Removed: class DrawTemplate3DBox
Removed: class DrawTemplate3DCircle
Removed: class DrawTemplate3DCircleDiameterInsertAnimation
Removed: class DrawTemplate3DCircleRadiusInsertAnimation
Removed: class DrawTemplate3DDoubleArc
Removed: class DrawTemplate3DDoubleArc2LineInsertAnimation
Removed: class DrawTemplate3DDoubleArc3PointsInsertAnimation
Removed: class DrawTemplate3DDoubleArcTangentAngleInsertAnimation
Removed: class DrawTemplate3DDoubleLine
Removed: class DrawTemplate3DDoubleLineInsertAnimation
Removed: class DrawTemplate3DDoubleRect
Removed: class DrawTemplate3DDoubleRectEdgeDepthInsertAnimation
Removed: class DrawTemplate3DDoubleRectEdgeDiagonalInsertAnimation
Removed: class DrawTemplate3DDoubler
Removed: class DrawTemplate3DHelpLine
Removed: class DrawTemplate3DHelpLineInsertAnimation
Removed: class DrawTemplate3DMeasure
Removed: class DrawTemplate3DMeetDoubler
Removed: class DrawTemplate3DMeeter
Removed: class DrawTemplate3DMixedLine
Removed: class DrawTemplate3DNurbs
Removed: class DrawTemplate3DNurbsCPConnector
Removed: class DrawTemplate3DPolyHelpLineInsertAnimation
Removed: class DrawTemplate3DPolyLineInsertAnimation
Removed: class DrawTemplate3DPolyMixedLineInsertAnimation
Removed: class DrawTemplate3DRectEdgeDiagonalInsertAnimation
Removed: class DrawTemplate3DRectRevisionCloudInsert
Removed: class DrawTemplate3DReferencePoint
Removed: class DrawTemplate3DReferencePointInsertAnimation
Removed: class DrawTemplate3DRevisionCloud
Removed: class DrawTemplate3DRevisionCloudInsertAnimation
Removed: class DrawTemplate3DSurface2DSearch
Removed: class DrawTemplate3DTrimmer
Removed: class DrawTemplateBackgroundDragAnimation
Removed: class DrawTemplateBoxEdgeDepthInsertAnimation
Removed: class DrawTemplateHelpLineInsertAnimationG2
Removed: class DrawTemplateHelpLineInsertAnimationG2
Removed: class DrawTemplateHelpLineInsertAnimationG2Vessel
Removed: class DrawTemplateLineInsertAnimationG2
Removed: class DrawTemplateLineInsertAnimationG2Vessel
Removed: class DrawTemplatePolyHelpLineInsertAnimationG2
Removed: class DrawTemplatePolyHelpLineInsertAnimationG2Vessel
Removed: class DrawTemplatePolyLineInsertAnimationG2
Removed: class DrawTemplatePolyLineInsertAnimationG2Vessel
Removed: class DrawTemplatePolyRefPointsInsertAnimationG2
Removed: class DrawTemplatePolyRefPointsInsertAnimationG2Vessel
Removed: class DrawTemplateRefPointInsertAnimationG2
Removed: class DrawTemplateRefPointInsertAnimationG2Vessel
Removed: class HorizontalDrawTemplate3DMeasure
Removed: class RefPointCursorVessel
Removed: class VertDist
Removed: class VerticalDrawTemplate3DMeasure

The following classes have been deprecated because they are no longer used in the base repository. They may be removed in future releases.

public class PrintRect extends DrawRect : deprecated {

The following function have been removed because it is no longer used in the base repository.

Removed: public void startRepeatTemplateLineAnimation() {

Instead use:

Added: public void startRepeatLineAnimation() {

cm.win

UrlField button background brush

The following overridable method has been added to UrlField:

Added: extend public Brush buttonBgBrush()

Most UrlField subclasses require no source changes. However, a subclass that already declares a member named buttonBgBrush may now conflict with or override the inherited method. If that member is intended to customize the URL button, ensure it has the compatible Brush buttonBgBrush() signature and access. Otherwise, rename it to avoid the inherited interface.

The open file name functions have been cleaned up:

  • Removed getOpenFileNameEx and getOpenFileNameMultipleEx
  • Removed argument pointI position as it was unused
  • Renamed argument str[] filters to str[] filter
Old: public Url getOpenFileNameEx(Window parent, Url initUrl, str[] filters,
                                  bool fileMustExist=true, Int filterIndex=null) {
Old: public Url getOpenFileNameEx(Window parent, Url initUrl, str[] filters, pointI position,
                                  bool fileMustExist=true, Int filterIndex=null) {
New: public Url getOpenFileName(Window parent, Url initUrl, str[] filter,
                                bool fileMustExist=true, Int filterIndex=null) {

Old: public Url[] getOpenFileNameMultipleEx(Window parent, Url initUrl, str[] filters,
                                            bool fileMustExist=true, Int filterIndex=null) {
Old: public Url[] getOpenFileNameMultipleEx(Window parent, Url initUrl, str[] filters, pointI position,
                                            bool fileMustExist=true, Int filterIndex=null) {
New: public Url[] getOpenFileNameMultiple(Window parent, Url initUrl, str[] filter,
                                          bool fileMustExist=true, Int filterIndex=null) {

Old: public Url getOpenFileName(Window parent, Url initUrl, str[] filter, pointI position,
                                bool fileMustExist=true, Int filterIndex=null) {
New: public Url getOpenFileName(Window parent, Url initUrl, str[] filter,
                                bool fileMustExist=true, Int filterIndex=null) {

The save file name functions have been cleaned up:

  • Removed getSaveFileNameEx
  • Removed argument pointI position as it was unused
  • Renamed argument str[] filters to str[] filter
Old: public Url getSaveFileNameEx(Window parent, Url initUrl, str[] filters,
                                  Int filterIndex=null, bool overwriteWarning=true) {
Old: public Url getSaveFileNameEx(Window parent, Url initUrl, str[] filters, pointI position,
                                  Int filterIndex=null, bool overwriteWarning=true) {
New: public Url getSaveFileName(Window parent, Url initUrl, str[] filter,
                                Int filterIndex=null, bool overwriteWarning=true) {

Old: public Url getSaveFileName(Window parent, Url initUrl, str[] filter, pointI position,
                                Int filterIndex=null, bool overwriteWarning=true) {
New: public Url getSaveFileName(Window parent, Url initUrl, str[] filter,
                                Int filterIndex=null, bool overwriteWarning=true) {

The browse folder functions have been renamed:

Old: public Url browseForFolderEx(Window parent, str title, Url initUrl=null) {
New public Url browseForFolder(Window parent, str title, Url initUrl=null) {

The following functions have been removed:

public void applySaveFilterOldReplaceStyle(Url url, str[] filters, int index) {
public void applySaveFilterOldReplaceStyle(Url url, str filter) {

Added argument str loc=callerLoc() for various progress related classes and functions.

# InfiniteProgressBarDialog
Old: public constructor(Window parent,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=null,
                        pointI pos=(0, 0),
                        sizeI size=(280, 64),
                        bool initVisible=true,
                        bool resident=false,
                        // extended args
                        bool spinning=false,
                        bool center=true,
                        bool modal=true,
                        bool cancel=false,
                        function(ProgressDialog d) abortCallback=null) {
New: public constructor(Window parent,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=null,
                        pointI pos=(0, 0),
                        sizeI size=(280, 64),
                        bool initVisible=true,
                        bool resident=false,
                        // extended args
                        bool spinning=false,
                        bool center=true,
                        bool modal=true,
                        bool cancel=false,
                        function(ProgressDialog d) abortCallback=null,
                        str loc=callerLoc()) {

# ProgressEnv
Old: public constructor(Window frame, int steps=100,
                        str label=null,
                        bool cancel=true,
                        bool center=true,
                        bool modal=false,
                        function(ProgressDialog d) abortCallback=null,
                        bool infinite=false,
                        bool spinning=false,
                        bool initVisible=true,
                        str infoLabel=null,
                        str statusLabel=null) {
New: public constructor(Window frame, int steps=100,
                        str label=null,
                        bool cancel=true,
                        bool center=true,
                        bool modal=false,
                        function(ProgressDialog d) abortCallback=null,
                        bool infinite=false,
                        bool spinning=false,
                        bool initVisible=true,
                        str infoLabel=null,
                        str statusLabel=null,
                        str loc=callerLoc()) {

Old: public ProgressDialog beginProgress(Window frame, int steps=100,
                                         str label=null,
                                         bool cancel=true,
                                         bool center=true,
                                         bool modal=true,
                                         function(ProgressDialog d) abortCallback=null,
                                         bool infinite=false,
                                         bool spinning=false,
                                         bool initVisible=true,
                                         str infoLabel=null,
                                         str statusLabel=null) {
New: public ProgressDialog beginProgress(Window frame, int steps=100,
                                         str label=null,
                                         bool cancel=true,
                                         bool center=true,
                                         bool modal=true,
                                         function(ProgressDialog d) abortCallback=null,
                                         bool infinite=false,
                                         bool spinning=false,
                                         bool initVisible=true,
                                         str infoLabel=null,
                                         str statusLabel=null,
                                         str loc=callerLoc()) {

Added argument str loc=callerLoc() into the non modal dialogs classes and functions.

# NonModalMessageBox
Old: public constructor(Window parent, str message,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Message",
                        str buttonLabel=null,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        function(Object arg) callback=null,
                        Object callbackArg=null) {
New: public constructor(Window parent, str message,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Message",
                        str buttonLabel=null,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        function(Object arg) callback=null,
                        Object callbackArg=null,
                        str loc=callerLoc()) {

Old: public void makeNonModalMessageBox(Window parent, str message) {
New: public void makeNonModalMessageBox(Window parent, str message, str loc=callerLoc()) {

Old: public void makeNonModalMessageBox(Window parent, str id, str message) {
New: public void makeNonModalMessageBox(Window parent, str id, str message, str loc=callerLoc()) {

Old: public NonModalMessageBox makeNonModalMessageBox(Window parent, str id, str label, str message, str buttonLabel=null,
                                                      function(Object arg) callback=null,
                                                      Object callbackArg=null) {
New: public NonModalMessageBox makeNonModalMessageBox(Window parent, str id, str label, str message, str buttonLabel=null,
                                                      function(Object arg) callback=null,
                                                      Object callbackArg=null,
                                                      str loc=callerLoc()) {

# NonModalWarningDialog
Old: public constructor(Window parent, str message,
                        Image warningIcon=null,
                        pointI messageOffset=(20, 10),
                        str buttonLabel=null,
                        Brush textFieldBrush=almostWhiteBrush,
                        function(Control) buttonCallback=null,
                        str checkBoxMessage=null,
                        function(Control) checkBoxCallback=null|,
                       
                        // Inhertited
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        FrameStyle frameStyle=lightGrayPenFrame,
                        frame3DState frameState=frameStateUp,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(500, 200),
                        bool initVisible=true,
                        bool noBorder=false,
                        bool noCaptionStyle=false,
                        bool shadow=false,
                        bool addMinimize=false,
                        bool addMaximize=false,
                        bool resident=false,
                        bool forceShowInTaskbar=false) {
                        bool forceShowInTaskbar=false,
                        str loc=callerLoc()) {
New: public constructor(Window parent, str message,
                        Image warningIcon=null,
                        pointI messageOffset=(20, 10),
                        str buttonLabel=null,
                        Brush textFieldBrush=almostWhiteBrush,
                        function(Control) buttonCallback=null,
                        str checkBoxMessage=null,
                        function(Control) checkBoxCallback=null|,
                       
                        // Inhertited
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        FrameStyle frameStyle=lightGrayPenFrame,
                        frame3DState frameState=frameStateUp,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(500, 200),
                        bool initVisible=true,
                        bool noBorder=false,
                        bool noCaptionStyle=false,
                        bool shadow=false,
                        bool addMinimize=false,
                        bool addMaximize=false,
                        bool resident=false,
                        bool forceShowInTaskbar=false,
                        str loc=callerLoc()) { 

# FormattedTextNonModalMessageBox
Old: public constructor(Window parent, str header, FormattedText content,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Message",
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool framed=false,
                        bool initVisible=true) {
New: public constructor(Window parent, str header, FormattedText content,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Message",
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool framed=false,
                        bool initVisible=true,
                        str loc=callerLoc()) {

Old: public void makeFormattedTextNonModalMessageBox(Window parent, str message,
                                                     FormattedText content, bool framed=false) {
New: public void makeFormattedTextNonModalMessageBox(Window parent, str message,
                                                     FormattedText content, bool framed=false,
                                                     str loc=callerLoc()) {

Old: public void makeFormattedTextNonModalMessageBox(Window parent, str id, str message,
                                                     FormattedText content, bool framed=false) {
New: public void makeFormattedTextNonModalMessageBox(Window parent, str id, str message,
                                                     FormattedText content, bool framed=false,
                                                     str loc=callerLoc()) {

Old: public void makeFormattedTextNonModalMessageBox(Window parent, str id, str label, str message,
                                                     FormattedText content, bool framed=false) {
New: public void makeFormattedTextNonModalMessageBox(Window parent, str id, str label, str message,
                                                     FormattedText content, bool framed=false,
                                                     str loc=callerLoc()) {

Changed argument SrcRef src=#:src to str loc=callerLoc() for the following message box functions:

Old: public void makeMessageBox(Window parent, str message,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                SrcRef src=#:src) {
New: public void makeMessageBox(Window parent, str message,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                str loc=callerLoc()) {

Old: public void makeMessageBox(Window parent, str label, str message,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                SrcRef src=#:src) {
New: public void makeMessageBox(Window parent, str label, str message,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                str loc=callerLoc()) {

Old: public void makeMessageBox(Window parent, str label, str message,
                                function(Control c) doNotShowAgainCB=null,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                SrcRef src=#:src) {
New: public void makeMessageBox(Window parent, str label, str message,
                                function(Control c) doNotShowAgainCB=null,
                                dialogIcon icon=dialogIcon.none,
                                function(Window dialog) positionCallback=null,
                                str loc=callerLoc()) {

Old: public void makeFormattedMessageBox(Window parent, str label, str message,
                                         function(Control c) doNotShowAgainCB=null,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null,
                                         SrcRef src=#:src) {
New: public void makeFormattedMessageBox(Window parent, str label, str message,
                                         function(Control c) doNotShowAgainCB=null,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null,
                                         str loc=callerLoc()) {

Added argument str loc=callerLoc() into the the following message box functions:

# LinkedOneButtonBox
Old: public constructor(Window parent, str message, str preLinkMsg,
                        str linkLabel, str link, str btnLabel=$okButtonLabel,
                        dialogIcon icon=dialogIcon.none,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$messageDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true) {
New: public constructor(Window parent, str message, str preLinkMsg,
                        str linkLabel, str link, str btnLabel=$okButtonLabel,
                        dialogIcon icon=dialogIcon.none,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$messageDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str loc=callerLoc()) {

Old: public void makeLinkedMessageBox(Window parent, str label, str message, str preLinkMsg, str linkLabel, str link, str btnLabel=$okButtonLabel, dialogIcon icon=dialogIcon.none) {
New: public void makeLinkedMessageBox(Window parent, str label, str message,
                                      str preLinkMsg, str linkLabel, str link,
                                      str btnLabel=$okButtonLabel,
                                      dialogIcon icon=dialogIcon.none,
                                      str loc=callerLoc()) {

Old: public void makeMessageBoxPostLoad(Window parent, str message, FormattedText content, bool framed=false, bool readOnly=true, str label=null) {
New: public void makeMessageBoxPostLoad(Window parent, str message, FormattedText content,
                                        bool framed=false, bool readOnly=true, str label=null,
                                        str loc=callerLoc()) {

Old: public void makeMessageBoxPostLoad(Window parent, str message, bool framed=false, bool readOnly=true, str label=null) {
New: public void makeMessageBoxPostLoad(Window parent, str message, bool framed=false,
                                        bool readOnly=true, str label=null, str loc=callerLoc()) {


Old: public void makeMessageBoxPostLoad(Window parent, str label, str content, bool framed=false, bool readOnly=true) {
New: public void makeMessageBoxPostLoad(Window parent, str label, str content,
                                        bool framed=false, bool readOnly=true, str loc=callerLoc()) {

Removed argument SrcRef src=#:src from the the following two button box functions:

Old: public int makeTwoButtonBox(Window parent, str question, str select1, str select2,
                                 int defaultButtonNo=1,
                                 dialogIcon icon=dialogIcon.none,
                                 function(Window dialog) positionCallback=null,
                                 str loc=callerLoc(),
                                 SrcRef src=#:src) {
New: public int makeTwoButtonBox(Window parent, str question, str select1, str select2,
                                 int defaultButtonNo=1,
                                 dialogIcon icon=dialogIcon.none,
                                 function(Window dialog) positionCallback=null,
                                 str loc=callerLoc()) {

Changed argument SrcRef src=#:src to str loc=callerLoc() for the following two button box functions:

Old: public int makeTwoButtonBox(Window parent, str label, str question, str select1, str select2,
                                 int defaultButtonNo=1,
                                 dialogIcon icon=dialogIcon.none,
                                 function(Window dialog) positionCallback=null,
                                 SrcRef src=#:src) {
New: public int makeTwoButtonBox(Window parent, str label, str question, str select1, str select2,
                                 int defaultButtonNo=1,
                                 dialogIcon icon=dialogIcon.none,
                                 function(Window dialog) positionCallback=null,
                                 str loc=callerLoc()) {

Added argument str loc=callerLoc() into the the following two button box functions:

# TwoButtonImageBox
Old: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        Image image1=null,
                        Image image2=null,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true) {
New: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        Image image1=null,
                        Image image2=null,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str loc=callerLoc()) {

Old: public int makeTwoButtonImageBox(Window parent, str question,
                                      str select1, str select2,
                                      Image image1, Image image2, int defaultButtonNo=1) {
New: public int makeTwoButtonImageBox(Window parent, str question,
                                      str select1, str select2,
                                      Image image1, Image image2,
                                      int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeTwoButtonImageBox(Window parent, str label, str question,
                                      str select1, str select2,
                                      Image image1, Image image2, int defaultButtonNo=1) {
New: public int makeTwoButtonImageBox(Window parent, str label, str question,
                                      str select1, str select2,
                                      Image image1, Image image2,
                                      int defaultButtonNo=1, str loc=callerLoc()) {

# YesNoDialog
Old: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1) {
New: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeYesNoDialog(Window parent, str question, int defaultButtonNo=1) {
New: public int makeYesNoDialog(Window parent, str question, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeYesNoDialog(Window parent, str label, str question, int defaultButtonNo=1) {
New: public int makeYesNoDialog(Window parent, str label, str question, int defaultButtonNo=1, str loc=callerLoc()) {

# YesCancelDialog
Old: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1) {
New: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeYesCancelDialog(Window parent, str question, int defaultButtonNo=1) {
New: public int makeYesCancelDialog(Window parent, str question, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeYesCancelDialog(Window parent, str label, str question, int defaultButtonNo=1) {
New: public int makeYesCancelDialog(Window parent, str label, str question, int defaultButtonNo=1, str loc=callerLoc()) {

# OkExitDialog
Old: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1) {
New: public constructor(Window parent, str label, str question,
                        function(int z) callback, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeOkExitDialog(Window parent, str question, int defaultButtonNo=1) {
New: public int makeOkExitDialog(Window parent, str question, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeOkExitDialog(Window parent, str label, str question, int defaultButtonNo=1) {
New: public int makeOkExitDialog(Window parent, str label, str question, int defaultButtonNo=1, str loc=callerLoc()) {

# OkCancelDialog
Old: public constructor(Window parent, str label, str question, function(int z) callback, int defaultButtonNo=1, bool initVisible=true) {
New: public constructor(Window parent, str label, str question,
                        function(int z) callback, int defaultButtonNo=1, bool initVisible=true,
                        str loc=callerLoc()) {

Old: public int makeOkCancelDialog(Window parent, str question, int defaultButtonNo=1) {
New: public int makeOkCancelDialog(Window parent, str question, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeOkCancelDialog(Window parent, str label, str question, int defaultButtonNo=1) {
New: public int makeOkCancelDialog(Window parent, str label, str question, int defaultButtonNo=1, str loc=callerLoc()) {

# FormattedTextYesNoDialog
Old: public int makeFormattedTextYesNoDialog(Window parent, str label, str header,
                                             FormattedText content, bool framed=false) {
New: public int makeFormattedTextYesNoDialog(Window parent, str label, str header,
                                             FormattedText content, bool framed=false, str loc=callerLoc()) {

# FormattedTextTwoButtonBox
Old: public constructor(Window parent,
                        str label,
                        str header,
                        FormattedText content,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str select1=null,
                        str select2=null,
                        bool framed=false) {
New: public constructor(Window parent,
                        str label,
                        str header,
                        FormattedText content,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str select1=null,
                        str select2=null,
                        bool framed=false,
                        str loc=callerLoc()) {

Old: public int makeFormattedTextTwoButtonBox(Window parent, str label, str header,
                                              FormattedText content, str select1, str select2, bool framed=false, int defaultButtonNo=1) {
New: public int makeFormattedTextTwoButtonBox(Window parent, str label, str header,
                                              FormattedText content, str select1, str select2,
                                              bool framed=false, int defaultButtonNo=1, str loc=callerLoc()) {

Old: public int makeFormattedTextOkReportDialog(Window parent, str label, str header,
                                                FormattedText content, bool framed=false) {
New: public int makeFormattedTextOkReportDialog(Window parent, str label, str header,
                                                FormattedText content, bool framed=false, str loc=callerLoc()) {

Old: public int makeFormattedTextOkCancelDialog(Window parent, str header,
                                                FormattedText content, bool framed=false) {
New: public int makeFormattedTextOkCancelDialog(Window parent, str header,
                                                FormattedText content, bool framed=false,
                                                str loc=callerLoc()) {

Old: public int makeFormattedTextOkCancelDialog(Window parent, str id, str header,
                                                FormattedText content, bool framed=false) {
New: public int makeFormattedTextOkCancelDialog(Window parent, str id, str header,
                                                FormattedText content, bool framed=false,
                                                str loc=callerLoc()) {

Old: public int makeFormattedTextOkCancelDialog(Window parent, str id, str label, str header,
                                                FormattedText content, bool framed=false) {
New: public int makeFormattedTextOkCancelDialog(Window parent, str id, str label, str header,
                                                FormattedText content, bool framed=false,
                                                str loc=callerLoc()) {

# ExitCancelDialog
Old: public constructor(Window parent, str label, str question, function(int z) callback) {
New: public constructor(Window parent, str label, str question, function(int z) callback, str loc=callerLoc()) {

Old: public int makeExitCancelDialog(Window parent, str question) {
New: public int makeExitCancelDialog(Window parent, str question, str loc=callerLoc()) {

Old: public int makeExitCancelDialog(Window parent, str label, str question) {
New: public int makeExitCancelDialog(Window parent, str label, str question, str loc=callerLoc()) {

Added argument str loc=callerLoc() into the the following three button box functions:

# ThreeButtonBox
Old: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        str select3,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        function(int z) callback=null,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true) {
New: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        str select3,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        function(int z) callback=null,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str loc=callerLoc()) {

Old: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        str select3,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        function(str z) callback=null,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true) {
New: public constructor(Window parent,
                        str question,
                        str select1,
                        str select2,
                        str select3,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        function(str z) callback=null,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=$questionDialogCaption,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str loc=callerLoc()) {

# FormattedTextThreeButtonBox
Old: public constructor(Window parent,
                        str label,
                        str header,
                        FormattedText content,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str select1=null,
                        str select2=null,
                        str select3=null,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        bool framed=false) {
New: public constructor(Window parent,
                        str label,
                        str header,
                        FormattedText content,
                        function(int z) callback,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str select1=null,
                        str select2=null,
                        str select3=null,
                        Image image1=null,
                        Image image2=null,
                        Image image3=null,
                        bool framed=false,
                        str loc=callerLoc()) {

Old: public int makeFormattedTextThreeButtonBox(Window parent, str label, str header, FormattedText content,
                                                str select1, str select2, str select3,
                                                Image image1=null,
                                                Image image2=null,
                                                Image image3=null,
                                                bool framed=false,
                                                int defaultButtonNo=1) {
New: public int makeFormattedTextThreeButtonBox(Window parent, str label, str header, FormattedText content,
                                                str select1, str select2, str select3,
                                                Image image1=null,
                                                Image image2=null,
                                                Image image3=null,
                                                bool framed=false,
                                                int defaultButtonNo=1,
                                                str loc=callerLoc()) {

Changed argument SrcRef src=#:src to str loc=callerLoc() for the following three button box functions:

Old: public int makeThreeButtonBox(Window parent, str question,
                                   str select1, str select2, str select3,
                                   Image image1=null, Image image2=null, Image image3=null,
                                   int defaultButtonNo=1,
                                   dialogIcon icon=dialogIcon.none,
                                   function(Window dialog) positionCallback=null,
                                   SrcRef src=#:src) {
New: public int makeThreeButtonBox(Window parent, str question,
                                   str select1, str select2, str select3,
                                   Image image1=null, Image image2=null, Image image3=null,
                                   int defaultButtonNo=1,
                                   dialogIcon icon=dialogIcon.none,
                                   function(Window dialog) positionCallback=null,
                                   str loc=callerLoc()) {

Old: public int makeThreeButtonBox(Window parent, str question, str caption,
                                   str select1, str select2, str select3,
                                   Image image1=null, Image image2=null, Image image3=null,
                                   int defaultButtonNo=1,
                                   dialogIcon icon=dialogIcon.none,
                                   function(Window dialog) positionCallback=null,
                                   SrcRef src=#:src) {

New: public int makeThreeButtonBox(Window parent, str question, str caption,
                                   str select1, str select2, str select3,
                                   Image image1=null, Image image2=null, Image image3=null,
                                   int defaultButtonNo=1,
                                   dialogIcon icon=dialogIcon.none,
                                   function(Window dialog) positionCallback=null,
                                   str loc=callerLoc()) {

Changed argument SrcRef src=#:src to str loc=callerLoc() for the following four button box functions:

Old: public int makeFourButtonBox(Window parent, str question,
                                  str select1, str select2, str select3, str select4,
                                  Image image1=null, Image image2=null, Image image3=null, Image image4=null,
                                  int defaultButtonNo=1,
                                  dialogIcon icon=dialogIcon.none,
                                  function(Window dialog) positionCallback=null,
                                  SrcRef src=#:src) {
New: public int makeFourButtonBox(Window parent, str question,
                                  str select1, str select2, str select3, str select4,
                                  Image image1=null, Image image2=null, Image image3=null, Image image4=null,
                                  int defaultButtonNo=1,
                                  dialogIcon icon=dialogIcon.none,
                                  function(Window dialog) positionCallback=null,
                                  str loc=callerLoc()) {

Old: public int makeFourButtonBox(Window parent, str question, str caption,
                                  str select1, str select2, str select3, str select4,
                                  Image image1=null, Image image2=null, Image image3=null, Image image4=null,
                                  int defaultButtonNo=1,
                                  dialogIcon icon=dialogIcon.none,
                                  function(Window dialog) positionCallback=null,
                                  SrcRef src=#:src) {
New: public int makeFourButtonBox(Window parent, str question, str caption,
                                  str select1, str select2, str select3, str select4,
                                  Image image1=null, Image image2=null, Image image3=null, Image image4=null,
                                  int defaultButtonNo=1,
                                  dialogIcon icon=dialogIcon.none,
                                  function(Window dialog) positionCallback=null,
                                  str loc=callerLoc()) {

Added argument str loc=callerLoc() into the the following functions:

# IntInputDialog
Old: public constructor(Window parent,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=null,
                        pointI pos=(-1, -1),
                        sizeI size=sizeI(250, 150),
                        bool initVisible=true,
                        str text=null,
                        Int initValue=null) {
New: public constructor(Window parent,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label=null,
                        pointI pos=(-1, -1),
                        sizeI size=sizeI(250, 150),
                        bool initVisible=true,
                        str text=null,
                        Int initValue=null,
                        str loc=callerLoc()) {

Old: public Int makeIntInputDialog(Window parent, str label=null, str text=null, Int initValue=null) {
New: public Int makeIntInputDialog(Window parent, str label=null, str text=null, Int initValue=null, str loc=callerLoc()) {

# RadioButtonBox
Old: public constructor(Window parent,
                        str question,
                        str[] keys,
                        str[] labels,
                        str selectedKey,
                        str caption=$questionDialogCaption,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true) {
New: public constructor(Window parent,
                        str question,
                        str[] keys,
                        str[] labels,
                        str selectedKey,
                        str caption=$questionDialogCaption,
                        int defaultButtonNo=1,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        pointI pos=(-1, -1),
                        sizeI size=(280, 80),
                        bool initVisible=true,
                        str loc=callerLoc()) {

Old: public str makeRadioButtonBox(Window parent,
                                   str question,
                                   str[] keys,
                                   str[] labels,
                                   str selectedKey,
                                   str caption=$questionDialogCaption,
                                   function(Window dialog) positionCallback=null) {
New: public str makeRadioButtonBox(Window parent,
                                   str question,
                                   str[] keys,
                                   str[] labels,
                                   str selectedKey,
                                   str caption=$questionDialogCaption,
                                   function(Window dialog) positionCallback=null,
                                   str loc=callerLoc()) {

Old: public int makeYesAllNoCancelDialog(Window parent, str question,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null) {
New: public int makeYesAllNoCancelDialog(Window parent, str question,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null,
                                         str loc=callerLoc()) {

Old: public int makeYesAllNoCancelDialog(Window parent, str label, str question,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null) {
New: public int makeYesAllNoCancelDialog(Window parent, str label, str question,
                                         dialogIcon icon=dialogIcon.none,
                                         function(Window dialog) positionCallback=null,
                                         str loc=callerLoc()) {

# ResizableDialogWindow
Old: public constructor(Window parent, 
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        FrameStyle frameStyle=noFrame,
                        frame3DState frameState=frameStateUp,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(300, 200),
                        bool initVisible=true,
                        bool noBorder=false,
                        bool noCaptionStyle=false,
                        bool shadow=false,
                        bool addMinimize=false,
                        bool addMaximize=false,
                        bool resident=false,
                        bool forceShowInTaskbar=false,
                        str key=null,
                        sizeI minSize=(-1, -1),
                        sizeI maxSize=(-1, -1)) {
New: public constructor(Window parent, 
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        FrameStyle frameStyle=noFrame,
                        frame3DState frameState=frameStateUp,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(300, 200),
                        bool initVisible=true,
                        bool noBorder=false,
                        bool noCaptionStyle=false,
                        bool shadow=false,
                        bool addMinimize=false,
                        bool addMaximize=false,
                        bool resident=false,
                        bool forceShowInTaskbar=false,
                        str key=null,
                        sizeI minSize=(-1, -1),
                        sizeI maxSize=(-1, -1),
                        str loc=callerLoc()) {

Old: public constructor(Window parent,
                        TitleBarConfig tbConfig,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(300, 200),
                        bool initVisible=true,
                        bool resident=false,
                        bool forceShowInTaskbar=false,
                        str key=null,
                        sizeI minSize=(-1, -1),
                        sizeI maxSize=(-1, -1)) {
New: public constructor(Window parent,
                        TitleBarConfig tbConfig,
                        Font font=systemFont(),
                        Brush brush=null,
                        pointI origin=(0, 0),
                        bool selectable=true,
                        str label="Dialog",
                        pointI pos=(-1, -1),
                        sizeI size=(300, 200),
                        bool initVisible=true,
                        bool resident=false,
                        bool forceShowInTaskbar=false,
                        str key=null,
                        sizeI minSize=(-1, -1),
                        sizeI maxSize=(-1, -1)) {
                        str loc=callerLoc()) {

eventLogG3.cm

The access modifier for the valid method for G3UserEvent has been changed from public to package:

Old: final public bool valid(G3InvalidList list) {
New: final package bool valid(G3InvalidList list) {

Added new arguments for the G3ManufacturerId constructor to support part anlytics for Material Portal Textile manufacturers. statsManufacturerType.cil is for CIL manufacturers while statsManufacturerType.mpCompanyId are for Textile manufacturers using the material portal moving forward.

Old: public constructor(str mPMEnterprise) {
New: public constructor(str enterprise, statsManufacturerType mType=statsManufacturerType.cil) {

Also some interfaces were updated in the cm.statistics package as part of this change. Please refer to the documentation for those changes as well.

custom.accessories.office.catalogues

class OfficeSnapper (custom/accessories/office/catalogues/officeSnapper.cm)

Renamed the following method followed by changes in DataSymbol class.

Old: extend public void buildConnectors() {
New: extend public void buildLocalConnectors() {

custom.dataCatalog

Variants Table in Catalog Creator is no longer editable

As catalog has moved towards using constraints tables instead, we are deprecating support for variants tables. They will no longer be editable from the catalog creator and will be read only from 17.5 onwards. The user can migrate their variant tables to constraint tables using the migrate button in catalog creator.

The following methods have in the custom.dataCatalog.build.variantsTables package been removed:

class DcVariantsTableCard

Removed: method public bool dropFiles(DropFiles drop)
Removed: method extend public void importXLS()

class DcVariantsTableGridSubWindow

Removed: field public DsButton replaceBtn;
Removed: method extend public bool nameTxtEvent(str msg, Object value=null)
Removed: extend public bool importBtnEvent(str msg, Object value=null)

class DcVariantsTableToolboxSubWindow

Removed: field public DsButton importBtn;
Removed: field public DsButton newBtn;
Removed: field public DsButton deleteBtn;
Removed: method extend public bool importBtnEvent(str msg=null, Object value=null)
Removed: method extend public bool deleteBtnEvent(str msg=null, Object value=null)
Removed: method extend public bool newBtnEvent(str msg=null, Object value=null)

Performance improvement for loop detection in additional products and features

Previous when additional products and/or catalog features were deeply nested, there were sometimes performance issues when adding additional products and/or features in the catalog creator. We have updated the algorithm to be more efficient to improve such performance issues.

functions.cm

The following interfaces have changed in custom.dataCatalog.functions.cm

Old: public bool dcFeatureLoop(DsProductType prod, DataCatalog catalog, str[] soFar=null,
			       str{} validated=null, bool useCache=true) {
new: public bool dcFeatureLoop(DsProductType prod, DataCatalog catalog,
			       str{} visiting=null, str{} validated=null) {
Old: public bool dcFeatureLoop(DsProductType prod, DataCatalog catalog, str[] soFar=null,
			       str{} validated=null, bool useCache=true) {
new: public bool dcFeatureLoop(DsProductType prod, DataCatalog catalog,
			       str{} visiting=null, str{} validated=null) {
Old: public bool dcAdditionalProductLoop(DsProductType prod, DataCatalog catalog, str[] features=null, str[] products=null, str{} validatedFeatures=null, str{} validatedProducts=null, bool useCache=true) {
New: public bool dcAdditionalProductLoop(DsProductType prod, DataCatalog catalog, time timelimit=time(0)) {
Removed: public bool dcAdditionalProductLoop(DsProductType prod, DataCatalog catalog, time timelimit,
				    str[] features=null, str[] products=null,
				    str{} validatedFeatures=null, str{} validatedProducts=null,
				    bool useCache=true) {

Performance improvements when copy/paste/delete/undo material applications in the Options grid window

Fixed an issue where CET would get stuck when performing copy/paste/delete/undo actions in the material application column in the Options grid window.

The following interfaces have changed in custom.dataCatalog

** class DcDBBuilderEditFeaturesCard**

Old: extend public void triggerUpdate(Option opt) {
New: extend public void triggerUpdate(Option opt, bool synchronize=true) {

custom.dataCatalog.builder

class DcMenuSubWindow

Changed catalogue creator menu bar buttons from CoolGradientDropDownMenuButton to DsButton type for creator facelift.

Old: public CoolGradientDropDownMenuButton fileMenuBtn; 
New: public DsButton fileMenuBtn; 

Old: public CoolGradientDropDownMenuButton editMenuBtn; 
New: public DsButton editMenuBtn; 

Old: public CoolGradientDropDownMenuButton toolsMenuBtn; 
New: public DsButton toolsMenuBtn; 

Old: public DsCoolGradientDropDownMenuButton switchMenuBtn; 
New: public DsButton switchMenuBtn; 

custom.dataCatalog.builder.ui

class DcHelpButton

Added 1 new parameter hoverImage to set button image on hover, added defaults for stdBrush, hoverBrush, mouseDownBrush.

Old: public constructor(Window parent,
		                Window helpDialogParent,
		                Brush stdBrush,
		                Brush hoverBrush,
                        Brush mouseDownBrush,
                        Image helpImage,
                        str helpText,
                        str onlineLink=null,
                        // inherited key arguments
                        Font font=controlFont,
                        FrameStyle frameStyle=noFrame,
                        frame3DState frameState=frameStateUp,
                        pointI pos=(0, 0),
                        sizeI size=sizeI(-1, -1),
                        pointI margins=(6, 4),
                        alignment align=middle,
                        str key=null,
                        str label="",
                        color labelColor=color(0, 0, 0),
                        color pressedLabelColor=color(colorType.none),
                        alignment textSide=undefinedAlignment,
                        Image image=null,
                        Image disabledImage=null,
                        color color=nocolor,
                        function(Control button) callback=null,
                        SrcRef src=#:src)
New: public constructor(Window parent,
                        Window helpDialogParent,
                        str helpText,
                        Brush stdBrush=noBrush,
                        Brush hoverBrush=noBrush,
                        Brush mouseDownBrush=noBrush,
                        Image helpImage=null,
                        str onlineLink=null,
                        // inherited key arguments
                        Font font=controlFont,
                        FrameStyle frameStyle=noFrame,
                        frame3DState frameState=frameStateUp,
                        pointI pos=(0, 0),
                        sizeI size=sizeI(-1, -1),
                        pointI margins=(2, 1),
                        alignment align=middle,
                        str key=null,
                        str label="",
                        color labelColor=color(0, 0, 0),
                        color pressedLabelColor=color(colorType.none),
                        alignment textSide=undefinedAlignment,
                        Image image=null,
                                Image hoverImage=null,
                        Image disabledImage=null,
                        color color=nocolor,
                        function(Control button) callback=null,
                        SrcRef src=#:src)

custom.dataCatalog.builder.core

class dcShrinkWindow.cm

Removed parameters for addHelpButton, dcHelpButton signature has changed.

Old: extend public void addHelpButton(Image helpImage, Image helpIcon=null,
				                      Brush hoverBrush=null,
				                      Brush downBrush=null,
			                          FrameStyle fs=thinCoolButtonFrame)
New: extend public void addHelpButton()

custom.dataCatalog.builder.geometry

class DcDBBuilderGeometryCard

Added new arguments to removePrdExtRefKeys to skip visited products and features when removing External Reference Keys.

Old: final public DcDBBuilderUpdateEnv removePrdExtRefKeys(DsProductType prd, str->str{} etkToBeRemoved, str featureKey=null) {
New: final public DcDBBuilderUpdateEnv removePrdExtRefKeys(DsProductType prd, str->str{} etkToBeRemoved, str featureKey=null, str{} visitedPrds=null, str{} visitedFeats=null) {

class DcPreviewDataSymbol

The following method is modified followed by changes in DataSymbol class.

Old: public void buildConnectors(point{} pos) {
New: public void buildConnectors() {

class DcModularCard

Removed: extend public void buildFilterTextFieldSection()
Removed: extend public void buildIconFilterDD(DcTreeViewModule module, FrameStyle frameStyle=dsRoundedFrame)

custom.dataCatalog.ui.catalogTreeView

The following class methods are removed/modified:

class CatalogTreeView

Removed: extend public bool isTviDropped() {
Removed: extend public void incrTviDropCount(bool force=false) {
Removed: extend public void decrTviDropCount() {

Old: extend public void populateFromFeaturesContainExtRefKey(Object key, CatalogTreeViewEnv env=null) {
New: extend public void populateFromFeaturesContainExtRefKeys(Object key, CatalogTreeViewEnv env=null) {

Old: extend public void populateFromProductsContainExtRefKey(Object key, CatalogTreeViewEnv env=null) {
New: extend public void populateFromProductsContainExtRefKeys(Object key, bool includeFeature=true, CatalogTreeViewEnv env=null) {

Old: extend public bool findExtRefKey(str[] featureKeys, <str, str> key, CatalogTreeViewEnv env, str{} visited=null) {
New: extend public bool findExtRefKeys(str[] featureKeys, str->str{} sourceEKeyMap, CatalogTreeViewEnv env, str{} visited=null

class ExtRefKeyTreeViewItem

Old: extend public void showUses(str usesType) {
New: extend public void showUses(str usesType, str->str{} extRefKeysMap) {