Skip to content

Commit e41549d

Browse files
committed
Let draw TGeo object inside TCanvas
1 parent 83b8e17 commit e41549d

File tree

3 files changed

+53
-39
lines changed

3 files changed

+53
-39
lines changed

changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
1. Fix bug in handling superimposing items via URL syntax
55
2. Enable geometry clipping in node.js
66
3. Upgrade node.js packages
7+
4. Let draw TGeo object inside TCanvas
78

89

910
## Changes in 6.3.3

scripts/JSRoot.geom.js

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3219,41 +3219,65 @@ JSROOT.define(['d3', 'three', 'geobase', 'painter', 'base3d'], (d3, THREE, geo,
32193219
return this.drawCount(uniquevis, spent);
32203220
}
32213221

3222+
let promise = Promise.resolve(true);
3223+
32223224
if (!this._scene) {
32233225

32243226
// this is limit for the visible faces, number of volumes does not matter
32253227
this.ctrl.maxlimit = (this._webgl ? 200000 : 100000) * this.ctrl.more;
32263228

32273229
this._first_drawing = true;
32283230

3229-
// activate worker
3230-
if (this.ctrl.use_worker > 0) this.startWorker();
3231+
this._on_pad = !!this.getPadPainter();
32313232

3232-
jsrp.assign3DHandler(this);
3233+
if (this._on_pad) {
3234+
promise = jsrp.ensureTCanvas(this,"3d").then(() => {
32333235

3234-
let size = this.getSizeFor3d(this._webgl ? undefined : 3);
3236+
let fp = this.getFramePainter(),
3237+
render3d = jsrp.getRender3DKind();
3238+
jsrp.assign3DHandler(fp);
32353239

3236-
this._fit_main_area = (size.can3d === -1);
3240+
let size = fp.getSizeFor3d(undefined, render3d);
32373241

3238-
let dom = this.createScene(size.width, size.height);
3242+
this._fit_main_area = (size.can3d === -1);
32393243

3240-
this.add3dCanvas(size, dom, this._webgl);
3244+
let dom = this.createScene(size.width, size.height);
32413245

3242-
// set top painter only when first child exists
3243-
this.setAsMainPainter();
3246+
fp.add3dCanvas(size, dom, render3d === JSROOT.constants.Render3D.WebGL);
3247+
});
3248+
3249+
} else {
3250+
// activate worker
3251+
if (this.ctrl.use_worker > 0) this.startWorker();
3252+
3253+
jsrp.assign3DHandler(this);
3254+
3255+
let size = this.getSizeFor3d(this._webgl ? undefined : 3);
3256+
3257+
this._fit_main_area = (size.can3d === -1);
3258+
3259+
let dom = this.createScene(size.width, size.height);
3260+
3261+
this.add3dCanvas(size, dom, this._webgl);
3262+
3263+
// set top painter only when first child exists
3264+
this.setAsMainPainter();
3265+
}
32443266
}
32453267

3246-
this.createToolbar();
3268+
return promise.then(() => {
3269+
this.createToolbar();
32473270

3248-
if (this._clones)
3249-
return new Promise(resolveFunc => {
3250-
this._resolveFunc = resolveFunc;
3251-
this.showDrawInfo("Drawing geometry");
3252-
this.startDrawGeometry(true);
3253-
});
3271+
if (this._clones)
3272+
return new Promise(resolveFunc => {
3273+
this._resolveFunc = resolveFunc;
3274+
this.showDrawInfo("Drawing geometry");
3275+
this.startDrawGeometry(true);
3276+
});
32543277

3255-
this.completeDraw();
3256-
return Promise.resolve(this);
3278+
this.completeDraw();
3279+
return this;
3280+
});
32573281
}
32583282

32593283
/** @summary methods show info when first geometry drawing is performed */
@@ -4021,7 +4045,7 @@ JSROOT.define(['d3', 'three', 'geobase', 'painter', 'base3d'], (d3, THREE, geo,
40214045

40224046
this.clearTopPainter(); // remove as pointer
40234047

4024-
let can3d = this.clear3dCanvas(); // remove 3d canvas from main HTML element
4048+
let can3d = this._on_pad ? 0 : this.clear3dCanvas(); // remove 3d canvas from main HTML element
40254049

40264050
if (this._toolbar) this._toolbar.cleanup(); // remove toolbar
40274051

scripts/JSRoot.gpad.js

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2974,21 +2974,21 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
29742974
return this.drawPrimitives(indx+1);
29752975
});
29762976
}
2977-
2977+
29782978
/** @summary Divide pad on subpads
29792979
* @returns {Promise} when finished
29802980
* @private */
29812981
TPadPainter.prototype.divide = function(nx, ny) {
29822982
if (!ny) {
29832983
let ndiv = nx;
2984-
if (ndiv < 2) return Promise.resolve(this);
2984+
if (ndiv < 2) return Promise.resolve(this);
29852985
nx = ny = Math.round(Math.sqrt(ndiv));
29862986
if (nx*ny < ndiv) nx += 1;
29872987
}
2988-
2988+
29892989
if (nx*ny < 2) return Promise.resolve(this);
2990-
2991-
let xmargin = 0.01, ymargin = 0.01,
2990+
2991+
let xmargin = 0.01, ymargin = 0.01,
29922992
dy = 1/ny, dx = 1/nx, n = 0, subpads = [];
29932993
for (let iy = 0; iy < ny; iy++) {
29942994
let y2 = 1 - iy*dy - ymargin,
@@ -3014,15 +3014,15 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
30143014
pad.fAbsXlowNDC = x1;
30153015
pad.fAbsYlowNDC = y1;
30163016
}
3017-
3017+
30183018
subpads.push(pad);
30193019
}
30203020
}
3021-
3021+
30223022
const drawNext = () => {
3023-
if (subpads.length == 0)
3023+
if (subpads.length == 0)
30243024
return Promise.resolve(this);
3025-
return JSROOT.draw(this.getDom(), subpads.shift()).then(drawNext);
3025+
return JSROOT.draw(this.getDom(), subpads.shift()).then(drawNext);
30263026
};
30273027

30283028
return drawNext();
@@ -4788,14 +4788,6 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
47884788
return res;
47894789
}
47904790

4791-
/** @summary Check if TGeo objects in the canvas - draw them directly */
4792-
TCanvasPainter.prototype.directGeoDraw = function() {
4793-
let lst = this.pad ? this.pad.fPrimitives : null;
4794-
if (lst && (lst.arr.length == 1))
4795-
if (lst.arr[0] && lst.arr[0]._typename && (lst.arr[0]._typename.indexOf("TGeo")==0))
4796-
return JSROOT.draw(this.getDom(), lst.arr[0], lst.opt[0]); // return promise
4797-
}
4798-
47994791
let drawCanvas = (divid, can, opt) => {
48004792
let nocanvas = !can;
48014793
if (nocanvas) can = JSROOT.create("TCanvas");
@@ -4811,9 +4803,6 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
48114803
}
48124804
}
48134805

4814-
let direct = painter.directGeoDraw();
4815-
if (direct) return direct;
4816-
48174806
painter.decodeOptions(opt);
48184807
painter.normal_canvas = !nocanvas;
48194808
painter.createCanvasSvg(0);

0 commit comments

Comments
 (0)