【发布时间】:2022-08-22 17:50:41
【问题描述】:
我在一个角度应用程序中包装了“web-ifc-viewer”。 我在 IFC 内隐藏和显示组件时遇到了一些麻烦。
我已经从这个example 开始,但我需要构建一个通用的 BIM 查看器,所以我不能定义任何类别。
import {AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild} from \'@angular/core\';
import {IfcViewerAPI} from \"web-ifc-viewer\";
import {Subject, takeUntil} from \"rxjs\";
import {AppThemes, BimViewerService} from \"./bim-viewer.service\";
@Component({
selector: \'almaviva-bim-viewer\',
templateUrl: \'./bim-viewer.template.html\',
styleUrls: [\'./bim-viewer.component.scss\']
})
export class BimViewerComponent implements AfterViewInit {
@ViewChild(\'viewerContainer\')
container!: ElementRef;
viewer?: IfcViewerAPI;
model: any;
ifcElement: any;
loadingValue: number = 0;
constructor() {
}
ngAfterViewInit(): void {
if (this.container) {
this.viewer = new IfcViewerAPI({container: this.container.nativeElement});
this.loadIfc(\'/assets/sample.ifc\');
}
}
private async loadIfc(url: string) {
try {
if (this.viewer) {
await this.viewer.IFC.loader.ifcManager.useWebWorkers(true, \'/assets/IFCWorker.js\');
await this.viewer.IFC.setWasmPath(\"wasm/\");
this.viewer.axes.setAxes(1000);
this.viewer.grid.setGrid(1000);
await this.viewer.IFC.loader.ifcManager.applyWebIfcConfig({
USE_FAST_BOOLS: true,
COORDINATE_TO_ORIGIN: true
});
this.viewer.IFC.loader.ifcManager.setOnProgress(
(event) => {
this.loadingValue = Math.floor((event.loaded * 100) / event.total);
}
)
this.model = await this.viewer.IFC.loadIfcUrl(url);
const project = await this.viewer.IFC.getSpatialStructure(this.model.modelID, true);
this.ifcElement = project.children[0];
await this.viewer.shadowDropper.renderShadow(this.model.modelID);
}
} catch (e) {
console.log(e);
}
}
async toggleLayer(event: Event, layer: any) {
const subset = this.viewer?.IFC.loader.ifcManager.createSubset({
modelID: this.model.modelID,
ids: [layer.expressID],
removePrevious: true,
customID: `${layer.expressID}-custom-id`
});
if (subset) {
this.viewer?.context.getScene().remove(subset);
}
}
}
当我切换图层(toggleLayer())时,我从子集中收到一个对象,如下所示
这是我的html
<div>
<mat-sidenav-container>
<mat-sidenav mode=\"side\" opened>
<mat-toolbar>
<span>
BIM
</span>
</mat-toolbar>
<mat-progress-bar mode=\"determinate\" [value]=\"loadingValue\"></mat-progress-bar>
<mat-list role=\"list\" *ngIf=\"!ifcElement\">
<mat-list-item role=\"listitem\">
Caricamento IFC in corso...
</mat-list-item>
</mat-list>
<mat-accordion *ngIf=\"ifcElement\">
<mat-expansion-panel *ngFor=\"let arch of ifcElement?.children || []\">
<mat-expansion-panel-header>
<mat-panel-title>
{{arch.Name?.value || arch.LongName?.value || \'Architettura\'}}
</mat-panel-title>
</mat-expansion-panel-header>
<mat-list role=\"list\">
<mat-list-item role=\"listitem\" *ngFor=\"let layer of arch.children\">
<mat-checkbox (click)=\"toggleLayer($event, layer)\">
{{layer.Name?.value || layer.LongName?.value || \'N/A\'}}
</mat-checkbox>
</mat-list-item>
</mat-list>
</mat-expansion-panel>
</mat-accordion>
</mat-sidenav>
<mat-sidenav-content>
<div id=\"viewer-container\" #viewerContainer></div>
<div class=\"loading-spinner-wrapper\" *ngIf=\"loadingValue!==100\">
<mat-spinner mode=\"indeterminate\" diameter=\"35\"></mat-spinner>
</div>
</mat-sidenav-content>
</mat-sidenav-container>
</div>
这是浏览器中的最终结果
问题是当我切换图层时没有任何反应。子集日志看起来总是一样的。
标签: javascript angularjs ifc