Skip to content

Commit 7a0e43e

Browse files
committed
logs everywhere
1 parent cdbee18 commit 7a0e43e

File tree

2 files changed

+201
-52
lines changed

2 files changed

+201
-52
lines changed

stores/hybrid_viewer.js

Lines changed: 153 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
2121

2222
async function initHybridViewer() {
2323
if (status.value !== Status.NOT_CREATED) return
24+
console.log("[hybrid_viewer] initHybridViewer: status", status.value)
2425
status.value = Status.CREATING
2526
genericRenderWindow.value = vtkGenericRenderWindow.newInstance({
2627
background: [180 / 255, 180 / 255, 180 / 255],
@@ -34,12 +35,20 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
3435
imageStyle.zIndex = 1
3536

3637
await viewerStore.ws_connect()
38+
console.log("[hybrid_viewer] ws_connect done")
3739
viewStream = viewerStore.client.getImageStream().createViewStream("-1")
40+
console.log("[hybrid_viewer] viewStream created (-1)")
3841
viewStream.onImageReady((e) => {
39-
if (is_moving.value) return
4042
const webGLRenderWindow =
4143
genericRenderWindow.value.getApiSpecificRenderWindow()
4244
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style
45+
const canvas = webGLRenderWindow.getCanvas()
46+
console.log("[hybrid_viewer] onImageReady", {
47+
is_moving: is_moving.value,
48+
canvas: { width: canvas.width, height: canvas.height },
49+
image: typeof e?.image,
50+
})
51+
if (is_moving.value) return
4352
webGLRenderWindow.setBackgroundImage(e.image)
4453
imageStyle.opacity = 1
4554
})
@@ -59,6 +68,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
5968
textEncoder.encode(value.vtk_js.binary_light_viewable),
6069
)
6170
const polydata = reader.getOutputData(0)
71+
console.log("[hybrid_viewer] addItem polydata bounds", polydata?.getBounds?.())
6272
const mapper = vtkMapper.newInstance()
6373
mapper.setInputData(polydata)
6474
const actor = vtkActor.newInstance()
@@ -67,8 +77,10 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
6777
const renderer = genericRenderWindow.value.getRenderer()
6878
const renderWindow = genericRenderWindow.value.getRenderWindow()
6979
renderer.addActor(actor)
80+
console.log("[hybrid_viewer] addItem actors count", renderer.getActors().length)
7081
renderer.resetCamera()
7182
renderWindow.render()
83+
console.log("[hybrid_viewer] addItem render done")
7284
db[id] = { actor, polydata, mapper }
7385
}
7486

@@ -99,80 +111,147 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
99111
})
100112
}
101113

