Overview

cm.core.collabG3

The overall stability and performance of CollabPro has been improved:

  • A facelift to simplify user experience
  • Cleanup and simplification of window resizing logic
  • Improvements to logging and error handling
  • CollabPro now attempts to synchronize realtime project data with server on load, before applying appropriate load world or space hooks, to ensure data consistency.
  • RTInvalidate calls that were invoked before the RT runtime is initialized are now deferred and will be invoked when the runtime is ready.

See also related changes in cm.network.cbb.

For a developer's introduction to supporting CollabPro (G3), refer to this document.

cm.core.dwg

The DWG dialog (commonly known as "CAD Settings") have received a large update to allow selecting and editing multiple DWGs at the same time. As a result, many interfaces have been updated to accommodate the new functionality.

cm.network.cbb

CBBClient is the networking client used by CollabPro to exchange data with the cloud. We have improved the connection stability and reliability through better error handling and clearer status information.

Compile Time Changes

cm.abstract.extrusions

The visibility of many interfaces across the whole abstract have been changed from public to package or private, as they were not intended to be used elsewhere. If you require any of the changed interfaces, consider making a local copy of it or contact developer support.

cm.core

copySelection.cm

The restoreCleanup() function has been removed. Its primary functionality made unexpected modifications to the snapper being copied. As a replacement to calling restoreCleanup(), use if (Space space = getSpace()) space.select(SpaceSelection(this)); to restore the original selection.

If modifications to the original snapper is required for some reason (which is highly discouraged), consider making use of the snapper functions beforeUserCopied(..) or userCopied(..) instead.

