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:
public class AisleManager public class PHNode final public bool ShelvingGraphicVessel::isDoublePalletRackBody() public void PHBodyDragAnimationG2::moveMultiSelect(bool refreshMouseInfo=false)
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()
_scheme
field have been added to cm.abstract.kitchen.KitchenSnapper
and removed from cm.abstract.kitchen.Rack
ChangedScheme()
added to KitchenSnapper
.
_scheme
field has been removed from subclasses in Abstract Labs, since it´s been added to cm.abstract.kitchen.KitchenSnapper
.
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(); }
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)
extend public double worksurfaceBottom()
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)
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;
seq<str, str8, cstr ..: isort()
and isorted()
previously did regular sort()
, this issue has been rectified.
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; }
There's been numerous performance optimizations made to CmSym, which has caused a number of API-changes.
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
.
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.
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.
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.
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.
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.
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);
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
.Old: public class DcMaterialReferenceValidationEnv1; New: public class DcMaterialReferenceValidationEnv;
The nurb field in DwgSpline
now refers to cm.geometry.brep.BrepBSplineCurve
instead of ANurbsCurve
.
The export methods in Snapper
has changed arguments.
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) {
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; } }
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)
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)
/** * Set env settings. */ extend public void setEnvSettings() {
Has been replaced with:
/** * Apply settings from env. */ extend public void applySettings(DwgSettingsEnv env) {
The case insensitive sort methods, isort()
and isorted()
have been removed for non-string types.
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.
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(..)
.
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) {
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) {