From dca0941af24e48ee370d49bcd87dde5283bc7637 Mon Sep 17 00:00:00 2001 From: wyq Date: Tue, 22 Nov 2022 23:37:54 +0800 Subject: [PATCH] bugfix for TextRender memory leak --- .../org/meteoinfo/chart/GLChartPanel.java | 195 +++++++++--------- .../java/org/meteoinfo/chart/jogl/GLPlot.java | 165 +++++++++------ .../meteoinfo/chart/render/GraphicRender.java | 2 +- meteoinfo-chart/src/test/java/VolumeTest.java | 38 ++-- .../java/org/meteoinfo/data/GridData.java | 4 +- meteoinfo-lab/milconfig.xml | 28 +-- .../pylib/mipylib/plotlib/miplot$py.class | Bin 106144 -> 106570 bytes meteoinfo-lab/pylib/mipylib/plotlib/miplot.py | 22 +- .../meteoinfo/map/forms/FrmSectionPlot.java | 4 - 9 files changed, 250 insertions(+), 208 deletions(-) diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java index a19e568e..074beaad 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java @@ -680,116 +680,123 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ void onMouseReleased(MouseEvent e) { this.dragMode = false; - Plot plt = this.chart.findPlot(mouseDownPoint.x, mouseDownPoint.y); - if (!(plt instanceof AbstractPlot2D)) { - return; - } - - AbstractPlot2D xyplot = (AbstractPlot2D) plt; - this.currentPlot = xyplot; + Plot plot = selPlot(this.mouseDownPoint.x, this.mouseDownPoint.y); + this.currentPlot = plot; switch (this.mouseMode) { case ZOOM_IN: if (Math.abs(mouseLastPos.x - mouseDownPoint.x) > 5) { - if (xyplot instanceof MapPlot) { - MapPlot plot = (MapPlot) xyplot; - Rectangle2D graphArea = xyplot.getGraphArea(); - double[] xy1 = plot.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); - double[] xy2 = plot.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); - Extent extent = new Extent(); - extent.minX = Math.min(xy1[0], xy2[0]); - extent.maxX = Math.max(xy1[0], xy2[0]); - extent.minY = Math.min(xy1[1], xy2[1]); - extent.maxY = Math.max(xy1[1], xy2[1]); - plot.setDrawExtent(extent); - //this.paintGraphics(); - this.repaintNew(); - } else { - Rectangle2D graphArea = xyplot.getGraphArea(); - double[] xy1 = xyplot.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); - double[] xy2 = xyplot.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); - Extent extent = new Extent(); - extent.minX = Math.min(xy1[0], xy2[0]); - extent.maxX = Math.max(xy1[0], xy2[0]); - extent.minY = Math.min(xy1[1], xy2[1]); - extent.maxY = Math.max(xy1[1], xy2[1]); - if (xyplot.getXAxis().isInverse()) { - Extent drawExtent = xyplot.getDrawExtent(); - double minx, maxx; - minx = drawExtent.getWidth() - (extent.maxX - drawExtent.minX) + drawExtent.minX; - maxx = drawExtent.getWidth() - (extent.minX - drawExtent.minX) + drawExtent.minX; - extent.minX = minx; - extent.maxX = maxx; - } - if (xyplot.getYAxis().isInverse()) { - Extent drawExtent = xyplot.getDrawExtent(); - double miny, maxy; - miny = drawExtent.getHeight() - (extent.maxY - drawExtent.minY) + drawExtent.minY; - maxy = drawExtent.getHeight() - (extent.minY - drawExtent.minY) + drawExtent.minY; - extent.minY = miny; - extent.maxY = maxy; - } - xyplot.setDrawExtent(extent); - //this.paintGraphics(); - this.repaintNew(); - } - } - break; - case ZOOM_OUT: - if (e.getButton() == MouseEvent.BUTTON1) { - double zoom = 1.5; - Extent extent = xyplot.getDrawExtent(); - double owidth = extent.getWidth(); - double oheight = extent.getHeight(); - double width = owidth * zoom; - double height = oheight * zoom; - double xshift = (owidth - width) * 0.5; - double yshift = (oheight - height) * 0.5; - extent.minX += xshift; - extent.maxX -= xshift; - extent.minY += yshift; - extent.maxY -= yshift; - xyplot.setDrawExtent(extent); - //this.paintGraphics(); - this.repaintNew(); - } - break; - case SELECT: - if (Math.abs(mouseLastPos.x - mouseDownPoint.x) > 5) { - if (xyplot instanceof XY1DPlot) { - XY1DPlot plot = (XY1DPlot) xyplot; - Rectangle2D graphArea = plot.getGraphArea(); - if (graphArea.contains(mouseDownPoint.x, mouseDownPoint.y) || graphArea.contains(mouseLastPos.x, mouseLastPos.y)) { - double[] xy1 = plot.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); - double[] xy2 = plot.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); + if (plot instanceof AbstractPlot2D) { + AbstractPlot2D xyplot = (AbstractPlot2D) plot; + if (xyplot instanceof MapPlot) { + MapPlot mapPlot = (MapPlot) xyplot; + Rectangle2D graphArea = plot.getGraphArea(); + double[] xy1 = mapPlot.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); + double[] xy2 = mapPlot.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); Extent extent = new Extent(); extent.minX = Math.min(xy1[0], xy2[0]); extent.maxX = Math.max(xy1[0], xy2[0]); extent.minY = Math.min(xy1[1], xy2[1]); extent.maxY = Math.max(xy1[1], xy2[1]); - this.selectedPoints = plot.getDataset().selectPoints(extent); - this.firePointSelectedEvent(); + mapPlot.setDrawExtent(extent); + //this.paintGraphics(); + this.repaintNew(); + } else { + Rectangle2D graphArea = xyplot.getGraphArea(); + double[] xy1 = xyplot.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); + double[] xy2 = xyplot.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); + Extent extent = new Extent(); + extent.minX = Math.min(xy1[0], xy2[0]); + extent.maxX = Math.max(xy1[0], xy2[0]); + extent.minY = Math.min(xy1[1], xy2[1]); + extent.maxY = Math.max(xy1[1], xy2[1]); + if (xyplot.getXAxis().isInverse()) { + Extent drawExtent = xyplot.getDrawExtent(); + double minx, maxx; + minx = drawExtent.getWidth() - (extent.maxX - drawExtent.minX) + drawExtent.minX; + maxx = drawExtent.getWidth() - (extent.minX - drawExtent.minX) + drawExtent.minX; + extent.minX = minx; + extent.maxX = maxx; + } + if (xyplot.getYAxis().isInverse()) { + Extent drawExtent = xyplot.getDrawExtent(); + double miny, maxy; + miny = drawExtent.getHeight() - (extent.maxY - drawExtent.minY) + drawExtent.minY; + maxy = drawExtent.getHeight() - (extent.minY - drawExtent.minY) + drawExtent.minY; + extent.minY = miny; + extent.maxY = maxy; + } + xyplot.setDrawExtent(extent); //this.paintGraphics(); this.repaintNew(); } } } break; + case ZOOM_OUT: + if (e.getButton() == MouseEvent.BUTTON1) { + if (plot instanceof AbstractPlot2D) { + AbstractPlot2D xyplot = (AbstractPlot2D) plot; + double zoom = 1.5; + Extent extent = xyplot.getDrawExtent(); + double owidth = extent.getWidth(); + double oheight = extent.getHeight(); + double width = owidth * zoom; + double height = oheight * zoom; + double xshift = (owidth - width) * 0.5; + double yshift = (oheight - height) * 0.5; + extent.minX += xshift; + extent.maxX -= xshift; + extent.minY += yshift; + extent.maxY -= yshift; + xyplot.setDrawExtent(extent); + //this.paintGraphics(); + this.repaintNew(); + } + } + break; + case SELECT: + if (Math.abs(mouseLastPos.x - mouseDownPoint.x) > 5) { + if (plot instanceof AbstractPlot2D) { + AbstractPlot2D xyplot = (AbstractPlot2D) plot; + if (xyplot instanceof XY1DPlot) { + XY1DPlot plt = (XY1DPlot) xyplot; + Rectangle2D graphArea = plt.getGraphArea(); + if (graphArea.contains(mouseDownPoint.x, mouseDownPoint.y) || graphArea.contains(mouseLastPos.x, mouseLastPos.y)) { + double[] xy1 = plt.screenToProj(mouseDownPoint.x - graphArea.getX(), mouseDownPoint.y - graphArea.getY(), graphArea); + double[] xy2 = plt.screenToProj(mouseLastPos.x - graphArea.getX(), mouseLastPos.y - graphArea.getY(), graphArea); + Extent extent = new Extent(); + extent.minX = Math.min(xy1[0], xy2[0]); + extent.maxX = Math.max(xy1[0], xy2[0]); + extent.minY = Math.min(xy1[1], xy2[1]); + extent.maxY = Math.max(xy1[1], xy2[1]); + this.selectedPoints = plt.getDataset().selectPoints(extent); + this.firePointSelectedEvent(); + //this.paintGraphics(); + this.repaintNew(); + } + } + } + } + break; case PAN: if (e.getButton() == MouseEvent.BUTTON1) { - double[] xy1 = xyplot.screenToProj(mouseDownPoint.x, mouseDownPoint.y); - double[] xy2 = xyplot.screenToProj(e.getX(), e.getY()); - Extent extent = xyplot.getDrawExtent(); - extent = extent.shift(xy1[0] - xy2[0], xy1[1] - xy2[1]); - xyplot.setDrawExtent(extent); - /*int deltaX = e.getX() - mouseDownPoint.x; - int deltaY = e.getY() - mouseDownPoint.y; - double minX = -deltaX; - double minY = -deltaY; - double maxX = xyplot.getGraphArea().getWidth() - deltaX; - double maxY = xyplot.getGraphArea().getHeight() - deltaY; - xyplot.zoomToExtentScreen(minX, maxX, minY, maxY);*/ - //this.paintGraphics(); - this.repaintNew(); + if (plot instanceof AbstractPlot2D) { + AbstractPlot2D xyplot = (AbstractPlot2D) plot; + double[] xy1 = xyplot.screenToProj(mouseDownPoint.x, mouseDownPoint.y); + double[] xy2 = xyplot.screenToProj(e.getX(), e.getY()); + Extent extent = xyplot.getDrawExtent(); + extent = extent.shift(xy1[0] - xy2[0], xy1[1] - xy2[1]); + xyplot.setDrawExtent(extent); + /*int deltaX = e.getX() - mouseDownPoint.x; + int deltaY = e.getY() - mouseDownPoint.y; + double minX = -deltaX; + double minY = -deltaY; + double maxX = xyplot.getGraphArea().getWidth() - deltaX; + double maxY = xyplot.getGraphArea().getHeight() - deltaY; + xyplot.zoomToExtentScreen(minX, maxX, minY, maxY);*/ + //this.paintGraphics(); + this.repaintNew(); + } } break; } diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java index f563d605..ec191552 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java @@ -80,6 +80,7 @@ public class GLPlot extends Plot { protected Extent3D drawExtent; protected Extent3D axesExtent; protected boolean fixExtent; + protected TextRenderer textRenderer; protected ChartText title; protected GridLine gridLine; protected java.util.List legends; @@ -1224,6 +1225,8 @@ public class GLPlot extends Plot { final GL2 gl = drawable.getGL().getGL2(); gl.glLoadIdentity(); + this.updateTextRender(this.xAxis.getTickLabelFont()); + //Set light position - follow glLoadIdentity this.lighting.setPosition(gl); @@ -1299,6 +1302,9 @@ public class GLPlot extends Plot { //Draw title this.drawTitle(); + this.textRenderer.dispose(); + this.textRenderer = null; + gl.glFlush(); /*//Do screenshot @@ -1904,6 +1910,9 @@ public class GLPlot extends Plot { } strWidth = 0.0f; strHeight = 0.0f; + if (this.xAxis.isDrawTickLabel()) { + this.updateTextRender(tlabs.get(0).getFont()); + } for (int i = 0; i < this.xAxis.getTickValues().length; i += skip) { v = (float) this.xAxis.getTickValues()[i]; if (v < axesExtent.minX || v > axesExtent.maxX) { @@ -1924,26 +1933,31 @@ public class GLPlot extends Plot { gl.glEnd(); //Draw tick label - rect = drawString(gl, tlabs.get(i), v, y1, zMin, xAlign, yAlign); - if (strWidth < rect.getWidth()) { - strWidth = (float) rect.getWidth(); - } - if (strHeight < rect.getHeight()) { - strHeight = (float) rect.getHeight(); + if (this.xAxis.isDrawTickLabel()) { + rect = drawString(gl, tlabs.get(i), v, y1, zMin, xAlign, yAlign); + if (strWidth < rect.getWidth()) { + strWidth = (float) rect.getWidth(); + } + if (strHeight < rect.getHeight()) { + strHeight = (float) rect.getHeight(); + } } } //Draw x axis label - ChartText label = this.xAxis.getLabel(); - if (label != null) { - strWidth += this.tickSpace; - float angle = this.toScreenAngle(xMin, y, zMin, xMax, y, zMin); - angle = y < 0 ? 270 - angle : 90 - angle; - float yShift = Math.min(-strWidth, -strWidth); - if (this.angleX <= -120) { - yShift = -yShift; + if (this.xAxis.isDrawLabel()) { + ChartText label = this.xAxis.getLabel(); + if (label != null) { + this.updateTextRender(label.getFont()); + strWidth += this.tickSpace; + float angle = this.toScreenAngle(xMin, y, zMin, xMax, y, zMin); + angle = y < 0 ? 270 - angle : 90 - angle; + float yShift = Math.min(-strWidth, -strWidth); + if (this.angleX <= -120) { + yShift = -yShift; + } + drawString(gl, label, 0.0f, y1, zMin, XAlign.CENTER, yAlign, angle, 0, yShift); } - drawString(gl, label, 0.0f, y1, zMin, XAlign.CENTER, yAlign, angle, 0, yShift); } //////////////////////////////////////////// @@ -1980,6 +1994,9 @@ public class GLPlot extends Plot { } strWidth = 0.0f; strHeight = 0.0f; + if (this.yAxis.isDrawTickLabel()) { + this.updateTextRender(tlabs.get(0).getFont()); + } for (int i = 0; i < this.yAxis.getTickValues().length; i += skip) { v = (float) this.yAxis.getTickValues()[i]; if (v < axesExtent.minY || v > axesExtent.maxY) { @@ -2000,26 +2017,31 @@ public class GLPlot extends Plot { gl.glEnd(); //Draw tick label - rect = drawString(gl, tlabs.get(i), x1, v, zMin, xAlign, yAlign); - if (strWidth < rect.getWidth()) { - strWidth = (float) rect.getWidth(); - } - if (strHeight < rect.getHeight()) { - strHeight = (float) rect.getHeight(); + if (this.yAxis.isDrawTickLabel()) { + rect = drawString(gl, tlabs.get(i), x1, v, zMin, xAlign, yAlign); + if (strWidth < rect.getWidth()) { + strWidth = (float) rect.getWidth(); + } + if (strHeight < rect.getHeight()) { + strHeight = (float) rect.getHeight(); + } } } //Draw y axis label - label = this.yAxis.getLabel(); - if (label != null) { - strWidth += this.tickSpace; - float angle = this.toScreenAngle(x, yMin, zMin, x, yMax, xMin); - angle = x > 0 ? 270 - angle : 90 - angle; - float yShift = Math.min(-strWidth, -strWidth); - if (this.angleX <= -120) { - yShift = -yShift; + if (this.yAxis.isDrawLabel()) { + ChartText label = this.yAxis.getLabel(); + if (label != null) { + this.updateTextRender(label.getFont()); + strWidth += this.tickSpace; + float angle = this.toScreenAngle(x, yMin, zMin, x, yMax, xMin); + angle = x > 0 ? 270 - angle : 90 - angle; + float yShift = Math.min(-strWidth, -strWidth); + if (this.angleX <= -120) { + yShift = -yShift; + } + drawString(gl, label, x1, 0.0f, zMin, XAlign.CENTER, yAlign, angle, 0, yShift); } - drawString(gl, label, x1, 0.0f, zMin, XAlign.CENTER, yAlign, angle, 0, yShift); } } @@ -2087,6 +2109,9 @@ public class GLPlot extends Plot { xAlign = XAlign.RIGHT; yAlign = YAlign.CENTER; strWidth = 0.0f; + if (this.zAxis.isDrawTickLabel()) { + this.updateTextRender(tlabs.get(0).getFont()); + } for (int i = 0; i < this.zAxis.getTickValues().length; i += skip) { v = (float) this.zAxis.getTickValues()[i]; if (v < axesExtent.minZ || v > axesExtent.maxZ) { @@ -2107,17 +2132,22 @@ public class GLPlot extends Plot { gl.glEnd(); //Draw tick label - rect = drawString(gl, tlabs.get(i), x1, y1, v, xAlign, yAlign, -this.tickSpace, 0); - if (strWidth < rect.getWidth()) { - strWidth = (float) rect.getWidth(); + if (this.zAxis.isDrawTickLabel()) { + rect = drawString(gl, tlabs.get(i), x1, y1, v, xAlign, yAlign, -this.tickSpace, 0); + if (strWidth < rect.getWidth()) { + strWidth = (float) rect.getWidth(); + } } } //Draw z axis label - ChartText label = this.zAxis.getLabel(); - if (label != null) { - float yShift = strWidth + this.tickSpace * 3; - drawString(gl, label, x1, y1, 0.0f, XAlign.CENTER, YAlign.BOTTOM, 90.f, 0, yShift); + if (this.zAxis.isDrawLabel()) { + ChartText label = this.zAxis.getLabel(); + if (label != null) { + this.updateTextRender(label.getFont()); + float yShift = strWidth + this.tickSpace * 3; + drawString(gl, label, x1, y1, 0.0f, XAlign.CENTER, YAlign.BOTTOM, 90.f, 0, yShift); + } } } @@ -2234,6 +2264,26 @@ public class GLPlot extends Plot { } } + void updateTextRender(Font font) { + boolean newTR = false; + if (this.textRenderer == null) { + newTR = true; + } else { + if (!this.textRenderer.getFont().equals(font)) { + //this.textRenderer.dispose(); + newTR = true; + } + } + if (newTR) { + if (this.dpiScale == 1) { + textRenderer = new TextRenderer(font, true, true); + } else { + textRenderer = new TextRenderer(new Font(font.getFontName(), font.getStyle(), + (int) (font.getSize() * this.dpiScale)), true, true); + } + } + } + Rectangle2D drawString(GL2 gl, ChartText text, float vx, float vy, float vz, XAlign xAlign, YAlign yAlign) { return drawString(gl, text, vx, vy, vz, xAlign, yAlign, 0, 0); } @@ -2257,13 +2307,6 @@ public class GLPlot extends Plot { float y = coord.y; //Rendering text string - TextRenderer textRenderer; - if (this.dpiScale == 1) { - textRenderer = new TextRenderer(font, true, true); - } else { - textRenderer = new TextRenderer(new Font(font.getFontName(), font.getStyle(), - (int)(font.getSize() * (1 + (this.dpiScale - 1) * 0.8))), true, true); - } textRenderer.beginRendering(this.width, this.height); textRenderer.setColor(color); textRenderer.setSmoothing(true); @@ -2292,22 +2335,22 @@ public class GLPlot extends Plot { Rectangle2D drawString(GL2 gl, ChartText text, float vx, float vy, float vz, XAlign xAlign, YAlign yAlign, float angle) { - return drawString(gl, text.getText(), text.getFont(), text.getColor(), vx, vy, vz, xAlign, yAlign, angle, + return drawString(gl, text.getText(), text.getColor(), vx, vy, vz, xAlign, yAlign, angle, (float)text.getXShift(), (float)text.getYShift()); } Rectangle2D drawString(GL2 gl, ChartText text, float vx, float vy, float vz, XAlign xAlign, YAlign yAlign, float angle, float xShift, float yShift) { - return drawString(gl, text.getText(), text.getFont(), text.getColor(), vx, vy, + return drawString(gl, text.getText(), text.getColor(), vx, vy, vz, xAlign, yAlign, angle, (float)text.getXShift() + xShift, (float)text.getYShift() + yShift); } - Rectangle2D drawString(GL2 gl, String str, Font font, Color color, float vx, float vy, float vz, + Rectangle2D drawString(GL2 gl, String str, Color color, float vx, float vy, float vz, XAlign xAlign, YAlign yAlign, float angle) { - return drawString(gl, str, font, color, vx, vy, vz, xAlign, yAlign, angle, 0, 0); + return drawString(gl, str, color, vx, vy, vz, xAlign, yAlign, angle, 0, 0); } - Rectangle2D drawString(GL2 gl, String str, Font font, Color color, float vx, float vy, float vz, + Rectangle2D drawString(GL2 gl, String str, Color color, float vx, float vy, float vz, XAlign xAlign, YAlign yAlign, float angle, float xShift, float yShift) { //Get screen coordinates Vector2f coord = this.toScreen(vx, vy, vz); @@ -2315,13 +2358,6 @@ public class GLPlot extends Plot { float y = coord.y; //Rendering text string - TextRenderer textRenderer; - if (this.dpiScale == 1) { - textRenderer = new TextRenderer(font, true, true); - } else { - textRenderer = new TextRenderer(new Font(font.getFontName(), font.getStyle(), - (int)(font.getSize() * (1 + (this.dpiScale - 1) * 0.8))), true, true); - } textRenderer.beginRendering(this.width, this.height); textRenderer.setColor(color); textRenderer.setSmoothing(true); @@ -2354,30 +2390,22 @@ public class GLPlot extends Plot { y += yShift; textRenderer.draw(str, (int) x, (int) y); textRenderer.endRendering(); - textRenderer.dispose(); gl.glPopMatrix(); return rect; } Rectangle2D drawString3D(GL2 gl, ChartText3D text3D, float vx, float vy, float vz) { - return drawString3D(gl, text3D.getText(), text3D.getFont(), text3D.getColor(), vx, vy, vz); + return drawString3D(gl, text3D.getText(), text3D.getColor(), vx, vy, vz); } - Rectangle2D drawString3D(GL2 gl, String str, Font font, Color color, float vx, float vy, float vz) { + Rectangle2D drawString3D(GL2 gl, String str, Color color, float vx, float vy, float vz) { //Get screen coordinates Vector2f coord = this.toScreen(vx, vy, vz); float x = coord.x; float y = coord.y; //Rendering text string - TextRenderer textRenderer; - if (this.dpiScale == 1) { - textRenderer = new TextRenderer(font, true, true); - } else { - textRenderer = new TextRenderer(new Font(font.getFontName(), font.getStyle(), - (int)(font.getSize() * (1 + (this.dpiScale - 1) * 0.8))), true, true); - } textRenderer.beginRendering(this.width, this.height, false); //textRenderer.begin3DRendering(); textRenderer.setColor(color); @@ -2395,7 +2423,7 @@ public class GLPlot extends Plot { if (title != null) { //Rendering text string Font font = title.getFont(); - TextRenderer textRenderer; + this.updateTextRender(font); if (this.dpiScale == 1) { textRenderer = new TextRenderer(font, true, true); } else { @@ -2575,6 +2603,7 @@ public class GLPlot extends Plot { protected void drawText(GL2 gl, ChartText3D text) { Vector3f xyz = this.transform.transform((float) text.getX(), (float) text.getY(), (float) text.getZ()); + this.updateTextRender(text.getFont()); if (text.isDraw3D()) { this.drawString3D(gl, text, xyz.x, xyz.y, xyz.z); } else { @@ -4238,6 +4267,8 @@ public class GLPlot extends Plot { GL2 gl = drawable.getGL().getGL2(); this.gl = gl; this.glu = GLU.createGLU(gl); + Font font = this.xAxis.getTickLabelFont(); + updateTextRender(font); //Background //gl.glClearColor(1f, 1f, 1f, 1.0f); gl.glEnable(GL2.GL_POINT_SMOOTH); diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/GraphicRender.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/GraphicRender.java index 05fd0fad..c023d906 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/GraphicRender.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/GraphicRender.java @@ -7,5 +7,5 @@ public interface GraphicRender { /** * Draw graphic */ - public abstract void draw(); + void draw(); } diff --git a/meteoinfo-chart/src/test/java/VolumeTest.java b/meteoinfo-chart/src/test/java/VolumeTest.java index 8142500a..94219f62 100644 --- a/meteoinfo-chart/src/test/java/VolumeTest.java +++ b/meteoinfo-chart/src/test/java/VolumeTest.java @@ -1,4 +1,7 @@ -import org.meteoinfo.chart.jogl.GLChartPanel; +import org.meteoinfo.chart.GLChart; +import org.meteoinfo.chart.GLChartPanel; +import org.meteoinfo.chart.MouseMode; +import org.meteoinfo.chart.jogl.GLPlot; import org.meteoinfo.chart.jogl.Plot3DGL; import org.meteoinfo.chart.graphic.VolumeGraphic; import org.meteoinfo.chart.render.jogl.RayCastingType; @@ -107,33 +110,30 @@ public class VolumeTest { VolumeGraphic graphics = test.createGraphics(); graphics.setRayCastingType(RayCastingType.SPECULAR); JFrame frame = new JFrame("Volume Test"); - Plot3DGL plot = new Plot3DGL(); + GLPlot plot = new GLPlot(); plot.setOrthographic(false); plot.setClipPlane(false); //plot.setBackground(Color.black); //plot.setForeground(Color.blue); - plot.setDrawBoundingBox(false); - plot.setDrawBase(false); - plot.setBoxed(false); - plot.getGridLine().setDrawXLine(false); - plot.getGridLine().setDrawYLine(false); - plot.getGridLine().setDrawZLine(false); - GLChartPanel canvas = new GLChartPanel(plot); + plot.setDrawBoundingBox(true); + plot.setDrawBase(true); + plot.setBoxed(true); + plot.setDisplayXY(true); + //plot.getXAxis().setDrawTickLabel(false); + //plot.getYAxis().setDrawTickLabel(false); + plot.setDisplayZ(true); + plot.getZAxis().setLabel("Z axis"); + //plot.getGridLine().setDrawXLine(false); + //plot.getGridLine().setDrawYLine(false); + //plot.getGridLine().setDrawZLine(false); plot.addGraphic(graphics); + GLChartPanel canvas = new GLChartPanel(new GLChart()); + canvas.getChart().addPlot(plot); + canvas.setMouseMode(MouseMode.ROTATE); frame.getContentPane().add(canvas); frame.pack(); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); - /*try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - int width = canvas.getWidth(); - int height = canvas.getHeight(); - canvas.setSize(width, height + 1); - canvas.setSize(width, height);*/ - //frame.setSize(600, 401); } } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/GridData.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/GridData.java index 2a1098f2..d395a219 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/GridData.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/GridData.java @@ -116,7 +116,7 @@ public class GridData { this.missingValue = missingValue; this.projInfo = projInfo; - if (this.getYDelta() < 0) { + /*if (this.getYDelta() < 0) { this.yArray = IntStream.range(0, this.yArray.length) .mapToDouble(i -> this.yArray[this.yArray.length - 1 - i]) .toArray(); @@ -128,7 +128,7 @@ public class GridData { .mapToDouble(i -> this.xArray[this.xArray.length - 1 - i]) .toArray(); this.xReverse(); - } + }*/ } /** diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 5564a46f..8667317e 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,18 +1,18 @@ - - - - - - - - - - + - + + + + + + + + + + @@ -21,14 +21,14 @@ - + - + @@ -36,5 +36,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class index 0359baf9534518895e72071f92fd15e2ea68dd57..3a08a90b939f284ca4ca96831685f6a56f59b429 100644 GIT binary patch literal 106570 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 LG2)N0xkmp7NgV=u literal 106144 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 0: locs = args[0] - if isinstance(locs, (NDArray, DimArray)): - locs = locs.aslist() - if isinstance(locs[0], datetime.datetime): - for i in range(len(locs)): - locs[i] = miutil.date2num(locs[i]) + if len(locs) > 0: + if isinstance(locs, (NDArray, DimArray)): + locs = locs.aslist() + if isinstance(locs[0], datetime.datetime): + for i in range(len(locs)): + locs[i] = miutil.date2num(locs[i]) g_axes.set_zticks(locs) args = args[1:] if len(args) > 0: @@ -2167,4 +2168,11 @@ def gc_collect(): """ clear() import gc - gc.collect() \ No newline at end of file + gc.collect() + +def refresh(): + """ + Refresh the figure + """ + migl.milapp.getFigureDock().setVisible(False) + migl.milapp.getFigureDock().setVisible(True) \ No newline at end of file diff --git a/meteoinfo-map/src/main/java/org/meteoinfo/map/forms/FrmSectionPlot.java b/meteoinfo-map/src/main/java/org/meteoinfo/map/forms/FrmSectionPlot.java index 9c4a3de1..c24e163e 100644 --- a/meteoinfo-map/src/main/java/org/meteoinfo/map/forms/FrmSectionPlot.java +++ b/meteoinfo-map/src/main/java/org/meteoinfo/map/forms/FrmSectionPlot.java @@ -2033,7 +2033,6 @@ public class FrmSectionPlot extends javax.swing.JFrame { } private void setXYCoords(GridData aGridData) { - boolean yReverse = aGridData.getYDelta() < 0; int i; int xNum = 0, yNum = 0; switch (_plotDimension) { @@ -2069,9 +2068,6 @@ public class FrmSectionPlot extends javax.swing.JFrame { } aGridData.setXArray(xArray); aGridData.setYArray(yArray); - if (yReverse) { - aGridData.yReverse(); - } } private void zoomToExtent(Extent aExtent) {