@itwin/core-backend 5.5.0-dev.1 → 5.5.0-dev.2

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.
Files changed (381) hide show
  1. package/lib/cjs/BackendHubAccess.js.map +1 -1
  2. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  3. package/lib/cjs/BisCoreSchema.js.map +1 -1
  4. package/lib/cjs/BlobContainerService.js.map +1 -1
  5. package/lib/cjs/BriefcaseManager.js.map +1 -1
  6. package/lib/cjs/CatalogDb.js.map +1 -1
  7. package/lib/cjs/Category.js.map +1 -1
  8. package/lib/cjs/ChangeSummaryManager.js +2 -2
  9. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  10. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  11. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  12. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  13. package/lib/cjs/ChannelControl.js.map +1 -1
  14. package/lib/cjs/CheckpointManager.js.map +1 -1
  15. package/lib/cjs/ClassRegistry.js +5 -5
  16. package/lib/cjs/ClassRegistry.js.map +1 -1
  17. package/lib/cjs/CloudSqlite.js.map +1 -1
  18. package/lib/cjs/CodeService.js.map +1 -1
  19. package/lib/cjs/CodeSpecs.js.map +1 -1
  20. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  21. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  22. package/lib/cjs/DevTools.js.map +1 -1
  23. package/lib/cjs/DisplayStyle.js.map +1 -1
  24. package/lib/cjs/ECDb.js.map +1 -1
  25. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  26. package/lib/cjs/ECSqlStatement.js.map +1 -1
  27. package/lib/cjs/Element.js.map +1 -1
  28. package/lib/cjs/ElementAspect.js.map +1 -1
  29. package/lib/cjs/ElementGraphics.js.map +1 -1
  30. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  31. package/lib/cjs/Entity.js.map +1 -1
  32. package/lib/cjs/EntityReferences.js.map +1 -1
  33. package/lib/cjs/ExportGraphics.js.map +1 -1
  34. package/lib/cjs/ExternalSource.js.map +1 -1
  35. package/lib/cjs/FontFile.js.map +1 -1
  36. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  37. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  38. package/lib/cjs/GeometrySummary.js +47 -47
  39. package/lib/cjs/GeometrySummary.js.map +1 -1
  40. package/lib/cjs/IModelDb.js +8 -8
  41. package/lib/cjs/IModelDb.js.map +1 -1
  42. package/lib/cjs/IModelDbFonts.js.map +1 -1
  43. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  44. package/lib/cjs/IModelHost.js.map +1 -1
  45. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  46. package/lib/cjs/IModelJsFs.js.map +1 -1
  47. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  48. package/lib/cjs/IpcHost.js.map +1 -1
  49. package/lib/cjs/LineStyle.js.map +1 -1
  50. package/lib/cjs/LocalHub.js +1 -1
  51. package/lib/cjs/LocalHub.js.map +1 -1
  52. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  53. package/lib/cjs/LockControl.js.map +1 -1
  54. package/lib/cjs/Material.js.map +1 -1
  55. package/lib/cjs/Model.js.map +1 -1
  56. package/lib/cjs/NativeAppStorage.js.map +1 -1
  57. package/lib/cjs/NativeHost.js.map +1 -1
  58. package/lib/cjs/NavigationRelationship.js.map +1 -1
  59. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  60. package/lib/cjs/PropertyStore.js.map +1 -1
  61. package/lib/cjs/Relationship.js.map +1 -1
  62. package/lib/cjs/RpcBackend.js.map +1 -1
  63. package/lib/cjs/SQLiteDb.js.map +1 -1
  64. package/lib/cjs/Schema.js.map +1 -1
  65. package/lib/cjs/SchemaSync.js.map +1 -1
  66. package/lib/cjs/SchemaUtils.js.map +1 -1
  67. package/lib/cjs/SheetIndex.js.map +1 -1
  68. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  69. package/lib/cjs/SqliteStatement.js.map +1 -1
  70. package/lib/cjs/StashManager.js.map +1 -1
  71. package/lib/cjs/Texture.js.map +1 -1
  72. package/lib/cjs/TileStorage.js.map +1 -1
  73. package/lib/cjs/TxnManager.js.map +1 -1
  74. package/lib/cjs/ViewDefinition.js.map +1 -1
  75. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  76. package/lib/cjs/ViewStore.js.map +1 -1
  77. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  78. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  79. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  80. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  81. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  82. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  83. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  84. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  85. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  86. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  87. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  88. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  89. package/lib/cjs/core-backend.js.map +1 -1
  90. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  91. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  92. package/lib/cjs/domains/GenericElements.js.map +1 -1
  93. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  94. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  95. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  96. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  97. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  98. package/lib/cjs/internal/HubMock.js.map +1 -1
  99. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  100. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  101. package/lib/cjs/internal/NoLocks.js.map +1 -1
  102. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  103. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  104. package/lib/cjs/internal/Symbols.js.map +1 -1
  105. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  106. package/lib/cjs/internal/cross-package.js.map +1 -1
  107. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  108. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  109. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  110. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  111. package/lib/cjs/rpc/multipart.js.map +1 -1
  112. package/lib/cjs/rpc/tracing.js.map +1 -1
  113. package/lib/cjs/rpc/web/logging.js.map +1 -1
  114. package/lib/cjs/rpc/web/request.js.map +1 -1
  115. package/lib/cjs/rpc/web/response.js.map +1 -1
  116. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  117. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  118. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  119. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  120. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  121. package/lib/cjs/workspace/Settings.js.map +1 -1
  122. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  123. package/lib/cjs/workspace/Workspace.js.map +1 -1
  124. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  125. package/lib/esm/BackendHubAccess.js.map +1 -1
  126. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  127. package/lib/esm/BisCoreSchema.js.map +1 -1
  128. package/lib/esm/BlobContainerService.js.map +1 -1
  129. package/lib/esm/BriefcaseManager.js.map +1 -1
  130. package/lib/esm/CatalogDb.js.map +1 -1
  131. package/lib/esm/Category.js.map +1 -1
  132. package/lib/esm/ChangeSummaryManager.js +2 -2
  133. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  134. package/lib/esm/ChangedElementsDb.js.map +1 -1
  135. package/lib/esm/ChangesetECAdaptor.js +248 -248
  136. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  137. package/lib/esm/ChannelControl.js.map +1 -1
  138. package/lib/esm/CheckpointManager.js.map +1 -1
  139. package/lib/esm/ClassRegistry.js +5 -5
  140. package/lib/esm/ClassRegistry.js.map +1 -1
  141. package/lib/esm/CloudSqlite.js.map +1 -1
  142. package/lib/esm/CodeService.js.map +1 -1
  143. package/lib/esm/CodeSpecs.js.map +1 -1
  144. package/lib/esm/ConcurrentQuery.js.map +1 -1
  145. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  146. package/lib/esm/DevTools.js.map +1 -1
  147. package/lib/esm/DisplayStyle.js.map +1 -1
  148. package/lib/esm/ECDb.js.map +1 -1
  149. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  150. package/lib/esm/ECSqlStatement.js.map +1 -1
  151. package/lib/esm/Element.js.map +1 -1
  152. package/lib/esm/ElementAspect.js.map +1 -1
  153. package/lib/esm/ElementGraphics.js.map +1 -1
  154. package/lib/esm/ElementTreeWalker.js.map +1 -1
  155. package/lib/esm/Entity.js.map +1 -1
  156. package/lib/esm/EntityReferences.js.map +1 -1
  157. package/lib/esm/ExportGraphics.js.map +1 -1
  158. package/lib/esm/ExternalSource.js.map +1 -1
  159. package/lib/esm/FontFile.js.map +1 -1
  160. package/lib/esm/GeoCoordConfig.js.map +1 -1
  161. package/lib/esm/GeographicCRSServices.js.map +1 -1
  162. package/lib/esm/GeometrySummary.js +47 -47
  163. package/lib/esm/GeometrySummary.js.map +1 -1
  164. package/lib/esm/IModelDb.js +8 -8
  165. package/lib/esm/IModelDb.js.map +1 -1
  166. package/lib/esm/IModelDbFonts.js.map +1 -1
  167. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  168. package/lib/esm/IModelHost.js.map +1 -1
  169. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  170. package/lib/esm/IModelJsFs.js.map +1 -1
  171. package/lib/esm/ImageSourceConversion.js.map +1 -1
  172. package/lib/esm/IpcHost.js.map +1 -1
  173. package/lib/esm/LineStyle.js.map +1 -1
  174. package/lib/esm/LocalHub.js +1 -1
  175. package/lib/esm/LocalHub.js.map +1 -1
  176. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  177. package/lib/esm/LockControl.js.map +1 -1
  178. package/lib/esm/Material.js.map +1 -1
  179. package/lib/esm/Model.js.map +1 -1
  180. package/lib/esm/NativeAppStorage.js.map +1 -1
  181. package/lib/esm/NativeHost.js.map +1 -1
  182. package/lib/esm/NavigationRelationship.js.map +1 -1
  183. package/lib/esm/PromiseMemoizer.js.map +1 -1
  184. package/lib/esm/PropertyStore.js.map +1 -1
  185. package/lib/esm/Relationship.js.map +1 -1
  186. package/lib/esm/RpcBackend.js.map +1 -1
  187. package/lib/esm/SQLiteDb.js.map +1 -1
  188. package/lib/esm/Schema.js.map +1 -1
  189. package/lib/esm/SchemaSync.js.map +1 -1
  190. package/lib/esm/SchemaUtils.js.map +1 -1
  191. package/lib/esm/SheetIndex.js.map +1 -1
  192. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  193. package/lib/esm/SqliteStatement.js.map +1 -1
  194. package/lib/esm/StashManager.js.map +1 -1
  195. package/lib/esm/Texture.js.map +1 -1
  196. package/lib/esm/TileStorage.js.map +1 -1
  197. package/lib/esm/TxnManager.js.map +1 -1
  198. package/lib/esm/ViewDefinition.js.map +1 -1
  199. package/lib/esm/ViewStateHydrator.js.map +1 -1
  200. package/lib/esm/ViewStore.js.map +1 -1
  201. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  202. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  203. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  204. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  205. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  206. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  207. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  208. package/lib/esm/core-backend.js.map +1 -1
  209. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  210. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  211. package/lib/esm/domains/GenericElements.js.map +1 -1
  212. package/lib/esm/domains/GenericSchema.js.map +1 -1
  213. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  214. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  215. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  216. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  217. package/lib/esm/internal/HubMock.js.map +1 -1
  218. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  219. package/lib/esm/internal/NativePlatform.js.map +1 -1
  220. package/lib/esm/internal/NoLocks.js.map +1 -1
  221. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  222. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  223. package/lib/esm/internal/Symbols.js.map +1 -1
  224. package/lib/esm/internal/annotations/fields.js.map +1 -1
  225. package/lib/esm/internal/cross-package.js.map +1 -1
  226. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  227. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  228. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  229. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  230. package/lib/esm/rpc/multipart.js.map +1 -1
  231. package/lib/esm/rpc/tracing.js.map +1 -1
  232. package/lib/esm/rpc/web/logging.js.map +1 -1
  233. package/lib/esm/rpc/web/request.js.map +1 -1
  234. package/lib/esm/rpc/web/response.js.map +1 -1
  235. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  236. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  237. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  238. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  239. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  240. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  241. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  242. package/lib/esm/test/AttachDb.test.js +11 -11
  243. package/lib/esm/test/AttachDb.test.js.map +1 -1
  244. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  245. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  246. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  247. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  248. package/lib/esm/test/IModelHost.test.js.map +1 -1
  249. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  250. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  251. package/lib/esm/test/IpcHost.test.js.map +1 -1
  252. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  253. package/lib/esm/test/PrintElementTree.js.map +1 -1
  254. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  255. package/lib/esm/test/RevisionUtility.js.map +1 -1
  256. package/lib/esm/test/SchemaUtils.test.js +25 -25
  257. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  258. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  259. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  260. package/lib/esm/test/TestUtils.js.map +1 -1
  261. package/lib/esm/test/annotations/Fields.test.js +53 -53
  262. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  263. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  264. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  265. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  266. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  267. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  268. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  269. package/lib/esm/test/categories/Category.test.js.map +1 -1
  270. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  271. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  272. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  273. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
  274. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  275. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  276. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  277. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  278. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  279. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  280. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  281. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  282. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  283. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  284. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  285. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  286. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  287. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  288. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  289. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  290. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  291. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  292. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  293. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  294. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  295. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  296. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  297. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  298. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  299. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  300. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  301. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  302. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  303. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  304. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  305. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  306. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  307. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  308. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  309. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  310. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  311. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  312. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  313. package/lib/esm/test/hubaccess/Rebase.test.js +40 -40
  314. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  315. package/lib/esm/test/imageData.js.map +1 -1
  316. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  317. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  318. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  319. package/lib/esm/test/imodel/IModel.test.js +44 -44
  320. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  321. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  322. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  323. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  324. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  325. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
  326. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
  327. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  328. package/lib/esm/test/index.js.map +1 -1
  329. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  330. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  331. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  332. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  333. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  334. package/lib/esm/test/rpc/response.test.js.map +1 -1
  335. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  336. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  337. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  338. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  339. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  340. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  341. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  342. package/lib/esm/test/standalone/ChangesetReader.test.js +124 -124
  343. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  344. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  345. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  346. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  347. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  348. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  349. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  350. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  351. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  352. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  353. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  354. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  355. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  356. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  357. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  358. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  359. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  360. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  361. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  362. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  363. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  364. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  365. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  366. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  367. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  368. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  369. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  370. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  371. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  372. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  373. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  374. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  375. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  376. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  377. package/lib/esm/workspace/Settings.js.map +1 -1
  378. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  379. package/lib/esm/workspace/Workspace.js.map +1 -1
  380. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  381. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryStream.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/GeometryStream.test.ts"],"names":[],"mappings":"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CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAA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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, expect } from \"chai\";\r\nimport { BentleyStatus, Id64, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport {\r\n Angle, AngleSweep, Arc3d, Box, ClipMaskXYZRangePlanes, ClipPlane, ClipPlaneContainment, ClipPrimitive, ClipShape, ClipVector, ConvexClipPlaneSet,\r\n CurveCollection, CurvePrimitive, Geometry, GeometryQueryCategory, IndexedPolyface, InterpolationCurve3d, InterpolationCurve3dOptions, InterpolationCurve3dProps,\r\n LineSegment3d, LineString3d, Loop, Matrix3d, Plane3dByOriginAndUnitNormal, Point2d, Point3d, Point3dArray, PointString3d, PolyfaceBuilder, Range2d, Range3d,\r\n SolidPrimitive, Sphere, StrokeOptions, Transform, Vector3d, YawPitchRollAngles,\r\n} from \"@itwin/core-geometry\";\r\nimport {\r\n AreaPattern, BackgroundFill, BRepGeometryCreate, BRepGeometryFunction, BRepGeometryInfo, BRepGeometryOperation, Code, ColorByName,\r\n ColorDef, ElementGeometry, ElementGeometryDataEntry, ElementGeometryFunction, ElementGeometryInfo, ElementGeometryOpcode, ElementGeometryRequest,\r\n FillDisplay, GeometricElement3dProps, GeometricElementProps, GeometryClass,\r\n GeometryContainmentRequestProps, GeometryParams, GeometryPartProps, GeometryPrimitive, GeometryStreamBuilder, GeometryStreamFlags, GeometryStreamIterator,\r\n GeometryStreamProps, Gradient, ImageGraphicCorners, ImageGraphicProps, IModel, LinePixels, LineStyle, MassPropertiesOperation,\r\n MassPropertiesRequestProps, PhysicalElementProps, Placement3d, Placement3dProps, TextString, TextStringGlyphData, TextStringProps, ThematicGradientMode,\r\n ThematicGradientSettings, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { _nativeDb, DefinitionModel, deleteElementTree, GeometricElement, GeometryPart, LineStyleDefinition, PhysicalObject, SnapshotDb, SubCategory, Subject } from \"../../core-backend\";\r\nimport { createBRepDataProps } from \"../GeometryTestUtil\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { Timer } from \"../TestUtils\";\r\n\r\nfunction assertTrue(expr: boolean): asserts expr {\r\n assert.isTrue(expr);\r\n}\r\n\r\nfunction createGeometryPartProps(geom?: GeometryStreamProps, modelId?: Id64String): GeometryPartProps {\r\n const partProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: modelId ?? IModel.dictionaryId,\r\n code: Code.createEmpty(),\r\n geom,\r\n };\r\n return partProps;\r\n}\r\n\r\nfunction createPhysicalElementProps(seedElement: GeometricElement, placement?: Placement3dProps, geom?: GeometryStreamProps, modelId?: Id64String): PhysicalElementProps {\r\n const elementProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId ?? seedElement.model,\r\n category: seedElement.category,\r\n code: Code.createEmpty(),\r\n geom,\r\n placement,\r\n };\r\n return elementProps;\r\n}\r\n\r\nfunction createGeometryPart(geom: GeometryStreamProps, imodel: SnapshotDb): Id64String {\r\n const partProps = createGeometryPartProps(geom);\r\n return imodel.elements.insertElement(partProps);\r\n}\r\n\r\nfunction createGeometricElem(geom: GeometryStreamProps, placement: Placement3dProps, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\r\n const elementProps = createPhysicalElementProps(seedElement, placement, geom);\r\n const el = imodel.elements.createElement<GeometricElement>(elementProps);\r\n return imodel.elements.insertElement(el.toJSON());\r\n}\r\n\r\nfunction createPartElem(partId: Id64String, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement, isRelative = false): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometryPart3d(partId, isRelative ? origin : undefined, isRelative ? angles : undefined);\r\n return createGeometricElem(builder.geometryStream, isRelative ? { origin: Point3d.createZero(), angles: YawPitchRollAngles.createDegrees(0, 0, 0) } : { origin, angles }, imodel, seedElement);\r\n}\r\n\r\nfunction createCirclePart(radius: number, imodel: SnapshotDb): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(Arc3d.createXY(Point3d.createZero(), radius));\r\n return createGeometryPart(builder.geometryStream, imodel);\r\n}\r\n\r\nfunction createCircleElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(Arc3d.createXY(Point3d.createZero(), radius));\r\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\r\n}\r\n\r\nfunction createSphereElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), radius));\r\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\r\n}\r\n\r\nfunction createDisjointCirclesElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n const xOffset = radius * 1.5;\r\n builder.appendGeometry(Arc3d.createXY(Point3d.create(-xOffset), radius));\r\n const geomParams = new GeometryParams(seedElement.category);\r\n geomParams.geometryClass = GeometryClass.Construction;\r\n builder.appendGeometryParamsChange(geomParams);\r\n builder.appendGeometry(Arc3d.createXY(Point3d.create(xOffset), radius));\r\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\r\n}\r\n\r\nfunction createIndexedPolyface(radius: number, origin?: Point3d, angleTol?: Angle): IndexedPolyface {\r\n const options = StrokeOptions.createForFacets();\r\n\r\n options.needParams = true;\r\n options.needNormals = true;\r\n\r\n if (angleTol)\r\n options.angleTol = angleTol;\r\n\r\n // Create indexed polyface for testing by facetting a sphere...\r\n const sphere = Sphere.createCenterRadius(undefined !== origin ? origin : Point3d.createZero(), radius);\r\n const polyBuilder = PolyfaceBuilder.create(options);\r\n polyBuilder.handleSphere(sphere);\r\n\r\n return polyBuilder.claimPolyface();\r\n}\r\n\r\nfunction createStyledLineElem(imodel: SnapshotDb, seedElement: GeometricElement, x: number, y: number, length: number, styleInfo?: LineStyle.Info, color?: ColorDef): Id64String {\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n if (styleInfo)\r\n params.styleInfo = styleInfo;\r\n\r\n if (color)\r\n params.lineColor = color;\r\n\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.create(x, y, 0), Point3d.create(x + length, y, 0)));\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n return imodel.elements.insertElement(elementProps);\r\n}\r\n\r\ninterface ExpectedElementGeometryEntry {\r\n opcode: ElementGeometryOpcode;\r\n geometryCategory?: GeometryQueryCategory;\r\n geometrySubCategory?: string;\r\n originalEntry?: ElementGeometryDataEntry;\r\n geomParams?: GeometryParams;\r\n}\r\n\r\nfunction validateElementInfo(info: ElementGeometryInfo, expected: ExpectedElementGeometryEntry[], isWorld: boolean): void {\r\n assert.isTrue(undefined !== info.entryArray && expected.length === info.entryArray.length);\r\n const geomParams = (undefined !== info.categoryId ? new GeometryParams(info.categoryId) : undefined);\r\n\r\n info.entryArray.forEach((entry, i) => {\r\n assert.isTrue(expected[i].opcode === entry.opcode);\r\n\r\n if (ElementGeometry.isGeometryQueryEntry(entry)) {\r\n const geom = ElementGeometry.toGeometryQuery(entry);\r\n assert.exists(geom);\r\n\r\n if (undefined !== expected[i].geometryCategory) {\r\n assert.isTrue(expected[i].geometryCategory === geom?.geometryCategory);\r\n }\r\n\r\n if (undefined !== expected[i].geometrySubCategory) {\r\n switch (expected[i].geometryCategory) {\r\n case \"curvePrimitive\": {\r\n assert.isTrue(geom instanceof CurvePrimitive);\r\n assert.isTrue(expected[i].geometrySubCategory === (geom as CurvePrimitive).curvePrimitiveType);\r\n break;\r\n }\r\n case \"curveCollection\": {\r\n assert.isTrue(geom instanceof CurveCollection);\r\n assert.isTrue(expected[i].geometrySubCategory === (geom as CurveCollection).curveCollectionType);\r\n break;\r\n }\r\n case \"solid\": {\r\n assert.isTrue(geom instanceof SolidPrimitive);\r\n assert.isTrue(expected[i].geometrySubCategory === (geom as SolidPrimitive).solidPrimitiveType);\r\n break;\r\n }\r\n }\r\n }\r\n } else if (ElementGeometry.isGeometricEntry(entry)) {\r\n switch (entry.opcode) {\r\n case ElementGeometryOpcode.BRep:\r\n const brep = ElementGeometry.toBRep(entry);\r\n assert.exists(brep);\r\n if (!isWorld && undefined !== expected[i].originalEntry) {\r\n const other = ElementGeometry.toBRep(expected[i].originalEntry);\r\n assert.exists(other);\r\n // NOTE: Don't compare brep type; set from entity data by backend, ignored if supplied to update...\r\n const transform = Transform.fromJSON(brep?.transform);\r\n const otherTrans = Transform.fromJSON(other?.transform);\r\n assert.isTrue(transform.isAlmostEqual(otherTrans));\r\n const faceSymbLen = (undefined !== brep?.faceSymbology ? brep?.faceSymbology.length : 0);\r\n const otherSymbLen = (undefined !== other?.faceSymbology ? other?.faceSymbology.length : 0);\r\n assert.isTrue(faceSymbLen === otherSymbLen);\r\n }\r\n break;\r\n case ElementGeometryOpcode.TextString:\r\n const text = ElementGeometry.toTextString(entry);\r\n assert.exists(text);\r\n if (!isWorld && undefined !== expected[i].originalEntry) {\r\n const other = ElementGeometry.toTextString(expected[i].originalEntry);\r\n assert.exists(other);\r\n assert.isTrue(text?.font === other?.font);\r\n assert.isTrue(text?.text === other?.text);\r\n assert.isTrue(text?.bold === other?.bold);\r\n assert.isTrue(text?.italic === other?.italic);\r\n assert.isTrue(text?.underline === other?.underline);\r\n assert.isTrue(text?.height === other?.height);\r\n assert.isTrue(text?.widthFactor === other?.widthFactor);\r\n const origin = Point3d.fromJSON(text?.origin);\r\n const otherOrigin = Point3d.fromJSON(other?.origin);\r\n assert.isTrue(origin.isAlmostEqual(otherOrigin));\r\n const angles = YawPitchRollAngles.fromJSON(text?.rotation);\r\n const otherAngles = YawPitchRollAngles.fromJSON(other?.rotation);\r\n assert.isTrue(angles.isAlmostEqual(otherAngles));\r\n }\r\n break;\r\n case ElementGeometryOpcode.Image:\r\n const image = ElementGeometry.toImageGraphic(entry);\r\n assert.exists(image);\r\n if (!isWorld && undefined !== expected[i].originalEntry) {\r\n const other = ElementGeometry.toImageGraphic(expected[i].originalEntry);\r\n assert.exists(other);\r\n assert.isTrue(image?.textureId === other?.textureId);\r\n assert.isTrue(image?.hasBorder === other?.hasBorder);\r\n const corners = ImageGraphicCorners.fromJSON(image!.corners);\r\n const otherCorners = ImageGraphicCorners.fromJSON(other!.corners);\r\n assert.isTrue(corners[0].isAlmostEqual(otherCorners[0]));\r\n assert.isTrue(corners[1].isAlmostEqual(otherCorners[1]));\r\n assert.isTrue(corners[2].isAlmostEqual(otherCorners[2]));\r\n assert.isTrue(corners[3].isAlmostEqual(otherCorners[3]));\r\n }\r\n break;\r\n default:\r\n assert.isTrue(false);\r\n break;\r\n }\r\n } else if (ElementGeometryOpcode.SubGraphicRange === entry.opcode) {\r\n const subRange = ElementGeometry.toSubGraphicRange(entry);\r\n assert.exists(subRange);\r\n assert.isFalse(subRange?.isNull);\r\n } else if (ElementGeometryOpcode.PartReference === entry.opcode) {\r\n const partToElement = Transform.createIdentity();\r\n const part = ElementGeometry.toGeometryPart(entry, partToElement);\r\n assert.exists(part);\r\n if (!isWorld && undefined !== expected[i].originalEntry) {\r\n const otherToElement = Transform.createIdentity();\r\n const other = ElementGeometry.toGeometryPart(expected[i].originalEntry, otherToElement);\r\n assert.exists(other);\r\n assert.isTrue(partToElement.isAlmostEqual(otherToElement));\r\n }\r\n } else if (ElementGeometry.isAppearanceEntry(entry)) {\r\n if (undefined !== geomParams) {\r\n const updated = ElementGeometry.updateGeometryParams(entry, geomParams);\r\n assert.isTrue(updated);\r\n if (!isWorld && undefined !== expected[i].geomParams)\r\n assert.isTrue(geomParams.isEquivalent(expected[i].geomParams));\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction validateGeometricElementProps(info: ElementGeometryInfo, expected: GeometricElement3dProps): void {\r\n assert.isFalse(undefined === info.categoryId || undefined === info.sourceToWorld || undefined === info.bbox);\r\n assert.isTrue(expected.category === info.categoryId);\r\n const placement = Placement3d.fromJSON(expected.placement);\r\n const sourceToWorld = ElementGeometry.toTransform(info.sourceToWorld!);\r\n assert.exists(sourceToWorld);\r\n assert.isTrue(sourceToWorld?.isAlmostEqual(placement.transform));\r\n const bbox = ElementGeometry.toElementAlignedBox3d(info.bbox!);\r\n assert.isFalse(bbox?.isNull);\r\n}\r\n\r\nfunction doElementGeometryValidate(imodel: SnapshotDb, elementId: Id64String, expected: ExpectedElementGeometryEntry[], isWorld: boolean, elementProps?: GeometricElement3dProps, brepOpt?: number): IModelStatus {\r\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\r\n if (undefined !== elementProps)\r\n validateGeometricElementProps(info, elementProps);\r\n\r\n if (1 === brepOpt || 2 === brepOpt)\r\n assert.isTrue(info.brepsPresent);\r\n\r\n validateElementInfo(info, expected, isWorld);\r\n };\r\n\r\n const requestProps: ElementGeometryRequest = {\r\n onGeometry,\r\n elementId,\r\n };\r\n\r\n if (1 === brepOpt)\r\n requestProps.replaceBReps = true;\r\n else if (2 === brepOpt)\r\n requestProps.skipBReps = true;\r\n\r\n return imodel.elementGeometryRequest(requestProps);\r\n}\r\n\r\nfunction createGeometricElemFromSeed(imodel: SnapshotDb, seedId: Id64String, entryArray: ElementGeometryDataEntry[], placement?: Placement3dProps): Id64String {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(seedId);\r\n assert.exists(seedElement);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, placement);\r\n elementProps.elementGeometryBuilderParams = { entryArray };\r\n\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n return newId;\r\n}\r\n\r\ndescribe(\"GeometryStream\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"create GeometricElement3d using line codes 1-7\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n // init line code to line pixels array\r\n const lsCodes: LinePixels[] = [LinePixels.Solid, LinePixels.Code1, LinePixels.Code2, LinePixels.Code3, LinePixels.Code4, LinePixels.Code5, LinePixels.Code6, LinePixels.Code7];\r\n\r\n // create new line style definitions for line codes 1-7\r\n const lsStyles: Id64String[] = [];\r\n lsCodes.forEach((linePixels) => {\r\n lsStyles.push(LinePixels.Solid === linePixels ? Id64.invalid : LineStyleDefinition.Utils.getOrCreateLinePixelsStyle(imodel, IModel.dictionaryId, linePixels));\r\n });\r\n\r\n // get existing line style definitions for line codes 1-7\r\n const lsStylesExist: Id64String[] = [];\r\n lsCodes.forEach((linePixels) => {\r\n lsStylesExist.push(LinePixels.Solid === linePixels ? Id64.invalid : LineStyleDefinition.Utils.getOrCreateLinePixelsStyle(imodel, IModel.dictionaryId, linePixels));\r\n });\r\n\r\n // make sure we found existing styles and didn't create a second set\r\n assert.isTrue(8 === lsStyles.length && lsStyles.length === lsStylesExist.length);\r\n for (let iStyle = 0; iStyle < lsStyles.length; ++iStyle) {\r\n assert.isTrue(0 === iStyle || Id64.isValidId64(lsStyles[iStyle]));\r\n assert.isTrue(lsStylesExist[iStyle] === (lsStyles[iStyle]));\r\n }\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n const pointS = Point3d.createZero();\r\n const pointE = Point3d.create(5, 0, 0);\r\n\r\n lsStyles.forEach((styleId) => {\r\n params.styleInfo = Id64.isValidId64(styleId) ? new LineStyle.Info(styleId) : undefined;\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(pointS, pointE));\r\n pointS.y += 0.5;\r\n pointE.y += 0.5;\r\n });\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned...\r\n const value = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itNextCheck = new GeometryStreamIterator(value.geom!, value.category);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isFalse(itNextCheck.next().done);\r\n assert.isTrue(itNextCheck.next().done);\r\n\r\n const lsStylesUsed: Id64String[] = [];\r\n const it = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of it) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n lsStylesUsed.push(entry.geomParams.styleInfo ? entry.geomParams.styleInfo.styleId : Id64.invalid);\r\n }\r\n\r\n // Make sure we extracted same style information after round trip...\r\n assert.isTrue(lsStyles.length === lsStylesUsed.length);\r\n for (let iStyle = 0; iStyle < lsStyles.length; ++iStyle) {\r\n assert.isTrue(lsStylesUsed[iStyle] === (lsStyles[iStyle]));\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d using continuous style\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n // create special \"internal default\" continuous style for drawing curves using width overrides\r\n const styleId = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // make sure we found existing style and didn't create a new one\r\n const styleIdExists = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId);\r\n assert.isTrue(Id64.isValidId64(styleIdExists) && styleIdExists === (styleId));\r\n\r\n // create continuous style with pre-defined constant width\r\n const styleIdWidth = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId, 0.05);\r\n assert.isTrue(Id64.isValidId64(styleIdWidth));\r\n\r\n // make sure we found existing style and didn't create a new one\r\n const styleIdWidthExists = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId, 0.05);\r\n assert.isTrue(Id64.isValidId64(styleIdWidthExists) && styleIdWidthExists === (styleIdWidth));\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n const styles: Id64String[] = [styleId, styleId, styleIdWidth, styleIdWidth];\r\n const widths: number[] = [0.0, 0.025, 0.0, 0.075];\r\n\r\n // add line using 0 width continuous style\r\n params.styleInfo = new LineStyle.Info(styles[0]);\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.create(0, 0, 0), Point3d.create(0, 5, 0)));\r\n\r\n // add line with width override, undefined endWidth = startWidth, needed solely for taper\r\n params.styleInfo.styleMod = new LineStyle.Modifier({ startWidth: widths[1], physicalWidth: true });\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.create(0.5, 0, 0), Point3d.create(0.5, 5, 0)));\r\n\r\n // add line using pre-defined width continuous style\r\n params.styleInfo = new LineStyle.Info(styles[2]);\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.create(1.0, 0, 0), Point3d.create(1.0, 5, 0)));\r\n\r\n // add line with width override, undefined endWidth = startWidth, needed solely for taper\r\n params.styleInfo.styleMod = new LineStyle.Modifier({ startWidth: widths[3], physicalWidth: true });\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.create(1.5, 0, 0), Point3d.create(1.5, 5, 0)));\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned...\r\n const value = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const stylesUsed: Id64String[] = [];\r\n const widthsUsed: number[] = [];\r\n const it = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of it) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n assert.isDefined(entry.geomParams.styleInfo);\r\n stylesUsed.push(entry.geomParams.styleInfo!.styleId);\r\n widthsUsed.push(entry.geomParams.styleInfo!.styleMod !== undefined ? entry.geomParams.styleInfo!.styleMod.startWidth! : 0.0);\r\n }\r\n\r\n // Make sure we extracted same style information after round trip...\r\n assert.isTrue(styles.length === stylesUsed.length);\r\n for (let iStyle = 0; iStyle < styles.length; ++iStyle) {\r\n assert.isTrue(stylesUsed[iStyle] === (styles[iStyle]));\r\n assert.isTrue(Geometry.isSameCoordinate(widthsUsed[iStyle], widths[iStyle]));\r\n }\r\n });\r\n\r\n function createGeometricElem3dUsingArrowHeadNoStrokePattern(definitionModelId?: Id64String, physicalModelId?: Id64String) {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n if (definitionModelId === undefined)\r\n definitionModelId = IModel.dictionaryId;\r\n\r\n if (physicalModelId === undefined)\r\n physicalModelId = seedElement.model;\r\n\r\n const partBuilder = new GeometryStreamBuilder();\r\n const partParams = new GeometryParams(Id64.invalid); // category won't be used\r\n\r\n partParams.fillDisplay = FillDisplay.Always;\r\n partBuilder.appendGeometryParamsChange(partParams);\r\n partBuilder.appendGeometry(Loop.create(LineString3d.create(Point3d.create(0.1, 0, 0), Point3d.create(0, -0.05, 0), Point3d.create(0, 0.05, 0), Point3d.create(0.1, 0, 0))));\r\n\r\n const partProps = createGeometryPartProps(partBuilder.geometryStream, definitionModelId);\r\n const partId = imodel.elements.insertElement(partProps);\r\n assert.isTrue(Id64.isValidId64(partId));\r\n\r\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId }); // base and size will be set automatically...\r\n assert.isTrue(undefined !== pointSymbolData);\r\n\r\n // Use internal default instead of creating a stroke component for a solid line\r\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: \"TestArrowHead\", lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveEnd }] });\r\n assert.isTrue(undefined !== strokePointData);\r\n\r\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\r\n assert.isTrue(undefined !== compoundData);\r\n\r\n const styleId = LineStyleDefinition.Utils.createStyle(imodel, definitionModelId, \"TestArrowStyle\", compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n params.styleInfo = new LineStyle.Info(styleId);\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(-1, -1, 0)));\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream, physicalModelId);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId, styleId])!;\r\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\r\n assert.isTrue(usageInfo.lineStyleIds!.includes(styleId));\r\n assert.isTrue(usageInfo.usedIds!.includes(partId));\r\n assert.isTrue(usageInfo.usedIds!.includes(styleId));\r\n }\r\n\r\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern\", async () => {\r\n createGeometricElem3dUsingArrowHeadNoStrokePattern();\r\n });\r\n\r\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern - deleteElementTree fails\", async () => {\r\n const mySubject = Subject.insert(imodel, IModel.rootSubjectId, \"My Subject - fails\");\r\n const myDefModel = DefinitionModel.insert(imodel, mySubject, \"My Definitions - fails\");\r\n const myPhysicalModel = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), false, mySubject)[0];\r\n\r\n createGeometricElem3dUsingArrowHeadNoStrokePattern(myDefModel, myPhysicalModel);\r\n\r\n deleteElementTree({ iModel: imodel, topElement: mySubject, maxPasses: 1 });\r\n expect(imodel.elements.tryGetElement(mySubject)).not.undefined;\r\n });\r\n\r\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern - deleteElementTree succeeds with 2 passes\", async () => {\r\n const mySubject = Subject.insert(imodel, IModel.rootSubjectId, \"My Subject - success\");\r\n const myDefModel = DefinitionModel.insert(imodel, mySubject, \"My Definitions - success\");\r\n const myPhysicalModel = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), false, mySubject)[0];\r\n\r\n createGeometricElem3dUsingArrowHeadNoStrokePattern(myDefModel, myPhysicalModel);\r\n\r\n deleteElementTree({ iModel: imodel, topElement: mySubject, maxPasses: 2 });\r\n expect(imodel.elements.tryGetElement(mySubject)).undefined;\r\n });\r\n\r\n it(\"create GeometricElement3d using compound style with dash widths and symbol\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const lsStrokes: LineStyleDefinition.Strokes = [];\r\n lsStrokes.push({ length: 0.25, orgWidth: 0.0, endWidth: 0.025, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Left });\r\n lsStrokes.push({ length: 0.1 });\r\n lsStrokes.push({ length: 0.1, orgWidth: 0.025, endWidth: 0.025, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full });\r\n lsStrokes.push({ length: 0.1 });\r\n lsStrokes.push({ length: 0.25, orgWidth: 0.025, endWidth: 0.0, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Right });\r\n lsStrokes.push({ length: 0.1 });\r\n\r\n const strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: \"TestDashDotDashLineCode\", strokes: lsStrokes });\r\n assert.isTrue(undefined !== strokePatternData);\r\n\r\n const partBuilder = new GeometryStreamBuilder();\r\n partBuilder.appendGeometry(Arc3d.createXY(Point3d.createZero(), 0.05));\r\n\r\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\r\n const partId = imodel.elements.insertElement(partProps);\r\n assert.isTrue(Id64.isValidId64(partId));\r\n\r\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId }); // base and size will be set automatically...\r\n assert.isTrue(undefined !== pointSymbolData);\r\n\r\n const lsSymbols: LineStyleDefinition.Symbols = [];\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n\r\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: \"TestGapSymbolsLinePoint\", lcId: strokePatternData.compId, symbols: lsSymbols });\r\n assert.isTrue(undefined !== strokePointData);\r\n\r\n const lsComponents: LineStyleDefinition.Components = [];\r\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\r\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\r\n\r\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\r\n assert.isTrue(undefined !== compoundData);\r\n\r\n const styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, \"TestDashCircleDotCircleDashStyle\", compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n params.styleInfo = new LineStyle.Info(styleId);\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(5, 5, 0)));\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId, styleId, seedElement.category])!;\r\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\r\n assert.isTrue(usageInfo.lineStyleIds!.includes(styleId));\r\n assert.isTrue(usageInfo.spatialCategoryIds!.includes(seedElement.category));\r\n assert.isTrue(usageInfo.usedIds!.includes(partId));\r\n assert.isTrue(usageInfo.usedIds!.includes(styleId));\r\n assert.isTrue(usageInfo.usedIds!.includes(seedElement.category));\r\n });\r\n\r\n it(\"create GeometricElement3d with line styles to check bounding box padding\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n // LineStyleDefinition: create special \"internal default\" continuous style for drawing curves using width overrides\r\n let x = 0.0;\r\n let y = 0.0;\r\n let unitDef = 1.0;\r\n let widthDef = 0.0;\r\n let name = `Continuous-${unitDef}-${widthDef}`;\r\n let styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: 0, compType: LineStyleDefinition.ComponentType.Internal, flags: LineStyleDefinition.StyleFlags.Continuous | LineStyleDefinition.StyleFlags.NoSnap });\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect no range padding...\r\n let newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0));\r\n\r\n // Expect range padded by 0.25...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // LineStyleDefinition: create continuous style with both width and unit scale specified in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 2.0;\r\n widthDef = 0.5;\r\n name = `Continuous-${unitDef}-${widthDef}`;\r\n let strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: [{ length: 1e37, orgWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full }] });\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.Continuous | LineStyleDefinition.StyleFlags.NoSnap, unitDef });\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect no range padding...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.0, physicalWidth: true })));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0));\r\n\r\n // Expect range padded by 1.0...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\r\n\r\n // Expect range padded by 0.25...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // LineStyleDefinition: create stroke pattern with dash widths in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 1.0;\r\n widthDef = 0.025;\r\n name = `StrokePattern-${unitDef}-${widthDef}`;\r\n const lsStrokes: LineStyleDefinition.Strokes = [];\r\n lsStrokes.push({ length: 0.25, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Left });\r\n lsStrokes.push({ length: 0.1 });\r\n lsStrokes.push({ length: 0.2, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full });\r\n lsStrokes.push({ length: 0.1 });\r\n lsStrokes.push({ length: 0.25, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Right });\r\n lsStrokes.push({ length: 0.1 });\r\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.NoSnap });\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.025...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\r\n\r\n // Expect range padded by 0.25...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // LineStyleDefinition: create stroke pattern with dash widths and unit scale specified in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 2.0;\r\n widthDef = 0.025;\r\n name = `StrokePattern-${unitDef}-${widthDef}`;\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.NoSnap, unitDef });\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.05...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\r\n\r\n // Expect range padded by 0.25...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // Expect range padded by 0.25...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, scale: 0.5, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // Expect range padded by 0.025...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.blue);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef * 0.5));\r\n\r\n // LineStyleDefinition: create point symbol with internal default instead of a stroke pattern...\r\n x = 0.0;\r\n y++;\r\n unitDef = 1.0;\r\n widthDef = 1.0;\r\n name = `PointSymbol-${unitDef}-${widthDef}`;\r\n const partId = createCirclePart(0.25, imodel);\r\n let pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId });\r\n let strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveOrigin }] });\r\n let compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.5 (circle radius)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\r\n\r\n // Expect range padded by 0.25 (scaled circle radius)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\r\n\r\n // Expect range padded by 1.0 (width override > symbol size)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 1.0, scale: 0.5, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 1.0));\r\n\r\n // LineStyleDefinition: create scaling point symbol with stroke pattern with width and unit scale specified in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 0.5;\r\n widthDef = 0.025; // value used for lsStrokes...\r\n name = `PointSymbol-${unitDef}-${widthDef}}`;\r\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\r\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0 });\r\n const lsSymbols: LineStyleDefinition.Symbols = [];\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\r\n const lsComponents: LineStyleDefinition.Components = [];\r\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\r\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\r\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\r\n compoundData.unitDef = unitDef;\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.125 (symbol and unit scaled circle radius)......\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.125));\r\n\r\n // Expect range padded by 0.0625 (symbol and modifier scaled circle radius)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0625));\r\n\r\n // Expect range padded by 0.75 (width override > symbol and modifier scaled symbol size)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\r\n\r\n // LineStyleDefinition: create non-scaling point symbol with stroke pattern with width and unit scale specified in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 0.5;\r\n widthDef = 0.025; // value used for lsStrokes...\r\n name = `NonScalingPointSymbol-${unitDef}-${widthDef}}`;\r\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\r\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0, symFlags: LineStyleDefinition.PointSymbolFlags.NoScale });\r\n lsSymbols.length = 0;\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\r\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\r\n lsComponents.length = 0;\r\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\r\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\r\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\r\n compoundData.unitDef = unitDef;\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.5 (circle radius)......\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\r\n\r\n // Expect range padded by 0.5 (unscaled circle radius)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\r\n\r\n // Expect range padded by 0.75 (width override > unscaled symbol size)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\r\n\r\n // LineStyleDefinition: create scaling point symbol with offsets with stroke pattern with width and unit scale specified in definition...\r\n x = 0.0;\r\n y++;\r\n unitDef = 0.5;\r\n widthDef = 0.025; // value used for lsStrokes...\r\n name = `OffsetPointSymbol-${unitDef}-${widthDef}}`;\r\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\r\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0 });\r\n lsSymbols.length = 0;\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center, yOffset: -0.1 });\r\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center, yOffset: 0.1 });\r\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\r\n lsComponents.length = 0;\r\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\r\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\r\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\r\n compoundData.unitDef = unitDef;\r\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\r\n assert.isTrue(Id64.isValidId64(styleId));\r\n\r\n // Expect range padded by 0.225 (offset symbol and unit scaled circle radius)......\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.225));\r\n\r\n // Expect range padded by 0.1125 (offset symbol and modifier scaled circle radius)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.1125));\r\n\r\n // Expect range padded by 0.75 (width override > symbol and modifier scaled symbol size)...\r\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\r\n });\r\n\r\n it(\"create GeometricElement3d using shapes with fill/gradient\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n builder.appendGeometryRanges(); // Test inclusion of local ranges...\r\n\r\n const xOffset = Transform.createTranslation(Point3d.create(1.5));\r\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\r\n\r\n // No fill...\r\n params.lineColor = ColorDef.green;\r\n params.weight = 5;\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(shape);\r\n\r\n // Opaque fill by view...\r\n params.fillDisplay = FillDisplay.ByView;\r\n params.fillColor = params.lineColor;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Outline fill by view...\r\n params.fillColor = ColorDef.red;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Outline transparency fill always...\r\n params.fillDisplay = FillDisplay.Always;\r\n params.fillTransparency = 0.75;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Opaque background fill always...\r\n params.backgroundFill = BackgroundFill.Solid;\r\n params.fillTransparency = 0.0;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Outline background fill always...\r\n params.backgroundFill = BackgroundFill.Outline;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Opaque gradient by view...\r\n params.fillDisplay = FillDisplay.ByView;\r\n params.gradient = new Gradient.Symb();\r\n params.gradient.mode = Gradient.Mode.Linear;\r\n params.gradient.flags = Gradient.Flags.Invert;\r\n params.gradient.keys.push(new Gradient.KeyColor({ value: 0.0, color: ColorDef.blue.toJSON() }));\r\n params.gradient.keys.push(new Gradient.KeyColor({ value: 0.5, color: ColorDef.red.toJSON() }));\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Outline gradient by view...Display issue, changes to gradient being ignored???\r\n params.gradient.flags = Gradient.Flags.Outline;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned...\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n let iShape = 0;\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n switch (iShape++) {\r\n case 0:\r\n assert.isTrue(undefined === entry.geomParams.fillDisplay || FillDisplay.Never === entry.geomParams.fillDisplay);\r\n break;\r\n case 1:\r\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\r\n assert.isTrue(entry.geomParams.lineColor!.equals(entry.geomParams.fillColor!));\r\n break;\r\n case 2:\r\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\r\n assert.isFalse(entry.geomParams.lineColor!.equals(entry.geomParams.fillColor!));\r\n break;\r\n case 3:\r\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\r\n assert.isFalse(0.0 === entry.geomParams.fillTransparency);\r\n break;\r\n case 4:\r\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\r\n assert.isTrue(BackgroundFill.Solid === entry.geomParams.backgroundFill);\r\n break;\r\n case 5:\r\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\r\n assert.isTrue(BackgroundFill.Outline === entry.geomParams.backgroundFill);\r\n break;\r\n case 6:\r\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\r\n assert.isDefined(entry.geomParams.gradient);\r\n assert.isTrue(0 === (Gradient.Flags.Outline & entry.geomParams.gradient!.flags));\r\n break;\r\n case 7:\r\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\r\n assert.isDefined(entry.geomParams.gradient);\r\n assert.isFalse(0 === (Gradient.Flags.Outline & entry.geomParams.gradient!.flags));\r\n break;\r\n }\r\n }\r\n assert.isTrue(8 === iShape);\r\n });\r\n\r\n it(\"create GeometricElement3d using shapes with patterns\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n builder.appendGeometryRanges(); // Test inclusion of local ranges...\r\n\r\n const xOffset = Transform.createTranslation(Point3d.create(1.5));\r\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\r\n\r\n // Hatch w/o overrides\r\n params.lineColor = ColorDef.create(ColorByName.yellow);\r\n params.weight = 5;\r\n params.pattern = new AreaPattern.Params();\r\n params.pattern.space1 = 0.05;\r\n params.pattern.angle1 = Angle.createDegrees(45.0);\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(shape);\r\n\r\n // Cross hatch with color/weight override\r\n params.pattern.space2 = 0.1;\r\n params.pattern.angle2 = Angle.createDegrees(-30.0);\r\n params.pattern.color = ColorDef.red;\r\n params.pattern.weight = 0;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n const partBuilder = new GeometryStreamBuilder();\r\n partBuilder.appendGeometry(Arc3d.createXY(Point3d.createZero(), 0.05));\r\n\r\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\r\n const partId = imodel.elements.insertElement(partProps);\r\n assert.isTrue(Id64.isValidId64(partId));\r\n\r\n // Area pattern w/o overrides\r\n params.pattern = new AreaPattern.Params();\r\n params.pattern.symbolId = partId;\r\n params.pattern.space1 = params.pattern.space2 = 0.05;\r\n params.pattern.angle1 = Angle.createDegrees(45.0);\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Area pattern with color/weight overrides, snappable geometry, and invisible boundary\r\n params.pattern.origin = Point3d.create(0.05, 0.05, 0.0);\r\n params.pattern.space1 = params.pattern.space2 = params.pattern.angle1 = undefined;\r\n params.pattern.color = ColorDef.red;\r\n params.pattern.weight = 1;\r\n params.pattern.snappable = params.pattern.invisibleBoundary = true;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Hatch definition w/o overrides (zig-zag)\r\n const defLines: AreaPattern.HatchDefLine[] = [\r\n { offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\r\n { angle: Angle.createDegrees(90.0), through: Point2d.create(0.1, 0.0), offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\r\n ];\r\n\r\n params.pattern = new AreaPattern.Params();\r\n params.pattern.defLines = defLines;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n // Hatch definition with color/weight overrides\r\n params.pattern.color = ColorDef.red;\r\n params.pattern.weight = 1;\r\n builder.appendGeometryParamsChange(params);\r\n shape.tryTransformInPlace(xOffset);\r\n builder.appendGeometry(shape);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned...\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n let iShape = 0;\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n assert.isDefined(entry.geomParams.pattern);\r\n switch (iShape++) {\r\n case 0:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.space1 && undefined !== entry.geomParams.pattern!.angle1 && undefined === entry.geomParams.pattern!.space2 && undefined === entry.geomParams.pattern!.angle2);\r\n break;\r\n case 1:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.space1 && undefined !== entry.geomParams.pattern!.angle1 && undefined !== entry.geomParams.pattern!.space2 && undefined !== entry.geomParams.pattern!.angle2);\r\n break;\r\n case 2:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.symbolId && undefined === entry.geomParams.pattern!.color);\r\n break;\r\n case 3:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.symbolId && undefined !== entry.geomParams.pattern!.color);\r\n break;\r\n case 4:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.defLines && undefined === entry.geomParams.pattern!.color);\r\n break;\r\n case 5:\r\n assert.isTrue(undefined !== entry.geomParams.pattern!.defLines && undefined !== entry.geomParams.pattern!.color);\r\n break;\r\n }\r\n }\r\n assert.isTrue(6 === iShape);\r\n\r\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId])!;\r\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\r\n assert.isTrue(usageInfo.usedIds!.includes(partId));\r\n });\r\n\r\n it(\"create GeometricElement3d with material and sub-category\", async () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n\r\n const subCategory = SubCategory.create(imodel, seedElement.category, \"testSubCat\", { weight: 2 });\r\n const subCategoryId = imodel.elements.insertElement(subCategory.toJSON());\r\n imodel.saveChanges();\r\n\r\n const params = new GeometryParams(seedElement.category);\r\n params.subCategoryId = subCategoryId;\r\n params.materialId = \"0x5\";\r\n\r\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\r\n\r\n // Test flatbuffer roundtrip...\r\n const builderF = new ElementGeometry.Builder();\r\n builderF.appendGeometryParamsChange(params);\r\n builderF.appendGeometryQuery(shape);\r\n\r\n const elementPropsF = createPhysicalElementProps(seedElement);\r\n elementPropsF.elementGeometryBuilderParams = { entryArray: builderF.entries };\r\n\r\n const newIdF = imodel.elements.insertElement(elementPropsF);\r\n assert.isTrue(Id64.isValidId64(newIdF));\r\n imodel.saveChanges();\r\n\r\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray);\r\n const it = new ElementGeometry.Iterator(info);\r\n\r\n for (const entry of it) {\r\n if (ElementGeometry.isGeometryQueryEntry(entry.value)) {\r\n assert.isTrue(params.subCategoryId === entry.geomParams.subCategoryId && params.materialId === entry.geomParams.materialId);\r\n }\r\n };\r\n };\r\n\r\n const status = imodel.elementGeometryRequest({ elementId: newIdF, onGeometry });\r\n assert(IModelStatus.Success === status)\r\n\r\n // Test JSON roundtrip...\r\n const builderJ = new GeometryStreamBuilder();\r\n builderJ.appendGeometryParamsChange(params);\r\n builderJ.appendGeometry(shape);\r\n\r\n const elementPropsJ = createPhysicalElementProps(seedElement);\r\n elementPropsJ.geom = builderJ.geometryStream;\r\n\r\n const newIdJ = imodel.elements.insertElement(elementPropsJ);\r\n assert.isTrue(Id64.isValidId64(newIdJ));\r\n imodel.saveChanges();\r\n\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newIdJ, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n assert.isTrue(params.subCategoryId === entry.geomParams.subCategoryId && params.materialId === entry.geomParams.materialId);\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d from world coordinate text using a newly added font\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const foundFont = imodel.fonts.findId({ name: \"Vera\" })!;\r\n assert.exists(foundFont);\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\r\n const builder = new GeometryStreamBuilder();\r\n\r\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform...\r\n\r\n const textProps: TextStringProps = {\r\n text: \"ABC\",\r\n font: foundFont,\r\n height: 2,\r\n bold: true,\r\n origin: testOrigin,\r\n rotation: testAngles,\r\n };\r\n\r\n const textString = new TextString(textProps);\r\n const status = builder.appendTextString(textString);\r\n assert.isTrue(status);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned, text transform should now be identity as it is accounted for by element's placement...\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n let gotHeader = false;\r\n for (const entry of value.geom!) {\r\n expect(undefined === entry.header).to.equal(gotHeader);\r\n if (undefined !== entry.header) {\r\n gotHeader = true;\r\n } else {\r\n assert.isDefined(entry.textString);\r\n const origin = Point3d.fromJSON(entry.textString!.origin);\r\n const rotation = YawPitchRollAngles.fromJSON(entry.textString!.rotation);\r\n assert.isTrue(origin.isAlmostZero);\r\n assert.isTrue(rotation.isIdentity());\r\n }\r\n }\r\n\r\n expect(gotHeader).to.be.true;\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assertTrue(entry.primitive.type === \"textString\");\r\n assert.isTrue(entry.primitive.textString.origin.isAlmostZero);\r\n assert.isTrue(entry.primitive.textString.rotation.isIdentity());\r\n }\r\n\r\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(value as GeometricElement3dProps);\r\n for (const entry of itWorld) {\r\n assertTrue(entry.primitive.type === \"textString\");\r\n assert.isTrue(entry.primitive.textString.origin.isAlmostEqual(testOrigin));\r\n assert.isTrue(entry.primitive.textString.rotation.isAlmostEqual(testAngles));\r\n }\r\n });\r\n\r\n it(\"create GeometryPart from arcs\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const geomArray: Arc3d[] = [\r\n Arc3d.createXY(Point3d.create(0, 0), 5),\r\n Arc3d.createXY(Point3d.create(5, 5), 2),\r\n Arc3d.createXY(Point3d.create(-5, -5), 20),\r\n ];\r\n\r\n const partBuilder = new GeometryStreamBuilder();\r\n\r\n for (const geom of geomArray) {\r\n partBuilder.appendGeometry(geom);\r\n }\r\n\r\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\r\n const testPart = imodel.elements.createElement(partProps);\r\n const partId = imodel.elements.insertElement(testPart.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: partId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const geomArrayOut: Arc3d[] = [];\r\n const itLocal = GeometryStreamIterator.fromGeometryPart(value as GeometryPartProps);\r\n for (const entry of itLocal) {\r\n assertTrue(entry.primitive.type === \"geometryQuery\");\r\n assertTrue(entry.primitive.geometry instanceof Arc3d);\r\n geomArrayOut.push(entry.primitive.geometry);\r\n }\r\n\r\n assert.isTrue(geomArrayOut.length === geomArray.length);\r\n for (let i = 0; i < geomArrayOut.length; i++) {\r\n assert.isTrue(geomArrayOut[i].isAlmostEqual(geomArray[i]));\r\n }\r\n\r\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId])!;\r\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\r\n assert.isUndefined(usageInfo.usedIds, \"GeometryPart should not to be used by any GeometricElement\");\r\n });\r\n\r\n it(\"create GeometricElement3d from arcs\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const geomArray: Arc3d[] = [\r\n Arc3d.createXY(Point3d.create(0, 0), 5),\r\n Arc3d.createXY(Point3d.create(5, 5), 2),\r\n Arc3d.createXY(Point3d.create(-5, -5), 20),\r\n ];\r\n\r\n const builder = new GeometryStreamBuilder();\r\n\r\n for (const geom of geomArray) {\r\n builder.appendGeometry(geom);\r\n }\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const geomArrayOut: Arc3d[] = [];\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assertTrue(entry.primitive.type === \"geometryQuery\");\r\n assertTrue(entry.primitive.geometry instanceof Arc3d);\r\n geomArrayOut.push(entry.primitive.geometry);\r\n }\r\n\r\n assert.isTrue(geomArrayOut.length === geomArray.length);\r\n for (let i = 0; i < geomArrayOut.length; i++) {\r\n assert.isTrue(geomArrayOut[i].isAlmostEqual(geomArray[i]));\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d partToWorld test\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const arc = Arc3d.createXY(Point3d.create(0, 0), 1);\r\n const partBuilder = new GeometryStreamBuilder();\r\n\r\n partBuilder.appendGeometry(arc);\r\n\r\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\r\n const testPart = imodel.elements.createElement(partProps);\r\n const partId = imodel.elements.insertElement(testPart.toJSON());\r\n imodel.saveChanges();\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const shapePts: Point3d[] = [Point3d.create(1, 1, 0), Point3d.create(2, 1, 0), Point3d.create(2, 2, 0), Point3d.create(1, 2, 0)];\r\n const testOrigin = Point3d.create(0.5, 0.5, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\r\n\r\n builder.setLocalToWorld3d(testOrigin, testAngles);\r\n builder.appendGeometry(Loop.create(LineString3d.create(shapePts)));\r\n shapePts.forEach((pt) => builder.appendGeometryPart3d(partId, pt, undefined, 0.25)); // Position part (arc center) at each vertex...\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned\r\n const valueElem = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(valueElem.geom);\r\n\r\n const outPts: Point3d[] = [];\r\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(valueElem);\r\n for (const entry of itWorld) {\r\n if (\"partReference\" !== entry.primitive.type)\r\n continue;\r\n assertTrue(partId === entry.primitive.part.id);\r\n const valuePart = imodel.elements.getElementProps<GeometryPartProps>({ id: entry.primitive.part.id, wantGeometry: true });\r\n assert.isDefined(valuePart.geom);\r\n\r\n const itWorldPart = GeometryStreamIterator.fromGeometryPart(valuePart, undefined, itWorld.partToWorld());\r\n for (const partEntry of itWorldPart) {\r\n assertTrue(partEntry.primitive.type === \"geometryQuery\");\r\n assertTrue(partEntry.primitive.geometry instanceof Arc3d);\r\n outPts.push(partEntry.primitive.geometry.center);\r\n }\r\n }\r\n\r\n assert.isTrue(outPts.length === shapePts.length);\r\n for (let i = 0; i < outPts.length; i++) {\r\n assert.isTrue(outPts[i].isAlmostEqual(shapePts[i]));\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d wire format appearance check\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\r\n\r\n params.fillDisplay = FillDisplay.ByView;\r\n builder.appendGeometryParamsChange(params);\r\n builder.appendGeometry(shape);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned...\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\r\n }\r\n\r\n const geometryStream: GeometryStreamProps = [];\r\n\r\n geometryStream.push({ header: { flags: 0 } });\r\n geometryStream.push({ appearance: {} }); // Native ToJson should add appearance entry with no defined values for this case...\r\n geometryStream.push({ fill: { display: FillDisplay.ByView } });\r\n geometryStream.push({ loop: [{ lineString: [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 0]] }] });\r\n\r\n const fromBuilder = JSON.stringify(builder.geometryStream);\r\n const fromElProps = JSON.stringify(value.geom);\r\n const fromScratch = JSON.stringify(geometryStream);\r\n\r\n assert.isTrue(undefined !== builder.geometryStream[0].appearance && builder.geometryStream[0].appearance.subCategory === IModel.getDefaultSubCategoryId(value.category)); // Ensure default sub-category is specified...\r\n assert.isTrue(fromElProps !== fromBuilder); // Should not match, default sub-category should not be persisted...\r\n assert.isTrue(fromElProps === fromScratch);\r\n });\r\n\r\n it(\"create GeometricElement3d from world coordinate brep data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\r\n const builder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(seedElement.category);\r\n\r\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform...\r\n\r\n params.lineColor = ColorDef.red;\r\n params.weight = 2;\r\n builder.appendGeometryParamsChange(params);\r\n\r\n const brepProps = createBRepDataProps(testOrigin, testAngles);\r\n builder.appendBRepData(brepProps);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true, wantBRepData: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.equal(entry.primitive.type, \"brep\");\r\n }\r\n\r\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(value as GeometricElement3dProps);\r\n for (const entry of itWorld) {\r\n assert.equal(entry.primitive.type, \"brep\");\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d with local coordinate indexed polyface json data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const xOffset = Transform.createTranslation(Point3d.create(2.5));\r\n const builder = new GeometryStreamBuilder();\r\n\r\n // NOTE: It's a good idea to request sub-graphic ranges when adding multiple \"large\" polyfaces to a geometry stream...\r\n builder.appendGeometryRanges();\r\n\r\n const polyface = createIndexedPolyface(5.0);\r\n builder.appendGeometry(polyface);\r\n\r\n polyface.tryTransformInPlace(xOffset); // translate in x...\r\n builder.appendGeometry(polyface);\r\n\r\n polyface.tryTransformInPlace(xOffset); // translate in x again...\r\n builder.appendGeometry(polyface);\r\n\r\n // NOTE: For time comparison with ElementGeometry: create GeometricElement3d with local coordinate indexed polyface flatbuffer data\r\n let timer = new Timer(\"createGeometricElem\");\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const newId = createGeometricElem(builder.geometryStream, { origin: testOrigin, angles: testAngles }, imodel, seedElement);\r\n timer.end();\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n timer = new Timer(\"queryGeometricElem\");\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assert.isTrue(entry.geomParams.categoryId === seedElement.category); // Current appearance information (default sub-category appearance in this case)...\r\n assert.isTrue(undefined !== entry.localRange && !entry.localRange.isNull); // Make sure sub-graphic ranges were added...\r\n\r\n assertTrue(entry.primitive.type === \"geometryQuery\");\r\n assertTrue(entry.primitive.geometry instanceof IndexedPolyface);\r\n\r\n const polyOut = entry.primitive.geometry;\r\n assert.isTrue(polyOut.pointCount === polyface.pointCount);\r\n assert.isTrue(polyOut.paramCount === polyface.paramCount);\r\n assert.isTrue(polyOut.normalCount === polyface.normalCount);\r\n }\r\n timer.end();\r\n });\r\n\r\n it(\"should preserve header with flags\", () => {\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(Arc3d.createXY(Point3d.create(0, 0), 5));\r\n\r\n const roundTrip = () => {\r\n const iter = new GeometryStreamIterator(builder.geometryStream);\r\n expect((iter.flags === GeometryStreamFlags.ViewIndependent)).to.equal(builder.isViewIndependent);\r\n\r\n const partProps = createGeometryPartProps(builder.geometryStream);\r\n const part = imodel.elements.createElement(partProps);\r\n const partId = imodel.elements.insertElement(part.toJSON());\r\n imodel.saveChanges();\r\n\r\n const json = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\r\n expect(json.geom).not.to.be.undefined;\r\n expect(json.geom!.length).to.equal(2);\r\n expect(json.geom![0].header).not.to.be.undefined;\r\n const flags = json.geom![0].header!.flags;\r\n expect(flags).to.equal(builder.isViewIndependent ? GeometryStreamFlags.ViewIndependent : GeometryStreamFlags.None);\r\n\r\n if (undefined !== builder.getHeader())\r\n expect(JSON.stringify(builder.geometryStream[0])).to.equal(JSON.stringify(json.geom![0]));\r\n };\r\n\r\n expect(builder.getHeader()).to.be.undefined;\r\n expect(builder.isViewIndependent).to.be.false;\r\n roundTrip();\r\n\r\n builder.isViewIndependent = false;\r\n expect(builder.getHeader()).to.be.undefined;\r\n expect(builder.isViewIndependent).to.be.false;\r\n roundTrip();\r\n\r\n builder.isViewIndependent = true;\r\n expect(builder.getHeader()).not.to.be.undefined;\r\n expect(builder.isViewIndependent).to.be.true;\r\n roundTrip();\r\n\r\n builder.isViewIndependent = false;\r\n expect(builder.getHeader()).not.to.be.undefined;\r\n expect(builder.isViewIndependent).to.be.false;\r\n });\r\n});\r\n\r\ndescribe(\"ElementGeometry\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"Exercise using builder/iterator in world coordinates with flatbuffer data\", async () => {\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n pts.push(Point3d.create(10, 15, 0));\r\n pts.push(Point3d.create(5, 15, 0));\r\n pts.push(pts[0].clone());\r\n\r\n const builder = new ElementGeometry.Builder();\r\n const primitive = LineString3d.create(pts);\r\n\r\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform for append...\r\n const status = builder.appendGeometryQuery(primitive);\r\n assert.isTrue(status);\r\n\r\n const it = new ElementGeometry.Iterator({ entryArray: builder.entries }, undefined, builder.localToWorld);\r\n it.requestWorldCoordinates(); // Apply local to world to entries...\r\n\r\n for (const entry of it) {\r\n const geom = entry.toGeometryQuery();\r\n assert.exists(geom);\r\n assertTrue(geom instanceof LineString3d);\r\n assert.isTrue(Point3dArray.isAlmostEqual(pts, geom.points));\r\n }\r\n });\r\n\r\n it(\"request geometry stream flatbuffer data from existing element\", async () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [{ opcode: ElementGeometryOpcode.SolidPrimitive, geometryCategory: \"solid\", geometrySubCategory: \"sphere\" }];\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, \"0x1d\", expected, false));\r\n });\r\n\r\n it(\"create GeometricElement3d from local coordinate point and arc primitive flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n pts.push(Point3d.create(10, 15, 0));\r\n pts.push(Point3d.create(5, 15, 0));\r\n pts.push(pts[0].clone());\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\r\n assert.exists(entryLN);\r\n newEntries.push(entryLN!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\r\n\r\n const entryLS = ElementGeometry.fromGeometryQuery(LineString3d.create(pts));\r\n assert.exists(entryLS);\r\n newEntries.push(entryLS!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\r\n\r\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\r\n assert.exists(entrySH);\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n const entryPS = ElementGeometry.fromGeometryQuery(PointString3d.create(pts));\r\n assert.exists(entryPS);\r\n newEntries.push(entryPS!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"pointCollection\" });\r\n\r\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(pts[0], pts[0].distance(pts[1])));\r\n assert.exists(entryAR);\r\n newEntries.push(entryAR!);\r\n expected.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"arc\" });\r\n\r\n const entryEL = ElementGeometry.fromGeometryQuery(Loop.create(Arc3d.createXY(pts[0], pts[0].distance(pts[1]))));\r\n assert.exists(entryEL);\r\n newEntries.push(entryEL!);\r\n expected.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d from local coordinate interpolation curve flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n pts.push(Point3d.create(10, 15, 0));\r\n pts.push(Point3d.create(5, 15, 0));\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const interpolationProps: InterpolationCurve3dProps = { fitPoints: pts, closed: false, isChordLenKnots: 1, isColinearTangents: 1 };\r\n const interpolationOpts = InterpolationCurve3dOptions.create(interpolationProps);\r\n const interpolationCurve = InterpolationCurve3d.createCapture(interpolationOpts);\r\n assert.isDefined(interpolationCurve);\r\n\r\n const entry1 = ElementGeometry.fromGeometryQuery(interpolationCurve!);\r\n assert.exists(entry1);\r\n newEntries.push(entry1!);\r\n expected.push({ opcode: ElementGeometryOpcode.CurvePrimitive, geometryCategory: \"curvePrimitive\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d with local coordinate indexed polyface flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const xOffset = Transform.createTranslation(Point3d.create(2.5));\r\n const builder = new ElementGeometry.Builder();\r\n\r\n // NOTE: It's a good idea to request sub-graphic ranges when adding multiple \"large\" polyfaces to a geometry stream...\r\n builder.appendGeometryRanges();\r\n\r\n const polyface = createIndexedPolyface(5.0);\r\n builder.appendGeometryQuery(polyface);\r\n\r\n polyface.tryTransformInPlace(xOffset); // translate in x...\r\n builder.appendGeometryQuery(polyface);\r\n\r\n polyface.tryTransformInPlace(xOffset); // translate in x again...\r\n builder.appendGeometryQuery(polyface);\r\n\r\n // NOTE: For time comparison with GeometryStream: create GeometricElement3d with local coordinate indexed polyface json data\r\n let timer = new Timer(\"elementGeometryInsert\");\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\r\n\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n timer.end();\r\n\r\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\r\n assert.isTrue(6 === info.entryArray.length); // 3 pairs of sub-range + polyface...\r\n const it = new ElementGeometry.Iterator(info);\r\n for (const entry of it) {\r\n assert.isTrue(entry.geomParams.categoryId === info.categoryId); // Current appearance information (default sub-category appearance in this case)...\r\n assert.isTrue(undefined !== entry.localRange && !entry.localRange.isNull); // Make sure sub-graphic ranges were added...\r\n\r\n const geom = entry.toGeometryQuery();\r\n assert.exists(geom);\r\n assert.isTrue(geom instanceof IndexedPolyface);\r\n\r\n const polyOut = geom as IndexedPolyface;\r\n assert.isTrue(polyOut.pointCount === polyface.pointCount);\r\n assert.isTrue(polyOut.paramCount === polyface.paramCount);\r\n assert.isTrue(polyOut.normalCount === polyface.normalCount);\r\n }\r\n };\r\n\r\n timer = new Timer(\"elementGeometryRequest\");\r\n const status = imodel.elementGeometryRequest({ onGeometry, elementId: newId });\r\n timer.end();\r\n assert.isTrue(IModelStatus.Success === status);\r\n });\r\n\r\n it(\"create GeometricElement3d from local coordinate brep flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const expectedFacet: ExpectedElementGeometryEntry[] = [];\r\n const expectedSkip: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const brepProps = createBRepDataProps(testOrigin, testAngles);\r\n const entry = ElementGeometry.fromBRep(brepProps);\r\n assert.exists(entry);\r\n newEntries.push(entry!);\r\n expected.push({ opcode: ElementGeometryOpcode.BRep, originalEntry: entry });\r\n\r\n // Why 6 and not 4?\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedFacet, false, undefined, 1));\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedSkip, false, undefined, 2));\r\n });\r\n\r\n it(\"apply world coordinate transform directly to brep flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const brepProps = createBRepDataProps();\r\n const entry = ElementGeometry.fromBRep(brepProps);\r\n assert.exists(entry);\r\n\r\n const entityTransform = Transform.createOriginAndMatrix(testOrigin, testAngles.toMatrix3d());\r\n const status = ElementGeometry.transformBRep(entry!, entityTransform);\r\n assert.isTrue(status);\r\n\r\n const worldBRep = ElementGeometry.toBRep(entry!);\r\n assert.exists(worldBRep);\r\n const worldTransform = Transform.fromJSON(worldBRep?.transform);\r\n assert.isTrue(worldTransform.isAlmostEqual(entityTransform));\r\n\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n newEntries.push(entry!);\r\n\r\n // Facet to make sure brep and face attachments are intact after transformBRep...\r\n const expectedFacet: ExpectedElementGeometryEntry[] = [];\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedFacet, false, undefined, 1));\r\n });\r\n\r\n it(\"test BRep entity transform\", async () => {\r\n const localToWorld = Transform.createOriginAndMatrix(Point3d.create(5, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0).toMatrix3d());\r\n const worldToLocal = localToWorld.inverse()!;\r\n\r\n // Specify an entity transform that won't have translation/rotation fully cancelled out by placement...\r\n const brepProps = createBRepDataProps(Point3d.create(15, 25, 5), YawPitchRollAngles.createDegrees(90, 0, 0));\r\n const brepEntry = ElementGeometry.fromBRep(brepProps, worldToLocal);\r\n assert.exists(brepEntry);\r\n\r\n const brepToWorldExpected = Transform.fromJSON(brepProps.transform);\r\n const brepToLocalExpected = worldToLocal.multiplyTransformTransform(brepToWorldExpected);\r\n\r\n // Check for expected brep to local transform...\r\n const brepPropsLocal = ElementGeometry.toBRep(brepEntry!, false);\r\n assert.exists(brepPropsLocal);\r\n const brepToLocal = Transform.fromJSON(brepPropsLocal!.transform);\r\n assert.isTrue(brepToLocalExpected.isAlmostEqual(brepToLocal));\r\n\r\n // Check for expected brep to world transform...\r\n const brepPropsWorld = ElementGeometry.toBRep(brepEntry!, false, localToWorld);\r\n assert.exists(brepPropsWorld);\r\n const brepToWorld = Transform.fromJSON(brepPropsWorld!.transform);\r\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorld));\r\n\r\n // Ensure that applying transform directly to flat buffer data produces same result...\r\n ElementGeometry.transformBRep(brepEntry!, localToWorld);\r\n\r\n const brepPropsWorld2 = ElementGeometry.toBRep(brepEntry!, false);\r\n assert.exists(brepPropsWorld2);\r\n const brepToWorld2 = Transform.fromJSON(brepPropsWorld2!.transform);\r\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorld2));\r\n\r\n // Check json format geometry stream...\r\n const builder = new GeometryStreamBuilder();\r\n builder.setLocalToWorld(localToWorld);\r\n builder.appendBRepData(brepProps);\r\n\r\n const itLocal = new GeometryStreamIterator(builder.geometryStream);\r\n for (const entry of itLocal) {\r\n assertTrue(entry.primitive.type === \"brep\");\r\n const brepToLocalGSB = Transform.fromJSON(entry.primitive.brep.transform);\r\n assert.isTrue(brepToLocalExpected.isAlmostEqual(brepToLocalGSB));\r\n }\r\n\r\n const itWorld = new GeometryStreamIterator(builder.geometryStream, undefined, localToWorld);\r\n for (const entry of itWorld) {\r\n assertTrue(entry.primitive.type === \"brep\");\r\n const brepToWorldGSB = Transform.fromJSON(entry.primitive.brep.transform);\r\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorldGSB));\r\n }\r\n });\r\n\r\n it(\"create GeometricElement3d from local coordinate text string flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const foundFont = imodel.fonts.findId({ name: \"Vera\" })!;\r\n assert.exists(foundFont);\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const textProps: TextStringProps = {\r\n text: \"ABC\",\r\n font: foundFont,\r\n height: 2,\r\n bold: true,\r\n origin: testOrigin,\r\n rotation: testAngles,\r\n };\r\n\r\n const glyphData: TextStringGlyphData = {\r\n glyphIds: [1, 2, 3],\r\n glyphOrigins: [new Point2d(0.0, 0.0), new Point2d(1000.0, 0.0), new Point2d(2000.0, 0.0)],\r\n range: new Range2d(0, 0, 10, 30),\r\n };\r\n\r\n const entry = ElementGeometry.fromTextString(textProps, undefined, glyphData);\r\n assert.exists(entry);\r\n newEntries.push(entry!);\r\n // We can't validate glyph data later from the TextString in the DB because the native TextString will re-compute them if the font isn't embedded.\r\n // So, just verify that we are passing the correct flatbuffer here.\r\n assert.deepEqual(entry ? ElementGeometry.toTextStringGlyphData(entry) : undefined, glyphData);\r\n expected.push({ opcode: ElementGeometryOpcode.TextString, originalEntry: entry });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d from local coordinate image flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const imageProps: ImageGraphicProps = {\r\n corners: [Point3d.create(), Point3d.create(1, 0), Point3d.create(1, 1), Point3d.create(0, 1)],\r\n textureId: \"0x1\",\r\n hasBorder: true,\r\n };\r\n\r\n const entry = ElementGeometry.fromImageGraphic(imageProps);\r\n assert.exists(entry);\r\n newEntries.push(entry!);\r\n expected.push({ opcode: ElementGeometryOpcode.Image, originalEntry: entry });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d with sub-graphic ranges flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const entrySG = ElementGeometry.fromSubGraphicRange(Range3d.create()); // Computed on backend, just need opcode...\r\n assert.exists(entrySG);\r\n newEntries.push(entrySG!);\r\n expected.push({ opcode: ElementGeometryOpcode.SubGraphicRange });\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(0, 0, 0));\r\n pts.push(Point3d.create(5, 5, 0));\r\n pts.push(Point3d.create(-5, -5, 0));\r\n\r\n const entryL1 = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\r\n assert.exists(entryL1);\r\n newEntries.push(entryL1!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\r\n\r\n expected.push({ opcode: ElementGeometryOpcode.SubGraphicRange }); // Added on backend...\r\n\r\n const entryL2 = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[2]));\r\n assert.exists(entryL2);\r\n newEntries.push(entryL2!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d with part reference flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const partProps = createGeometryPartProps();\r\n const expectedPart: ExpectedElementGeometryEntry[] = [];\r\n const newPartEntries: ElementGeometryDataEntry[] = [];\r\n\r\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(Point3d.createZero(), 2.5));\r\n assert.exists(entryAR);\r\n newPartEntries.push(entryAR!);\r\n expectedPart.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"arc\" });\r\n\r\n partProps.elementGeometryBuilderParams = { entryArray: newPartEntries };\r\n const partId = imodel.elements.insertElement(partProps);\r\n assert.isTrue(Id64.isValidId64(partId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, partId, expectedPart, false));\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n const partToElement = Transform.createIdentity();\r\n\r\n const entryPI = ElementGeometry.fromGeometryPart(partId);\r\n assert.exists(entryPI);\r\n ElementGeometry.toGeometryPart(entryPI!, partToElement);\r\n assert.isTrue(partToElement.isIdentity);\r\n newEntries.push(entryPI!);\r\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPI });\r\n\r\n const transPT = Transform.createTranslation(Point3d.create(5, 5, 0));\r\n const entryPT = ElementGeometry.fromGeometryPart(partId, transPT);\r\n assert.exists(entryPT);\r\n ElementGeometry.toGeometryPart(entryPT!, partToElement);\r\n assert.isTrue(partToElement.isAlmostEqual(transPT));\r\n newEntries.push(entryPT!);\r\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPT });\r\n\r\n const transPR = Transform.createOriginAndMatrix(testOrigin, testAngles.toMatrix3d());\r\n const entryPR = ElementGeometry.fromGeometryPart(partId, transPR);\r\n assert.exists(entryPR);\r\n ElementGeometry.toGeometryPart(entryPR!, partToElement);\r\n assert.isTrue(partToElement.isAlmostEqual(transPR));\r\n newEntries.push(entryPR!);\r\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPR });\r\n\r\n const transPS = Transform.createScaleAboutPoint(testOrigin, 2);\r\n const entryPS = ElementGeometry.fromGeometryPart(partId, transPS);\r\n assert.exists(entryPS);\r\n ElementGeometry.toGeometryPart(entryPS!, partToElement);\r\n assert.isTrue(partToElement.isAlmostEqual(transPS));\r\n newEntries.push(entryPS!);\r\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPS });\r\n\r\n const transPA = transPR.multiplyTransformTransform(transPS);\r\n const entryPA = ElementGeometry.fromGeometryPart(partId, transPA);\r\n assert.exists(entryPA);\r\n ElementGeometry.toGeometryPart(entryPA!, partToElement);\r\n assert.isTrue(partToElement.isAlmostEqual(transPA));\r\n newEntries.push(entryPA!);\r\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPA });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d with appearance flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n pts.push(Point3d.create(10, 15, 0));\r\n pts.push(Point3d.create(5, 15, 0));\r\n pts.push(pts[0].clone());\r\n\r\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\r\n assert.exists(entrySH);\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n const geomParams = new GeometryParams(seedElement.category);\r\n\r\n // Shape with red outline...\r\n geomParams.lineColor = ColorDef.red;\r\n let added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with gradient fill...\r\n geomParams.fillDisplay = FillDisplay.ByView;\r\n geomParams.gradient = new Gradient.Symb();\r\n geomParams.gradient.mode = Gradient.Mode.Linear;\r\n geomParams.gradient.flags = Gradient.Flags.Outline;\r\n geomParams.gradient.keys.push(new Gradient.KeyColor({ value: 0.0, color: ColorDef.blue.toJSON() }));\r\n geomParams.gradient.keys.push(new Gradient.KeyColor({ value: 0.5, color: ColorDef.red.toJSON() }));\r\n geomParams.gradient.angle = Angle.createDegrees(45);\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with thematic gradient fill...\r\n geomParams.gradient.mode = Gradient.Mode.Thematic;\r\n geomParams.gradient.thematicSettings = ThematicGradientSettings.fromJSON({ mode: ThematicGradientMode.Stepped, stepCount: 5 });\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with bg fill...\r\n geomParams.gradient = undefined;\r\n geomParams.backgroundFill = BackgroundFill.Outline;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with solid fill...\r\n geomParams.backgroundFill = undefined;\r\n geomParams.fillColor = ColorDef.blue;\r\n geomParams.fillTransparency = 0.75;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with solid fill and render material\r\n geomParams.materialId = \"0x5\";\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Fill });\r\n expected.push({ opcode: ElementGeometryOpcode.Material, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Green construction line to test ignoring region specific appearance like fill...\r\n geomParams.materialId = undefined;\r\n geomParams.lineColor = ColorDef.green;\r\n geomParams.weight = 2;\r\n const modifiers = new LineStyle.Modifier({\r\n scale: 2, dashScale: 0.5, gapScale: 0.2,\r\n startWidth: 0.1, endWidth: 0.3,\r\n distPhase: 0.25, fractPhase: 0.1, centerPhase: true,\r\n segmentMode: false, physicalWidth: true,\r\n normal: Vector3d.unitZ().toJSON(),\r\n rotation: YawPitchRollAngles.createDegrees(45, 0, 0).toJSON(),\r\n });\r\n geomParams.styleInfo = new LineStyle.Info(Id64.invalid, modifiers);\r\n geomParams.elmTransparency = 0.5;\r\n geomParams.geometryClass = GeometryClass.Construction;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n geomParams.fillDisplay = geomParams.fillColor = geomParams.fillTransparency = undefined; // Region specific appearance ignored for open elements...\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.LineStyleModifiers, geomParams: geomParams.clone() });\r\n\r\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[2]));\r\n assert.exists(entryLN);\r\n newEntries.push(entryLN!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"create GeometricElement3d with pattern flatbuffer data\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n pts.push(Point3d.create(10, 15, 0));\r\n pts.push(Point3d.create(5, 15, 0));\r\n pts.push(pts[0].clone());\r\n\r\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\r\n assert.exists(entrySH);\r\n\r\n const expected: ExpectedElementGeometryEntry[] = [];\r\n const newEntries: ElementGeometryDataEntry[] = [];\r\n const geomParams = new GeometryParams(seedElement.category);\r\n\r\n // Shape with hatch w/o overrides...\r\n geomParams.pattern = new AreaPattern.Params();\r\n geomParams.pattern.space1 = 0.05;\r\n geomParams.pattern.angle1 = Angle.createDegrees(45.0);\r\n let added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with cross hatch with color/weight override...\r\n geomParams.pattern.space2 = 0.1;\r\n geomParams.pattern.angle2 = Angle.createDegrees(-30.0);\r\n geomParams.pattern.color = ColorDef.red;\r\n geomParams.pattern.weight = 0;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with area pattern w/o overrides...\r\n const partId = createCirclePart(1.0, imodel);\r\n assert.isTrue(Id64.isValidId64(partId));\r\n geomParams.pattern = new AreaPattern.Params();\r\n geomParams.pattern.symbolId = partId;\r\n geomParams.pattern.space1 = geomParams.pattern.space2 = 0.05;\r\n geomParams.pattern.angle1 = Angle.createDegrees(45.0);\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with area pattern with color/weight and other overrides...\r\n geomParams.pattern.origin = Point3d.create(0.05, 0.05, 0.0);\r\n geomParams.pattern.rotation = YawPitchRollAngles.createDegrees(45, 0, 0);\r\n geomParams.pattern.space1 = geomParams.pattern.space2 = geomParams.pattern.angle1 = undefined;\r\n geomParams.pattern.color = ColorDef.red;\r\n geomParams.pattern.weight = 1;\r\n geomParams.pattern.snappable = geomParams.pattern.invisibleBoundary = true;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with hatch definition w/o overrides (zig-zag)...\r\n const defLines: AreaPattern.HatchDefLine[] = [\r\n { offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\r\n { angle: Angle.createDegrees(90.0), through: Point2d.create(0.1, 0.0), offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\r\n ];\r\n\r\n geomParams.pattern = new AreaPattern.Params();\r\n geomParams.pattern.defLines = defLines;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n // Shape with hatch definition with color/weight overrides...\r\n geomParams.pattern.color = ColorDef.red;\r\n geomParams.pattern.weight = 1;\r\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\r\n assert.isTrue(added);\r\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\r\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\r\n\r\n newEntries.push(entrySH!);\r\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\r\n\r\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n\r\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\r\n });\r\n\r\n it(\"should transform PatternParams\", () => {\r\n const offset = Point3d.create(1, 1, 1);\r\n const rotation = YawPitchRollAngles.createDegrees(45, 45, 45);\r\n const t = Transform.createOriginAndMatrix(offset, rotation.toMatrix3d());\r\n\r\n const pattern = new AreaPattern.Params();\r\n pattern.origin = Point3d.createZero();\r\n pattern.rotation = YawPitchRollAngles.createDegrees(0, 0, 0);\r\n pattern.applyTransform(t);\r\n expect(pattern.origin.isAlmostEqual(offset)).true;\r\n expect(pattern.rotation.isAlmostEqual(rotation)).true;\r\n });\r\n\r\n it(\"should insert elements and parts with binary geometry stream\", () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n\r\n const pts: Point3d[] = [];\r\n pts.push(Point3d.create(5, 10, 0));\r\n pts.push(Point3d.create(10, 10, 0));\r\n\r\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\r\n assert.isTrue(entryLN !== undefined);\r\n\r\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(pts[0], pts[0].distance(pts[1])));\r\n assert.exists(entryAR);\r\n\r\n // ------------------\r\n // GeometricElement3d\r\n // ------------------\r\n\r\n // Insert\r\n\r\n const elemProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: seedElement.model,\r\n category: seedElement.category,\r\n code: Code.createEmpty(),\r\n // geom: geomBuilder.geometryStream,\r\n elementGeometryBuilderParams: { entryArray: [entryLN!], viewIndependent: false },\r\n };\r\n\r\n const spatialElementId = imodel.elements.insertElement(elemProps);\r\n\r\n let persistentProps = imodel.elements.getElementProps<GeometricElementProps>({ id: spatialElementId, wantGeometry: true });\r\n assert.isDefined(persistentProps.geom);\r\n assert.isTrue(persistentProps.placement !== undefined);\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.origin), Point3d.create(0, 0, 0));\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.low), Point3d.create(5, 10, 0));\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.high), Point3d.create(10, 10, 0));\r\n\r\n for (const entry of new GeometryStreamIterator(persistentProps.geom!, persistentProps.category)) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\r\n assert.isTrue(geometry instanceof LineString3d);\r\n const ls: LineString3d = geometry as LineString3d;\r\n assert.deepEqual(ls.points, pts);\r\n }\r\n\r\n // Insert - various failure cases\r\n elemProps.elementGeometryBuilderParams = { entryArray: [{ opcode: 9999 } as unknown as ElementGeometryDataEntry] };\r\n expect(() => imodel.elements.insertElement(elemProps)).to.throw(); // TODO: check error message\r\n\r\n elemProps.elementGeometryBuilderParams = { entryArray: [{ opcode: ElementGeometryOpcode.ArcPrimitive, data: undefined } as unknown as ElementGeometryDataEntry] };\r\n expect(() => imodel.elements.insertElement(elemProps)).to.throw(); // TODO: check error message\r\n\r\n // Update\r\n persistentProps.elementGeometryBuilderParams = { entryArray: [entryAR!] };\r\n\r\n imodel.elements.updateElement(persistentProps);\r\n\r\n persistentProps = imodel.elements.getElementProps<GeometricElementProps>({ id: spatialElementId, wantGeometry: true });\r\n assert.isDefined(persistentProps.geom);\r\n assert.isTrue(persistentProps.placement !== undefined);\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.origin), Point3d.create(0, 0, 0));\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.low), Point3d.create(0, 5, 0));\r\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.high), Point3d.create(10, 15, 0));\r\n\r\n for (const entry of new GeometryStreamIterator(persistentProps.geom!, persistentProps.category)) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\r\n assert.isTrue(geometry instanceof Arc3d);\r\n const ar: Arc3d = geometry as Arc3d;\r\n assert.deepEqual(ar.center, pts[0]);\r\n }\r\n\r\n // ---------------\r\n // Geometry part\r\n // ---------------\r\n\r\n // Insert\r\n const partProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: IModel.dictionaryId,\r\n code: Code.createEmpty(),\r\n elementGeometryBuilderParams: { entryArray: [entryLN!], is2dPart: false },\r\n };\r\n\r\n const partId = imodel.elements.insertElement(partProps);\r\n\r\n let persistentPartProps = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\r\n assert.isDefined(persistentPartProps.geom);\r\n\r\n for (const entry of new GeometryStreamIterator(persistentPartProps.geom!)) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\r\n assert.isTrue(geometry instanceof LineString3d);\r\n const ls: LineString3d = geometry as LineString3d;\r\n assert.deepEqual(ls.points, pts);\r\n }\r\n\r\n // Update\r\n persistentPartProps.elementGeometryBuilderParams = { entryArray: [entryAR!] };\r\n\r\n imodel.elements.updateElement(persistentPartProps);\r\n\r\n persistentPartProps = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\r\n assert.isDefined(persistentPartProps.geom);\r\n\r\n for (const entry of new GeometryStreamIterator(persistentPartProps.geom!)) {\r\n assert.equal(entry.primitive.type, \"geometryQuery\");\r\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\r\n assert.isTrue(geometry instanceof Arc3d);\r\n const ar: Arc3d = geometry as Arc3d;\r\n assert.deepEqual(ar.center, pts[0]);\r\n }\r\n });\r\n\r\n it(\"create and update a GeometricElement3d to test clearing its geometry stream\", async () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const newId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(90, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const newElemProps = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\r\n assert.isDefined(newElemProps.geom);\r\n assert.isTrue(newElemProps.placement !== undefined);\r\n\r\n newElemProps.elementGeometryBuilderParams = { entryArray: [] };\r\n imodel.elements.updateElement(newElemProps);\r\n imodel.saveChanges();\r\n\r\n const updateElemProps = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\r\n assert.isUndefined(updateElemProps.geom);\r\n assert.isTrue(updateElemProps.placement !== undefined);\r\n const updatedPlacement = Placement3d.fromJSON(updateElemProps.placement);\r\n assert.isTrue(updatedPlacement.bbox.isNull);\r\n });\r\n});\r\n\r\ndescribe(\"BRepGeometry\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"create GeometricElement3d from a sequence of BRep operations test\", async () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n const builder = new ElementGeometry.Builder();\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n builder.entries.length = 0; // Always replace builder.entries with result for subsequent operations/creating element\r\n builder.entries.push(info.entryArray[0]);\r\n };\r\n\r\n // Step 1: Create solid by subtracting the 2 small spheres from the large sphere\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, -5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Subtract,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 2: Create flat spots on sides by intersecting with a cube (i.e. something more complex that a simple revolved solid)\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(-4, -4, -5), Point3d.create(4, 4, 5)), true)!);\r\n\r\n createProps.operation = BRepGeometryOperation.Intersect;\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 3: Create a hollow shell\r\n createProps.operation = BRepGeometryOperation.Hollow;\r\n createProps.parameters = { distance: -0.5 };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 4: Cut a small hole through the middle of the solid\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.createZero(), 1)));\r\n\r\n createProps.operation = BRepGeometryOperation.Cut;\r\n createProps.parameters = { bothDirections: true };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 5: Create a geometric element from the result solid\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\r\n\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n });\r\n\r\n it(\"create GeometricElement3d using half-space boolean test\", async () => {\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n const builder = new ElementGeometry.Builder();\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n builder.entries.length = 0; // Always replace builder.entries with result for subsequent operations/creating element\r\n builder.entries.push(info.entryArray[0]);\r\n };\r\n\r\n // Step 1: Create solid cube with all edges rounded\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(-5, -5, -5), Point3d.create(5, 5, 5)), true)!);\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Round,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { radius: 2.0 },\r\n };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 2: Create a hollow shell\r\n createProps.operation = BRepGeometryOperation.Hollow;\r\n createProps.parameters = { distance: -0.5 };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 3: Use solid/sheet subtract to remove bottom half of solid (keep material in direction of surface normal)\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.createZero(), 10)));\r\n\r\n createProps.operation = BRepGeometryOperation.Subtract;\r\n createProps.parameters = undefined;\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 4: Create a geometric element from the result solid\r\n const testOrigin = Point3d.create(5, 10, 0);\r\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\r\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\r\n\r\n const newId = imodel.elements.insertElement(elementProps);\r\n assert.isTrue(Id64.isValidId64(newId));\r\n imodel.saveChanges();\r\n });\r\n\r\n it(\"create multiple GeometricElement3d from local coordinate disjoint body result test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n let results: ElementGeometryDataEntry[];\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 2 === info.entryArray.length);\r\n results = info.entryArray;\r\n };\r\n\r\n // Step 1: Create two solids by intersecting the 2 small spheres with the large sphere\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, 5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, -5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Intersect,\r\n entryArray: builder.entries,\r\n onResult,\r\n separateDisjoint: true, // Request result as 2 solids instead of a single solid with disjoint regions...\r\n };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Step 2: Create a geometric element from each result solid\r\n results!.forEach((entry) => {\r\n // NOTE: Since entity transform reflects local to world of target (the large sphere) it's a reasonable placement...\r\n const brepData = ElementGeometry.toBRep(entry);\r\n assert.isDefined(brepData);\r\n const placement = YawPitchRollAngles.tryFromTransform(Transform.fromJSON(brepData!.transform));\r\n assert.isDefined(placement.angles);\r\n const newId = createGeometricElemFromSeed(imodel, \"0x1d\", [entry], { origin: placement.origin, angles: placement.angles! });\r\n assert.isTrue(Id64.isValidId64(newId));\r\n });\r\n });\r\n\r\n it(\"unite/subtract/intersect solids test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\r\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(5, 0, 0), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Unite,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n createProps.operation = BRepGeometryOperation.Subtract;\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n createProps.operation = BRepGeometryOperation.Intersect;\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"subtract consumes target test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(1, 1, 1), Point3d.create(4, 4, 4)), true)!);\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 0), Point3d.create(5, 5, 5)), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n // Successful operation w/empty result...\r\n assert.isTrue(undefined !== info.entryArray && 0 === info.entryArray.length);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Subtract,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"sew sheets test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 2, 0), Point3d.create(1, 2, 0), Point3d.create(1, 0, 0), Point3d.create(0, 0, 0)]));\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 3), Point3d.create(1, 0, 3), Point3d.create(1, 2, 3), Point3d.create(0, 2, 3), Point3d.create(0, 0, 3)]));\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 0, 3), Point3d.create(0, 0, 3), Point3d.create(0, 0, 0)]));\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(1, 2, 0), Point3d.create(0, 2, 0), Point3d.create(0, 2, 3), Point3d.create(1, 2, 3), Point3d.create(1, 2, 0)]));\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 2, 0), Point3d.create(0, 0, 0), Point3d.create(0, 0, 3), Point3d.create(0, 2, 3), Point3d.create(0, 2, 0)]));\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(1, 0, 0), Point3d.create(1, 2, 0), Point3d.create(1, 2, 3), Point3d.create(1, 0, 3), Point3d.create(1, 0, 0)]));\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Sew,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"cut solids test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n // Test creating cut through solid in forward direction (default)\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 0), Point3d.create(5, 5, 5)), true)!);\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, 2.5), 2)));\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Cut,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Test creating cut through solid in both directions\r\n createProps.parameters = { bothDirections: true };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Test creating depth cut in solid in forward direction\r\n createProps.parameters = { distance: 1 };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Test creating depth cut in solid in both directions\r\n createProps.parameters = { distance: 1, bothDirections: true };\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"emboss profile test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n // Test creating a pocket in a solid\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 1), Point3d.create(5, 5, 2)), true)!);\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, 1.5), 2)));\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Emboss,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Test creating a pad on a solid\r\n builder.entries.length = 0;\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, -3), Point3d.create(5, 5, -2)), true)!);\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, -1.5), 2)));\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n // Test embossing a surface\r\n builder.entries.length = 0;\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, -0.5), 2, AngleSweep.createStartSweepDegrees(0, -360))));\r\n\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"thicken surfaces test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Thicken,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { frontDistance: 0.25 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n createProps.parameters = { backDistance: 0.25 };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n\r\n createProps.parameters = { frontDistance: 0.1, backDistance: 0.1 };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"offset surfaces test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Offset,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { distance: 0.25 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"hollow solids test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Hollow,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { distance: 0.25 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"offset solids test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Offset,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { distance: 0.25 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"sweep profile along path test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 0), 1)));\r\n builder.appendGeometryQuery(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(0, 0, 3), Point3d.create(5, 0, 3), Point3d.create(8, 10, 10)));\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Sweep,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"loft profiles test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0.5, 0, 5), 1.25)));\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 3), 1)));\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 2), 2)));\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 0), 1.5)));\r\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(-0.5, 0, -2), 3)));\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Loft,\r\n entryArray: builder.entries,\r\n onResult,\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"round edges test\", async () => {\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Round,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { radius: 1 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n\r\n it(\"create element using base 64 encoded brep from flatbuffer test\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const builder = new ElementGeometry.Builder();\r\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\r\n\r\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\r\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\r\n\r\n // Create new element to test flatbuffer conversion to brep wire format\r\n // NOTE: It is preferable to use ElementGeometry.Builder over GeometryStreamBuilder this is just for testing,\r\n const gsBuilder = new GeometryStreamBuilder();\r\n const brep = ElementGeometry.toBRep(info.entryArray[0], true);\r\n assert.exists(brep);\r\n gsBuilder.appendBRepData(brep!);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, { origin: Point3d.create(5, 10, 0), angles: YawPitchRollAngles.createDegrees(45, 0, 0) }, gsBuilder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n // Extract and test value returned\r\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true, wantBRepData: true });\r\n assert.isDefined(value.geom);\r\n\r\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\r\n for (const entry of itLocal) {\r\n assertTrue(entry.primitive.type === \"brep\");\r\n }\r\n };\r\n\r\n const createProps: BRepGeometryCreate = {\r\n operation: BRepGeometryOperation.Hollow,\r\n entryArray: builder.entries,\r\n onResult,\r\n parameters: { distance: 0.25 },\r\n };\r\n try {\r\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\r\n } catch (error: any) {\r\n assert(false, error.message);\r\n }\r\n });\r\n});\r\n\r\ndescribe(\"Mass Properties\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"volume\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const box = Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true);\r\n assert.isFalse(undefined === box);\r\n\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(box!);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n const requestProps: MassPropertiesRequestProps = {\r\n operation: MassPropertiesOperation.AccumulateVolumes,\r\n candidates: [newId],\r\n };\r\n\r\n const result = await imodel.getMassProperties(requestProps);\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status);\r\n assert.isTrue(1.0 === result.volume);\r\n assert.isTrue(6.0 === result.area);\r\n assert.isTrue(Point3d.fromJSON(result.centroid).isAlmostEqual(Point3d.create(0.5, 0.5, 0.5)));\r\n });\r\n\r\n it(\"area\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\r\n const builder = new GeometryStreamBuilder();\r\n builder.appendGeometry(shape);\r\n\r\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\r\n const testElem = imodel.elements.createElement(elementProps);\r\n const newId = imodel.elements.insertElement(testElem.toJSON());\r\n imodel.saveChanges();\r\n\r\n const requestProps: MassPropertiesRequestProps = {\r\n operation: MassPropertiesOperation.AccumulateAreas,\r\n candidates: [newId],\r\n };\r\n\r\n const result = await imodel.getMassProperties(requestProps);\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status);\r\n assert.isTrue(1.0 === result.area);\r\n assert.isTrue(4.0 === result.perimeter);\r\n assert.isTrue(Point3d.fromJSON(result.centroid).isAlmostEqual(Point3d.create(0.5, 0.5, 0.0)));\r\n });\r\n});\r\n\r\ndescribe(\"Geometry Containment\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"clip volume curve containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const edgeOverlapId = createCircleElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const cornerOverlapId = createCircleElem(1.0, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomOutId = createCircleElem(1.25, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomInId = createCircleElem(0.85, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\r\n const clip = ClipVector.createEmpty();\r\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\r\n clip.appendReference(block);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n let result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(2 === result.numInside);\r\n assert.isTrue(2 === result.numOutside);\r\n assert.isTrue(2 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n\r\n requestProps.allowOverlaps = false; // test inside mode...\r\n result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(2 === result.numInside);\r\n assert.isTrue(4 === result.numOutside);\r\n assert.isTrue(0 === result.numOverlap);\r\n });\r\n\r\n it(\"clip volume mesh containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideId = createSphereElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const edgeOverlapId = createSphereElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const cornerOverlapId = createSphereElem(1.0, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomOutId = createSphereElem(1.25, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomInId = createSphereElem(0.85, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\r\n const clip = ClipVector.createEmpty();\r\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\r\n clip.appendReference(block);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n let result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(2 === result.numInside);\r\n assert.isTrue(2 === result.numOutside);\r\n assert.isTrue(2 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n\r\n requestProps.allowOverlaps = false; // test inside mode...\r\n result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(2 === result.numInside);\r\n assert.isTrue(4 === result.numOutside);\r\n assert.isTrue(0 === result.numOverlap);\r\n });\r\n\r\n it(\"clip volume part containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const partAId = createCirclePart(1.0, imodel);\r\n const partBId = createCirclePart(1.25, imodel);\r\n const partCId = createCirclePart(0.85, imodel);\r\n\r\n // create part entries without instance transform...\r\n const rangeInsideId = createPartElem(partAId, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createPartElem(partAId, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const edgeOverlapId = createPartElem(partAId, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const cornerOverlapId = createPartElem(partAId, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomOutId = createPartElem(partBId, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomInId = createPartElem(partCId, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\r\n\r\n // create part entries with instance transform...\r\n const rangeInsideRId = createPartElem(partAId, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\r\n const rangeOutsideRId = createPartElem(partAId, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\r\n const edgeOverlapRId = createPartElem(partAId, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\r\n const cornerOverlapRId = createPartElem(partAId, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\r\n const rangeOvrGeomOutRId = createPartElem(partBId, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\r\n const rangeOvrGeomInRId = createPartElem(partCId, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement, true);\r\n\r\n imodel.saveChanges();\r\n\r\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\r\n const clip = ClipVector.createEmpty();\r\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\r\n clip.appendReference(block);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId, rangeInsideRId, rangeOutsideRId, edgeOverlapRId, cornerOverlapRId, rangeOvrGeomOutRId, rangeOvrGeomInRId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n let result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(4 === result.numInside);\r\n assert.isTrue(4 === result.numOutside);\r\n assert.isTrue(4 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n\r\n requestProps.allowOverlaps = false; // test inside mode...\r\n result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(4 === result.numInside);\r\n assert.isTrue(8 === result.numOutside);\r\n assert.isTrue(0 === result.numOverlap);\r\n });\r\n\r\n it(\"clip volume displayed containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const primInConsOutId = createDisjointCirclesElem(1.0, Point3d.create(10, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const primOutConsInId = createDisjointCirclesElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const primInConsInId = createDisjointCirclesElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const primOvrConsOvrId = createDisjointCirclesElem(1.0, Point3d.create(5, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\r\n const clip = ClipVector.createEmpty();\r\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\r\n clip.appendReference(block);\r\n\r\n const expectedContainmentDef: ClipPlaneContainment[] = [ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.Ambiguous];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [primInConsOutId, primOutConsInId, primInConsInId, primOvrConsOvrId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n let result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentDef.length);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentDef[index]));\r\n assert.isTrue(1 === result.numInside);\r\n assert.isTrue(0 === result.numOutside);\r\n assert.isTrue(3 === result.numOverlap);\r\n\r\n const expectedContainmentSubCat: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside];\r\n\r\n requestProps.offSubCategories = [IModel.getDefaultSubCategoryId(seedElement.category)];\r\n result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentSubCat.length);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentSubCat[index]));\r\n assert.isTrue(0 === result.numInside);\r\n assert.isTrue(4 === result.numOutside);\r\n assert.isTrue(0 === result.numOverlap);\r\n\r\n const expectedContainmentViewFlags: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.Ambiguous];\r\n\r\n const flags = new ViewFlags(); // constructions are off by default...\r\n requestProps.viewFlags = flags;\r\n requestProps.offSubCategories = undefined;\r\n result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentViewFlags.length);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentViewFlags[index]));\r\n assert.isTrue(2 === result.numInside);\r\n assert.isTrue(1 === result.numOutside);\r\n assert.isTrue(1 === result.numOverlap);\r\n });\r\n\r\n it(\"clip L shape volume curve containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideXYId = createCircleElem(1.0, Point3d.create(2.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeInsideYId = createCircleElem(1.0, Point3d.create(2.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeInsideXId = createCircleElem(1.0, Point3d.create(7.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(7.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomOvrId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const clipShapePts: Point3d[] = [];\r\n clipShapePts.push(Point3d.create(0, 0, 0));\r\n clipShapePts.push(Point3d.create(10, 0, 0));\r\n clipShapePts.push(Point3d.create(10, 5, 0));\r\n clipShapePts.push(Point3d.create(5, 5, 0));\r\n clipShapePts.push(Point3d.create(5, 10, 0));\r\n clipShapePts.push(Point3d.create(0, 10, 0));\r\n clipShapePts.push(Point3d.create(0, 0, 0));\r\n const clip = ClipVector.createEmpty();\r\n clip.appendShape(clipShapePts, -5, 5);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideXYId, rangeInsideXId, rangeInsideYId, rangeOutsideId, rangeOvrGeomOvrId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n const result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(3 === result.numInside);\r\n assert.isTrue(1 === result.numOutside);\r\n assert.isTrue(1 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n });\r\n\r\n it(\"clip L shape volume mesh containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideXYId = createSphereElem(1.0, Point3d.create(2.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeInsideYId = createSphereElem(1.0, Point3d.create(2.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeInsideXId = createSphereElem(1.0, Point3d.create(7.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(7.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOvrGeomOvrId = createSphereElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const clipShapePts: Point3d[] = [];\r\n clipShapePts.push(Point3d.create(0, 0, 0));\r\n clipShapePts.push(Point3d.create(10, 0, 0));\r\n clipShapePts.push(Point3d.create(10, 5, 0));\r\n clipShapePts.push(Point3d.create(5, 5, 0));\r\n clipShapePts.push(Point3d.create(5, 10, 0));\r\n clipShapePts.push(Point3d.create(0, 10, 0));\r\n clipShapePts.push(Point3d.create(0, 0, 0));\r\n const clip = ClipVector.createEmpty();\r\n clip.appendShape(clipShapePts, -5, 5);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideXYId, rangeInsideXId, rangeInsideYId, rangeOutsideId, rangeOvrGeomOvrId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n const result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(3 === result.numInside);\r\n assert.isTrue(1 === result.numOutside);\r\n assert.isTrue(1 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n });\r\n\r\n it(\"clip plane curve containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideId = createCircleElem(1.0, Point3d.create(0, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(10, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOverlapId = createCircleElem(1.0, Point3d.create(5, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const plane = Plane3dByOriginAndUnitNormal.create(Point3d.create(5, 0, 0), Vector3d.create(-1, 0, 0)); // inward normal...\r\n const planeSet = ConvexClipPlaneSet.createEmpty();\r\n planeSet.addPlaneToConvexSet(ClipPlane.createPlane(plane!));\r\n const prim = ClipPrimitive.createCapture(planeSet);\r\n const clip = ClipVector.createEmpty();\r\n clip.appendReference(prim);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideId, rangeOutsideId, rangeOverlapId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n const result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(1 === result.numInside);\r\n assert.isTrue(1 === result.numOutside);\r\n assert.isTrue(1 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n });\r\n\r\n it(\"clip plane mesh containment\", async () => {\r\n // Set up element to be placed in iModel\r\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n const rangeInsideId = createSphereElem(1.0, Point3d.create(0, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(10, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n const rangeOverlapId = createSphereElem(1.0, Point3d.create(5, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\r\n imodel.saveChanges();\r\n\r\n const plane = Plane3dByOriginAndUnitNormal.create(Point3d.create(5, 0, 0), Vector3d.create(-1, 0, 0)); // inward normal...\r\n const planeSet = ConvexClipPlaneSet.createEmpty();\r\n planeSet.addPlaneToConvexSet(ClipPlane.createPlane(plane!));\r\n const prim = ClipPrimitive.createCapture(planeSet);\r\n const clip = ClipVector.createEmpty();\r\n clip.appendReference(prim);\r\n\r\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\r\n\r\n const requestProps: GeometryContainmentRequestProps = {\r\n candidates: [rangeInsideId, rangeOutsideId, rangeOverlapId],\r\n clip: clip.toJSON(),\r\n allowOverlaps: true,\r\n };\r\n\r\n const result = await imodel.getGeometryContainment(requestProps);\r\n\r\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\r\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\r\n assert.isTrue(1 === result.numInside);\r\n assert.isTrue(1 === result.numOutside);\r\n assert.isTrue(1 === result.numOverlap);\r\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\r\n });\r\n\r\n});\r\n"]}