Removed: final public void restoreCleanup() {

cm.core.collabG3

# CollFilesDialogResizer
Removed: resize
Removed: needUpdateOnResize

Added: resize0
Added: resize1

cm.core.dwg

dwgDialog.cm

Old: public Snapper loadDwgFiles(Url[] files, DropFiles drop=null, Point dropSpacePos=null, Point pos=null, bool exception=false) {
New: public Snapper{} loadDwgFiles(Url[] files, DropFiles drop=null, Point dropSpacePos=null, Point pos=null, bool exception=false) {

class DwgDialog

Many interfaces have been changed to accommodate the new multi-select functionality. Most notably, a lot of functions now take a Snapper argument that they operate on instead of always operating on the selected DWG. This makes it possible to operate on individual DWGs in the selection when necessary.

The following interfaces that were used to get the currently selected DWG have been updated to return the set of all selected DWGs.

Old: package Snapper activeDwgSnapper : public readable;
Old: final public Snapper snapper() {
New: final public Snapper{} selection() {
Old: extend public DwgTvi selectedTvi() {
New: final public DwgTvi{} selectedTVItems() {

The following interface that was used to select a DWG has been updated to also handle appending to selection. The reason for it being 'smart' is that it is not a simple select. It can pop up a modal dialog and keep modified DWGs in selection even if removePrevious=true.

Old: final public void changeActiveDwg(Snapper s, bool rebuild=true) {
New: final public bool smartSelect(Snapper dwgSnapper, bool removePrevious=true, bool invokeCallback=true) {

To be able to select many DWGs at once the following interfaces have been added.

Added: final public bool smartSelect(Snapper{} dwgSnappers, bool removePrevious=true, bool invokeCallback=true) {
Added: final public bool smartSelect(str{} keys, bool removePrevious=true, bool invokeCallback=true) {

The dwgSnapperIsParent-field has been removed as it is no longer needed. To figure out if a tree view item is a parent it is possible check item in DwgParentTvi instead. Selected parent tree view items will not contribute to final public Snapper{} selection().

Removed: private bool dwgSnapperIsParent : public readable;

The following methods are deemed no longer needed and have been removed. There is no direct replacement for them.

Removed: final public void setScaleFromInsUnits(bool update=true) {
Removed: final public Snapper snapperFromItem(TreeViewItem item) {
Removed: final public str getUnitKey() {

The fileTreeViewChanged()-function has been removed. To update the file tree view, call updateFileTreeView or updateContent instead.

Removed: final public void fileTreeViewChanged() {

These methods can be replaced with methods with the same name on DwgCaptureSnapper.

Removed: final public bool sourceFileMissing() {
Removed: final public bool sourceFileOutOfDate() {

The isCaptureSnapper()-function has been removed. As a replacement, check snapper in DwgCaptureSnapper instead.

Removed: final public bool isCaptureSnapper() : inline {

The getDwgSource()-function has been removed. Use the getSource()-function on DwgSnapper or DwgCaptureSnapper instead.

Removed: final public Url getDwgSource() {

The getDwgRoot()-function has been removed. Use the getDwgRoot()-function in cm/core/dwg/dwg.interface.cm instead.

Removed: final public DwgRoot getDwgRoot() {
Old: private bool dwgSnapperHasMultipleCopies : public readable;
New: final public bool hasMultipleCopies(Snapper snapper) {
Old: extend public bool apply(Point pos=null, bool exception=false) {
New: extend public bool apply(Snapper snapper, Point pos=null, bool exception=false) {
Added: extend public bool apply(Snapper{} snappers, Point pos=null, bool exception=false) {

The functions below have been updated to return the loaded DWG snappers, in order to improve code readability. For the method that returned a bool, the new will return null if and only if it previously returned false.

Old: extend public bool loadDwgFile(Url file, bool xref=false, Window parent=null,
New: extend public Snapper loadDwgFile(Url file, bool xref=false, Window parent=null,

Old: final public void loadDwgFile(Url file, DwgRoot root, bool xref=false, bool exception=false, bool dragDrop=false) {
New: final public Snapper loadDwgFile(Url file, DwgRoot root, bool xref=false, bool exception=false, bool dragDrop=false) {

Old: final public void animate(Url file, bool repeat=true, Window parent=null, DropFiles drop=null, Point dropSpacePos=null) {
New: final public Snapper animate(Url file, bool repeat=true, Window parent=null, DropFiles drop=null, Point dropSpacePos=null) {

A Snapper argument has been added to replace uses of the activeDwgSnapper-field in the following methods. The argument expects either a DwgSnapper or a DwgCaptureSnapper.

Old: extend public bool importSettingsChanged() {
New: extend public bool importSettingsChanged(Snapper snapper) {

Old: final public DwgSnapper{} getXRefsNoInsert() {
New: final public DwgSnapper{} getXRefsNoInsert(Snapper snapper) {

Old: final public void groupActiveDwgSnapperWith(Snapper{} snappers) {
New: final public void groupDwgSnappers(Snapper main, Snapper{} snappers) {

Old: extend public int checkForChanges() {
New: extend public int checkForChanges(Snapper{} snappers=dwgDialog.?selection()) {

Old: final public void dropOnCursor(DropFiles drop, Point spacePos) {
New: final public void dropOnCursor(Snapper snapper, DropFiles drop, Point spacePos) {

Old: extend public void locateSnapper() {
New: extend public void locateSnapper(Snapper snapper) {

Old: extend public void reloadSnapper(Url u=null) {
New: extend public void reloadSnapper(Snapper snapper, Url u=null) {

Old: extend public void reloadDwgSnapper(Url u=null) {
New: extend public void reloadDwgSnapper(Snapper snapper, Url u=null) {

Old: extend public void reloadCaptureSnapper(Url u=null) {
New: extend public void reloadCaptureSnapper(Snapper snapper, Url u=null) {

Old: extend public void renameSnapper(str newName=null) {
New: extend public void renameSnapper(Snapper snapper, str newName=null) {

Remove methods

Remove an item from the dwg dialog:

Old: extend public void removeSnapper(Snapper candidate, bool update=true, bool anySnapper=true) {
New: extend public void removeSnapperFromDialog(Snapper candidate, bool update=true) {

Remove item from space and dwg dialog:

Remove: extend public void removeSnapper() {

To remove from space use removeDwgSnapper(Snapper snapper) instead.

class DwgLayersCard

Many methods now take an argument to specify the DwgSnapper being edited.

Old: final public void setSnappableLayer(DwgLayer z, bool v) {
New: final public void setSnappableLayer(DwgLayer z, bool v, Snapper snapper) {

Old: final public void setForceLayer(DwgLayer z, bool v) {
New: final public void setForceLayer(DwgLayer z, bool v, Snapper snapper) {

Old: final public void setLayerColor(DwgLayer{} layers, color c, bool ignoreUserMaterial) {
New: final public void setLayerColor(DwgLayer{} layers, color c, bool ignoreUserMaterial, Snapper snapper) {

Old: final public void setLayerColor(DwgLayer layer, color c, bool ignoreUserMaterial) {
New: final public void setLayerColor(DwgLayer layer, color c, bool ignoreUserMaterial, Snapper snapper) {

One method was given the responsibility of finding all snappers being updated itself, since it needed this to create the proper undo steps:

Old: final public void setVisibleLayer(DwgLayer z, bool v, bool updateVisibility=true) {
New: final public void setVisibleLayer(bool v, DwgLayerTreeViewItem clickedItem, bool updateVisibility=true) {

class DwgSettingsEnv

Removed: extend public bool equal(DwgSettingsEnv target, bool transforms=true, bool units=true, bool scale=true, bool cap=true, bool import3D=true, bool layers=false, bool captureGraphics=true) {
Old: extend public bool equal(DwgSettingsEnv target, bool transforms=true, bool units=true, bool scale=true, bool cap=true, bool import3D=true, bool layers=false, bool captureGraphics=true, bool explode=true) {
New: extend public bool equal(DwgSettingsEnv target, bool transforms=true, bool units=true, bool scale=true, bool cap=true, bool import3D=true, bool layers=false, bool captureGraphics=true, bool explode=true, bool xrefs=true) {

class DwgTreeView

Old: extend public void update(bool recursive=true) {
New: extend package void update(bool recursive=true) {

class DwgSnapperCreator

Removed: final public DwgSnapper{} insertAllXRefs(Window parent=null, Space space=null, bool relocate=true) {

Instead use

final public DwgSnapper{} insertAllXRefs(Window parent=null, Space space=null, bool relocate=true, bool insert=true, Bool xRefImportCancelled=null) {

class DwgPropertiesCard

Some interfaces have been changed from public to private as they are not intended to be used outside of DwgPropertiesCard.

Old: final public SubWindow buildTopWin(Window parent) {
New: final private SubWindow buildTopWin(Window parent) {

Old: final public void updateSettingsDrop() {
New: final private void updateSettingsDrop(DwgPropertiesCardEnv env=null) {

Old: final public void updateContent(bool scrollToLatestPos=false) {
New: final public void updateContent(Snapper{} snappers, bool scrollToLatestPos=true) {

Old: final public void setPresetScale(double scale) {
New: final public void setPresetScale(double scale, bool invokeCallback=true) {

Old: final public str getUnitKey() {
New: final private str getUnitKey() {

Removed: final public void updateDisplays() {
Added: final private void updateActualScaleDisplay() {
Added: final private void updateSizePreviewDisplay(size dims) {
Added: final private void updateActualDimensionDisplay(size dims) {

Old: final public double getActualScale() {
New: final private double actualScale() {

Removed: final public void setMessage(str msg) {
Removed: final public void updateMessage(bool update=true) {
Removed: final public str updateMessage2() {
Added: final private void updateInfoDisplay(DwgPropertiesCardEnv env) {

The following methods are deemed no longer needed and have been removed. There is no direct replacement for them.

Removed: final public bool enablePresetsDD(Snapper selection) {
Removed: extend public double getUnitValue () {
Removed: final public void setRawScale() {

The reBuild()-function is no longer needed, since updateContent() now updates all UI elements.

Removed: final public void reBuild() {

The setScaleFromInsUnits()-function is no longer needed and has been removed.

Removed: final public void setScaleFromInsUnits(bool update=false) {
Old: extend public void fitToPaper() {

Use these instead (in cm/core/dwg/dwgPropertiesCard.cm)

New: public void fitToPaper(Snapper snapper, Space insertSpace=null) {
New: public void fitToPaper(Snapper{} snappers=null, Space insertSpace=null) {

class DwgHideLayerOp

The undo operation can now undo multiple layers at once.

Old: public int64 l;
New: public int64{} layers;

Old: public constructor(DwgSnapper dwg, int64 l, bool undo=true) {
New: public constructor(DwgSnapper dwg, int64{} layers, bool undo=true) {

cm.network.cbb

# CBBClient
Changed:
- final public void showLoginFailNotification() 
+ final public void showLoginFailNotification(rtoutcome reason, str errorType) 

cm.test.cmunit.testInstructions

class GetTreeViewItemAtIndexInstruction

This class has been removed and can be replaced with the new GetTreeViewItemsInstruction.

Removed: class GetTreeViewItemAtIndexInstruction

class GetTreeViewItemInstruction

This class has been removed and can be replaced with the new GetTreeViewItemsInstruction.

Removed: class GetTreeViewItemInstruction

class InsertSnapperInstruction

Changed the type of the skipSnap constructor argument from bool to Bool. When assigned to null, userSnapDisable will not be overridden and instead use its global value during insert.

Old: public constructor(Snapper snapper, line[] mouseLines, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(Snapper snapper, line[] mouseLines, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(SnapperSpawner spawner, line[] mouseLines, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(SnapperSpawner spawner, line[] mouseLines, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(Snapper snapper, point2D[] pos, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(Snapper snapper, point2D[] pos, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(SnapperSpawner spawner, point2D[] pos, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(SnapperSpawner spawner, point2D[] pos, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(Snapper snapper, line mouseLine, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(Snapper snapper, line mouseLine, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(SnapperSpawner spawner, line mouseLine, str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(SnapperSpawner spawner, line mouseLine, str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(Snapper snapper, point2D pos=point2D(), str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(Snapper snapper, point2D pos=point2D(), str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(SnapperSpawner spawner, point2D pos=point2D(), str outputKey=null, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(SnapperSpawner spawner, point2D pos=point2D(), str outputKey=null, Bool skipSnap=null, SrcRef src=#:src) {
Old: public constructor(SnapperSpawner spawner, str outputKey, bool skipSnap=false, SrcRef src=#:src) {
New: public constructor(SnapperSpawner spawner, str outputKey, Bool skipSnap=null, SrcRef src=#:src) {

class PutSnappersInBlockInstruction -> CreateBlockInstruction

This instruction has been renamed CreateBlockInstruction.

Old: public class PutSnappersInBlockInstruction extends TestInstruction {
New: public class CreateBlockInstruction extends TestInstruction {

class ValidateTreeViewItemIsCheckedInstruction -> ValidateCheckboxStateInstruction

This instruction now handles TriStateCheckBox as well and has therefore been given a more general name.

Old: public class ValidateTreeViewItemIsCheckedInstruction extends ValidateInstruction {
New: public class ValidateCheckboxStateInstruction extends ValidateInstruction {

Old: public constructor(str itemKey, bool expectedChecked, SrcRef src=#:src) { New: public constructor(str objectKey, bool expectedChecked, SrcRef src=#:src) {

Old: public constructor(str itemKey, extent expectedState, SrcRef src=#:src) {
New: public constructor(str objectKey, extent expectedState, SrcRef src=#:src) {

class ValidateTreeViewItemKeyInstruction

This class has been removed. As a replacement, use GetFieldValueInstruction to read the "key"-field of the tree view item, followed by ValidateValueInstruction.

Removed: class ValidateTreeViewItemKeyInstruction

Runtime/Behavior Changes

cm.core

Copy

The original snappers being copied (e.g. by ctrl+c) no longer receive calls to pickedUp(), dropped() and snapAllAligned(). The reason for this change is to avoid issues where the original snappers were unexpectedly modified.

InsertAnimationG2 and DragAnimationG2

InsertAnimationG2 and DragAnimationG2 has been adjusted to avoid trySnap() from being inadvertently called twice within the same action to improve performance.

cm.core.collabG3

cm/core/realtime.cm

RTInvalidate calls that were invoked before the RT runtime is initialized are now deferred and will be invoked when the runtime is ready later. Previously, attempts that were made to invalidate certain CollabPro realtime synchronized data before RT runtime is ready will be lost, resulting in data inconsistencies.

See also related changes in cm.network.cbb.