@itwin/core-backend 5.2.0-dev.8 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +59 -1
- package/lib/cjs/BackendHubAccess.d.ts +2 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
- package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js +6 -0
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +57 -3
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +151 -42
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +248 -248
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +4 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +8 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +22 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +54 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +96 -18
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +11 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +5 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +11 -0
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +175 -0
- package/lib/cjs/StashManager.d.ts.map +1 -0
- package/lib/cjs/StashManager.js +306 -0
- package/lib/cjs/StashManager.js.map +1 -0
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +226 -15
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +249 -23
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +17 -2
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +40 -6
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js +6 -6
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +8 -7
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +164 -36
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +315 -105
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js +11 -3
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.d.ts +51 -38
- package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js +252 -156
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.d.ts +2 -12
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +50 -45
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +2 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.d.ts +6 -0
- package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/esm/BackendLoggerCategory.js +6 -0
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +57 -3
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +152 -43
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +248 -248
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +4 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.d.ts +8 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +22 -0
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +54 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +97 -19
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +11 -1
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +5 -0
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.js +1 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.d.ts +8 -0
- package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/esm/SqliteChangesetReader.js +11 -0
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.d.ts +175 -0
- package/lib/esm/StashManager.d.ts.map +1 -0
- package/lib/esm/StashManager.js +301 -0
- package/lib/esm/StashManager.js.map +1 -0
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +226 -15
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +247 -21
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +17 -2
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +38 -5
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js +6 -6
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +8 -7
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +164 -36
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +317 -108
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js +11 -3
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.d.ts +51 -38
- package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js +253 -157
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.d.ts +2 -12
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +52 -47
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js +7 -2
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +338 -126
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js +4 -4
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +19 -17
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +636 -60
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js +627 -193
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +128 -58
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +326 -326
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +680 -0
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +248 -118
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { expect } from "chai";
|
|
6
6
|
import { Angle, Point3d, Range2d, Range3d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
7
|
-
import { FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
|
+
import { FieldRun, FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
8
8
|
import { StandaloneDb } from "../../IModelDb";
|
|
9
|
-
import { AnnotationTextStyle, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
|
|
9
|
+
import { AnnotationTextStyle, parseTextAnnotationData, TEXT_ANNOTATION_JSON_VERSION, TEXT_STYLE_SETTINGS_JSON_VERSION, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
|
|
10
10
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
11
11
|
import { Subject } from "../../Element";
|
|
12
12
|
import { Guid, Id64 } from "@itwin/core-bentley";
|
|
@@ -15,7 +15,11 @@ import { DrawingCategory, SpatialCategory } from "../../Category";
|
|
|
15
15
|
import { DisplayStyle2d, DisplayStyle3d } from "../../DisplayStyle";
|
|
16
16
|
import { CategorySelector, DrawingViewDefinition, ModelSelector, SpatialViewDefinition } from "../../ViewDefinition";
|
|
17
17
|
import { FontFile } from "../../FontFile";
|
|
18
|
-
import { computeTextRangeAsStringLength } from "../AnnotationTestUtils";
|
|
18
|
+
import { computeTextRangeAsStringLength, MockBuilder } from "../AnnotationTestUtils";
|
|
19
|
+
import { TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
|
|
20
|
+
import { layoutTextBlock, TextStyleResolver } from "../../annotations/TextBlockLayout";
|
|
21
|
+
import { appendTextAnnotationGeometry } from "../../annotations/TextAnnotationGeometry";
|
|
22
|
+
import { IModelElementCloneContext } from "../../IModelElementCloneContext";
|
|
19
23
|
function mockIModel() {
|
|
20
24
|
const iModel = {
|
|
21
25
|
fonts: {
|
|
@@ -26,13 +30,14 @@ function mockIModel() {
|
|
|
26
30
|
};
|
|
27
31
|
return iModel;
|
|
28
32
|
}
|
|
29
|
-
function createAnnotation(
|
|
30
|
-
const styleOverrides = {
|
|
31
|
-
const block = TextBlock.create({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
function createAnnotation(textBlock) {
|
|
34
|
+
const styleOverrides = { font: { name: "Karla" }, margins: { left: 0, right: 1, top: 2, bottom: 3 } };
|
|
35
|
+
const block = textBlock ?? TextBlock.create({ styleOverrides });
|
|
36
|
+
if (!textBlock) {
|
|
37
|
+
block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
|
|
38
|
+
block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
|
|
39
|
+
block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
|
|
40
|
+
}
|
|
36
41
|
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
37
42
|
annotation.anchor = { vertical: "middle", horizontal: "right" };
|
|
38
43
|
annotation.orientation = YawPitchRollAngles.createDegrees(1, 0, -1);
|
|
@@ -78,9 +83,34 @@ const createIModel = async (name) => {
|
|
|
78
83
|
});
|
|
79
84
|
return iModel;
|
|
80
85
|
};
|
|
81
|
-
const createAnnotationTextStyle = (iModel,
|
|
82
|
-
return AnnotationTextStyle.create(iModel,
|
|
86
|
+
const createAnnotationTextStyle = (iModel, definitionModelId, name, settings = TextStyleSettings.defaultProps) => {
|
|
87
|
+
return AnnotationTextStyle.create(iModel, {
|
|
88
|
+
definitionModelId,
|
|
89
|
+
name,
|
|
90
|
+
settings,
|
|
91
|
+
description: "description",
|
|
92
|
+
});
|
|
83
93
|
};
|
|
94
|
+
function createElement2d(imodel, createArgs) {
|
|
95
|
+
const placement = {
|
|
96
|
+
origin: { x: 0, y: 0 },
|
|
97
|
+
angle: Angle.createDegrees(0).toJSON(),
|
|
98
|
+
};
|
|
99
|
+
return TextAnnotation2d.create(imodel, {
|
|
100
|
+
...createArgs,
|
|
101
|
+
placement,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function createElement3d(imodel, createArgs) {
|
|
105
|
+
const placement = {
|
|
106
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
107
|
+
angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
|
|
108
|
+
};
|
|
109
|
+
return TextAnnotation3d.create(imodel, {
|
|
110
|
+
...createArgs,
|
|
111
|
+
placement,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
84
114
|
describe("TextAnnotation element", () => {
|
|
85
115
|
function makeElement(props) {
|
|
86
116
|
return TextAnnotation2d.fromJSON({
|
|
@@ -95,25 +125,76 @@ describe("TextAnnotation element", () => {
|
|
|
95
125
|
origin: { x: 0, y: 0 },
|
|
96
126
|
angle: 0,
|
|
97
127
|
},
|
|
128
|
+
defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x21").toJSON(),
|
|
98
129
|
...props,
|
|
99
130
|
}, mockIModel());
|
|
100
131
|
}
|
|
132
|
+
describe("versioning", () => {
|
|
133
|
+
it("throws if the JSON has no version", () => {
|
|
134
|
+
expect(() => makeElement({
|
|
135
|
+
textAnnotationData: JSON.stringify({
|
|
136
|
+
data: {
|
|
137
|
+
textBlock: TextBlock.create().toJSON()
|
|
138
|
+
}
|
|
139
|
+
}),
|
|
140
|
+
})).to.throw("JSON version is missing or invalid.");
|
|
141
|
+
});
|
|
142
|
+
it("throws if the JSON has no data", () => {
|
|
143
|
+
expect(() => makeElement({
|
|
144
|
+
textAnnotationData: JSON.stringify({
|
|
145
|
+
version: TEXT_ANNOTATION_JSON_VERSION,
|
|
146
|
+
}),
|
|
147
|
+
})).to.throw("JSON data is missing or invalid.");
|
|
148
|
+
});
|
|
149
|
+
it("throws if the JSON version is too new", () => {
|
|
150
|
+
expect(() => makeElement({
|
|
151
|
+
textAnnotationData: JSON.stringify({
|
|
152
|
+
version: "999.999.999",
|
|
153
|
+
data: {
|
|
154
|
+
textBlock: TextBlock.create().toJSON()
|
|
155
|
+
}
|
|
156
|
+
}),
|
|
157
|
+
})).to.throw(`JSON version 999.999.999 is newer than supported version ${TEXT_ANNOTATION_JSON_VERSION}. Application update required to understand data.`);
|
|
158
|
+
});
|
|
159
|
+
it("throws if the JSON version is old and cannot be migrated", () => {
|
|
160
|
+
expect(() => makeElement({
|
|
161
|
+
textAnnotationData: JSON.stringify({
|
|
162
|
+
version: "0.0.1",
|
|
163
|
+
data: {
|
|
164
|
+
textBlock: TextBlock.create().toJSON()
|
|
165
|
+
}
|
|
166
|
+
}),
|
|
167
|
+
})).to.throw(`Migration for textAnnotationData from version 0.0.1 to ${TEXT_ANNOTATION_JSON_VERSION} failed.`);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
101
170
|
describe("getAnnotation", () => {
|
|
102
171
|
it("returns undefined if not provided", () => {
|
|
103
172
|
expect(makeElement().getAnnotation()).to.be.undefined;
|
|
104
173
|
});
|
|
105
174
|
it("converts JSON string to class instance", () => {
|
|
106
175
|
const elem = makeElement({
|
|
107
|
-
textAnnotationData: JSON.stringify({
|
|
176
|
+
textAnnotationData: JSON.stringify({
|
|
177
|
+
version: TEXT_ANNOTATION_JSON_VERSION,
|
|
178
|
+
data: {
|
|
179
|
+
textBlock: TextBlock.create().toJSON()
|
|
180
|
+
}
|
|
181
|
+
}),
|
|
182
|
+
defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x42").toJSON()
|
|
108
183
|
});
|
|
109
184
|
const anno = elem.getAnnotation();
|
|
110
185
|
expect(anno).not.to.be.undefined;
|
|
111
186
|
expect(anno.textBlock.isEmpty).to.be.true;
|
|
112
|
-
expect(
|
|
187
|
+
expect(elem.defaultTextStyle).not.to.be.undefined;
|
|
188
|
+
expect(elem.defaultTextStyle.id).to.equal("0x42");
|
|
113
189
|
});
|
|
114
190
|
it("produces a new object each time it is called", () => {
|
|
115
191
|
const elem = makeElement({
|
|
116
|
-
textAnnotationData: JSON.stringify({
|
|
192
|
+
textAnnotationData: JSON.stringify({
|
|
193
|
+
version: TEXT_ANNOTATION_JSON_VERSION,
|
|
194
|
+
data: {
|
|
195
|
+
textBlock: TextBlock.create().toJSON()
|
|
196
|
+
}
|
|
197
|
+
}),
|
|
117
198
|
});
|
|
118
199
|
const anno1 = elem.getAnnotation();
|
|
119
200
|
const anno2 = elem.getAnnotation();
|
|
@@ -124,7 +205,7 @@ describe("TextAnnotation element", () => {
|
|
|
124
205
|
describe("setAnnotation", () => {
|
|
125
206
|
it("updates properties", () => {
|
|
126
207
|
const elem = makeElement();
|
|
127
|
-
const textBlock = TextBlock.create(
|
|
208
|
+
const textBlock = TextBlock.create();
|
|
128
209
|
textBlock.appendRun(TextRun.create({ content: "text" }));
|
|
129
210
|
const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });
|
|
130
211
|
elem.setAnnotation(annotation);
|
|
@@ -132,35 +213,78 @@ describe("TextAnnotation element", () => {
|
|
|
132
213
|
expect(elem.getAnnotation().toJSON()).not.to.equal(annotation.toJSON());
|
|
133
214
|
});
|
|
134
215
|
});
|
|
216
|
+
describe("getReferenceIds", () => {
|
|
217
|
+
function expectReferenceIds(expected, element) {
|
|
218
|
+
const actual = Array.from(element.getReferenceIds()).sort();
|
|
219
|
+
// reference Ids get a prefix indicating their type ('e' for 'element')
|
|
220
|
+
expected = expected.map((id) => `e${id}`);
|
|
221
|
+
// the superclasses provide some reference Ids (code spec, model, category)
|
|
222
|
+
const baseIds = ["e0x12", "e0x78", "m0x34"];
|
|
223
|
+
expected.push(...baseIds);
|
|
224
|
+
expected = expected.sort();
|
|
225
|
+
expect(actual).to.deep.equal(expected);
|
|
226
|
+
}
|
|
227
|
+
it("reports default text style and field hosts", () => {
|
|
228
|
+
// makeElement sets defaultTextStyle to "0x21"
|
|
229
|
+
const elem = makeElement();
|
|
230
|
+
expectReferenceIds(["0x21"], elem);
|
|
231
|
+
elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0x123");
|
|
232
|
+
expectReferenceIds(["0x123"], elem);
|
|
233
|
+
const textBlock = TextBlock.create();
|
|
234
|
+
textBlock.appendRun(FieldRun.create({
|
|
235
|
+
propertyHost: { elementId: "0x456", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
236
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
237
|
+
}));
|
|
238
|
+
textBlock.appendRun(FieldRun.create({
|
|
239
|
+
propertyHost: { elementId: "0x789", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
240
|
+
propertyPath: { propertyName: "LastMod" },
|
|
241
|
+
}));
|
|
242
|
+
elem.setAnnotation(TextAnnotation.create({ textBlock }));
|
|
243
|
+
expectReferenceIds(["0x123", "0x456", "0x789"], elem);
|
|
244
|
+
elem.defaultTextStyle = undefined;
|
|
245
|
+
expectReferenceIds(["0x456", "0x789"], elem);
|
|
246
|
+
elem.setAnnotation(TextAnnotation.create());
|
|
247
|
+
expectReferenceIds([], elem);
|
|
248
|
+
});
|
|
249
|
+
it("does not report invalid Ids", () => {
|
|
250
|
+
const elem = makeElement();
|
|
251
|
+
elem.defaultTextStyle = undefined;
|
|
252
|
+
expectReferenceIds([], elem);
|
|
253
|
+
elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0");
|
|
254
|
+
expectReferenceIds([], elem);
|
|
255
|
+
const textBlock = TextBlock.create();
|
|
256
|
+
textBlock.appendRun(FieldRun.create({
|
|
257
|
+
propertyHost: { elementId: "0", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
258
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
259
|
+
}));
|
|
260
|
+
textBlock.appendRun(FieldRun.create({
|
|
261
|
+
propertyHost: { elementId: "0x123", schemaName: "BisCore", className: "GeometricElement3d" },
|
|
262
|
+
propertyPath: { propertyName: "LastMod" },
|
|
263
|
+
}));
|
|
264
|
+
elem.setAnnotation(TextAnnotation.create({ textBlock }));
|
|
265
|
+
expectReferenceIds(["0x123"], elem);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
135
268
|
describe("TextAnnotation3d Persistence", () => {
|
|
136
269
|
let imodel;
|
|
137
|
-
let
|
|
138
|
-
let seedModelId;
|
|
139
|
-
let seedStyleId;
|
|
270
|
+
let createElement3dArgs;
|
|
140
271
|
before(async () => {
|
|
141
272
|
imodel = await createIModel("TextAnnotation3d");
|
|
142
273
|
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
143
274
|
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
144
275
|
const { category, model } = insertSpatialModel(imodel, jobSubjectId, definitionModel);
|
|
145
|
-
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", {
|
|
276
|
+
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
|
|
146
277
|
expect(jobSubjectId).not.to.be.undefined;
|
|
147
278
|
expect(category).not.to.be.undefined;
|
|
148
279
|
expect(model).not.to.be.undefined;
|
|
149
280
|
expect(styleId).not.to.be.undefined;
|
|
150
|
-
|
|
151
|
-
seedModelId = model;
|
|
152
|
-
seedStyleId = styleId;
|
|
281
|
+
createElement3dArgs = { category, model };
|
|
153
282
|
});
|
|
154
283
|
after(() => imodel.close());
|
|
155
|
-
function createElement3d(createArgs) {
|
|
156
|
-
return TextAnnotation3d.create(imodel, seedCategoryId, seedModelId, {
|
|
157
|
-
origin: { x: 0, y: 0, z: 0 },
|
|
158
|
-
angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
|
|
159
|
-
}, createArgs?.textAnnotationData);
|
|
160
|
-
}
|
|
161
284
|
it("creating element does not automatically compute the geometry", () => {
|
|
162
285
|
const annotation = createAnnotation();
|
|
163
|
-
const
|
|
286
|
+
const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
|
|
287
|
+
const el = createElement3d(imodel, args);
|
|
164
288
|
expect(el.getAnnotation().equals(annotation)).to.be.true;
|
|
165
289
|
expect(el.geom).to.be.undefined;
|
|
166
290
|
});
|
|
@@ -175,7 +299,7 @@ describe("TextAnnotation element", () => {
|
|
|
175
299
|
}
|
|
176
300
|
describe("inserts 3d element and round-trips through JSON", async () => {
|
|
177
301
|
async function test(annotation) {
|
|
178
|
-
const el0 = createElement3d();
|
|
302
|
+
const el0 = createElement3d(imodel, { ...createElement3dArgs });
|
|
179
303
|
if (annotation) {
|
|
180
304
|
el0.setAnnotation(annotation);
|
|
181
305
|
}
|
|
@@ -198,42 +322,30 @@ describe("TextAnnotation element", () => {
|
|
|
198
322
|
}
|
|
199
323
|
}
|
|
200
324
|
it("roundtrips an empty annotation", async () => { await test(); });
|
|
201
|
-
it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
|
|
202
325
|
it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
|
|
203
326
|
});
|
|
204
327
|
});
|
|
205
328
|
describe("TextAnnotation2d Persistence", () => {
|
|
206
329
|
let imodel;
|
|
207
|
-
let
|
|
208
|
-
let seedModelId;
|
|
209
|
-
let seedStyleId;
|
|
330
|
+
let createElement2dArgs;
|
|
210
331
|
before(async () => {
|
|
211
332
|
imodel = await createIModel("TextAnnotation2d");
|
|
212
333
|
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
213
334
|
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
214
335
|
const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
|
|
215
|
-
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
|
|
216
336
|
expect(jobSubjectId).not.to.be.undefined;
|
|
217
337
|
expect(category).not.to.be.undefined;
|
|
218
338
|
expect(model).not.to.be.undefined;
|
|
219
|
-
|
|
220
|
-
seedCategoryId = category;
|
|
221
|
-
seedModelId = model;
|
|
222
|
-
seedStyleId = styleId;
|
|
339
|
+
createElement2dArgs = { category, model };
|
|
223
340
|
});
|
|
224
341
|
after(() => {
|
|
225
342
|
imodel.saveChanges("tests");
|
|
226
343
|
imodel.close();
|
|
227
344
|
});
|
|
228
|
-
function createElement2d(createArgs) {
|
|
229
|
-
return TextAnnotation2d.create(imodel, seedCategoryId, seedModelId, {
|
|
230
|
-
origin: { x: 0, y: 0 },
|
|
231
|
-
angle: Angle.createDegrees(0).toJSON(),
|
|
232
|
-
}, createArgs?.textAnnotationData);
|
|
233
|
-
}
|
|
234
345
|
it("creating element does not automatically compute the geometry", () => {
|
|
235
346
|
const annotation = createAnnotation();
|
|
236
|
-
const
|
|
347
|
+
const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
|
|
348
|
+
const el = createElement2d(imodel, args);
|
|
237
349
|
expect(el.getAnnotation().equals(annotation)).to.be.true;
|
|
238
350
|
expect(el.geom).to.be.undefined;
|
|
239
351
|
});
|
|
@@ -245,7 +357,7 @@ describe("TextAnnotation element", () => {
|
|
|
245
357
|
}
|
|
246
358
|
describe("inserts 2d element and round-trips through JSON", async () => {
|
|
247
359
|
async function test(annotation) {
|
|
248
|
-
const el0 = createElement2d();
|
|
360
|
+
const el0 = createElement2d(imodel, createElement2dArgs);
|
|
249
361
|
if (annotation) {
|
|
250
362
|
el0.setAnnotation(annotation);
|
|
251
363
|
}
|
|
@@ -265,13 +377,299 @@ describe("TextAnnotation element", () => {
|
|
|
265
377
|
expect(anno).not.to.be.undefined;
|
|
266
378
|
expect(anno.equals(annotation)).to.be.true;
|
|
267
379
|
expect(el0.toJSON().elementGeometryBuilderParams).not.to.be.undefined;
|
|
380
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
268
381
|
}
|
|
269
382
|
}
|
|
270
383
|
it("roundtrips an empty annotation", async () => { await test(); });
|
|
271
|
-
it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
|
|
272
384
|
it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
|
|
273
385
|
});
|
|
274
386
|
});
|
|
387
|
+
describe("defaultTextStyle", () => {
|
|
388
|
+
let imodel;
|
|
389
|
+
let seedSubjectId;
|
|
390
|
+
let seedDefinitionModelId;
|
|
391
|
+
let seedStyleId;
|
|
392
|
+
let seedStyleId2;
|
|
393
|
+
before(async () => {
|
|
394
|
+
imodel = await createIModel("DefaultTextStyle");
|
|
395
|
+
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
396
|
+
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
397
|
+
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
|
|
398
|
+
const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { font: { name: "Karla" }, textHeight: 0.5, isBold: true }).insert();
|
|
399
|
+
expect(jobSubjectId).not.to.be.undefined;
|
|
400
|
+
expect(definitionModel).not.to.be.undefined;
|
|
401
|
+
expect(styleId).not.to.be.undefined;
|
|
402
|
+
expect(differentStyleId).not.to.be.undefined;
|
|
403
|
+
seedSubjectId = jobSubjectId;
|
|
404
|
+
seedDefinitionModelId = definitionModel;
|
|
405
|
+
seedStyleId = styleId;
|
|
406
|
+
seedStyleId2 = differentStyleId;
|
|
407
|
+
});
|
|
408
|
+
after(() => {
|
|
409
|
+
imodel.saveChanges("tests");
|
|
410
|
+
imodel.close();
|
|
411
|
+
});
|
|
412
|
+
describe("TextAnnotation2d", () => {
|
|
413
|
+
let createElement2dArgs;
|
|
414
|
+
before(() => {
|
|
415
|
+
const { category, model } = insertDrawingModel(imodel, seedSubjectId, seedDefinitionModelId);
|
|
416
|
+
expect(category).not.to.be.undefined;
|
|
417
|
+
expect(model).not.to.be.undefined;
|
|
418
|
+
createElement2dArgs = { category, model };
|
|
419
|
+
});
|
|
420
|
+
it("preserves defaultTextStyle after round trip", () => {
|
|
421
|
+
const annotation = createAnnotation();
|
|
422
|
+
const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
|
|
423
|
+
const el0 = createElement2d(imodel, args);
|
|
424
|
+
expect(el0.defaultTextStyle).not.to.be.undefined;
|
|
425
|
+
expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
|
|
426
|
+
el0.insert();
|
|
427
|
+
const el1 = imodel.elements.getElement(el0.id);
|
|
428
|
+
expect(el1).not.to.be.undefined;
|
|
429
|
+
expect(el1.defaultTextStyle).not.to.be.undefined;
|
|
430
|
+
expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
|
|
431
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
432
|
+
});
|
|
433
|
+
it("produces different geometry when defaultTextStyle changes", () => {
|
|
434
|
+
const annotation = createAnnotation();
|
|
435
|
+
const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
|
|
436
|
+
const el0 = createElement2d(imodel, args);
|
|
437
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
|
|
438
|
+
const geom1 = el0.toJSON().elementGeometryBuilderParams;
|
|
439
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
|
|
440
|
+
const geom2 = el0.toJSON().elementGeometryBuilderParams;
|
|
441
|
+
expect(geom1).not.to.deep.equal(geom2);
|
|
442
|
+
});
|
|
443
|
+
it("allows defaultTextStyle to be undefined", () => {
|
|
444
|
+
const annotation = createAnnotation();
|
|
445
|
+
const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
|
|
446
|
+
const el0 = createElement2d(imodel, args);
|
|
447
|
+
el0.defaultTextStyle = undefined;
|
|
448
|
+
const elId = el0.insert();
|
|
449
|
+
expect(Id64.isValidId64(elId)).to.be.true;
|
|
450
|
+
const el1 = imodel.elements.getElement(elId);
|
|
451
|
+
expect(el1).not.to.be.undefined;
|
|
452
|
+
expect(el1 instanceof TextAnnotation2d).to.be.true;
|
|
453
|
+
expect(el1.defaultTextStyle).to.be.undefined;
|
|
454
|
+
});
|
|
455
|
+
describe("onCloned", () => {
|
|
456
|
+
function insertStyledElement(styleId, db) {
|
|
457
|
+
const args = { ...createElement2dArgs, defaultTextStyleId: styleId };
|
|
458
|
+
const elem = createElement2d(db, args);
|
|
459
|
+
elem.insert();
|
|
460
|
+
imodel.saveChanges();
|
|
461
|
+
return elem;
|
|
462
|
+
}
|
|
463
|
+
describe("within a single iModel", () => {
|
|
464
|
+
it("leaves property hosts intact", () => {
|
|
465
|
+
const textBlock = TextBlock.create({
|
|
466
|
+
children: [{
|
|
467
|
+
children: [{
|
|
468
|
+
type: "field",
|
|
469
|
+
propertyHost: {
|
|
470
|
+
elementId: "0x123",
|
|
471
|
+
schemaName: "Fields",
|
|
472
|
+
className: "TestElement",
|
|
473
|
+
},
|
|
474
|
+
propertyPath: { propertyName: "intProp" },
|
|
475
|
+
}, {
|
|
476
|
+
type: "field",
|
|
477
|
+
propertyHost: {
|
|
478
|
+
elementId: "0xabc",
|
|
479
|
+
schemaName: "BisCore",
|
|
480
|
+
className: "Element",
|
|
481
|
+
},
|
|
482
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
483
|
+
}],
|
|
484
|
+
}],
|
|
485
|
+
});
|
|
486
|
+
const annotation = TextAnnotation.create({ textBlock });
|
|
487
|
+
const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
|
|
488
|
+
elem.insert();
|
|
489
|
+
imodel.saveChanges();
|
|
490
|
+
const context = new IModelElementCloneContext(imodel);
|
|
491
|
+
context.remapElement("0x123", "0x456");
|
|
492
|
+
context.remapElement("0xabc", "0xdef");
|
|
493
|
+
context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
|
|
494
|
+
const props = context.cloneElement(elem);
|
|
495
|
+
expect(props.textAnnotationData).not.to.be.undefined;
|
|
496
|
+
const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
|
|
497
|
+
const para = anno.textBlock.children[0];
|
|
498
|
+
expect(para.children[0].propertyHost.elementId).to.equal("0x123");
|
|
499
|
+
expect(para.children[1].propertyHost.elementId).to.equal("0xabc");
|
|
500
|
+
});
|
|
501
|
+
it("leaves default text style intact", () => {
|
|
502
|
+
function clone(styleId, expectedStyleId) {
|
|
503
|
+
const elem = insertStyledElement(styleId, imodel);
|
|
504
|
+
const context = new IModelElementCloneContext(imodel);
|
|
505
|
+
context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
|
|
506
|
+
const props = context.cloneElement(elem);
|
|
507
|
+
expect(props.defaultTextStyle?.id).to.equal(expectedStyleId);
|
|
508
|
+
if (styleId) {
|
|
509
|
+
// Even an explicit remapping is ignored when cloning within a single iModel
|
|
510
|
+
// (per the examples set by most other elements, excluding RenderMaterial).
|
|
511
|
+
context.remapElement(styleId, "0x99887");
|
|
512
|
+
const props2 = context.cloneElement(elem);
|
|
513
|
+
expect(props2.defaultTextStyle?.id).to.equal(expectedStyleId);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
clone(seedStyleId, seedStyleId);
|
|
517
|
+
clone(undefined, undefined);
|
|
518
|
+
clone("0x12345", "0x12345");
|
|
519
|
+
clone(Id64.invalid, undefined);
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
describe("between iModels", () => {
|
|
523
|
+
let dstDb;
|
|
524
|
+
let dstDefModel;
|
|
525
|
+
let dstElemArgs;
|
|
526
|
+
before(async () => {
|
|
527
|
+
dstDb = await createIModel("CloneTarget");
|
|
528
|
+
const jobSubjectId = createJobSubjectElement(dstDb, "Job").insert();
|
|
529
|
+
dstDefModel = DefinitionModel.insert(dstDb, jobSubjectId, "Definition");
|
|
530
|
+
const { category, model } = insertDrawingModel(dstDb, jobSubjectId, dstDefModel);
|
|
531
|
+
expect(category).not.to.equal(createElement2dArgs.category);
|
|
532
|
+
expect(model).not.to.equal(createElement2dArgs.model);
|
|
533
|
+
dstElemArgs = { category, model };
|
|
534
|
+
});
|
|
535
|
+
after(() => dstDb.close());
|
|
536
|
+
it("remaps property hosts", () => {
|
|
537
|
+
const textBlock = TextBlock.create({
|
|
538
|
+
children: [{
|
|
539
|
+
children: [{
|
|
540
|
+
type: "field",
|
|
541
|
+
propertyHost: {
|
|
542
|
+
elementId: "0x123",
|
|
543
|
+
schemaName: "Fields",
|
|
544
|
+
className: "TestElement",
|
|
545
|
+
},
|
|
546
|
+
propertyPath: { propertyName: "intProp" },
|
|
547
|
+
}, {
|
|
548
|
+
type: "field",
|
|
549
|
+
propertyHost: {
|
|
550
|
+
elementId: "0xabc",
|
|
551
|
+
schemaName: "BisCore",
|
|
552
|
+
className: "Element",
|
|
553
|
+
},
|
|
554
|
+
propertyPath: { propertyName: "CodeValue" },
|
|
555
|
+
}],
|
|
556
|
+
}],
|
|
557
|
+
});
|
|
558
|
+
const annotation = TextAnnotation.create({ textBlock });
|
|
559
|
+
const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
|
|
560
|
+
elem.insert();
|
|
561
|
+
imodel.saveChanges();
|
|
562
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
563
|
+
context.remapElement("0x123", "0x456");
|
|
564
|
+
context.remapElement("0xabc", "0xdef");
|
|
565
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
566
|
+
const props = context.cloneElement(elem);
|
|
567
|
+
expect(props.textAnnotationData).not.to.be.undefined;
|
|
568
|
+
const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
|
|
569
|
+
const para = anno.textBlock.children[0];
|
|
570
|
+
expect(para.children[0].propertyHost.elementId).to.equal("0x456");
|
|
571
|
+
expect(para.children[1].propertyHost.elementId).to.equal("0xdef");
|
|
572
|
+
});
|
|
573
|
+
it("sets default text style to undefined if source style does not exist", () => {
|
|
574
|
+
const elem = insertStyledElement("0x12345", imodel);
|
|
575
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
576
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
577
|
+
const props = context.cloneElement(elem);
|
|
578
|
+
expect(props.defaultTextStyle).to.be.undefined;
|
|
579
|
+
});
|
|
580
|
+
it("remaps to an existing text style with the same code if present", () => {
|
|
581
|
+
const dstStyleId = createAnnotationTextStyle(dstDb, dstDefModel, "test", { font: { name: "Karla" } }).insert();
|
|
582
|
+
expect(dstStyleId).not.to.equal(seedStyleId);
|
|
583
|
+
const srcElem = insertStyledElement(seedStyleId, imodel);
|
|
584
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
585
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
586
|
+
const props = context.cloneElement(srcElem);
|
|
587
|
+
expect(props.defaultTextStyle?.id).to.equal(dstStyleId);
|
|
588
|
+
});
|
|
589
|
+
it("throws an error if definition model is not remapped", () => {
|
|
590
|
+
const srcElem = insertStyledElement(seedStyleId2, imodel);
|
|
591
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
592
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
593
|
+
expect(() => context.cloneElement(srcElem)).to.throw("Invalid target model");
|
|
594
|
+
});
|
|
595
|
+
it("imports default text style if necessary", () => {
|
|
596
|
+
const srcElem = insertStyledElement(seedStyleId2, imodel);
|
|
597
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
598
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
599
|
+
context.remapElement(seedDefinitionModelId, dstDefModel);
|
|
600
|
+
const props = context.cloneElement(srcElem);
|
|
601
|
+
const dstStyleId = props.defaultTextStyle.id;
|
|
602
|
+
expect(dstStyleId).not.to.be.undefined;
|
|
603
|
+
expect(dstStyleId).not.to.equal(seedStyleId2);
|
|
604
|
+
expect(dstDb.elements.tryGetElement(dstStyleId)).not.to.be.undefined;
|
|
605
|
+
});
|
|
606
|
+
it("remaps multiple occurrences of same style to same Id", () => {
|
|
607
|
+
const srcStyleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "styyyle", { font: { name: "Karla" } }).insert();
|
|
608
|
+
const srcElem1 = insertStyledElement(srcStyleId, imodel);
|
|
609
|
+
const srcElem2 = insertStyledElement(srcStyleId, imodel);
|
|
610
|
+
const srcElem3 = insertStyledElement(srcStyleId, imodel);
|
|
611
|
+
const context = new IModelElementCloneContext(imodel, dstDb);
|
|
612
|
+
context.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
613
|
+
context.remapElement(seedDefinitionModelId, dstDefModel);
|
|
614
|
+
const props1 = context.cloneElement(srcElem1);
|
|
615
|
+
const props2 = context.cloneElement(srcElem2);
|
|
616
|
+
expect(props1.defaultTextStyle).not.to.be.undefined;
|
|
617
|
+
expect(props1.defaultTextStyle?.id).not.to.equal(srcStyleId);
|
|
618
|
+
expect(props2.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
|
|
619
|
+
const context2 = new IModelElementCloneContext(imodel, dstDb);
|
|
620
|
+
context2.remapElement(createElement2dArgs.model, dstElemArgs.model);
|
|
621
|
+
context2.remapElement(seedDefinitionModelId, dstDefModel);
|
|
622
|
+
const props3 = context2.cloneElement(srcElem3);
|
|
623
|
+
expect(props3.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
|
|
624
|
+
});
|
|
625
|
+
});
|
|
626
|
+
});
|
|
627
|
+
});
|
|
628
|
+
describe("TextAnnotation3d", () => {
|
|
629
|
+
let createElement3dArgs;
|
|
630
|
+
before(() => {
|
|
631
|
+
const { category, model } = insertSpatialModel(imodel, seedSubjectId, seedDefinitionModelId);
|
|
632
|
+
expect(category).not.to.be.undefined;
|
|
633
|
+
expect(model).not.to.be.undefined;
|
|
634
|
+
createElement3dArgs = { category, model };
|
|
635
|
+
});
|
|
636
|
+
it("preserves defaultTextStyle after round trip", () => {
|
|
637
|
+
const annotation = createAnnotation();
|
|
638
|
+
const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
|
|
639
|
+
const el0 = createElement3d(imodel, args);
|
|
640
|
+
expect(el0.defaultTextStyle).not.to.be.undefined;
|
|
641
|
+
expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
|
|
642
|
+
el0.insert();
|
|
643
|
+
const el1 = imodel.elements.getElement(el0.id);
|
|
644
|
+
expect(el1).not.to.be.undefined;
|
|
645
|
+
expect(el1.defaultTextStyle).not.to.be.undefined;
|
|
646
|
+
expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
|
|
647
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
648
|
+
});
|
|
649
|
+
it("produces different geometry when defaultTextStyle changes", () => {
|
|
650
|
+
const annotation = createAnnotation();
|
|
651
|
+
const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
|
|
652
|
+
const el0 = createElement3d(imodel, args);
|
|
653
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
|
|
654
|
+
const geom1 = el0.toJSON().elementGeometryBuilderParams;
|
|
655
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
|
|
656
|
+
const geom2 = el0.toJSON().elementGeometryBuilderParams;
|
|
657
|
+
expect(geom1).not.to.deep.equal(geom2);
|
|
658
|
+
});
|
|
659
|
+
it("allows defaultTextStyle to be undefined", () => {
|
|
660
|
+
const annotation = createAnnotation();
|
|
661
|
+
const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
|
|
662
|
+
const el0 = createElement3d(imodel, args);
|
|
663
|
+
el0.defaultTextStyle = undefined;
|
|
664
|
+
const elId = el0.insert();
|
|
665
|
+
expect(Id64.isValidId64(elId)).to.be.true;
|
|
666
|
+
const el1 = imodel.elements.getElement(elId);
|
|
667
|
+
expect(el1).not.to.be.undefined;
|
|
668
|
+
expect(el1 instanceof TextAnnotation3d).to.be.true;
|
|
669
|
+
expect(el1.defaultTextStyle).to.be.undefined;
|
|
670
|
+
});
|
|
671
|
+
});
|
|
672
|
+
});
|
|
275
673
|
});
|
|
276
674
|
describe("AnnotationTextStyle", () => {
|
|
277
675
|
let imodel;
|
|
@@ -291,9 +689,9 @@ describe("AnnotationTextStyle", () => {
|
|
|
291
689
|
});
|
|
292
690
|
it("inserts a style and round-trips through JSON", async () => {
|
|
293
691
|
const textStyle = TextStyleSettings.fromJSON({
|
|
294
|
-
|
|
692
|
+
font: { name: "Totally Real Font" },
|
|
295
693
|
isUnderlined: true,
|
|
296
|
-
|
|
694
|
+
textHeight: 0.5
|
|
297
695
|
});
|
|
298
696
|
const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "round-trip", textStyle.toJSON());
|
|
299
697
|
const elId = el0.insert();
|
|
@@ -310,27 +708,27 @@ describe("AnnotationTextStyle", () => {
|
|
|
310
708
|
let annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "default");
|
|
311
709
|
expect(() => annotationTextStyle.insert()).to.throw();
|
|
312
710
|
// font is required
|
|
313
|
-
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", {
|
|
711
|
+
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", { font: { name: "" } });
|
|
314
712
|
expect(() => annotationTextStyle.insert()).to.throw();
|
|
315
|
-
//
|
|
316
|
-
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid
|
|
713
|
+
// textHeight should be positive
|
|
714
|
+
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid textHeight", { font: { name: "Totally Real Font" }, textHeight: 0 });
|
|
317
715
|
expect(() => annotationTextStyle.insert()).to.throw();
|
|
318
716
|
// stackedFractionScale should be positive
|
|
319
|
-
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid stackedFractionScale", {
|
|
717
|
+
annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid stackedFractionScale", { font: { name: "Totally Real Font" }, stackedFractionScale: 0 });
|
|
320
718
|
expect(() => annotationTextStyle.insert()).to.throw();
|
|
321
719
|
});
|
|
322
720
|
it("does not allow updating of elements to invalid styles", async () => {
|
|
323
|
-
const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", {
|
|
721
|
+
const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", { font: { name: "Totally Real Font" } });
|
|
324
722
|
const elId = annotationTextStyle.insert();
|
|
325
723
|
expect(Id64.isValidId64(elId)).to.be.true;
|
|
326
724
|
const el1 = imodel.elements.getElement(elId);
|
|
327
725
|
expect(el1).not.to.be.undefined;
|
|
328
726
|
expect(el1 instanceof AnnotationTextStyle).to.be.true;
|
|
329
|
-
el1.settings = el1.settings.clone({
|
|
727
|
+
el1.settings = el1.settings.clone({ font: { name: "" } });
|
|
330
728
|
expect(() => el1.update()).to.throw();
|
|
331
|
-
el1.settings = el1.settings.clone({
|
|
729
|
+
el1.settings = el1.settings.clone({ font: { name: "Totally Real Font" }, textHeight: 0 });
|
|
332
730
|
expect(() => el1.update()).to.throw();
|
|
333
|
-
el1.settings = el1.settings.clone({
|
|
731
|
+
el1.settings = el1.settings.clone({ textHeight: 2, stackedFractionScale: 0 });
|
|
334
732
|
expect(() => el1.update()).to.throw();
|
|
335
733
|
el1.settings = el1.settings.clone({ stackedFractionScale: 0.45 });
|
|
336
734
|
el1.update();
|
|
@@ -347,11 +745,189 @@ describe("AnnotationTextStyle", () => {
|
|
|
347
745
|
expect(el0.settings.toJSON()).to.deep.equal(TextStyleSettings.defaultProps);
|
|
348
746
|
});
|
|
349
747
|
it("can update style via cloning", async () => {
|
|
350
|
-
const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", {
|
|
748
|
+
const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", { font: { name: "Totally Real Font" } });
|
|
351
749
|
const newStyle = el0.settings.clone({ isBold: true, lineSpacingFactor: 3 });
|
|
352
750
|
expect(el0.settings.toJSON()).to.not.deep.equal(newStyle.toJSON());
|
|
353
751
|
el0.settings = newStyle;
|
|
354
752
|
expect(el0.settings.toJSON()).to.deep.equal(newStyle.toJSON());
|
|
355
753
|
});
|
|
754
|
+
describe("versioning", () => {
|
|
755
|
+
function makeStyle(props) {
|
|
756
|
+
return AnnotationTextStyle.fromJSON({
|
|
757
|
+
model: "0x34",
|
|
758
|
+
code: {
|
|
759
|
+
spec: "0x56",
|
|
760
|
+
scope: "0x78",
|
|
761
|
+
value: "style"
|
|
762
|
+
},
|
|
763
|
+
classFullName: AnnotationTextStyle.classFullName,
|
|
764
|
+
...props,
|
|
765
|
+
}, mockIModel());
|
|
766
|
+
}
|
|
767
|
+
it("throws if the JSON has no version", () => {
|
|
768
|
+
expect(() => makeStyle({
|
|
769
|
+
settings: JSON.stringify({
|
|
770
|
+
data: TextStyleSettings.defaultProps
|
|
771
|
+
}),
|
|
772
|
+
})).to.throw("JSON version is missing or invalid.");
|
|
773
|
+
});
|
|
774
|
+
it("throws if the JSON has no data", () => {
|
|
775
|
+
expect(() => makeStyle({
|
|
776
|
+
settings: JSON.stringify({
|
|
777
|
+
version: TEXT_STYLE_SETTINGS_JSON_VERSION,
|
|
778
|
+
}),
|
|
779
|
+
})).to.throw("JSON data is missing or invalid.");
|
|
780
|
+
});
|
|
781
|
+
it("throws if the JSON version is too new", () => {
|
|
782
|
+
expect(() => makeStyle({
|
|
783
|
+
settings: JSON.stringify({
|
|
784
|
+
version: "999.999.999",
|
|
785
|
+
data: TextStyleSettings.defaultProps
|
|
786
|
+
}),
|
|
787
|
+
})).to.throw(`JSON version 999.999.999 is newer than supported version ${TEXT_STYLE_SETTINGS_JSON_VERSION}. Application update required to understand data.`);
|
|
788
|
+
});
|
|
789
|
+
it("throws if the JSON version is old and cannot be migrated", () => {
|
|
790
|
+
expect(() => makeStyle({
|
|
791
|
+
settings: JSON.stringify({
|
|
792
|
+
version: "0.0.1",
|
|
793
|
+
data: TextStyleSettings.defaultProps
|
|
794
|
+
}),
|
|
795
|
+
})).to.throw(`Migration for settings from version 0.0.1 to ${TEXT_STYLE_SETTINGS_JSON_VERSION} failed.`);
|
|
796
|
+
});
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
describe("appendTextAnnotationGeometry", () => {
|
|
800
|
+
let imodel;
|
|
801
|
+
let seedDefinitionModelId;
|
|
802
|
+
let seedCategoryId;
|
|
803
|
+
let seedStyleId;
|
|
804
|
+
let seedStyleId2;
|
|
805
|
+
before(async () => {
|
|
806
|
+
imodel = await createIModel("DefaultTextStyle");
|
|
807
|
+
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
808
|
+
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
809
|
+
const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
|
|
810
|
+
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
|
|
811
|
+
const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { font: { name: "Karla" }, textHeight: 0.5, isBold: true }).insert();
|
|
812
|
+
expect(jobSubjectId).not.to.be.undefined;
|
|
813
|
+
expect(definitionModel).not.to.be.undefined;
|
|
814
|
+
expect(category).not.to.be.undefined;
|
|
815
|
+
expect(model).not.to.be.undefined;
|
|
816
|
+
expect(styleId).not.to.be.undefined;
|
|
817
|
+
expect(differentStyleId).not.to.be.undefined;
|
|
818
|
+
seedDefinitionModelId = definitionModel;
|
|
819
|
+
seedCategoryId = category;
|
|
820
|
+
seedStyleId = styleId;
|
|
821
|
+
seedStyleId2 = differentStyleId;
|
|
822
|
+
});
|
|
823
|
+
function runAppendTextAnnotationGeometry(annotation, styleId, scaleFactor = 1) {
|
|
824
|
+
const builder = new MockBuilder();
|
|
825
|
+
const resolver = new TextStyleResolver({
|
|
826
|
+
textBlock: annotation.textBlock,
|
|
827
|
+
textStyleId: styleId,
|
|
828
|
+
iModel: imodel,
|
|
829
|
+
});
|
|
830
|
+
const layout = layoutTextBlock({
|
|
831
|
+
textBlock: annotation.textBlock,
|
|
832
|
+
iModel: imodel,
|
|
833
|
+
textStyleResolver: resolver,
|
|
834
|
+
});
|
|
835
|
+
const result = appendTextAnnotationGeometry({
|
|
836
|
+
annotationProps: annotation.toJSON(),
|
|
837
|
+
layout,
|
|
838
|
+
textStyleResolver: resolver,
|
|
839
|
+
scaleFactor,
|
|
840
|
+
builder,
|
|
841
|
+
categoryId: seedCategoryId,
|
|
842
|
+
});
|
|
843
|
+
expect(result).to.be.true;
|
|
844
|
+
return builder;
|
|
845
|
+
}
|
|
846
|
+
it("produces the same geometry when given the same inputs", () => {
|
|
847
|
+
const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
848
|
+
const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
849
|
+
expect(builder1.geometries).to.deep.equal(builder2.geometries);
|
|
850
|
+
expect(builder1.params).to.deep.equal(builder2.params);
|
|
851
|
+
expect(builder1.textStrings).to.deep.equal(builder2.textStrings);
|
|
852
|
+
});
|
|
853
|
+
it("produces no geometry when given an empty annotation", () => {
|
|
854
|
+
const block = TextBlock.create();
|
|
855
|
+
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
856
|
+
const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
|
|
857
|
+
expect(builder.geometries).to.be.empty;
|
|
858
|
+
expect(builder.params).to.be.empty;
|
|
859
|
+
expect(builder.textStrings).to.be.empty;
|
|
860
|
+
});
|
|
861
|
+
it("produces geometry when given an empty annotation with frame styling", () => {
|
|
862
|
+
const block = TextBlock.create();
|
|
863
|
+
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
864
|
+
const styleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "empty anno style", {
|
|
865
|
+
font: { name: "Totally Real Font" },
|
|
866
|
+
frame: {
|
|
867
|
+
shape: "rectangle",
|
|
868
|
+
}
|
|
869
|
+
}).insert();
|
|
870
|
+
const builder = runAppendTextAnnotationGeometry(annotation, styleId);
|
|
871
|
+
expect(builder.geometries).not.to.be.empty;
|
|
872
|
+
expect(builder.params).not.to.be.empty;
|
|
873
|
+
expect(builder.textStrings).to.be.empty;
|
|
874
|
+
});
|
|
875
|
+
it("produces different geometry when given different text-content in annotations", () => {
|
|
876
|
+
const anno1 = createAnnotation();
|
|
877
|
+
const anno2 = createAnnotation();
|
|
878
|
+
anno2.textBlock.appendRun(TextRun.create({ content: "extra", styleOverrides: { font: { name: "Totally Real Font" } } }));
|
|
879
|
+
const builder1 = runAppendTextAnnotationGeometry(anno1, seedStyleId);
|
|
880
|
+
const builder2 = runAppendTextAnnotationGeometry(anno2, seedStyleId);
|
|
881
|
+
expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
|
|
882
|
+
expect(builder1.params).to.deep.equal(builder2.params);
|
|
883
|
+
expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
|
|
884
|
+
});
|
|
885
|
+
it("produces different geometry when given different default styles", () => {
|
|
886
|
+
const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
887
|
+
const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId2);
|
|
888
|
+
expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
|
|
889
|
+
expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
|
|
890
|
+
});
|
|
891
|
+
it("accounts for style overrides in the text", () => {
|
|
892
|
+
const block = TextBlock.create();
|
|
893
|
+
block.styleOverrides = { margins: { left: 0, right: 1, top: 2, bottom: 3 } };
|
|
894
|
+
block.appendParagraph();
|
|
895
|
+
block.children[0].styleOverrides = { isBold: true };
|
|
896
|
+
block.appendRun(TextRun.create({ content: "Run, Barry," }));
|
|
897
|
+
block.appendParagraph();
|
|
898
|
+
block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides: { isItalic: false } }));
|
|
899
|
+
const annotation = createAnnotation(block);
|
|
900
|
+
const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
|
|
901
|
+
expect(builder.textStrings.length).to.equal(2);
|
|
902
|
+
expect(builder.textStrings[0].text).to.equal("Run, Barry,");
|
|
903
|
+
// From override on paragraph
|
|
904
|
+
expect(builder.textStrings[0].bold).to.be.true;
|
|
905
|
+
// From default style
|
|
906
|
+
expect(builder.textStrings[0].italic).to.be.true;
|
|
907
|
+
expect(builder.textStrings[1].text).to.equal(" RUN!!! ");
|
|
908
|
+
// From default style
|
|
909
|
+
expect(builder.textStrings[1].bold).to.be.false;
|
|
910
|
+
// From override on run
|
|
911
|
+
expect(builder.textStrings[1].italic).to.be.false;
|
|
912
|
+
});
|
|
913
|
+
it("uses TextStyleSettings.defaults when no default style is provided", () => {
|
|
914
|
+
const block = TextBlock.create();
|
|
915
|
+
block.appendRun(TextRun.create({ content: "Run, Barry," }));
|
|
916
|
+
const annotation = createAnnotation(block);
|
|
917
|
+
const builder = runAppendTextAnnotationGeometry(annotation, "");
|
|
918
|
+
expect(builder.textStrings.length).to.equal(1);
|
|
919
|
+
expect(builder.textStrings[0].text).to.equal("Run, Barry,");
|
|
920
|
+
expect(builder.textStrings[0].font).to.equal(0); // Font ID 0 is the "missing" font in the default text style
|
|
921
|
+
expect(builder.textStrings[0].bold).to.equal(TextStyleSettings.defaultProps.isBold);
|
|
922
|
+
expect(builder.textStrings[0].italic).to.equal(TextStyleSettings.defaultProps.isItalic);
|
|
923
|
+
expect(builder.textStrings[0].underline).to.equal(TextStyleSettings.defaultProps.isUnderlined);
|
|
924
|
+
});
|
|
925
|
+
it("scales geometry correctly", () => {
|
|
926
|
+
const annotation = createAnnotation();
|
|
927
|
+
const builder1 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 1);
|
|
928
|
+
const builder2 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 2);
|
|
929
|
+
expect(builder1.textStrings[0].height * 2).to.equal(builder2.textStrings[0].height);
|
|
930
|
+
expect(builder1.textStrings[0].width * 2).to.equal(builder2.textStrings[0].width);
|
|
931
|
+
});
|
|
356
932
|
});
|
|
357
933
|
//# sourceMappingURL=TextAnnotation.test.js.map
|