1
+ {"version":3,"file":"GeometryStream.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/GeometryStream.test.ts"],"names":[],"mappings":"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CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/K,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAA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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\nimport { assert, expect } from \"chai\";\nimport { BentleyStatus, Id64, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport {\n Angle, AngleSweep, Arc3d, Box, ClipMaskXYZRangePlanes, ClipPlane, ClipPlaneContainment, ClipPrimitive, ClipShape, ClipVector, ConvexClipPlaneSet,\n CurveCollection, CurvePrimitive, Geometry, GeometryQueryCategory, IndexedPolyface, InterpolationCurve3d, InterpolationCurve3dOptions, InterpolationCurve3dProps,\n LineSegment3d, LineString3d, Loop, Matrix3d, Plane3dByOriginAndUnitNormal, Point2d, Point3d, Point3dArray, PointString3d, PolyfaceBuilder, Range2d, Range3d,\n SolidPrimitive, Sphere, StrokeOptions, Transform, Vector3d, YawPitchRollAngles,\n} from \"@itwin/core-geometry\";\nimport {\n AreaPattern, BackgroundFill, BRepGeometryCreate, BRepGeometryFunction, BRepGeometryInfo, BRepGeometryOperation, Code, ColorByName,\n ColorDef, ElementGeometry, ElementGeometryDataEntry, ElementGeometryFunction, ElementGeometryInfo, ElementGeometryOpcode, ElementGeometryRequest,\n FillDisplay, GeometricElement3dProps, GeometricElementProps, GeometryClass,\n GeometryContainmentRequestProps, GeometryParams, GeometryPartProps, GeometryPrimitive, GeometryStreamBuilder, GeometryStreamFlags, GeometryStreamIterator,\n GeometryStreamProps, Gradient, ImageGraphicCorners, ImageGraphicProps, IModel, LinePixels, LineStyle, MassPropertiesOperation,\n MassPropertiesRequestProps, PhysicalElementProps, Placement3d, Placement3dProps, TextString, TextStringGlyphData, TextStringProps, ThematicGradientMode,\n ThematicGradientSettings, ViewFlags,\n} from \"@itwin/core-common\";\nimport { _nativeDb, DefinitionModel, deleteElementTree, GeometricElement, GeometryPart, LineStyleDefinition, PhysicalObject, SnapshotDb, SubCategory, Subject } from \"../../core-backend\";\nimport { createBRepDataProps } from \"../GeometryTestUtil\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { Timer } from \"../TestUtils\";\n\nfunction assertTrue(expr: boolean): asserts expr {\n assert.isTrue(expr);\n}\n\nfunction createGeometryPartProps(geom?: GeometryStreamProps, modelId?: Id64String): GeometryPartProps {\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: modelId ?? IModel.dictionaryId,\n code: Code.createEmpty(),\n geom,\n };\n return partProps;\n}\n\nfunction createPhysicalElementProps(seedElement: GeometricElement, placement?: Placement3dProps, geom?: GeometryStreamProps, modelId?: Id64String): PhysicalElementProps {\n const elementProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId ?? seedElement.model,\n category: seedElement.category,\n code: Code.createEmpty(),\n geom,\n placement,\n };\n return elementProps;\n}\n\nfunction createGeometryPart(geom: GeometryStreamProps, imodel: SnapshotDb): Id64String {\n const partProps = createGeometryPartProps(geom);\n return imodel.elements.insertElement(partProps);\n}\n\nfunction createGeometricElem(geom: GeometryStreamProps, placement: Placement3dProps, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\n const elementProps = createPhysicalElementProps(seedElement, placement, geom);\n const el = imodel.elements.createElement<GeometricElement>(elementProps);\n return imodel.elements.insertElement(el.toJSON());\n}\n\nfunction createPartElem(partId: Id64String, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement, isRelative = false): Id64String {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometryPart3d(partId, isRelative ? origin : undefined, isRelative ? angles : undefined);\n return createGeometricElem(builder.geometryStream, isRelative ? { origin: Point3d.createZero(), angles: YawPitchRollAngles.createDegrees(0, 0, 0) } : { origin, angles }, imodel, seedElement);\n}\n\nfunction createCirclePart(radius: number, imodel: SnapshotDb): Id64String {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Arc3d.createXY(Point3d.createZero(), radius));\n return createGeometryPart(builder.geometryStream, imodel);\n}\n\nfunction createCircleElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Arc3d.createXY(Point3d.createZero(), radius));\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\n}\n\nfunction createSphereElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Sphere.createCenterRadius(Point3d.createZero(), radius));\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\n}\n\nfunction createDisjointCirclesElem(radius: number, origin: Point3d, angles: YawPitchRollAngles, imodel: SnapshotDb, seedElement: GeometricElement): Id64String {\n const builder = new GeometryStreamBuilder();\n const xOffset = radius * 1.5;\n builder.appendGeometry(Arc3d.createXY(Point3d.create(-xOffset), radius));\n const geomParams = new GeometryParams(seedElement.category);\n geomParams.geometryClass = GeometryClass.Construction;\n builder.appendGeometryParamsChange(geomParams);\n builder.appendGeometry(Arc3d.createXY(Point3d.create(xOffset), radius));\n return createGeometricElem(builder.geometryStream, { origin, angles }, imodel, seedElement);\n}\n\nfunction createIndexedPolyface(radius: number, origin?: Point3d, angleTol?: Angle): IndexedPolyface {\n const options = StrokeOptions.createForFacets();\n\n options.needParams = true;\n options.needNormals = true;\n\n if (angleTol)\n options.angleTol = angleTol;\n\n // Create indexed polyface for testing by facetting a sphere...\n const sphere = Sphere.createCenterRadius(undefined !== origin ? origin : Point3d.createZero(), radius);\n const polyBuilder = PolyfaceBuilder.create(options);\n polyBuilder.handleSphere(sphere);\n\n return polyBuilder.claimPolyface();\n}\n\nfunction createStyledLineElem(imodel: SnapshotDb, seedElement: GeometricElement, x: number, y: number, length: number, styleInfo?: LineStyle.Info, color?: ColorDef): Id64String {\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n if (styleInfo)\n params.styleInfo = styleInfo;\n\n if (color)\n params.lineColor = color;\n\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.create(x, y, 0), Point3d.create(x + length, y, 0)));\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n return imodel.elements.insertElement(elementProps);\n}\n\ninterface ExpectedElementGeometryEntry {\n opcode: ElementGeometryOpcode;\n geometryCategory?: GeometryQueryCategory;\n geometrySubCategory?: string;\n originalEntry?: ElementGeometryDataEntry;\n geomParams?: GeometryParams;\n}\n\nfunction validateElementInfo(info: ElementGeometryInfo, expected: ExpectedElementGeometryEntry[], isWorld: boolean): void {\n assert.isTrue(undefined !== info.entryArray && expected.length === info.entryArray.length);\n const geomParams = (undefined !== info.categoryId ? new GeometryParams(info.categoryId) : undefined);\n\n info.entryArray.forEach((entry, i) => {\n assert.isTrue(expected[i].opcode === entry.opcode);\n\n if (ElementGeometry.isGeometryQueryEntry(entry)) {\n const geom = ElementGeometry.toGeometryQuery(entry);\n assert.exists(geom);\n\n if (undefined !== expected[i].geometryCategory) {\n assert.isTrue(expected[i].geometryCategory === geom?.geometryCategory);\n }\n\n if (undefined !== expected[i].geometrySubCategory) {\n switch (expected[i].geometryCategory) {\n case \"curvePrimitive\": {\n assert.isTrue(geom instanceof CurvePrimitive);\n assert.isTrue(expected[i].geometrySubCategory === (geom as CurvePrimitive).curvePrimitiveType);\n break;\n }\n case \"curveCollection\": {\n assert.isTrue(geom instanceof CurveCollection);\n assert.isTrue(expected[i].geometrySubCategory === (geom as CurveCollection).curveCollectionType);\n break;\n }\n case \"solid\": {\n assert.isTrue(geom instanceof SolidPrimitive);\n assert.isTrue(expected[i].geometrySubCategory === (geom as SolidPrimitive).solidPrimitiveType);\n break;\n }\n }\n }\n } else if (ElementGeometry.isGeometricEntry(entry)) {\n switch (entry.opcode) {\n case ElementGeometryOpcode.BRep:\n const brep = ElementGeometry.toBRep(entry);\n assert.exists(brep);\n if (!isWorld && undefined !== expected[i].originalEntry) {\n const other = ElementGeometry.toBRep(expected[i].originalEntry);\n assert.exists(other);\n // NOTE: Don't compare brep type; set from entity data by backend, ignored if supplied to update...\n const transform = Transform.fromJSON(brep?.transform);\n const otherTrans = Transform.fromJSON(other?.transform);\n assert.isTrue(transform.isAlmostEqual(otherTrans));\n const faceSymbLen = (undefined !== brep?.faceSymbology ? brep?.faceSymbology.length : 0);\n const otherSymbLen = (undefined !== other?.faceSymbology ? other?.faceSymbology.length : 0);\n assert.isTrue(faceSymbLen === otherSymbLen);\n }\n break;\n case ElementGeometryOpcode.TextString:\n const text = ElementGeometry.toTextString(entry);\n assert.exists(text);\n if (!isWorld && undefined !== expected[i].originalEntry) {\n const other = ElementGeometry.toTextString(expected[i].originalEntry);\n assert.exists(other);\n assert.isTrue(text?.font === other?.font);\n assert.isTrue(text?.text === other?.text);\n assert.isTrue(text?.bold === other?.bold);\n assert.isTrue(text?.italic === other?.italic);\n assert.isTrue(text?.underline === other?.underline);\n assert.isTrue(text?.height === other?.height);\n assert.isTrue(text?.widthFactor === other?.widthFactor);\n const origin = Point3d.fromJSON(text?.origin);\n const otherOrigin = Point3d.fromJSON(other?.origin);\n assert.isTrue(origin.isAlmostEqual(otherOrigin));\n const angles = YawPitchRollAngles.fromJSON(text?.rotation);\n const otherAngles = YawPitchRollAngles.fromJSON(other?.rotation);\n assert.isTrue(angles.isAlmostEqual(otherAngles));\n }\n break;\n case ElementGeometryOpcode.Image:\n const image = ElementGeometry.toImageGraphic(entry);\n assert.exists(image);\n if (!isWorld && undefined !== expected[i].originalEntry) {\n const other = ElementGeometry.toImageGraphic(expected[i].originalEntry);\n assert.exists(other);\n assert.isTrue(image?.textureId === other?.textureId);\n assert.isTrue(image?.hasBorder === other?.hasBorder);\n const corners = ImageGraphicCorners.fromJSON(image!.corners);\n const otherCorners = ImageGraphicCorners.fromJSON(other!.corners);\n assert.isTrue(corners[0].isAlmostEqual(otherCorners[0]));\n assert.isTrue(corners[1].isAlmostEqual(otherCorners[1]));\n assert.isTrue(corners[2].isAlmostEqual(otherCorners[2]));\n assert.isTrue(corners[3].isAlmostEqual(otherCorners[3]));\n }\n break;\n default:\n assert.isTrue(false);\n break;\n }\n } else if (ElementGeometryOpcode.SubGraphicRange === entry.opcode) {\n const subRange = ElementGeometry.toSubGraphicRange(entry);\n assert.exists(subRange);\n assert.isFalse(subRange?.isNull);\n } else if (ElementGeometryOpcode.PartReference === entry.opcode) {\n const partToElement = Transform.createIdentity();\n const part = ElementGeometry.toGeometryPart(entry, partToElement);\n assert.exists(part);\n if (!isWorld && undefined !== expected[i].originalEntry) {\n const otherToElement = Transform.createIdentity();\n const other = ElementGeometry.toGeometryPart(expected[i].originalEntry, otherToElement);\n assert.exists(other);\n assert.isTrue(partToElement.isAlmostEqual(otherToElement));\n }\n } else if (ElementGeometry.isAppearanceEntry(entry)) {\n if (undefined !== geomParams) {\n const updated = ElementGeometry.updateGeometryParams(entry, geomParams);\n assert.isTrue(updated);\n if (!isWorld && undefined !== expected[i].geomParams)\n assert.isTrue(geomParams.isEquivalent(expected[i].geomParams));\n }\n }\n });\n}\n\nfunction validateGeometricElementProps(info: ElementGeometryInfo, expected: GeometricElement3dProps): void {\n assert.isFalse(undefined === info.categoryId || undefined === info.sourceToWorld || undefined === info.bbox);\n assert.isTrue(expected.category === info.categoryId);\n const placement = Placement3d.fromJSON(expected.placement);\n const sourceToWorld = ElementGeometry.toTransform(info.sourceToWorld!);\n assert.exists(sourceToWorld);\n assert.isTrue(sourceToWorld?.isAlmostEqual(placement.transform));\n const bbox = ElementGeometry.toElementAlignedBox3d(info.bbox!);\n assert.isFalse(bbox?.isNull);\n}\n\nfunction doElementGeometryValidate(imodel: SnapshotDb, elementId: Id64String, expected: ExpectedElementGeometryEntry[], isWorld: boolean, elementProps?: GeometricElement3dProps, brepOpt?: number): IModelStatus {\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\n if (undefined !== elementProps)\n validateGeometricElementProps(info, elementProps);\n\n if (1 === brepOpt || 2 === brepOpt)\n assert.isTrue(info.brepsPresent);\n\n validateElementInfo(info, expected, isWorld);\n };\n\n const requestProps: ElementGeometryRequest = {\n onGeometry,\n elementId,\n };\n\n if (1 === brepOpt)\n requestProps.replaceBReps = true;\n else if (2 === brepOpt)\n requestProps.skipBReps = true;\n\n return imodel.elementGeometryRequest(requestProps);\n}\n\nfunction createGeometricElemFromSeed(imodel: SnapshotDb, seedId: Id64String, entryArray: ElementGeometryDataEntry[], placement?: Placement3dProps): Id64String {\n const seedElement = imodel.elements.getElement<GeometricElement>(seedId);\n assert.exists(seedElement);\n\n const elementProps = createPhysicalElementProps(seedElement, placement);\n elementProps.elementGeometryBuilderParams = { entryArray };\n\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n return newId;\n}\n\ndescribe(\"GeometryStream\", () => {\n let imodel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"create GeometricElement3d using line codes 1-7\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n // init line code to line pixels array\n const lsCodes: LinePixels[] = [LinePixels.Solid, LinePixels.Code1, LinePixels.Code2, LinePixels.Code3, LinePixels.Code4, LinePixels.Code5, LinePixels.Code6, LinePixels.Code7];\n\n // create new line style definitions for line codes 1-7\n const lsStyles: Id64String[] = [];\n lsCodes.forEach((linePixels) => {\n lsStyles.push(LinePixels.Solid === linePixels ? Id64.invalid : LineStyleDefinition.Utils.getOrCreateLinePixelsStyle(imodel, IModel.dictionaryId, linePixels));\n });\n\n // get existing line style definitions for line codes 1-7\n const lsStylesExist: Id64String[] = [];\n lsCodes.forEach((linePixels) => {\n lsStylesExist.push(LinePixels.Solid === linePixels ? Id64.invalid : LineStyleDefinition.Utils.getOrCreateLinePixelsStyle(imodel, IModel.dictionaryId, linePixels));\n });\n\n // make sure we found existing styles and didn't create a second set\n assert.isTrue(8 === lsStyles.length && lsStyles.length === lsStylesExist.length);\n for (let iStyle = 0; iStyle < lsStyles.length; ++iStyle) {\n assert.isTrue(0 === iStyle || Id64.isValidId64(lsStyles[iStyle]));\n assert.isTrue(lsStylesExist[iStyle] === (lsStyles[iStyle]));\n }\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n const pointS = Point3d.createZero();\n const pointE = Point3d.create(5, 0, 0);\n\n lsStyles.forEach((styleId) => {\n params.styleInfo = Id64.isValidId64(styleId) ? new LineStyle.Info(styleId) : undefined;\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(pointS, pointE));\n pointS.y += 0.5;\n pointE.y += 0.5;\n });\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n // Extract and test value returned...\n const value = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const itNextCheck = new GeometryStreamIterator(value.geom!, value.category);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isFalse(itNextCheck.next().done);\n assert.isTrue(itNextCheck.next().done);\n\n const lsStylesUsed: Id64String[] = [];\n const it = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of it) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n lsStylesUsed.push(entry.geomParams.styleInfo ? entry.geomParams.styleInfo.styleId : Id64.invalid);\n }\n\n // Make sure we extracted same style information after round trip...\n assert.isTrue(lsStyles.length === lsStylesUsed.length);\n for (let iStyle = 0; iStyle < lsStyles.length; ++iStyle) {\n assert.isTrue(lsStylesUsed[iStyle] === (lsStyles[iStyle]));\n }\n });\n\n it(\"create GeometricElement3d using continuous style\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n // create special \"internal default\" continuous style for drawing curves using width overrides\n const styleId = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId);\n assert.isTrue(Id64.isValidId64(styleId));\n\n // make sure we found existing style and didn't create a new one\n const styleIdExists = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId);\n assert.isTrue(Id64.isValidId64(styleIdExists) && styleIdExists === (styleId));\n\n // create continuous style with pre-defined constant width\n const styleIdWidth = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId, 0.05);\n assert.isTrue(Id64.isValidId64(styleIdWidth));\n\n // make sure we found existing style and didn't create a new one\n const styleIdWidthExists = LineStyleDefinition.Utils.getOrCreateContinuousStyle(imodel, IModel.dictionaryId, 0.05);\n assert.isTrue(Id64.isValidId64(styleIdWidthExists) && styleIdWidthExists === (styleIdWidth));\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n const styles: Id64String[] = [styleId, styleId, styleIdWidth, styleIdWidth];\n const widths: number[] = [0.0, 0.025, 0.0, 0.075];\n\n // add line using 0 width continuous style\n params.styleInfo = new LineStyle.Info(styles[0]);\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.create(0, 0, 0), Point3d.create(0, 5, 0)));\n\n // add line with width override, undefined endWidth = startWidth, needed solely for taper\n params.styleInfo.styleMod = new LineStyle.Modifier({ startWidth: widths[1], physicalWidth: true });\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.create(0.5, 0, 0), Point3d.create(0.5, 5, 0)));\n\n // add line using pre-defined width continuous style\n params.styleInfo = new LineStyle.Info(styles[2]);\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.create(1.0, 0, 0), Point3d.create(1.0, 5, 0)));\n\n // add line with width override, undefined endWidth = startWidth, needed solely for taper\n params.styleInfo.styleMod = new LineStyle.Modifier({ startWidth: widths[3], physicalWidth: true });\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.create(1.5, 0, 0), Point3d.create(1.5, 5, 0)));\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n // Extract and test value returned...\n const value = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const stylesUsed: Id64String[] = [];\n const widthsUsed: number[] = [];\n const it = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of it) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n assert.isDefined(entry.geomParams.styleInfo);\n stylesUsed.push(entry.geomParams.styleInfo!.styleId);\n widthsUsed.push(entry.geomParams.styleInfo!.styleMod !== undefined ? entry.geomParams.styleInfo!.styleMod.startWidth! : 0.0);\n }\n\n // Make sure we extracted same style information after round trip...\n assert.isTrue(styles.length === stylesUsed.length);\n for (let iStyle = 0; iStyle < styles.length; ++iStyle) {\n assert.isTrue(stylesUsed[iStyle] === (styles[iStyle]));\n assert.isTrue(Geometry.isSameCoordinate(widthsUsed[iStyle], widths[iStyle]));\n }\n });\n\n function createGeometricElem3dUsingArrowHeadNoStrokePattern(definitionModelId?: Id64String, physicalModelId?: Id64String) {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n if (definitionModelId === undefined)\n definitionModelId = IModel.dictionaryId;\n\n if (physicalModelId === undefined)\n physicalModelId = seedElement.model;\n\n const partBuilder = new GeometryStreamBuilder();\n const partParams = new GeometryParams(Id64.invalid); // category won't be used\n\n partParams.fillDisplay = FillDisplay.Always;\n partBuilder.appendGeometryParamsChange(partParams);\n partBuilder.appendGeometry(Loop.create(LineString3d.create(Point3d.create(0.1, 0, 0), Point3d.create(0, -0.05, 0), Point3d.create(0, 0.05, 0), Point3d.create(0.1, 0, 0))));\n\n const partProps = createGeometryPartProps(partBuilder.geometryStream, definitionModelId);\n const partId = imodel.elements.insertElement(partProps);\n assert.isTrue(Id64.isValidId64(partId));\n\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId }); // base and size will be set automatically...\n assert.isTrue(undefined !== pointSymbolData);\n\n // Use internal default instead of creating a stroke component for a solid line\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: \"TestArrowHead\", lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveEnd }] });\n assert.isTrue(undefined !== strokePointData);\n\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\n assert.isTrue(undefined !== compoundData);\n\n const styleId = LineStyleDefinition.Utils.createStyle(imodel, definitionModelId, \"TestArrowStyle\", compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n params.styleInfo = new LineStyle.Info(styleId);\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(-1, -1, 0)));\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream, physicalModelId);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId, styleId])!;\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\n assert.isTrue(usageInfo.lineStyleIds!.includes(styleId));\n assert.isTrue(usageInfo.usedIds!.includes(partId));\n assert.isTrue(usageInfo.usedIds!.includes(styleId));\n }\n\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern\", async () => {\n createGeometricElem3dUsingArrowHeadNoStrokePattern();\n });\n\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern - deleteElementTree fails\", async () => {\n const mySubject = Subject.insert(imodel, IModel.rootSubjectId, \"My Subject - fails\");\n const myDefModel = DefinitionModel.insert(imodel, mySubject, \"My Definitions - fails\");\n const myPhysicalModel = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), false, mySubject)[0];\n\n createGeometricElem3dUsingArrowHeadNoStrokePattern(myDefModel, myPhysicalModel);\n\n deleteElementTree({ iModel: imodel, topElement: mySubject, maxPasses: 1 });\n expect(imodel.elements.tryGetElement(mySubject)).not.undefined;\n });\n\n it(\"create GeometricElement3d using arrow head style w/o using stroke pattern - deleteElementTree succeeds with 2 passes\", async () => {\n const mySubject = Subject.insert(imodel, IModel.rootSubjectId, \"My Subject - success\");\n const myDefModel = DefinitionModel.insert(imodel, mySubject, \"My Definitions - success\");\n const myPhysicalModel = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), false, mySubject)[0];\n\n createGeometricElem3dUsingArrowHeadNoStrokePattern(myDefModel, myPhysicalModel);\n\n deleteElementTree({ iModel: imodel, topElement: mySubject, maxPasses: 2 });\n expect(imodel.elements.tryGetElement(mySubject)).undefined;\n });\n\n it(\"create GeometricElement3d using compound style with dash widths and symbol\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const lsStrokes: LineStyleDefinition.Strokes = [];\n lsStrokes.push({ length: 0.25, orgWidth: 0.0, endWidth: 0.025, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Left });\n lsStrokes.push({ length: 0.1 });\n lsStrokes.push({ length: 0.1, orgWidth: 0.025, endWidth: 0.025, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full });\n lsStrokes.push({ length: 0.1 });\n lsStrokes.push({ length: 0.25, orgWidth: 0.025, endWidth: 0.0, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Right });\n lsStrokes.push({ length: 0.1 });\n\n const strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: \"TestDashDotDashLineCode\", strokes: lsStrokes });\n assert.isTrue(undefined !== strokePatternData);\n\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Arc3d.createXY(Point3d.createZero(), 0.05));\n\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\n const partId = imodel.elements.insertElement(partProps);\n assert.isTrue(Id64.isValidId64(partId));\n\n const pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId }); // base and size will be set automatically...\n assert.isTrue(undefined !== pointSymbolData);\n\n const lsSymbols: LineStyleDefinition.Symbols = [];\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\n\n const strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: \"TestGapSymbolsLinePoint\", lcId: strokePatternData.compId, symbols: lsSymbols });\n assert.isTrue(undefined !== strokePointData);\n\n const lsComponents: LineStyleDefinition.Components = [];\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\n\n const compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\n assert.isTrue(undefined !== compoundData);\n\n const styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, \"TestDashCircleDotCircleDashStyle\", compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n params.styleInfo = new LineStyle.Info(styleId);\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(LineSegment3d.create(Point3d.createZero(), Point3d.create(5, 5, 0)));\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId, styleId, seedElement.category])!;\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\n assert.isTrue(usageInfo.lineStyleIds!.includes(styleId));\n assert.isTrue(usageInfo.spatialCategoryIds!.includes(seedElement.category));\n assert.isTrue(usageInfo.usedIds!.includes(partId));\n assert.isTrue(usageInfo.usedIds!.includes(styleId));\n assert.isTrue(usageInfo.usedIds!.includes(seedElement.category));\n });\n\n it(\"create GeometricElement3d with line styles to check bounding box padding\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n // LineStyleDefinition: create special \"internal default\" continuous style for drawing curves using width overrides\n let x = 0.0;\n let y = 0.0;\n let unitDef = 1.0;\n let widthDef = 0.0;\n let name = `Continuous-${unitDef}-${widthDef}`;\n let styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: 0, compType: LineStyleDefinition.ComponentType.Internal, flags: LineStyleDefinition.StyleFlags.Continuous | LineStyleDefinition.StyleFlags.NoSnap });\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect no range padding...\n let newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0));\n\n // Expect range padded by 0.25...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // LineStyleDefinition: create continuous style with both width and unit scale specified in definition...\n x = 0.0;\n y++;\n unitDef = 2.0;\n widthDef = 0.5;\n name = `Continuous-${unitDef}-${widthDef}`;\n let strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: [{ length: 1e37, orgWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full }] });\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.Continuous | LineStyleDefinition.StyleFlags.NoSnap, unitDef });\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect no range padding...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.0, physicalWidth: true })));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0));\n\n // Expect range padded by 1.0...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\n\n // Expect range padded by 0.25...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // LineStyleDefinition: create stroke pattern with dash widths in definition...\n x = 0.0;\n y++;\n unitDef = 1.0;\n widthDef = 0.025;\n name = `StrokePattern-${unitDef}-${widthDef}`;\n const lsStrokes: LineStyleDefinition.Strokes = [];\n lsStrokes.push({ length: 0.25, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Left });\n lsStrokes.push({ length: 0.1 });\n lsStrokes.push({ length: 0.2, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Full });\n lsStrokes.push({ length: 0.1 });\n lsStrokes.push({ length: 0.25, orgWidth: widthDef, endWidth: widthDef, strokeMode: LineStyleDefinition.StrokeMode.Dash, widthMode: LineStyleDefinition.StrokeWidth.Right });\n lsStrokes.push({ length: 0.1 });\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.NoSnap });\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.025...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\n\n // Expect range padded by 0.25...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // LineStyleDefinition: create stroke pattern with dash widths and unit scale specified in definition...\n x = 0.0;\n y++;\n unitDef = 2.0;\n widthDef = 0.025;\n name = `StrokePattern-${unitDef}-${widthDef}`;\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, { compId: strokePatternData.compId, compType: strokePatternData.compType, flags: LineStyleDefinition.StyleFlags.NoSnap, unitDef });\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.05...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef));\n\n // Expect range padded by 0.25...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, physicalWidth: true })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // Expect range padded by 0.25...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.25, scale: 0.5, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // Expect range padded by 0.025...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.blue);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), widthDef * unitDef * 0.5));\n\n // LineStyleDefinition: create point symbol with internal default instead of a stroke pattern...\n x = 0.0;\n y++;\n unitDef = 1.0;\n widthDef = 1.0;\n name = `PointSymbol-${unitDef}-${widthDef}`;\n const partId = createCirclePart(0.25, imodel);\n let pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId });\n let strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: 0, lcType: LineStyleDefinition.ComponentType.Internal, symbols: [{ symId: pointSymbolData!.compId, strokeNum: -1, mod1: LineStyleDefinition.SymbolOptions.CurveOrigin }] });\n let compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: [{ id: strokePointData.compId, type: strokePointData.compType }, { id: 0, type: LineStyleDefinition.ComponentType.Internal }] });\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.5 (circle radius)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\n\n // Expect range padded by 0.25 (scaled circle radius)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.25));\n\n // Expect range padded by 1.0 (width override > symbol size)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 1.0, scale: 0.5, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 1.0));\n\n // LineStyleDefinition: create scaling point symbol with stroke pattern with width and unit scale specified in definition...\n x = 0.0;\n y++;\n unitDef = 0.5;\n widthDef = 0.025; // value used for lsStrokes...\n name = `PointSymbol-${unitDef}-${widthDef}}`;\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0 });\n const lsSymbols: LineStyleDefinition.Symbols = [];\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\n const lsComponents: LineStyleDefinition.Components = [];\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\n compoundData.unitDef = unitDef;\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.125 (symbol and unit scaled circle radius)......\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.125));\n\n // Expect range padded by 0.0625 (symbol and modifier scaled circle radius)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.0625));\n\n // Expect range padded by 0.75 (width override > symbol and modifier scaled symbol size)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\n\n // LineStyleDefinition: create non-scaling point symbol with stroke pattern with width and unit scale specified in definition...\n x = 0.0;\n y++;\n unitDef = 0.5;\n widthDef = 0.025; // value used for lsStrokes...\n name = `NonScalingPointSymbol-${unitDef}-${widthDef}}`;\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0, symFlags: LineStyleDefinition.PointSymbolFlags.NoScale });\n lsSymbols.length = 0;\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center });\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center });\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\n lsComponents.length = 0;\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\n compoundData.unitDef = unitDef;\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.5 (circle radius)......\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\n\n // Expect range padded by 0.5 (unscaled circle radius)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.5));\n\n // Expect range padded by 0.75 (width override > unscaled symbol size)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\n\n // LineStyleDefinition: create scaling point symbol with offsets with stroke pattern with width and unit scale specified in definition...\n x = 0.0;\n y++;\n unitDef = 0.5;\n widthDef = 0.025; // value used for lsStrokes...\n name = `OffsetPointSymbol-${unitDef}-${widthDef}}`;\n strokePatternData = LineStyleDefinition.Utils.createStrokePatternComponent(imodel, { descr: name, strokes: lsStrokes });\n pointSymbolData = LineStyleDefinition.Utils.createPointSymbolComponent(imodel, { geomPartId: partId, scale: 2.0 });\n lsSymbols.length = 0;\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 1, mod1: LineStyleDefinition.SymbolOptions.Center, yOffset: -0.1 });\n lsSymbols.push({ symId: pointSymbolData!.compId, strokeNum: 3, mod1: LineStyleDefinition.SymbolOptions.Center, yOffset: 0.1 });\n strokePointData = LineStyleDefinition.Utils.createStrokePointComponent(imodel, { descr: name, lcId: strokePatternData.compId, symbols: lsSymbols });\n lsComponents.length = 0;\n lsComponents.push({ id: strokePointData.compId, type: strokePointData.compType });\n lsComponents.push({ id: strokePatternData.compId, type: strokePatternData.compType });\n compoundData = LineStyleDefinition.Utils.createCompoundComponent(imodel, { comps: lsComponents });\n compoundData.unitDef = unitDef;\n styleId = LineStyleDefinition.Utils.createStyle(imodel, IModel.dictionaryId, name, compoundData);\n assert.isTrue(Id64.isValidId64(styleId));\n\n // Expect range padded by 0.225 (offset symbol and unit scaled circle radius)......\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId));\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.225));\n\n // Expect range padded by 0.1125 (offset symbol and modifier scaled circle radius)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ scale: 0.5 })), ColorDef.red);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.1125));\n\n // Expect range padded by 0.75 (width override > symbol and modifier scaled symbol size)...\n newId = createStyledLineElem(imodel, seedElement, x++, y, 1.0, new LineStyle.Info(styleId, new LineStyle.Modifier({ startWidth: 0.75, scale: 0.5, physicalWidth: true })), ColorDef.green);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n assert.isTrue(Geometry.isSameCoordinate(Placement3d.fromJSON(imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true }).placement).bbox.yLength(), 0.75));\n });\n\n it(\"create GeometricElement3d using shapes with fill/gradient\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n builder.appendGeometryRanges(); // Test inclusion of local ranges...\n\n const xOffset = Transform.createTranslation(Point3d.create(1.5));\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\n\n // No fill...\n params.lineColor = ColorDef.green;\n params.weight = 5;\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(shape);\n\n // Opaque fill by view...\n params.fillDisplay = FillDisplay.ByView;\n params.fillColor = params.lineColor;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Outline fill by view...\n params.fillColor = ColorDef.red;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Outline transparency fill always...\n params.fillDisplay = FillDisplay.Always;\n params.fillTransparency = 0.75;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Opaque background fill always...\n params.backgroundFill = BackgroundFill.Solid;\n params.fillTransparency = 0.0;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Outline background fill always...\n params.backgroundFill = BackgroundFill.Outline;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Opaque gradient by view...\n params.fillDisplay = FillDisplay.ByView;\n params.gradient = new Gradient.Symb();\n params.gradient.mode = Gradient.Mode.Linear;\n params.gradient.flags = Gradient.Flags.Invert;\n params.gradient.keys.push(new Gradient.KeyColor({ value: 0.0, color: ColorDef.blue.toJSON() }));\n params.gradient.keys.push(new Gradient.KeyColor({ value: 0.5, color: ColorDef.red.toJSON() }));\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Outline gradient by view...Display issue, changes to gradient being ignored???\n params.gradient.flags = Gradient.Flags.Outline;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n // Extract and test value returned...\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n let iShape = 0;\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n switch (iShape++) {\n case 0:\n assert.isTrue(undefined === entry.geomParams.fillDisplay || FillDisplay.Never === entry.geomParams.fillDisplay);\n break;\n case 1:\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\n assert.isTrue(entry.geomParams.lineColor!.equals(entry.geomParams.fillColor!));\n break;\n case 2:\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\n assert.isFalse(entry.geomParams.lineColor!.equals(entry.geomParams.fillColor!));\n break;\n case 3:\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\n assert.isFalse(0.0 === entry.geomParams.fillTransparency);\n break;\n case 4:\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\n assert.isTrue(BackgroundFill.Solid === entry.geomParams.backgroundFill);\n break;\n case 5:\n assert.isTrue(FillDisplay.Always === entry.geomParams.fillDisplay);\n assert.isTrue(BackgroundFill.Outline === entry.geomParams.backgroundFill);\n break;\n case 6:\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\n assert.isDefined(entry.geomParams.gradient);\n assert.isTrue(0 === (Gradient.Flags.Outline & entry.geomParams.gradient!.flags));\n break;\n case 7:\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\n assert.isDefined(entry.geomParams.gradient);\n assert.isFalse(0 === (Gradient.Flags.Outline & entry.geomParams.gradient!.flags));\n break;\n }\n }\n assert.isTrue(8 === iShape);\n });\n\n it(\"create GeometricElement3d using shapes with patterns\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n builder.appendGeometryRanges(); // Test inclusion of local ranges...\n\n const xOffset = Transform.createTranslation(Point3d.create(1.5));\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\n\n // Hatch w/o overrides\n params.lineColor = ColorDef.create(ColorByName.yellow);\n params.weight = 5;\n params.pattern = new AreaPattern.Params();\n params.pattern.space1 = 0.05;\n params.pattern.angle1 = Angle.createDegrees(45.0);\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(shape);\n\n // Cross hatch with color/weight override\n params.pattern.space2 = 0.1;\n params.pattern.angle2 = Angle.createDegrees(-30.0);\n params.pattern.color = ColorDef.red;\n params.pattern.weight = 0;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n const partBuilder = new GeometryStreamBuilder();\n partBuilder.appendGeometry(Arc3d.createXY(Point3d.createZero(), 0.05));\n\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\n const partId = imodel.elements.insertElement(partProps);\n assert.isTrue(Id64.isValidId64(partId));\n\n // Area pattern w/o overrides\n params.pattern = new AreaPattern.Params();\n params.pattern.symbolId = partId;\n params.pattern.space1 = params.pattern.space2 = 0.05;\n params.pattern.angle1 = Angle.createDegrees(45.0);\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Area pattern with color/weight overrides, snappable geometry, and invisible boundary\n params.pattern.origin = Point3d.create(0.05, 0.05, 0.0);\n params.pattern.space1 = params.pattern.space2 = params.pattern.angle1 = undefined;\n params.pattern.color = ColorDef.red;\n params.pattern.weight = 1;\n params.pattern.snappable = params.pattern.invisibleBoundary = true;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Hatch definition w/o overrides (zig-zag)\n const defLines: AreaPattern.HatchDefLine[] = [\n { offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\n { angle: Angle.createDegrees(90.0), through: Point2d.create(0.1, 0.0), offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\n ];\n\n params.pattern = new AreaPattern.Params();\n params.pattern.defLines = defLines;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n // Hatch definition with color/weight overrides\n params.pattern.color = ColorDef.red;\n params.pattern.weight = 1;\n builder.appendGeometryParamsChange(params);\n shape.tryTransformInPlace(xOffset);\n builder.appendGeometry(shape);\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n // Extract and test value returned...\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n let iShape = 0;\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n assert.isDefined(entry.geomParams.pattern);\n switch (iShape++) {\n case 0:\n assert.isTrue(undefined !== entry.geomParams.pattern!.space1 && undefined !== entry.geomParams.pattern!.angle1 && undefined === entry.geomParams.pattern!.space2 && undefined === entry.geomParams.pattern!.angle2);\n break;\n case 1:\n assert.isTrue(undefined !== entry.geomParams.pattern!.space1 && undefined !== entry.geomParams.pattern!.angle1 && undefined !== entry.geomParams.pattern!.space2 && undefined !== entry.geomParams.pattern!.angle2);\n break;\n case 2:\n assert.isTrue(undefined !== entry.geomParams.pattern!.symbolId && undefined === entry.geomParams.pattern!.color);\n break;\n case 3:\n assert.isTrue(undefined !== entry.geomParams.pattern!.symbolId && undefined !== entry.geomParams.pattern!.color);\n break;\n case 4:\n assert.isTrue(undefined !== entry.geomParams.pattern!.defLines && undefined === entry.geomParams.pattern!.color);\n break;\n case 5:\n assert.isTrue(undefined !== entry.geomParams.pattern!.defLines && undefined !== entry.geomParams.pattern!.color);\n break;\n }\n }\n assert.isTrue(6 === iShape);\n\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId])!;\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\n assert.isTrue(usageInfo.usedIds!.includes(partId));\n });\n\n it(\"create GeometricElement3d with material and sub-category\", async () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n\n const subCategory = SubCategory.create(imodel, seedElement.category, \"testSubCat\", { weight: 2 });\n const subCategoryId = imodel.elements.insertElement(subCategory.toJSON());\n imodel.saveChanges();\n\n const params = new GeometryParams(seedElement.category);\n params.subCategoryId = subCategoryId;\n params.materialId = \"0x5\";\n\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\n\n // Test flatbuffer roundtrip...\n const builderF = new ElementGeometry.Builder();\n builderF.appendGeometryParamsChange(params);\n builderF.appendGeometryQuery(shape);\n\n const elementPropsF = createPhysicalElementProps(seedElement);\n elementPropsF.elementGeometryBuilderParams = { entryArray: builderF.entries };\n\n const newIdF = imodel.elements.insertElement(elementPropsF);\n assert.isTrue(Id64.isValidId64(newIdF));\n imodel.saveChanges();\n\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray);\n const it = new ElementGeometry.Iterator(info);\n\n for (const entry of it) {\n if (ElementGeometry.isGeometryQueryEntry(entry.value)) {\n assert.isTrue(params.subCategoryId === entry.geomParams.subCategoryId && params.materialId === entry.geomParams.materialId);\n }\n };\n };\n\n const status = imodel.elementGeometryRequest({ elementId: newIdF, onGeometry });\n assert(IModelStatus.Success === status)\n\n // Test JSON roundtrip...\n const builderJ = new GeometryStreamBuilder();\n builderJ.appendGeometryParamsChange(params);\n builderJ.appendGeometry(shape);\n\n const elementPropsJ = createPhysicalElementProps(seedElement);\n elementPropsJ.geom = builderJ.geometryStream;\n\n const newIdJ = imodel.elements.insertElement(elementPropsJ);\n assert.isTrue(Id64.isValidId64(newIdJ));\n imodel.saveChanges();\n\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newIdJ, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n assert.isTrue(params.subCategoryId === entry.geomParams.subCategoryId && params.materialId === entry.geomParams.materialId);\n }\n });\n\n it(\"create GeometricElement3d from world coordinate text using a newly added font\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const foundFont = imodel.fonts.findId({ name: \"Vera\" })!;\n assert.exists(foundFont);\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\n const builder = new GeometryStreamBuilder();\n\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform...\n\n const textProps: TextStringProps = {\n text: \"ABC\",\n font: foundFont,\n height: 2,\n bold: true,\n origin: testOrigin,\n rotation: testAngles,\n };\n\n const textString = new TextString(textProps);\n const status = builder.appendTextString(textString);\n assert.isTrue(status);\n\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned, text transform should now be identity as it is accounted for by element's placement...\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n let gotHeader = false;\n for (const entry of value.geom!) {\n expect(undefined === entry.header).to.equal(gotHeader);\n if (undefined !== entry.header) {\n gotHeader = true;\n } else {\n assert.isDefined(entry.textString);\n const origin = Point3d.fromJSON(entry.textString!.origin);\n const rotation = YawPitchRollAngles.fromJSON(entry.textString!.rotation);\n assert.isTrue(origin.isAlmostZero);\n assert.isTrue(rotation.isIdentity());\n }\n }\n\n expect(gotHeader).to.be.true;\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assertTrue(entry.primitive.type === \"textString\");\n assert.isTrue(entry.primitive.textString.origin.isAlmostZero);\n assert.isTrue(entry.primitive.textString.rotation.isIdentity());\n }\n\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(value as GeometricElement3dProps);\n for (const entry of itWorld) {\n assertTrue(entry.primitive.type === \"textString\");\n assert.isTrue(entry.primitive.textString.origin.isAlmostEqual(testOrigin));\n assert.isTrue(entry.primitive.textString.rotation.isAlmostEqual(testAngles));\n }\n });\n\n it(\"create GeometryPart from arcs\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const partBuilder = new GeometryStreamBuilder();\n\n for (const geom of geomArray) {\n partBuilder.appendGeometry(geom);\n }\n\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\n const testPart = imodel.elements.createElement(partProps);\n const partId = imodel.elements.insertElement(testPart.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: partId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const geomArrayOut: Arc3d[] = [];\n const itLocal = GeometryStreamIterator.fromGeometryPart(value as GeometryPartProps);\n for (const entry of itLocal) {\n assertTrue(entry.primitive.type === \"geometryQuery\");\n assertTrue(entry.primitive.geometry instanceof Arc3d);\n geomArrayOut.push(entry.primitive.geometry);\n }\n\n assert.isTrue(geomArrayOut.length === geomArray.length);\n for (let i = 0; i < geomArrayOut.length; i++) {\n assert.isTrue(geomArrayOut[i].isAlmostEqual(geomArray[i]));\n }\n\n const usageInfo = imodel[_nativeDb].queryDefinitionElementUsage([partId])!;\n assert.isTrue(usageInfo.geometryPartIds!.includes(partId));\n assert.isUndefined(usageInfo.usedIds, \"GeometryPart should not to be used by any GeometricElement\");\n });\n\n it(\"create GeometricElement3d from arcs\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const builder = new GeometryStreamBuilder();\n\n for (const geom of geomArray) {\n builder.appendGeometry(geom);\n }\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const geomArrayOut: Arc3d[] = [];\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assertTrue(entry.primitive.type === \"geometryQuery\");\n assertTrue(entry.primitive.geometry instanceof Arc3d);\n geomArrayOut.push(entry.primitive.geometry);\n }\n\n assert.isTrue(geomArrayOut.length === geomArray.length);\n for (let i = 0; i < geomArrayOut.length; i++) {\n assert.isTrue(geomArrayOut[i].isAlmostEqual(geomArray[i]));\n }\n });\n\n it(\"create GeometricElement3d partToWorld test\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const arc = Arc3d.createXY(Point3d.create(0, 0), 1);\n const partBuilder = new GeometryStreamBuilder();\n\n partBuilder.appendGeometry(arc);\n\n const partProps = createGeometryPartProps(partBuilder.geometryStream);\n const testPart = imodel.elements.createElement(partProps);\n const partId = imodel.elements.insertElement(testPart.toJSON());\n imodel.saveChanges();\n\n const builder = new GeometryStreamBuilder();\n const shapePts: Point3d[] = [Point3d.create(1, 1, 0), Point3d.create(2, 1, 0), Point3d.create(2, 2, 0), Point3d.create(1, 2, 0)];\n const testOrigin = Point3d.create(0.5, 0.5, 0);\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\n\n builder.setLocalToWorld3d(testOrigin, testAngles);\n builder.appendGeometry(Loop.create(LineString3d.create(shapePts)));\n shapePts.forEach((pt) => builder.appendGeometryPart3d(partId, pt, undefined, 0.25)); // Position part (arc center) at each vertex...\n\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned\n const valueElem = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\n assert.isDefined(valueElem.geom);\n\n const outPts: Point3d[] = [];\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(valueElem);\n for (const entry of itWorld) {\n if (\"partReference\" !== entry.primitive.type)\n continue;\n assertTrue(partId === entry.primitive.part.id);\n const valuePart = imodel.elements.getElementProps<GeometryPartProps>({ id: entry.primitive.part.id, wantGeometry: true });\n assert.isDefined(valuePart.geom);\n\n const itWorldPart = GeometryStreamIterator.fromGeometryPart(valuePart, undefined, itWorld.partToWorld());\n for (const partEntry of itWorldPart) {\n assertTrue(partEntry.primitive.type === \"geometryQuery\");\n assertTrue(partEntry.primitive.geometry instanceof Arc3d);\n outPts.push(partEntry.primitive.geometry.center);\n }\n }\n\n assert.isTrue(outPts.length === shapePts.length);\n for (let i = 0; i < outPts.length; i++) {\n assert.isTrue(outPts[i].isAlmostEqual(shapePts[i]));\n }\n });\n\n it(\"create GeometricElement3d wire format appearance check\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\n\n params.fillDisplay = FillDisplay.ByView;\n builder.appendGeometryParamsChange(params);\n builder.appendGeometry(shape);\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n // Extract and test value returned...\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n assert.isTrue(FillDisplay.ByView === entry.geomParams.fillDisplay);\n }\n\n const geometryStream: GeometryStreamProps = [];\n\n geometryStream.push({ header: { flags: 0 } });\n geometryStream.push({ appearance: {} }); // Native ToJson should add appearance entry with no defined values for this case...\n geometryStream.push({ fill: { display: FillDisplay.ByView } });\n geometryStream.push({ loop: [{ lineString: [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 0]] }] });\n\n const fromBuilder = JSON.stringify(builder.geometryStream);\n const fromElProps = JSON.stringify(value.geom);\n const fromScratch = JSON.stringify(geometryStream);\n\n assert.isTrue(undefined !== builder.geometryStream[0].appearance && builder.geometryStream[0].appearance.subCategory === IModel.getDefaultSubCategoryId(value.category)); // Ensure default sub-category is specified...\n assert.isTrue(fromElProps !== fromBuilder); // Should not match, default sub-category should not be persisted...\n assert.isTrue(fromElProps === fromScratch);\n });\n\n it(\"create GeometricElement3d from world coordinate brep data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(45, 0, 0);\n const builder = new GeometryStreamBuilder();\n const params = new GeometryParams(seedElement.category);\n\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform...\n\n params.lineColor = ColorDef.red;\n params.weight = 2;\n builder.appendGeometryParamsChange(params);\n\n const brepProps = createBRepDataProps(testOrigin, testAngles);\n builder.appendBRepData(brepProps);\n\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles }, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true, wantBRepData: true });\n assert.isDefined(value.geom);\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.equal(entry.primitive.type, \"brep\");\n }\n\n const itWorld = GeometryStreamIterator.fromGeometricElement3d(value as GeometricElement3dProps);\n for (const entry of itWorld) {\n assert.equal(entry.primitive.type, \"brep\");\n }\n });\n\n it(\"create GeometricElement3d with local coordinate indexed polyface json data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const xOffset = Transform.createTranslation(Point3d.create(2.5));\n const builder = new GeometryStreamBuilder();\n\n // NOTE: It's a good idea to request sub-graphic ranges when adding multiple \"large\" polyfaces to a geometry stream...\n builder.appendGeometryRanges();\n\n const polyface = createIndexedPolyface(5.0);\n builder.appendGeometry(polyface);\n\n polyface.tryTransformInPlace(xOffset); // translate in x...\n builder.appendGeometry(polyface);\n\n polyface.tryTransformInPlace(xOffset); // translate in x again...\n builder.appendGeometry(polyface);\n\n // NOTE: For time comparison with ElementGeometry: create GeometricElement3d with local coordinate indexed polyface flatbuffer data\n let timer = new Timer(\"createGeometricElem\");\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const newId = createGeometricElem(builder.geometryStream, { origin: testOrigin, angles: testAngles }, imodel, seedElement);\n timer.end();\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n timer = new Timer(\"queryGeometricElem\");\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true });\n assert.isDefined(value.geom);\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assert.isTrue(entry.geomParams.categoryId === seedElement.category); // Current appearance information (default sub-category appearance in this case)...\n assert.isTrue(undefined !== entry.localRange && !entry.localRange.isNull); // Make sure sub-graphic ranges were added...\n\n assertTrue(entry.primitive.type === \"geometryQuery\");\n assertTrue(entry.primitive.geometry instanceof IndexedPolyface);\n\n const polyOut = entry.primitive.geometry;\n assert.isTrue(polyOut.pointCount === polyface.pointCount);\n assert.isTrue(polyOut.paramCount === polyface.paramCount);\n assert.isTrue(polyOut.normalCount === polyface.normalCount);\n }\n timer.end();\n });\n\n it(\"should preserve header with flags\", () => {\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(Arc3d.createXY(Point3d.create(0, 0), 5));\n\n const roundTrip = () => {\n const iter = new GeometryStreamIterator(builder.geometryStream);\n expect((iter.flags === GeometryStreamFlags.ViewIndependent)).to.equal(builder.isViewIndependent);\n\n const partProps = createGeometryPartProps(builder.geometryStream);\n const part = imodel.elements.createElement(partProps);\n const partId = imodel.elements.insertElement(part.toJSON());\n imodel.saveChanges();\n\n const json = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\n expect(json.geom).not.to.be.undefined;\n expect(json.geom!.length).to.equal(2);\n expect(json.geom![0].header).not.to.be.undefined;\n const flags = json.geom![0].header!.flags;\n expect(flags).to.equal(builder.isViewIndependent ? GeometryStreamFlags.ViewIndependent : GeometryStreamFlags.None);\n\n if (undefined !== builder.getHeader())\n expect(JSON.stringify(builder.geometryStream[0])).to.equal(JSON.stringify(json.geom![0]));\n };\n\n expect(builder.getHeader()).to.be.undefined;\n expect(builder.isViewIndependent).to.be.false;\n roundTrip();\n\n builder.isViewIndependent = false;\n expect(builder.getHeader()).to.be.undefined;\n expect(builder.isViewIndependent).to.be.false;\n roundTrip();\n\n builder.isViewIndependent = true;\n expect(builder.getHeader()).not.to.be.undefined;\n expect(builder.isViewIndependent).to.be.true;\n roundTrip();\n\n builder.isViewIndependent = false;\n expect(builder.getHeader()).not.to.be.undefined;\n expect(builder.isViewIndependent).to.be.false;\n });\n});\n\ndescribe(\"ElementGeometry\", () => {\n let imodel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"Exercise using builder/iterator in world coordinates with flatbuffer data\", async () => {\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n pts.push(Point3d.create(10, 15, 0));\n pts.push(Point3d.create(5, 15, 0));\n pts.push(pts[0].clone());\n\n const builder = new ElementGeometry.Builder();\n const primitive = LineString3d.create(pts);\n\n builder.setLocalToWorld3d(testOrigin, testAngles); // Establish world to local transform for append...\n const status = builder.appendGeometryQuery(primitive);\n assert.isTrue(status);\n\n const it = new ElementGeometry.Iterator({ entryArray: builder.entries }, undefined, builder.localToWorld);\n it.requestWorldCoordinates(); // Apply local to world to entries...\n\n for (const entry of it) {\n const geom = entry.toGeometryQuery();\n assert.exists(geom);\n assertTrue(geom instanceof LineString3d);\n assert.isTrue(Point3dArray.isAlmostEqual(pts, geom.points));\n }\n });\n\n it(\"request geometry stream flatbuffer data from existing element\", async () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const expected: ExpectedElementGeometryEntry[] = [{ opcode: ElementGeometryOpcode.SolidPrimitive, geometryCategory: \"solid\", geometrySubCategory: \"sphere\" }];\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, \"0x1d\", expected, false));\n });\n\n it(\"create GeometricElement3d from local coordinate point and arc primitive flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n pts.push(Point3d.create(10, 15, 0));\n pts.push(Point3d.create(5, 15, 0));\n pts.push(pts[0].clone());\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\n assert.exists(entryLN);\n newEntries.push(entryLN!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\n\n const entryLS = ElementGeometry.fromGeometryQuery(LineString3d.create(pts));\n assert.exists(entryLS);\n newEntries.push(entryLS!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\n\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\n assert.exists(entrySH);\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n const entryPS = ElementGeometry.fromGeometryQuery(PointString3d.create(pts));\n assert.exists(entryPS);\n newEntries.push(entryPS!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"pointCollection\" });\n\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(pts[0], pts[0].distance(pts[1])));\n assert.exists(entryAR);\n newEntries.push(entryAR!);\n expected.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"arc\" });\n\n const entryEL = ElementGeometry.fromGeometryQuery(Loop.create(Arc3d.createXY(pts[0], pts[0].distance(pts[1]))));\n assert.exists(entryEL);\n newEntries.push(entryEL!);\n expected.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d from local coordinate interpolation curve flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n pts.push(Point3d.create(10, 15, 0));\n pts.push(Point3d.create(5, 15, 0));\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const interpolationProps: InterpolationCurve3dProps = { fitPoints: pts, closed: false, isChordLenKnots: 1, isColinearTangents: 1 };\n const interpolationOpts = InterpolationCurve3dOptions.create(interpolationProps);\n const interpolationCurve = InterpolationCurve3d.createCapture(interpolationOpts);\n assert.isDefined(interpolationCurve);\n\n const entry1 = ElementGeometry.fromGeometryQuery(interpolationCurve!);\n assert.exists(entry1);\n newEntries.push(entry1!);\n expected.push({ opcode: ElementGeometryOpcode.CurvePrimitive, geometryCategory: \"curvePrimitive\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d with local coordinate indexed polyface flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const xOffset = Transform.createTranslation(Point3d.create(2.5));\n const builder = new ElementGeometry.Builder();\n\n // NOTE: It's a good idea to request sub-graphic ranges when adding multiple \"large\" polyfaces to a geometry stream...\n builder.appendGeometryRanges();\n\n const polyface = createIndexedPolyface(5.0);\n builder.appendGeometryQuery(polyface);\n\n polyface.tryTransformInPlace(xOffset); // translate in x...\n builder.appendGeometryQuery(polyface);\n\n polyface.tryTransformInPlace(xOffset); // translate in x again...\n builder.appendGeometryQuery(polyface);\n\n // NOTE: For time comparison with GeometryStream: create GeometricElement3d with local coordinate indexed polyface json data\n let timer = new Timer(\"elementGeometryInsert\");\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\n\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n timer.end();\n\n const onGeometry: ElementGeometryFunction = (info: ElementGeometryInfo): void => {\n assert.isTrue(6 === info.entryArray.length); // 3 pairs of sub-range + polyface...\n const it = new ElementGeometry.Iterator(info);\n for (const entry of it) {\n assert.isTrue(entry.geomParams.categoryId === info.categoryId); // Current appearance information (default sub-category appearance in this case)...\n assert.isTrue(undefined !== entry.localRange && !entry.localRange.isNull); // Make sure sub-graphic ranges were added...\n\n const geom = entry.toGeometryQuery();\n assert.exists(geom);\n assert.isTrue(geom instanceof IndexedPolyface);\n\n const polyOut = geom as IndexedPolyface;\n assert.isTrue(polyOut.pointCount === polyface.pointCount);\n assert.isTrue(polyOut.paramCount === polyface.paramCount);\n assert.isTrue(polyOut.normalCount === polyface.normalCount);\n }\n };\n\n timer = new Timer(\"elementGeometryRequest\");\n const status = imodel.elementGeometryRequest({ onGeometry, elementId: newId });\n timer.end();\n assert.isTrue(IModelStatus.Success === status);\n });\n\n it(\"create GeometricElement3d from local coordinate brep flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const expectedFacet: ExpectedElementGeometryEntry[] = [];\n const expectedSkip: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const brepProps = createBRepDataProps(testOrigin, testAngles);\n const entry = ElementGeometry.fromBRep(brepProps);\n assert.exists(entry);\n newEntries.push(entry!);\n expected.push({ opcode: ElementGeometryOpcode.BRep, originalEntry: entry });\n\n // Why 6 and not 4?\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedFacet, false, undefined, 1));\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedSkip, false, undefined, 2));\n });\n\n it(\"apply world coordinate transform directly to brep flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const brepProps = createBRepDataProps();\n const entry = ElementGeometry.fromBRep(brepProps);\n assert.exists(entry);\n\n const entityTransform = Transform.createOriginAndMatrix(testOrigin, testAngles.toMatrix3d());\n const status = ElementGeometry.transformBRep(entry!, entityTransform);\n assert.isTrue(status);\n\n const worldBRep = ElementGeometry.toBRep(entry!);\n assert.exists(worldBRep);\n const worldTransform = Transform.fromJSON(worldBRep?.transform);\n assert.isTrue(worldTransform.isAlmostEqual(entityTransform));\n\n const newEntries: ElementGeometryDataEntry[] = [];\n newEntries.push(entry!);\n\n // Facet to make sure brep and face attachments are intact after transformBRep...\n const expectedFacet: ExpectedElementGeometryEntry[] = [];\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n expectedFacet.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expectedFacet.push({ opcode: ElementGeometryOpcode.Polyface, geometryCategory: \"polyface\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expectedFacet, false, undefined, 1));\n });\n\n it(\"test BRep entity transform\", async () => {\n const localToWorld = Transform.createOriginAndMatrix(Point3d.create(5, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0).toMatrix3d());\n const worldToLocal = localToWorld.inverse()!;\n\n // Specify an entity transform that won't have translation/rotation fully cancelled out by placement...\n const brepProps = createBRepDataProps(Point3d.create(15, 25, 5), YawPitchRollAngles.createDegrees(90, 0, 0));\n const brepEntry = ElementGeometry.fromBRep(brepProps, worldToLocal);\n assert.exists(brepEntry);\n\n const brepToWorldExpected = Transform.fromJSON(brepProps.transform);\n const brepToLocalExpected = worldToLocal.multiplyTransformTransform(brepToWorldExpected);\n\n // Check for expected brep to local transform...\n const brepPropsLocal = ElementGeometry.toBRep(brepEntry!, false);\n assert.exists(brepPropsLocal);\n const brepToLocal = Transform.fromJSON(brepPropsLocal!.transform);\n assert.isTrue(brepToLocalExpected.isAlmostEqual(brepToLocal));\n\n // Check for expected brep to world transform...\n const brepPropsWorld = ElementGeometry.toBRep(brepEntry!, false, localToWorld);\n assert.exists(brepPropsWorld);\n const brepToWorld = Transform.fromJSON(brepPropsWorld!.transform);\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorld));\n\n // Ensure that applying transform directly to flat buffer data produces same result...\n ElementGeometry.transformBRep(brepEntry!, localToWorld);\n\n const brepPropsWorld2 = ElementGeometry.toBRep(brepEntry!, false);\n assert.exists(brepPropsWorld2);\n const brepToWorld2 = Transform.fromJSON(brepPropsWorld2!.transform);\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorld2));\n\n // Check json format geometry stream...\n const builder = new GeometryStreamBuilder();\n builder.setLocalToWorld(localToWorld);\n builder.appendBRepData(brepProps);\n\n const itLocal = new GeometryStreamIterator(builder.geometryStream);\n for (const entry of itLocal) {\n assertTrue(entry.primitive.type === \"brep\");\n const brepToLocalGSB = Transform.fromJSON(entry.primitive.brep.transform);\n assert.isTrue(brepToLocalExpected.isAlmostEqual(brepToLocalGSB));\n }\n\n const itWorld = new GeometryStreamIterator(builder.geometryStream, undefined, localToWorld);\n for (const entry of itWorld) {\n assertTrue(entry.primitive.type === \"brep\");\n const brepToWorldGSB = Transform.fromJSON(entry.primitive.brep.transform);\n assert.isTrue(brepToWorldExpected.isAlmostEqual(brepToWorldGSB));\n }\n });\n\n it(\"create GeometricElement3d from local coordinate text string flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const foundFont = imodel.fonts.findId({ name: \"Vera\" })!;\n assert.exists(foundFont);\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const textProps: TextStringProps = {\n text: \"ABC\",\n font: foundFont,\n height: 2,\n bold: true,\n origin: testOrigin,\n rotation: testAngles,\n };\n\n const glyphData: TextStringGlyphData = {\n glyphIds: [1, 2, 3],\n glyphOrigins: [new Point2d(0.0, 0.0), new Point2d(1000.0, 0.0), new Point2d(2000.0, 0.0)],\n range: new Range2d(0, 0, 10, 30),\n };\n\n const entry = ElementGeometry.fromTextString(textProps, undefined, glyphData);\n assert.exists(entry);\n newEntries.push(entry!);\n // We can't validate glyph data later from the TextString in the DB because the native TextString will re-compute them if the font isn't embedded.\n // So, just verify that we are passing the correct flatbuffer here.\n assert.deepEqual(entry ? ElementGeometry.toTextStringGlyphData(entry) : undefined, glyphData);\n expected.push({ opcode: ElementGeometryOpcode.TextString, originalEntry: entry });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d from local coordinate image flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const imageProps: ImageGraphicProps = {\n corners: [Point3d.create(), Point3d.create(1, 0), Point3d.create(1, 1), Point3d.create(0, 1)],\n textureId: \"0x1\",\n hasBorder: true,\n };\n\n const entry = ElementGeometry.fromImageGraphic(imageProps);\n assert.exists(entry);\n newEntries.push(entry!);\n expected.push({ opcode: ElementGeometryOpcode.Image, originalEntry: entry });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d with sub-graphic ranges flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n\n const entrySG = ElementGeometry.fromSubGraphicRange(Range3d.create()); // Computed on backend, just need opcode...\n assert.exists(entrySG);\n newEntries.push(entrySG!);\n expected.push({ opcode: ElementGeometryOpcode.SubGraphicRange });\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(0, 0, 0));\n pts.push(Point3d.create(5, 5, 0));\n pts.push(Point3d.create(-5, -5, 0));\n\n const entryL1 = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\n assert.exists(entryL1);\n newEntries.push(entryL1!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\n\n expected.push({ opcode: ElementGeometryOpcode.SubGraphicRange }); // Added on backend...\n\n const entryL2 = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[2]));\n assert.exists(entryL2);\n newEntries.push(entryL2!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d with part reference flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const partProps = createGeometryPartProps();\n const expectedPart: ExpectedElementGeometryEntry[] = [];\n const newPartEntries: ElementGeometryDataEntry[] = [];\n\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(Point3d.createZero(), 2.5));\n assert.exists(entryAR);\n newPartEntries.push(entryAR!);\n expectedPart.push({ opcode: ElementGeometryOpcode.ArcPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"arc\" });\n\n partProps.elementGeometryBuilderParams = { entryArray: newPartEntries };\n const partId = imodel.elements.insertElement(partProps);\n assert.isTrue(Id64.isValidId64(partId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, partId, expectedPart, false));\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n const partToElement = Transform.createIdentity();\n\n const entryPI = ElementGeometry.fromGeometryPart(partId);\n assert.exists(entryPI);\n ElementGeometry.toGeometryPart(entryPI!, partToElement);\n assert.isTrue(partToElement.isIdentity);\n newEntries.push(entryPI!);\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPI });\n\n const transPT = Transform.createTranslation(Point3d.create(5, 5, 0));\n const entryPT = ElementGeometry.fromGeometryPart(partId, transPT);\n assert.exists(entryPT);\n ElementGeometry.toGeometryPart(entryPT!, partToElement);\n assert.isTrue(partToElement.isAlmostEqual(transPT));\n newEntries.push(entryPT!);\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPT });\n\n const transPR = Transform.createOriginAndMatrix(testOrigin, testAngles.toMatrix3d());\n const entryPR = ElementGeometry.fromGeometryPart(partId, transPR);\n assert.exists(entryPR);\n ElementGeometry.toGeometryPart(entryPR!, partToElement);\n assert.isTrue(partToElement.isAlmostEqual(transPR));\n newEntries.push(entryPR!);\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPR });\n\n const transPS = Transform.createScaleAboutPoint(testOrigin, 2);\n const entryPS = ElementGeometry.fromGeometryPart(partId, transPS);\n assert.exists(entryPS);\n ElementGeometry.toGeometryPart(entryPS!, partToElement);\n assert.isTrue(partToElement.isAlmostEqual(transPS));\n newEntries.push(entryPS!);\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPS });\n\n const transPA = transPR.multiplyTransformTransform(transPS);\n const entryPA = ElementGeometry.fromGeometryPart(partId, transPA);\n assert.exists(entryPA);\n ElementGeometry.toGeometryPart(entryPA!, partToElement);\n assert.isTrue(partToElement.isAlmostEqual(transPA));\n newEntries.push(entryPA!);\n expected.push({ opcode: ElementGeometryOpcode.PartReference, originalEntry: entryPA });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d with appearance flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n pts.push(Point3d.create(10, 15, 0));\n pts.push(Point3d.create(5, 15, 0));\n pts.push(pts[0].clone());\n\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\n assert.exists(entrySH);\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n const geomParams = new GeometryParams(seedElement.category);\n\n // Shape with red outline...\n geomParams.lineColor = ColorDef.red;\n let added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with gradient fill...\n geomParams.fillDisplay = FillDisplay.ByView;\n geomParams.gradient = new Gradient.Symb();\n geomParams.gradient.mode = Gradient.Mode.Linear;\n geomParams.gradient.flags = Gradient.Flags.Outline;\n geomParams.gradient.keys.push(new Gradient.KeyColor({ value: 0.0, color: ColorDef.blue.toJSON() }));\n geomParams.gradient.keys.push(new Gradient.KeyColor({ value: 0.5, color: ColorDef.red.toJSON() }));\n geomParams.gradient.angle = Angle.createDegrees(45);\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with thematic gradient fill...\n geomParams.gradient.mode = Gradient.Mode.Thematic;\n geomParams.gradient.thematicSettings = ThematicGradientSettings.fromJSON({ mode: ThematicGradientMode.Stepped, stepCount: 5 });\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with bg fill...\n geomParams.gradient = undefined;\n geomParams.backgroundFill = BackgroundFill.Outline;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with solid fill...\n geomParams.backgroundFill = undefined;\n geomParams.fillColor = ColorDef.blue;\n geomParams.fillTransparency = 0.75;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Fill, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with solid fill and render material\n geomParams.materialId = \"0x5\";\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Fill });\n expected.push({ opcode: ElementGeometryOpcode.Material, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Green construction line to test ignoring region specific appearance like fill...\n geomParams.materialId = undefined;\n geomParams.lineColor = ColorDef.green;\n geomParams.weight = 2;\n const modifiers = new LineStyle.Modifier({\n scale: 2, dashScale: 0.5, gapScale: 0.2,\n startWidth: 0.1, endWidth: 0.3,\n distPhase: 0.25, fractPhase: 0.1, centerPhase: true,\n segmentMode: false, physicalWidth: true,\n normal: Vector3d.unitZ().toJSON(),\n rotation: YawPitchRollAngles.createDegrees(45, 0, 0).toJSON(),\n });\n geomParams.styleInfo = new LineStyle.Info(Id64.invalid, modifiers);\n geomParams.elmTransparency = 0.5;\n geomParams.geometryClass = GeometryClass.Construction;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n geomParams.fillDisplay = geomParams.fillColor = geomParams.fillTransparency = undefined; // Region specific appearance ignored for open elements...\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.LineStyleModifiers, geomParams: geomParams.clone() });\n\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[2]));\n assert.exists(entryLN);\n newEntries.push(entryLN!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curvePrimitive\", geometrySubCategory: \"lineString\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"create GeometricElement3d with pattern flatbuffer data\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n pts.push(Point3d.create(10, 15, 0));\n pts.push(Point3d.create(5, 15, 0));\n pts.push(pts[0].clone());\n\n const entrySH = ElementGeometry.fromGeometryQuery(Loop.createPolygon(pts));\n assert.exists(entrySH);\n\n const expected: ExpectedElementGeometryEntry[] = [];\n const newEntries: ElementGeometryDataEntry[] = [];\n const geomParams = new GeometryParams(seedElement.category);\n\n // Shape with hatch w/o overrides...\n geomParams.pattern = new AreaPattern.Params();\n geomParams.pattern.space1 = 0.05;\n geomParams.pattern.angle1 = Angle.createDegrees(45.0);\n let added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with cross hatch with color/weight override...\n geomParams.pattern.space2 = 0.1;\n geomParams.pattern.angle2 = Angle.createDegrees(-30.0);\n geomParams.pattern.color = ColorDef.red;\n geomParams.pattern.weight = 0;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with area pattern w/o overrides...\n const partId = createCirclePart(1.0, imodel);\n assert.isTrue(Id64.isValidId64(partId));\n geomParams.pattern = new AreaPattern.Params();\n geomParams.pattern.symbolId = partId;\n geomParams.pattern.space1 = geomParams.pattern.space2 = 0.05;\n geomParams.pattern.angle1 = Angle.createDegrees(45.0);\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with area pattern with color/weight and other overrides...\n geomParams.pattern.origin = Point3d.create(0.05, 0.05, 0.0);\n geomParams.pattern.rotation = YawPitchRollAngles.createDegrees(45, 0, 0);\n geomParams.pattern.space1 = geomParams.pattern.space2 = geomParams.pattern.angle1 = undefined;\n geomParams.pattern.color = ColorDef.red;\n geomParams.pattern.weight = 1;\n geomParams.pattern.snappable = geomParams.pattern.invisibleBoundary = true;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with hatch definition w/o overrides (zig-zag)...\n const defLines: AreaPattern.HatchDefLine[] = [\n { offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\n { angle: Angle.createDegrees(90.0), through: Point2d.create(0.1, 0.0), offset: Point2d.create(0.1, 0.1), dashes: [0.1, -0.1] },\n ];\n\n geomParams.pattern = new AreaPattern.Params();\n geomParams.pattern.defLines = defLines;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n // Shape with hatch definition with color/weight overrides...\n geomParams.pattern.color = ColorDef.red;\n geomParams.pattern.weight = 1;\n added = ElementGeometry.appendGeometryParams(geomParams, newEntries);\n assert.isTrue(added);\n expected.push({ opcode: ElementGeometryOpcode.BasicSymbology });\n expected.push({ opcode: ElementGeometryOpcode.Pattern, geomParams: geomParams.clone() });\n\n newEntries.push(entrySH!);\n expected.push({ opcode: ElementGeometryOpcode.PointPrimitive, geometryCategory: \"curveCollection\", geometrySubCategory: \"loop\" });\n\n elementProps.elementGeometryBuilderParams = { entryArray: newEntries };\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n\n assert(IModelStatus.Success === doElementGeometryValidate(imodel, newId, expected, false, elementProps));\n });\n\n it(\"should transform PatternParams\", () => {\n const offset = Point3d.create(1, 1, 1);\n const rotation = YawPitchRollAngles.createDegrees(45, 45, 45);\n const t = Transform.createOriginAndMatrix(offset, rotation.toMatrix3d());\n\n const pattern = new AreaPattern.Params();\n pattern.origin = Point3d.createZero();\n pattern.rotation = YawPitchRollAngles.createDegrees(0, 0, 0);\n pattern.applyTransform(t);\n expect(pattern.origin.isAlmostEqual(offset)).true;\n expect(pattern.rotation.isAlmostEqual(rotation)).true;\n });\n\n it(\"should insert elements and parts with binary geometry stream\", () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n\n const pts: Point3d[] = [];\n pts.push(Point3d.create(5, 10, 0));\n pts.push(Point3d.create(10, 10, 0));\n\n const entryLN = ElementGeometry.fromGeometryQuery(LineSegment3d.create(pts[0], pts[1]));\n assert.isTrue(entryLN !== undefined);\n\n const entryAR = ElementGeometry.fromGeometryQuery(Arc3d.createXY(pts[0], pts[0].distance(pts[1])));\n assert.exists(entryAR);\n\n // ------------------\n // GeometricElement3d\n // ------------------\n\n // Insert\n\n const elemProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: seedElement.model,\n category: seedElement.category,\n code: Code.createEmpty(),\n // geom: geomBuilder.geometryStream,\n elementGeometryBuilderParams: { entryArray: [entryLN!], viewIndependent: false },\n };\n\n const spatialElementId = imodel.elements.insertElement(elemProps);\n\n let persistentProps = imodel.elements.getElementProps<GeometricElementProps>({ id: spatialElementId, wantGeometry: true });\n assert.isDefined(persistentProps.geom);\n assert.isTrue(persistentProps.placement !== undefined);\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.origin), Point3d.create(0, 0, 0));\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.low), Point3d.create(5, 10, 0));\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.high), Point3d.create(10, 10, 0));\n\n for (const entry of new GeometryStreamIterator(persistentProps.geom!, persistentProps.category)) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\n assert.isTrue(geometry instanceof LineString3d);\n const ls: LineString3d = geometry as LineString3d;\n assert.deepEqual(ls.points, pts);\n }\n\n // Insert - various failure cases\n elemProps.elementGeometryBuilderParams = { entryArray: [{ opcode: 9999 } as unknown as ElementGeometryDataEntry] };\n expect(() => imodel.elements.insertElement(elemProps)).to.throw(); // TODO: check error message\n\n elemProps.elementGeometryBuilderParams = { entryArray: [{ opcode: ElementGeometryOpcode.ArcPrimitive, data: undefined } as unknown as ElementGeometryDataEntry] };\n expect(() => imodel.elements.insertElement(elemProps)).to.throw(); // TODO: check error message\n\n // Update\n persistentProps.elementGeometryBuilderParams = { entryArray: [entryAR!] };\n\n imodel.elements.updateElement(persistentProps);\n\n persistentProps = imodel.elements.getElementProps<GeometricElementProps>({ id: spatialElementId, wantGeometry: true });\n assert.isDefined(persistentProps.geom);\n assert.isTrue(persistentProps.placement !== undefined);\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.origin), Point3d.create(0, 0, 0));\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.low), Point3d.create(0, 5, 0));\n assert.deepEqual(Point3d.fromJSON(persistentProps.placement!.bbox!.high), Point3d.create(10, 15, 0));\n\n for (const entry of new GeometryStreamIterator(persistentProps.geom!, persistentProps.category)) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\n assert.isTrue(geometry instanceof Arc3d);\n const ar: Arc3d = geometry as Arc3d;\n assert.deepEqual(ar.center, pts[0]);\n }\n\n // ---------------\n // Geometry part\n // ---------------\n\n // Insert\n const partProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: Code.createEmpty(),\n elementGeometryBuilderParams: { entryArray: [entryLN!], is2dPart: false },\n };\n\n const partId = imodel.elements.insertElement(partProps);\n\n let persistentPartProps = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\n assert.isDefined(persistentPartProps.geom);\n\n for (const entry of new GeometryStreamIterator(persistentPartProps.geom!)) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\n assert.isTrue(geometry instanceof LineString3d);\n const ls: LineString3d = geometry as LineString3d;\n assert.deepEqual(ls.points, pts);\n }\n\n // Update\n persistentPartProps.elementGeometryBuilderParams = { entryArray: [entryAR!] };\n\n imodel.elements.updateElement(persistentPartProps);\n\n persistentPartProps = imodel.elements.getElementProps<GeometryPartProps>({ id: partId, wantGeometry: true });\n assert.isDefined(persistentPartProps.geom);\n\n for (const entry of new GeometryStreamIterator(persistentPartProps.geom!)) {\n assert.equal(entry.primitive.type, \"geometryQuery\");\n const geometry = (entry.primitive as GeometryPrimitive).geometry;\n assert.isTrue(geometry instanceof Arc3d);\n const ar: Arc3d = geometry as Arc3d;\n assert.deepEqual(ar.center, pts[0]);\n }\n });\n\n it(\"create and update a GeometricElement3d to test clearing its geometry stream\", async () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const newId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(90, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const newElemProps = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\n assert.isDefined(newElemProps.geom);\n assert.isTrue(newElemProps.placement !== undefined);\n\n newElemProps.elementGeometryBuilderParams = { entryArray: [] };\n imodel.elements.updateElement(newElemProps);\n imodel.saveChanges();\n\n const updateElemProps = imodel.elements.getElementProps<GeometricElement3dProps>({ id: newId, wantGeometry: true });\n assert.isUndefined(updateElemProps.geom);\n assert.isTrue(updateElemProps.placement !== undefined);\n const updatedPlacement = Placement3d.fromJSON(updateElemProps.placement);\n assert.isTrue(updatedPlacement.bbox.isNull);\n });\n});\n\ndescribe(\"BRepGeometry\", () => {\n let imodel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"create GeometricElement3d from a sequence of BRep operations test\", async () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n const builder = new ElementGeometry.Builder();\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n builder.entries.length = 0; // Always replace builder.entries with result for subsequent operations/creating element\n builder.entries.push(info.entryArray[0]);\n };\n\n // Step 1: Create solid by subtracting the 2 small spheres from the large sphere\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, -5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Subtract,\n entryArray: builder.entries,\n onResult,\n };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 2: Create flat spots on sides by intersecting with a cube (i.e. something more complex that a simple revolved solid)\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(-4, -4, -5), Point3d.create(4, 4, 5)), true)!);\n\n createProps.operation = BRepGeometryOperation.Intersect;\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 3: Create a hollow shell\n createProps.operation = BRepGeometryOperation.Hollow;\n createProps.parameters = { distance: -0.5 };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 4: Cut a small hole through the middle of the solid\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.createZero(), 1)));\n\n createProps.operation = BRepGeometryOperation.Cut;\n createProps.parameters = { bothDirections: true };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 5: Create a geometric element from the result solid\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\n\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n });\n\n it(\"create GeometricElement3d using half-space boolean test\", async () => {\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n const builder = new ElementGeometry.Builder();\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n builder.entries.length = 0; // Always replace builder.entries with result for subsequent operations/creating element\n builder.entries.push(info.entryArray[0]);\n };\n\n // Step 1: Create solid cube with all edges rounded\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(-5, -5, -5), Point3d.create(5, 5, 5)), true)!);\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Round,\n entryArray: builder.entries,\n onResult,\n parameters: { radius: 2.0 },\n };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 2: Create a hollow shell\n createProps.operation = BRepGeometryOperation.Hollow;\n createProps.parameters = { distance: -0.5 };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 3: Use solid/sheet subtract to remove bottom half of solid (keep material in direction of surface normal)\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.createZero(), 10)));\n\n createProps.operation = BRepGeometryOperation.Subtract;\n createProps.parameters = undefined;\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 4: Create a geometric element from the result solid\n const testOrigin = Point3d.create(5, 10, 0);\n const testAngles = YawPitchRollAngles.createDegrees(90, 0, 0);\n const elementProps = createPhysicalElementProps(seedElement, { origin: testOrigin, angles: testAngles });\n elementProps.elementGeometryBuilderParams = { entryArray: builder.entries };\n\n const newId = imodel.elements.insertElement(elementProps);\n assert.isTrue(Id64.isValidId64(newId));\n imodel.saveChanges();\n });\n\n it(\"create multiple GeometricElement3d from local coordinate disjoint body result test\", async () => {\n const builder = new ElementGeometry.Builder();\n let results: ElementGeometryDataEntry[];\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 2 === info.entryArray.length);\n results = info.entryArray;\n };\n\n // Step 1: Create two solids by intersecting the 2 small spheres with the large sphere\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, 5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(2, 2, -5), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Intersect,\n entryArray: builder.entries,\n onResult,\n separateDisjoint: true, // Request result as 2 solids instead of a single solid with disjoint regions...\n };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Step 2: Create a geometric element from each result solid\n results!.forEach((entry) => {\n // NOTE: Since entity transform reflects local to world of target (the large sphere) it's a reasonable placement...\n const brepData = ElementGeometry.toBRep(entry);\n assert.isDefined(brepData);\n const placement = YawPitchRollAngles.tryFromTransform(Transform.fromJSON(brepData!.transform));\n assert.isDefined(placement.angles);\n const newId = createGeometricElemFromSeed(imodel, \"0x1d\", [entry], { origin: placement.origin, angles: placement.angles! });\n assert.isTrue(Id64.isValidId64(newId));\n });\n });\n\n it(\"unite/subtract/intersect solids test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(0, 0, 0), Matrix3d.createUniformScale(5)), AngleSweep.createFullLatitude(), true)!);\n builder.appendGeometryQuery(Sphere.createEllipsoid(Transform.createOriginAndMatrix(Point3d.create(5, 0, 0), Matrix3d.createUniformScale(3)), AngleSweep.createFullLatitude(), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Unite,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n createProps.operation = BRepGeometryOperation.Subtract;\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n createProps.operation = BRepGeometryOperation.Intersect;\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"subtract consumes target test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(1, 1, 1), Point3d.create(4, 4, 4)), true)!);\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 0), Point3d.create(5, 5, 5)), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n // Successful operation w/empty result...\n assert.isTrue(undefined !== info.entryArray && 0 === info.entryArray.length);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Subtract,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"sew sheets test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 2, 0), Point3d.create(1, 2, 0), Point3d.create(1, 0, 0), Point3d.create(0, 0, 0)]));\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 3), Point3d.create(1, 0, 3), Point3d.create(1, 2, 3), Point3d.create(0, 2, 3), Point3d.create(0, 0, 3)]));\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 0, 3), Point3d.create(0, 0, 3), Point3d.create(0, 0, 0)]));\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(1, 2, 0), Point3d.create(0, 2, 0), Point3d.create(0, 2, 3), Point3d.create(1, 2, 3), Point3d.create(1, 2, 0)]));\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 2, 0), Point3d.create(0, 0, 0), Point3d.create(0, 0, 3), Point3d.create(0, 2, 3), Point3d.create(0, 2, 0)]));\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(1, 0, 0), Point3d.create(1, 2, 0), Point3d.create(1, 2, 3), Point3d.create(1, 0, 3), Point3d.create(1, 0, 0)]));\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Sew,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"cut solids test\", async () => {\n const builder = new ElementGeometry.Builder();\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n // Test creating cut through solid in forward direction (default)\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 0), Point3d.create(5, 5, 5)), true)!);\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, 2.5), 2)));\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Cut,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Test creating cut through solid in both directions\n createProps.parameters = { bothDirections: true };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Test creating depth cut in solid in forward direction\n createProps.parameters = { distance: 1 };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Test creating depth cut in solid in both directions\n createProps.parameters = { distance: 1, bothDirections: true };\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"emboss profile test\", async () => {\n const builder = new ElementGeometry.Builder();\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n // Test creating a pocket in a solid\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, 1), Point3d.create(5, 5, 2)), true)!);\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, 1.5), 2)));\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Emboss,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Test creating a pad on a solid\n builder.entries.length = 0;\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.create(0, 0, -3), Point3d.create(5, 5, -2)), true)!);\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, -1.5), 2)));\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n // Test embossing a surface\n builder.entries.length = 0;\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(2.5, 2.5, -0.5), 2, AngleSweep.createStartSweepDegrees(0, -360))));\n\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"thicken surfaces test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Thicken,\n entryArray: builder.entries,\n onResult,\n parameters: { frontDistance: 0.25 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n createProps.parameters = { backDistance: 0.25 };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n\n createProps.parameters = { frontDistance: 0.1, backDistance: 0.1 };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"offset surfaces test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Loop.createPolygon([Point3d.create(0, 0, 0), Point3d.create(0, 5, 0), Point3d.create(5, 5, 0), Point3d.create(5, 0, 0), Point3d.create(0, 0, 0)]));\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Offset,\n entryArray: builder.entries,\n onResult,\n parameters: { distance: 0.25 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"hollow solids test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Hollow,\n entryArray: builder.entries,\n onResult,\n parameters: { distance: 0.25 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"offset solids test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Offset,\n entryArray: builder.entries,\n onResult,\n parameters: { distance: 0.25 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"sweep profile along path test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 0), 1)));\n builder.appendGeometryQuery(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(0, 0, 3), Point3d.create(5, 0, 3), Point3d.create(8, 10, 10)));\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Sweep,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"loft profiles test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0.5, 0, 5), 1.25)));\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 3), 1)));\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 2), 2)));\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(0, 0, 0), 1.5)));\n builder.appendGeometryQuery(Loop.create(Arc3d.createXY(Point3d.create(-0.5, 0, -2), 3)));\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Loft,\n entryArray: builder.entries,\n onResult,\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"round edges test\", async () => {\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Round,\n entryArray: builder.entries,\n onResult,\n parameters: { radius: 1 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n\n it(\"create element using base 64 encoded brep from flatbuffer test\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const builder = new ElementGeometry.Builder();\n builder.appendGeometryQuery(Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(5, 5, 2)), true)!);\n\n const onResult: BRepGeometryFunction = (info: BRepGeometryInfo): void => {\n assert.isTrue(undefined !== info.entryArray && 1 === info.entryArray.length && ElementGeometryOpcode.BRep === info.entryArray[0].opcode);\n\n // Create new element to test flatbuffer conversion to brep wire format\n // NOTE: It is preferable to use ElementGeometry.Builder over GeometryStreamBuilder this is just for testing,\n const gsBuilder = new GeometryStreamBuilder();\n const brep = ElementGeometry.toBRep(info.entryArray[0], true);\n assert.exists(brep);\n gsBuilder.appendBRepData(brep!);\n\n const elementProps = createPhysicalElementProps(seedElement, { origin: Point3d.create(5, 10, 0), angles: YawPitchRollAngles.createDegrees(45, 0, 0) }, gsBuilder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n // Extract and test value returned\n const value = imodel.elements.getElementProps<GeometricElementProps>({ id: newId, wantGeometry: true, wantBRepData: true });\n assert.isDefined(value.geom);\n\n const itLocal = new GeometryStreamIterator(value.geom!, value.category);\n for (const entry of itLocal) {\n assertTrue(entry.primitive.type === \"brep\");\n }\n };\n\n const createProps: BRepGeometryCreate = {\n operation: BRepGeometryOperation.Hollow,\n entryArray: builder.entries,\n onResult,\n parameters: { distance: 0.25 },\n };\n try {\n assert(IModelStatus.Success === imodel.createBRepGeometry(createProps));\n } catch (error: any) {\n assert(false, error.message);\n }\n });\n});\n\ndescribe(\"Mass Properties\", () => {\n let imodel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"volume\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const box = Box.createRange(Range3d.create(Point3d.createZero(), Point3d.create(1.0, 1.0, 1.0)), true);\n assert.isFalse(undefined === box);\n\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(box!);\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n const requestProps: MassPropertiesRequestProps = {\n operation: MassPropertiesOperation.AccumulateVolumes,\n candidates: [newId],\n };\n\n const result = await imodel.getMassProperties(requestProps);\n assert.isTrue(BentleyStatus.SUCCESS === result.status);\n assert.isTrue(1.0 === result.volume);\n assert.isTrue(6.0 === result.area);\n assert.isTrue(Point3d.fromJSON(result.centroid).isAlmostEqual(Point3d.create(0.5, 0.5, 0.5)));\n });\n\n it(\"area\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const shape = Loop.create(LineString3d.create(Point3d.create(0, 0, 0), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0), Point3d.create(0, 0, 0)));\n const builder = new GeometryStreamBuilder();\n builder.appendGeometry(shape);\n\n const elementProps = createPhysicalElementProps(seedElement, undefined, builder.geometryStream);\n const testElem = imodel.elements.createElement(elementProps);\n const newId = imodel.elements.insertElement(testElem.toJSON());\n imodel.saveChanges();\n\n const requestProps: MassPropertiesRequestProps = {\n operation: MassPropertiesOperation.AccumulateAreas,\n candidates: [newId],\n };\n\n const result = await imodel.getMassProperties(requestProps);\n assert.isTrue(BentleyStatus.SUCCESS === result.status);\n assert.isTrue(1.0 === result.area);\n assert.isTrue(4.0 === result.perimeter);\n assert.isTrue(Point3d.fromJSON(result.centroid).isAlmostEqual(Point3d.create(0.5, 0.5, 0.0)));\n });\n});\n\ndescribe(\"Geometry Containment\", () => {\n let imodel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"clip volume curve containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const edgeOverlapId = createCircleElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const cornerOverlapId = createCircleElem(1.0, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomOutId = createCircleElem(1.25, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomInId = createCircleElem(0.85, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\n const clip = ClipVector.createEmpty();\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\n clip.appendReference(block);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n let result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(2 === result.numInside);\n assert.isTrue(2 === result.numOutside);\n assert.isTrue(2 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n\n requestProps.allowOverlaps = false; // test inside mode...\n result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(2 === result.numInside);\n assert.isTrue(4 === result.numOutside);\n assert.isTrue(0 === result.numOverlap);\n });\n\n it(\"clip volume mesh containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideId = createSphereElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const edgeOverlapId = createSphereElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const cornerOverlapId = createSphereElem(1.0, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomOutId = createSphereElem(1.25, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomInId = createSphereElem(0.85, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\n const clip = ClipVector.createEmpty();\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\n clip.appendReference(block);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n let result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(2 === result.numInside);\n assert.isTrue(2 === result.numOutside);\n assert.isTrue(2 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n\n requestProps.allowOverlaps = false; // test inside mode...\n result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(2 === result.numInside);\n assert.isTrue(4 === result.numOutside);\n assert.isTrue(0 === result.numOverlap);\n });\n\n it(\"clip volume part containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const partAId = createCirclePart(1.0, imodel);\n const partBId = createCirclePart(1.25, imodel);\n const partCId = createCirclePart(0.85, imodel);\n\n // create part entries without instance transform...\n const rangeInsideId = createPartElem(partAId, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createPartElem(partAId, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const edgeOverlapId = createPartElem(partAId, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const cornerOverlapId = createPartElem(partAId, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomOutId = createPartElem(partBId, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomInId = createPartElem(partCId, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement);\n\n // create part entries with instance transform...\n const rangeInsideRId = createPartElem(partAId, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\n const rangeOutsideRId = createPartElem(partAId, Point3d.create(12, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\n const edgeOverlapRId = createPartElem(partAId, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\n const cornerOverlapRId = createPartElem(partAId, Point3d.create(10, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\n const rangeOvrGeomOutRId = createPartElem(partBId, Point3d.create(11, -1, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement, true);\n const rangeOvrGeomInRId = createPartElem(partCId, Point3d.create(5, 9, 0), YawPitchRollAngles.createDegrees(45, 0, 0), imodel, seedElement, true);\n\n imodel.saveChanges();\n\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\n const clip = ClipVector.createEmpty();\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\n clip.appendReference(block);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideId, rangeOutsideId, edgeOverlapId, cornerOverlapId, rangeOvrGeomOutId, rangeOvrGeomInId, rangeInsideRId, rangeOutsideRId, edgeOverlapRId, cornerOverlapRId, rangeOvrGeomOutRId, rangeOvrGeomInRId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n let result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(4 === result.numInside);\n assert.isTrue(4 === result.numOutside);\n assert.isTrue(4 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n\n requestProps.allowOverlaps = false; // test inside mode...\n result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(4 === result.numInside);\n assert.isTrue(8 === result.numOutside);\n assert.isTrue(0 === result.numOverlap);\n });\n\n it(\"clip volume displayed containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const primInConsOutId = createDisjointCirclesElem(1.0, Point3d.create(10, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const primOutConsInId = createDisjointCirclesElem(1.0, Point3d.create(0, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const primInConsInId = createDisjointCirclesElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const primOvrConsOvrId = createDisjointCirclesElem(1.0, Point3d.create(5, 10, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const range = Range3d.create(Point3d.create(0, 0, -5), Point3d.create(10, 10, 5));\n const clip = ClipVector.createEmpty();\n const block = ClipShape.createBlock(range, ClipMaskXYZRangePlanes.All, false, false);\n clip.appendReference(block);\n\n const expectedContainmentDef: ClipPlaneContainment[] = [ClipPlaneContainment.Ambiguous, ClipPlaneContainment.Ambiguous, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.Ambiguous];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [primInConsOutId, primOutConsInId, primInConsInId, primOvrConsOvrId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n let result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentDef.length);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentDef[index]));\n assert.isTrue(1 === result.numInside);\n assert.isTrue(0 === result.numOutside);\n assert.isTrue(3 === result.numOverlap);\n\n const expectedContainmentSubCat: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyOutside];\n\n requestProps.offSubCategories = [IModel.getDefaultSubCategoryId(seedElement.category)];\n result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentSubCat.length);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentSubCat[index]));\n assert.isTrue(0 === result.numInside);\n assert.isTrue(4 === result.numOutside);\n assert.isTrue(0 === result.numOverlap);\n\n const expectedContainmentViewFlags: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.Ambiguous];\n\n const flags = new ViewFlags(); // constructions are off by default...\n requestProps.viewFlags = flags;\n requestProps.offSubCategories = undefined;\n result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainmentViewFlags.length);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainmentViewFlags[index]));\n assert.isTrue(2 === result.numInside);\n assert.isTrue(1 === result.numOutside);\n assert.isTrue(1 === result.numOverlap);\n });\n\n it(\"clip L shape volume curve containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideXYId = createCircleElem(1.0, Point3d.create(2.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeInsideYId = createCircleElem(1.0, Point3d.create(2.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeInsideXId = createCircleElem(1.0, Point3d.create(7.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(7.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomOvrId = createCircleElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const clipShapePts: Point3d[] = [];\n clipShapePts.push(Point3d.create(0, 0, 0));\n clipShapePts.push(Point3d.create(10, 0, 0));\n clipShapePts.push(Point3d.create(10, 5, 0));\n clipShapePts.push(Point3d.create(5, 5, 0));\n clipShapePts.push(Point3d.create(5, 10, 0));\n clipShapePts.push(Point3d.create(0, 10, 0));\n clipShapePts.push(Point3d.create(0, 0, 0));\n const clip = ClipVector.createEmpty();\n clip.appendShape(clipShapePts, -5, 5);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideXYId, rangeInsideXId, rangeInsideYId, rangeOutsideId, rangeOvrGeomOvrId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n const result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(3 === result.numInside);\n assert.isTrue(1 === result.numOutside);\n assert.isTrue(1 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n });\n\n it(\"clip L shape volume mesh containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideXYId = createSphereElem(1.0, Point3d.create(2.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeInsideYId = createSphereElem(1.0, Point3d.create(2.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeInsideXId = createSphereElem(1.0, Point3d.create(7.5, 2.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(7.5, 7.5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOvrGeomOvrId = createSphereElem(1.0, Point3d.create(5, 5, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const clipShapePts: Point3d[] = [];\n clipShapePts.push(Point3d.create(0, 0, 0));\n clipShapePts.push(Point3d.create(10, 0, 0));\n clipShapePts.push(Point3d.create(10, 5, 0));\n clipShapePts.push(Point3d.create(5, 5, 0));\n clipShapePts.push(Point3d.create(5, 10, 0));\n clipShapePts.push(Point3d.create(0, 10, 0));\n clipShapePts.push(Point3d.create(0, 0, 0));\n const clip = ClipVector.createEmpty();\n clip.appendShape(clipShapePts, -5, 5);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideXYId, rangeInsideXId, rangeInsideYId, rangeOutsideId, rangeOvrGeomOvrId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n const result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(3 === result.numInside);\n assert.isTrue(1 === result.numOutside);\n assert.isTrue(1 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n });\n\n it(\"clip plane curve containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideId = createCircleElem(1.0, Point3d.create(0, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createCircleElem(1.0, Point3d.create(10, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOverlapId = createCircleElem(1.0, Point3d.create(5, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const plane = Plane3dByOriginAndUnitNormal.create(Point3d.create(5, 0, 0), Vector3d.create(-1, 0, 0)); // inward normal...\n const planeSet = ConvexClipPlaneSet.createEmpty();\n planeSet.addPlaneToConvexSet(ClipPlane.createPlane(plane!));\n const prim = ClipPrimitive.createCapture(planeSet);\n const clip = ClipVector.createEmpty();\n clip.appendReference(prim);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideId, rangeOutsideId, rangeOverlapId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n const result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(1 === result.numInside);\n assert.isTrue(1 === result.numOutside);\n assert.isTrue(1 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n });\n\n it(\"clip plane mesh containment\", async () => {\n // Set up element to be placed in iModel\n const seedElement = imodel.elements.getElement<GeometricElement>(\"0x1d\");\n assert.exists(seedElement);\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n\n const rangeInsideId = createSphereElem(1.0, Point3d.create(0, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOutsideId = createSphereElem(1.0, Point3d.create(10, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n const rangeOverlapId = createSphereElem(1.0, Point3d.create(5, 0, 0), YawPitchRollAngles.createDegrees(0, 0, 0), imodel, seedElement);\n imodel.saveChanges();\n\n const plane = Plane3dByOriginAndUnitNormal.create(Point3d.create(5, 0, 0), Vector3d.create(-1, 0, 0)); // inward normal...\n const planeSet = ConvexClipPlaneSet.createEmpty();\n planeSet.addPlaneToConvexSet(ClipPlane.createPlane(plane!));\n const prim = ClipPrimitive.createCapture(planeSet);\n const clip = ClipVector.createEmpty();\n clip.appendReference(prim);\n\n const expectedContainment: ClipPlaneContainment[] = [ClipPlaneContainment.StronglyInside, ClipPlaneContainment.StronglyOutside, ClipPlaneContainment.Ambiguous];\n\n const requestProps: GeometryContainmentRequestProps = {\n candidates: [rangeInsideId, rangeOutsideId, rangeOverlapId],\n clip: clip.toJSON(),\n allowOverlaps: true,\n };\n\n const result = await imodel.getGeometryContainment(requestProps);\n\n assert.isTrue(BentleyStatus.SUCCESS === result.status && undefined !== result.candidatesContainment);\n assert.isTrue(result.candidatesContainment?.length === expectedContainment.length);\n assert.isTrue(1 === result.numInside);\n assert.isTrue(1 === result.numOutside);\n assert.isTrue(1 === result.numOverlap);\n result.candidatesContainment!.forEach((val, index) => assert.isTrue(val === expectedContainment[index]));\n });\n\n});\n"]}