IFC import only allows selecting 1 floor for import now when using the Kitchen & Bath edition. Also no floor is initially selected on import. Other editions (CI, MH) still allow importing multifloors for IFC (all floors selected by default).
In 16.5 Major we introduced MhSnapper.hasRealConfig() to determine if a snapper should own a non-temporary MhConfigRef and is treated as a "config owner" (see 16.5 Major migration guide "Changes to spread tools and dimension propagation"). In 17.0 Major you can now override the logic of this method through the MhConfigBehavior behavior.
public class MhSnapper extends Snapper { Old: /** * Check whether this snapper has config that is not temp. */ extend public bool hasRealConfig() { if (config) return !config.temp; return false; } New: /** * Check whether this snapper has config that is not temp. */ extend public bool hasRealConfig() { if (MhConfigBehavior b = configBehavior()) return b.hasRealConfig(this); return false; } } public class MhConfigBehavior extends MhBehavior { New: /** * Return true if this snapper hold a valid config. */ extend public bool hasRealConfig(MhSnapper a) { if (MhConfigRef config = a.config) return !config.temp; return false; } }
Previously the preconfigurator is built mainly to support having the same compartment throughout the entire system. We are now adding additional support to have different compartments within a single bay for the preconfigurator.
To use this new workflow, add the classes MhCompartmentOverviewConfigurationItem and MhCompartmentTypeConfigurationItem to your configuration. They do not work with MhCompartmentConfigurationItem.
Each level/compartment is represent by a MhCompartmentType object in the MhCompartmentOverviewConfigurationItem class. Unique MhCompartmentType objects can be created in the MhCompartmentTypeConfigurationItem class.


Interfaces to override:
public class MhStorageConfiguration extends MhSystemConfiguration { extend public str->Object compartmentCreationProps(Class compPropClass) { } public class MhCompartmentTypeConfigurationItem extends MhStorageConfigurationItem { extend public MhCompartmentType createCompartmentType() { extend public str defaultCompartmentTypeName() { } public class MhCompartmentType extends CorePropObj { extend public SubSet compartmentPropsClassDomain() { } }
How the snappers get generated is MhStorageConfiguration has a method MhEngineConstructionEntryInfo[] levelCreationInfos() that returns a sequence of infos that each represent a level. This method is used in MhBaySpawner.entryLayout(MhEntryLayoutEnv env) to generate level entries based on those info objects.
public class MhStorageConfiguration extends MhSystemConfiguration { extend public MhEngineConstructionEntryInfo[] levelCreationInfos() { } public class MhBaySpawner extends MhStorageSpawner { public MhEntryLayout entryLayout(MhEntryLayoutEnv env) { ... MhEngineConstructionEntryInfo[] levelCreationInfos; if (?MhStorageConfiguration config = env.configuration) { levelCreationInfos = config.levelCreationInfos(); } ... } }
The engine visualiser now has a new button that will allow you to do one of three actions. You can open the function class in your editor, open the function call location in emacs, or inspect the function object.

This is a the same class as the TexturePattern class found in custom.cdMH.textureCreator. It intended that this class should be used in stead of the TexturePattern class or any of the othere classes that have reimplemeted the TexturePattern class.
To migrate to this class just changing thing the your class inheritance from TexturePattern to HoleTexturePattern should be enuf.
For classes that have reimplemeted TexturePattern having that class inherit HoleTexturePattern and doing some minor refacturing so it only extend the shape method should in most case be enuf.
Performs a feature search for the given search line and arguments and stores the result on the blackboard.
Checks that a feature search result from the blackboard has found the expected feature.
Sets the global graphical snapping, for example to 'all', 'basicPoint', 'custom', or a specific feature. By default, all InstructionTestCases set graphical snapping to 'all', allowing snapping to any type of feature.