114+
// Convertit un "array-like" (y compris TypedArray) en tableau de nombres finis
115+
function toNumArray(arrLike, expectedLen) {
116+
try {
117+
const a = Array.from(arrLike ?? [])
118+
if (a.length !== expectedLen) return null
119+
const n = a.map((x) => Number(x))
120+
return n.every((x) => Number.isFinite(x)) ? n : null
121+
} catch (_) {
122+
return null
123+
}
124+
}
125+
102126
function syncRemoteCamera() {
103-
console.log("syncRemoteCamera")
127+
console.log("[hybrid_viewer] syncRemoteCamera")
104128
const renderer = genericRenderWindow.value.getRenderer()
129+
renderer.resetCameraClippingRange()
105130
const camera = renderer.getActiveCamera()
106-
const params = {
107-
camera_options: {
108-
focal_point: camera.getFocalPoint(),
109-
view_up: camera.getViewUp(),
110-
position: camera.getPosition(),
111-
view_angle: camera.getViewAngle(),
112-
clipping_range: camera.getClippingRange(),
113-
distance: camera.getDistance(),
131+
132+
const raw = {
133+
focal_point: camera.getFocalPoint(),
134+
view_up: camera.getViewUp(),
135+
position: camera.getPosition(),
136+
view_angle: camera.getViewAngle(),
137+
clipping_range: camera.getClippingRange(),
138+
}
139+
console.log("[hybrid_viewer] camera raw", {
140+
focal_point: raw.focal_point,
141+
view_up: raw.view_up,
142+
position: raw.position,
143+
view_angle: raw.view_angle,
144+
clipping_range: raw.clipping_range,
145+
types: {
146+
focal_point: Array.isArray(raw.focal_point) ? "array" : typeof raw.focal_point,
147+
view_up: Array.isArray(raw.view_up) ? "array" : typeof raw.view_up,
148+
position: Array.isArray(raw.position) ? "array" : typeof raw.position,
149+
clipping_range: Array.isArray(raw.clipping_range) ? "array" : typeof raw.clipping_range,
114150
},
151+
})
152+
153+
const fp = toNumArray(raw.focal_point, 3)
154+
const vu = toNumArray(raw.view_up, 3)
155+
const pos = toNumArray(raw.position, 3)
156+
const cr = toNumArray(raw.clipping_range, 2)
157+
const va = Number(raw.view_angle)
158+
159+
const normalized = { focal_point: fp, view_up: vu, position: pos, view_angle: va, clipping_range: cr }
160+
console.log("[hybrid_viewer] camera normalized", normalized)
161+
162+
const valid = fp && vu && pos && cr && Number.isFinite(va)
163+
if (!valid) {
164+
console.warn("[hybrid_viewer] syncRemoteCamera skipped: invalid camera", normalized)
165+
return
115166
}
167+
168+
const params = { camera_options: normalized }
169+
console.log("[hybrid_viewer] viewer.update_camera request", params)
170+
116171
viewer_call(
117172
{
118173
schema: viewer_schemas.opengeodeweb_viewer.viewer.update_camera,
119174
params,
120175
},
121176
{
122177
response_function: () => {
178+
console.log("[hybrid_viewer] viewer.update_camera response: ok -> render")
123179
remoteRender()
124-
for (const key in params.camera_options) {
125-
camera_options[key] = params.camera_options[key]
126-
}
180+
Object.assign(camera_options, params.camera_options)
127181
},
128182
},
129183
)
130184
}
131185

132186
function remoteRender() {
187+
console.log("[hybrid_viewer] viewer.render request")
133188
viewer_call({
134189
schema: viewer_schemas.opengeodeweb_viewer.viewer.render,
135190
})
136191
}
137192

138193
function setContainer(container) {
194+
console.log("[hybrid_viewer] setContainer attach", {
195+
el: container.value?.$el,
196+
size: {
197+
w: container.value?.$el?.offsetWidth,
198+
h: container.value?.$el?.offsetHeight,
199+
},
200+
})
139201
genericRenderWindow.value.setContainer(container.value.$el)
140202
const webGLRenderWindow =
141203
genericRenderWindow.value.getApiSpecificRenderWindow()
142204
webGLRenderWindow.setUseBackgroundImage(true)
143205
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style
206+
console.log("[hybrid_viewer] bgImage style before", {
207+
transition: imageStyle.transition,
208+
zIndex: imageStyle.zIndex,
209+
opacity: imageStyle.opacity,
210+
})
144211
imageStyle.transition = "opacity 0.1s ease-in"
145212
imageStyle.zIndex = 1
146213
resize(container.value.$el.offsetWidth, container.value.$el.offsetHeight)
147214
console.log("setContainer", container.value.$el)
148-
215+
149216
useMousePressed({
150217
target: container,
151218
onPressed: (event) => {
152-
console.log("onPressed")
219+
console.log("[hybrid_viewer] onPressed", {
220+
button: event.button,
221+
is_moving_before: is_moving.value,
222+
})
153223
if (event.button == 0) {
154224
is_moving.value = true
155225
event.stopPropagation()
156226
imageStyle.opacity = 0
227+
console.log("[hybrid_viewer] onPressed applied", {
228+
is_moving_after: is_moving.value,
229+
bg_opacity: imageStyle.opacity,
230+
})
157231
}
158232
},
159233
onReleased: () => {
234+
console.log("[hybrid_viewer] onReleased", {
235+
was_moving: is_moving.value,
236+
})
160237
if (!is_moving.value) {
161238
return
162239
}
163240
is_moving.value = false
164-
console.log("onReleased")
241+
console.log("[hybrid_viewer] onReleased -> syncRemoteCamera")
165242
syncRemoteCamera()
166243
},
167244
})
168-
245+
169246
let wheelEventEndTimeout = null
170247
useEventListener(container, "wheel", () => {
171248
is_moving.value = true
172249
imageStyle.opacity = 0
250+
console.log("[hybrid_viewer] wheel", { bg_opacity: imageStyle.opacity })
173251
clearTimeout(wheelEventEndTimeout)
174252
wheelEventEndTimeout = setTimeout(() => {
175253
is_moving.value = false
254+
console.log("[hybrid_viewer] wheel end -> syncRemoteCamera")
176255
syncRemoteCamera()
177256
}, 600)
178257
})
@@ -185,6 +264,12 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
185264
) {
186265
return
187266
}
267+
console.log("[hybrid_viewer] resize", {
268+
width,
269+
height,
270+
viewer_status: viewerStore.status,
271+
store_status: status.value,
272+
})
188273
const webGLRenderWindow =
189274
genericRenderWindow.value.getApiSpecificRenderWindow()
190275
const canvas = webGLRenderWindow.getCanvas()
@@ -195,6 +280,9 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
195280
viewStream.setSize(width, height)
196281
const renderWindow = genericRenderWindow.value.getRenderWindow()
197282
renderWindow.render()
283+
console.log("[hybrid_viewer] resize applied", {
284+
canvas: { width: canvas.width, height: canvas.height },
285+
})
198286
remoteRender()
199287
}
200288

@@ -227,28 +315,62 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
227315
if (z_scale != null) {
228316
await setZScaling(z_scale)
229317
}
230-
318+
231319
const cam = snapshot?.camera_options
232320
if (cam) {
321+
console.log("[hybrid_viewer] importStores snapshot camera", cam)
233322
const renderer = genericRenderWindow.value.getRenderer()
234323
const camera = renderer.getActiveCamera()
235-
236-
if (cam.focal_point) camera.setFocalPoint(cam.focal_point)
237-
if (cam.view_up) camera.setViewUp(cam.view_up)
238-
if (cam.position) camera.setPosition(cam.position)
239-
if (cam.view_angle != null) camera.setViewAngle(cam.view_angle)
240-
if (cam.clipping_range) camera.setClippingRange(cam.clipping_range)
241-
324+
325+
const fp = toNumArray(cam.focal_point, 3)
326+
const vu = toNumArray(cam.view_up, 3)
327+
const pos = toNumArray(cam.position, 3)
328+
const cr = toNumArray(cam.clipping_range, 2)
329+
const va = Number(cam.view_angle)
330+
331+
const valid =
332+
fp && vu && pos && cr && Number.isFinite(va)
333+
334+
console.log("[hybrid_viewer] importStores normalized camera", {
335+
focal_point: fp, view_up: vu, position: pos, view_angle: va, clipping_range: cr, valid
336+
})
337+
338+
if (!valid) {
339+
console.warn("[hybrid_viewer] importStores camera skipped: invalid snapshot camera", cam)
340+
return
341+
}
342+
343+
camera.setFocalPoint(fp)
344+
camera.setViewUp(vu)
345+
camera.setPosition(pos)
346+
camera.setViewAngle(va)
347+
camera.setClippingRange(cr)
348+
242349
genericRenderWindow.value.getRenderWindow().render()
243-
350+
351+
console.log("[hybrid_viewer] importStores -> viewer.update_camera", {
352+
camera_options: { focal_point: fp, view_up: vu, position: pos, view_angle: va, clipping_range: cr },
353+
})
244354
await viewer_call({
245355
schema: viewer_schemas.opengeodeweb_viewer.viewer.update_camera,
246-
params: { camera_options: cam },
356+
params: {
357+
camera_options: {
358+
focal_point: fp,
359+
view_up: vu,
360+
position: pos,
361+
view_angle: va,
362+
clipping_range: cr,
363+
},
364+
},
365+
})
366+
367+
Object.assign(camera_options, {
368+
focal_point: fp,
369+
view_up: vu,
370+
position: pos,
371+
view_angle: va,
372+
clipping_range: cr,
247373
})
248-
249-
for (const key in cam) {
250-
camera_options[key] = cam[key]
251-
}
252374
}
253375
}
254376

