@sequent-org/ifc-viewer 1.2.4-ci.56.0 → 1.2.4-ci.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sequent-org/ifc-viewer",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.2.4-ci.
|
|
4
|
+
"version": "1.2.4-ci.58.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "IFC 3D model viewer component for web applications - fully self-contained with local IFCLoader",
|
|
7
7
|
"main": "src/index.js",
|
|
@@ -182,9 +182,7 @@ export class LabelPlacementController {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
#log(event, payload) {
|
|
185
|
-
|
|
186
|
-
this.logger?.log?.("[LabelPlacement]", event, payload);
|
|
187
|
-
} catch (_) {}
|
|
185
|
+
// no-op: debug logging disabled
|
|
188
186
|
}
|
|
189
187
|
|
|
190
188
|
#dispatchLabelEvent(name, detail, legacyName = null) {
|
|
@@ -282,11 +280,16 @@ export class LabelPlacementController {
|
|
|
282
280
|
planes?.[1]?.constant,
|
|
283
281
|
planes?.[2]?.constant,
|
|
284
282
|
];
|
|
283
|
+
const clipPlanes = {
|
|
284
|
+
x: this.#getAxisPlaneState('x', planes?.[0]),
|
|
285
|
+
y: this.#getAxisPlaneState('y', planes?.[1]),
|
|
286
|
+
z: this.#getAxisPlaneState('z', planes?.[2]),
|
|
287
|
+
};
|
|
285
288
|
|
|
286
289
|
return {
|
|
287
290
|
camera: cam,
|
|
288
291
|
modelTransform,
|
|
289
|
-
clipping: { constants: clipConstants },
|
|
292
|
+
clipping: { constants: clipConstants, planes: clipPlanes },
|
|
290
293
|
};
|
|
291
294
|
}
|
|
292
295
|
|
|
@@ -361,17 +364,7 @@ export class LabelPlacementController {
|
|
|
361
364
|
} catch (_) {}
|
|
362
365
|
|
|
363
366
|
// 5) Клиппинг (как Home: сначала восстановили камеру+модель, затем planes)
|
|
364
|
-
|
|
365
|
-
const constants = sceneState?.clipping?.constants || [];
|
|
366
|
-
if (typeof viewer.setSection === "function") {
|
|
367
|
-
["x", "y", "z"].forEach((axis, i) => {
|
|
368
|
-
const c = constants[i];
|
|
369
|
-
const enabled = Number.isFinite(c);
|
|
370
|
-
const dist = -Number(c);
|
|
371
|
-
viewer.setSection(axis, enabled, enabled ? dist : 0);
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
} catch (_) {}
|
|
367
|
+
this.#applyClippingFromState(sceneState);
|
|
375
368
|
|
|
376
369
|
try { camera?.updateProjectionMatrix?.(); } catch (_) {}
|
|
377
370
|
try { controls?.update?.(); } catch (_) {}
|
|
@@ -401,18 +394,65 @@ export class LabelPlacementController {
|
|
|
401
394
|
const viewer = this.viewer;
|
|
402
395
|
if (!viewer || !sceneState) return;
|
|
403
396
|
try {
|
|
397
|
+
const byAxis = sceneState?.clipping?.planes || null;
|
|
398
|
+
if (byAxis && typeof viewer.setSection === "function") {
|
|
399
|
+
["x", "y", "z"].forEach((axis) => {
|
|
400
|
+
const s = byAxis?.[axis] || null;
|
|
401
|
+
const enabled = !!s?.enabled;
|
|
402
|
+
const dist = Number(s?.distance);
|
|
403
|
+
viewer.setSection(axis, enabled, (enabled && Number.isFinite(dist)) ? dist : 0);
|
|
404
|
+
});
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
404
407
|
const constants = sceneState?.clipping?.constants || [];
|
|
405
408
|
if (typeof viewer.setSection === "function") {
|
|
406
409
|
["x", "y", "z"].forEach((axis, i) => {
|
|
407
410
|
const c = constants[i];
|
|
408
411
|
const enabled = Number.isFinite(c);
|
|
409
|
-
const dist =
|
|
410
|
-
viewer.setSection(axis, enabled, enabled ? dist : 0);
|
|
412
|
+
const dist = this.#getAxisDistanceFromConstant(axis, c);
|
|
413
|
+
viewer.setSection(axis, enabled, (enabled && Number.isFinite(dist)) ? dist : 0);
|
|
411
414
|
});
|
|
412
415
|
}
|
|
413
416
|
} catch (_) {}
|
|
414
417
|
}
|
|
415
418
|
|
|
419
|
+
#getAxisPlaneState(axis, plane) {
|
|
420
|
+
if (!plane) return { enabled: false, distance: null };
|
|
421
|
+
const constant = plane.constant;
|
|
422
|
+
const enabled = Number.isFinite(constant);
|
|
423
|
+
if (!enabled) return { enabled: false, distance: null };
|
|
424
|
+
const distance = this.#getAxisDistanceFromPlane(axis, plane);
|
|
425
|
+
return { enabled: true, distance };
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
#getAxisDistanceFromPlane(axis, plane) {
|
|
429
|
+
if (!plane || !Number.isFinite(plane.constant)) return null;
|
|
430
|
+
const n = plane.normal || null;
|
|
431
|
+
const nx = Number(n?.x ?? 1);
|
|
432
|
+
const ny = Number(n?.y ?? 1);
|
|
433
|
+
const nz = Number(n?.z ?? 1);
|
|
434
|
+
const sign = (axis === 'x') ? (nx >= 0 ? 1 : -1)
|
|
435
|
+
: (axis === 'y') ? (ny >= 0 ? 1 : -1)
|
|
436
|
+
: (nz >= 0 ? 1 : -1);
|
|
437
|
+
return (sign > 0) ? -Number(plane.constant) : Number(plane.constant);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
#getAxisDistanceFromConstant(axis, constant) {
|
|
441
|
+
if (!Number.isFinite(constant)) return null;
|
|
442
|
+
const viewer = this.viewer;
|
|
443
|
+
const planes = viewer?.clipping?.planes || [];
|
|
444
|
+
const idx = axis === 'x' ? 0 : axis === 'y' ? 1 : 2;
|
|
445
|
+
const plane = planes[idx] || null;
|
|
446
|
+
const n = plane?.normal || null;
|
|
447
|
+
const nx = Number(n?.x ?? 1);
|
|
448
|
+
const ny = Number(n?.y ?? 1);
|
|
449
|
+
const nz = Number(n?.z ?? 1);
|
|
450
|
+
const sign = (axis === 'x') ? (nx >= 0 ? 1 : -1)
|
|
451
|
+
: (axis === 'y') ? (ny >= 0 ? 1 : -1)
|
|
452
|
+
: (nz >= 0 ? 1 : -1);
|
|
453
|
+
return (sign > 0) ? -Number(constant) : Number(constant);
|
|
454
|
+
}
|
|
455
|
+
|
|
416
456
|
#applyViewOffset(camera, viewOffset) {
|
|
417
457
|
if (!camera || !viewOffset) return;
|
|
418
458
|
try {
|
|
@@ -755,21 +795,7 @@ export class LabelPlacementController {
|
|
|
755
795
|
? target.closest(".ifc-label-marker")
|
|
756
796
|
: null;
|
|
757
797
|
if (!closestMarker) return;
|
|
758
|
-
|
|
759
|
-
type: e?.type,
|
|
760
|
-
target,
|
|
761
|
-
closestMarker,
|
|
762
|
-
button: e?.button,
|
|
763
|
-
buttons: e?.buttons,
|
|
764
|
-
clientX: e?.clientX,
|
|
765
|
-
clientY: e?.clientY,
|
|
766
|
-
defaultPrevented: !!e?.defaultPrevented,
|
|
767
|
-
};
|
|
768
|
-
try {
|
|
769
|
-
this.logger?.log?.("[LabelDnD]", scope, payload);
|
|
770
|
-
} catch (_) {
|
|
771
|
-
try { console.log("[LabelDnD]", scope, payload); } catch (_) {}
|
|
772
|
-
}
|
|
798
|
+
// debug logging disabled
|
|
773
799
|
};
|
|
774
800
|
|
|
775
801
|
this._onDbgDocPointerDown = (e) => logDnDEvent("document", e);
|
|
@@ -1241,18 +1267,6 @@ export class LabelPlacementController {
|
|
|
1241
1267
|
try { e.preventDefault(); } catch (_) {}
|
|
1242
1268
|
try { e.stopPropagation(); } catch (_) {}
|
|
1243
1269
|
try { e.stopImmediatePropagation?.(); } catch (_) {}
|
|
1244
|
-
try {
|
|
1245
|
-
this.logger?.log?.("[LabelDnD]", "marker", {
|
|
1246
|
-
type: e?.type,
|
|
1247
|
-
target: e?.target || null,
|
|
1248
|
-
closestMarker: e?.target?.closest?.(".ifc-label-marker") || null,
|
|
1249
|
-
button: e?.button,
|
|
1250
|
-
buttons: e?.buttons,
|
|
1251
|
-
clientX: e?.clientX,
|
|
1252
|
-
clientY: e?.clientY,
|
|
1253
|
-
defaultPrevented: !!e?.defaultPrevented,
|
|
1254
|
-
});
|
|
1255
|
-
} catch (_) {}
|
|
1256
1270
|
// если были в режиме постановки — выходим
|
|
1257
1271
|
try { this.cancelPlacement(); } catch (_) {}
|
|
1258
1272
|
|
|
@@ -1267,49 +1281,13 @@ export class LabelPlacementController {
|
|
|
1267
1281
|
try { marker.el.addEventListener("pointerdown", onMarkerPointerDown); } catch (_) {}
|
|
1268
1282
|
}
|
|
1269
1283
|
const onMarkerPointerUp = (e) => {
|
|
1270
|
-
try {
|
|
1271
|
-
this.logger?.log?.("[LabelDnD]", "marker", {
|
|
1272
|
-
type: e?.type,
|
|
1273
|
-
target: e?.target || null,
|
|
1274
|
-
closestMarker: e?.target?.closest?.(".ifc-label-marker") || null,
|
|
1275
|
-
button: e?.button,
|
|
1276
|
-
buttons: e?.buttons,
|
|
1277
|
-
clientX: e?.clientX,
|
|
1278
|
-
clientY: e?.clientY,
|
|
1279
|
-
defaultPrevented: !!e?.defaultPrevented,
|
|
1280
|
-
});
|
|
1281
|
-
} catch (_) {}
|
|
1282
1284
|
};
|
|
1283
1285
|
try { marker.el.addEventListener("pointerup", onMarkerPointerUp, { capture: true, passive: true }); } catch (_) {
|
|
1284
1286
|
try { marker.el.addEventListener("pointerup", onMarkerPointerUp); } catch (_) {}
|
|
1285
1287
|
}
|
|
1286
1288
|
const onMarkerDragStart = (e) => {
|
|
1287
|
-
try {
|
|
1288
|
-
this.logger?.log?.("[LabelDnD]", "marker", {
|
|
1289
|
-
type: e?.type,
|
|
1290
|
-
target: e?.target || null,
|
|
1291
|
-
closestMarker: e?.target?.closest?.(".ifc-label-marker") || null,
|
|
1292
|
-
button: e?.button,
|
|
1293
|
-
buttons: e?.buttons,
|
|
1294
|
-
clientX: e?.clientX,
|
|
1295
|
-
clientY: e?.clientY,
|
|
1296
|
-
defaultPrevented: !!e?.defaultPrevented,
|
|
1297
|
-
});
|
|
1298
|
-
} catch (_) {}
|
|
1299
1289
|
};
|
|
1300
1290
|
const onMarkerDragEnd = (e) => {
|
|
1301
|
-
try {
|
|
1302
|
-
this.logger?.log?.("[LabelDnD]", "marker", {
|
|
1303
|
-
type: e?.type,
|
|
1304
|
-
target: e?.target || null,
|
|
1305
|
-
closestMarker: e?.target?.closest?.(".ifc-label-marker") || null,
|
|
1306
|
-
button: e?.button,
|
|
1307
|
-
buttons: e?.buttons,
|
|
1308
|
-
clientX: e?.clientX,
|
|
1309
|
-
clientY: e?.clientY,
|
|
1310
|
-
defaultPrevented: !!e?.defaultPrevented,
|
|
1311
|
-
});
|
|
1312
|
-
} catch (_) {}
|
|
1313
1291
|
};
|
|
1314
1292
|
try { marker.el.addEventListener("dragstart", onMarkerDragStart); } catch (_) {}
|
|
1315
1293
|
try { marker.el.addEventListener("dragend", onMarkerDragEnd); } catch (_) {}
|
|
@@ -1372,7 +1350,6 @@ export class LabelPlacementController {
|
|
|
1372
1350
|
* @deprecated используйте setLabelMarkers
|
|
1373
1351
|
*/
|
|
1374
1352
|
setCardMarkers(items) {
|
|
1375
|
-
try { this.logger?.warn?.("[LabelPlacement] setCardMarkers is deprecated, use setLabelMarkers"); } catch (_) {}
|
|
1376
1353
|
this.setLabelMarkers(items);
|
|
1377
1354
|
}
|
|
1378
1355
|
|
|
@@ -1380,7 +1357,6 @@ export class LabelPlacementController {
|
|
|
1380
1357
|
* @deprecated используйте getLabelMarkers
|
|
1381
1358
|
*/
|
|
1382
1359
|
getCardMarkers() {
|
|
1383
|
-
try { this.logger?.warn?.("[LabelPlacement] getCardMarkers is deprecated, use getLabelMarkers"); } catch (_) {}
|
|
1384
1360
|
return this.getLabelMarkers();
|
|
1385
1361
|
}
|
|
1386
1362
|
|
package/src/viewer/Viewer.js
CHANGED
|
@@ -3464,7 +3464,7 @@ export class Viewer {
|
|
|
3464
3464
|
const s = plane.normal.dot(c) + plane.constant;
|
|
3465
3465
|
if (s < minSigned) minSigned = s;
|
|
3466
3466
|
}
|
|
3467
|
-
if (minSigned < 0) {
|
|
3467
|
+
if (minSigned < 0 && minSigned >= -1e-3) {
|
|
3468
3468
|
plane.constant -= (minSigned - (-1e-4)); // сдвинем чуть так, чтобы все вершины имели s >= -1e-4
|
|
3469
3469
|
}
|
|
3470
3470
|
}
|