Overview

Autobackups and Autosaves

Autobackups can now be saved to a specific folder and that folder can be changed in CET Control Panel's Data Management tab. If not specified, it defaults to CET Documents/autobackup.

Autosaves are now saved into cmWritable/autosave. In develop mode, cmWritable is in the write folder of your CET Workspace. In build, that is in AppData/Local/CET Data.

Autosave Resources

Resources such as textures, excel worksheets, DWGs, Cm3Ds and CmSyms are now extracted and saved separately from the autosave drawing file. If the same resource has been saved by an earlier autosave, they will NOT be resaved. Resources can be found in cmWritable/externalFormatterResources, with the extension .cmextrs.

The motivation for this is that drawings with a large number of resources will not need to spend too much time autosaving them, since autosaves are done periodically and are the most common form of saving.

DiffToolImageComparator

The image comparator has been moved from cm.test.imageDiffTool to cm.win. Structurally this makes more sense since the actual C++ code to diff is in winApi.cm and it uses MemoryImages which is also in cm.win. This should make the image comparison tool more accessible for other extensions and not just for test extensions.

Floating-point line widths

In the PDF canvas, if the lineWidthStyle of a LineType is not unit, the code sets the minimum width to be 1.

Furthermore, the width of a LineType is an integer, which further prevents width values that are less than 1 and greater than 0 (eg 0.001).

This makes the lines too thick for material handling since the systems can be enormous and users might want to zoom-in on a frame or beam that is small relative to the system.

The changes are adopted from GDICanvas's getPen method, which calculates the scaling and pixel width-to-millimeter conversion factors. Then, these values are used to calculate the actual width of the GDI pen.

For PDF, the same calculations are used to obtain a floating-point width from the integer width field.

Invalid Filename

Filename checking has now been expanded to account for reserved Windows names (eg. COM[0-9]) and invalid end characters (period and space).

See the following for more info: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

Variants Constraints

The previous implementation of spreadsheet in spreadsheet.cm was initally designed to work with products and features (DsBaseExternalRefTypes) as these were the only things initially shown in spreadsheet. Later this spreadsheet class became the base class for materials and other stuff as well, but the naming of the fields and methods together with the logic were left as it is, new subclasses of the spreadsheet would still use the original implications to the data it holds as "Products".

To make the spreadsheet compatible with more data types, a refactoring was done on the spreadsheet. Instead of supporting the DsBaseExternalRefType, it has now been refactored to support DsBaseCodeType, which is the parent class of DsBaseExternalRefType. DsBaseCodeType is also the parent class of other data types, such as DsRuleType (constraints data). This refactoring has allowed the reuse of the spreadsheet in "Constraints" tab within creator to hold and show constraints data, while also maintaining the funtionalities that were previously implemented with the spreadsheet class itself.

cm.abstract.materialHandling.storage.shelving

As part of Abstract Material Handling in CET 14.5, we are introducing some new Abstract Shelving components and some engine adaptations to help develop shelving extensions.

cm.abstract.palette

Palette

Updated the palette tool to work with new schemes. PaletteApplyEnv is now abstract and has group scheme and prop scheme specific subclasses.

cm.core.elevateAnimation

Elevation Tool

A tool has been added under Edit > Elevate (3D only) for changing the elevation of a selection. The elevation can be changed via a property or graphically in the 3D view.

cm.core.photo

It is now possible to lock the positions of all objects in the photolab view. This option can be toggled in the photolab UI and is intended to make it easier to position the camera before rendering.

cm.core.red3D.distributed

The render progress UI has been redesigned to better reflect the ongoing progress during rendering. A "preparing" state has been added to the progress along with the previous "rendering", "done" and "failed" states. The preparing state now reflects the progress of the render job data being packaged and sent to the render server. Additionally, some UI changes have been made to give the UI a new look. The dialog itself has been changed from a dialog window to an application window, allowing it to be stretched and resized.

cm.core.red3D.redView2D

Added a flag to enable autosaves and autobackups to obtain a 2D screenshot of the drawing.

cm.core.settings

Default export location logic has been reworked to make more sense to users, and to remove old confusing logic.

cm.core.ui.removeBackupDialog

Various UI Elements have been removed from the cm/core/ui/removeBackupDialog.cm, since they are no longer relevant now that autosaves and autobackups have been moved to pre-determined folders.

Specifically, the "recursive" checkbox and the "directory" selection field have been removed. Autosaves and autobackups are now saved in a flat file structure by default, so there is no need to remove them by checking all folders recursively from a given parent folder.

cm.core3D.pbrMatProp

Instead of streaming the entire full-resolution texture when saving, we now have the option to simply stream the original texture URL together with a lower resolution version of the texture, resulting in a significantly smaller cmdrw file. If the texture is still present on load, it will be used. If not, the streamed lower res version will be used.

cm.std.photo

The UI for photolab's advanced mode render quality settings have been redesigned. In this effort, many of the fields and functionality previously kept in the LabRenderQualityBox has now been moved into a new class - AdvancedRenderSettingsBox.

cm.std.photo.labBox

Tooltips have been added to most of the photolab post-processing options. Additionally, the help dialog has been updated to reflect some new post-processing options.

custom.flooring.import

Excel import for flooring catalogs was moved to a new Flooring tab in 'Catalogue Creator'. The custom.flooring.import extension has changed parent from custom.flooring => custom.dataCatalog

dll.sqlite

The cm_sqlite.dll dynamic link library has been updated to a more recent version. SQLite Version is now 3.42.0 (2023-05-16), previous version was 3.8.9 (2015-04-08).

With the new version of SQLite we also enabled the SQLite FTS5 extension. For more info see: sqlite.org/fts5.html

Compile Time Changes

Autosave Resources

If you have a subclass of FormatterResource, be sure to implement the following method. It should give a unique string for your resource. Failure to provide a unique key will make newer, different resources overwrite older, existing resources.

New: extend public str uniqueKey() : abstract

Invalid Filename

Old:
public bool isValidPath(str path)
public bool isValidPath(StrBuf buf)

New:
public bool isValidPath(str path) : deprecated
public bool isValidPath(StrBuf buf) : deprecated

Variants Constraints

cm.abstract.dataSymInterface

Constructor argument and class field name for DsiVariantsFeatureProxySubSet were renamed from featurePath to featureCode

// DsiVariantsFeatureProxySubSet (cm/abstract/dataSymInterface/dsiVariants.cm)
Old: public constructor(str featurePath, str[] seq=null)
New: public constructor(str featureCode, str[] seq=null)

Old: public str featurePath
New: public str featureCode

Removed some interfaces related to variants/constraints during optimization, visit dsiVariants.cm for updated implementation. Main reasons for changes are:

  1. Optional Select Features are to be constrained by it's specific option rather than the combinational state of the features. Instead of previously needing to specify FeatureA.codes in {"Option1", "Option2"}, now you would specify conditions on each of the options: FeatureA.Option1.checked = true or FeatureB.Option2.checked = true.
  2. Optional Select Features are now referenced by "feature paths" that describes the specific option of the feature instead of just the feature. Hence the paradigm of having a str->SFeature feature path to Feature map to contain the feature paths is no longer applicable.
  3. Selection state of the data instance (DsPData) is now cached within the instance using constrainedSelPathEnv.
  4. Some constraints interfaces now have a DsiConstraintEnv argument to reuse a preprocessed state for performance reasons.
// DsiVariantsCache (cm/abstract/dataSymInterface/dsiVariants.cm)
Removed: public str->SFeature features
Removed: public str->Object selectedValues
Removed: public VConstraint[] constraints

// DsiVariantsFeatureProxy (cm/abstract/dataSymInterface/dsiVariants.cm)
Removed: public str{} codes
Added: public bool checked

// cm/abstract/dataSymInterface/DsiPData.cm
Old: extend public bool constrainedOption(str featurePath, str option, double value)
New: extend public bool constrainedOption(str featurePath, str option, double value, DsiConstraintEnv constraintEnv=null) 

Old: extend public str[] constrainedOptions(str featurePath)
New: extend public str[] constrainedOptions(str featurePath, DsiConstraintEnv constraintEnv=null) 

Old: extend public Option findFirstUnconstrainedOption(str featurePath)
New: extend public Option findFirstUnconstrainedOption(str featurePath, DsiConstraintEnv constraintEnv=null)

Old: extend public Double findFirstUnconstrainedNumericOptionV(str featurePath)
New: extend public Double findFirstUnconstrainedNumericOptionV(str featurePath, DsiConstraintEnv constraintEnv=null)

Removed: extend public bool constrainedOptionalValue(str featurePath, str option, bool check)
Removed: extend public bool constrainedOptionalCheck(str featurePath, str{} newSelected=null)
Added:  extend public bool constrainedOptionalValue(str featurePath, bool checked, DsiConstraintEnv constraintEnv=null)

// cm/abstract/dataSymInterface/dsiVariants.cm
Old: public str[] dsiVariantsConstraintIds(str s)
New: public str[] dsiVariantsConstraintFeaturePaths(str s)

Removed: public str->SFeature dsiVariantsFeatures(DsiPData data)
Removed: public str->SFeature dsiVariantsFeatures(DsiPData data, str featurePath)
Removed: public str->Object dsiVariantsSelectedValues(DsiPData data)
Removed: public VConstraint[] dsiVariantsConstraints(DsiPData data, str featurePath, str->SFeature features)
Removed: public VariantsSpan dsiVariantsSpan(DsiPData data, str->SFeature features, VConstraint[] constraints)
Removed: public Object[] dsiVariantsSpanValues(DsiPData data, str featurePath, str option, double value, str->SFeature features, str->Object selectedValues, VariantsSpan variantsSpan)
Removed: public Object[] dsiVariantsSpanValues(DsiPData data, str->SFeature features, str->Object selectedValues, VariantsSpan variantsSpan)
Removed: public Object[] dsiVariantsReplaceSpanValue(Object[] spanValues, str featurePath, str option, double value, VariantsSpan variantsSpan) 

Debug flags for catalog constraints have been removed. Constraints now should be enabled via Catalog Creator for each catalog ("Enable constraints (BETA)").

// cm/abstract/dataSymInterface/header.cm
Removed: public bool dsiEnableConstraints
Removed: public bool dsiEnableVariants
Removed: public void enableDsiConstraints(bool v)
Removed: public bool getDsiConstraintsEnabled()
Removed: public void enableDsiVariantsTables(bool v)
Removed: public bool getDsiVariantsTablesEnabled()

cm.abstract.dataSymbol

Some public interfaces from DsPData are moved to DsiPData

// DsPData (cm/abstract/dataSymbol/dsPData.cm)
Old : public str{} unresolvedConstrainedFP: copy=null, stream=null;
Moved to:  DsiPData (cm/abstract/dataSymInterface\dsiPData.cm)

Old: extend public bool applyConstraintRules()
New: public bool applyConstraintRules()
Method declaration moved to DsiPData (cm/abstract/dataSymInterface\dsiPData.cm)

Old: extend public bool isUnresolvedConstrainedFeaturePath(str featurePath)
Moved to DsiPData (cm/abstract/dataSymInterface\dsiPData.cm)

custom.dataCatalog.builder

Some public interfaces were changed to package/private.

// custom/dataCatalog/builder/variantsTables/dcVariantsTableCard.cm
Old: extend public void recordUndoOp(DcUndoOp op)
New: final package void recordUndoOp(DcUndoOp op)

// custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsGridWindow.cm
Old: extend public bool acceptAll(DcGridWindowColumn column, DsRuleType rule)
New: final private bool acceptAll(DcGridWindowColumn column, DsRuleType rule)

Old: extend public bool acceptAny(DcGridWindowColumn column, DsRuleType rule)
New: final private bool acceptAny(DcGridWindowColumn column, DsRuleType rule)

// custom/dataCatalog/builder/dataImport/excel/dcExcelImportDialog.cm
Old: extend public void setSelectionView(DcExcelSelectionView view)
New: extend public void setSelectionView(DcExcelSelectionView view)

Old: extend public bool handleEvent(str key|, str msg=null, Object value=null)
New: final package bool handleEvent(str key|, str msg=null, Object value=null)

Old: extend public bool importBtnEvent(str msg=null, Object value=null)
New: final package bool importBtnEvent(str msg=null, Object value=null)

Old: extend public bool cancelBtnEvent(str msg=null, Object value=null)
New: final package bool cancelBtnEvent(str msg=null, Object value=null)

// custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsShrink.cm
Old: extend public void setOutput(str error)
New: extend package void setOutputError(str error)

DcExcelImportEnvG1 now uses a list of tuples for storing the imported tables.

// custom/dataCatalog/builder/dataImport/excel/dcExcelImportEnv.cm
Old: public DsTableType[] tables
New: public <str, str, DsTableType>[] tables

DcDBBuilderSpreadsheet append column method now accepts repaint argument.

// DcDBBuilderSpreadsheet (custom/dataCatalog/builder/ui/spreadsheet/spreadsheet.cm)
Old: extend public void appendColumn(DcSpreadsheetColumn col)
New: extend public void appendColumn(DcSpreadsheetColumn col, bool repaint=true)

All classes that extends from the below classes requires refactoring as well.

Spreadsheet

custom.dataCatalog.builder.ui.spreadsheet

Change class field and method name and method arguments for : DcDBBuilderSpreadsheet

//DcDBBuilderSpreadsheet
(custom/dataCatalog/builder/ui/spreadsheet/spreadsheet.cm)

Old: public <str, bool>[] allProducts();
New: public <str, bool>[] allData();

Old: extend public str[] productKeys(bool visibleOnly=false)
New: extend public str[] dataKeys(bool visibleOnly=false)

Old: extend public DsBaseExternalRefType rowData(int row) : abstract
New: extend public DsBaseCodeType rowData(int row) : abstract

Old: extend public DsBaseExternalRefType getProduct(str pCode) : abstract
New: extend public DsBaseCodeType getData(str dataCode) : abstract

Old: extend public void productCodeChange(str from, str to)
New: extend public void dataCodeChange(str from, str to)

Old: extend public void productCodeChanged(str from, str to)
New: extend public void dataCodeChanged(str from, str to)

Old: extend public void productCodeChanged(str from, str to, PointI pos=null)
New: extend public void dataCodeChanged(str from, str to, PointI pos=null)

Old: extend public void pasteProductCodeChanged(str from, str to)
New: extend public void pasteDataCodeChanged(str from, str to)

Old: extend public void createProduct(str code, str cloneFrom=null, bool update=true)
New: extend public void createData(str code, str cloneFrom=null, bool update=true)

Old: extend public void removeProduct(str code)
New: extend public void removeData(str code)

Old: extend public DcUndoOp changeProductCodeUndoOp(str oldCode, str newCode)
New: extend public DcUndoOp changeDataCodeUndoOp(str oldCode, str newCode)

Old: extend public void changeProductCode(str oldCode, str newCode)
New: extend public void changeDataCode(str oldCode, str newCode)

Old: extend public DcDBBuilderUpdateEnv productCodeChangeEnv(str oldCode, str newCode)
New: extend public DcDBBuilderUpdateEnv dataCodeChangeEnv(str oldCode, str newCode)

Old: extend public void showProduct(str code, bool allowRemoveFilters=true)
New: extend public void showData(str code, bool allowRemoveFilters=true)

Old: extend public DsBaseExternalRefType createNewProduct(str code, str cloneFrom) : abstract
New: extend public DsBaseCodeType createNewData(str code, str cloneFrom) : abstract

Old: extend public void putInCatalog(DsBaseExternalRefType prod, bool update=true) : abstract
New: extend public void putInCatalog(DsBaseCodeType data, bool update=true) : abstract

Old: extend public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true) : abstract
New: extend public void removeFromCatalog(DsBaseCodeType data, bool update=true) : abstract

Old: extend public Int indexInCatalog(DsBaseExternalRefType prod) : abstract
New: extend public Int indexInCatalog(DsBaseCodeType data) : abstract

Old: extend public void resetProductVisibility()
New: extend public void resetDataVisibility()

Old: extend public str tmpProductCode(str productCode)
New: extend public str tmpDataCode(str dataCode)

Old: extend public str productCode(str productCode)
New: extend public str dataCode(str dataCode)

Old: extend public <DsBaseExternalRefType, int> dropDownOwnerLoc(int x, int y)
New: extend public <DsBaseCodeType, int> dropDownOwnerLoc(int x, int y)

Old: extend public void recordMoveDuplicatedProductRowOperation(str code, int fromR, int toR)
New: extend public void recordMoveDuplicatedDataRowOperation(str code, int fromR, int toR)

Old: extend public void moveDuplicatedProductRowPostcondition(int fromR, int toR)
New: extend public void moveDuplicatedDataRowPostcondition(int fromR, int toR)

custom.dataCatalog.builder.utility

Change method and argument names for : DcAnonymousFilesGridWindow

//DcAnonymousFilesGridWindow
(custom/dataCatalog/builder/utility/dcAnonymousFilesGridWindow.cm)

Old: public DsBaseExternalRefType getProduct(str pCode)
New: public DsBaseExternalRefType getData(str pCode)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

custom.dataCatalog.builder.productType

Change method name and arguments for : DcDBBuilderProductSS

//DcDBBuilderProductSS
(custom/dataCatalog/builder/productType/dcDBBuilderProductSS.cm)

Old: public DsProductType getProduct(str pCode)
New: public DsProductType getData(str pCode)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void removeProduct(str code)
New: public void removeData(str code)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

Old: public void changeProductCode(str from, str to)
New: public void changeDataCode(str from, str to)

Old: public void recordMoveDuplicatedProductRowOperation(str code, int fromR, int toR)
New: public void recordMoveDuplicatedDataRowOperation(str code, int fromR, int toR)

custom.dataCatalog.builder.productCatalog

Change method name and arguments for : DcDBBuilderTOCSpreadsheet

//DcDBBuilderTOCSpreadsheet
(custom/dataCatalog/builder/productCatalog/dcTOCSpreadsheet.cm)

Old: public DsBaseExternalRefType getProduct(str code)
New: public DsBaseExternalRefType getData(str code)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

custom.dataCatalog.builder.layouts

Change method names and arguments for : DcLayoutsGridWindow

//DcLayoutsGridWindow
(custom/dataCatalog/builder/layouts/layoutCard.cm)

Old: public DsBaseExternalRefType getProduct(str pCode)
New: public DsBaseExternalRefType getData(str pCode)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

custom.dataCatalog.builder.materials

Change method names and arguments for : DcDBBuilderMaterialsSS

//DcDBBuilderMaterialsSS
(custom/dataCatalog/builder/materials/dcDBBuilderMaterialsGridWindow.cm)

Old: public DsBaseExternalRefType getProduct(str mCode)
New: public DsBaseExternalRefType getData(str mCode)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

Old: public void changeProductCode(str from, str to)
New: public void changeDataCode(str from, str to)

