hist/RH2Painter.mjs

  1. import { settings, gStyle, kNoZoom } from '../core.mjs';
  2. import { RH2Painter as RH2Painter2D } from '../hist2d/RH2Painter.mjs';
  3. import { RAxisPainter } from '../gpad/RAxisPainter.mjs';
  4. import { assignFrame3DMethods, drawBinsLego, drawBinsError3D, drawBinsContour3D, drawBinsSurf3D } from './hist3d.mjs';
  5. class RH2Painter extends RH2Painter2D {
  6. /** Draw histogram bins in 3D, using provided draw options */
  7. draw3DBins() {
  8. if (!this.draw_content) return;
  9. if (this.options.Surf)
  10. return drawBinsSurf3D(this, true);
  11. if (this.options.Error)
  12. return drawBinsError3D(this, true);
  13. if (this.options.Contour)
  14. return drawBinsContour3D(this, true, true);
  15. drawBinsLego(this, true);
  16. this.updatePaletteDraw();
  17. }
  18. draw3D(reason) {
  19. this.mode3d = true;
  20. const main = this.getFramePainter(), // who makes axis drawing
  21. is_main = this.isMainPainter(); // is main histogram
  22. let pr = Promise.resolve(this);
  23. if (reason === 'resize') {
  24. if (is_main && main.resize3D())
  25. main.render3D();
  26. return pr;
  27. }
  28. let zmult = 1 + 2*gStyle.fHistTopMargin;
  29. this.zmin = main.logz ? this.gminposbin * 0.3 : this.gminbin;
  30. this.zmax = this.gmaxbin;
  31. if (this.options.minimum !== kNoZoom) this.zmin = this.options.minimum;
  32. if (this.options.maximum !== kNoZoom) { this.zmax = this.options.maximum; zmult = 1; }
  33. if (main.logz && (this.zmin <= 0)) this.zmin = this.zmax * 1e-5;
  34. this.deleteAttr();
  35. if (is_main) {
  36. assignFrame3DMethods(main);
  37. pr = main.create3DScene(this.options.Render3D).then(() => {
  38. main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, null, this.zmin, this.zmax);
  39. main.set3DOptions(this.options);
  40. main.drawXYZ(main.toplevel, RAxisPainter, { zmult, zoom: settings.Zooming, ndim: 2, draw: true, v7: true });
  41. });
  42. }
  43. if (!main.mode3d)
  44. return pr;
  45. return pr.then(() => this.drawingBins(reason)).then(() => {
  46. // called when bins received from server, must be reentrant
  47. const fp = this.getFramePainter();
  48. this.draw3DBins();
  49. fp.render3D();
  50. fp.addKeysHandler();
  51. return this;
  52. });
  53. }
  54. /** @summary draw RH2 object */
  55. static async draw(dom, obj, opt) {
  56. // create painter and add it to canvas
  57. return RH2Painter._draw(new RH2Painter(dom, obj), opt);
  58. }
  59. } // class RH2Painter
  60. export { RH2Painter };