Abstract DataSymbol

Modified

public double cm.abstract.dataSymbol.ui.lerp(double from, double to, double lerpTo) : inline
public int cm.abstract.dataSymbol.ui.lerp(int from, int to, double lerpTo) : inline

extend public double DsFreeformPicklistItem::actualQuantity();
private DsFreeformItem DsFreeformPicklistPart._item : copy=reference;

extend public void DsFreeformGridWindow::forceSelect(pointI p);

Old: public void addPropagateProperties(PropDefs defs) {
New: public void dsAddPropagateProperties(PropDefs defs) {

Old: public void addElevationProperty(PropDefs defs) {
New: public void dsAddElevationProperty(PropDefs defs) {

Notes:

  • Use core lerps

Abstract Industry

Removed

public class AisleManager
public class PHNode
final public bool ShelvingGraphicVessel::isDoublePalletRackBody()
public void PHBodyDragAnimationG2::moveMultiSelect(bool refreshMouseInfo=false)

Modified

Due to the removal of the AisleManager class all methods of the AisleManager has been moved to the NoAislePHBody class. During this move some methods also got renamed to clarify the purpose of the methods.

Old: extend public PHBody ShelvingGraphicVessel::palletRactBody()
New: extend public PHBody ShelvingGraphicVessel::phBody()

Old: public double getPotentialAisleWidth(PHBody main, PHBody otherPHBody)
New: public double edgeToEdgeDistance(PHBody main, PHBody other)

Old: public point getMainPositionGivenAisleWidth(NoAislePHBody other, NoAislePHBody main, double aisleWidth)
New: public point adjustPositionToAisleWidth(PHBody main, PHBody other, double aisleWidth)

Old: public ShelvingBody{} getAllGroupShelving(ShelvingBody body)
New: public ShelvingBody{} getSystemShelving(ShelvingBody body)

Old: public ShelvingBody{} getAllGroupShelving(NoAislePHBody phBody)
New: public ShelvingBody{} getSystemShelving(NoAislePHBody phBody)

Old: public bool isAboveOtherBody(NoAislePHBody main, NoAislePHBody other)
New: public bool isAboveOtherBody(PHBody main, PHBody other)

Old: public NoAislePHBody getClosestPHBodyInSpace(Space space, point onFloorPos)
New: public PHBody getClosestPHBodyInSpace(Space space, point onFloorPos, double searchR=3m, SnapperFilter filter=PHBodyFilter())

Old: final public bool LOPositionEnv::isConflicts(box b1, box b2)
New: extend public bool LOPositionEnv::conflicts(box b1, box b2)

Old: extend public void PHBodyInsertAnimationG2::tryUpdateAisle(NoAislePHBody oldClosest)
New: extend public void PHBodyInsertAnimationG2::updateAisleWidth(NoAislePHBody oldClosest)

Old: extend public void PHBodyInsertAnimationG2::tryUpdateMainBody()
New: extend public void PHBodyInsertAnimationG2::updateMainBody()

Old: extend public double PHBodyInsertAnimationG2::getClosestAisle()
New: extend public double PHBodyInsertAnimationG2::getClosestAisleWidth()

Old: public double AisleManager::bottomAisle
New: extend public double NoAislePHBody::getAisleWidth()
New: extend public void NoAislePHBody::setAisleWidth(double newAisleWidth)

Old: extend public double AisleManager::initialAisleWidth()
New: extend public double NoAislePHBody::initialAisleWidth()

Old: extend public NoAislePHBody AisleManager::getTopMost()
New: extend public NoAislePHBody NoAislePHBody::getTopMost()

Old: extend public NoAislePHBody AisleManager::isTopMost()
New: extend public NoAislePHBody NoAislePHBody::isTopMost()

Old: extend public NoAislePHBody AisleManager::getBotMost()
New: extend public NoAislePHBody NoAislePHBody::getBottomMost()

Old: extend public NoAislePHBody AisleManager::isBotMost()
New: extend public NoAislePHBody NoAislePHBody::isBottomMost()

Old: extend public NoAislePHBody AisleManager::getClosestPHBody(bool top=true)
New: extend public NoAislePHBody NoAislePHBody::getClosestPHBody(bool top=true)

Old: extend public NoAislePHBody[] AisleManager::getAllPHBody()
New: extend public NoAislePHBody[] NoAislePHBody::phSystemGroup()

Old: extend public NoAislePHBody[] AisleManager::getAllPHBodyAccordingToDirection(bool top)
New: extend public NoAislePHBody[] NoAislePHBody::phDirectionGroup(bool top)

Old: extend public Snapper{} AisleManager::getAllRelatedSnappers()
New: extend public Snapper{} NoAislePHBody::allConnectedSnappers()

Old: extend public void NoAislePHBody::resetNodeAndRebuild2D()
New: extend public void NoAislePHBody::unlinkAndRebuild2D()

Old: extend public box ShelvingSystemOutlineVessel::getSystemBound(PHNode node)
New: extend public box ShelvingSystemOutlineVessel::getSystemBound(NoAislePHBody ph)

Old: extend public ShelvingSystemOutlineVessel::PHNode getClosestSystemRootNode()
New: extend public ShelvingSystemOutlineVessel::NoAislePHBody getClosestPHBody()

Abstract Kitchen

_scheme field changes

_scheme field have been added to cm.abstract.kitchen.KitchenSnapper and removed from cm.abstract.kitchen.Rack

ChangedScheme() added to KitchenSnapper.

Abstract Labs

LabsScheme

_scheme field has been removed from subclasses in Abstract Labs, since it´s been added to cm.abstract.kitchen.KitchenSnapper.

LabsElevationAutoInsertEnv

LabsElevationAutoInsertEnv needs class types passed in as argument rather than an instantiated LabsElevationArrow object.

Constructor modified on LabsElevationAutoInsertEnv:

    /**
     * Creation.
     */
    public constructor(LabsElevationArrow frontElev, LabsElevationArrow sideElev, LabsElevationArrow worktopElev, LabsElevationArrow rightSideElev=null, LabsElevationArrow backElev=null) {
	elevationAutoInsert(frontElev, sideElev, worktopElev, rightSideElev, backElev);
    }

New constructor cm.abstract.labs.LabsElevationAutoInsertEnv:

    /**
     * Creation.
     */
    public constructor(Class frontElev, Class leftElev, Class worktopElev, Class rightElev=null, Class backElev=null) {

	if (frontElev.extends() in ElevArrow) this.frontElev = frontElev;
	if (leftElev.extends() in ElevArrow) this.leftElev = leftElev;
	if (worktopElev.extends() in ElevArrow) this.worktopElev = worktopElev;
	if (rightElev.extends() in ElevArrow) this.rightElev = rightElev;
	if (backElev.extends() in ElevArrow) this.backElev = backElev;

	elevationAutoInsert();
    }

Abstract Office

  • WorksurfaceSearch and WsPanelSearch have been cleaned up and some methods have been renamed to be more clear. WsPanelSearch was moved to it's own file.

  • Added updateConnectors() to PanelJunctionSnapper.

  • OfficeSpecOption now has a field exportable that can be used for exports (specifically custom SIF) to prevent the option from exporting.

  • Added a method on PanelFrame for getting panels that are tmounted on a specific side.

extend public PanelFrame{} getTMountedPanels(bool up)
  • Added a method for worksurface bottom height
extend public double worksurfaceBottom()
  • Office Material dialog can now be given a label to use.
public OfficeMaterialDialog showOfficeMaterialDialog(Window window, MaterialDomain domain,
						     Material selected,
						     OfficeMaterialLimb limb=null,
						     MaterialSchemeProperty schemeProp=null,
						     str label=null)
  • OfficeMaterialLimb supports the label that can be passed into the Office Material Dialog with a change to the showMaterialDialog() method.
/**
 * Show material dialog.
 */
extend public void showMaterialDialog(Material m, str label=null) {
    showOfficeMaterialDialog(session.mainWindow, domain, m, this, label=label);
}
  • The CustomerOwnMaterials object is stored as an AuxillaryObject now. There is now a global key for getting them, cAOCustomerOwnMatsKey.

  • Renamed function getNewH() to getNewHeight().

  • Added parameter str->Object args to methods on Worksurface for creating/updating WorksurfaceConnectLines and WorksurfaceConnectArc. This was to allow prop data to be passed from the path members to all parts of the connector generation process.

public void createUpdateConnectLine(str id, worksurfaceConnectType ct,
					WorksurfacePathLineTo m,
					point2D last,
					str->WorksurfaceConnectLine currLines,
					str->Object args=null)

public WorksurfaceConnectLine createWksfConnectLine(line2D ln,
							str edgeId,
							worksurfaceConnectType ct,
							ConnectRule rule=null,
							str->Object args=null)

public void updateWksfConnectLine(WorksurfaceConnectLine wcl,
				   line2D ln, worksurfaceConnectType ct,
				   ConnectRule rule=null, str->Object args=null)
  • Worksurface cutouts now use XAPI instead of PropDefs.
Old:  public props {
	(AShape2D[]) "holes" : {
	    Object get(..) {
		return that.getCutouts();
	    }
	}
    }

 New: public xapi {
	public (AShape2D[]) getCutouts(WorksurfacePath p);
    }
  • WorksurfacePathLineTo and WorksurfacePathArcTo have had the id field changed to edgeId to be more consistent with the edgeId field on the connectors that get generated.
Old: public str id;
New: public str edgeId;

Case-insensitive sort (isort) for string types

seq<str, str8, cstr ..: isort() and isorted() previously did regular sort(), this issue has been rectified.

Changes for parttag visibility

In 11.0 part tags no longer add a user category on snappers for visibility. Instead the snappers now iterate over explicit tags and applied tags to add to the layerSet from visibility2D() and visibility3D().

This also means that the part tag categories will no longer be added to the category registry.

rebuildPartTaggingCategories() is now removed since there are no longer any user categories to rebuild.

    /**
     * Visibility 2D.
     * This is a visibility summary over graphs currently produced by the snapper. This is used for visibility filtering on snapper level.
     *
     * If the snapper produces graphs G1, G2, ... GN, with corresponding layer expressions Exp1, Exp2,... ExpN.
     * The returned expression should be equivalent to "or(Exp1, Exp2,... ExpN)".
     */
    extend public LayerExpr visibility2D() {
	if (!layer) {
	    layer = categoryVisibility();

	    if (explicitTags or appliedPartTags.any) layer = or (layer, partTagVisibility());
	    if (chunkId or sectionIdG2) layer = or (layer, collaborationVisibility());
	}

	return layer;
    }

    /**
     * Visibility 3D (similar to visibility 2D)
     */
    extend public LayerExpr visibility3D() {
	if (!layer) {
	    layer = categoryVisibility();

	    if (explicitTags or appliedPartTags.any) layer = or (layer, partTagVisibility());
	    if (chunkId or sectionIdG2) layer = or (layer, collaborationVisibility());
	}

	return layer;
    }

CmSym performance changes

There's been numerous performance optimizations made to CmSym, which has caused a number of API-changes.

Sym stores components in a seq instead of a map

Because components on a sym node are limited, sequences are more efficient than maps both speed wise and storage wise. A number of breaking changes have been made so now we instead store components as a sequence field in SymNode.

Sym features now use an enum

Instead of asking for:

featureProvider("mesh");

You use:

featureProvider(symFeature.mesh);

In this case it's simply better to use:

public SymComponent meshProvider(SymNode this) : inline {

This change is also made for performance reasons.

reps, reps2D and reps3D have been removed

It's been very common for developers to simply add reps() or reps3D() to all their nodes. But it's undesirable to do so because it will implicitly create a LOD for all details, which have negative performance impacts.

Therefore you now have to explicitly ask for the exact details you want:

reps2D(#super)
reps3D(#medium, #high)

This what the previous settings would produce:

reps2D() -> reps2D(#low, #medium, #high, #super)
reps3D() -> reps3D(#low, #medium, #high, #super)
reps()   -> reps(#low, #medium, #high, #super)

(This also excludes the "base" detail level, but it should only exist in Model Lab so you should be able to ignore it).

Note that there's no support for any other 2D detail level than super.

Deprecated sym functions have been removed

A number of sym functions that were deprecated in 10.5 have been removed. This predominantly affects SymHandle methods, such as:

myHandle.setMesh(newMesh);

Which can be replaced with:

symEdit(myHandle) {
    myHandle.xsetMesh(newMesh);
}

or

SymHandle h = sym.beginEditHandle("path.to.handle");
h.xsetMaterial(greenGM);
h.endEdit();

or

SymOwnerNode sym = sym();
sym.beginEdit("path.to.handle");
sym.handle("path.to.handle").xsetMesh(newMesh);
sym.endEdit();

See the 10.0 to 10.5 migration guide for more information.

Do note that previously, handle.setMaterial() used to be able to set the material for the entire model when loaded, but now each node on the model has its own material that blocks xsetMaterial() from being able to set the material. Now it’s required to use xsetGroupMaterial() to set the material for a handle of an imported sym file.

Sym components are now identified by enums

Instead of referring to components with string keys:

node.hasComponent("symReps");
node.getComponent("symReps");
node.removeComponent("symReps");

We now use identifiers:

node.hasComponent(symReps);
node.getComponent(symReps);
node.removeComponent(symReps);

All SymComponent classes have their own entry in the symComponentId:

public enum symComponentId {
    /**
     * An invalid component id, used for deprecated components.
     */
    invalidSymComponent = 0;

    /**
     * All valid components.
     */
    symGMaterial = 1;
    symGfx = 2;
    symMesh = 3;
    symProps = 4;
    symReps = 5;
    ...

Sometimes you'll get a name clash where symReps can either refer to the enum or a method:

public void doStuff(SymNode this) {
    hasComponent(symReps);
}
c:\CetDev\10.5git\base\cm\format\cmsym\component\test\test_components.cm(144, 26):
no function hasComponent(SymReps (symReps(this, false)))

In which case you can explicitly refer to the enum entry like this:

public void doStuff(SymNode this) {
    hasComponent(symComponentId.symReps);
}

This change was introduced for performance reasons.

If you were previously using:

prepareForEdit(h);
h.doStuff();

to update components of a handle, it won't work now and you should use a symEdit block instead.

SymValidationInfo executed programs

Due to changes in sym validation we no longer construct a PathTrie which points out the executed programs. Instead the executed programs are returned directly:

/**
 * Sym validation info.
 */
public class SymValidationInfo {
    /**
     * Rep.
     */
    private SymRep rep : public readable;

    /**
     * Executed programs.
     */
    private SymProgLazyExecEnv[] executedProgs : public readable;
public class SymProgLazyExecEnv {
    public SymExecEnv env;
    public SymProg prog;
    public SymProgs progs;
    public int depth;
    public int order;
    public constructor auto();

This was also made to minimize performance overhead.

Custom DataCatalog

Modified

Old: public void dcCollectExtRefKeys(DsProductType prd, DataCatalog catalog, str->str{} used, str{} visited);
New: public void dcCollectExtRefKeys(DsProductType prd, DataCatalog catalog, str->str{} used);

Old: public DcMaterialToolBoxSubWindow::constructor(Window parent, str key, str label=null,
						    bool showHelp=true, str helpText=null, bool noButtonMode=false,
						    int rightCaptionIndent=0, pointI pos=(0, 0),
						    function(SubWindow c) callback=null, SrcRef src=#:src);
New: public DcMaterialToolBoxSubWindow::constructor(Window parent, str key, DcDBBuilderSpreadsheet spreadsheet,
						    str label=null, bool showHelp=true, bool noButtonMode=false,
						    int rightCaptionIndent=0, pointI pos=(0, 0),
						    function(SubWindow) callback=null,
						    FrameStyle  frameStyle=
						    dsRoundedFrame(dsDialogLightBackgroundBrush),
						    Brush brush=dsDialogDarkBackgroundBrush,
						    DsGridLayoutHelper parentLayoutHelper=null,
						    str helpText=null,
						    str onlineLink=dcOnlineHelpLink("general-commoncomponents",
						    "FindReplace"),
						    SrcRef src=#:src);

Removed

private void custom.dataCatalog.builder._internalUndoCB(Control con);
private void custom.dataCatalog.builder._internalRedoCB(Control con);

public DsGradientButton DcMenuSubWindow::undoBtn;
public DsGradientButton DcMenuSubWindow::redoBtn;

public class custom.dataCatalog.builder.publish.DcCheckBoxCellStyle
public const int custom.dataCatalog.builder.publish.dcCheckBoxSize = 13;

extend public void DcDBBuilderGeometryCard::editExtRefKey();

public class DcEditExtRefKeyWindow;
public class DcEditOptionWindow;
public class DcEditPrdExternalRefKeys;

public DsButton DcExternRefWindow::editExtRefKeyBtn;

extend public void DcModularCard::buildInfoSection(str helpText);
extend public void DcModularCard::buildExtraButton(str buttonKey);

public REDShape DcPreviewSnapperREDView3D::ambientLight;
public REDShape DcPreviewSnapperREDView3D::cameraLight;
public REDShape DcPreviewSnapperREDView3D::distantLight;
extend public REDShape[] DcPreviewSnapperREDView3D::allLights();
extend public void DcPreviewSnapperREDView3D::initLights();
extend public void DcPreviewSnapperREDView3D::updateLights();
extend public void DcProductListSubWindow::selectProduct(str productCode);

public DcFindReplaceSubWindow DcDBBuilderEditMaterialsCard::findReplaceSub;
public DsButtonDropDownTreeView DcDBBuilderEditMaterialsCard::visibleColumnsBtn;
public DsGridLayoutHelper DcDBBuilderEditMaterialsCard::layoutHelper;
extend public DcDBBuilderEditMaterialsCard DcDBBuilderEditMaterialsCard::card();
extend public DataCatalog DcDBBuilderEditMaterialsCard::catalog();
extend public void DcDBBuilderEditMaterialsCard::populateVisibleColumnsDropDown();
public void DcDBBuilderEditMaterialsCard::setSize(sizeI s);
private void removeInvalidProductReferencesFromProductLevel(ProductLevel cur, ProductLevel owner,
							   (str{}) levelsUpdate, int[] currentPath, str prdCat);

public class DcProductListTreeViewCopyDragAnimation;
public class DcTableOfContentsCopyDragAnimation;

extend public void DcDBBuilderEditProductsCard::setProductCatalogFilter(str prodCatCode);
public str DcDBBuilderProductsSS::prodCatCode;
public DsButtonDropDownTreeView DcProductsToolboxSubWindow::showHideDD;
extend public DcDBBuilderEditProductsCard DcProductsToolboxSubWindow::card();
extend public DataCatalog DcProductsToolboxSubWindow::catalog();
extend public void DcProductsToolboxSubWindow::populateShowHideDD()

public str PrdIndTagCategoryCell::getData(int x, int y);
extend private void PrdCategoryCell::getSubData(DsClassificationRefType ref, str{} res, str key);

public DsButton DcTableOfContentsSubWindow::expandAllBtn
public DsButton DcTableOfContentsSubWindowcloseAllBtn;
public DsButton DcTableOfContentsSubWindow::addLevelBtn;
public DsButton DcTableOfContentsSubWindow::addSubLevelBtn;
public DsButton DcTableOfContentsSubWindow::toolboxCreatorBtn;
public DsButton DcTableOfContentsSubWindow::refreshBtn;
public DcTableOfContentsSubWindow::DsGridLayoutHelper layoutHelper;

extend public void DcTableOfContentsSubWindow::updateActivation();

public DsButton DcTableOfContentToolboxSubWindow::expandAllBtn;
public DsButton DcTableOfContentToolboxSubWindow::closeAllBtn;
public DsButton DcTableOfContentToolboxSubWindow::addLevelBtn;
public DsButton DcTableOfContentToolboxSubWindow::addSubLevelBtn;
public DsButton DcTableOfContentToolboxSubWindow::refreshBtn;
public DsGridLayoutHelper DcTableOfContentToolboxSubWindow::layoutHelper;

Notes:

  • DsCheckBoxCellStyle can be used instead of DcCheckBoxCellStyle.

Renamed

Old: public class DcMaterialReferenceValidationEnv1;
New: public class DcMaterialReferenceValidationEnv;

DWG changes

The nurb field in DwgSpline now refers to cm.geometry.brep.BrepBSplineCurve instead of ANurbsCurve. The export methods in Snapper has changed arguments.

DWG import dialog

The dwg import dialog has been overhauled, in that process changes has been made to both functionality of the dialog and it's interface. Settings have generally changed from using last applied from/to coresettings to storing the DwgSettingsEnv in each DwgSnapper and using those settings on all modifications from the import dialog. Presets have been introduced and you can register presets via this function:

 /*
 * Register predefined dwg setting.
 */
public void regPredefinedDwgSetting(DwgSettingsEnv env, bool replace=false) {

Snapper interface

The ExportPaperDwgDialog class has been removed entirely since papers now can be exported from the ExportDwgDialog. When exporting to dwg the user now has the possibility to export 2D-view, 3D-view and/or Papers from paper view (current or all). Due to these changes, some methods have been removed and some have been changed.

These two methods in Snapper now have one single argument. This is to facilitate the need for more arguments now and in the future. The export() method is the method to override in case you want non-default dwg-export behaviour.

    /**
     * Export snapper.
     */
    extend public ExportData export(SnapperExportEnv env) {
	return stdSnapperExport(env);
    }


    /**
     * Export graphical snapper.
     */
    extend public ExportData systemExport(SnapperExportEnv env) {
	if (hasGraphicalSpecial)
	  return stdSnapperExport(env);
	else
	  return export(env);
    }

All the old arguments are contained within the SnapperExportEnv. New is the LayerSet which is used when using ViewMode filtered dwg export. If possible filter your snapper graphics using this filter to avoid returning unnecessary data. The SnapperExportEnv extends CorePropObj to facilitate the need for more arguments in the future.

/**
 * Snapper export env.
 */
public class SnapperExportEnv extends CorePropObj {
    /**
     * Export 2D graphics.
     */
    public bool twoDim;

    /**
     * Export 3D graphics.
     */
    public bool threeDim;

    /**
     * Export item tags.
     */
    public bool itemTags;

    /**
     * The wanted detail of the exported graphics.
     */
    public detailLevel detail;

    /**
     * The wanted layer of the export.
     */
    public LayerSet layer : copy=reference;

    /**
     * Create a new Snapper export env.
     */
    public constructor(bool twoDim=true, bool threeDim=true,
		       bool itemTags=true, detailLevel detail=detailLevel.super,
		       LayerSet layer=normalLayerSet) {
	this.twoDim = twoDim;
	this.threeDim = threeDim;
	this.itemTags = itemTags;
	this.detail = detail;
	this.layer = layer;
    }
}

Public dwg functions

The following public functions have been removed entirely

public void userDwgPaperExport(Window app, Space space, bool initVisible=true, bool applyAndClose=false)

public void userPaperDwgExportToTarget(Window app, Space space, bool initVisible=true, bool applyAndClose=false, Url url=null)

Both could be replaced by the functions

public void userDwgExport(Window app, Space space, bool initVisible=true, bool applyAndClose=false)

public void userDwgExportToTarget(Window app, Space space, bool initVisible=true, bool applyAndClose=false, Url url=null)

DwgExporter class

The constructor() has changed

    public constructor(Space mainSpace, PaperSpace[] paperSpaces=null, bool export2D=true, bool export3D=true, ExportFilterBar exportFilter=null)

Previously it only took a Space as an argument and now a Space and a seq of PaperSpace(s). Any of them can be null. If you only want to export papers then only pass in PaperSpace objects. 2D and 3D only applies to 'Space'.

Also due to this change, the following methods in DwgExporter now takes a Space as an argument.

    extend public void collectSnappers(Space s, SnapperFilter filter=null)

    extend public rect getViewBound(Space s)

DwgSnapper

/**
 * Set env settings.
 */
extend public void setEnvSettings() {

Has been replaced with:

/**
 * Apply settings from env.
 */
extend public void applySettings(DwgSettingsEnv env) {

Insensitive sort (isort) for non-string types

The case insensitive sort methods, isort() and isorted() have been removed for non-string types.

New colored tag view mode

A new colored tag view mode has been added to core and the code can be found in cm.core.partTag.coloredTagViewMode.cm. The colored tag view mode is essentially another way to visualize the tag color of tagged snappers, where the 2D fills of tagged snappers are overridden with the corresponding tag colors.

For customization teams that have similar view modes and plan to migrate to the new colored tag view mode, just replace existing view modes with the new colored tag view mode. Please also remember to replace any references to the old view mode keys with the new colored tag view mode key.

Print API and multiple drawings

We have changed a few functions in the print API (cm.std.print) so that you need to explicitly provide the "correct" world. "Correct" world, in this case, means the world that the function in question wants to operate on. In many cases, we used to rely on session.mainWorld(..). Usually, this works fine but it is more robust to provide the correct world if we have data that refers to it. For instance, you may use methods found in Session, such as worldFromWindow(..) or worldFromAppWindow(..).

PropObj pushProp

The method signature of PropObj::pushProp() has changed.

Old: extend public bool pushProp(str key, PropObj z, Object env=null, StrBuf error=null) {
New: extend public bool pushProp(str key, PropObj z, Object env=null, StrBuf error=null, PushPropsEnv receiverEnv=null, PushPropsEnv pusherEnv=null) {

Singularity Candidates in ToolAnimationG2

Support for Singularity candidates has been added to ToolAnimationG2. This means a variety of new methods in ToolAnimationG2 and Singularity to mirror those related to Snapper and Vessel candidate picking. To turn on Singularity candidate picking in a ToolAnimationG2-derived animation, override singularityCandidateSearch(). If your animation is not meant to handle singularity candidates, the animation itself does not require a migration. Support for picking candidates through XClipWormhole has also been added (using ThruWormholeAnimationCandidatePicker will do this by default). These changes resulted in the following interface changes in FuzzyAnimationHeapCandidatePicker.

extend public void pick(SnapperFilter snapperFilter=null, VesselFilter vesselFilter=null) {

Has been changed to

extend public void pick(SnapperFilter snapperFilter=null, VesselFilter vesselFilter=null,
			    SingularityFilter singularityFilter=null) {

And

extend public void addPicksToHeap(Object[] picks, SnapperFilter snapperFilter, VesselFilter vesselFilter, bool loose) {

Has been changed to

extend public void addPicksToHeap(Object[] picks, SnapperFilter snapperFilter, VesselFilter vesselFilter,
				      SingularityFilter singularityFilter, bool loose, Transform t=null) {