Old: public void recordMoveDuplicatedProductRowOperation(str code, int fromR, int toR)
New: public void recordMoveDuplicatedDataRowOperation(str code, int fromR, int toR)

custom.dataCatalog.builder.features

Change method names and arguments for : DcFeaturesGridWindow

//DcFeaturesGridWindow
(custom/dataCatalog/builder/features/dcFeaturesGridWindow.cm)

Old: public DsProductType getProduct(str fKey)
New: public DsProductType getData(str fKey)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void createProduct(str fKey, str cloneFrom=null, bool update=true)
New: public void createData(str fKey, str cloneFrom=null, bool update=true)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType prod)

Old: public void changeProductCode(str from, str to)
New: public void changeDataCode(str from, str to)

Old: public void moveDuplicatedProductRowPostcondition(int fromR, int toR)
New: public void moveDuplicatedDataRowPostcondition(int fromR, int toR)

Change method names and arguments for : DcOptionsGridWindow

//DcOptionsGridWindow
(custom/dataCatalog/builder/features/dcOptionsGridWindow.cm)

Old: public DsProductType getProduct(str optKey)
New: public DsProductType getData(str optKey)

Old: public void productCodeChange(str from, str to)
New: public void dataCodeChange(str from, str to)

Old: public void productCodeChanged(str from, str to)
New: public void dataCodeChanged(str from, str to)

Old: public DcDBBuilderUpdateEnv productCodeChangeEnv(str oldCode, str newCode)
New: public DcDBBuilderUpdateEnv dataCodeChangeEnv(str oldCode, str newCode)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsBaseExternalRefType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType prod, bool update=true)

Old: public void pasteProductCodeChanged(str from, str to)
New: public void pasteDataCodeChanged(str from, str to)

Old: public void createProduct(str code, str cloneFrom=null, bool update=true)
New: public void createData(str code, str cloneFrom=null, bool update=true)

Old: public void removeProduct(str code)
New: public void removeData(str code)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType prod, bool update=true)

Old: public DcUndoOp changeProductCodeUndoOp(str oldCode, str newCode)
New: public DcUndoOp changeDataCodeUndoOp(str oldCode, str newCode)

Old: public void changeProductCode(str oldCode, str newCode)
New: public void changeDataCode(str oldCode, str newCode)

Old: public void moveDuplicatedProductRowPostcondition(int fromR, int toR)
New: public void moveDuplicatedDataRowPostcondition(int fromR, int toR)

custom.dataCatalog.builder.constraints

Change method names and arguments for : DcDBBuilderConstraintsSpreadsheet. Some methods were also removed in favour of using the parent spreadsheet's interfaces to perform the same behaviours.

Removed: extend public DsRuleType[] data()

Removed: extend public DsRuleType[] data=(DsRuleType[] data)

Old: public DsBaseExternalRefType createNewProduct(str code, str cloneFrom)
New: public DsRuleType createNewData(str code, str cloneFrom)

Old: public void putInCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void putInCatalog(DsBaseCodeType rule, bool update=true)

Old: public void removeFromCatalog(DsBaseExternalRefType prod, bool update=true)
New: public void removeFromCatalog(DsBaseCodeType rule, bool update=true)

Old: public Int indexInCatalog(DsBaseExternalRefType prod)
New: public Int indexInCatalog(DsBaseCodeType rule)

Old: public DsBaseExternalRefType getProduct(str pCode)
New: public DsRuleType getData(str dataCode)

Removed: public void productCodeChanged(str from, str to, PointI pos=null)

Removed: public bool resolveDuplicateCode(str& newCode, str oldCode)

Removed: extend public void completeSortList()

Removed: public void sortColumn(int i, bool reverseSort=false)

Removed: extend public int remSortList(str code)

Removed: extend public void build()

Removed: public void rebuild()

Removed: extend public void updateColumns()

Removed: extend public void buildColumns()

Removed: public void appendFillerRows()

Removed: public void appendBlankRowOfCells()

Removed: public void recordFilterUndoOp(int col, DcGridWindowFilter[] oldFilters, DcGridWindowFilter[] newFilters, bool[] oldFilterList, bool[] newFilterList, bool endRecord=true)

Removed: public void filter(bool repaint=true)

Removed: extend public DsRuleType[] filter(DsRuleType[] rules)

Removed: public int dataCount()

Removed: public int filteredDataCount()

Removed: public void createRowFromData(int row)

Removed: public DcGridWindowColumn getColumn(int columnIndex)

Removed: extend public void deleteCell(int col, int row)

Removed: public void release(pointI p)

Removed: public void showColumnDropDown(int col, pointI p=(0, 0))

Removed: public bool removeFiltersBtnClicked(pointI p)

Cells

custom.dataCatalog.builder.ui.spreadsheet

Change constructor arguments, class field data types and names for : DcDBBuilderSpreadsheetCell

//DcDBBuilderSpreadsheetCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public DsBaseExternalRefType product;
New: public DsBaseCodeType data;

Old: public constructor(DsBaseExternalRefType product)
New: public constructor(DsBaseCodeType data)

Old: public constructor(DsBaseExternalRefType product, bool spaceHighlight)
New: public constructor(DsBaseCodeType data, bool spaceHighlight)

Removed: public constructor(DsBaseCodeType codeType=null)

Old: extend public bool setCellData(DcDBBuilderSpreadsheet gridWindow, DcGridCell cell, str data)
New: extend public bool setCellData(DcDBBuilderSpreadsheet gridWindow, DcGridCell cell, str newData)

Change constructor arguments and method argument names for : PrdCodeCell

//PrdCodeCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p)
New: public constructor(DsBaseCodeType p)

Old: public constructor(DsBaseExternalRefType p, bool spaceHighlight=false)
New: public constructor(DsBaseCodeType p, bool spaceHighlight=false)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method argument names for : PrdDescCell

//PrdDescCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p, str l)
New: public constructor(DsBaseCodeType p, str l)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcProductRootParentCell

//DcProductRootParentCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : PrdVendorCell

//PrdVendorCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method argument names for : PrdPriceCell

//PrdPriceCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p, str id)
New: public constructor(DsBaseCodeType p, str id)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments for : PrdExtRefCell

//PrdExtRefCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p, UsageType ut)
New: public constructor(DsBaseCodeType p, UsageType ut)

Change method argument names for : PrdFeatureCell

//PrdFeatureCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcPrdVariantsTablesCell

//DcPrdVariantsTablesCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcPrdConstraintTablesCell

//DcPrdConstraintTablesCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcPrdConstraintCell

//DcPrdConstraintCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcDefaultOptionRefCell

//DcDefaultOptionRefCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method argument names for : DcMirrorProductRefCell

//DcMirrorProductRefCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: extend public bool clearOldMirrorProductRefs(DcMirrorProductRefCell cell, str data, DcDBBuilderSpreadsheet ss)
New: extend public bool clearOldMirrorProductRefs(DcMirrorProductRefCell cell, str string, DcDBBuilderSpreadsheet ss)

Old: extend public bool updateReciprocalMirrorProductRefs(DcMirrorProductRefCell cell, str data, DcDBBuilderSpreadsheet ss)
New: extend public bool updateReciprocalMirrorProductRefs(DcMirrorProductRefCell cell, str s, DcDBBuilderSpreadsheet ss)

Change constructor arguments and method argument names for : DcMirrorAngleOfSymmetryCell

//DcMirrorAngleOfSymmetryCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p) 
New: public constructor(DsBaseCodeType p)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments for : MaterialPreviewCell

//MaterialPreviewCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public constructor(DsBaseExternalRefType p) 
New: public constructor(DsBaseCodeType p)

Change method argument names for : DcExpandCollapseCell

//DcExpandCollapseCell
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

custom.dataCatalog.builder.utility

Change method argument names for : DcAddBooleanCell

