Article view hooks

The enum used for Article view hooks (cm.core.calc) have a new enum value modified, which is used to notify modifications to the article view

/**
 * View change type.
 */
public enum articleViewChange : field access {
    nothing;
    name;
    modified; //New in 12.5
    new;
    remove;
    select;
}

articleViewChange.remove notification now correctly populates the view argument with the deleted ArticleView instance, instead of passing in null.

Calculation modifications sets World.modified

Both article view changes and part adjustments changes will now set the modified flag of the World. The modified flag is indicative of whether the drawing was changed since last saved and dictates conditions such as whether to prompt the user to save the file when closing.

ItemTags visibility

The area tag was added specifically to allow users to hide/show part tag rectangles/custom shapes.

// Tagging rects and shape cat
public const symbol cCoreTagsCat = #tags;

However, developers have added their itemTags to that category causing them to be visible in the TAGS view mode and therefore be filtered together with the area tags. We recommend developers to remove their itemTags from the #tags category so that they are not visible in the TAGS view mode.

PBR Materials

When introducing PBR materials we added a 'spec' field for GMaterial3D. This can either be a 'ClassicMatSpec' (the old material definition) or a 'PBRMatSpec'. In order to simplify for developers not knowing what material they are dealing with we created these helper functions for dealing with opacity/transparency and color:

core3D.gMaterial3DHelpers.cm

/**
 * Creates a copy of the material with the specified opacity.
 */
public GMaterial3D createTransparentMaterial(GMaterial3D gm, float opacityValue)

/**
 * Set the opacity on the material.
 */
public void setOpacity(GMaterial3D gm, float opacityValue)

/**
 * Creates a copy of the material with the specified color.
 */
public GMaterial3D createColorMaterial(GMaterial3D gm, colorF c)

/**
 * Set the color on the material.
 */
public void setColor(GMaterial3D gm, colorF c)

Also note that we have updated the core materials as outlined here: https://www.configura.com/wiki/index.php/Migration_from_12.0_to_12.5#Core_materials_converted_to_PBR

When introducing PBR materials we added a 'spec' field for GMaterial3D. This can either be a 'ClassicMatSpec' (the old material definition) or a 'PBRMatSpec'. In order to simplify for developers not knowing what material they are dealing with we created these helper functions for dealing with opacity/transparency and color:

core3D.gMaterial3DHelpers.cm

/**
 * Creates a copy of the material with the specified opacity.
 */
public GMaterial3D createTransparentMaterial(GMaterial3D gm, float opacityValue)

/**
 * Set the opacity on the material.
 */
public void setOpacity(GMaterial3D gm, float opacityValue)

/**
 * Creates a copy of the material with the specified color.
 */
public GMaterial3D createColorMaterial(GMaterial3D gm, colorF c)

/**
 * Set the color on the material.
 */
public void setColor(GMaterial3D gm, colorF c)

Also note that we have updated the core materials as outlined here: https://www.configura.com/wiki/index.php/Migration_from_12.0_to_12.5#Core_materials_converted_to_PBR

Revlink 2022

12.5 is coming out with the support of Revlink 2022 Here is the link to install the latest Revlink Add-On: https://downloads.configura.com/cet/RevLinkInstaller6.21.31.0.exe

After the release, the link will replace the current installer link within this article: https://support.configura.com/hc/en-us/articles/1500008625141-Revlink-Extension

Space volume snappers

In the old implementation, the system goes through all the snappers in the space in order to find the space volume snappers that belong to a particular space volume, which is not optimal. Hence, a new _spaceVolumeSnappers field is introduced in SpaceVolume to cache the space volume snappers that belong to a space volume. A space volume snapper is added to _spaceVolumeSnappers through SpaceVolumeEventViewer::updateAfterAddSnapper(..) whenever it is inserted into a space, and is removed from _spaceVolumeSnappers through SpaceVolumeEventViewer::updateAfterRemoveSnapper(..) whenever it is removed from a space. In addition, when the space volume id of a space volume snapper is changed, it is removed from _spaceVolumeSnappers of the old space volume, and added to _spaceVolumeSnappers of the new space volume, through spaceVolumeSnapperIdChanged(..).

// Class: cm.core.spaceVolume.SpaceVolume
New: private Snapper{} _spaceVolumeSnappers : copy=shallow, stream=null;

cm.abstract.dataSymbol

Please note that starting version 12.5.9 of Data Symbol (cm.abstract.dataSymbol), we have removed a hardcoded check for the "" Option code, which used to prevent "" from showing up in option domains and properties trees. If you require the check and wish to hide "***", you may add back a similar check through overriding the following methods:

// Class: cm.abstract.dataSymbol.DsPData
public bool validOption(Option)

// Class: cm.abstract.dataSymbol.DsPDataProxy
public bool validOption(DsPDataProxyEnv, Option)

cm.core

cm.core.category

The following class has changed: modify notice class property has been set. See this help center article on Modify Notice behavior.

// Class: cm.core.category.CustomCategoryRecord
Old: public class CustomCategoryRecord extends CategoryRecord
New: public class CustomCategoryRecord extends CategoryRecord : modify notice

cm.core.partTag

The following classes below have changed: modify notice class property has been set. See this help center article on Modify Notice behavior.

// Class: cm.core.partTag.PartTagCategory
Old: public class PartTagCategory
New: public class PartTagCategory : modify notice

// Class: cm.core.partTag.PartTag
Old: public class PartTag
New: public class PartTag : modify notice

cm.core.propsScheme

Removal of ensureSettings() call in scheme apply

In 12.0, before scheme apply, to make sure that the props are ready on the target object, we needed to do ensureSettings as prop exposure is typically done there. But it could be very heavy when applying to a lot of snappers, as we don’t need to build the settings, all we need is to make sure the props are exposed.

To counter this, we introduced a validation system for the propDefs, that when called with a certain flag, will call ownerReExposePropDefs to make sure the propDefs are updated.

// In cm/props/propObj.cm: 
/**  
 * Invalidate defs.  
 * Runs validation when propDefs() is called.  
 *   
 * You can for example call this with #reExpose to reexpose registered propDefs  
 * instead of doing it in ensure settings. (implemented in corePropObj)  
 */ 
 final public void invalidatePropDefs(symbol k, Object env=null) {
     ?symbol->Object invalidateDefEnv = propData.?get(cInvalidateDefEnvKey);
     init? invalidateDefEnv();
     invalidateDefEnv.put(k, env);
     if (cInvalidateDefEnvKey !in propData) fastPut(cInvalidateDefEnvKey, invalidateDefEnv);
}  

The issue comes when the propDefs were never exposed/registered before, then there would be nothing to reexpose. In our fix we will need to call ensureSettings the first time if nothing has ever been exposed or registered before.

In the future we plan to have a better fix for this to mitigate the risk of possible calling ensure settings unnecessarily too much.

Some common Q&As regarding the issue:

InitFromPropsScheme doesn’t work anymore, new snappers inserted from toolbox does not get the properties in my selected scheme. What should I do?

We have verified this as a core issue and are working on a fix. If you would like to test it out, try the following:

1.In the constructor of your snapper/object, at the end of it, call ensure settings
2.Insert snapper and see if the problem is resolved. If it is, just wait patiently while the fix is getting tested and merged, otherwise please contact dev support.

I don’t want to wait, there must be something else I can do?

Alternatively, you can do ownerRegisterExposure on your snapper init and loaded1, then your problem would go away immediately.

Change for executePushProps() in PropsSchemePushVisitor

In 12.5, we have refactored the executePushProps() in PropsSchemePushVisitor and PsLayoutPushPropsVisitor to better handling scheme apply for exposed sub objects of a receiver. The change will no longer require exposed sub objects to call pushProps() in its owner.

However, this change could potentially break scheme apply for unexposed sub objects that relied on pushProps(). This is because executePushProps() now calls pushProp() instead of pushProps().

To adapt to this change, we would like to propose using push behaviors for sub objects, here is a step by step guide to setup push behaviors: https://support.configura.com/hc/en-us/articles/14830845427351-Using-PropsSchemes

Using push behaviors would also mean you no longer need to extend pushProps() method just to call pushProps() for sub objects. However, if you encountered any problems on setting up push behaviors, please contact dev support.

Potential issue when init custom scheme on CET start up and the workaround

If you have a custom scheme that is built based on a published scheme design file (*.cmpsl), there is a chance where your scheme might not get init/registered properly if the following scenario matches:

  • Catalogue Browser extension is turned on, and
  • Catalogue of the published scheme design is turned on (before embed) in Catalogue Details, and
  • The published scheme design is activated

If all 3 scenarios mentioned above matches your setup, it is very likely that your custom scheme might get overriden by the Catalogue Scheme registered from Catalogue Browser during CET startup. Here are a few steps to resolve this:

  • If the scheme design is not meant to be used in Catalogue Browser, deactivate the scheme design through creator and republish it again.
  • In your custom scheme class, when calling dsLoadLayout(), always make sure to pass in activeOnly=false, so we can always get the scheme design regardless of its active status.
  • If you are not using Catalogue Browser at all, turning it off should directly avoid this issue.