@@ -32,7 +32,7 @@ import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies
32
32
import { AlwaysAndNeverDrawnElementInfo } from "../../common/internal/AlwaysAndNeverDrawnElementInfo.js" ;
33
33
import { toVoidPromise } from "../../common/internal/Rxjs.js" ;
34
34
import { createVisibilityStatus } from "../../common/internal/Tooltip.js" ;
35
- import { getClassesByView , releaseMainThreadOnItemsCount , setDifference , setIntersection } from "../../common/internal/Utils.js" ;
35
+ import { getClassesByView , getSetFromId64Arg , releaseMainThreadOnItemsCount , setDifference , setIntersection } from "../../common/internal/Utils.js" ;
36
36
import { createVisibilityChangeEventListener } from "../../common/internal/VisibilityChangeEventListener.js" ;
37
37
import {
38
38
changeElementStateNoChildrenOperator ,
@@ -295,37 +295,38 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
295
295
}
296
296
297
297
private getModelsVisibilityStatus ( { modelIds } : { modelIds : Id64Arg } ) : Observable < VisibilityStatus > {
298
- return from ( Id64 . iterable ( modelIds ) ) . pipe (
299
- mergeMap ( ( modelId ) => {
300
- // For hidden models we only need to check subModels
301
- if ( ! this . _props . viewport . view . viewsModel ( modelId ) ) {
302
- return this . getSubModels ( { modelIds : modelId } ) . pipe (
303
- mergeMap ( ( { subModels } ) => {
304
- if ( subModels && Id64 . sizeOf ( subModels ) > 0 ) {
305
- return this . getModelsVisibilityStatus ( { modelIds : subModels } ) . pipe (
306
- map ( ( subModelsVisibilityStatus ) =>
307
- subModelsVisibilityStatus . state !== "hidden" ? createVisibilityStatus ( "partial" ) : createVisibilityStatus ( "hidden" ) ,
308
- ) ,
309
- ) ;
310
- }
311
- return of ( createVisibilityStatus ( "hidden" ) ) ;
312
- } ) ,
313
- mergeVisibilityStatuses ,
314
- ) ;
315
- }
316
- // For visible models we need to check all categories
317
- return this . getCategories ( { modelIds : modelId } ) . pipe (
318
- mergeMap ( ( { drawingCategories, spatialCategories } ) =>
319
- merge (
320
- drawingCategories ? of ( drawingCategories ) . pipe ( mergeMap ( ( categoryIds ) => this . getCategoriesVisibilityStatus ( { modelId, categoryIds } ) ) ) : EMPTY ,
321
- spatialCategories ? of ( spatialCategories ) . pipe ( mergeMap ( ( categoryIds ) => this . getCategoriesVisibilityStatus ( { modelId, categoryIds } ) ) ) : EMPTY ,
298
+ const result = defer ( ( ) => {
299
+ return from ( Id64 . iterable ( modelIds ) ) . pipe (
300
+ mergeMap ( ( modelId ) => {
301
+ // For hidden models we only need to check subModels
302
+ if ( ! this . _props . viewport . view . viewsModel ( modelId ) ) {
303
+ return this . getSubModels ( { modelIds : modelId } ) . pipe (
304
+ mergeMap ( ( { subModels } ) => {
305
+ if ( subModels && Id64 . sizeOf ( subModels ) > 0 ) {
306
+ return this . getModelsVisibilityStatus ( { modelIds : subModels } ) . pipe (
307
+ map ( ( subModelsVisibilityStatus ) =>
308
+ subModelsVisibilityStatus . state !== "hidden" ? createVisibilityStatus ( "partial" ) : createVisibilityStatus ( "hidden" ) ,
309
+ ) ,
310
+ ) ;
311
+ }
312
+ return of ( createVisibilityStatus ( "hidden" ) ) ;
313
+ } ) ,
314
+ ) ;
315
+ }
316
+ // For visible models we need to check all categories
317
+ return this . getCategories ( { modelIds : modelId } ) . pipe (
318
+ mergeMap ( ( { drawingCategories, spatialCategories } ) =>
319
+ merge (
320
+ drawingCategories ? of ( drawingCategories ) . pipe ( mergeMap ( ( categoryIds ) => this . getCategoriesVisibilityStatus ( { modelId, categoryIds } ) ) ) : EMPTY ,
321
+ spatialCategories ? of ( spatialCategories ) . pipe ( mergeMap ( ( categoryIds ) => this . getCategoriesVisibilityStatus ( { modelId, categoryIds } ) ) ) : EMPTY ,
322
+ ) ,
322
323
) ,
323
- ) ,
324
- mergeVisibilityStatuses ,
325
- ) ;
326
- } ) ,
327
- mergeVisibilityStatuses ,
328
- ) ;
324
+ ) ;
325
+ } ) ,
326
+ mergeVisibilityStatuses ,
327
+ ) ;
328
+ } ) ;
329
+ return createVisibilityHandlerResult ( this , { modelIds } , result , undefined ) ;
329
330
}
330
331
331
332
private getDefinitionContainersVisibilityStatus ( props : { definitionContainerIds : Id64Arg } ) : Observable < VisibilityStatus > {
@@ -498,7 +499,6 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
498
499
}
499
500
return of ( createVisibilityStatus ( "hidden" ) ) ;
500
501
} ) ,
501
- mergeVisibilityStatuses ,
502
502
)
503
503
: EMPTY ,
504
504
// For visible models we need to check all categories
@@ -510,27 +510,23 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
510
510
categoryIds : categoryId ,
511
511
} ) ,
512
512
) ,
513
- mergeVisibilityStatuses ,
514
513
)
515
514
: EMPTY ,
516
- // If modelId was not provided, that means we want to check subCategories as well
517
- ! modelIdFromProps
518
- ? this . getSubCategories ( { categoryIds : categoryId } ) . pipe (
519
- mergeMap ( ( { subCategories } ) => {
520
- if ( ( ! subCategories || Id64 . sizeOf ( subCategories ) === 0 ) && ( visibleModels . length > 0 || hiddenModels . length > 0 ) ) {
521
- return EMPTY ;
522
- }
523
- if ( ! this . _props . viewport . view . viewsCategory ( categoryId ) ) {
524
- return of ( createVisibilityStatus ( "hidden" ) ) ;
525
- }
526
- if ( ! subCategories ) {
527
- return of ( createVisibilityStatus ( "visible" ) ) ;
528
- }
529
- return of ( this . getVisibileCategorySubCategoriesVisibilityStatus ( { subCategoryIds : subCategories } ) ) ;
530
- } ) ,
531
- )
532
- : EMPTY ,
533
- ) . pipe ( mergeVisibilityStatuses ) ;
515
+ // We need to check subCategories as well
516
+ this . getSubCategories ( { categoryIds : categoryId } ) . pipe (
517
+ mergeMap ( ( { subCategories } ) => {
518
+ if ( subCategories && Id64 . sizeOf ( subCategories ) > 0 ) {
519
+ return this . getSubCategoriesVisibilityStatus ( { categoryId, modelId : modelIdFromProps , subCategoryIds : subCategories } ) ;
520
+ }
521
+
522
+ if ( visibleModels . length === 0 && hiddenModels . length === 0 ) {
523
+ return of ( createVisibilityStatus ( this . _props . viewport . view . viewsCategory ( categoryId ) ? "visible" : "hidden" ) ) ;
524
+ }
525
+
526
+ return EMPTY ;
527
+ } ) ,
528
+ ) ,
529
+ ) ;
534
530
} ) ,
535
531
mergeVisibilityStatuses ,
536
532
) ;
@@ -553,7 +549,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
553
549
const result = defer ( ( ) => {
554
550
const { elementIds, modelId, categoryId } = props ;
555
551
556
- // TODO: check child subModels
552
+ // TODO: check child elements that are subModels
557
553
if ( ! this . _props . viewport . view . viewsModel ( modelId ) ) {
558
554
return from ( elementIds ) . pipe (
559
555
mergeMap ( ( elementId ) =>
@@ -577,7 +573,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
577
573
}
578
574
// TODO: check child elements
579
575
// TODO: check child element categories
580
- // TODO: check child subModels
576
+ // TODO: check child elements that are subModels
581
577
return this . getVisibilityFromAlwaysAndNeverDrawnElements ( {
582
578
elements : elementIds ,
583
579
defaultStatus : ( ) => this . getVisibleModelDefaultCategoriesVisibilityStatus ( { categoryIds : categoryId , modelId } ) ,
@@ -784,14 +780,7 @@ class CategoriesTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler
784
780
viewport . setAlwaysDrawn ( setDifference ( alwaysDrawn , modelAlwaysDrawnElements ) ) ;
785
781
}
786
782
const categoriesToOverride = categoriesToNotOverride
787
- ? setDifference (
788
- allModelCategories ,
789
- typeof categoriesToNotOverride === "string"
790
- ? new Set ( [ categoriesToNotOverride ] )
791
- : Array . isArray ( categoriesToNotOverride )
792
- ? new Set ( categoriesToNotOverride )
793
- : categoriesToNotOverride ,
794
- )
783
+ ? setDifference ( allModelCategories , getSetFromId64Arg ( categoriesToNotOverride ) )
795
784
: allModelCategories ;
796
785
categoriesToOverride . forEach ( ( categoryId ) => {
797
786
this . changeCategoryStateInViewportAccordingToModelVisibility ( modelId , categoryId , false , false ) ;
0 commit comments