Skip to content

Commit b208ebb

Browse files
dakerfloryst
authored andcommitted
fix(IFCImporter): fix normals
fix #3189
1 parent 8f40fc7 commit b208ebb

File tree

3 files changed

+50
-14
lines changed

3 files changed

+50
-14
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<table>
2+
<tr>
3+
<td colspan="2">
4+
<h3 style="margin: 5px 0;">Options</h3>
5+
</td>
6+
</tr>
7+
<tr>
8+
<td>
9+
Merge geometries
10+
</td>
11+
<td>
12+
<input type="checkbox" id="mergeGeometries" name="mergeGeometries" value="1" checked>
13+
</td>
14+
</tr>
15+
</table>

Sources/IO/Geometry/IFCImporter/example/index.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,33 @@ import '@kitware/vtk.js/Rendering/Profiles/Geometry';
66
import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
77
import vtkResourceLoader from '@kitware/vtk.js/IO/Core/ResourceLoader';
88
import vtkIFCImporter from '@kitware/vtk.js/IO/Geometry/IFCImporter';
9+
import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
10+
11+
import controlPanel from './controller.html';
912

1013
// ----------------------------------------------------------------------------
1114
// Example code
1215
// ----------------------------------------------------------------------------
1316

17+
const userParams = vtkURLExtract.extractURLParameters();
18+
const url =
19+
userParams.fileURL ||
20+
'https://raw.githubusercontent.com/ThatOpen/engine_web-ifc/refs/heads/main/tests/ifcfiles/public/duplex.ifc';
21+
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
22+
fullScreenRenderer.addController(controlPanel);
23+
24+
if (userParams.mergeGeometries === undefined) {
25+
userParams.mergeGeometries = true;
26+
}
27+
const mergeGeometriesCheckbox = document.querySelector('#mergeGeometries');
28+
mergeGeometriesCheckbox.checked = Boolean(userParams.mergeGeometries);
29+
1430
const importer = vtkIFCImporter.newInstance({
15-
mergeGeometries: true,
31+
mergeGeometries: mergeGeometriesCheckbox.checked,
1632
});
1733

1834
// ----------------------------------------------------------------------------
1935
function update() {
20-
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
2136
const renderer = fullScreenRenderer.getRenderer();
2237
const renderWindow = fullScreenRenderer.getRenderWindow();
2338

@@ -41,9 +56,9 @@ vtkResourceLoader
4156
vtkIFCImporter.setIFCAPI(window.WebIFC);
4257

4358
// Trigger data download
44-
importer
45-
.setUrl(
46-
'https://raw.githubusercontent.com/ThatOpen/engine_web-ifc/refs/heads/main/tests/ifcfiles/public/duplex.ifc'
47-
)
48-
.then(update);
59+
importer.setUrl(url).then(update);
4960
});
61+
62+
mergeGeometriesCheckbox.addEventListener('change', (evt) => {
63+
window.location = `?mergeGeometries=${evt.target.checked}`;
64+
});

Sources/IO/Geometry/IFCImporter/index.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
1414
import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
1515
import vtkAppendPolyData from 'vtk.js/Sources/Filters/General/AppendPolyData';
1616
import vtkMatrixBuilder from 'vtk.js/Sources/Common/Core/MatrixBuilder';
17+
import { mat3 } from 'gl-matrix';
1718

1819
const { vtkErrorMacro } = macro;
1920

@@ -94,11 +95,16 @@ function vtkIFCImporter(publicAPI, model) {
9495
.buildFromRadian()
9596
.setMatrix(userMatrix);
9697

98+
const normalMatrix = vtkMatrixBuilder
99+
.buildFromRadian()
100+
.multiply3x3(mat3.fromMat4(mat3.create(), userMatrix));
101+
97102
for (let i = 0; i < vertices.length; i += 6) {
98103
const point = [vertices[i], vertices[i + 1], vertices[i + 2]];
99104
const normal = [vertices[i + 3], vertices[i + 4], vertices[i + 5]];
100105

101-
transformMatrix.apply(point).apply(normal);
106+
transformMatrix.apply(point);
107+
normalMatrix.apply(normal);
102108

103109
pointValues[i / 2] = point[0];
104110
pointValues[i / 2 + 1] = point[1];
@@ -244,32 +250,32 @@ function vtkIFCImporter(publicAPI, model) {
244250
publicAPI.importActors = (renderer) => {
245251
if (model.mergeGeometries) {
246252
const opaqueMeshes = meshes.filter((mesh) => mesh.color.w === 1);
247-
let apd = vtkAppendPolyData.newInstance();
253+
const oapd = vtkAppendPolyData.newInstance();
248254

249255
opaqueMeshes.forEach((mesh) => {
250256
const pd = createColoredPolyDataFromIFCMesh(mesh);
251-
apd.addInputData(pd);
257+
oapd.addInputData(pd);
252258
});
253259

254260
let mapper = vtkMapper.newInstance();
255261
mapper.setColorModeToDirectScalars();
256-
mapper.setInputConnection(apd.getOutputPort());
262+
mapper.setInputConnection(oapd.getOutputPort());
257263

258264
let actor = vtkActor.newInstance();
259265
actor.setMapper(mapper);
260266
renderer.addActor(actor);
261267

262268
const transparentMeshes = meshes.filter((mesh) => mesh.color.w < 1);
263-
apd = vtkAppendPolyData.newInstance();
269+
const tapd = vtkAppendPolyData.newInstance();
264270

265271
transparentMeshes.forEach((mesh) => {
266272
const pd = createColoredPolyDataFromIFCMesh(mesh);
267-
apd.addInputData(pd);
273+
tapd.addInputData(pd);
268274
});
269275

270276
mapper = vtkMapper.newInstance();
271277
mapper.setColorModeToDirectScalars();
272-
mapper.setInputConnection(apd.getOutputPort());
278+
mapper.setInputConnection(tapd.getOutputPort());
273279

274280
actor = vtkActor.newInstance();
275281
actor.setMapper(mapper);

0 commit comments

Comments
 (0)