Révision 2529
| tmp/org.txm.chartsengine.r.core/src/org/txm/chartsengine/r/core/RChartsEngine.java (revision 2529) | ||
|---|---|---|
| 1 | 1 |
package org.txm.chartsengine.r.core; |
| 2 |
|
|
| 2 | 3 |
import java.io.File; |
| 3 | 4 |
import java.util.ArrayList; |
| 4 | 5 |
|
| ... | ... | |
| 22 | 23 |
* |
| 23 | 24 |
*/ |
| 24 | 25 |
public class RChartsEngine extends ChartsEngine {
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 28 | 29 |
/** |
| 29 | 30 |
* The charts engine internal name. |
| 30 | 31 |
*/ |
| 31 | 32 |
public final static String NAME = "r_charts_engine"; //$NON-NLS-1$ |
| 32 |
|
|
| 33 |
|
|
| 33 | 34 |
/** |
| 34 | 35 |
* The charts engine description. |
| 35 | 36 |
*/ |
| 36 | 37 |
public final static String DESCRIPTION = "R"; |
| 37 |
|
|
| 38 |
|
|
| 38 |
|
|
| 39 |
|
|
| 39 | 40 |
/** |
| 40 | 41 |
* Constants for extra output formats. |
| 41 | 42 |
*/ |
| 42 | 43 |
// FIXME : for tests or further output formats implementations |
| 43 |
//public final static String OUTPUT_FORMAT_RGRAPHICS = "rgraphics", OUTPUT_FORMAT_IPLOT = "iplots", OUTPUT_FORMAT_JAVAGD = "javagd"; //$NON-NLS-1$ //$NON-NLS-2$ |
|
| 44 |
|
|
| 45 |
|
|
| 44 |
// public final static String OUTPUT_FORMAT_RGRAPHICS = "rgraphics", OUTPUT_FORMAT_IPLOT = "iplots", OUTPUT_FORMAT_JAVAGD = "javagd"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 45 |
|
|
| 46 |
|
|
| 46 | 47 |
/** |
| 47 | 48 |
* The R device to use for generating charts. |
| 48 | 49 |
*/ |
| 49 | 50 |
protected RDevice rDevice; |
| 50 |
|
|
| 51 |
|
|
| 51 |
|
|
| 52 |
|
|
| 52 | 53 |
/** |
| 53 | 54 |
* Creates a R charts engine implementation with the specified output format as current. |
| 55 |
* |
|
| 54 | 56 |
* @param outputFormat |
| 55 | 57 |
*/ |
| 56 | 58 |
public RChartsEngine(String outputFormat) {
|
| ... | ... | |
| 58 | 60 |
this.directComputing = false; |
| 59 | 61 |
this.setOutputFormat(outputFormat); |
| 60 | 62 |
} |
| 61 |
|
|
| 63 |
|
|
| 62 | 64 |
/** |
| 63 | 65 |
* Creates a R charts engine implementation. |
| 64 | 66 |
*/ |
| 65 | 67 |
public RChartsEngine() {
|
| 66 | 68 |
this(RChartsEnginePreferences.getInstance().getString(RChartsEnginePreferences.OUTPUT_FORMAT)); |
| 67 | 69 |
} |
| 68 |
|
|
| 69 | 70 |
|
| 71 |
|
|
| 70 | 72 |
@Override |
| 71 |
public File createChartFile(Object chart, File file) {
|
|
| 73 |
public File createChartFile(Object chart, File file) {
|
|
| 72 | 74 |
return this.plot(file, (String) chart); |
| 73 | 75 |
} |
| 74 | 76 |
|
| 75 |
|
|
| 77 |
|
|
| 76 | 78 |
/** |
| 77 | 79 |
* Plots the specified expression using R workspace instance and current charts engine output format. |
| 78 | 80 |
* |
| 79 | 81 |
* @param file |
| 80 | 82 |
* @param cmd |
| 81 | 83 |
*/ |
| 82 |
public File plot(File file, String cmd) {
|
|
| 84 |
public File plot(File file, String cmd) {
|
|
| 83 | 85 |
return this.plot(file, cmd, null, null, null); |
| 84 | 86 |
} |
| 85 | 87 |
|
| ... | ... | |
| 89 | 91 |
* @param file |
| 90 | 92 |
* @param cmd |
| 91 | 93 |
* @param result |
| 94 |
* @param title |
|
| 95 |
* @param subtitle |
|
| 96 |
* @return |
|
| 92 | 97 |
*/ |
| 93 |
public File plot(File file, String cmd, ChartResult result, String title, String subtitle) {
|
|
| 98 |
public File plot(File file, String cmd, ChartResult result, String title, String subtitle) {
|
|
| 94 | 99 |
try {
|
| 95 |
|
|
| 100 |
|
|
| 96 | 101 |
if (!cmd.endsWith(";") && !cmd.endsWith("\n")) { //$NON-NLS-1$
|
| 97 | 102 |
cmd += ";"; //$NON-NLS-1$ |
| 98 | 103 |
} |
| 99 | 104 |
|
| 100 | 105 |
// FIXME: margin tests |
| 101 |
//cmd += "windows.options(width=100, height=10);\n"; //$NON-NLS-1$ |
|
| 102 |
//cmd += "par(mar = c(50,6,4,1) + .1);\n"; //$NON-NLS-1$ |
|
| 106 |
// cmd += "windows.options(width=100, height=10);\n"; //$NON-NLS-1$
|
|
| 107 |
// cmd += "par(mar = c(50,6,4,1) + .1);\n"; //$NON-NLS-1$
|
|
| 103 | 108 |
|
| 104 | 109 |
// FIXME: outer margin to not cut of title |
| 105 |
//cmd += "par(oma = c(10,2,2,2));\n"; //$NON-NLS-1$ |
|
| 106 |
|
|
| 110 |
// cmd += "par(oma = c(10,2,2,2));\n"; //$NON-NLS-1$
|
|
| 111 |
|
|
| 107 | 112 |
// font size |
| 108 |
//cmd += "par(cex.main = 3.5);\n"; //$NON-NLS-1$ |
|
| 109 |
//cex.lab=1.5, cex.axis=1.5, cex.main=1.5, cex.sub=1.5 |
|
| 113 |
// cmd += "par(cex.main = 3.5);\n"; //$NON-NLS-1$
|
|
| 114 |
// cex.lab=1.5, cex.axis=1.5, cex.main=1.5, cex.sub=1.5
|
|
| 110 | 115 |
|
| 111 |
if(result != null) {
|
|
| 116 |
if (result != null) {
|
|
| 112 | 117 |
// draw grid |
| 113 |
if(result.isGridVisible()) {
|
|
| 118 |
if (result.isGridVisible()) {
|
|
| 114 | 119 |
cmd += this.getGridPlotCmd(); |
| 115 | 120 |
} |
| 116 | 121 |
// draw title and subtitle |
| 117 |
if(result.isTitleVisible()) {
|
|
| 118 |
if(title != null) {
|
|
| 122 |
if (result.isTitleVisible()) {
|
|
| 123 |
if (title != null) {
|
|
| 119 | 124 |
cmd += this.getTitlePlotCmd(title); |
| 120 | 125 |
} |
| 121 |
if(subtitle != null) {
|
|
| 126 |
if (subtitle != null) {
|
|
| 122 | 127 |
cmd += this.getSubtitlePlotCmd(subtitle); |
| 123 | 128 |
} |
| 124 | 129 |
} |
| 125 | 130 |
} |
| 126 | 131 |
file = RWorkspaceRenderer.getInstance().plot(file, cmd, this.rDevice); |
| 127 | 132 |
} |
| 128 |
catch(Exception e) {
|
|
| 133 |
catch (Exception e) {
|
|
| 129 | 134 |
e.printStackTrace(); |
| 130 | 135 |
return null; |
| 131 | 136 |
} |
| ... | ... | |
| 133 | 138 |
return file; |
| 134 | 139 |
} |
| 135 | 140 |
|
| 141 |
/** |
|
| 142 |
* Plots the specified expression using R workspace instance and current charts engine output format. |
|
| 143 |
* |
|
| 144 |
* @param file |
|
| 145 |
* @param cmd |
|
| 146 |
* @param result |
|
| 147 |
* @param title |
|
| 148 |
* @return |
|
| 149 |
*/ |
|
| 150 |
public File plot(File file, String cmd, ChartResult result, String title) {
|
|
| 151 |
return this.plot(file, cmd, result, title, null); |
|
| 152 |
} |
|
| 136 | 153 |
|
| 154 |
|
|
| 137 | 155 |
/** |
| 138 | 156 |
* Returns a string that represents the R command to draw a title. |
| 157 |
* |
|
| 139 | 158 |
* @param title |
| 140 | 159 |
* @return |
| 141 | 160 |
*/ |
| 142 |
public String getTitlePlotCmd(String title) {
|
|
| 143 |
|
|
| 161 |
public String getTitlePlotCmd(String title) {
|
|
| 162 |
|
|
| 144 | 163 |
// FIXME: Tests |
| 145 |
// title(main = "Titre principal", sub = "Sous-titre",
|
|
| 146 |
// xlab = "Axe des x", ylab = "Axe des y",
|
|
| 147 |
// cex.main = 2, font.main= 4, col.main= "red",
|
|
| 148 |
// cex.sub = 0.75, font.sub = 3, col.sub = "green",
|
|
| 149 |
// col.lab ="darkblue"
|
|
| 150 |
// )
|
|
| 164 |
// title(main = "Titre principal", sub = "Sous-titre",
|
|
| 165 |
// xlab = "Axe des x", ylab = "Axe des y",
|
|
| 166 |
// cex.main = 2, font.main= 4, col.main= "red",
|
|
| 167 |
// cex.sub = 0.75, font.sub = 3, col.sub = "green",
|
|
| 168 |
// col.lab ="darkblue"
|
|
| 169 |
// )
|
|
| 151 | 170 |
|
| 152 |
//return String.format("title(main = \"%s\");\n", title); //$NON-NLS-1$
|
|
| 171 |
// return String.format("title(main = \"%s\");\n", title); //$NON-NLS-1$
|
|
| 153 | 172 |
|
| 154 |
// FIXME: tests for adaptive not truncated title
|
|
| 173 |
// FIXME: tests for adaptive not truncated title |
|
| 155 | 174 |
return String.format("title(main = paste(strwrap(\"%s\", width = 50), collapse = \"\n\"));\n", title); //$NON-NLS-1$
|
| 156 | 175 |
|
| 157 | 176 |
|
| 158 | 177 |
} |
| 159 |
|
|
| 178 |
|
|
| 160 | 179 |
/** |
| 161 | 180 |
* Returns a string that represents the R command to draw a subtitle. |
| 181 |
* |
|
| 162 | 182 |
* @param subtitle |
| 163 | 183 |
* @return |
| 164 | 184 |
*/ |
| 165 |
public String getSubtitlePlotCmd(String subtitle) {
|
|
| 185 |
public String getSubtitlePlotCmd(String subtitle) {
|
|
| 166 | 186 |
// NOTE: SJ: sub title always drawn the string at bottom of the plot |
| 167 |
//return String.format("title(sub = \"%s\");\n", subtitle); //$NON-NLS-1$
|
|
| 187 |
// return String.format("title(sub = \"%s\");\n", subtitle); //$NON-NLS-1$
|
|
| 168 | 188 |
return String.format("title(main = \"\n\n\n%s\");\n", subtitle); //$NON-NLS-1$
|
| 169 | 189 |
} |
| 170 |
|
|
| 171 | 190 |
|
| 191 |
|
|
| 172 | 192 |
/** |
| 173 | 193 |
* Returns a string that represents the R command to draw a grid. |
| 194 |
* |
|
| 174 | 195 |
* @return |
| 175 | 196 |
*/ |
| 176 |
public String getGridPlotCmd() {
|
|
| 197 |
public String getGridPlotCmd() {
|
|
| 177 | 198 |
return "grid (NULL,NULL, lty = \"dotted\", col = \"lightgray\");\n"; //$NON-NLS-1$ |
| 178 | 199 |
} |
| 179 | 200 |
|
| 180 | 201 |
/** |
| 181 | 202 |
* Replaces or creates the vector named "colors" in the R workspace from the current charts engine theme palette according to specified rendering mode and items count. |
| 203 |
* |
|
| 182 | 204 |
* @param renderingColorMode |
| 183 | 205 |
* @param itemsCount |
| 184 | 206 |
*/ |
| 185 |
public void setColors(int renderingColorMode, int itemsCount) {
|
|
| 207 |
public void setColors(int renderingColorMode, int itemsCount) {
|
|
| 186 | 208 |
this.setColors(this.theme.getPaletteAsHexFor(renderingColorMode, itemsCount)); |
| 187 | 209 |
} |
| 188 | 210 |
|
| 189 | 211 |
/** |
| 190 | 212 |
* Replaces or creates the vector named "colors" in the R workspace filled with the specified hexadecimal colors palette. |
| 213 |
* |
|
| 191 | 214 |
* @param hexPalette |
| 192 | 215 |
*/ |
| 193 |
public void setColors(String[] hexPalette) {
|
|
| 216 |
public void setColors(String[] hexPalette) {
|
|
| 194 | 217 |
try {
|
| 195 | 218 |
RWorkspace rw = RWorkspace.getRWorkspaceInstance(); |
| 196 | 219 |
rw.eval("rm(colors)"); //$NON-NLS-1$
|
| 197 | 220 |
rw.addVectorToWorkspace("colors", hexPalette); //$NON-NLS-1$
|
| 198 | 221 |
} |
| 199 |
catch(RWorkspaceException e) {
|
|
| 222 |
catch (RWorkspaceException e) {
|
|
| 200 | 223 |
e.printStackTrace(); |
| 201 | 224 |
} |
| 202 | 225 |
} |
| 203 | 226 |
|
| 204 |
|
|
| 227 |
|
|
| 205 | 228 |
@Override |
| 206 |
public void setOutputFormat(String outputFormat) {
|
|
| 229 |
public void setOutputFormat(String outputFormat) {
|
|
| 207 | 230 |
this.outputFormat = outputFormat; |
| 208 |
|
|
| 231 |
|
|
| 209 | 232 |
// FIXME : SJ: voir comment gérer cela autrement + supprimer certaines méthodes du RDevice devenues inutiles depuis qu'on stocke outputFormat ? |
| 210 |
if(outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_JPEG)) {
|
|
| 233 |
if (outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_JPEG)) {
|
|
| 211 | 234 |
this.rDevice = RDevice.JPEG; |
| 212 | 235 |
} |
| 213 |
else if(outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PDF)) {
|
|
| 236 |
else if (outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PDF)) {
|
|
| 214 | 237 |
this.rDevice = RDevice.PDF; |
| 215 | 238 |
} |
| 216 |
else if(outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PNG)) {
|
|
| 239 |
else if (outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PNG)) {
|
|
| 217 | 240 |
this.rDevice = RDevice.PNG; |
| 218 | 241 |
} |
| 219 |
else if(outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PS)) {
|
|
| 242 |
else if (outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_PS)) {
|
|
| 220 | 243 |
this.rDevice = RDevice.PS; |
| 221 | 244 |
} |
| 222 |
else if(outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_SVG)) {
|
|
| 245 |
else if (outputFormat.equals(ChartsEngine.OUTPUT_FORMAT_SVG)) {
|
|
| 223 | 246 |
this.rDevice = RDevice.SVG; |
| 224 | 247 |
} |
| 225 | 248 |
} |
| 226 |
|
|
| 227 |
|
|
| 228 | 249 |
|
| 229 |
|
|
| 250 |
|
|
| 251 |
|
|
| 252 |
|
|
| 230 | 253 |
@Override |
| 231 | 254 |
public ArrayList<String> getSupportedOutputDisplayFormats() {
|
| 232 |
ArrayList<String> formats = new ArrayList<String>(1);
|
|
| 233 |
|
|
| 255 |
ArrayList<String> formats = new ArrayList<>(1); |
|
| 256 |
|
|
| 234 | 257 |
// FIXME: UI display output format, only SVG |
| 235 |
//formats.add(outputFormatDefinitions.get(JFCChartsEngine.OUTPUT_FORMAT_SVG)); |
|
| 258 |
// formats.add(outputFormatDefinitions.get(JFCChartsEngine.OUTPUT_FORMAT_SVG));
|
|
| 236 | 259 |
|
| 237 | 260 |
return formats; |
| 238 | 261 |
} |
| 239 |
|
|
| 240 | 262 |
|
| 263 |
|
|
| 241 | 264 |
@Override |
| 242 | 265 |
public ArrayList<String> getSupportedOutputFileFormats() {
|
| 243 |
ArrayList<String> formats = new ArrayList<String>(5);
|
|
| 266 |
ArrayList<String> formats = new ArrayList<>(5);
|
|
| 244 | 267 |
|
| 245 | 268 |
formats.add(OUTPUT_FORMAT_SVG); |
| 246 | 269 |
formats.add(OUTPUT_FORMAT_PNG); |
| ... | ... | |
| 251 | 274 |
return formats; |
| 252 | 275 |
} |
| 253 | 276 |
|
| 254 |
|
|
| 255 |
|
|
| 256 |
|
|
| 257 |
|
|
| 277 |
|
|
| 278 |
|
|
| 279 |
|
|
| 280 |
|
|
| 258 | 281 |
@Override |
| 259 | 282 |
public File exportChart(Object chart, File file, String outputFormat, int imageWidth, int imageHeight, int drawingAreaX, int drawingAreaY, int drawingAreaWidth, int drawingAreaHeight) {
|
| 260 | 283 |
// FIXME: Not yet implemented |
| 261 | 284 |
Log.severe(this.getClass() + ".exportChart(): Not yet implemented."); |
| 262 | 285 |
return null; |
| 263 | 286 |
} |
| 264 |
|
|
| 287 |
|
|
| 265 | 288 |
@Override |
| 266 | 289 |
public boolean isRunning() {
|
| 267 | 290 |
// TODO Auto-generated method stub |
| 268 | 291 |
return false; |
| 269 | 292 |
} |
| 270 |
|
|
| 271 |
|
|
| 293 |
|
|
| 294 |
|
|
| 272 | 295 |
@Override |
| 273 | 296 |
public boolean start(IProgressMonitor monitor) throws Exception {
|
| 274 | 297 |
// TODO Auto-generated method stub |
| 275 | 298 |
return false; |
| 276 | 299 |
} |
| 277 |
|
|
| 300 |
|
|
| 278 | 301 |
@Override |
| 279 | 302 |
public boolean stop() throws Exception {
|
| 280 | 303 |
// TODO Auto-generated method stub |
| 281 | 304 |
return false; |
| 282 | 305 |
} |
| 283 |
|
|
| 306 |
|
|
| 284 | 307 |
@Override |
| 285 | 308 |
public String getName() {
|
| 286 | 309 |
return RChartsEngine.NAME; |
| 287 | 310 |
} |
| 288 |
|
|
| 289 | 311 |
|
| 312 |
|
|
| 290 | 313 |
} |
Formats disponibles : Unified diff