New Pricing Model Roadmap

New Part Pricing Model

Beginning in 16.5 Major of CET, a new pricing model has been introduced for Parts (cm.core.part). This new system replaces the old single-value listPrice approach by separating a part's base price from its option-based pricing, allowing more flexibility with pricing configurations.

Purpose

This change was driven by two main goals: supporting the new Specials system and improving compatibility with external order systems.

1. Support for the New Specials System The new Specials system in CET allows users to modify pricing at both the product and option levels, which required a more predictable pricing structure. By separating a part’s base price from its option-based pricing, we can handle those adjustments more cleanly and consistently.

2. Alignment with External Order Systems Many order entry systems now expect pricing data in a base price + upcharges format. Moving away from the single list price value brings CET in line with that standard and makes data exports more reliable.

Overall, this update gives us a more flexible, modern foundation for how pricing works across CET and its integrations.

Roadmap

16.5: Opt-in (Migration)

  • The new pricing model is introduced and available as an opt-in feature.
  • Developers can begin migrating to the new constructor and pricing APIs (basePrice, optionPriceSum, calculatedListPrice).
  • The old listPrice and upcharge APIs remain fully supported.

17.0: Opt-out (Default On)

  • The new pricing model becomes the default system (opt-out) for DsPart.
  • Data based parts will automatically use the new pricing APIs unless explicitly configured to continue with the old model.
  • Migration of constructors and pricing logic should be completed before this release to avoid compatibility issues.

17.5: Full Adoption (Legacy Removal)

  • The legacy pricing APIs and old constructors will be removed.
  • All parts and extensions must use the new basePrice + optionPriceSum approach and the updated pricing API methods.

Key Migration Notes

  • New Constructor: Replace listPrice parameter with basePrice and optionPriceSum
  • Feature Flag: Use useNewPricing() to determine which pricing system a part is using
  • New API Functions:
    • basePrice() – defines the part’s inherent cost
    • optionPriceSum() – dynamically computes option-related costs
    • calculatedListPrice() – returns combined list price (basePrice + optionPriceSum)
  • Old API Deprecation: customListPrice() and upcharge() are deprecated and scheduled for removal
  • Runtime Behavior: listPrice() automatically delegates to the new pricing system when useNewPricing is enabled

For more information:

  • See the runtime and compile-time documentation for your system under:
    • cm.core.part
    • cm.abstract.part
    • cm.abstract.datasymbol
    • (and related modules as applicable)
  • These sections include code-level explanations of the pricing API and migration behaviors

cm.abstract.k2.library

Empty function removed since ´public bool addSchemeLimb()´ makes sure the function never gets called.

cm.abstract.k2.xp

Global dimension functions removed and replaced with methods in XpShape.

cm.abstract.kitchen

To prepare for a full implementation of AutoElevations in 16.5 Minor, interface changes around AutoMeasure has been done.

cm.abstract.kitchen.design

Parents clientbound changes are no longer passed to parentClientBoundChanged method.

cm.core

cm.core.calc

articleView.cm

The behaviour of the additional adjustments have been changed to allow for standardization of the main article view. New interfaces have been added and others modified to manipulate adjustments instead.

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.core.geometry2D.advanced

Apath2D would sometimes return incorrect or inconsistent results when asking whether it contains a point or not.

It has been updated to have fewer errors and more consistent behavior when the point lies on the edge of it. This may in rare cases cause issues in code that relied on the incorrect behavior. Fixing these issues should lead to CET having fewer unexpected issues overall.

cm.format.dwg

Cleanup of Dwg entity classes, removing redundant constructors. In preparation for upcomming improved DWG export.

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.

cm.win

DIB Images

The handling of DIB (Device Independent Bitmap) images by CET Core has been improved, and it can now draw DibImage that have transparency.

As DIB images are regular memory allocated objects, it does not consume Windows GDI handles, resulting in reduced system resource usage, improving performance and stability.

MessageWindow

MessageWindow was originally made only to show in toolbox libraries. But now that there are more cases of it being used generally for UI, changes are made to easily use and size this outside of toolbox libraries. It sizes itself according to the text along with 3 sizing modes:

  • No width is provided : Size itself without text wrapping. (Use setWidth passing a 0 value)
  • Width is provided : Attempts to wrap the text if it crosses the width provided. (Use setWidth)
  • Calling extendRight : Attempts to wrap text according to how far it can extend right. (Use extendRight)

cm.win.advanced

As CET manufacturers grow in scale regarding products, we also need to keep that in mind of GDI Ojects from Windows having a limited amount for use in showing each image. While using any ExploreDialog in CET, the amount of GDI Objects use can soar if the folder being navigated is full of products being shown. Hence changes are made to use DibImage instead of MemoryImage for that very purpose. It is strongly recommended to look through your code base and determine whether to migrate into using DibImage wherever large amounts of images are being shown. Here are some suggestions on how to migrate.

Read as DibImage from a source.

If the image is loaded from a source, it is best to save the image as a DibImage from the start. Utilizing the functions inside cm/win/DibImage.cm, which takes in either Url, RawImageData, MagickWand, Stream.

MemoryImage as a transient.

If beginning with from DibImage is too difficult, you can instead opt to convert MemoryImage to DibImage, then destroy it, else it depends on the garbage collector to clean up the GDI Object. You can utilize memToDibImg(MemoryImage) in cm/win/DibImage.cm