feat: 배경 테마(다크/라이트)에 따른 ACI 7번 색상 동적 변경 적용
This commit is contained in:
+55
-40
@@ -50,6 +50,8 @@ export class Viewer2D {
|
||||
|
||||
this._scene = new THREE.Scene();
|
||||
this._scene.background = new THREE.Color(0x0d1117);
|
||||
this._isDark = true;
|
||||
this._isLoading = false;
|
||||
|
||||
const w = container.clientWidth || 800;
|
||||
const h = container.clientHeight || 600;
|
||||
@@ -243,43 +245,46 @@ export class Viewer2D {
|
||||
}
|
||||
|
||||
load(result, opts = {}) {
|
||||
this._lastResult = result;
|
||||
this._selMeta = null;
|
||||
this._clear();
|
||||
this._entityMeta = [];
|
||||
this._buildLayerMap(result?.tables?.layers);
|
||||
this._buildStyleMap(result?.tables?.styles || result?.tables?.textStyles);
|
||||
this._buildLinetypeMap(result);
|
||||
// Sheet orientation: the active model-space viewport's VIEWTWIST rotates the
|
||||
// view so a drawing stored tilted in WCS (rotated survey sheets — header UCS
|
||||
// stays identity) displays with its title border upright. Applied as a
|
||||
// camera-up rotation in _fit (geometry untouched → picking stays exact).
|
||||
this._viewTwist = this._readViewTwist(result);
|
||||
// Geometric pick index — the ACTUAL rendered geometry, not a bounds proxy.
|
||||
// _pickSegs: flat [ax,ay,bx,by,…] of every line segment (lines, arcs, circles,
|
||||
// polylines, block wires, dimension leaders/arrows) with a parallel owner-meta
|
||||
// index. _pickFills: filled regions (hatch loops, SOLID quads, text quads)
|
||||
// tested by even-odd point-in-polygon. _onClick raycasts these directly.
|
||||
this._pickSegs = [];
|
||||
this._pickSegMeta = [];
|
||||
this._pickFills = [];
|
||||
this._pickCurIdx = -1;
|
||||
this._isLoading = true;
|
||||
try {
|
||||
this._lastResult = result;
|
||||
this._selMeta = null;
|
||||
this._clear();
|
||||
this._entityMeta = [];
|
||||
|
||||
// Model vs Paper (Layout): never draw both spaces at once.
|
||||
// - opts.spaceHandle provided (including null) → set active space
|
||||
// - omitted → keep previous _activeSpaceHex if still valid for this file
|
||||
if (Object.prototype.hasOwnProperty.call(opts, 'spaceHandle')) {
|
||||
const sh = opts.spaceHandle;
|
||||
if (sh == null || sh === '') this._activeSpaceHex = null;
|
||||
else this._activeSpaceHex = typeof sh === 'number' ? sh.toString(16) : String(sh).toLowerCase();
|
||||
}
|
||||
// Model vs Paper (Layout): never draw both spaces at once.
|
||||
// - opts.spaceHandle provided (including null) → set active space
|
||||
// - omitted → keep previous _activeSpaceHex if still valid for this file
|
||||
if (Object.prototype.hasOwnProperty.call(opts, 'spaceHandle')) {
|
||||
const sh = opts.spaceHandle;
|
||||
if (sh == null || sh === '') this._activeSpaceHex = null;
|
||||
else this._activeSpaceHex = typeof sh === 'number' ? sh.toString(16) : String(sh).toLowerCase();
|
||||
}
|
||||
|
||||
if (!opts.keepTheme) {
|
||||
const spacesList = listCadSpaces(result);
|
||||
const activeSp = spacesList.find((s) => s.handleHex === this._activeSpaceHex);
|
||||
const isPaper = activeSp?.kind === 'paper';
|
||||
this.setTheme(!isPaper);
|
||||
}
|
||||
if (!opts.keepTheme) {
|
||||
const spacesList = listCadSpaces(result);
|
||||
const activeSp = spacesList.find((s) => s.handleHex === this._activeSpaceHex);
|
||||
const isPaper = activeSp?.kind === 'paper';
|
||||
this.setTheme(!isPaper);
|
||||
}
|
||||
|
||||
this._buildLayerMap(result?.tables?.layers);
|
||||
this._buildStyleMap(result?.tables?.styles || result?.tables?.textStyles);
|
||||
this._buildLinetypeMap(result);
|
||||
// Sheet orientation: the active model-space viewport's VIEWTWIST rotates the
|
||||
// view so a drawing stored tilted in WCS (rotated survey sheets — header UCS
|
||||
// stays identity) displays with its title border upright. Applied as a
|
||||
// camera-up rotation in _fit (geometry untouched → picking stays exact).
|
||||
this._viewTwist = this._readViewTwist(result);
|
||||
// Geometric pick index — the ACTUAL rendered geometry, not a bounds proxy.
|
||||
// _pickSegs: flat [ax,ay,bx,by,…] of every line segment (lines, arcs, circles,
|
||||
// polylines, block wires, dimension leaders/arrows) with a parallel owner-meta
|
||||
// index. _pickFills: filled regions (hatch loops, SOLID quads, text quads)
|
||||
// tested by even-odd point-in-polygon. _onClick raycasts these directly.
|
||||
this._pickSegs = [];
|
||||
this._pickSegMeta = [];
|
||||
this._pickFills = [];
|
||||
this._pickCurIdx = -1;
|
||||
|
||||
const entities = result?.entities || [];
|
||||
const lineVerts = [];
|
||||
@@ -1049,14 +1054,24 @@ export class Viewer2D {
|
||||
const fitBox = box.isEmpty() ? null : (this._trimmedContentBox(fitSamples, box) || box);
|
||||
this._contentBox = fitBox ? fitBox.clone() : null;
|
||||
if (!opts.keepView && fitBox && !fitBox.isEmpty()) this._fit(fitBox);
|
||||
} finally {
|
||||
this._isLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
// ── UI integration ─────────────────────────────────────────────────────────
|
||||
|
||||
/** Swap canvas background for theme. dark=true → near-black (Model), false → white (Layout). */
|
||||
setTheme(dark) {
|
||||
this._scene.background = new THREE.Color(dark ? 0x0a0b0d : 0xffffff);
|
||||
const isDarkBool = !!dark;
|
||||
const changed = (this._isDark !== isDarkBool);
|
||||
this._isDark = isDarkBool;
|
||||
this._scene.background = new THREE.Color(this._isDark ? 0x0a0b0d : 0xffffff);
|
||||
if (this._gridVisible) this._rebuildGrid();
|
||||
|
||||
if (changed && this._lastResult && !this._isLoading) {
|
||||
this.load(this._lastResult, { keepView: true, keepTheme: true, spaceHandle: this._activeSpaceHex });
|
||||
}
|
||||
}
|
||||
|
||||
setGrid(visible) {
|
||||
@@ -1547,7 +1562,7 @@ export class Viewer2D {
|
||||
const aci = Math.abs(l.colorIndex ?? l.color ?? l.colorNumber ?? 7);
|
||||
return {
|
||||
name,
|
||||
colorHex: '#' + ((aciToHex(aci) ?? DEFAULT_COLOR).toString(16).padStart(6, '0')),
|
||||
colorHex: '#' + ((aciToHex(aci, this._isDark) ?? DEFAULT_COLOR).toString(16).padStart(6, '0')),
|
||||
count: counts.get(name) || 0,
|
||||
visible: !hidden.has(name),
|
||||
};
|
||||
@@ -1914,7 +1929,7 @@ export class Viewer2D {
|
||||
const handle = l.handle?.value ?? l.handle;
|
||||
const name = l.name ?? l.layerName;
|
||||
const aci = Math.abs(l.colorIndex ?? l.color ?? l.colorNumber ?? 7);
|
||||
const hex = aciToHex(aci) ?? DEFAULT_COLOR;
|
||||
const hex = aciToHex(aci, this._isDark) ?? DEFAULT_COLOR;
|
||||
if (handle != null) this._layerByHandle.set(String(handle), hex);
|
||||
if (name) this._layerByName.set(name, hex);
|
||||
if (handle != null && name) this._layerNameByHandle.set(String(handle), name);
|
||||
@@ -2006,7 +2021,7 @@ export class Viewer2D {
|
||||
const aci = entity.entityHeader?.colorIndex
|
||||
?? entity.color ?? entity.colorIndex ?? entity.colorNumber ?? 256;
|
||||
if (aci != null) {
|
||||
const hex = aciToHex(aci);
|
||||
const hex = aciToHex(aci, this._isDark);
|
||||
if (hex !== null) return hex;
|
||||
}
|
||||
const lh = entity.layerHandle?.value ?? entity.layerHandle;
|
||||
@@ -2900,7 +2915,7 @@ export class Viewer2D {
|
||||
} else if (t.bgColorRgb && (t.bgColorRgb.r != null)) {
|
||||
bgColor = ((t.bgColorRgb.r & 255) << 16) | ((t.bgColorRgb.g & 255) << 8) | (t.bgColorRgb.b & 255);
|
||||
} else if (t.bgColorIndex != null) {
|
||||
const hex = aciToHex(t.bgColorIndex);
|
||||
const hex = aciToHex(t.bgColorIndex, this._isDark);
|
||||
if (hex != null) bgColor = hex;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user