@itwin/imodel-transformer 0.0.1-dev.0
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/LICENSE.md +9 -0
- package/README.md +33 -0
- package/lib/cjs/ECReferenceTypesCache.d.ts +37 -0
- package/lib/cjs/ECReferenceTypesCache.d.ts.map +1 -0
- package/lib/cjs/ECReferenceTypesCache.js +180 -0
- package/lib/cjs/ECReferenceTypesCache.js.map +1 -0
- package/lib/cjs/EntityMap.d.ts +26 -0
- package/lib/cjs/EntityMap.d.ts.map +1 -0
- package/lib/cjs/EntityMap.js +55 -0
- package/lib/cjs/EntityMap.js.map +1 -0
- package/lib/cjs/EntityUnifier.d.ts +16 -0
- package/lib/cjs/EntityUnifier.d.ts.map +1 -0
- package/lib/cjs/EntityUnifier.js +72 -0
- package/lib/cjs/EntityUnifier.js.map +1 -0
- package/lib/cjs/IModelCloneContext.d.ts +32 -0
- package/lib/cjs/IModelCloneContext.d.ts.map +1 -0
- package/lib/cjs/IModelCloneContext.js +195 -0
- package/lib/cjs/IModelCloneContext.js.map +1 -0
- package/lib/cjs/IModelExporter.d.ts +353 -0
- package/lib/cjs/IModelExporter.d.ts.map +1 -0
- package/lib/cjs/IModelExporter.js +804 -0
- package/lib/cjs/IModelExporter.js.map +1 -0
- package/lib/cjs/IModelImporter.d.ts +230 -0
- package/lib/cjs/IModelImporter.d.ts.map +1 -0
- package/lib/cjs/IModelImporter.js +591 -0
- package/lib/cjs/IModelImporter.js.map +1 -0
- package/lib/cjs/IModelTransformer.d.ts +499 -0
- package/lib/cjs/IModelTransformer.d.ts.map +1 -0
- package/lib/cjs/IModelTransformer.js +1357 -0
- package/lib/cjs/IModelTransformer.js.map +1 -0
- package/lib/cjs/PendingReferenceMap.d.ts +35 -0
- package/lib/cjs/PendingReferenceMap.d.ts.map +1 -0
- package/lib/cjs/PendingReferenceMap.js +81 -0
- package/lib/cjs/PendingReferenceMap.js.map +1 -0
- package/lib/cjs/TransformerLoggerCategory.d.ts +23 -0
- package/lib/cjs/TransformerLoggerCategory.d.ts.map +1 -0
- package/lib/cjs/TransformerLoggerCategory.js +31 -0
- package/lib/cjs/TransformerLoggerCategory.js.map +1 -0
- package/lib/cjs/transformer.d.ts +25 -0
- package/lib/cjs/transformer.d.ts.map +1 -0
- package/lib/cjs/transformer.js +77 -0
- package/lib/cjs/transformer.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelImporter.js","sourceRoot":"","sources":["../../src/IModelImporter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module iModels\n */\nimport { CompressedId64Set, Id64, Id64String, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n AxisAlignedBox3d, Base64EncodedString, ElementAspectProps, ElementProps, EntityProps, IModel, IModelError, ModelProps, PrimitiveTypeCode,\n PropertyMetaData, RelatedElement, SubCategoryProps,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\nimport { deleteElementTree, ElementAspect, ElementMultiAspect, Entity, IModelDb, Relationship, RelationshipProps, SourceAndTarget, SubCategory } from \"@itwin/core-backend\";\nimport type { IModelTransformOptions } from \"./IModelTransformer\";\nimport * as assert from \"assert\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelImporter;\n\n/** Options provided to [[IModelImporter.optimizeGeometry]] specifying post-processing optimizations to be applied to the iModel's geometry.\n * @beta\n */\nexport interface OptimizeGeometryOptions {\n /** If true, identify any [GeometryPart]($backend)s that are referenced exactly once. For each such part,\n * replace the reference in the element's geometry stream with the part's own geometry stream, then delete the part.\n */\n inlineUniqueGeometryParts?: boolean;\n}\n\n/** Options provided to the [[IModelImporter]] constructor.\n * @beta\n */\nexport interface IModelImportOptions {\n /** If `true` (the default), compute the projectExtents of the target iModel after elements are imported.\n * The computed projectExtents will either include or exclude *outliers* depending on the `excludeOutliers` flag that defaults to `false`.\n * @see [[IModelImporter.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n */\n autoExtendProjectExtents?: boolean | { excludeOutliers: boolean };\n /** See [IModelTransformOptions]($transformer) */\n preserveElementIdsForFiltering?: boolean;\n /** If `true`, simplify the element geometry for visualization purposes. For example, convert b-reps into meshes.\n * @default false\n */\n simplifyElementGeometry?: boolean;\n}\n\n/** Base class for importing data into an iModel.\n * @see [iModel Transformation and Data Exchange]($docs/learning/transformer/index.md)\n * @see [IModelExporter]($transformer)\n * @see [IModelTransformer]($transformer)\n * @beta\n */\nexport class IModelImporter implements Required<IModelImportOptions> {\n /** The read/write target iModel. */\n public readonly targetDb: IModelDb;\n\n /** resolved initialization options for the importer\n * @beta\n */\n public readonly options: Required<IModelImportOptions>;\n\n /** If `true` (the default), compute the projectExtents of the target iModel after elements are imported.\n * The computed projectExtents will either include or exclude *outliers* depending on the `excludeOutliers` flag that defaults to `false`.\n * @see [[IModelImportOptions.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n * @deprecated in 3.x. Use [[IModelImporter.options.autoExtendProjectExtents]] instead\n */\n public get autoExtendProjectExtents(): Required<IModelImportOptions>[\"autoExtendProjectExtents\"] {\n return this.options.autoExtendProjectExtents;\n }\n public set autoExtendProjectExtents(val: Required<IModelImportOptions>[\"autoExtendProjectExtents\"]) {\n this.options.autoExtendProjectExtents = val;\n }\n\n /**\n * See [IModelTransformOptions.preserveElementIdsForFiltering]($transformer)\n * @deprecated in 3.x. Use [[IModelImporter.options.preserveElementIdsForFiltering]] instead\n */\n public get preserveElementIdsForFiltering(): boolean {\n return this.options.preserveElementIdsForFiltering;\n }\n public set preserveElementIdsForFiltering(val: boolean) {\n this.options.preserveElementIdsForFiltering = val;\n }\n\n /**\n * See [[IModelImportOptions.simplifyElementGeometry]]\n * @deprecated in 3.x. Use [[IModelImporter.options.simplifyElementGeometry]] instead\n */\n public get simplifyElementGeometry(): boolean {\n return this.options.simplifyElementGeometry;\n }\n public set simplifyElementGeometry(val: boolean) {\n this.options.simplifyElementGeometry = val;\n }\n\n private static _realityDataSourceLinkPartitionStaticId: Id64String = \"0xe\";\n\n /** The set of elements that should not be updated by this IModelImporter.\n * Defaults to the elements that are always present (even in an \"empty\" iModel) and therefore do not need to be updated\n * @note Adding an element to this set is typically necessary when remapping a source element to one that already exists in the target and already has the desired properties.\n */\n public readonly doNotUpdateElementIds = new Set<Id64String>([\n IModel.rootSubjectId,\n IModel.dictionaryId,\n IModelImporter._realityDataSourceLinkPartitionStaticId,\n ]);\n /** The number of entity changes before incremental progress should be reported via the [[onProgress]] callback. */\n public progressInterval: number = 1000;\n /** Tracks the current total number of entity changes. */\n private _progressCounter: number = 0;\n /** */\n private _modelPropertiesToIgnore = new Set<string>([\n \"geometryGuid\", // cannot compare GeometricModel.GeometryGuid values across iModels\n ]);\n\n /** Construct a new IModelImporter\n * @param targetDb The target IModelDb\n * @param options The options that specify how the import should be done.\n */\n public constructor(targetDb: IModelDb, options?: IModelImportOptions) {\n this.targetDb = targetDb;\n this.options = {\n autoExtendProjectExtents: options?.autoExtendProjectExtents ?? true,\n preserveElementIdsForFiltering: options?.preserveElementIdsForFiltering ?? false,\n simplifyElementGeometry: options?.simplifyElementGeometry ?? false,\n };\n }\n\n /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */\n public importModel(modelProps: ModelProps): void {\n if ((undefined === modelProps.id) || !Id64.isValidId64(modelProps.id))\n throw new IModelError(IModelStatus.InvalidId, \"Model Id not provided, should be the same as the ModeledElementId\");\n\n if (this.doNotUpdateElementIds.has(modelProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target model ${modelProps.id}`);\n return;\n }\n try {\n const model = this.targetDb.models.getModel(modelProps.id); // throws IModelError.NotFound if model does not exist\n if (hasEntityChanged(model, modelProps, this._modelPropertiesToIgnore)) {\n this.onUpdateModel(modelProps);\n }\n } catch (error) {\n // catch NotFound error and insertModel\n if (error instanceof IModelError && error.errorNumber === IModelStatus.NotFound) {\n this.onInsertModel(modelProps);\n return;\n }\n throw error;\n }\n }\n\n /** Create a new Model from the specified ModelProps and insert it into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertModel`.\n */\n protected onInsertModel(modelProps: ModelProps): Id64String {\n try {\n const modelId: Id64String = this.targetDb.models.insertModel(modelProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatModelForLogger(modelProps)}`);\n this.trackProgress();\n return modelId;\n } catch (error) {\n if (!this.targetDb.containsClass(modelProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Model class \"${modelProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Model in the target iModel from the specified ModelProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateModel`.\n */\n protected onUpdateModel(modelProps: ModelProps): void {\n this.targetDb.models.updateModel(modelProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatModelForLogger(modelProps)}`);\n this.trackProgress();\n }\n\n /** Format a Model for the Logger. */\n private formatModelForLogger(modelProps: ModelProps): string {\n return `${modelProps.classFullName} [${modelProps.id!}]`;\n }\n\n /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */\n public importElement(elementProps: ElementProps): Id64String {\n if (undefined !== elementProps.id && this.doNotUpdateElementIds.has(elementProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target element ${elementProps.id}`);\n return elementProps.id;\n }\n if (this.options.preserveElementIdsForFiltering) {\n if (elementProps.id === undefined) {\n throw new IModelError(IModelStatus.BadElement, `elementProps.id must be defined during a preserveIds operation`);\n }\n // Categories are the only element that onInserted will immediately insert a new element (their default subcategory)\n // since default subcategories always exist and always will be inserted after their categories, we treat them as an update\n // to prevent duplicate inserts.\n // Otherwise we always insert during a preserveElementIdsForFiltering operation\n if (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) {\n this.onUpdateElement(elementProps);\n } else {\n this.onInsertElement(elementProps);\n }\n } else {\n if (undefined !== elementProps.id) {\n this.onUpdateElement(elementProps);\n } else {\n this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement\n }\n }\n return elementProps.id!;\n }\n\n /** Create a new Element from the specified ElementProps and insert it into the target iModel.\n * @returns The Id of the newly inserted Element.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElement`.\n */\n protected onInsertElement(elementProps: ElementProps): Id64String {\n try {\n const elementId = this.targetDb.nativeDb.insertElement(\n elementProps,\n { forceUseId: this.options.preserveElementIdsForFiltering },\n );\n // set the id like [IModelDb.insertElement]($backend), does, the raw nativeDb method does not\n elementProps.id = elementId;\n Logger.logInfo(loggerCategory, `Inserted ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementId, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\n }\n return elementId;\n } catch (error) {\n if (!this.targetDb.containsClass(elementProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Element class \"${elementProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Element in the target iModel from the specified ElementProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElement`.\n */\n protected onUpdateElement(elementProps: ElementProps): void {\n if (!elementProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"ElementId not provided\");\n }\n this.targetDb.elements.updateElement(elementProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementProps.id, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\n }\n }\n\n /** Delete the specified Element (and all its children) from the target iModel.\n * Will delete special elements like definition elements and subjects.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElement`.\n */\n protected onDeleteElement(elementId: Id64String): void {\n deleteElementTree(this.targetDb, elementId);\n Logger.logInfo(loggerCategory, `Deleted element ${elementId} and its descendants`);\n this.trackProgress();\n }\n\n /** Delete the specified Element from the target iModel. */\n public deleteElement(elementId: Id64String): void {\n if (this.doNotUpdateElementIds.has(elementId)) {\n Logger.logInfo(loggerCategory, `Do not delete target element ${elementId}`);\n return;\n }\n this.onDeleteElement(elementId);\n }\n\n /** Delete the specified Model from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteModel`.\n */\n protected onDeleteModel(modelId: Id64String): void {\n this.targetDb.models.deleteModel(modelId);\n Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);\n this.trackProgress();\n }\n\n /** Delete the specified Model from the target iModel. */\n public deleteModel(modelId: Id64String): void {\n this.onDeleteModel(modelId);\n }\n\n /** Format an Element for the Logger. */\n private formatElementForLogger(elementProps: ElementProps): string {\n const namePiece: string = elementProps.code.value ? `${elementProps.code.value} ` : elementProps.userLabel ? `${elementProps.userLabel} ` : \"\";\n return `${elementProps.classFullName} ${namePiece}[${elementProps.id}]`;\n }\n\n /** Import an ElementUniqueAspect into the target iModel. */\n public importElementUniqueAspect(aspectProps: ElementAspectProps): Id64String {\n const aspects: ElementAspect[] = this.targetDb.elements.getAspects(aspectProps.element.id, aspectProps.classFullName);\n if (aspects.length === 0) {\n return this.onInsertElementAspect(aspectProps);\n } else if (hasEntityChanged(aspects[0], aspectProps)) {\n aspectProps.id = aspects[0].id;\n this.onUpdateElementAspect(aspectProps);\n }\n return aspects[0].id;\n }\n\n /** Import the collection of ElementMultiAspects into the target iModel.\n * @param aspectPropsArray The ElementMultiAspects to import\n * @param filterFunc Optional filter func that is used to exclude target ElementMultiAspects that were added during iModel transformation from the update detection logic.\n * @note For insert vs. update reasons, it is important to process all ElementMultiAspects owned by an Element at once since we don't have aspect-specific provenance.\n * @returns the array of ids of the resulting ElementMultiAspects, in the same order of the aspectPropsArray parameter\n */\n public importElementMultiAspects(\n aspectPropsArray: ElementAspectProps[],\n /** caller must use this to enforce any aspects added by IModelTransformer are not considered for update */\n filterFunc: (a: ElementMultiAspect) => boolean = () => true\n ): Id64String[] {\n const result = new Array<Id64String | undefined>(aspectPropsArray.length).fill(undefined);\n\n if (aspectPropsArray.length === 0) {\n return result as Id64String[];\n }\n\n const elementId: Id64String = aspectPropsArray[0].element.id;\n // Determine the set of ElementMultiAspect classes to consider\n const aspectClassFullNames = new Set<string>();\n aspectPropsArray.forEach((aspectsProps: ElementAspectProps): void => {\n aspectClassFullNames.add(aspectsProps.classFullName);\n });\n\n // Handle ElementMultiAspects in groups by class\n aspectClassFullNames.forEach((aspectClassFullName: string) => {\n const proposedAspects = aspectPropsArray\n .map((props, index) => ({ props, index }))\n .filter(({props}) => aspectClassFullName === props.classFullName);\n\n const currentAspects = this.targetDb.elements\n .getAspects(elementId, aspectClassFullName)\n .map((props, index) => ({ props, index }) as const)\n .filter(({props}) => filterFunc(props));\n\n if (proposedAspects.length >= currentAspects.length) {\n proposedAspects.forEach(({props, index: resultIndex}, index) => {\n let id: Id64String;\n if (index < currentAspects.length) {\n id = currentAspects[index].props.id;\n props.id = id;\n if (hasEntityChanged(currentAspects[index].props, props)) {\n this.onUpdateElementAspect(props);\n }\n id = props.id;\n } else {\n id = this.onInsertElementAspect(props);\n }\n result[resultIndex] = id;\n });\n } else {\n currentAspects.forEach(({props, index: resultIndex}, index) => {\n let id: Id64String;\n if (index < proposedAspects.length) {\n id = props.id;\n proposedAspects[index].props.id = id;\n if (hasEntityChanged(props, proposedAspects[index].props)) {\n this.onUpdateElementAspect(proposedAspects[index].props);\n }\n result[resultIndex] = id;\n } else {\n this.onDeleteElementAspect(props);\n }\n });\n }\n });\n\n assert(result.every((r) => typeof r !== undefined));\n return result as Id64String[];\n }\n\n /** Insert the ElementAspect into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElementAspect`.\n */\n protected onInsertElementAspect(aspectProps: ElementAspectProps): Id64String {\n try {\n const id = this.targetDb.elements.insertAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatElementAspectForLogger(aspectProps)}`);\n this.trackProgress();\n return id;\n } catch (error) {\n if (!this.targetDb.containsClass(aspectProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `ElementAspect class \"${aspectProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update the ElementAspect within the target iModel.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElementAspect`.\n */\n protected onUpdateElementAspect(aspectProps: ElementAspectProps): void {\n this.targetDb.elements.updateAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementAspectForLogger(aspectProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified ElementAspect from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElementAspect`.\n */\n protected onDeleteElementAspect(targetElementAspect: ElementAspect): void {\n this.targetDb.elements.deleteAspect(targetElementAspect.id);\n Logger.logInfo(loggerCategory, `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`);\n this.trackProgress();\n }\n\n /** Format an ElementAspect for the Logger. */\n private formatElementAspectForLogger(elementAspectProps: ElementAspectProps | ElementAspect): string {\n return `${elementAspectProps.classFullName} elementId=[${elementAspectProps.element.id}]`;\n }\n\n /** Import the specified RelationshipProps (either as an insert or an update) into the target iModel.\n * @returns The instance Id of the inserted or updated Relationship.\n */\n public importRelationship(relationshipProps: RelationshipProps): Id64String {\n if ((undefined === relationshipProps.sourceId) || !Id64.isValidId64(relationshipProps.sourceId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.sourceId`);\n return Id64.invalid;\n }\n if ((undefined === relationshipProps.targetId) || !Id64.isValidId64(relationshipProps.targetId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.targetId`);\n return Id64.invalid;\n }\n // check for an existing relationship\n const relSourceAndTarget: SourceAndTarget = { sourceId: relationshipProps.sourceId, targetId: relationshipProps.targetId };\n const relationship: Relationship | undefined = this.targetDb.relationships.tryGetInstance(relationshipProps.classFullName, relSourceAndTarget);\n if (undefined !== relationship) { // if relationship found, update it\n relationshipProps.id = relationship.id;\n if (hasEntityChanged(relationship, relationshipProps)) {\n this.onUpdateRelationship(relationshipProps);\n }\n return relationshipProps.id;\n } else {\n return this.onInsertRelationship(relationshipProps);\n }\n }\n\n /** Create a new Relationship from the specified RelationshipProps and insert it into the target iModel.\n * @returns The instance Id of the newly inserted relationship.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertRelationship`.\n */\n protected onInsertRelationship(relationshipProps: RelationshipProps): Id64String {\n try {\n const targetRelInstanceId: Id64String = this.targetDb.relationships.insertInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n return targetRelInstanceId;\n } catch (error) {\n if (!this.targetDb.containsClass(relationshipProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Relationship class \"${relationshipProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Relationship in the target iModel from the specified RelationshipProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateRelationship`.\n */\n protected onUpdateRelationship(relationshipProps: RelationshipProps): void {\n if (!relationshipProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"Relationship instance Id not provided\");\n }\n this.targetDb.relationships.updateInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n protected onDeleteRelationship(relationshipProps: RelationshipProps): void {\n this.targetDb.relationships.deleteInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Deleted relationship ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n public deleteRelationship(relationshipProps: RelationshipProps): void {\n this.onDeleteRelationship(relationshipProps);\n }\n\n /** Format a Relationship for the Logger. */\n private formatRelationshipForLogger(relProps: RelationshipProps): string {\n return `${relProps.classFullName} sourceId=[${relProps.sourceId}] targetId=[${relProps.targetId}]`;\n }\n\n /** Tracks incremental progress */\n private trackProgress(): void {\n this._progressCounter++;\n if (0 === (this._progressCounter % this.progressInterval)) {\n this.onProgress();\n }\n }\n\n /** This method is called when IModelImporter has made incremental progress based on the [[progressInterval]] setting.\n * @note A subclass may override this method to report custom progress but should call `super.onProgress`.\n */\n protected onProgress(): void { }\n\n /** Optionally compute the projectExtents for the target iModel depending on the options for this IModelImporter.\n * @note This method is automatically called from [IModelTransformer.processChanges]($transformer) and [IModelTransformer.processAll]($transformer).\n * @see [IModelDb.computeProjectExtents]($backend), [[autoExtendProjectExtents]]\n */\n public computeProjectExtents(): void {\n const computedProjectExtents = this.targetDb.computeProjectExtents({ reportExtentsWithOutliers: true, reportOutliers: true });\n Logger.logInfo(loggerCategory, `Current projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents without outliers=${JSON.stringify(computedProjectExtents.extents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents with outliers=${JSON.stringify(computedProjectExtents.extentsWithOutliers)}`);\n if (this.options.autoExtendProjectExtents) {\n const excludeOutliers: boolean = typeof this.options.autoExtendProjectExtents === \"object\" ? this.options.autoExtendProjectExtents.excludeOutliers : false;\n const newProjectExtents: AxisAlignedBox3d = excludeOutliers ? computedProjectExtents.extents : computedProjectExtents.extentsWithOutliers!;\n if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {\n this.targetDb.updateProjectExtents(newProjectExtents);\n Logger.logInfo(loggerCategory, `Updated projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n }\n if (!excludeOutliers && computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\n }\n } else {\n if (!this.targetDb.projectExtents.containsRange(computedProjectExtents.extents)) {\n Logger.logWarning(loggerCategory, \"Current project extents may be too small\");\n }\n if (computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\n }\n }\n }\n\n /** Examine the geometry streams of every [GeometricElement3d]($backend) in the target iModel and apply the specified optimizations.\n * @note This method is automatically called from [[IModelTransformer.processChanges]] and [[IModelTransformer.processAll]] if\n * [[IModelTransformOptions.optimizeGeometry]] is defined.\n */\n public optimizeGeometry(options: OptimizeGeometryOptions): void {\n if (options.inlineUniqueGeometryParts) {\n const result = this.targetDb.nativeDb.inlineGeometryPartReferences();\n Logger.logInfo(loggerCategory, `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.`);\n }\n }\n\n /**\n * You may override this to store arbitrary json state in a exporter state dump, useful for some resumptions\n * @see [[IModelTransformer.saveStateToFile]]\n */\n protected getAdditionalStateJson(): any {\n return {};\n }\n\n /**\n * You may override this to load arbitrary json state in a transformer state dump, useful for some resumptions\n * @see [[IModelTransformer.loadStateFromFile]]\n */\n protected loadAdditionalStateJson(_additionalState: any): void {}\n\n /**\n * Reload our state from a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can load custom json from the importer save state for custom importers by overriding [[IModelImporter.loadAdditionalStateJson]]\n */\n public loadStateFromJson(state: IModelImporterState): void {\n if (state.importerClass !== this.constructor.name)\n throw Error(\"resuming from a differently named importer class, it is not necessarily valid to resume with a different importer class\");\n // ignore readonly since this runs right after construction in [[IModelTransformer.resumeTransformation]]\n (this.options as IModelTransformOptions) = state.options;\n if (this.targetDb.iModelId !== state.targetDbId)\n throw Error(\"can only load importer state when the same target is reused\");\n // TODO: fix upstream, looks like a bad case for the linter rule when casting away readonly for this generic\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n (this.doNotUpdateElementIds as Set<Id64String>) = CompressedId64Set.decompressSet(state.doNotUpdateElementIds);\n this.loadAdditionalStateJson(state.additionalState);\n }\n\n /**\n * Serialize state to a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can add custom json to the importer save state for custom importers by overriding [[IModelImporter.getAdditionalStateJson]]\n */\n public saveStateToJson(): IModelImporterState {\n return {\n importerClass: this.constructor.name,\n options: this.options,\n targetDbId: this.targetDb.iModelId || this.targetDb.nativeDb.getFilePath(),\n doNotUpdateElementIds: CompressedId64Set.compressSet(this.doNotUpdateElementIds),\n additionalState: this.getAdditionalStateJson(),\n };\n }\n}\n\n/**\n * The JSON format of a serialized IModelimporter instance\n * Used for starting an importer in the middle of an imxport operation,\n * such as resuming a crashed transformation\n *\n * @note Must be kept synchronized with IModelImxporter\n * @internal\n */\nexport interface IModelImporterState {\n importerClass: string;\n options: IModelImportOptions;\n targetDbId: string;\n doNotUpdateElementIds: CompressedId64Set;\n additionalState?: any;\n}\n\n/** Returns true if a change within an Entity is detected.\n * @param entity The current persistent Entity.\n * @param entityProps The new EntityProps to compare against\n * @note This method should only be called if changeset information is not available.\n * @internal\n */\nexport function hasEntityChanged(entity: Entity, entityProps: EntityProps, namesToIgnore?: Set<string>): boolean {\n let changed: boolean = false;\n entity.forEachProperty((propertyName: string, propertyMeta: PropertyMetaData) => {\n if (!changed) {\n if (namesToIgnore && namesToIgnore.has(propertyName)) {\n // skip\n } else if (PrimitiveTypeCode.Binary === propertyMeta.primitiveType) {\n changed = hasBinaryValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else if (propertyMeta.isNavigation) {\n changed = hasNavigationValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else {\n changed = hasValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n }\n }\n });\n return changed;\n}\n\n/** Returns true if the specified binary values are different. */\nfunction hasBinaryValueChanged(binaryProperty1: any, binaryProperty2: any): boolean {\n const jsonString1 = JSON.stringify(binaryProperty1, Base64EncodedString.replacer);\n const jsonString2 = JSON.stringify(binaryProperty2, Base64EncodedString.replacer);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasNavigationValueChanged(navigationProperty1: any, navigationProperty2: any): boolean {\n const relatedElement1 = RelatedElement.fromJSON(navigationProperty1);\n const relatedElement2 = RelatedElement.fromJSON(navigationProperty2);\n const jsonString1 = JSON.stringify(relatedElement1);\n const jsonString2 = JSON.stringify(relatedElement2);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasValueChanged(property1: any, property2: any): boolean {\n return JSON.stringify(property1) !== JSON.stringify(property2);\n}\n\n/** check if element props are a subcategory */\nfunction isSubCategory(props: ElementProps): props is SubCategoryProps {\n return props.classFullName === SubCategory.classFullName;\n}\n\n/** check if element props are a subcategory without loading the element */\nfunction isDefaultSubCategory(props: SubCategoryProps): boolean {\n if (props.id === undefined)\n return false;\n\n if (!Id64.isId64(props.id))\n throw new IModelError(IModelStatus.BadElement, `subcategory had invalid id`);\n if (props.parent?.id === undefined)\n throw new IModelError(IModelStatus.BadElement, `subcategory with id ${props.id} had no parent`);\n return props.id === IModelDb.getDefaultSubCategoryId(props.parent.id);\n}\n"]}
|
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { AccessToken, Id64String } from "@itwin/core-bentley";
|
|
2
|
+
import * as ECSchemaMetaData from "@itwin/ecschema-metadata";
|
|
3
|
+
import { Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, Entity, IModelDb, Model, Relationship, RelationshipProps, SQLiteDb } from "@itwin/core-backend";
|
|
4
|
+
import { CodeSpec, ElementAspectProps, ElementProps, EntityReference, EntityReferenceSet, FontProps, ModelProps, Placement2d, Placement3d } from "@itwin/core-common";
|
|
5
|
+
import { ExportSchemaResult, IModelExporter, IModelExportHandler } from "./IModelExporter";
|
|
6
|
+
import { IModelImporter, OptimizeGeometryOptions } from "./IModelImporter";
|
|
7
|
+
import { PendingReferenceMap } from "./PendingReferenceMap";
|
|
8
|
+
import { EntityMap } from "./EntityMap";
|
|
9
|
+
import { IModelCloneContext } from "./IModelCloneContext";
|
|
10
|
+
/** Options provided to the [[IModelTransformer]] constructor.
|
|
11
|
+
* @beta
|
|
12
|
+
* @note if adding an option, you must explicitly add its serialization to [[IModelTransformer.saveStateToFile]]!
|
|
13
|
+
*/
|
|
14
|
+
export interface IModelTransformOptions {
|
|
15
|
+
/** The Id of the Element in the **target** iModel that represents the **source** repository as a whole and scopes its [ExternalSourceAspect]($backend) instances.
|
|
16
|
+
* When the goal is to consolidate multiple source iModels into a single target iModel, this option must be specified.
|
|
17
|
+
*/
|
|
18
|
+
targetScopeElementId?: Id64String;
|
|
19
|
+
/** Set to `true` if IModelTransformer should not record its provenance.
|
|
20
|
+
* Provenance tracks a target element back to its corresponding source element and is essential for [[IModelTransformer.processChanges]] to work properly.
|
|
21
|
+
* Turning off IModelTransformer provenance is really only relevant for producing snapshots or another one time transformations.
|
|
22
|
+
* @note See the [[includeSourceProvenance]] option for determining whether existing source provenance is cloned into the target.
|
|
23
|
+
* @note The default is `false` which means that new IModelTransformer provenance will be recorded.
|
|
24
|
+
*/
|
|
25
|
+
noProvenance?: boolean;
|
|
26
|
+
/** Set to `true` to clone existing source provenance into the target.
|
|
27
|
+
* @note See the [[noProvenance]] option for determining whether new IModelTransformer provenance is recorded.
|
|
28
|
+
* @note The default is `false` which means that existing provenance in the source will not be carried into the target.
|
|
29
|
+
*/
|
|
30
|
+
includeSourceProvenance?: boolean;
|
|
31
|
+
/** Flag that indicates that the target iModel was created by copying the source iModel.
|
|
32
|
+
* This is common when the target iModel is intended to be a *branch* of the source iModel.
|
|
33
|
+
* This *hint* is essential to properly initialize the source to target element mapping and to cause provenance to be recorded for future synchronizations.
|
|
34
|
+
* @note This *hint* is typically only set for the first synchronization after the iModel was copied since every other synchronization can utilize the provenance.
|
|
35
|
+
*/
|
|
36
|
+
wasSourceIModelCopiedToTarget?: boolean;
|
|
37
|
+
/** Flag that indicates that the current source and target iModels are now synchronizing in the reverse direction from a prior synchronization.
|
|
38
|
+
* The most common example is to first synchronize master to branch, make changes to the branch, and then reverse directions to synchronize from branch to master.
|
|
39
|
+
* This means that the provenance on the (current) source is used instead.
|
|
40
|
+
* @note This also means that only [[IModelTransformer.processChanges]] can detect deletes.
|
|
41
|
+
*/
|
|
42
|
+
isReverseSynchronization?: boolean;
|
|
43
|
+
/** Flag that indicates whether or not the transformation process needs to consider the source geometry before cloning/transforming.
|
|
44
|
+
* For standard cases, it is not required to load the source GeometryStream in JavaScript since the cloning happens in native code.
|
|
45
|
+
* Also, the target GeometryStream will be available in JavaScript prior to insert.
|
|
46
|
+
* @note If the source geometry affects the class mapping or transformation logic, then this flag should be set to `true`. The default is `false`.
|
|
47
|
+
* @see [IModelExporter.wantGeometry]($transformer)
|
|
48
|
+
*/
|
|
49
|
+
loadSourceGeometry?: boolean;
|
|
50
|
+
/** Flag that indicates whether or not the transformation process should clone using binary geometry.
|
|
51
|
+
*
|
|
52
|
+
* Prefer to never to set this flag. If you need geometry changes, instead override [[IModelTransformer.onTransformElement]]
|
|
53
|
+
* and provide an [ElementGeometryBuilderParams]($backend) to the `elementGeometryBuilderParams`
|
|
54
|
+
* property of [ElementProps]($common) instead, it is much faster. You can read geometry during the transformation by setting the
|
|
55
|
+
* [[IModelTransformOptions.loadSourceGeometry]] property to `true`, and passing that to a [GeometryStreamIterator]($common)
|
|
56
|
+
* @note this flag will be deprecated when `elementGeometryBuilderParams` is no longer an alpha API
|
|
57
|
+
*
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
cloneUsingBinaryGeometry?: boolean;
|
|
61
|
+
/** Flag that indicates that ids should be preserved while copying elements to the target
|
|
62
|
+
* Intended only for pure-filter transforms, so you can keep parts of the source, while deleting others,
|
|
63
|
+
* and element ids are guaranteed to be the same, (other entity ids are not, however)
|
|
64
|
+
* @note The target must be empty.
|
|
65
|
+
* @note It is invalid to insert elements during the transformation, do not use this with transformers that try to.
|
|
66
|
+
* @note This does not preserve the ids of non-element entities such as link table relationships, or aspects, etc.
|
|
67
|
+
* @default false
|
|
68
|
+
* @beta
|
|
69
|
+
*/
|
|
70
|
+
preserveElementIdsForFiltering?: boolean;
|
|
71
|
+
/** The behavior to use when an element reference (id) is found stored as a reference on an element in the source,
|
|
72
|
+
* but the referenced element does not actually exist in the source.
|
|
73
|
+
* It is possible to craft an iModel with dangling references/invalidated relationships by, e.g., deleting certain
|
|
74
|
+
* elements without fixing up references.
|
|
75
|
+
*
|
|
76
|
+
* @note "reject" will throw an error and reject the transformation upon finding this case.
|
|
77
|
+
* @note "ignore" passes the issue down to consuming applications, iModels that have invalid element references
|
|
78
|
+
* like this can cause errors, and you should consider adding custom logic in your transformer to remove the
|
|
79
|
+
* reference depending on your use case.
|
|
80
|
+
* @default "reject"
|
|
81
|
+
* @beta
|
|
82
|
+
* @deprecated in 3.x. use [[danglingReferencesBehavior]] instead, the use of the term *predecessors* was confusing and became inaccurate when the transformer could handle cycles
|
|
83
|
+
*/
|
|
84
|
+
danglingPredecessorsBehavior?: "reject" | "ignore";
|
|
85
|
+
/** The behavior to use when an element reference (id) is found stored as a reference on an element in the source,
|
|
86
|
+
* but the referenced element does not actually exist in the source.
|
|
87
|
+
* It is possible to craft an iModel with dangling references/invalidated relationships by, e.g., deleting certain
|
|
88
|
+
* elements without fixing up references.
|
|
89
|
+
*
|
|
90
|
+
* @note "reject" will throw an error and reject the transformation upon finding this case.
|
|
91
|
+
* @note "ignore" passes the issue down to consuming applications, iModels that have invalid element references
|
|
92
|
+
* like this can cause errors, and you should consider adding custom logic in your transformer to remove the
|
|
93
|
+
* reference depending on your use case.
|
|
94
|
+
* @default "reject"
|
|
95
|
+
* @beta
|
|
96
|
+
*/
|
|
97
|
+
danglingReferencesBehavior?: "reject" | "ignore";
|
|
98
|
+
/** If defined, options to be supplied to [[IModelImporter.optimizeGeometry]] by [[IModelTransformer.processChanges]] and [[IModelTransformer.processAll]]
|
|
99
|
+
* as a post-processing step to optimize the geometry in the iModel.
|
|
100
|
+
* @beta
|
|
101
|
+
*/
|
|
102
|
+
optimizeGeometry?: OptimizeGeometryOptions;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A container for tracking the state of a partially committed entity and finalizing it when it's ready to be fully committed
|
|
106
|
+
* @internal
|
|
107
|
+
*/
|
|
108
|
+
declare class PartiallyCommittedEntity {
|
|
109
|
+
/**
|
|
110
|
+
* A set of "model|element ++ ID64" pairs, (e.g. `model0x11` or `element0x12`)
|
|
111
|
+
* It is possible for the submodel of an element to be separately resolved from the actual element,
|
|
112
|
+
* so its resolution must be tracked separately
|
|
113
|
+
*/
|
|
114
|
+
private _missingReferences;
|
|
115
|
+
private _onComplete;
|
|
116
|
+
constructor(
|
|
117
|
+
/**
|
|
118
|
+
* A set of "model|element ++ ID64" pairs, (e.g. `model0x11` or `element0x12`)
|
|
119
|
+
* It is possible for the submodel of an element to be separately resolved from the actual element,
|
|
120
|
+
* so its resolution must be tracked separately
|
|
121
|
+
*/
|
|
122
|
+
_missingReferences: EntityReferenceSet, _onComplete: () => void);
|
|
123
|
+
resolveReference(id: EntityReference): void;
|
|
124
|
+
forceComplete(): void;
|
|
125
|
+
}
|
|
126
|
+
/** Arguments you can pass to [[IModelTransformer.initExternalSourceAspects]]
|
|
127
|
+
* @beta
|
|
128
|
+
*/
|
|
129
|
+
export interface InitFromExternalSourceAspectsArgs {
|
|
130
|
+
accessToken?: AccessToken;
|
|
131
|
+
startChangesetId?: string;
|
|
132
|
+
}
|
|
133
|
+
/** Base class used to transform a source iModel into a different target iModel.
|
|
134
|
+
* @see [iModel Transformation and Data Exchange]($docs/learning/transformer/index.md), [IModelExporter]($transformer), [IModelImporter]($transformer)
|
|
135
|
+
* @beta
|
|
136
|
+
*/
|
|
137
|
+
export declare class IModelTransformer extends IModelExportHandler {
|
|
138
|
+
/** The IModelExporter that will export from the source iModel. */
|
|
139
|
+
readonly exporter: IModelExporter;
|
|
140
|
+
/** The IModelImporter that will import into the target iModel. */
|
|
141
|
+
readonly importer: IModelImporter;
|
|
142
|
+
/** The normally read-only source iModel.
|
|
143
|
+
* @note The source iModel will need to be read/write when provenance is being stored during a reverse synchronization.
|
|
144
|
+
*/
|
|
145
|
+
readonly sourceDb: IModelDb;
|
|
146
|
+
/** The read/write target iModel. */
|
|
147
|
+
readonly targetDb: IModelDb;
|
|
148
|
+
/** The IModelTransformContext for this IModelTransformer. */
|
|
149
|
+
readonly context: IModelCloneContext;
|
|
150
|
+
/** The Id of the Element in the **target** iModel that represents the **source** repository as a whole and scopes its [ExternalSourceAspect]($backend) instances. */
|
|
151
|
+
get targetScopeElementId(): Id64String;
|
|
152
|
+
/** map of (unprocessed element, referencing processed element) pairs to the partially committed element that needs the reference resolved
|
|
153
|
+
* and have some helper methods below for now */
|
|
154
|
+
protected _pendingReferences: PendingReferenceMap<PartiallyCommittedEntity>;
|
|
155
|
+
/** map of partially committed entities to their partial commit progress */
|
|
156
|
+
protected _partiallyCommittedEntities: EntityMap<PartiallyCommittedEntity>;
|
|
157
|
+
/** the options that were used to initialize this transformer */
|
|
158
|
+
private readonly _options;
|
|
159
|
+
/** Set if it can be determined whether this is the first source --> target synchronization. */
|
|
160
|
+
private _isFirstSynchronization?;
|
|
161
|
+
/** The element classes that are considered to define provenance in the iModel */
|
|
162
|
+
static get provenanceElementClasses(): (typeof Entity)[];
|
|
163
|
+
/** The element aspect classes that are considered to define provenance in the iModel */
|
|
164
|
+
static get provenanceElementAspectClasses(): (typeof Entity)[];
|
|
165
|
+
/** Construct a new IModelTransformer
|
|
166
|
+
* @param source Specifies the source IModelExporter or the source IModelDb that will be used to construct the source IModelExporter.
|
|
167
|
+
* @param target Specifies the target IModelImporter or the target IModelDb that will be used to construct the target IModelImporter.
|
|
168
|
+
* @param options The options that specify how the transformation should be done.
|
|
169
|
+
*/
|
|
170
|
+
constructor(source: IModelDb | IModelExporter, target: IModelDb | IModelImporter, options?: IModelTransformOptions);
|
|
171
|
+
/** Dispose any native resources associated with this IModelTransformer. */
|
|
172
|
+
dispose(): void;
|
|
173
|
+
/** Log current settings that affect IModelTransformer's behavior. */
|
|
174
|
+
private logSettings;
|
|
175
|
+
/** Return the IModelDb where IModelTransformer will store its provenance.
|
|
176
|
+
* @note This will be [[targetDb]] except when it is a reverse synchronization. In that case it be [[sourceDb]].
|
|
177
|
+
*/
|
|
178
|
+
get provenanceDb(): IModelDb;
|
|
179
|
+
/** Create an ExternalSourceAspectProps in a standard way for an Element in an iModel --> iModel transformation. */
|
|
180
|
+
private initElementProvenance;
|
|
181
|
+
/** Create an ExternalSourceAspectProps in a standard way for a Relationship in an iModel --> iModel transformations.
|
|
182
|
+
* The ExternalSourceAspect is meant to be owned by the Element in the target iModel that is the `sourceId` of transformed relationship.
|
|
183
|
+
* The `identifier` property of the ExternalSourceAspect will be the ECInstanceId of the relationship in the source iModel.
|
|
184
|
+
* The ECInstanceId of the relationship in the target iModel will be stored in the JsonProperties of the ExternalSourceAspect.
|
|
185
|
+
*/
|
|
186
|
+
private initRelationshipProvenance;
|
|
187
|
+
private validateScopeProvenance;
|
|
188
|
+
private queryExternalSourceAspectId;
|
|
189
|
+
/** Iterate all matching ExternalSourceAspects in the provenance iModel (target unless reverse sync) and call a function for each one. */
|
|
190
|
+
private forEachTrackedElement;
|
|
191
|
+
/** Initialize the source to target Element mapping from ExternalSourceAspects in the target iModel.
|
|
192
|
+
* @note This method is called from all `process*` functions and should never need to be called directly.
|
|
193
|
+
* @deprecated in 3.x. call [[initialize]] instead, it does the same thing among other initialization
|
|
194
|
+
* @note Passing an [[InitFromExternalSourceAspectsArgs]] is required when processing changes, to remap any elements that may have been deleted.
|
|
195
|
+
* You must await the returned promise as well in this case. The synchronous behavior has not changed but is deprecated and won't process everything.
|
|
196
|
+
*/
|
|
197
|
+
initFromExternalSourceAspects(args?: InitFromExternalSourceAspectsArgs): void | Promise<void>;
|
|
198
|
+
/** When processing deleted elements in a reverse synchronization, the [[provenanceDb]] (usually a branch iModel) has already
|
|
199
|
+
* deleted the [ExternalSourceAspect]($backend)s that tell us which elements in the reverse synchronization target (usually
|
|
200
|
+
* a master iModel) should be deleted. We must use the changesets to get the values of those before they were deleted.
|
|
201
|
+
*/
|
|
202
|
+
private remapDeletedSourceElements;
|
|
203
|
+
/** Returns `true` if *brute force* delete detections should be run.
|
|
204
|
+
* @note Not relevant for processChanges when change history is known.
|
|
205
|
+
*/
|
|
206
|
+
private shouldDetectDeletes;
|
|
207
|
+
/** Detect Element deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against Elements in the source iModel.
|
|
208
|
+
* @see processChanges
|
|
209
|
+
* @note This method is called from [[processAll]] and is not needed by [[processChanges]], so it only needs to be called directly when processing a subset of an iModel.
|
|
210
|
+
* @throws [[IModelError]] If the required provenance information is not available to detect deletes.
|
|
211
|
+
*/
|
|
212
|
+
detectElementDeletes(): Promise<void>;
|
|
213
|
+
/**
|
|
214
|
+
* @deprecated in 3.x, this no longer has any effect except emitting a warning
|
|
215
|
+
*/
|
|
216
|
+
protected skipElement(_sourceElement: Element): void;
|
|
217
|
+
/** Transform the specified sourceElement into ElementProps for the target iModel.
|
|
218
|
+
* @param sourceElement The Element from the source iModel to transform.
|
|
219
|
+
* @returns ElementProps for the target iModel.
|
|
220
|
+
* @note A subclass can override this method to provide custom transform behavior.
|
|
221
|
+
* @note This can be called more than once for an element in arbitrary order, so it should not have side-effects.
|
|
222
|
+
*/
|
|
223
|
+
onTransformElement(sourceElement: Element): ElementProps;
|
|
224
|
+
/** Returns true if a change within sourceElement is detected.
|
|
225
|
+
* @param sourceElement The Element from the source iModel
|
|
226
|
+
* @param targetElementId The Element from the target iModel to compare against.
|
|
227
|
+
* @note A subclass can override this method to provide custom change detection behavior.
|
|
228
|
+
*/
|
|
229
|
+
protected hasElementChanged(sourceElement: Element, targetElementId: Id64String): boolean;
|
|
230
|
+
private static transformCallbackFor;
|
|
231
|
+
/** callback to perform when a partial element says it's ready to be completed
|
|
232
|
+
* transforms the source element with all references now valid, then updates the partial element with the results
|
|
233
|
+
*/
|
|
234
|
+
private makePartialEntityCompleter;
|
|
235
|
+
/** collect references this entity has that are yet to be mapped, and if there are any
|
|
236
|
+
* create a [[PartiallyCommittedEntity]] to track resolution of those references
|
|
237
|
+
*/
|
|
238
|
+
private collectUnmappedReferences;
|
|
239
|
+
/** Cause the specified Element and its child Elements (if applicable) to be exported from the source iModel and imported into the target iModel.
|
|
240
|
+
* @param sourceElementId Identifies the Element from the source iModel to import.
|
|
241
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
242
|
+
*/
|
|
243
|
+
processElement(sourceElementId: Id64String): Promise<void>;
|
|
244
|
+
/** Import child elements into the target IModelDb
|
|
245
|
+
* @param sourceElementId Import the child elements of this element in the source IModelDb.
|
|
246
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
247
|
+
*/
|
|
248
|
+
processChildElements(sourceElementId: Id64String): Promise<void>;
|
|
249
|
+
/** Override of [IModelExportHandler.shouldExportElement]($transformer) that is called to determine if an element should be exported from the source iModel.
|
|
250
|
+
* @note Reaching this point means that the element has passed the standard exclusion checks in IModelExporter.
|
|
251
|
+
*/
|
|
252
|
+
shouldExportElement(_sourceElement: Element): boolean;
|
|
253
|
+
/**
|
|
254
|
+
* If they haven't been already, import all of the required references
|
|
255
|
+
* @internal do not call, override or implement this, it will be removed
|
|
256
|
+
*/
|
|
257
|
+
preExportElement(sourceElement: Element): Promise<void>;
|
|
258
|
+
private getElemTransformState;
|
|
259
|
+
/** Override of [IModelExportHandler.onExportElement]($transformer) that imports an element into the target iModel when it is exported from the source iModel.
|
|
260
|
+
* This override calls [[onTransformElement]] and then [IModelImporter.importElement]($transformer) to update the target iModel.
|
|
261
|
+
*/
|
|
262
|
+
onExportElement(sourceElement: Element): void;
|
|
263
|
+
private resolvePendingReferences;
|
|
264
|
+
/** Override of [IModelExportHandler.onDeleteElement]($transformer) that is called when [IModelExporter]($transformer) detects that an Element has been deleted from the source iModel.
|
|
265
|
+
* This override propagates the delete to the target iModel via [IModelImporter.deleteElement]($transformer).
|
|
266
|
+
*/
|
|
267
|
+
onDeleteElement(sourceElementId: Id64String): void;
|
|
268
|
+
/** Override of [IModelExportHandler.onExportModel]($transformer) that is called when a Model should be exported from the source iModel.
|
|
269
|
+
* This override calls [[onTransformModel]] and then [IModelImporter.importModel]($transformer) to update the target iModel.
|
|
270
|
+
*/
|
|
271
|
+
onExportModel(sourceModel: Model): void;
|
|
272
|
+
/** Override of [IModelExportHandler.onDeleteModel]($transformer) that is called when [IModelExporter]($transformer) detects that a [Model]($backend) has been deleted from the source iModel. */
|
|
273
|
+
onDeleteModel(sourceModelId: Id64String): void;
|
|
274
|
+
/** Cause the model container, contents, and sub-models to be exported from the source iModel and imported into the target iModel.
|
|
275
|
+
* @param sourceModeledElementId Import this [Model]($backend) from the source IModelDb.
|
|
276
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
277
|
+
*/
|
|
278
|
+
processModel(sourceModeledElementId: Id64String): Promise<void>;
|
|
279
|
+
/** Cause the model contents to be exported from the source iModel and imported into the target iModel.
|
|
280
|
+
* @param sourceModelId Import the contents of this model from the source IModelDb.
|
|
281
|
+
* @param targetModelId Import into this model in the target IModelDb. The target model must exist prior to this call.
|
|
282
|
+
* @param elementClassFullName Optional classFullName of an element subclass to limit import query against the source model.
|
|
283
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
284
|
+
*/
|
|
285
|
+
processModelContents(sourceModelId: Id64String, targetModelId: Id64String, elementClassFullName?: string): Promise<void>;
|
|
286
|
+
/** Cause all sub-models that recursively descend from the specified Subject to be exported from the source iModel and imported into the target iModel. */
|
|
287
|
+
private processSubjectSubModels;
|
|
288
|
+
/** Transform the specified sourceModel into ModelProps for the target iModel.
|
|
289
|
+
* @param sourceModel The Model from the source iModel to be transformed.
|
|
290
|
+
* @param targetModeledElementId The transformed Model will *break down* or *detail* this Element in the target iModel.
|
|
291
|
+
* @returns ModelProps for the target iModel.
|
|
292
|
+
* @note A subclass can override this method to provide custom transform behavior.
|
|
293
|
+
*/
|
|
294
|
+
onTransformModel(sourceModel: Model, targetModeledElementId: Id64String): ModelProps;
|
|
295
|
+
/** Import elements that were deferred in a prior pass.
|
|
296
|
+
* @deprecated in 3.x. This method is no longer necessary since the transformer no longer needs to defer elements
|
|
297
|
+
*/
|
|
298
|
+
processDeferredElements(_numRetries?: number): Promise<void>;
|
|
299
|
+
private finalizeTransformation;
|
|
300
|
+
/** Imports all relationships that subclass from the specified base class.
|
|
301
|
+
* @param baseRelClassFullName The specified base relationship class.
|
|
302
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
303
|
+
*/
|
|
304
|
+
processRelationships(baseRelClassFullName: string): Promise<void>;
|
|
305
|
+
/** Override of [IModelExportHandler.shouldExportRelationship]($transformer) that is called to determine if a [Relationship]($backend) should be exported.
|
|
306
|
+
* @note Reaching this point means that the relationship has passed the standard exclusion checks in [IModelExporter]($transformer).
|
|
307
|
+
*/
|
|
308
|
+
shouldExportRelationship(_sourceRelationship: Relationship): boolean;
|
|
309
|
+
/** Override of [IModelExportHandler.onExportRelationship]($transformer) that imports a relationship into the target iModel when it is exported from the source iModel.
|
|
310
|
+
* This override calls [[onTransformRelationship]] and then [IModelImporter.importRelationship]($transformer) to update the target iModel.
|
|
311
|
+
*/
|
|
312
|
+
onExportRelationship(sourceRelationship: Relationship): void;
|
|
313
|
+
/** Override of [IModelExportHandler.onDeleteRelationship]($transformer) that is called when [IModelExporter]($transformer) detects that a [Relationship]($backend) has been deleted from the source iModel.
|
|
314
|
+
* This override propagates the delete to the target iModel via [IModelImporter.deleteRelationship]($transformer).
|
|
315
|
+
*/
|
|
316
|
+
onDeleteRelationship(sourceRelInstanceId: Id64String): void;
|
|
317
|
+
private _yieldManager;
|
|
318
|
+
/** Detect Relationship deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against relationships in the source iModel.
|
|
319
|
+
* @see processChanges
|
|
320
|
+
* @note This method is called from [[processAll]] and is not needed by [[processChanges]], so it only needs to be called directly when processing a subset of an iModel.
|
|
321
|
+
* @throws [[IModelError]] If the required provenance information is not available to detect deletes.
|
|
322
|
+
*/
|
|
323
|
+
detectRelationshipDeletes(): Promise<void>;
|
|
324
|
+
/** Transform the specified sourceRelationship into RelationshipProps for the target iModel.
|
|
325
|
+
* @param sourceRelationship The Relationship from the source iModel to be transformed.
|
|
326
|
+
* @returns RelationshipProps for the target iModel.
|
|
327
|
+
* @note A subclass can override this method to provide custom transform behavior.
|
|
328
|
+
*/
|
|
329
|
+
protected onTransformRelationship(sourceRelationship: Relationship): RelationshipProps;
|
|
330
|
+
/** Override of [IModelExportHandler.onExportElementUniqueAspect]($transformer) that imports an ElementUniqueAspect into the target iModel when it is exported from the source iModel.
|
|
331
|
+
* This override calls [[onTransformElementAspect]] and then [IModelImporter.importElementUniqueAspect]($transformer) to update the target iModel.
|
|
332
|
+
*/
|
|
333
|
+
onExportElementUniqueAspect(sourceAspect: ElementUniqueAspect): void;
|
|
334
|
+
/** Override of [IModelExportHandler.onExportElementMultiAspects]($transformer) that imports ElementMultiAspects into the target iModel when they are exported from the source iModel.
|
|
335
|
+
* This override calls [[onTransformElementAspect]] for each ElementMultiAspect and then [IModelImporter.importElementMultiAspects]($transformer) to update the target iModel.
|
|
336
|
+
* @note ElementMultiAspects are handled as a group to make it easier to differentiate between insert, update, and delete.
|
|
337
|
+
*/
|
|
338
|
+
onExportElementMultiAspects(sourceAspects: ElementMultiAspect[]): void;
|
|
339
|
+
/** Transform the specified sourceElementAspect into ElementAspectProps for the target iModel.
|
|
340
|
+
* @param sourceElementAspect The ElementAspect from the source iModel to be transformed.
|
|
341
|
+
* @param _targetElementId The ElementId of the target Element that will own the ElementAspects after transformation.
|
|
342
|
+
* @returns ElementAspectProps for the target iModel.
|
|
343
|
+
* @note A subclass can override this method to provide custom transform behavior.
|
|
344
|
+
*/
|
|
345
|
+
protected onTransformElementAspect(sourceElementAspect: ElementAspect, _targetElementId: Id64String): ElementAspectProps;
|
|
346
|
+
/** The directory where schemas will be exported, a random temporary directory */
|
|
347
|
+
protected _schemaExportDir: string;
|
|
348
|
+
/** Override of [IModelExportHandler.shouldExportSchema]($transformer) that is called to determine if a schema should be exported
|
|
349
|
+
* @note the default behavior doesn't import schemas older than those already in the target
|
|
350
|
+
*/
|
|
351
|
+
shouldExportSchema(schemaKey: ECSchemaMetaData.SchemaKey): boolean;
|
|
352
|
+
private _longNamedSchemasMap;
|
|
353
|
+
/** Override of [IModelExportHandler.onExportSchema]($transformer) that serializes a schema to disk for [[processSchemas]] to import into
|
|
354
|
+
* the target iModel when it is exported from the source iModel.
|
|
355
|
+
* @returns {Promise<ExportSchemaResult>} Although the type is possibly void for backwards compatibility of subclasses,
|
|
356
|
+
* `IModelTransformer.onExportSchema` always returns an[[IModelExportHandler.ExportSchemaResult]]
|
|
357
|
+
* with a defined `schemaPath` property, for subclasses to know where the schema was written.
|
|
358
|
+
* Schemas are *not* guaranteed to be written to [[IModelTransformer._schemaExportDir]] by a
|
|
359
|
+
* known pattern derivable from the schema's name, so you must use this to find it.
|
|
360
|
+
*/
|
|
361
|
+
onExportSchema(schema: ECSchemaMetaData.Schema): Promise<void | ExportSchemaResult>;
|
|
362
|
+
private _makeLongNameResolvingSchemaCtx;
|
|
363
|
+
/** Cause all schemas to be exported from the source iModel and imported into the target iModel.
|
|
364
|
+
* @note For performance reasons, it is recommended that [IModelDb.saveChanges]($backend) be called after `processSchemas` is complete.
|
|
365
|
+
* It is more efficient to process *data* changes after the schema changes have been saved.
|
|
366
|
+
*/
|
|
367
|
+
processSchemas(): Promise<void>;
|
|
368
|
+
/** Cause all fonts to be exported from the source iModel and imported into the target iModel.
|
|
369
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
370
|
+
*/
|
|
371
|
+
processFonts(): Promise<void>;
|
|
372
|
+
/** Override of [IModelExportHandler.onExportFont]($transformer) that imports a font into the target iModel when it is exported from the source iModel. */
|
|
373
|
+
onExportFont(font: FontProps, _isUpdate: boolean | undefined): void;
|
|
374
|
+
/** Cause all CodeSpecs to be exported from the source iModel and imported into the target iModel.
|
|
375
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
376
|
+
*/
|
|
377
|
+
processCodeSpecs(): Promise<void>;
|
|
378
|
+
/** Cause a single CodeSpec to be exported from the source iModel and imported into the target iModel.
|
|
379
|
+
* @note This method is called from [[processChanges]] and [[processAll]], so it only needs to be called directly when processing a subset of an iModel.
|
|
380
|
+
*/
|
|
381
|
+
processCodeSpec(codeSpecName: string): Promise<void>;
|
|
382
|
+
/** Override of [IModelExportHandler.shouldExportCodeSpec]($transformer) that is called to determine if a CodeSpec should be exported from the source iModel.
|
|
383
|
+
* @note Reaching this point means that the CodeSpec has passed the standard exclusion checks in [IModelExporter]($transformer).
|
|
384
|
+
*/
|
|
385
|
+
shouldExportCodeSpec(_sourceCodeSpec: CodeSpec): boolean;
|
|
386
|
+
/** Override of [IModelExportHandler.onExportCodeSpec]($transformer) that imports a CodeSpec into the target iModel when it is exported from the source iModel. */
|
|
387
|
+
onExportCodeSpec(sourceCodeSpec: CodeSpec): void;
|
|
388
|
+
/** Recursively import all Elements and sub-Models that descend from the specified Subject */
|
|
389
|
+
processSubject(sourceSubjectId: Id64String, targetSubjectId: Id64String): Promise<void>;
|
|
390
|
+
/** state to prevent reinitialization, @see [[initialize]] */
|
|
391
|
+
private _initialized;
|
|
392
|
+
/**
|
|
393
|
+
* Initialize prerequisites of processing, you must initialize with an [[InitFromExternalSourceAspectsArgs]] if you
|
|
394
|
+
* are intending process changes, but prefer using [[processChanges]]
|
|
395
|
+
* Called by all `process*` functions implicitly.
|
|
396
|
+
* Overriders must call `super.initialize()` first
|
|
397
|
+
*/
|
|
398
|
+
initialize(args?: InitFromExternalSourceAspectsArgs): Promise<void>;
|
|
399
|
+
/** Export everything from the source iModel and import the transformed entities into the target iModel.
|
|
400
|
+
* @note [[processSchemas]] is not called automatically since the target iModel may want a different collection of schemas.
|
|
401
|
+
*/
|
|
402
|
+
processAll(): Promise<void>;
|
|
403
|
+
private _lastProvenanceEntityInfo;
|
|
404
|
+
private markLastProvenance;
|
|
405
|
+
/** @internal the name of the table where javascript state of the transformer is serialized in transformer state dumps */
|
|
406
|
+
static readonly jsStateTable = "TransformerJsState";
|
|
407
|
+
/** @internal the name of the table where the target state heuristics is serialized in transformer state dumps */
|
|
408
|
+
static readonly lastProvenanceEntityInfoTable = "LastProvenanceEntityInfo";
|
|
409
|
+
/**
|
|
410
|
+
* Load the state of the active transformation from an open SQLiteDb
|
|
411
|
+
* You can override this if you'd like to load from custom tables in the resumable dump state, but you should call
|
|
412
|
+
* this super implementation
|
|
413
|
+
* @note the SQLiteDb must be open
|
|
414
|
+
*/
|
|
415
|
+
protected loadStateFromDb(db: SQLiteDb): void;
|
|
416
|
+
/**
|
|
417
|
+
* Return a new transformer instance with the same remappings state as saved from a previous [[IModelTransformer.saveStateToFile]] call.
|
|
418
|
+
* This allows you to "resume" an iModel transformation, you will have to call [[IModelTransformer.processChanges]]/[[IModelTransformer.processAll]]
|
|
419
|
+
* again but the remapping state will cause already mapped elements to be skipped.
|
|
420
|
+
* To "resume" an iModel Transformation you need:
|
|
421
|
+
* - the sourceDb at the same changeset
|
|
422
|
+
* - the same targetDb in the state in which it was before
|
|
423
|
+
* @param statePath the path to the serialized state of the transformer, use [[IModelTransformer.saveStateToFile]] to get this from an existing transformer instance
|
|
424
|
+
* @param constructorArgs remaining arguments that you would normally pass to the Transformer subclass you are using, usually (sourceDb, targetDb)
|
|
425
|
+
* @note custom transformers with custom state may need to override this method in order to handle loading their own custom state somewhere
|
|
426
|
+
*/
|
|
427
|
+
static resumeTransformation<SubClass extends new (...a: any[]) => IModelTransformer = typeof IModelTransformer>(this: SubClass, statePath: string, ...constructorArgs: ConstructorParameters<SubClass>): InstanceType<SubClass>;
|
|
428
|
+
/**
|
|
429
|
+
* You may override this to store arbitrary json state in a transformer state dump, useful for some resumptions
|
|
430
|
+
* @see [[IModelTransformer.saveStateToFile]]
|
|
431
|
+
*/
|
|
432
|
+
protected getAdditionalStateJson(): any;
|
|
433
|
+
/**
|
|
434
|
+
* You may override this to load arbitrary json state in a transformer state dump, useful for some resumptions
|
|
435
|
+
* @see [[IModelTransformer.loadStateFromFile]]
|
|
436
|
+
*/
|
|
437
|
+
protected loadAdditionalStateJson(_additionalState: any): void;
|
|
438
|
+
/**
|
|
439
|
+
* Save the state of the active transformation to an open SQLiteDb
|
|
440
|
+
* You can override this if you'd like to write custom tables to the resumable dump state, but you should call
|
|
441
|
+
* this super implementation
|
|
442
|
+
* @note the SQLiteDb must be open
|
|
443
|
+
*/
|
|
444
|
+
protected saveStateToDb(db: SQLiteDb): void;
|
|
445
|
+
/**
|
|
446
|
+
* Save the state of the active transformation to a file path, if a file at the path already exists, it will be overwritten
|
|
447
|
+
* This state can be used by [[IModelTransformer.resumeTransformation]] to resume a transformation from this point.
|
|
448
|
+
* The serialization format is a custom sqlite database.
|
|
449
|
+
* @note custom transformers with custom state may override [[IModelTransformer.saveStateToDb]] or [[IModelTransformer.getAdditionalStateJson]]
|
|
450
|
+
* and [[IModelTransformer.loadStateFromDb]] (with a super call) or [[IModelTransformer.loadAdditionalStateJson]]
|
|
451
|
+
* if they have custom state that needs to be stored with
|
|
452
|
+
* potentially inside the same sqlite file in separate tables
|
|
453
|
+
*/
|
|
454
|
+
saveStateToFile(nativeStatePath: string): void;
|
|
455
|
+
/** Export changes from the source iModel and import the transformed entities into the target iModel.
|
|
456
|
+
* Inserts, updates, and deletes are determined by inspecting the changeset(s).
|
|
457
|
+
* @param accessToken A valid access token string
|
|
458
|
+
* @param startChangesetId Include changes from this changeset up through and including the current changeset.
|
|
459
|
+
* If this parameter is not provided, then just the current changeset will be exported.
|
|
460
|
+
* @note To form a range of versions to process, set `startChangesetId` for the start (inclusive) of the desired range and open the source iModel as of the end (inclusive) of the desired range.
|
|
461
|
+
*/
|
|
462
|
+
processChanges(accessToken: AccessToken, startChangesetId?: string): Promise<void>;
|
|
463
|
+
}
|
|
464
|
+
/** IModelTransformer that clones the contents of a template model.
|
|
465
|
+
* @beta
|
|
466
|
+
*/
|
|
467
|
+
export declare class TemplateModelCloner extends IModelTransformer {
|
|
468
|
+
/** The Placement to apply to the template. */
|
|
469
|
+
private _transform3d?;
|
|
470
|
+
/** Accumulates the mapping of sourceElementIds to targetElementIds from the elements in the template model that were cloned. */
|
|
471
|
+
private _sourceIdToTargetIdMap?;
|
|
472
|
+
/** Construct a new TemplateModelCloner
|
|
473
|
+
* @param sourceDb The source IModelDb that contains the templates to clone
|
|
474
|
+
* @param targetDb Optionally specify the target IModelDb where the cloned template will be inserted.
|
|
475
|
+
* Typically this is left unspecified, and the default is to use the sourceDb as the target
|
|
476
|
+
* @note The expectation is that the template definitions are within the same iModel where instances will be placed.
|
|
477
|
+
*/
|
|
478
|
+
constructor(sourceDb: IModelDb, targetDb?: IModelDb);
|
|
479
|
+
/** Place a template from the sourceDb at the specified placement in the target model within the targetDb.
|
|
480
|
+
* @param sourceTemplateModelId The Id of the template model in the sourceDb
|
|
481
|
+
* @param targetModelId The Id of the target model (must be a subclass of GeometricModel3d) where the cloned component will be inserted.
|
|
482
|
+
* @param placement The placement for the cloned component.
|
|
483
|
+
* @note *Required References* like the SpatialCategory must be remapped before calling this method.
|
|
484
|
+
* @returns The mapping of sourceElementIds from the template model to the instantiated targetElementIds in the targetDb in case further processing is required.
|
|
485
|
+
*/
|
|
486
|
+
placeTemplate3d(sourceTemplateModelId: Id64String, targetModelId: Id64String, placement: Placement3d): Promise<Map<Id64String, Id64String>>;
|
|
487
|
+
/** Place a template from the sourceDb at the specified placement in the target model within the targetDb.
|
|
488
|
+
* @param sourceTemplateModelId The Id of the template model in the sourceDb
|
|
489
|
+
* @param targetModelId The Id of the target model (must be a subclass of GeometricModel2d) where the cloned component will be inserted.
|
|
490
|
+
* @param placement The placement for the cloned component.
|
|
491
|
+
* @note *Required References* like the DrawingCategory must be remapped before calling this method.
|
|
492
|
+
* @returns The mapping of sourceElementIds from the template model to the instantiated targetElementIds in the targetDb in case further processing is required.
|
|
493
|
+
*/
|
|
494
|
+
placeTemplate2d(sourceTemplateModelId: Id64String, targetModelId: Id64String, placement: Placement2d): Promise<Map<Id64String, Id64String>>;
|
|
495
|
+
/** Cloning from a template requires this override of onTransformElement. */
|
|
496
|
+
onTransformElement(sourceElement: Element): ElementProps;
|
|
497
|
+
}
|
|
498
|
+
export {};
|
|
499
|
+
//# sourceMappingURL=IModelTransformer.d.ts.map
|