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;
OfficeMaterialSelection
to actually use the default size if none is provided.PanelFrame
.animationTrySnap()
on worksurface actually return whether it was successful or not, previously it would always return false.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.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.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.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()
.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.