utils/file_import_workflow.js

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,36 +80,63 @@ async function importFile(filename, geode_object) {
8080
}
8181

8282
async function importWorkflowFromSnapshot(items) {
83+
console.log("[importWorkflowFromSnapshot] start", { count: items?.length })
8384
const dataBaseStore = useDataBaseStore()
8485
const treeviewStore = useTreeviewStore()
86+
const dataStyleStore = useDataStyleStore()
8587
const hybridViewerStore = useHybridViewerStore()
8688
const ids = []
8789
for (const item of items) {
88-
const {
89-
id,
90-
object_type,
91-
geode_object,
92-
native_filename,
93-
viewable_filename,
94-
displayed_name,
95-
vtk_js,
96-
} = item
97-
98-
await dataBaseStore.registerObject(id)
99-
await dataBaseStore.addItem(id, {
100-
object_type,
101-
geode_object,
102-
native_filename,
103-
viewable_filename,
104-
displayed_name,
105-
vtk_js,
90+
console.log("[importWorkflowFromSnapshot] item", {
91+
id: item.id,
92+
object_type: item.object_type,
93+
geode_object: item.geode_object,
94+
displayed_name: item.displayed_name,
10695
})
10796

108-
await treeviewStore.addItem(geode_object, displayed_name, id, object_type)
109-
await hybridViewerStore.addItem(id)
97+
await dataBaseStore.registerObject(item.id)
98+
console.log("[importWorkflowFromSnapshot] registerObject ok", item.id)
99+
100+
await dataBaseStore.addItem(item.id, {
101+
object_type: item.object_type,
102+
geode_object: item.geode_object,
103+
native_filename: item.native_filename,
104+
viewable_filename: item.viewable_filename,
105+
displayed_name: item.displayed_name,
106+
vtk_js: item.vtk_js,
107+
})
108+
console.log("[importWorkflowFromSnapshot] addItem ok", item.id)
109+
110+
await treeviewStore.addItem(
111+
item.geode_object,
112+
item.displayed_name,
113+
item.id,
114+
item.object_type,
115+
)
116+
console.log("[importWorkflowFromSnapshot] treeview.addItem ok", item.id)
117+
118+
await hybridViewerStore.addItem(item.id)
119+
console.log("[importWorkflowFromSnapshot] hybridViewer.addItem ok", item.id)
110120

111-
ids.push(id)
121+
await dataStyleStore.addDataStyle(item.id, item.geode_object)
122+
console.log("[importWorkflowFromSnapshot] dataStyle.addDataStyle ok", item.id)
123+
124+
if (item.object_type === "model") {
125+
await Promise.all([
126+
dataBaseStore.fetchMeshComponents(item.id),
127+
dataBaseStore.fetchUuidToFlatIndexDict(item.id),
128+
])
129+
console.log("[importWorkflowFromSnapshot] model components fetched", item.id)
130+
}
131+
132+
await dataStyleStore.applyDefaultStyle(item.id)
133+
console.log("[importWorkflowFromSnapshot] dataStyle.applyDefaultStyle ok", item.id)
134+
135+
ids.push(item.id)
112136
}
137+
hybridViewerStore.remoteRender()
138+
console.log("[importWorkflowFromSnapshot] remoteRender called")
139+
console.log("[importWorkflowFromSnapshot] done", { ids })
113140
return ids
114141
}
115142

0 commit comments

Comments
 (0)