Compile Time Changes

  • 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;

Runtime/Behavior Changes

Abstract Office Runtime Changes

  • Fixed an issue where typicals were inconsistently updating their 2D (FO-392)
  • Office material dialog cleanup and adding a method to enable the selection callback to be ran when the dialog tries to select a material.
  • Fix OfficeMaterialSelection to actually use the default size if none is provided.
  • Minor cleanup of tmount methods on PanelFrame.
  • Make animationTrySnap() on worksurface actually return whether it was successful or not, previously it would always return false.
  • Remove arbitrary 1inch inset of left/right snap.
    • Up until now, the left and right snap on PanelFrame were inset by one inch on each side. This was to visually offset the connector graphics since there was code in place to have them functionally behave as if they weren't inset at all.
    • As a result, when subclassing PanelFrame, one would have to either program around this offset by including the one inch in the connectsX() locations for any PanelJunctions, or override the initialLeftSnap(), initialRightSnap(), updateLRSnaps(), and the connectOffset() methods.
    • If you were relying on that offset, you can update your junction's connectsX() method accordingly to no longer use the one inch offset. There is load code on PanelFrame to adjust old drawings to make sure no connections are lost/broken on load.
    • If you want to keep relying on the old offset, you can implement the four methods mentioned in the second bullet point above and add the one inch offsets back in.
  • Move data inititialization for data surfaces to initializeWorksurface()
  • OfficeCabinet now uses visiblePosition() instead of visible3DPosition() for adjusting connector graphics. The visible3DPosition() and visible2DPosition() methods call visiblePosition() by default.
  • PickSkinAnimation now shows the discard property after a skin has been selected.
  • WorksurfaceDragAnimation has been updated to reflect updates to DragAnimation.
  • WorksurfaceInsertAnimationG2:update() has been updated to reflect past updates to InsertAnimationG2:update().
  • Worksurface cutouts have 2D graphics drawn for the holes automatically.

Category Changes/Migration

Coming with 11.0, Categories registered at the Abstract Office level have been drastically changed. This was done with feedback from the F5 and past feedback about categories in general. As such, code updates will be required as part of these changes.

To properly migrate/update to the new categories, a few things need to be done.

First, any place where category symbols were explicitly called out need to be updated. This includes view modes, layers, addSystemCategoriesTo() method on Snapper, systemCategories() method on ItemTag, etc.

Second, consider updating/removing extension specific categories in your custom packages. The new categories cover most of the common office product types so chances are there will be overlap with your current categories.

Because users can manually apply categories to snappers and item tags and can make custom view modes with them, to migrate these over, a migration map must be registered. This has already been done for Abstract Office, but if you are going to map your own categories over to new ones or ones in Abstract Office, you will also need to do this. An example of this is shown below and is taken from Abstract Office.

putCategoryMigratoryMap(cAOPkg, cF5CatUpdateVer, aoCategoryMigrateMap());
/**
 * Since some of the old categories are very generalized and the new
 * sub categories are very specific, we can't accurately map user
 * applied categories, view modes, or view ports.
 *
 * In those cases, we will map the the most general category we can and let
 * the user adjust to a more specific category.
 */
public symbol->symbol aoCategoryMigrateMap() {
    static symbol->symbol cats();

    if (!cats.any) {
	cats.put(#walls, cAOArchWallsCat);
	cats.put(#panels, cAOPanelsPanelCat);
	cats.put(#electric, cAOElectricalCat);
	cats.put(#storage, cAOStorageCat);
	cats.put(#desking, cAOCasegoodsCat);
	cats.put(#seating, cAOSeatingCat);
	cats.put(#worksurfaces, cAOWksfWorksurfaceCat);
	cats.put(#tables, cAOTablesTableCat);
	cats.put(#lighting, cAOLightAccessoryCat);
	cats.put(#legend, cAOLegendsCat);
	cats.put(#isoviews, cAOElevationCat);

	// old sub categories
	cats.put(#panelAnnotation, cAOPanelsPanelTxt);
	cats.put(#panelSym, cAOPanelsPanelSym);

	cats.put(#tableText, cAOTablesTableTxt);

	cats.put(#wsText, cAOWksfWorksurfaceTxt);
	cats.put(#wsSym, cAOWksfWorksurfaceSym);

	cats.put(#ohStorage, cAOStorageUpperCat);
	cats.put(#ohStorageTxt, cAOStorageUpperTxt);
	cats.put(#ohStorageSym, cAOStorageUpperSym);

	cats.put(#storageSym, cAOStorageLowerSym);
	cats.put(#storageText, cAOStorageLowerTxt);
    }

    return cats;
}

The map is defined as old category to new category (symbol->symbol). With this map, you then register it to a global migrator by using the function putCategoryMigratoryMap(). This function takes in symbol that represents the package the categories were registered with (for example cm.abstract.office), a version when the migration is happening (so in this case 11.0.0), and then the map of old to new categories.

/**
 * Package symbol to map of old category and new category.
 */
private CategoryMigrator _catMigrator : keep;

public CategoryMigrator categoryMigrator() {
    if (!_catMigrator) init _catMigrator();

    return _catMigrator;
}


/**
 * Put a migratory map (old category, new category) for a specific package.
 */
public void putCategoryMigratoryMap(symbol pkg, version v, symbol->symbol pairs) {
    categoryMigrator().putMigrator(pkg, v, pairs);
}


/**
 * Put a migratory map (old category, new category) for a specific package.
 */
extend public void putMigrator(symbol pkg, version v, symbol->symbol pairs) {

    version->symbol->symbol verMap = versionMigrateMap.get(pkg);
    if (verMap) {
	  verMap.put(v, pairs);
    } else {
	  version->symbol->symbol temp();
	  temp.put(v, pairs);
	  versionMigrateMap.put(pkg, temp);
    }
}

This registered map will be used when snappers, item tags, view ports, elevations, and custom view modes load to 11.0 to migrate their user applied categories correctly. This happens during loaded1() of these objects. The migrator and its code can be found in cm/core/category/categoryMigrator.cm.

    public void loaded1(ObjectFormatter formatter, LoadFailInfo failInfo) {
	super(formatter, failInfo);

	if (dbg_traceSnapperEvents) ptrace();
	if (dbg_traceSnapperEvWPln) pln("EV: ", this, ".loaded");

	#if (trackSnapperHistory) history(", ld1");
	initVessels();

	if (pkgVersion(#"core", formatter) < version(11, 0, 0)) {
	    migrateCategories(formatter);
	}
    }

    /**
     * Manually migrate any category failures after the migrator has mad an initial pass.
     */
    extend public void migrateCategoryFailures(symbol{} failures) {
	// Subclass responsiblity!
    }

How this works is that when the first object tries to migrate, all registered migration maps will be consolidated down based on their versions. For example, if the current version of Fika is 11.5 and a 10.5 drawing is loaded, migration for 11.0 and 11.5 will be checked and consolidated down for each package. If in 11.0, category A changed to category B, and in 11.5 category B changed to category C, the migrator will have a migrate A to C for all objects whose class is under custom.fika. Categories from core/abstracts will always be migrated after ones for a custom. This can also be handled at the snapper and item tag levels through the migrateCategories() method. This is the method that passes the object to the migrator to be processed. There is also the migrateCategoryFailures() method that gets called after the first pass of migration where extension specific categories should have been migrated. Here you can change how categories from core/abstracts get migrated.