diff --git a/build/jsroot.js b/build/jsroot.js index 10658aae1..1e6149c5d 100644 --- a/build/jsroot.js +++ b/build/jsroot.js @@ -12,7 +12,7 @@ const version_id = 'dev', /** @summary version date * @desc Release date in format day/month/year like '14/04/2022' */ -version_date = '26/11/2024', +version_date = '27/11/2024', /** @summary version id and date * @desc Produced by concatenation of {@link version_id} and {@link version_date} @@ -152479,12 +152479,13 @@ class TGraphPolargramPainter extends ObjectPainter { /** @summary Create painter * @param {object|string} dom - DOM element for drawing or element id * @param {object} polargram - object to draw */ - constructor(dom, polargram) { - super(dom, polargram); + constructor(dom, polargram, opt) { + super(dom, polargram, opt); this.$polargram = true; // indicate that this is polargram this.zoom_rmin = this.zoom_rmax = 0; this.t0 = 0; this.mult = 1; + this.decodeOptions(opt); } /** @summary Returns true if fixed coordinates are configured */ @@ -152493,6 +152494,21 @@ class TGraphPolargramPainter extends ObjectPainter { return polar?.fRadian || polar?.fGrad || polar?.fDegree; } + /** @summary Decode draw options */ + decodeOptions(opt) { + const d = new DrawOptions(opt); + + if (!this.options) + this.options = {}; + + Object.assign(this.options, { + NoLabels: d.check('N'), + OrthoLabels: d.check('O') + }); + + this.storeDrawOpt(opt); + } + /** @summary Set angles range displayed by the polargram */ setAnglesRange(tmin, tmax, set_obj) { if (tmin >= tmax) @@ -152528,7 +152544,6 @@ class TGraphPolargramPainter extends ObjectPainter { format(radius) { if (radius === Math.round(radius)) return radius.toString(); if (this.ndig > 10) return radius.toExponential(4); - return radius.toFixed((this.ndig > 0) ? this.ndig : 0); } @@ -152562,10 +152577,10 @@ class TGraphPolargramPainter extends ObjectPainter { rect.szy = Math.round(0.5*h); } - rect.width = 2*rect.szx; - rect.height = 2*rect.szy; - rect.x = Math.round(w/2 - rect.szx); - rect.y = Math.round(h/2 - rect.szy); + rect.width = 2 * rect.szx; + rect.height = 2 * rect.szy; + rect.x = Math.round(w / 2 - rect.szx); + rect.y = Math.round(h / 2 - rect.szy); rect.hint_delta_x = rect.szx; rect.hint_delta_y = rect.szy; @@ -152621,6 +152636,44 @@ class TGraphPolargramPainter extends ObjectPainter { } } + /** @summary Draw polargram polar labels */ + async drawPolarLabels(polar, nmajor) { + const fontsize = Math.round(polar.fPolarTextSize * this.szy * 2); + + return this.startTextDrawingAsync(polar.fPolarLabelFont, fontsize) + .then(() => { + const lbls = (nmajor === 8) ? ['0', '#frac{#pi}{4}', '#frac{#pi}{2}', '#frac{3#pi}{4}', '#pi', '#frac{5#pi}{4}', '#frac{3#pi}{2}', '#frac{7#pi}{4}'] : ['0', '#frac{2#pi}{3}', '#frac{4#pi}{3}'], + aligns = [12, 11, 21, 31, 32, 33, 23, 13]; + + for (let n = 0; n < nmajor; ++n) { + const angle = -n*2*Math.PI/nmajor; + this.draw_g.append('svg:path') + .attr('d', `M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`) + .call(this.lineatt.func); + + let align = 12, rotate = 0; + + if (this.options.OrthoLabels) { + rotate = -n/nmajor*360; + if ((rotate > -271) && (rotate < -91)) { + align = 32; rotate += 180; + } + } else { + const aindx = Math.round(16 - angle/Math.PI*4) % 8; // index in align table, here absolute angle is important + align = aligns[aindx]; + } + + this.drawText({ align, rotate, + x: Math.round((this.szx + fontsize)*Math.cos(angle)), + y: Math.round((this.szy + fontsize/this.szx*this.szy)*(Math.sin(angle))), + text: lbls[n], + color: this.getColor(polar.fPolarLabelColor), latex: 1 }); + } + + return this.finishTextDrawing(); + }); + } + /** @summary Redraw polargram */ async redraw() { if (!this.isMainPainter()) @@ -152654,8 +152707,7 @@ class TGraphPolargramPainter extends ObjectPainter { this.setAnglesRange(polar.fRwtmin, polar.fRwtmax); - const ticks = this.r.ticks(5), - fontsize = Math.round(polar.fPolarTextSize * this.szy * 2); + const ticks = this.r.ticks(5); let nminor = Math.floor((polar.fNdivRad % 10000) / 100), nmajor = polar.fNdivPol % 100; if (nmajor !== 3) @@ -152683,7 +152735,7 @@ class TGraphPolargramPainter extends ObjectPainter { let exclude_last = false; const pointer_events = this.isBatchMode() ? null : 'visibleFill'; - if ((ticks[ticks.length-1] < polar.fRwrmax) && (this.zoom_rmin === this.zoom_rmax)) { + if ((ticks[ticks.length - 1] < polar.fRwrmax) && (this.zoom_rmin === this.zoom_rmax)) { ticks.push(polar.fRwrmax); exclude_last = true; } @@ -152727,32 +152779,12 @@ class TGraphPolargramPainter extends ObjectPainter { return this.finishTextDrawing(); }).then(() => { - return this.startTextDrawingAsync(polar.fPolarLabelFont, fontsize); - }).then(() => { - lbls = (nmajor === 8) ? ['0', '#frac{#pi}{4}', '#frac{#pi}{2}', '#frac{3#pi}{4}', '#pi', '#frac{5#pi}{4}', '#frac{3#pi}{2}', '#frac{7#pi}{4}'] : ['0', '#frac{2#pi}{3}', '#frac{4#pi}{3}']; - const aligns = [12, 11, 21, 31, 32, 33, 23, 13]; - - for (let n = 0; n < nmajor; ++n) { - const angle = -n*2*Math.PI/nmajor; - this.draw_g.append('svg:path') - .attr('d', `M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`) - .call(this.lineatt.func); - - const aindx = Math.round(16 -angle/Math.PI*4) % 8; // index in align table, here absolute angle is important - - this.drawText({ align: aligns[aindx], - x: Math.round((this.szx+fontsize)*Math.cos(angle)), - y: Math.round((this.szy + fontsize/this.szx*this.szy)*(Math.sin(angle))), - text: lbls[n], - color: this.getColor(polar.fPolarLabelColor), latex: 1 }); - } - - return this.finishTextDrawing(); + return this.options.NoLabels ? true : this.drawPolarLabels(polar, nmajor); }).then(() => { nminor = Math.floor((polar.fNdivPol % 10000) / 100); if (nminor > 1) { - for (let n = 0; n < nmajor*nminor; ++n) { + for (let n = 0; n < nmajor * nminor; ++n) { if (n % nminor === 0) continue; const angle = -n*2*Math.PI/nmajor/nminor; this.draw_g.append('svg:path') @@ -152794,7 +152826,7 @@ class TGraphPolargramPainter extends ObjectPainter { } /** @summary Draw TGraphPolargram */ - static async draw(dom, polargram /* , opt */) { + static async draw(dom, polargram, opt) { const main = getElementMainPainter(dom); if (main) { if (main.getObject() === polargram) @@ -152802,7 +152834,7 @@ class TGraphPolargramPainter extends ObjectPainter { throw Error('Cannot superimpose TGraphPolargram with any other drawings'); } - const painter = new TGraphPolargramPainter(dom, polargram); + const painter = new TGraphPolargramPainter(dom, polargram, opt); return ensureTCanvas(painter, false).then(() => { painter.setAsMainPainter(); return painter.redraw(); @@ -152832,11 +152864,15 @@ class TGraphPolarPainter extends ObjectPainter { err: d.check('E'), fill: d.check('F'), line: d.check('L'), - curve: d.check('C') + curve: d.check('C'), + radian: d.check('R'), + degree: d.check('D'), + grad: d.check('G'), + Axis: d.check('N') ? 'N' : '' }); - if (d.check('A')) - this._draw_axis = true; + if (d.check('O')) + this.options.Axis += 'O'; this.storeDrawOpt(opt); } @@ -152969,8 +153005,15 @@ class TGraphPolarPainter extends ObjectPainter { /** @summary Create polargram object */ createPolargram(gr) { - if (!gr.fPolargram) + if (!gr.fPolargram) { gr.fPolargram = create$1('TGraphPolargram'); + if (this.options.radian) + gr.fPolargram.fRadian = true; + else if (this.options.degree) + gr.fPolargram.fDegree = true; + else if (this.options.grad) + gr.fPolargram.fGrad = true; + } let rmin = gr.fY[0] || 0, rmax = rmin; const has_err = gr.fEY?.length; @@ -153124,7 +153167,7 @@ class TGraphPolarPainter extends ObjectPainter { /** @summary Draw TGraphPolar */ static async draw(dom, graph, opt) { - const painter = new TGraphPolarPainter(dom, graph); + const painter = new TGraphPolarPainter(dom, graph, opt); painter.decodeOptions(opt); const main = painter.getMainPainter(); @@ -153137,7 +153180,7 @@ class TGraphPolarPainter extends ObjectPainter { if (!main) { // indicate that axis defined by this graph painter._draw_axis = true; - pr = TGraphPolargramPainter.draw(dom, painter.createPolargram(graph)); + pr = TGraphPolargramPainter.draw(dom, painter.createPolargram(graph), painter.options.Axis); } return pr.then(gram_painter => { diff --git a/changes.md b/changes.md index 1c21c7e4e..1c6c87077 100644 --- a/changes.md +++ b/changes.md @@ -5,7 +5,7 @@ 1. Adjust histogram title drawing with native implementation 1. Improve float to string convertion when 'g' is specified 1. Support "same" option for first histogram, draw direcly on pad -1. Support different angle coordiantes in `TGraphPolargram` +1. Support different angle coordiantes in `TGraphPolargram`, handle 'N' and 'O' draw options 1. Fix - handle `TPave` NDC position also when fInit is not set 1. Fix - correctly position title according to gStyle->GetTitleAlign() 1. Fix - correctly handle tooltip events for `TGraphPolar` diff --git a/modules/core.mjs b/modules/core.mjs index b9224900b..ee4ca1d59 100644 --- a/modules/core.mjs +++ b/modules/core.mjs @@ -4,7 +4,7 @@ const version_id = 'dev', /** @summary version date * @desc Release date in format day/month/year like '14/04/2022' */ -version_date = '26/11/2024', +version_date = '27/11/2024', /** @summary version id and date * @desc Produced by concatenation of {@link version_id} and {@link version_date}