//DcAddBooleanCell
(custom/dataCatalog/builder/utility/dcUtilityCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

custom.dataCatalog.builder.productType

Change constructor arguments and method arguments for : PrdPriceCell

//PrdPriceCell
(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public constructor(DsBaseExternalRefType prod, str priceListRef, str optionPriceCode)
New: public constructor(DsBaseCodeType prod, str priceListRef, str optionPriceCode)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method arguments for : PrdPkgCountCell, PrdOmitCell, PrdOmitPNCell, PrdDisableStyleNrLookupCell, PrdIndTagCell, PrdIndTagCategoryCell, PrdLeadtimeProgramRefCell, PrdCategoryCell, PrdModelsCell, PrdMtrlAppCell, PrdConnectorsCell, PrdPropertyVisibilityCell, PrdTagPlacementCell

(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : PrdMeasurementCell

//PrdMeasurementCell
(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public constructor(DsBaseExternalRefType prod, dsMeasurementType mType, str unit, str system)
New: public constructor(DsBaseCodeType prod, dsMeasurementType mType, str unit, str system)

Old: public constructor(DsBaseExternalRefType prod, str mTypeS, str unit, str system)
New: public constructor(DsBaseCodeType prod, str mTypeS, str unit, str system)

Old: public bool validateData(str data) 
New: public bool validateData(str newData)

Old: extend public str cleanData(str data)
New: extend public str cleanData(str dataStr)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method arguments for : DcPrdAddProductCell

//DcPrdAddProductCell
(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: extend public DsiAddProductRefType[] getAddProducts(str data)
New: extend public DsiAddProductRefType[] getAddProducts(str addData)

Change constructor arguments and method arguments for : PrdPreviewUrlCell

//PrdPreviewUrlCell
(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public constructor(DsBaseExternalRefType p)
New: public constructor(DsBaseCodeType p)

Old: public bool validateData(str data)
New: public bool validateData(str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : PrdSIFClassCell

//PrdSIFClassCell
(custom/dataCatalog/builder/productType/dcProductCells.cm)

Old: public constructor(DsBaseExternalRefType p, str tag)
New: public constructor(DsBaseCodeType p, str tag)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

custom.dataCatalog.builder.productCatalog

Change method argument names for : DcProductCatalogCell

//DcProductCatalogCell
(custom/dataCatalog/builder/productCatalog/dcProductCatalogCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public void drawText(PixelDevice dc, GridWindow gw, rectI r, rectI clip, int x, int y, str data)
New: public void drawText(PixelDevice dc, GridWindow gw, rectI r, rectI clip, int x, int y, str txt)

Change method argument names for : DcProductLevelCodeCell, DcProductLevelUILevelCell, DcMultiplierCell, DcCurrencyRoundingCell

(custom/dataCatalog/builder/productCatalog/dcProductCatalogCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : DcProductCatalogUnitCell

//DcProductCatalogUnitCell
(custom/dataCatalog/builder/productCatalog/dcProductCatalogCells.cm)

Old: public constructor(DsBaseExternalRefType product, SubSet subset=null, double stepLength=1, bool useStepButton=true)
New: public constructor(DsBaseCodeType product, SubSet subset=null, double stepLength=1, bool useStepButton=true)

Change method argument names for : DcProductLevelDescCell

//DcProductLevelDescCell
(custom/dataCatalog/builder/productCatalog/dcProductCatalogCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

custom.dataCatalog.builder.layouts

Change method argument names for : DcLayoutGrpKeyCell, DcLayoutTagsCell

(custom/dataCatalog/builder/layouts/layoutCard.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

custom.dataCatalog.builder.materials

Change constructor arguments and method arguments for : MaterialPreviewUrlCell

//MaterialPreviewUrlCell
(custom/dataCatalog/builder/materials/dcMaterialColumns.cm)

Old: public constructor(DsBaseExternalRefType p)
New: public constructor(DsBaseCodeType p)

Old: public bool validateData(str data)
New: public bool validateData(str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : MaterialExtRefCell

//MaterialExtRefCell
(custom/dataCatalog/builder/materials/dcMaterialColumns.cm)

Old: public constructor(DsBaseExternalRefType p, UsageType ut, bool showRes)
New: public constructor(DsBaseCodeType p, UsageType ut, bool showRes)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

custom.dataCatalog.builder.features

Change method argument names for : DcShowOptionsCell

//DcShowOptionsCell
(custom/dataCatalog/builder/features/dcFeaturesGridWindow.cm)

Old: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str data)
New: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str txt)

Change method argument names for : FeatDescCell, FeatGroupCodeCell, FeatFunctionalCell, FeatSkuCell, FeatOmitOnOrderCell, FeatNumericCell, FeatLayersCell, FeatVendorCell, FeatDecimalCell, FeatPropertyVisibilityCell, FeatSyncOptionDirCell

(custom/dataCatalog/builder/features/dcFeatureCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : FeatBooleanCell

//FeatBooleanCell
(custom/dataCatalog/builder/features/dcFeatureCells.cm)

Old: public constructor(DsBaseExternalRefType p, function(DcFeaturesGridWindow, FeatBooleanCell, int, int) callback=null)
New: public constructor(DsBaseCodeType p, function(DcFeaturesGridWindow, FeatBooleanCell, int, int) callback=null)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method arguments for : FeatDefaultOptionCell, FeatSyncGroupIdCell, FeatInvOptsVisibilityCell

//FeatDefaultOptionCell
(custom/dataCatalog/builder/features/dcFeatureCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str data)
New: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str txt)

Change constructor and method arguments for : FeatDelimiterCell

//FeatDelimiterCell
(custom/dataCatalog/builder/features/dcFeatureCells.cm)

Removed: public constructor(DsBaseExternalRefType p)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method arguments for : FeatMultiSelectionCell, FeatOptionalSelectionCell

(custom/dataCatalog/builder/features/dcFeatureCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Change method arguments for : OptCodeCell, OptOptionalNoCodeCell, OptDescCell, OptPriceCell, OptSkuCell, OptUndefinedCell, OptFeatureCell, OptionRangeEnumCell, OptNumericSkuCell

(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : OptPriceCodeCell

//OptPriceCodeCell
(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public constructor(DsBaseExternalRefType prod, str priceListRef)
New: public constructor(DsBaseCodeType prod, str priceListRef)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change method arguments for : OptLeadtimeCell, DcOptAddProductCell

(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Change method arguments for : OptionextRefKeyCell

(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : OptionRangeCell

//OptionRangeCell
(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public constructor(DsBaseExternalRefType product)
New: public constructor(DsBaseCodeType p)

Old: public bool setCellData(DcDBBuilderSpreadsheet gridWindow, DcGridCell cell, str data)
New: public bool setCellData(DcDBBuilderSpreadsheet gridWindow, DcGridCell cell, str newData)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: extend public bool addRange(Option product, DcOptionRangeCellEnv env, int x, int y, Double data)
New: extend public bool addRange(Option opt, DcOptionRangeCellEnv env, int x, int y, Double newData)

Change constructor arguments and method arguments for : OptionMtrlAppCell

//OptionMtrlAppCell
(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public constructor(DsBaseExternalRefType p, SFeature parentFeature)
New: public constructor(DsBaseCodeType p, SFeature parentFeature)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : OptDelimiterCell

//OptDelimiterCell 
(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public constructor(DsBaseExternalRefType p)
New: public constructor(DsBaseCodeType p)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change constructor arguments and method arguments for : OptMirrorRefCell

//OptMirrorRefCell
(custom/dataCatalog/builder/features/dcOptionCells.cm)

Old: public constructor(DsBaseExternalRefType p)
New: public constructor(DsBaseCodeType p)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: extend public bool clearOldMirrorOptionRefs(OptMirrorRefCell cell, str data, DcDBBuilderSpreadsheet ss)
New: extend public bool clearOldMirrorOptionRefs(OptMirrorRefCell cell, str string, DcDBBuilderSpreadsheet ss)

Old: extend public bool updateReciprocalMirrorOptionRefs(OptMirrorRefCell cell, str data, DcDBBuilderSpreadsheet ss)
New: extend public bool updateReciprocalMirrorOptionRefs(OptMirrorRefCell cell, str string, DcDBBuilderSpreadsheet ss)

custom.dataCatalog.builder.constraints

Moved column classes into a new file custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsColumns.cm and set their scopes to package.

(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Removed: public class DcConstraintSSColumn extends DcSpreadsheetColumn

Removed: public class DcSpreadsheetConstraintColumnLabel extends DcSpreadsheetColumnLabel

Removed: public class DcConstraintExpSSColumn extends DcConstraintSSColumn

Removed: public class DcConstraintCodeSSColumn extends DcConstraintSSColumn

Removed: public class DcConstraintVendorSSColumn extends DcConstraintSSColumn

Removed: public class DcConstraintExpTypeSSColumn extends DcConstraintSSColumn

Changed scope of classes to package

(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Old: public class DcConstraintSSGridCell extends DcDBBuilderSpreadsheetCell
New: package class DcConstraintSSGridCell extends DcDBBuilderSpreadsheetCell

Old: public class DcConstraintExpSSGridCell extends DcConstraintSSGridCell
New: package class DcConstraintExpSSGridCell extends DcConstraintSSGridCell

Old: public class DcConstraintCodeSSGridCell extends DcConstraintSSGridCell
New: package class DcConstraintCodeSSGridCell extends DcConstraintSSGridCell

Old: public class DcConstraintVendorSSGridCell extends DcConstraintSSGridCell
New: package class DcConstraintVendorSSGridCell extends DcConstraintSSGridCell

Old: public class DcConstraintExpTypeSSGridCell extends DcConstraintSSGridCell
New: package class DcConstraintExpTypeSSGridCell extends DcConstraintSSGridCell

Change methods for : DcConstraintSSGridCell

//DcConstraintSSGridCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Removed: extend public DsRuleType rule=(DsRuleType r)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Removed: extend public bool synchronizeRule(int row)

Removed: public bool close(GridWindow gw, bool canceled)

Removed: extend public void recordNewRule(DsRuleType rule, int col=0)

Change methods for : DcConstraintExpSSGridCell

//DcConstraintExpSSGridCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change methods for : DcEditConstraintCell

//DcEditConstraintCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Old: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str data)
New: public bool draw(PixelDevice dc, GridWindow gw, rectI r, int x, int y, str newData)

Change constructor and methods for : DcConstraintCodeSSGridCell

//DcConstraintCodeSSGridCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Removed: extend public str makeValidCode(str code)

Removed: extend public void recordCodeChange(DsRuleType rule, str oldCode)

Change methods for : DcConstraintVendorSSGridCell

//DcConstraintVendorSSGridCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Change methods for : DcConstraintExpTypeSSGridCell

//DcConstraintExpTypeSSGridCell
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCells.cm)

Old: public bool setData(int x, int y, str data)
New: public bool setData(int x, int y, str newData)

Old: public bool undoableSetData(DcGridWindow gw, int x, int y, str data)
New: public bool undoableSetData(DcGridWindow gw, int x, int y, str newData)

Columns

custom.dataCatalog.builder.ui.spreadsheet

Change method arguments and argument names for : DcSpreadsheetColumn

//DcSpreadsheetColumn
(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetColumns.cm)

Old: extend public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: extend public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

Old: extend public void sort(<str, bool>[] allProducts, DcSSSortArgs args)
New: extend public void sort(<str, bool>[] allData, DcSSSortArgs args)

Change method arguments for : DcPrdVendorColumn, DcPrdDescColumn, DcPrdDescColumn, DcPrdPriceColumn, DcPrdFeatureColumn, DcPrdVariantsTablesColumn, DcPrdConstraintTablesColumn, DcPrdConstraintColumn, DcDefaultOptionRefColumn, DcProductRootParentColumn, DcMaterialCodeColumn, DcMaterialPreviewColumn, DcMaterialDescriptionColumn, DcMirrorProductRefColumn, DcMirrorAngleOfSymmetryColumn,

(custom/dataCatalog/builder/ui/spreadsheet/dcSpreadsheetColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.utility

Change method arguments for : DcAddColumn

//DcAddColumn
(custom/dataCatalog/builder/utility/dcUtilityColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

Change method argument type for : DcAnonymousFile

//DcAnonymousFile
(custom/dataCatalog/builder/utility/dcUtilityColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.productType

Change method arguments for : DcPrdPkgCountColumn, DcPrdOmitColumn, DcPrdOmitPNColumn, DcPrdDisableStyleNrLookupColumn, DcPrdIndTagColumn, DcPrdIndTagCategoryColumn, DcPrdLeadtimeProgColumn, DcPrdCategoryColumn, DcPrdPriceCodeColumn, DcPrdMeasurementColumn, DcPrdModelsColumn, DcPrdAddProductsColumn, DcPrdPreviewUrlColumn, DcPrdSIFClassColumn, DcPrdMtrlAppColumn, DcPrdConnectorsColumn, DcPrdPropertyVisibilityColumn, DcPrdTagPlacementColumn

(custom/dataCatalog/builder/productType/dcProductColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.productCatalog

Change method arguments for : DcPrdLvlCodeColumn, DcMultiplierColumn, DcUILevelColumn, DcCurrencyRoundingColumn, DcProductLevelDescColumn

(custom/dataCatalog/builder/productCatalog/dcProductCatalogColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.layouts

Change method arguments for : DcLayoutCodeColumn, DcLayoutKeyColumn, DcLayoutGrpKeyColumn, DcLayoutPrdCodeColumn, DcLayoutTagsColumn

(custom/dataCatalog/builder/layouts/layoutCard.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.materials

Change method arguments for : DcMaterialExtRefColumn, DcMaterialPreviewUrlColumn

(custom/dataCatalog/builder/materials/dcMaterialColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

custom.dataCatalog.builder.features

Change method arguments for : DcShowOptionsColumn

//DcShowOptionsColumn
(custom/dataCatalog/builder/features/dcFeaturesGridWindow.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

Change method arguments for : DcFeatCodeColumn, DcFeatDefaultOptionColumn, DcFeatSimilarColumn, DcFeatGroupCodeColumn, DcFeatFunctionalColumn, DcFeatSkuColumn, DcFeatMultiSelectionColumn, DcFeatOptionalSelectionColumn, DcFeatOmitOnOrderColumn, DcFeatNumericColumn, DcFeatLayersColumn, DcFeatDescColumn, DcFeatVendorColumn, DcFeatDecimalColumn, DcFeatDelimiterColumn, DcFeatInvOptsVisibilityColumn, DcFeatPropertyVisibilityColumn, DcFeatSyncGroupIdColumn, DcFeatSyncOptionDirColumn

(custom/dataCatalog/builder/features/dcFeatureColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

Change method arguments for : DcOptCodeColumn, DcOptOptionalNoCodeColumn, DcOptLeadtimeColumn, DcOptPriceColumn, DcOptPriceCodeColumn, DcOptSkuColumn, DcOptUndefinedColumn, DcOptDescColumn, DcOptFeatureColumn, DcOptDelimiterColumn, DcOptNumericSkuColumn, DcOptExtRefKeyColumn, DcOptMtrlAppColumn, DcOptModelsColumn, DcOptAddProductsColumn, DcOptRangeMinColumn, DcOptRangeMaxColumn, DcOptRangeStepColumn, DcOptDiscreteNumsColumn, DcOptRangeExpandColumn, DcOptMirrorRefColumn

(custom/dataCatalog/builder/features/dcOptionColumns.cm)

Old: public DcDBBuilderSpreadsheetCell makeCell(DsBaseExternalRefType p)
New: public DcDBBuilderSpreadsheetCell makeCell(DsBaseCodeType p)

Undo Operations

custom.dataCatalog.builder.undo

Change class field type, constructor arguments type for : DcSpreadsheetAddUndoOp

//DcSpreadsheetAddUndoOp
(custom/dataCatalog/builder/undo/dcCodeChangeUndoOps.cm)

Old: public DsBaseExternalRefType product;
New: public DsBaseCodeType product;

Old: public constructor(DialogWindow dialog, DsBaseExternalRefType product, DcDBBuilderSpreadsheet ss, int index, int sortValue)
New: public constructor(DialogWindow dialog, DsBaseCodeType product, DcDBBuilderSpreadsheet ss, int index, int sortValue)

Constraints

custom.dataCatalog.builder.constraints

Change methods for : DcDBBuilderConstraintsCard

//DcDBBuilderConstraintsCard
(custom/dataCatalog/builder/constraints/dcDBBuilderConstraintsCard.cm)

Old: extend public void startEdit(DsRuleType selectedConstraint, bool ignoreUndo=false)
New: extend public void startEdit(str constraintCode, bool ignoreUndo=false)

Removed: extend public void recordNewRule(DsRuleType rule)

Remove undo operation classes

(custom/dataCatalog/builder/constraints/dcDBuilderConstraintsUndoOps.cm)

Removed: public class DcCodeChangeConstraintUndoOp extends DcConstraintUndoOp

Removed: public class DcTypeChangeConstraintUndoOp extends DcConstraintUndoOp

Removed: public class DcExpChangeConstraintUndoOp extends DcConstraintUndoOp

Removed: public class DcConstraintFilterUndoOp extends DcFilterUndoOp

Removed: public class DcConstraintSortUndoOp extends DcConstraintUndoOp

cm.abstract

General Accessory System

Added new helper functions for getting values from accessories like the AccEnv that made it, the Location key, and whether it's an auto accessory. See bottom of accessoryEnv.cm

Deprecated the following classes. SelectAccessoryVessel, AccessoryLocationSelectionVessel

AccessoryGenerationBehavior

AccessoryGenerationBehavior no longer has a owner field. This was changed to be more memory efficient by allowing the behavior to act as a singleton. All methods that referenced this field were changed to take in the owner parameter instead. New methods were added to get the owner from an accessory as well.

AccessoryGenerationBehavior now extends PropObj instead of CoreObject.

generateAutoAccessories() now will remove unneeded accessories before it gathers neighbor accessories to prevent the system from removing accessories from the owner.

removeAutoAccessories() has been moved to AccessoryEnv class.

AccessoryLocation

AccessoryLocation now extends SnapAlternative instead of CoreObject. By extending SnapAlternative we can better support child snappers and a more traditional snapper insert process. This also gives some basis for generating locations from existing connectors.

Replace AccessoryLocation references with SnapAlternative.

AccessoryLocation now has an owner field to get reference to the Object that made the location.

Renamed the following fields '''cm Old : public str{} acceptedTypes; New : public str{} filter;

Old : public int priority; New : public int sortPriority; '''

AccessoryEnv

AccessoryEnv now extends PropObj instead of CoreObject.

Added an abstract method for getting an accessory's owner. '''cm public CoreObject getAccOwner(CoreObject acc). '''

Added an abstract method for updating an accessory. '''cm public bool updateAccessory(CoreObject owner, AccGenBehavior behavior, CoreObject acc, SnapAlternative loc) '''

Moved the removeAllAccessories() to the AccessoryGenerationBehavior.

Removed the accessoryKey() method. This logic should be handled in an implementation of updateAccessory().

isManagedAccessory() now also checks whether the accessory's owner matches the current owner we are working with.

handleLocation() now only calls checkForConflicts() if the accessory is successfully updated (returns true from updateAccessory()).

Renamed prop keys '''cm Old public const str cAccEnvKey = "accEnv"; public const str cAccLocKey = "accLoc"; public const str cAccAutoKey = "accAuto"; public const str cAccTypeKey = "accType";

New public const str cAccEnvPK = "accEnv"; public const str cAccLocPK = "accLoc"; public const str cAccAutoPK = "accAuto"; public const str cAccInsertPK = "accInsert"; public const str cAccTypePK = "accType"; '''

AccessoryPriorityEnv

Added priority() and defaultPriority() methods called by AccessoryGenerationBehavior to provide an easier way for AccEnvs to dictate their priorities.

AddAccessoryVessel

This is no longer abstract and now extends AccToolVessel. Much of it's behavior has been moved to be handled by the AccToolAnimation and AccToolVessel.

RemoveAccessoryVessel

This now extends AccToolVessel. Much of it's behavior has been moved to be handled by the AccToolAnimation and AccToolVessel.

cm.abstract.dataSymInterface

cm.abstract.dataSymInterface.communication

# dsCatCatalog.cm

Removed: public void setting(str key, Object value) : deprecated;

Field requestId removed from dsiDownloadInfo in 14.5.

# dsiDownloadInfo.cm

Removed: public int requestId;

Old: public constructor(int cid, int64 fileSize, int requestId|, str src, str tar, str tmp=null, str grp=null, bool trace=false)
New: public constructor(int cid, int64 fileSize|, str src, str tar, str tmp=null, str grp=null, bool trace=false)

Old: public constructor(int cid, int64 fileSize, int requestId, str src, str tar, str tmp=null, str grp=null, bool trace=false|, bool onDemand=true, str sha=null, str cmSyncCycleKey=null, str portfolioName=null)
New: public constructor(int cid, int64 fileSize, str src, str tar, str tmp=null, str grp=null, bool trace=false|, bool onDemand=true, str sha=null, str cmSyncCycleKey=null, str portfolioName=null)

cm.abstract.dataSymbol

Removal of DsPDataGCPropDef2

DsPDataGCPropDef2 was initially designed for Catalogue Scheme to push options to DsPData, primarily for features with group code. However, the limitation for DsPDataGCPropDef2 is also quite significant. While this approach worked as expected with group code, it did not work well with other feature types. For example, optional, multiple-select, numeric features. In addition to this, the existence of DsPDataGCPropDef2 often brings confusion to developers who were debugging DsPData, as the class naming is very similar to another DsPropDef - DsPDataGCPropDef, another PropDef type in DsPData.

For these reasons, DsPDataGCPropDef2 will be removed in 14.5:

// cm.abstract.dataSymbol.propDefs.dsPropDef.cm
Removed: public class DsPDataGCPropDef2 extends PropDef {

// cm.abstract.dataSymbol.dsPData.cm
DsPData class:
Removed: extend public DsPDataGCPropDef2 gcPropDef2(str k) {

DsPData COM Cache Changes

We made the following modifications to the cm.abstract.dataSymbol.dsPData.cm file:

We updated the _comMtrlsCache field as follows:

Old: private str->Material _comMtrlsCache : copy=shallow;
New: private str->Material _comMtrlsCache : copy=shallow, stream=null;

We added a new field, _appliedComMtrls to keep record of the COMs that are actually applied:

New: private str-><str, Material> _appliedComMtrls : copy=shallow;

cm.abstract.industry

Material changes

The following industry material classes now extend from classes in cm.abstract.material:

// industryMaterial.cm
Old: public class IndustryMaterial extends CachedMaterial;
New: public class IndustryMaterial extends AbsMaterial;

// industryMaterialCardTreeViewItem.cm
Old: public class IndustryMaterialCardTreeViewItem extends TreeViewItem : unstreamable;
New: public class IndustryMaterialCardTreeViewItem extends AbsMaterialCardTreeViewItem : unstreamable;

COM changes

The following industry COM classes / functions have been replaced by their counterparts from cm.abstract.material:

// cm.abstract.industry -> cm.abstract.material

// comProxyMaterial.cm
Old: public class IndCOMProxyMaterial extends Material;
New: public class COMProxyMaterial extends Material;

// customerOwnMaterials.cm
Old: public class IndCustomerOwnMaterials;
New: public class CustomerOwnMaterials;

Old: public IndCustomerOwnMaterials indCustomerOwnMaterials(World world=null);
New: public CustomerOwnMaterials customerOwnMaterials(World world=null);

The following industry COM classes now extend from classes in cm.abstract.material:

// customerOwnMaterials.cm
Old: public class IndCustomerOwnMaterial extends IndustryMaterial;
New: public class IndCustomerOwnMaterial extends CustomerOwnMaterial;

// comMaterialCard.cm
Old: public class IndCOMaterialCard extends IndMaterialCardWindow;
New: public class IndCOMaterialCard extends COMaterialCard;

Legend changes

The following industry legend classes / functions have been replaced by their counterparts from cm.abstract:

// cm.abstract.industry -> cm.abstract

// industryLegendItem.cm
Old: public class IndustryLegendItem;
New: public class LegendItem;

// industryLegendItem.cm
Old: public class SimpleIndustryLegendItem extends IndustryLegendItem;
New: public class SimpleLegendItem extends LegendItem;

// industryLegend.cm
Old: public class IndustryLegend;
New: public class Legend;

Old: public class IndustryLegendPropInterface : abstract; 
New: public class LegendPropInterface : abstract;

Old: public void updateIndustryLegendSnapper(IndustryLegendSnapper s, Space space, str headerKey,
                                             str[] types);
New: public void updateLegendSnapper(LegendSnapper s, Space space, str headerKey, 
                                     str[] types);

// basicIndustryLegendSnapper.cm
Old: public class BasicIndustryLegendSnapper extends GraphSnapper;
New: public class BasicLegendSnapper extends GraphSnapper 

The following legend classes now extend from classes in cm.abstract:

// industryLegend.cm
Old: public class IndustryLegendSnapper extends BasicIndustryLegendSnapper;
New: public class IndustryLegendSnapper extends LegendSnapper;

// linealFilingInchesLegend.cm
Old: public class LinealFilingInchesLegend extends BasicIndustryLegendSnapper;
New: public class LinealFilingInchesLegend extends BasicLegendSnapper;

Material legend changes

The following industry material legend classes / functions have been replaced by their counterparts from cm.abstract.material:

// cm.abstract.industry -> cm.abstract.material

// indMaterialLegend.cm
Old: public class IndMaterialLegendItem;
New: public class MaterialLegendItem;

Old: public class IndMaterialLegendItemCreator : abstract; 
New: public class MaterialLegendItemCreator : abstract;

Old: public class IndMaterialLegend extends IndustryLegend; 
New: public class MaterialLegend extends Legend;

Old: public IndMaterialLegend industryMaterialLegend(World world);
New: public MaterialLegend absMaterialLegend(World world);

Old: public void updateIndustryMaterialLegend(Material->IndMaterialLegendItemCreator mc, World world=null);
New: public void updateAbsMaterialLegend(Material->MaterialLegendItemCreator mc,
                                         World world=null);

// indMaterialLegendSnapper.cm
Old: public class LegendPart extends Part; 
New: public class LegacyLegendPart extends Part;

Old: public void updateIndustryIndMaterialLegend(World world);
New: public void updateAbsMaterialLegend(Material->MaterialLegendItemCreator mc,
                                         World world=null);

// industryPart.cm
Old: public void setTempLegendIndMaterialsToNull();
New: public void clearTempLegendMaterials();

Old: package Material->IndMaterialLegendItemCreator getTempLegendIndMaterials();
New: public Material->MaterialLegendItemCreator getTempLegendMaterials();

The following industry material legend classes now extend from classes in cm.abstract:

// indMaterialLegendSnapper.cm
Old: public class IndMaterialLegendSnapper extends BasicIndustryLegendSnapper;
New: public class IndMaterialLegendSnapper extends MaterialLegendSnapper;

cm.abstract.interop

The following Excel-related classes in cm.abstact.interop.excelObj.cm are now removed in 14.5. Please use cm.core.msOffice.excel to access Excel-related APIs.

// cm.abstract.interop.excelObj.cm
Removed: public class ExcelObj extends NetObj : deprecated
Removed: public class ExcelWorkbook extends NetObj : deprecated
Removed: public class ExcelSheet extends NetObj : deprecated
Removed: public class ExcelRange extends NetObj : deprecated

With this change, dependency to cm.abstact.interop can now be removed from extension.xml, if it was only added to access Excel APIs. As for cm.core.msOffice.excel, it is shipped under cet.designer, hence if the extension.xml already has dependency to cet.designer, it is not required to add dependency to cm.core.msOffice.excel.

cm.abstract.k2

class K2AlternativeValidateFun

Removed: findNearbyOwners(Snapper{} ownerCandidates, Snapper->Snapper{} existing)

Consider using e.g. nearbySnappersWithAutoAdopt(K2Snapper this, LayerExpr tag) instead, to get owners near a certain snappers. If you want all nearby owner candidates, use K2AlternativeValidateFun.findOwnerCandidates(Snapper snapper, Snapper->Snapper{} existing) instead.

class K2WorktopEdgeBendAnimation

Various terms used in properties, variable names, and methods were renamed to be more descriptive. Few public interfaces were affected:

Old: bendAngle property
New: arcTangentAngle property
Old: bendDistance property
New: arcHeight property
Old: bendRadius property
New: arcRadius property

Xp classes made abstract

The following xp classes have been made abstract since they are not intended to be instantiated.

Old: public class XpBool
New: public class XpBool : abstract
Old: public class XpMaterialAccess
New: public class XpMaterialAccess : abstract
Old: public class XpMeasure
New: public class XpMeasure : abstract
Old: public class XpMoldingHeight
New: public class XpMoldingHeight : abstract
Old: public class XpNode
New: public class XpNode : abstract
Old: public class XpNodePositioning
New: public class XpNodePositioning : abstract
Old: public class XpNodeSizing
New: public class XpNodeSizing : abstract
Old: public class XpRsStr
New: public class XpRsStr : abstract
Old: public class XpSnapAnimationBehavior extends XpAnimationBehavior
New: public class XpSnapAnimationBehavior extends XpAnimationBehavior : abstract
Old: public class XpStr
New: public class XpStr : abstract

Straight corner cabinet changes

The following classes have been made abstract:

Old: public class K2CabinetGfxBehavior extends K2Behavior
New: public class K2CabinetGfxBehavior extends K2Behavior : abstract

The following classes have been deprecated:

Old: public class XpStraightCornerShape2 extends XpShape
New: public class XpStraightCornerShape2 extends XpShape : deprecated
Old: public class XpStraightCornerShapeDef2 extends XpShapeDef
New: public class XpStraightCornerShapeDef2 extends XpShapeDef : deprecated
Old: public class XpStraightCornerGfxBehavior2 extends XpCabinetGfxBehavior
New: public class XpStraightCornerGfxBehavior2 extends XpCabinetGfxBehavior : deprecated

Instead, the following classes should be used. The new shape have separate measure properties for covers and fillers. It's recommended to create a new straight corner cabinet snapper in K2Creator using the new classes. That way saved drawings will not change upon being loaded.

New: public class K2StraightCornerGfxBehavior3 extends K2CabinetGfxBehavior
New: public class XpStraightCornerShape3 extends XpShape
New: public class XpStraightCornerShapeDef3 extends XpShapeDef

class K2DataSymFileGfxBehavior

Old: public void applyXpLayout(XpLayout layout, XpShape parentShape, SymNode root)
New: public void applyXpLayout(XpLayout layout, XpShape parentShape, SymNode root, XpShapeTree shapeTree=null)

Use toShapeTree() to get the shapeTree for the snapper you're applying the layout to.

class K2InsertNodeChooser

Old: public str lastStructureKey
New: public str lastPreviewCacheKey

The package-visible k2StructureKey was removed, and a previewCacheKey was added to K2Snapper. This field also had its name changed to reflect this.

class XpLayout (and child classes)

Old: XpNodeRes[] eval(XpShape parentShape, XpLayoutNode node, str->XpShape[] existing)
New: XpNodeRes[] eval(XpShape parentShape, XpLayoutNode node, str->XpShape[] existing, XpShapeTree shapeTree=null)

Old: XpNodeRes[] allPossible(XpShape parentShape, XpShape shape)
New: allPossible(XpShape parentShape, XpShape shape, XpShapeTree shapeTree=null)

Old: public XpNodeRes eval(XpShape parentShape, XpNodeRes res)
New: public XpNodeRes eval(XpShape parentShape, XpNodeRes res, XpShapeTree shapeTree=null)

Use toShapeTree() to get the shapeTree for the snapper you're evalutating the layout on. null is an acceptable value if no such snapper exists.

class XpLayoutAccess (and child classes)

Old: public XpNodeRes[] eval(XpShape parentShape, XpLayoutNode node, str->XpShape[] existing)
New: public XpNodeRes[] eval(XpShape parentShape, XpLayoutNode node, str->XpShape[] existing, XpShapeTree shapeTree=null)

See section on class XpLayout for context.

class XpListItem

Old: str partNo
New: XpStr returnValueWhenTrue

XpListItem previously had a field typed as str named partNo. It is now typed as XpStr and called returnValueWhenTrue for more a descriptive name, and to support non-fixed strings. If you were using the partNo field, please used the returnValueWhenTrue instead, with an XpFixedString containing the value previously in partNo.

class XpShape

Old: public str[] dataForValueHash()
Old: public str valueHash()
New: public str previewCacheKey(double distancePrecision, angle anglePrecision)

Removed: public XpShape copyWithMeasuresOnly()

previewCacheKey(distancePrecision=0, anglePrecision=0deg) is a good replacement for valueHash(). Both provide a representation of the shapes value. The former is different though, containing more data which defines the shapes structure.

copyWithMeasuresOnly was no longer needed, and was therefore removed.

cm/abstract/k2/k2InsertNodePreviewSnapperSpawner.cm

Old: public constructor(K2SnapperSpawner parentSpawner, K2InsertNodeRef childNodeRef)
New: public constructor(K2SnapperSpawner parentSpawner, K2Snapper parent, K2InsertNodeRef childNodeRef)

cm/abstract/k2/k2Property.cm

Removed: public void k2PropagatePropChanged(Snapper snapper, str key, Object value, Object env)

cm/abstract/k2/animation/k2FaceAnimation.cm

Old: public class XpFaceAnimation extends ToolAnimationG2
New: public class XpFaceAnimation extends ToolAnimationG2 : abstract
Old: extend public XpFace[] getAlternativeFaces()
New: extend public XpFace[] alternativeFaces() : abstract
Removed: public XpFace[] alternativeFaces;
Removed: extend public void updateAlternativeFaces(Snapper snapper)
Removed: extend public XpFace[] findAlternativeFaces(Snapper{} snappers=null)
Removed: extend public LayerSet faceAlternativeFilter()
Removed: public void candidateChanged(Snapper old)

cm/abstract/k2/worktop/k2WorktopJointAnimation.cm

Old: public class K2WorktopJointAnimation extends XpFaceAnimation
New: public class K2WorktopJointAnimation extends XpFaceAnimation : abstract
Old: final public XpFace[] getWorktopFaces()
New: final public XpFace[] worktopFaces()
Old: final public XpFace[] getJointFaces()
New: final public XpFace[] jointFaces()
Removed: public XpFace[] worktopFaces;
Removed: extend public XpFace[] jointAlternatives(XpFace[] worktopFaces)

cm/abstract/k2/engine/k2AlternativeValidateFunction.cm

Removed: extend public Snapper{} findNearbyOwners(Snapper{} ownerCandidates, Snapper->Snapper{} existing)

cm/abstract/k2/behavior/k2AutoLightEngineBehavior.cm

Old: public class K2AutoLightAppendExisitingFun extends K2EngineAppendExistingFun
New: public class K2AutoLightAppendExistingFun extends K2EngineAppendExistingFun

cm/abstract/k2/engine/k2EngineFun.cm

Old: extend public bool shouldHideExisting(Snapper exisiting)
New: extend public bool shouldHideExisting(Snapper existing)

cm/abstract/k2/face/xpFaceToFaceFilter.cm

Removed: public bool excludeEdges;
Old: public constructor(bool excludeEdges=false)
New: public constructor()

cm/abstract/k2/library/k2Library.cm

Removed: public str->int visibleSpawnerStartIndex;
Removed: public str->int visibleSpawnerMaxIndex;
Removed: private void updateSpawnersPage(Control c, bool nextPage=true)
Removed: private void showNextSpawnersCB(Control c)
Removed: private void showPreviousSpawnersCB(Control c)
Old: extend public LibraryLimb addSearchLimb(LibraryLimb parent)
New: extend public void addSearchLimb(LibraryLimb parent)

cm/abstract/k2/library/k2PageLimb.cm

Removed: public class K2PageLimb extends LibraryLimb

cm/abstract/k2/node/k2InsertNodeRef.cm

Removed: public constructor(K2SnapperSpawner spawner, XpNodeRes res, K2LayoutBehavior layout, K2SnapperSpawner parentSpawner=null)

cm/abstract/k2/node/k2LayoutHandleInsertAnimationBehavior.cm

Removed: extend public void putHandle(K2Snapper handle, K2LayoutHandleInsertAlternative alt)
Removed: extend public Snapper{} getTargetsWithoutAlternatives(AnimationMouseInfo mi, K2Snapper handle)
Removed: extend public void putHandleToTargets(Snapper{} targets, K2Snapper handle)
Removed: package bool anyIntersect(symbol{} set1, symbol{} set2)

cm/abstract/k2/panel/k2Panel.cm

Removed: extend public K2Cabinet nearestCabinet(K2Panel{} visited=null)

cm/abstract/k2/worktop/k2Worktop.cm

Removed: extend public str groupKey()
Removed: extend public void edgePropertyChanged(K2WorktopEdge edge, str key, Object value, Object oldValue)
Removed: extend public str->K2WorktopEdge{} edgeGroups()

cm/abstract/k2/xp/xpFace.cm

Removed: final public rect bound()

cm/abstract/k2/worktop/k2WorktopBuiltInPosFun.cm

Old: public class K2WorktopBuiltInPosAppendExisitingFun extends K2EngineAppendExistingFun
New: public class K2WorktopBuiltInPosAppendExistingFun extends K2EngineAppendExistingFun

cm/abstract/k2/worktop/k2WorktopEdge.cm

Removed: extend public K2WorktopEdgeStyleBehavior style()
Removed: extend public GMaterial3D material()
Removed: extend public str groupKey()

cm/abstract/k2/worktop/k2WorktopEdgeStyleBehavior.cm

Removed: public class K2WorktopEdgeStyleBehavior extends K2Behavior

cm/abstract/k2/worktop/K2WorktopEdgeOperationsMenuBehavior.cm

Removed: final private void updateVesselsVisibility(Space space)

cm.abstract.material

MaterialLegend

The following fields, methods and functions have changed:

// materialLegend.cm
MaterialLegend
    Old: public Material[] used;
    New: final public Material{} usedMaterials();

// legacyMaterialLegends.cm
Old: public void legacyPreFetchPartsHook(Space space);
New: public void clearLegacyTempLegendsHook(Space space);

cm.abstract.materialHandling

public class MhSnapperInsertToolVessel extends Vessel {
- Removed:  public Snapper- Old: >str cachedGraphicsKeys() : deprecated;

public class MhSnapperSpawner extends SnapperSpawner {
- Old:     extend public CollisionPrimitive engineConstructionCollision(MhSnapperShape shape) {
New:     extend public CollisionPrimitive engineConstructionCollision(MhSnapperShape shape, MhEngineConstructionEntry entry) {

public class MhFrameGfxBehavior extends MhGenericGfxBehavior {
- Old:     extend public double uprighTh(MhSnapper snapper) {
New:     extend public double uprightTh(MhSnapper snapper) {

- Old:  public class MhBraceInfoDouble extends MhBraceInfo {
New:  public class MhSideElementBracingInfo extends MhBraceInfo {

- Old:  public class MhFrameEditBracingInsertAnimation extends MhSnapperInsertToolAnimation {
New:  public class MhFrameEditElementsInsertAnimation extends MhSnapperInsertToolAnimation {
New:  public class MhFrameEditBracingInsertAnimation extends MhFrameEditElementsInsertAnimation {

public class MhFrameEditorShape extends MhSnapperShape {
- Old:     extend public Snapper{} children(line[] lines) {
New:     extend public Snapper{} children(MhBracingBehavior behavior, MhBraceInfo[] infos, line[] lines) {

cm/abstract/materialHandling/mhSnapperInsertToolVessel.cm
- Removed: [Global Variable] public const double arrowMargin = 5cm;
New: [MhArrowBehavior method] extend public double arrowMargin(MhSnapper snapper, Animation a)
Note: Replace all `arrowMargin` references to use the new margin values from an `MhArrowBehavior`.

public class MhConfigManager : unstreamable {
- Old:    extend public void setNewName(MhConfigRef config) {
- New:    extend public bool setNewName(MhConfigRef config) {

CollisionPrimitive interface cleanups

Some of the key methods relating to collection of CollisionPrimitives in the abstract has been reworked, utilizing a MhCollisionFetchEnv to pass arguments to simplify the methods, and allow for better control of CollisionPrimitive generation through a new reason argument that accepts a symbol.

For clearance related collisions, MhClearanceCollisionPrimEnv has also been reworked and merged into MhCollisionFetchEnv, MhClearanceCollisionFetchEnv and MhStorageClearanceCollisionFetchEnv for similar reasons.

Most of the compile errors could be resolved by using the new methods, wrapping arguments like Transform t into a MhCollisionFetchEnv, or using a null value.

New: public class MhCollisionFetchEnv

- Old: public class MhClearanceCollisionPrimEnv
New: public class MhClearanceCollisionFetchEnv extends MhCollisionFetchEnv

- Old: public class MhStorageClearanceCollisionPrimEnv extends MhClearanceCollisionPrimEnv
New: public class MhStorageClearanceCollisionFetchEnv extends MhClearanceCollisionFetchEnv


cm/abstract/materialHandling/functions.cm
- Deprecated: public CollisionPrimitive localCollisionPrimitive(MhSnapper this)
New: public CollisionPrimitive localCollisionPrimitive(MhSnapper this, MhCollisionFetchEnv env)

MhSnapper
- Deprecated: extend public CollisionPrimitive collisionPrimitive(Transform t, bool includeChildren, Object env=null)
New: extend public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env)

MhSnapperGeometry
- Old: extend public CollisionPrimitive collisionPrimitive(Transform t)
- New: extend public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env)

MhSnapperShape
- Old: extend public CollisionPrimitive collisionPrimitive(Transform t=null)
New: extend public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env)

- Old: extend public void appendBehaviorCollisionPrimitives(CollisionPrimitiveSet res, Transform t=null, MhSnapper parent=null)
New: extend public void appendBehaviorCollisionPrimitives(MhCollisionFetchEnv env, CollisionPrimitiveSet res, MhSnapper parent=null)

MhSnapperSpawner
- Old: extend public CollisionPrimitive engineConstructionCollision(MhSnapperShape shape)
New: extend public CollisionPrimitive engineConstructionCollision(MhSnapperShape shape, MhEngineConstructionEntry entry)

MhSnapperInfo
- Deprecated: extend public CollisionPrimitive collisionPrimitive(Transform t, MhSnapper p)
New: extend public CollisionPrimitive collisionPrimitive(MhCollisionFetchEnv env, MhSnapper p)

MhClearanceSpec
- Removed: extend public CollisionPrimitive[] collisionPrimitives(MhSnapperShape shape, Transform t, double elevation)
- Removed: extend public CollisionPrimitive[] collisionPrimitives(MhSnapperShape shape, Transform t, double elevation, LayerSet classification)
New: extend public CollisionPrimitive[] collisionPrimitives(MhSnapperShape shape, MhCollisionFetchEnv env)

- Old: extend public CollisionPrimitive[] levelClearanceCollisionPrimitives(MhSnapperShape shape, Transform t, double elevation, LayerSet classification)
New: extend public CollisionPrimitive[] levelClearanceCollision(MhSnapperShape shape, MhCollisionFetchEnv env)

MhClearanceBehavior
- Old: extend public void appendCollisionPrimitives(MhSnapperShape shape, Transform t, CollisionPrimitive{} geos, MhClearanceCollisionPrimEnv clearanceEnv, Object env=null)
New: extend public void appendCollisionPrimitives(MhSnapperShape shape, MhCollisionFetchEnv env, CollisionPrimitive{} res)

MhClearanceSpecBehavior
- Old: extend public void appendClearanceSpecCollisionPrimitives(MhSnapperShape shape, Transform t, MhClearanceCollisionPrimEnv clearanceEnv, MhClearanceSpec clearanceSpec,Object env=null) {
New: extend public void appendSpecCollision(MhSnapperShape shape, CollisionPrimitive{} res, MhClearanceSpec spec, MhCollisionFetchEnv env)

- Old: extend public MhClearanceSpec clearanceSpec(MhClearanceCollisionPrimEnv clEnv, MhSnapperShape shape, Object env=null) {
New: extend public MhClearanceSpec clearanceSpec(MhCollisionFetchEnv env, MhSnapperShape shape) {

MhLevelInsertHeightBehavior interface changes

Removed: extend public void updateDomains(Snapper owner, Snapper toSnapper, Object env=null) : deprecated {

Old: extend public bool updateHeightDomains(Snapper owner, Snapper toSnapper, Object env=null) {
New: extend public bool updateHeightDomains(MhSnapper owner, MhSnapper toSnapper, Object env=null) {

Old: extend public SubSet restrictedHeightDomain(Snapper owner, Snapper toSnapper, Object env) {
New: extend public SubSet restrictedHeightDomain(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env) {

Old: extend public bool isConflicting(Snapper owner, double z, MhCollisionAlternative alt, CollisionPrimitiveSet ownerPrims) {
New: extend public bool isConflicting(MhSnapper owner, double z, MhCollisionAlternative alt, CollisionPrimitiveSet ownerPrims) {

Old: extend public void updateHeightProperties(Snapper owner, Snapper toSnapper, Object env=null) {
New: extend public void updateHeightProperties(MhSnapper owner, MhSnapper toSnapper, Object env=null) {

Old: extend public <Double, Double> calculateFreeSpaceAboveAndBelow(Snapper owner, Snapper toSnapper, double insertH, Snapper specificAboveSnapper=null, Snapper specificBelowSnapper=null) {
New: extend public <Double, Double> calculateFreeSpaceAboveAndBelow(MhSnapper owner, MhSnapper toSnapper, double insertH, Snapper specificAboveSnapper=null, Snapper specificBelowSnapper=null) {

Old: extend public <Snapper, Snapper> getFirstAboveAndBelowSnappers(Snapper owner, Snapper toSnapper, double insertH) {
New: extend public <MhSnapper, MhSnapper> getFirstAboveAndBelowSnappers(MhSnapper owner, MhSnapper toSnapper, double insertH) {

Old: extend public void showHeightProperties() {
New: extend public void showHeightProperties(MhSnapper owner, MhSnapper toSnapper) {
Removed: public bool isShelfBackPanel(Object o) { return evalClassification(o, sBackPanel); }

MhSpreadPatternBehavior interface changes

Removed: extend public SubSet spreadPatternDomain(MhSnapper snapper, MhSnapper parent, str event) : deprecated {

MhDeepstorageUnitLoadPopulateFunction interface changes

Old: extend public point nextPopulatorPos(MhEngineEntry edit, point startPos, double bedWidth) {
New: extend public point nextPopulatorPos(MhEngineEntry edit, point startPos, double bedWidth, MhSystemEngineEnvironment env) {

MhBackFenceShape interface changes

Removed: public double bracketD;

MhBackstopShape interface changes

Removed: public double beamOffset;
Removed: public double bracketD;

MhRowDownAisleInsertAnimation interface changes

Removed: public Graph->MhPolylineColor[] map;

MhSnapperApplyAnimation interface changes

Removed: extend public void relinkNeighbors(MhSnapper oldSnapper, MhSnapper newSnapper) : deprecated {

MhSnapperMultiApplyAnimation interface changes

Renamed field selection to pickedUpSelection to avoid confusion with MhSnapperSpreadToolAnimation.selection().

Old: public SnapperSelection selection;
New: public SnapperSelection pickedUpSelection;

Old: public constructor(MhSnapper snapper, SnapperSelection selection, SnapperFilter f, bool includeChildren, bool showPickup=true) {
New: public constructor(MhSnapper snapper, SnapperSelection pickedUpSelection, SnapperFilter f, bool includeChildren, bool showPickup=true) {

MhRowEndSnapperFilter interface changes

Removed: public Snapper leftSnapper;
Removed: public Snapper rightSnapper;
Removed: extend public void setLeftAndRightSnapper(MhSnapper row, Snapper{} ss) : deprecated {

MhBraceInfo changes

Undeprecated a method in MhBraceInfo.

Old: extend public line2D braceLine(double frame_depth, double brace_offset) : deprecated {
New: extend public line2D braceLine(double frame_depth, double brace_offset) {

Frame editor snapper changes

Removed deprecated fields in MhFrameEditContentSnapper and MhFrameEditorShape.

MhFrameEditContentSnapper
Removed: public MhSnapper baySnapper : copy=null,  deprecated;

MhFrameEditorShape
Removed: public MhSnapper frameSnapper : copy=null, deprecated;

Removed backstop constants

Removed some constants in cm/abstract/materialHandling/storage/behavior/mhBackstopSnappingBehavior.cm .

Removed: public const double cBackstopDepthMargin = 10cm;
Removed: public const double cBackstopHeightMargin = 20cm;

Removed deprecated frame editor function

Replace any calls to mhDrawingFrameEditConfigurations(Space space) with mhDrawingFrameEditConfigurations(Space space, symbol configPkg).

Removed: public MhFrameEditConfiguration[] mhDrawingFrameEditConfigurations(Space space) : deprecated {

Remove deprecated multi-span frames function

Removed a deprecated function in cm/abstract/materialHandling/storage/racking/mhFlankProtectorFixedPointCollisionAlternative.cm.

Removed: public MhSnapper[] getMultiSpanFrames(MhSnapper frame) : deprecated {

cm.abstract.materialHandling.storage.racking.cantilever

MhCantileverArmGfxBehavior interface changes

Old: extend public Primitive3D bracket3D(MhSnapper owner, double w, double startD, double endD, double startH, double h, double th) {
New: extend public Primitive3D bracket3D(MhSnapper owner, double w, double startD, double endD, double h, double th) {

cm.abstract.materialHandling.storage.racking.deepstorage

MhDeepstorageNoOfSingleFramesFunction Class

A new parameter is added to the sortedFramesByPriority method, making the previous method without that parameter deprecated.

Old: extend public MhEngineEntry[] sortedFramesByPriority(MhEngineEntry[] sortedFrames) : deprecated {
New: extend public MhEngineEntry[] sortedFramesByPriority(bool rotated, MhEngineEntry[] sortedFrames) {

The new parameter rotated is required for the sorting of frames, because when the frames are rotated in the drawing, the order of sortation should be reversed. When this is not accounted for, the removal of frames will not be consistent since it is not reversed.

There will not be any compile time error despite the changes, since the deprecated method will simply call the new method with rotated=false, which was assumed previously.

Old: 
extend public MhEngineEntry[] sortedFramesByPriority(MhEngineEntry[] sortedFrames) : deprecated {
    return sortedFramesByPriority(false, sortedFrames);
}

cm.abstract.materialHandling.storage.shelving

Removed function for checking classification in Abstract Shelving

isShelfBackPanel() has been removed from Abstract Shelving. Use isBackPanel() instead.

cm.abstract.office

Support Changes

Updated AO specific classes relating to Accessory system changes. Removed the updateSupport() method from Worksurface in favor of the new updateAccessory() method on AccessoryEnv.

Removed the includeNeighbors parameter from getAllSupports(). This method should only give supports that this surface owns or manages. Neighbor supports are gathered in a seperate call by the AccessoryGenBehavior via those surfaces getAllSupports() calls.

The following classes have been deprecated. AOWksfSelectSupportVessel, AOWksfSuppPosSelectVessel, AOWksfSelectSupportForRemovalVessel

New SIF abstract

We have moved all of the SIF code and rs over to cm.abstract.sif which is shipped by cm.abstract extension.

The following classes / functions have a new name:

Old: public class AOSifExport extends TextExporter;
New: public class ASifExport extends TextExporter; 

Old: public str aoSifExportEOL();
New: public str aSifExportEOL();

public Image aoIcon(str image);
public Image absSifIcon(str image);

The following SIF clases have been moved to cm.abstract.sif with a different class hierarchy:

Old: public class CustomSIFExport extends AOSifExport : inherit constructors;
New: public class CustomSIFExport extends ASifExport : inherit constructors;

Old: public class GenSifExport extends AOSifExport;
New: public class GenSifExport extends ASifExport;

The following SIF clases / functions have been moved to cm.abstract.sif:

// functions.cm
public <str, str>[] getDefaultSIF();
public void initDefaultSIFSettings();
public void initDefaultSIFSettings();
public str removeUnits(Object value, str original);
public <str, str>[] getColumnToIDs();
public bool checkForValidCodes(<str, str>[] columnToID);
public bool checkAndAppendSIF(ArticleGridWindow gw, DropDownMenu temp, PartColumn column);

// customSifExport.cm
public TextExporter customSifExport();

// exportEditSubWindow.cm
public class ExportEditSubWindow extends SubWindow;

// sifContants.cm
public const str sifUserSettingKey;
public const str sifLocalSettings;
public const str partNumberLabel;
public const str optionCodeLabel;
public const str optionUpchargeLabel;
public const str articleCodeLabel;
public const str optionKeyLabel;
public const str descriptionColumnLabel;
public const str optionDescriptionLabel;
public const str optionDescription2Label;
public const str optionListPriceLabel;

// sifControlRow.cm
public class SIFControlRow extends ControlRow;

// sifSettingsDialog.cm
public str[] dexImportFilter();
public str->str colKeyToSIFCode();
public SIFSettingsDialog getSIFSettingsDialog();
public void makeSIFSettingsDialog(Window win);
public class SIFSettingsDialog extends DialogWindow;

// singleCodeDialog.cm
public SingleCodeDialog getSingleCodeDialog();
public void makeSingleCodeDialog(Window parent, str column, pointI origin=(-1, -1), str label="Dialog");
public class SingleCodeDialog extends DialogWindow;

cm.abstract.palette

paletteApply.cm

PaletteApplyEnv '''cm Old: public constructor(Palette pal, schemeFilterType filter) New: public constructor(Palette pal, schemeFilterType filter, Space space=null) '''

paletteDialog.cm

Old: extend public PaletteApplyEnv applyEnv(schemeFilterType filter)
New: extend public PaletteApplyEnv applyEnv(schemeFilterType filter, Palette pal=null)

cm.abstract.tools.elevationG2

The following methods have been removed from ElevTreeViewItemG2:

Removed: extend public str formattedLabel(PixelDevice pixelDevice, rectI r)

cm.abstract.walls.tools.elevations

The following methods have been removed from ElevTreeViewItem:

Removed: extend public str formattedLabel(PixelDevice pixelDevice, rectI r)

cm.core

The following methods have been moved to functions:

cm.core

// world.cm methods moved to functions
Old: extend public void disconnectNonUfosFromUfos(Snapper{} input);
New: public void disconnectNonUfosFromUfos(Snapper{} input);

Old: extend public Snapper{} replaceUfosWithProxySnappers(Snapper{} input, Object->UFOProxySnapper ufoReconnectMap=null);
New: public (Snapper{}) replaceUfosWithProxySnappers(Snapper{} input, 
                                                     UfoData ufoData=null,
                                                     Object->UFOProxySnapper ufoReconnectMap=null);

The following function / arguments have been changed:

cm.core

// coreGlobals.cm
Old: public (function(World world): bool) {} containsUfoDataHooks() : keep;
New: public (function(str->Object):bool) {} containsAuxUfoDataHooks() : keep;

Old: public function(World world) {} clearUfoDataHooks() : keep;
New: public function(str->Object) {} clearAuxUfoDataHooks() : keep;

// worldUfo.cm
Old: public void putContainsUfoDataHooks(function(World world):bool hook);
New: public void putContainsAuxUfoDataHooks(function(str->Object):bool hook);

Old: public void removeContainsUfoDataHooks(function(World world):bool hook);
New: public void removeContainsAuxUfoDataHooks(function(str->Object):bool hook);

Old: public void putClearUfoDataHooks(function(World world) hook);
New: public void putClearAuxUfoDataHooks(function(str->Object) hook);

Old: public void removeClearUfoDataHooks(function(World world) hook);
New: public void removeClearAuxUfoDataHooks(function(str->Object) hook);

cm.core.part

// partDividersInSpace.cm
Old: public PartDivider[] getPartDividers(Space space, bool sort=true);
New: public PartDivider[] defaultPartDividers(bool category=false);

// parts.cm
Old: public PartGroup fetchPartsTree(Space space=mainSpace(),
                                     //bool merge=true,
                                     //bool finalize=true,
                                     bool merge=false,
                                     bool finalize=false,
                                     bool filter=true,
                                     function():bool interrupt=null,
                                     bool progress=false,
                                     ExportFilterSettings exportFilter=null,
                                     PartSeqSorter sorter=null,
                                     PartFetchEnv mergeEnv=null);
New: public PartGroup fetchPartsTree(PartDivider[] dividers,
                                     Space space=mainSpace(),
                                     //bool merge=true,
                                     //bool finalize=true,
                                     bool merge=false,
                                     bool finalize=false,
                                     bool filter=true,
                                     function():bool interrupt=null,
                                     bool progress=false,
                                     ExportFilterSettings exportFilter=null,
                                     PartSeqSorter sorter=null,
                                     PartFetchEnv mergeEnv=null);

Here is an example code snippet that used getPartDividers(..) and fetchPartsTree(..):

Old:
// In extension init / main
World world = session.mainWorld;
if (world) {
	Space space = world.mainSpace;
   
	if (space) {
	    PartDivider[] seq = space.getPartDividers(sort=true);
	    if (seq) for (p in seq) { if (p as CategoryPartDivider) p.enable(true); }
	    //if (seq) for (p in seq) { if (p as CategoryPartDivi    er) p.on = true; }
	}
}

// In chapter creation / print
PartGroup partTree = fetchPartsTree(space=space);

New: 
PartGroup partTree = fetchPartsTree(defaultPartDividers(category=true), space=space);

cm.core.partTag

// partTagsInSpace.cm
Old: public void repairTagsInSpace(Space space);
// partTagsInWorld.cm
New: public void repairTagsInWorld(World world); 

cm.core.ui

// exportFilterDialogV2.cm
Old: public void showFilterSettingsDialogV2(ExportFilterBar exportBar, bool useAutoTags=false, str label=null, bool showViewModes=false);
New: public void showFilterSettingsDialogV2(ExportFilterBar exportBar, str label=null, bool showViewModes=false);

Old: ExportFilterDialogV2(Window parent, bool useAutoTags=false, str label=null, bool showViewModes=false);
New: ExportFilterDialogV2(Window parent, str label=null, bool showViewModes=false);

Old: ExportFilterSubWindowV2(Window parent, 
                             bool useAutoTags=false, 
                             str label=null, bool showViewModes=false, 
                             function(ExportFilterSubWindowV2 exportSub) callback=null);
New: ExportFilterSubWindowV2(Window parent, str label=null, bool showViewModes=false);

Old: public OrderExportDialog orderExportDialog(Window parent, World world,
                                                bool initVisible=true,
                                                Part[] selectedParts=null,
                                                CalculationView view=null) : deprecated;
New: public OrderExportDialog orderExportDialog(Window parent, World world,
                                                bool initVisible=true,
                                                bool show=true,
                                                Part[] selectedParts=null,
                                                CalculationView view=null);

The following fields, methods, classes and functions have been removed:

cm.core.calc

// articleViewTool.cm
Removed: public class ExpandArticleViewTool extends ArticleViewTool : deprecated;
Removed: public class DetailsArticleViewTool extends ArticleViewTool;
Removed: public class FilterArticleViewTool extends ArticleViewTool;
Removed: public class GroupingArticleViewTool extends ArticleViewTool : deprecated;
Removed: public class OrderExportArticleViewTool extends ArticleViewTool : deprecated;
Removed: public class AutoCreateArticleViewTool extends ArticleViewTool;
Removed: public class MergePolicyArticleViewTool extends ArticleViewTool;
Removed: public class PrintArticleViewTool extends ArticleViewTool;
Removed: public class PrintPreviewArticleViewTool extends ArticleViewTool;

// filterArticleViewDialog.cm
Removed: public class FilterArticleViewDialog extends ModalDialog;
Removed: public class HideFilteredArticleViewTool extends ArticleViewTool;
Removed: public class RemoveExplicitArticleViewTool extends ArticleViewTool;
Removed: public void giveSettingsToSpace(ArticleView this, Space space=null);
Removed: public ExportFilterSettings getFilter(ArticleView this) : deprecated;

// partMergeDialog.cm
Removed: public void showPartMergeDialog(Window parent, Space space) : deprecated;
Removed: public class ColumnPartFetchEnv2 extends ExtendedPartMergeEnv : deprecated;

cm.core.part

// partDividerDialog.cm
Removed: public void showPartDividerDialog(Window parent, Space space=null) : deprecated;
Removed: public void updatePartDividerDialog() : deprecated;
Removed: public void closePartDividerDialog() : deprecated;
Removed: public class PartDividerDialog extends DialogWindow : deprecated;

// partDividersInSpace.cm
Removed: public void putPartDivider(Space space, PartDivider divider);
Removed: public PartDivider[] autoUpdatePartDividers(Space space, PartDivider[] dividers, bool turnOnNew=false);
Removed: public void putPartDividers(Space space, PartDivider[] dividers);
Removed: public void removeTagCategoryPartDivider(Space space, PartTagCategory category);
Removed: public PartDivider[] repairPartDividers(Space space, PartDivider[] dividers);

cm.core.settings

// exportFilterBar.cm
Removed: public class AutoTagsPartExportFilterBar extends ExportFilterBar : deprecated;

ExportFilterBar
    Removed: public bool horizontal;
    Removed: public CheckBox filter;
    Removed: final public void minimalSizeTweak(int h, int w=-1);

// Use `masterEnabled()` instead of `filter.isChecked()` instead:
Old: if (filter as ExportFilterBar) if (!filter.filter.?isChecked()) return;
New: if (filter as ExportFilterBar) if (!filter.masterEnabled()) return;

cm.core.ui

// exportFilterDialog.cm
Removed: public void showFilterSettingsDialog(ExportFilterBar exportBar, bool useAutoTags=false, str label=null);
Removed: public class ExportFilterDialog extends DialogWindow;
Removed: public class ExportFilterSubWindow extends SubWindow;

// exportFilterDialogV2.cm
ExportFilterSubWindowV2
    Removed: public CheckBox all : deprecated;
    Removed: public CheckBox unCategorized : deprecated;
    Removed: public PDItem treeViewItem : copy=null, stream=null, ignore modify notice, deprecated;
    Removed: public PartDivider[] partDividers : deprecated;
    Removed: final public sorted str->symbol alpabeticallySortedAvailableCategories() : deprecated;
    Removed: final public void rebuildItems() : deprecated;
    Removed: final public void updateTags(TreeViewItem item, bool include) : deprecated;
    Removed: extend public void enableDegreeOfTriGroup(TreeViewItem item) : deprecated;
    Removed: final public void turnOnFilters(bool v=true) : deprecated;
    Removed: final public void turnOnExplicitMode(bool v=true) : deprecated;

// orderExportDialog.cm
OrderExportDialog
    Removed: public ExportFilterBar exportFilter;

cm.core.elevateAnimation

Merge request

# elevateAnimation.cm

New: public void elevateAnimation() {..}

New: public class ElevateAnimation extends AlignAnimationG2 {..}
New: public class ElevateAnimationStart extends ElevateAnimation {..}
New: public class ElevateAnimationEnd extends ElevateAnimation {..}
New: public class ElevateAnimationVessel extends CoreAlignHelperVessel {..}
New: package class ElevateAnimationSnapperFilter extends SnapperFilter {..}

cm.core.msOffice.excel

Moving NetObj2DArray to new package

The class NetObj2DArray in cm.core.msOffice.excel is now moved to cm.import.interop.netObj.cm.

// cm.core.msOffice.excel.excelObj.cm
Removed: public class NetObj2DArray extends NetObj : deprecated {

// cm.import.interop.netObj.cm
Added: public class NetObj2DArray extends NetObj {

Minor changes to Core's Excel API

Before 14.5, ExcelObj.openWorkbook method is slightly different between cm.core.msOffice.ExcelObj and cm.abstract.interop.ExcelObj. In cm.core.msOffice.excel, ExcelObj.openWorkbook opens Excel Workbook as Read-only by default. To open Excel Workbook as writable, the only way was to use ExcelObj.openWritableWorkbook method. Meanwhile, ExcelObj.openWorkbook in cm.abstract.interop opens Excel Workbook as writable by default, and there were no options to open a workbook as Read-only.

Since cm.abstract.interop is more commonly used, some changes were made to Excel APIs in cm.core.msOffice.excel to standardise the behavior moving forward.

The following method in ExcelObj class has now been removed in 14.5.

// cm.core.msOffice.excel.ExcelObj
Removed: extend public ExcelWorkbook openWritableWorkbook(Url filePath) {

In addition, new readonly flag has now been added to ExcelObj.openWorkbook in 14.5 to support opening workbook in Read-only/Writable state. By default, workbook is opened as writable, to retain the same behavior as in cm.abstract.interop.

// cm.core.msOffice.excel.ExcelObj
Modified: extend public ExcelWorkbook openWorkbook(Url filePath, bool readonly=false) {

Migration is required if:

  • Workbook was intended to be opened as Read-only before 14.5
  • ExcelObj.openWritableWorkbook was used to open workbook as writable before 14.5.

cm.core.photo

photoLabDialog.cm

Added: public SelectButton lockViewButton;
Added: private SpaceSelection cachedSelection;

cm.std.photo.filteredLabView2D.cm

New filtered view allows selection to filter which objects can be selected and not.

Added: public class FilteredLabView2D extends REDView2D {}

cm.core.view2D.cm

Added: public bool selectionFilterActive;

cm.core.propsScheme

The following function in cm.core.propsScheme has been deprecated:

Deprecated: public str psShortenLabel(Font font, str oriLabel, int allowedW)

// use this function instead
New: cm.win.shortenText(str text, Font font, int width)

cm.core.red3D.distributed

redRenderJob.cm

The following fields have been added to the RedRenderJob class in order to calculate render job transfer progress:

Added: public bool jobTransferred;
Added: public int64 jobTransferProgress;
Added: public int64 jobTransferSize;

cm.core.red3D.redRenderJobDialog.cm

In order to allow resizing of the render progress dialog, it now extends AppWindow instead of DialogWindow.

Old: public class REDRenderJobDialog extends DialogWindow {...}
New: public class REDRenderJobDialog extends AppWindow {...}

Thus, the constructor has also been changed.

Old:
public constructor(Window parent) {
	super(parent, brush=labBoxBg, label=$RenderJobDialogCaption,
	      size=(100, 100), initVisible=false);
	build();
	autoPosition();
}
New:
public constructor(Window parent) {
	super(brush=labBoxBg, label=$RenderJobDialogCaption,
	      size=(100, 100), initVisible=false, appWinAsDialogParent=parent,
	      noMinimize=true, noMaximize=true);
	build();
	minSize = size;
	maxSize = (size.w * 2, (size.h.double * 1.5).int);
}

Finally, two fields have been added to constrain the window size.

Added: public sizeI mazSize;
Added: public sizeI minSize;

cm.core.red3D.redRenderJobItem.cm

Due to changes in UI a new constructor has been added to RedRenderJobItem.

Added:
    public constructor(str key, str label, color textColor, REDRenderJob job, sizeI barSize, SrcRef src=#:src) {
	super(key, label, textColor, src=src);
	this.job = job;
	total = 1;
	colorKey = "green";
	this.barSize = barSize;
	updateProgress(job.progress());
    }

REDRenderFrame do now support asking for more than depthMap. It's now possible to ask for other renderlayers now.

// redRenderFrame.cm, Class: REDRenderFrame
Old: public bool generateDepthMap;
New: private renderLayerType{} generateLayers();
New: extend public bool generateDepthMap();
New: extend public bool generateDiffuseMap();
New: extend public bool generateNormalMap();

OutputTile now uses LayerImagesData to store render result rather than ImageWithDepthData.

//tile.cm, Class: OutputTile
Old: public ImageWithDepthData image;
New: public LayerImagesData image;

RenderImageCache now uses LayerImagesData to store render result rather than ImageWithDepthData.

// renderImageCache.cm, Class: RenderImageCache
Old: final public ImageWithDepthData get(Url url)
New: final public LayerImagesData get(Url url)

Old: final public void put(Url url, ImageWithDepthData image)
New: final public void put(Url url, LayerImagesData image)

// renderImageCache.cm, Class: RenderImageCacheEntry
Old: public ImageWithDepthData image;
New: public LayerImagesData image;

cm.core.red3D.filterPipeline

Denoise functionality in postprocessing steps now support additinal layers for improved denoising.

// redFilterPipeline3D.cm, Class: REDFilterPipeline3D
Old: final public void setSourceAndDepth(REDImage2D newSource, REDImage2D newDepth)
New: setSourceAndDepth(REDImage2D newSource=null, REDImage2D newDepth=null, REDImage2D newDiffuseMap=null, REDImage2D newNormalMap=null)


// redPostProcessor.cm, Class: REDPostProcessor
Old: extend public void updateParams(REDImage2D src, REDImage2D depth, REDFilterPipeline3D filterPipeline, bool forceSourceChange=false)
New: extend public void updateParams(REDImage2D src, REDImage2D depth, REDImage2D diffuse, REDImage2D normal, REDFilterPipeline3D filterPipeline, bool forceSourceChange=false)

Old: extend public void updateParams(REDImage2D src, REDImage2D depth, LuminanceEnv env, bool forceSourceChange=false)
New: extend public void updateParams(REDImage2D src, REDImage2D depth, REDImage2D diffuse, REDImage2D normal, LuminanceEnv env, bool forceSourceChange=false) {

Old: final private REDImage2D initialize(REDImage2D source, REDImage2D depthMap)
New: final private REDImage2D initialize(REDImage2D source, REDImage2D depthMap, REDImage2D diffuseMap, REDImage2D normalMap)

Old: final private void updateSource(REDImage2D newSource, REDImage2D newDepth)
New: final private void updateSource(REDImage2D newSource, REDImage2D newDepth, REDImage2D newDiffuse, REDImage2D newNormal)

cm.core.red3D.redView2D

Old: final public REDViewCaptureEnv beforeCapture()
New: final public REDViewCaptureEnv beforeCapture(bool capturingBackupThumbnail=false)

cm.core.settings

The following functions have been changed:

// cm/core/settings/coreSettings.cm
Removed: public void putLastBrowseDir(Url);
Removed: public void putLastCADBrowseDir(Url);

// cm/core/settings/coreSettingsAdvancedPage.cm
Removed: public Url pdfSaveLocation(bool trace=true);
Removed: public Url cadSaveLocation(bool trace=true);
Added: public Url pdfSaveLocation(bool xtrace=true);
Added: public Url exportSaveLocation(bool xtrace=true);

The following globals have been removed:

Removed: public bool useDefaultSaveLocation;
Removed: public bool useDefaultCADSaveLocation;

The following methods on CoreSettingsAdvancedPage has been changed:

Removed: extend public Window makeSaveField(SubWindow);
Removed: extend public initSaveField();
Removed: extend public makePDFField(SubWindow, Display);
Removed: extend public void initPDFField();
Removed: extend public void makeCADField(SubWindow, Display);
Removed: extend public void initCADField();
Removed: extend public void saveDefaultPathValue(SaveDefaultUrlField, bool, bool);

Removed: extend public void updateCoreSettings(SaveDefaultUrlField w, bool reset);
Added: extend public void updateCoreSettings(SaveDefaultUrlField w);

cm.core.ui

cm.core.ui

Removed: public class WorldPasswordDialog extends ChangePasswordDialog {}

cm.core.ui.removeBackupDialog

Removed: public UrlField dirField;
Removed: public CheckBox removeRecursive;
Removed: public Url url;

cm.core3D.pbrMatProp

cm.core3D.pbrMatProp.cm

Removed: public Int wantedRealtimeResolution = null;
Added: private Int _wantedRealtimeResolution = null;

cm.core3D.pbrMatProp.cm Texture

Added: private bool allowDownsample = true;
Added: private int downsampleSize = 512;

cm.core3D.gMaterialProperty3D.cm

Added: private bool allowDownsample = true;
Added: private int downsampleSize = 512;

cm.core3D.gMaterial3D.cm

Added: private bool allowDownsampleOnSave = true;

cm.downloader

cm.downloader

Fields message and data removed from commData in 14.5.

# commData.cm

Removed: public str message : deprecated;
Removed: public str data : deprecated;
# deprecated.cm

Removed: public void download_file(DownloadInfo info, f(OutBoundMessage, str) cb=null) : deprecated;
Removed: public void download_file(str src, str tar, str grp=null, f(OutBoundMessage, str) cb=null) : deprecated;
Removed: public void download_files(DownloadInfo[] infos, int limit=32, f(OutBoundMessage, str) cb=null) : deprecated;

cm.std.architectural

The following method has been removed in FloorViewItem:

Removed: extend public str fitText(Font font, str text, int maxWidth)

cm.std.photo

labRenderQualityBox.cm

The following fields have been removed from LabRenderQualityBox and instead added to new class AdvancedRenderSettingsBox.

Removed: private UnitField[] fields;
Removed: private UnitField->Object lastRecordedValues();
Removed: private SliderAndNumber masterQualitySlider;
Removed: private Button resetQualitySliderBtn;

Added: private DropDownTreeView masterQualityDropDown;
Added: package AdvancedRenderSettingsBox;

Additionally, the high-quality warning button was changed into a display.

Old: private Button infoB;
New: private Display infoD;

The following methods were removed due to the refactoring.

Removed: final private void qualitySliderChanged() {}
Removed: public void controlChanged(Control c) {}
Removed: public void controlRecievedEnterKey(Control c) {}
Removed: public void controlLostFocus() {}
Removed: final private void buildCustomRealiticRenderControls() {}

As mentioned, much of this functionallity was moved to AdvancedRenderSettingsBox.

Added: public class AdvancedRenderSettingsBox extends LabBox {}

cm.std.photo.labQuickContainer.cm

In photolab simple mode, the quality slider was removed and replaced by a dropdown menu.

Removed: private SliderAndNumber masterQualitySlider;
Added: private DropDownTreeView masterQualityDropDown;

cm.std.photo.labBox

cm.std.photo.labBox.cm

Old: final public CheckBox makeToggle(str key, str label, Object value) {}
New: final public CheckBox makeToggle(str key, str label, Object value, str toolTip) {}

cm.std.wall

Added new argument for WallOpeningConnector

New pos argument for WallOpeningSnap to allow having different positions for WallOpeningSnap other than the predefined values in the pos() method.

// cm.std.wall.wallOpeningConnector.cm
Modified: public constructor(Snapper snapper, wallOpeningSnapType snapType, Point pos=null)

cm.win

New parameters have been added to the constructor of BrushHoverDropDownMenuButton:

public constructor(Window parent,
                   Brush stdBrush,
                   Brush hoverBrush,
                   Brush mouseDownBrush,
                   // 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,
                   // extended
                   Image secondImage=null,
                   int secondImageMargin=6,
                   bool marginFromText=true, // new
                   imageAlign secondImageAlign=imageAlign.right, // new
                   SrcRef src=#:src) {}

marginFromText allows changing the calculated margin to be calculated from the text sides, instead of the sides of the button edges.

secondImageAlign lets you choose between placing the second image on the right or bottom of the button.

DiskImage can now store diffuseMap and normalMap aswell.

// diskImage.cm, Class: DiskImage
Old: public constructor(Url targetUrl, sizeI size, imageFormat format,
			   fix byte[] pixels, int pixelsCount,
			   fix byte[] depth=null, int depthCount=0,
			   float avgLum=0, float logAvgLum=0,
			   float minLum=0, float maxLum=0, int sampleCnt=0) : unsafe
New: public constructor(Url targetUrl, sizeI size, imageFormat format,
			   fix byte[] pixels, int pixelsCount,
			   fix byte[] depth=null, int depthCount=0,
			   fix byte[] diffuse=null, int diffuseCount=0,
			   fix byte[] normal=null, int normalCount=0,
			   float avgLum=0, float logAvgLum=0,
			   float minLum=0, float maxLum=0, int sampleCnt=0) : unsafe

Old: final public bool saveToFile(Url targetUrl, fix byte[] pixels, int pixelsByteCount,
				 fix byte[] depth=null, int depthCount=0) : unsafe
New: final public bool saveToFile(Url targetUrl, fix byte[] pixels, int pixelsByteCount,
				 fix byte[] depth=null, int depthCount=0,
				 fix byte[] diffuse=null, int diffuseCount=0,
				 fix byte[] normal=null, int normalCount=0) : unsafe

custom.dataCatalog.builder.features

The following methods have been removed from OptionRangeCell:

Removed: extend public str truncateDisplay(str value, int cellWidth)

custom.flooring

FlgCatalogSetup class changes

// custom.flooring.flgCatalogSetup.cm
Added: extend public DataCatalog dataCatalog() { return _dataCatalog; }

There should be no need to request download minimum files.
Deprecated: extend public void downloadMinimumFiles() : deprecated {}

New cell arg to register cell to receive update after product download.
Old: extend public void requestDownload(guid lid, bool full=false) {
New: extend public void requestDownload(guid lid, FlgCatalogProductCell cell=null, bool full=false) {

Is flooring catalog update task running.
Added: package bool flgCatalogUpdateTaskRunning() {

The catalogues treeview has been removed from FlgControlPanelPage

// custom/flooring/flgControlPanelPage.cm
Should never have been public and is no longer used.
Removed: extend public void createAndAppendTreeView(str key, str text, str desc, bool checked) {
Removed: public void update() {

New - Download request data carrier - SQLite database download.

// custom/flooring/flgDownloadDataCarriers.cm
Added: public class FlgDatabaseDownloadDataCarrier extends FlgCatalogDownloadDataCarrier {

Most lifecycle ID functions extended with str->Object auxData argument.

// custom/flooring/flgLifecycleId.cm
Old: public void flgAppendLifecycleIdMfgPrdKeyFun(guid k, function(FlgProduct):str fn) {
New: public void flgAppendLifecycleIdMfgPrdKeyFun(guid k, function(str, str->Object):str fn) {
Old: public str flgDefaultLifecycleIdMfgPrdKey(FlgProduct prd) {
New: public str flgDefaultLifecycleIdMfgPrdKey(str code, str->Object aux) {
Old: public guid flgLifecycleId(FlgProduct prd, guid mfgKey, function(FlgProduct):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
New: public guid flgLifecycleId(flgProductType prdType, TemplateShape tempShape, str code, str->Object aux, guid mfgKey, function(str, str->Object):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
Added: public guid flgLifecycleId(FlgProduct prd, guid mfgKey, function(str, str->Object):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
Old: public str flgLifecycleIdS(FlgProduct prd, guid mfgKey, function(FlgProduct):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
New: public str flgLifecycleIdS(flgProductType prdType, TemplateShape tempShape, str code, str->Object aux, guid mfgKey, function(str, str->Object):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
Added: public str flgLifecycleIdS(flgProductType prdType, TemplateShape tempShape, str code, str->Object aux, guid mfgKey, function(str, str->Object):str mfgPrdKeyFn=function flgDefaultLifecycleIdMfgPrdKey) {
Old: public str flgLifecycleIdS(FlgProduct prd, guid mfgKey, guid fnKey) {
New: public str flgLifecycleIdS(FlgProduct prd, guid mfgKey, guid fnKey) {
// custom/flooring/flgPalette.cm
Moved: public void flgBuildToolboxCardWindow(Window w) {
Moved to custom/flooring/flgToolboxCardWindow.cm

Old: public str flgPaletteCardLabel() {
New: private str flgPaletteCardLabel() {
Old: public void flgUpdatePaletteCardLabel(Card card) {
New: package void flgUpdatePaletteCardLabel(Card card) {

All Window creation functions moved from custom.flooring.import.functions.cm

// custom.flooring.functions.cm
Added: public Window flgAppendUrlField(
Added: public Window flgAppendButton(
Added: public Window flgAppendCheckBox(
Added: public Window flgAppendTextField(
Added: public Window flgAppendRadioButtonSeq(
Added: public Window flgAppendLabel(
Added: public Window flgAppendDropDown(

custom.flooring.import

Catalog Excel import moved to Catalogue Creator

The custom.flooring.import extension has changed parent from custom.flooring => custom.dataCatalog

Deprecated 'FlgExcelImport0' and 'FlgExcelImporter1' flooring catalog excel importers.

// custom.flooring.import.flgExcelImport0.cm
Deprecated: public class FlgExcelImport0 extends FlgImporter {

// custom.flooring.import.flgExcelImporter1.cm
Deprecated: public class FlgExcelImporter1 extends FlgImporter {

Added generated lifecycle IDs

New set used to guard against duplicate lifecycle IDs during product generation.

// custom.flooring.import.flgProductGenerator4.cm
Added: extend public str{} generatedLids() 
Added: extend public void appendLid(guid v)

Corrected spelling

Old: extend public void appendAuxillaryDataList(FlgProduct p, XmlTag t) {
New: extend public void appendAuxiliaryDataList(FlgProduct p, XmlTag t) {

Table of contents support added

// custom.flooring.import.flgXmlWriter.cm
New: public class FlgTableOfContents : unstreamable {

// custom.flooring.import.functions.cm
Removed: public Window flgAppendUrlField(
Removed: public Window flgAppendCheckBox(
Removed: public Window flgAppendTextField(
Removed: public Window flgAppendRadioButtonSeq(
Removed: public Window flgAppendLabel(
Removed: public Window flgAppendDropDown(
All Window creation functions moved to `custom.flooring.functions.cm`

New: public void flgWriteReport(Url url, str[] reports)

dll.sqlite

With the FTS5 extension it's now possible to create an FTS5 virtual table that will provide full-text search functionality to the database. No changes are needed unless you want to use this new functionality. For more info see: sqlite.org/fts5.html

Runtime/Behavior Changes

Autosave Resources

There will also be a text file for each autosave in the cmWritable/autosave folder. This file lists the resources used by the corresponding autosave.

Inside cmWritable/externalFormatterResources, resources are grouped by drawing name so that resources can be shared by all the autosaves for that drawing, eliminating redundant resaving of the same resources.

Floating-point line widths

Now that new calculations are performed when obtaining the width of a LineType, developers might have to tune the width values used in their non-unit width style LineTypes (eg. variable and real).

Invalid Filename

In cm/io/util/urlCheck.cm, use checkWindowsFilename instead of the deprecated isValidPath

Variants Constraints

cm.abstract.dataSymInterface

Interfaces related to Vx expression validation takes additional vendor argument.

// DsiExprValidationEnv (dsiExprValidationEnv.cm)
Old: public constructor(VxRuntime rt, dsiConstraintExpressionType exprType, str expr, DataCatalog cat)
New: public constructor(VxRuntime rt, dsiConstraintExpressionType exprType, str expr, DataCatalog cat, str vendor)


//dsiVariants.cm
Old: public bool dsiValidateConstraintExpr(DataCatalog cat, dsiConstraintExpressionType exprType, str expr, StrBuf error=null)
New: public bool dsiValidateConstraintExpr(DataCatalog cat, dsiConstraintExpressionType exprType, str expr, str vendor, StrBuf error=null)

custom.dataCatalog.builder

Constraints-related Cards (Tabs) in Catalog Creator are placed between Geometry and Validation Cards. Take note of the sort keys used.

Geometry         // 700 (no change)
Constraints      // 720 (added)
ConstraintTables // 725 (added)
VariantsTables   // 727 (added)
Validation       // 745 (no change)

custom.dataCatalog.builder.constraints

Interfaces related to Vx expression validation takes additional vendor argument.

// DcDBBuilderConstraintsCard (dcDBBuilderConstraintsCard.cm)
Old: extend public bool validExpression(dsiConstraintExpressionType constraintExpType, str exp, StrBuf error)
New: extend public bool validExpression(dsiConstraintExpressionType constraintExpType, str exp, str vendor, StrBuf error)

Previously deprecated Catalog Creator Constraints Tab classes and interfaces are now removed. New classes and interfaces are found in the package.

// dcDBuilderConstraintsCard.cm
Removed: public dcBuildEditConstraintsCard(DcDBBuilderCardWindow cw, int index=700)
Removed: public DcDBBuilderEditConstraintsCard dcDBBuilderEditConstraintsCard(Window this=null)
Removed: public class DcDBBuilderEditConstraintsCard 

// dcDBuilderConstraintsCells.cm
Removed: public class DcConstraintColumn
Removed: public class DcConstraintGridCell
Removed: public class DcConstraintExpColumn
Removed: public class DcConstraintExpGridCell 
Removed: public class DcConstraintCodeColumn 
Removed: public class DcConstraintCodeGridCell 
Removed: public class DcConstraintExpTypeColumn
Removed: public class DcConstraintExpTypeGridCell

// dcDBuilderConstraintsGridWindow.cm
Removed: public DcDBBuilderConstraintsSS dcConstraintsGridWindow
Removed: public class DcDBBuilderConstraintsSS

// dcDBuilderConstraintsShrink.cm
Removed: public class DcFramelessExpressionShrink

custom.dataCatalog.builder.variantsTables

Removed previously deprecated field for Variants Table UI class for Catalog Creator

// DcVariantsTableGridSubWindow (dcVariantsTableGridSubWindow.cm)
Removed: public DsButton importBtn

cm.abstract.dataSymbol

ItemTag key

ItemTags generated from DsPart will now use the data's dataId (if set) for the ItemTag key. If this isn't set, it will fallback to the previous behavior of using the styleNr and then the articleCode.

Cached Parts

The cached parts field on DsPData is now copy=null to avoid undo crashes.

cm.abstract.k2

Cabinet insert previews cache

Previews for cabinet inserts are now cached on a fuzzy basis: A cabinet with similar shape to one already cached will reuse the preview. Two cabinets count as similar if their shapes have the same previewCacheKey(). Note that the user can always clear their cache through the "Clear cached images" button in the Essential Kitchen EU library.

K2AlternativeValidateFunction

Due to a bug, alternatives would spread through any snappers it existed on before the update (regardless of their auto adoption flags), if it had at least one snapper next to it that was auto adopting. It now respects snappers auto adoption state as it should.

This will also cause alternatives to not spread to snappers unless they've been invalidated. Verify that your alternatives (custom implemented moldings/worktops/soffits for example) updates as they should when invalidated through e.g. a #connect event.

If your code relied on this bug to force snappers to update, you might need to make sure that more of your snappers than before are invalidated. Call <snapper>.invalidateBehaviorsIfRequired(...) with #connect or #propagatedConnect as the argument to invalidate them. See cm/abstract/k2/molding/k2AutoMoldingBehavior.cm for an example of this.

K2WtBuiltInPlacementBehavior

K2WtBuiltInPlacementBehavior used to automatically add K2AutoWorktopBuiltInPosBehavior to snappers spawned by its spawner. This no longer happens automatically.

In K2Creator, please add a basic K2AutoWorktopBuiltInPosBehavior behavior to each spawner that uses K2WtBuiltInPlacementBehavior. This is needed for its graphics to update properly as alignment is changed.

K2CategoryBehavior changes

K2CategoryBehavior is now added to all snappers by default from K2SnapperSpawner.gatherBehaviors(). If it has been manually added in K2Creator it needs to be removed from the catalog.

Multiple assortments

For appliances we now support selecting inserts from multiple assortments. To utilize this feature the properties for the insert need to be on the root insert snapper and the insert needs to manage the connection to the catalog for those properties. To make the front responsible for its properties it needs a behavior that has set to true.

Removed reduntant updateSymByRebuild

Removed updateSymByRebuild from K2CabinetGfxBehavior::userPropertyChanged. Should no longer be needed since updateSym gets called after every shape prop change.

XpLengthPartQuantity

XpLengthPartQuantity has been renamed to XpCutRunningMeterPartQuantity and XpRunningMeterPartQuantity has been added.

XpRunningMeterPartQuantity gives a quantity equal to the length of the measure. XpCutRunningMeterPartQuantity gives a quantity equal to the number of articles of a given length that are needed.

cm.abstract.material

Pre-fetch part hook for MaterialLegendController

We have identified several scenarios where material legends using MaterialLegendController were displaying excess materials. The solution is to register a pre-fetch part hook to clear temporary legend materials.

Old:

public FOMatLegendController foMatLegendController("FODataMaterialLegend");


/**
 * Append a SymbolMaterial to the DsMaterialLegend for the specified world.
 */
public void foDataAppendLegendMaterial(Material m, Snapper owner) {
    once {
	    appendPostFinalizeHook(function foDataPostFinalizeLegendHook);
    }

    foMatLegendController.appendLegendMaterial(m, owner, foDataMLCreator);
}

New:

public FOMatLegendController foMatLegendController("FODataMaterialLegend") : keep;


/**
 * Append a SymbolMaterial to the DsMaterialLegend for the specified world.
 */
public void foDataAppendLegendMaterial(Material m, Snapper owner) {
    once {
    	appendPreFetchPartsHook(function foDataPreFetchPartsLegendHook);  // new line
	    appendPostFinalizeHook(function foDataPostFinalizeLegendHook);
    }

    foMatLegendController.appendLegendMaterial(m, owner, foDataMLCreator);
}


/**
 * Pre fetch part hook for clearing temp legend materials.
 */
private void foDataPreFetchPartsLegendHook(Space space) {
    MaterialLegendController controller = foMatLegendController;
    if (controller) controller.clearTempLegendMaterials();
}

For a more generic code you can refer to cm/abstract/material/hooks.cm

Using OfficeMaterialLeg with MaterialLegendController

MaterialLegendController cannot be constructed using "OfficeMaterialLeg" as its auxillary key. If you are affected, you can migrate your old legends by extending MaterialLegendController and override previouslyUsingLegacyMLKey() to return true.

Old:

public MaterialLegendController foMatLegendController("OfficeMaterialLeg") : keep;

New:

public FOMatLegendController foMatLegendController("FOMaterialLegend") : keep;


/**
 * FO MaterialLegendController.
 */
public class FOMatLegendController extends MaterialLegendController {

    /**
     * Previously using OfficeMaterialLeg?
     */
    public bool previouslyUsingLegacyMLKey() {
	    return true;
    }
}

cm.abstract.materialHandling

public class MhStorageSpawnerSelector extends MhSystemSpawnerSelector
    public SnapperSpawner spawner(LayerSet classification, Object env=null) {
        Bugfix: Fixed spawner selection to prioritize exact match, over an equally-attractive-but-partial match.
        There were cases where an exact-match come later due to us iterating in alphabetical order (through allSorted)
        and we would return only a partial match.


MhStorageEditorDialog
- Issues with having leftover `Windows` leaking UI controls in `MhStorageEditorDialog` and `MhStorageConfigurator` has been fixed. You may need to double check your UI behaviors if you do any update or removal of UI controls dynamically.
- `buildPropertiesSubWindow()` for building `MhStorageEditorItem` now use `item.class.toS` instead of `item.label` as key for the `Card`.


MhSnapperShape
- Note: There are two versions of the localBound method which can be easily confused: localBound() and localBound(symbol[])
- localBound() now checks for owner before executing the localBoundWithChildren() case, and will return localBound(null) which returns the geometry's bound in other cases. This fixes the inconsistent bound returned during contexts in which the shape have not obtained an owner yet.


MhLevelInsertHeightBehavior changes

The freeSpaceAbove property is no longer visible when there is no level above the currently selected snapper.

Old:
    /**
     * Show height prop.
     */
    extend public void showHeightProperties() {
        for (k, _ in getPropsWithAttribute(#height))
          if (corePropertyHidden(k)) showCoreProperty(k);
    }


New:
    /**
     * Show height prop.
     */
    extend public void showHeightProperties(MhSnapper owner, MhSnapper toSnapper) {
        for (k, _ in getPropsWithAttribute(#height))
          if (corePropertyHidden(k) and propIsVisible(k, owner, toSnapper)) showCoreProperty(k);
    }


    /**
     * Property is visible?
     */
    extend public bool propIsVisible(str key, MhSnapper owner, MhSnapper toSnapper) {
        if (key == "freeSpaceAbove") {
            <MhSnapper firstAbove, MhSnapper firstBelow> = getFirstAboveAndBelowSnappers(owner, toSnapper, owner.pos.z);
            if (!firstAbove) return false;
        }
        return true;
    }

These methods have been introduced to allow more control over the bounds used to calculate freeSpaceAbove and freeSpaceBelow. Override geoSymbolsForCalculation() to control what geometries should be included in the bound.

    /**
     * Free spaces domains.
     * v0 = freeSpaceAbove domain.
     * v1 = freeSpaceBelow domain.
     */
    extend public <SubSet, SubSet> freeSpacesDomains(MhSnapper firstAbove, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper, Object env=null) {
        return <coreProperty("freeSpaceAbove").?domain, coreProperty("freeSpaceBelow").?domain>;
    }


    /**
     * Get snapper bound used for calculation.
     */
    extend public box boundForCalculation(MhSnapper snapper, bool toSpace=false) {
        Box res = cachedBounds.get(snapper);
        if (!res) {
            res = shapeBoundWithChildren(snapper, geoSymbolsForCalculation());
            cachedBounds.put(snapper, res);
        }
        if (toSpace) return res.v.transformed(snapper.toSpaceTransform);
        return res.v;
    }


    /**
     * Symbols used to retrieve geometries for snapper bound used for calculation.
     */
    extend public symbol[] geoSymbolsForCalculation() {
        return [sLevel, sUnitLoad, sTunnel];
    }

calculateFreeSpaceAboveAndBelow() has been updated to use boundForCalculation().

Old:
    /**
     * Calculate free space above and below.
     */
    extend public <Double, Double> calculateFreeSpaceAboveAndBelow(Snapper owner, Snapper toSnapper,
                                                                   double insertH,
                                                                   Snapper specificAboveSnapper=null,
                                                                   Snapper specificBelowSnapper=null) {
        box b = owner.localBound();
        box b0 = toSnapper.localBound;
        Double above = b0.h - insertH;
        Double below = insertH b.p0.z;

        <Snapper firstAbove, Snapper firstBelow> = getFirstAboveAndBelowSnappers(owner, toSnapper, insertH);

        if (firstAbove) {
            above = firstAbove.pos.z - insertH - b.h;
        }

        if (firstBelow) {
            below = insertH - firstBelow.pos.z - firstBelow.localBound.h;
        }

        if (specificAboveSnapper and specificAboveSnapper != firstAbove) above = null;
        if (specificBelowSnapper and specificBelowSnapper != firstBelow) below = null;

        return <above, below>;
    }


New:
    /**
     * Calculate free space above and below.
     */
    extend public <Double, Double> calculateFreeSpaceAboveAndBelow(MhSnapper owner, MhSnapper toSnapper,
                                                                   double insertH,
                                                                   Snapper specificAboveSnapper=null,
                                                                   Snapper specificBelowSnapper=null) {
        box ownerB = boundForCalculation(owner);
        box b0 = toSnapper.localBound;
        Double above = b0.h - insertH;
        Double below = insertH ownerB.p0.z;

        <MhSnapper firstAbove, MhSnapper firstBelow> = getFirstAboveAndBelowSnappers(owner, toSnapper, insertH);

        if (firstAbove) {
            above = boundForCalculation(firstAbove, toSpace=true).p0.z - insertH - ownerB.p1.z;
        }

        if (firstBelow) {
            below = insertH ownerB.p0.z - boundForCalculation(firstBelow, toSpace=true).p1.z;
        }

        if (specificAboveSnapper and specificAboveSnapper != firstAbove) above = null;
        if (specificBelowSnapper and specificBelowSnapper != firstBelow) below = null;

        return <above, below>;
    }

The updateHeightProperties() method has been broken up into multiple methods to make it easier to override. These methods have also had behavioral changes.

  1. The insertHeight property is unlocked if the locked height is no longer valid (e.g. switching candidates to a different bay with a different height domain).
Old:
    if (heightProp.?locked and heightProp == currentProp) {
        p.z = heightProp.value.safeDouble;
        aboveProp.?unlock();
        belowProp.?unlock();
    }


New:
    /**
     * Check insert height locked.
     */
    extend public void checkInsertHeightLocked(point& p, SubSet heightDomain) {
        CoreProperty heightProp = coreProperty("insertHeight");
        if (heightProp.?locked) { // Height is locked, maintain current height.
            if (heightProp.value !in heightDomain) {
                heightProp.unlock();
            } else {
                p.z = heightProp.value.safeDouble;
                coreProperty("freeSpaceAbove").?unlock();
                coreProperty("freeSpaceBelow").?unlock();
            }
        }
    }
  1. The freeSpaceAbove property is unlocked if the locked value is no longer valid or if there is no longer a snapper above the selected snapper. The z-position calculation has also been modified to utilize the boundForCalculation() method.
Old:
    if (aboveProp.?locked and aboveProp == currentProp) {
        p.z = (firstAbove ? firstAbove.pos.z - b.h : maxH) - aboveProp.value.safeDouble;
        heightProp.?unlock();
        belowProp.?unlock();
    }


New:
    /**
     * Check free space above locked.
     */
    extend public void checkFreeSpaceAboveLocked(point& p, SubSet aboveDomain, MhSnapper firstAbove, MhSnapper owner, MhSnapper toSnapper) {
        CoreProperty aboveProp = coreProperty("freeSpaceAbove");
        if (aboveProp.?locked) {
            if (aboveProp.value !in aboveDomain or !firstAbove) {
                aboveProp.unlock();
            } else {
                p.z = (firstAbove ? firstAbove.pos.z boundForCalculation(firstAbove).p0.z - boundForCalculation(owner).p1.z : toSnapper.localBound.h) - aboveProp.value.safeDouble;
                coreProperty("insertHeight").?unlock();
                coreProperty("freeSpaceBelow").?unlock();
            }
        }
    }
  1. The freeSpaceBelow property is unlocked if the locked value is no longer valid. The z-position calculation has also been modified to utilize the boundForCalculation() method.
Old:
    if (belowProp.?locked and belowProp == currentProp) {
        p.z = firstBelow.MhSnapper.?localBound().p1.z
          (firstBelow? firstBelow.pos.z : 0)
          belowProp.value.safeDouble
          - b.p0.z;

        heightProp.?unlock();
        aboveProp.?unlock();
    }


New:
    /**
     * Check free space below locked.
     */
    extend public void checkFreeSpaceBelowLocked(point& p, SubSet belowDomain, MhSnapper firstBelow, MhSnapper owner, MhSnapper toSnapper) {
        CoreProperty belowProp = coreProperty("freeSpaceBelow");
        if (belowProp.?locked) {
            if (belowProp.value !in belowDomain) {
                belowProp.unlock();
            } else {
                p.z = (firstBelow ? boundForCalculation(firstBelow, toSpace=true).p1.z : 0) belowProp.value.safeDouble - boundForCalculation(owner).p0.z;
                coreProperty("insertHeight").?unlock();
                coreProperty("freeSpaceAbove").?unlock();
            }
        }
    }
  1. The freeSpaceAbove and freeSpaceBelow properties will now be refreshed if their values change but insertHeight did not.
Old:
    double oldInsertHeight = insertHeight;
    if (owner.pos != p) owner.setPos(p);
    insertHeight = p.z;

    <Double above, Double below> = calculateFreeSpaceAboveAndBelow(owner, toSnapper, insertHeight);

    freeSpaceAbove = above.?v;
    freeSpaceBelow = below.?v;

    if (oldInsertHeight != insertHeight) {
        heightProp.?refreshProperty();
        aboveProp.?refreshProperty();
        belowProp.?refreshProperty();

        // Calling diff rebuild instead causes the prop UI to constantly flicker.
        if (domainsUpdated) {
            for (prop in [heightProp, aboveProp, belowProp]) {
                for (CoreDistanceField ctrl in prop.controls) {
                    ctrl.validSubSet = prop.domain;
                    break;
                }
            }
        }
    }


New:
    /**
     * Update height and space values.
     */
    extend public void updateHeightAndSpaceValues(point p, MhSnapper owner, MhSnapper toSnapper, bool domainsUpdated) {
        double oldInsertHeight = insertHeight;
        if (owner.pos != p) owner.setPos(p);
        insertHeight = p.z;

        <Double above, Double below> = calculateFreeSpaceAboveAndBelow(owner, toSnapper, insertHeight);

        double oldFreeSpaceAbove = freeSpaceAbove;
        double oldFreeSpaceBelow = freeSpaceBelow;
        freeSpaceAbove = above.?v;
        freeSpaceBelow = below.?v;

        CoreProperty heightProp = coreProperty("insertHeight");
        CoreProperty aboveProp = coreProperty("freeSpaceAbove");
        CoreProperty belowProp = coreProperty("freeSpaceBelow");
        if (oldFreeSpaceAbove != freeSpaceAbove) aboveProp.?refreshProperty();
        if (oldFreeSpaceBelow != freeSpaceBelow) belowProp.?refreshProperty();
        if (oldInsertHeight != insertHeight) heightProp.?refreshProperty();
        // Calling diff rebuild instead causes the prop UI to constantly flicker.
        if (domainsUpdated) {
            for (prop in [heightProp, aboveProp, belowProp]) {
                for (CoreDistanceField ctrl in prop.controls) {
                    ctrl.validSubSet = prop.domain;
                    break;
                }
            }
        }
    }

MhBracingPattern changes

MhBracingPattern now inherits from MhStorageSingleton and should be treated as singletons.

The following functions have been added to retrieve the generic bracing patterns available in the abstract.

/**
 * Bracing pattern singletons.
 */
public MhDBracePattern mhDBracePattern() {
    static MhDBracePattern pattern;
    if (!pattern) ?pattern = mhStorageSingleton(MhDBracePattern());
    return pattern;
}
public MhKBracePattern mhKBracePattern() {
    static MhKBracePattern pattern;
    if (!pattern) ?pattern = mhStorageSingleton(MhKBracePattern());
    return pattern;
}
public MhXBracePattern mhXBracePattern() {
    static MhXBracePattern pattern;
    if (!pattern) ?pattern = mhStorageSingleton(MhXBracePattern());
    return pattern;
}
public MhZBracePattern mhZBracePattern() {
    static MhZBracePattern pattern;
    if (!pattern) ?pattern = mhStorageSingleton(MhZBracePattern());
    return pattern;
}

MhBayLevelEditorItem changes

applySnappers() previously only returned the main snapper of the editor space selection. It has been changed to now return all level snappers and unit load snappers in the selection.

Old:
    /**
     * Apply snappers.
     */
    public MhSnapper{} applySnappers(Space space) {
        if (SpaceSelection selection = space.selection) {
            ?MhSnapper main = selection.main;
            if (main.isLevel) return {MhSnapper: main};
        }

        return super(..);
    }


New:
    /**
     * Apply snappers.
     */
    public MhSnapper{} applySnappers(Space space) {
        if (SpaceSelection selection = space.selection) {
            MhSnapper{} res();
            for (MhSnapper snapper in selection.snappers) {
                if (snapper.isLevel or snapper.isUnitLoad) {
                    res << snapper;
                }
            }
            return res;
        }

        return super(..);
    }

Pre configurator preview number of aisles

Previously only 1 aisle would be generated for the pre configurator preview snappers. It is now possible to override this to generate different number of aisles based on the selected row layout. We now also generate 2 aisles for when the selected row layout is of class MhRowSingleEndLayout.

Old:
    /**
     * Setup row animation info for preview population.
     */
    extend public MhRowAnimationInfo rowAnimationInfo(MhStorageConfiguration config, MhSnapper row) {
        ...
        info.crossAisleDist = config.calcWidthFromAisles(info, 1);
        return info;
    }


New:
    /**
     * Setup row animation info for preview population.
     */
    extend public MhRowAnimationInfo rowAnimationInfo(MhStorageConfiguration config, MhSnapper row) {
        ...
        info.crossAisleDist = config.calcWidthFromAisles(info, rowNumAisles(info.rowLayout));
        return info;
    }


    /**
     * Row number of aisles for preview population.
     */
    extend public int rowNumAisles(MhRowLayout layout) {
        if (layout in MhRowSingleEndLayout) return 2;
        return 1;
    }

There are now new MhStorageConfigurationPreview classes to handle number of aisles for the MhRowSingleEndDoubleDeepLayout or MhCantileverSingleEndRowLayout layouts.

New:
/**
 * Racking configuration preview.
 */
public class MhRackingConfigurationPreview extends MhStorageConfigurationPreview {

    /**
     * Row number of aisles for preview population.
     */
    public int rowNumAisles(MhRowLayout layout) {
        if (layout in MhRowSingleEndDoubleDeepLayout) return 2;
        return super(..);
    }
}


/**
 * Cantilever configuration preview.
 */
public class MhCantileverConfigurationPreview extends MhRackingConfigurationPreview {

    /**
     * Row number of aisles for preview population.
     */
    public int rowNumAisles(MhRowLayout layout) {
        if (layout in MhCantileverSingleEndRowLayout) return 2;
        return super(..);
    }
}


Use:
public class MhRackingConfiguration extends MhStorageRowConfiguration {
    /**
     * Preview behavior.
     */
    public MhStorageConfigurationPreview configurationPreview() {
        if (!preview) preview = MhRackingConfigurationPreview();
        return preview;
    }
}

cm.abstract.materialHandling.storage.racking.cantilever

Abstract cantilever system populate changes

uprightDepth is now meant to be included in frameDepth by default, so we no longer manually add that value when retrieving the total frame depth.

Old:
public class MhCantileverSinglePopulator extends MhCantileverRowPopulator {
    public double cantileverFrameDepth() {
        double uprightD = uprightDepth;
        double frameD = frameDepth;
        return frameD uprightD;
    }
}


New:
public class MhCantileverSinglePopulator extends MhCantileverRowPopulator {
    public double cantileverFrameDepth() {
        return frameDepth;
    }
}


Old:
public class MhCantileverDoublePopulator extends MhCantileverRowPopulator {
    public double cantileverFrameDepth() {
        double uprightD = uprightDepth;
        double frameD = frameDepth;
        return frameD * 2 uprightD;
    }
}


New:
public class MhCantileverDoublePopulator extends MhCantileverRowPopulator {
    public double cantileverFrameDepth() {
        return frameDepth*2 - uprightDepth;
    }
}


Old:
public class MhCantileverRowPopulator extends MhStorageRowPopulator : abstract {
    extend public double cantileverBayDepth() {
        return frameDepth;
    }
}


New:
public class MhCantileverRowPopulator extends MhStorageRowPopulator : abstract {
    extend public double cantileverBayDepth() {
        return frameDepth - uprightDepth;
    }
}

The center bay has a new symbol added to it's classification sBayCenter.

Old:
    public MhEngineEntry createRackingRowEntry() {
        ...
        LayerSet centerBayLayer = layerSet(sBay, sFlueGap);
    }


New:
    public MhEngineEntry createRackingRowEntry() {
        ...
        LayerSet centerBayLayer = layerSet(sBay, sFlueGap, sBayCenter);
    }

Cantilever arm population on frames

Further changes have been made to construct and populate arm snappers on frame snappers.

public class MhCantileverLevelConstructionalPopulateFunction extends MhLevelConstructionalPopulateFunction {

    /**
     * Populator
     */
    public MhPopulator populator(box populateBox) {
        MhPopulator res = super(..);
        if (res as MhStepperPopulator) {
            point p = populateBox.p0;
            p.x += populateBox.w/2;
            res.startPos = p;
            res.currentPos = p;
        }

        return res;
    }


    /**
     * Execute.
     */
    public Object exec() {
        ?MhStorageConfiguration config = configuration();
        if (!config) return false;

        if (isFrame(parent)) {
            double uprightD = config.frameUprightDepth().safeDouble();
            if (isDouble(parent)) { // Populate arms front and back.
                MhEngineConstructionEntry[] children;
                str key = parent.cacheKey();
                ?children = mhSystemEngineCache.get(key).?obj.copy();

                if (children.empty) {
                    box b = parent.localBound;
                    b.d = (b.d - uprightD)/2;
                    box b1 = b.moved((b.p0.x, b.p1.y uprightD, b.p0.z));
                    MhEngineConstructionEntry[] front = populateLevels(0, b);
                    MhEngineConstructionEntry[] back = populateLevels(0, b1, 0deg);
                    children = front back;
                    mhSystemEngineCache.put(key, children.copy());
                }

                for (c in children) parent << c;

                return true;
            }

            // Single frame.
            box b = parent.localBound();
            b.d = b.d - uprightD;
            addLevels(0, b);
            return true;
        }

        return super(..);
    }


    /**
     * EntryLayout.
     * Why call it a bayEntry when it can be any entry?
     */
    public MhBayEntryLayout entryLayout() {
        if (MhSystemSpawnerSelector ss = getSpawnerSelector) {
            ?MhSnapperSpawner frame = getSpawnerSelector.?spawner(layerSet(sFrame));
            return frame.?entryLayout(ss).?MhBayEntryLayout;
        }

        return null;
    }


    /**
     * Default entry.
     */
    public MhEngineConstructionEntry defaultLevelEntry(box b, LayerSet classification) {
        if (isFrame(parent)) return super(..);
        return null;
    }
public class MhCantileverFrameEngineBehavior extends MhFrameEngineBehavior {

    /**
     * Put engine function to run.
     */
    public void putEngineRunFunctions(MhSnapper snapper, symbol event="", Object env=null) {
        if (!snapper) return;
        MhEngine engine = engine(snapper);
        switch(event) {
          case sShapeChange, sShapeAndSymChange : {
              if (env as MhSnapperChangedEnv) {
                  bool stealing = false;

                  if (snapper != env.owner) {
                      if (MhSnapper stealSource = getStealSource(env, snapper)) {
                          stealing = true;
                          mhPutEngineRunFunction(engine, "rowChildStealConfig", snapper=snapper, source=stealSource);
                      }
                  }

                  Object holeZDomain = snapper.domain("holeZDomain");
                  CollisionPrimitive additionalPrim = additionalPrim(snapper);
                  if (env.translatedKey in ["uprightH", "h"] and !stealing) {
                      if (levelPopulate(snapper)) {
                          // level height changed
                          mhPutEngineRunFunction(engine, "levelPopulate", snapper=snapper,
                                                 holeZDomain=holeZDomain,
                                                 loadWithinLimit=loadWithinLimit(snapper),
                                                 revertAutoULPopulate=revertAutoULPopulate(snapper),
                                                 additionalPrim=additionalPrim,
                                                 configKey=snapper.configName);
                      }
                  }
                  if (env.translatedKey in ["d", "h"] and !stealing) {
                      // Run level arrange, since cantilever levels are children to frames.
                      mhPutEngineRunFunction(engine, "levelArrange", snapper=snapper,
                                             holeZDomain=holeZDomain,
                                             additionalPrim=additionalPrim);
                  }
              }
          }
          case sSnapperInserted: {
              Object holeZDomain = snapper.domain("holeZDomain");
              CollisionPrimitive additionalPrim = additionalPrim(snapper);

              // Run level arrange, since cantilever levels are children to frames.
              mhPutEngineRunFunction(engine, "levelArrange", snapper=snapper,
                                     holeZDomain=holeZDomain,
                                     additionalPrim=additionalPrim);

          }
          default : {
          }
        };
        super(..);
    }


    /**
     * Collect engine function to run.
     */
    public void fetchEngineFunctionsRunG2(MhEngineFunctionRun[] functions, MhSnapper snapper, symbol event="", Object env=null) {
        super(..);
        switch (event) {
          case sShapeChange, sShapeAndSymChange : {
              functions << MhEngineFunctionRun("rowChildStealConfig");
              functions << MhEngineFunctionRun("levelPopulate");
              functions << MhEngineFunctionRun("levelArrange");
          }
          case sSnapperInserted: {
              functions << MhEngineFunctionRun("levelArrange");
          }
          default :;
        };
    }


    /**
     * Gather function args.
     */
    public str->Object engineFunctionArgsG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="",
                                                   MhPreprocessArgsEnv preprocessArgs=null, Object env=null) {
        switch (func.name) {
          case "levelPopulate" : {
              return props { snapper=snapper,
                    holeZDomain=snapper.domain("holeZDomain"),
                    loadWithinLimit=loadWithinLimit(snapper),
                    revertAutoULPopulate=revertAutoULPopulate(snapper),
                    additionalPrim=additionalPrim(snapper),
                    configKey=snapper.configName };
          }

          case "levelArrange" : {
              return props { snapper=snapper,
                    holeZDomain=snapper.domain("holeZDomain"),
                    additionalPrim=additionalPrim(snapper) };
          }

          default :;
        };


        return super(..);
    }


    /**
     * Accepts function run.
     */
    public bool acceptFunctionRunG2(MhSnapper snapper, MhEngineFunctionRun func, symbol event="", Object env=null) {
        switch (func.name) {
          case "levelPopulate" : {
              if (env as MhSnapperChangedEnv) {
                  if (snapper != env.owner) {
                      if (MhSnapper stealSource = getStealSource(env, snapper)) {
                          return false;
                      }
                  }

                  return env.translatedKey in ["uprightH", "h"] and levelPopulate(snapper);
              }
              return false;
          }
          case "levelArrange" : {
              if (event in [sShapeChange, sShapeAndSymChange]) {
                  if (env as MhSnapperChangedEnv) {
                      if (snapper != env.owner) {
                          if (MhSnapper stealSource = getStealSource(env, snapper)) {
                              return false;
                          }
                      }
                      return env.translatedKey in ["d", "h"];
                  }
                  return false;
              } else if (event == sSnapperInserted) {
                  return true;
              }
          }
          default :;
        };
        return super(..);
    }


    /**
     * Invalidate and return true if required.
     */
    public bool invalidateIfRequired(Object owner, symbol k, MhSnapperChangedEnv env=null) {
        if (k == sAfterInitialExport) return true;
        return super(..);
    }

cm.abstract.office

Office Snapper Manager

OfficeSnapperManagerRedView3D now will call getDialog().updateCoreProperties() when the selection is changed in the view.

Made fixes/improvements to the dialog and OfficeSnapperManager in regards to its support for G2 quick properties.

Panel Skin Animations

Updated how last values are handled for PanelSkinInsertAnimation.

Fix a graphical issue with the PanelSkinArrowVessel where it wasn't properly rotated

Panels/Junctions

beginSideStretch(Connector c) now calls pickedUp() after stretchDisconnectInGroup().

New SIF abstract

If you have used SIF rs in your extension and they are now missing, you have the following options:

  1. Move all SIF functionality to its own pacakge, then specify next rs package in your extension's init.
    putNextRsPkg("custom.yourExtension.sif", "cm.abstract.sif")
    
  2. Explicitly call getRs specifying the cm.abstract.sif package.
    Old: $sifFilesFilter;
    New: getRs("sifFilesFilter", "cm.abstract.sif");
    

Lazy startup of cm.abstract.office and removal of implicit part columns registration

cm.abstract.office will no longer always startup for users that do not require it, as part of core package dependency cleanup and performance optimization. Previously, starting cm.abstract.dataSymbol will always result in the startup of cm.abstract.office.

This may result in some PartColumns from cm.abstract.part not being registered automatically at all times as before, manifesting in the form of a crash for extensions that do not directly depend on cm.abstract.office.

Suggested fix is to explicitly declare and register the part columns you need in your custom extensions by calling registerPartColumn(). You may get warnings if the column have already been registered by other extensions, but it should able to be ignored safely.

AOComponent

AOComponent now has it's propdefs set as cached=true.

Fixed a bug where you couldn't set an AOComponent's parent to null via the propdef.

Typical Blocks

Fixed a bug where spanned stack frames could cause panels to go below the floor due to snapping lower then expected.

cm.core

COM Cache Changes

In an effort to lessen drawing file size, CustomerOwnMaterials are no longer stored in World.auxiliaryData and have been moved to World.cachedData.

Note: This means unused COMs are no longer saved with the drawing.

For direct access to a COM, we advise usage of cm.abstract.material.customerOwnMaterials(World world)

Example:

if (CustomerOwnMaterial com = customerOwnMaterials(mainWorld()).?find(myKey)) {
   // do something with your COM
}

Compontent

Updated the base constructor to call initialize.

Old:
public constructor() { /** Default */ }

New:
public constructor() {
    super(null);
    initialize();
}

Property Stretch

Added a bool to allow for code to check whether the animation is in the doSuperStretch() method.

Added a call to droped() when it inserts snappers from super stretch

View mode changes

setDefaultViewModes() now acts on mainWorld() instead of activeWorld(), so it is no longer dependent on the last view that was made active.

Old:
/**
 * Set default view modes.
 */
public void setDefaultViewModes() {
    if (World world = activeWorld()) {
        if ((ViewMode[]) viewModes = defaultViewModes()) {
            world.setViewModes(viewModes);
        }
    }
}


New:
/**
 * Set default view modes.
 */
public void setDefaultViewModes() {
    if (World world = mainWorld(selectWorldIfNull=false)) {
        if ((ViewMode[]) viewModes = defaultViewModes()) {
            world.setViewModes(viewModes);
        }
    }
}

calculation.cm

Added new fields to calculateWorldPrice for BOM analytics purpose.

Old: public double calculateWorldPrice(Space space, bool ignoreGlobalAdjustments=false, bool abortable=false, Int partCount=null) {
New: public double calculateWorldPrice(Space space, bool ignoreGlobalAdjustments=false, bool abortable=false, Int partCount=null,
									   Timespan timelimit=null, Datetime deadline=null, bool flushSomePrices=false) {

cm.subset.doubleRange.cm

An issue was fixed in the DoubleRange and DoubleSubRange classes which could potientially cause an infinite loop.

old:
    public Object next(Object o) {
        (...)
	    if (res > maxV) return maxV;
        (...)
    }
New:
    public Object next(Object o) {
        (...)
	    if (res > maxV) return null;
        (...)
    }
Old:
    public Object previous(Object o)  {
        (...)
	    if (res < minV) return minV;
        (...)
    }
New:
    public Object previous(Object o)  {
        (...)
	    if (res < minV) return null;
        (...)
    }

cm.subset.gProp.cm

Added: public class ToolTipGProp extends GProp {}

cm.core.block

Change how block stores lights in FetchLightEnv3D's entries.

Before 14.5 the collection of lights in a block space was stored incorretly in the FetchLightEnv3D. It tryed to store etch individual light per snapper in the entries map. This hade the side effect that etch light over write the privies light so only on light would be stored per snapper. This has now been change to store a Light3D[] instead for etch snapper. This means that any code that uses the FetchLightEnv3D entries field need to change to use a Light3D[] insted of Light3D.

cm.core.photo

cm.std.photo.labView2D.cm

Old:
    public constructor(PhotoLabDialog dialog, Space space, Window parent, View3D peekAtView3D) {
	view2D = REDView2D(space, "lab2DView", parent);
        (...)
New:
    public constructor(PhotoLabDialog dialog, Space space, Window parent, View3D peekAtView3D) {
        view2D = FilteredLabView2D(space, "lab2DView", parent);
	(...)

cm.core.red3D.distributed

zrpcRenderChore.cm

Method processProtocol() has been updated to accurately calculate job transfer progress. If buffer size is used to calculate progress and the number of bytes packed is less than buffer size, progress will not be calculated correctly. Instead we compare the number of bytes packed.

Old:
extend package rpcStatus processProtocol() {
    (...)
    if (zcall.exec() == 0) {
	  if (job) job.packageProgress(packageToSend.first,
	                                packageToSend.last,
	                                factory.bufferSize,     
					factory.totalSize);
    (...)
}
New:
extend package rpcStatus processProtocol() {
    (...)
    if (zcall.exec() == 0) {
	  if (job) job.packageProgress(packageToSend.first,
	                                packageToSend.last,
					factory.bytesPacked.int,
					factory.totalSize);
    (...)
}

cm.core.ui

Calling cm.core.ui.showWorldPropertiesDialog(World, Window) will no longer show the World Properties dialog as that functionality has been moved to the Info Page. Similarly, setting the showWorldPropertiesAtStart boolean in CoreSettings will no longer work to show the dialog.

cm.std.draw3D

Changed subclass of PaperDraw3DPolyReferencePointInsertAnimation

Changed the subclass of PaperDraw3DPolyReferencePointInsertAnimation from Draw3DReferencePointInsertAnimation to Draw3DPolyReferencePointInsertAnimation. This changes the insert animation the "Grouped help points" button in the "Drawing (paper)" library in paperspace from inserting a line to inserting a polyline.

// cm.std.draw3D.draw3DReferencePoint.cm
Modified: public class PaperDraw3DPolyReferencePointInsertAnimation extends Draw3DPolyReferencePointInsertAnimation

cm.std.photo.labBox

cm.std.photo.labFilters.cm

Some of the props added now support tooltips.

Old: 
    public GProp[] initProps() {
	GProp[] seq();
	DoubleRange span(-1, 1);
	seq << GProp("toneMapping", $toneMappingLabel, Bool(true));
	seq << GProp("toneMapBackground", $toneMapBackgroundLabel, Bool(true));
	seq << GProp("opendenoise", $openDenoiseLabel, Bool(true));
        (...)

New:
    public GProp[] initProps() {
	GProp[] seq();
	DoubleRange span(-1, 1);
	seq << TooltipGProp("toneMapping", $toneMappingLabel, Bool(true), $toneMappingTip);
	seq << TooltipGProp("toneMapBackground", $toneMapBackgroundLabel, Bool(true), null, $toneMapBackgroundTip);
	seq << TooltipGProp("opendenoise", $openDenoiseLabel, Bool(true), $openDenoiseTip);
        (...)

cm.win

The methods Window.exit and Window.mouseLeftChild can now get null passed into the to argument.

    extend public void exit(pointI p, Window to) { ... }
    extend public void mouseLeftChild(Window child, Window to) { ... }

This happens when the mouse cursor moves from a CET window and outside of CET. It means that code in these methods needs to be null safe in regards to the to window.

Miscellaneous

Variants Constraints

DsRuleType is now vendor specific

DsRuleType catalog entity is now fixed to be vendor specific (as per the OFDA schema, similar to Features and Products). Following the convention, DsRuleType is associated a particular by having the vendor code stored in the class: a new vendor field as added.

// DsRuleType (cm/abstract/dataSymInterface/catalog/ruleType.cm)
Added: `private str _vendor
Added: extend public str vendor()
Added: extend public str vendor=(str vend)

cm.abstract.materialHandling

Some common abstract material handling debug tools have been moved and consolidated into cm.abstract.materialHandling.debug package, and some automated test methods have been renamed for clarity:

cm/abstract/materialHandling/debug/library.cm
public void appendMhDebugContainerLimbs(LibraryLimb root, symbol pkg=#:package : caller eval)


cm/abstract/materialHandling/storage/racking/test/initTest.cm
- Old: public void initTestSuite() {
New: public void mhInitTestSuite() {

- Old: public void runnerTestSuite() {
New: public void mhRunnerTestSuite() {

- Old: public void compileAll() {
New: public void mhCompileAll() {