Seems like the library grafica doesn’t offer us any option to change the PGraphics it draws onto. It directly calls PApplet’s methods to draw on its canvas. ![]()
The workaround I’ve come up w/ is to wrap up the grafica’s code on its own PApplet subclass. ![]()
And then call PSurface::setVisible() in order to hide its window. ![]()
And in order to save its current canvas, I’ve added a pre() method to it:
void pre() {
unregisterMethod("pre", this);
saveFrame(dataPath(FILENAME));
}
Which then I use PApplet::registerMethod() inside main PApplet’s mousePressed() callback so the grafica’s PApplet runs its pre() callback once:
void mousePressed() {
if (mouseButton == CENTER) graf.registerMethod("pre", graf);
else graf.getSurface().setVisible(visible ^= true);
redraw = true;
}
I’m using grafica’s “MovingPoints.pde” example sketch as a base for my workaround:
Here’s my full workaround sketch: ![]()
/**
* PApplet Grafica (v1.0.1)
* GoToLoop (2018/Aug/03)
* Discourse.Processing.org/t/plot-grafica-in-pgraphics/2334/2
*/
import grafica.*;
PApplet graf;
boolean visible;
void settings() {
size(600, 400);
noLoop();
final String[] switches = { "--sketch-path=" + sketchPath(), "" };
runSketch(switches, graf = new Grafica());
while (graf.height <= 100) delay(1);
graf.getSurface().setVisible(visible);
}
void draw() {
background((color) random(#000000));
}
void mousePressed() {
if (mouseButton == CENTER) graf.registerMethod("pre", graf);
else graf.getSurface().setVisible(visible ^= true);
redraw = true;
}
public static class Grafica extends PApplet {
static final String NAME = "plot-####", EXT = ".jpg";
static final String FILENAME = NAME + EXT;
GPlot plot;
int step = 0;
int stepsPerCycle = 100;
int lastStepTime = 0;
boolean clockwise = true;
float scale = 5;
void pre() {
unregisterMethod("pre", this);
saveFrame(dataPath(FILENAME));
}
void settings() {
size(450, 450);
}
void setup() {
// Prepare the first set of points
int nPoints1 = stepsPerCycle/10;
GPointsArray points1 = new GPointsArray(nPoints1);
for (int i = 0; i < nPoints1; i++) {
points1.add(calculatePoint(step, stepsPerCycle, scale));
step = (clockwise)? step + 1 : step - 1;
}
lastStepTime = millis();
// Prepare the second set of points
int nPoints2 = stepsPerCycle + 1;
GPointsArray points2 = new GPointsArray(nPoints2);
for (int i = 0; i < nPoints2; i++) {
points2.add(calculatePoint(i, stepsPerCycle, 0.9*scale));
}
// Create the plot
plot = new GPlot(this);
plot.setPos(25, 25);
plot.setDim(300, 300);
// or all in one go
// plot = new GPlot(this, 25, 25, 300, 300);
// Set the plot limits (this will fix them)
plot.setXLim(-1.2*scale, 1.2*scale);
plot.setYLim(-1.2*scale, 1.2*scale);
// Set the plot title and the axis labels
plot.setTitleText("Clockwise movement");
plot.getXAxis().setAxisLabelText("x axis");
plot.getYAxis().setAxisLabelText("y axis");
// Activate the panning effect
plot.activatePanning();
// Add the two set of points to the plot
plot.setPoints(points1);
plot.addLayer("surface", points2);
// Change the second layer line color
plot.getLayer("surface").setLineColor(color(100, 255, 100));
}
void draw() {
background(150);
plot.beginDraw();
plot.drawBackground();
plot.drawBox();
plot.drawXAxis();
plot.drawYAxis();
plot.drawTopAxis();
plot.drawRightAxis();
plot.drawTitle();
plot.getMainLayer().drawPoints();
plot.getLayer("surface").drawFilledContour(GPlot.HORIZONTAL, 0);
plot.endDraw();
// Add and remove new points every 10th of a second
if (millis() - lastStepTime > 100) {
if (clockwise) {
// Add the point at the end of the array
plot.addPoint(calculatePoint(step, stepsPerCycle, scale));
step++;
// Remove the first point
plot.removePoint(0);
} else {
// Add the point at the beginning of the array
plot.addPoint(0, calculatePoint(step, stepsPerCycle, scale));
step--;
// Remove the last point
plot.removePoint(plot.getPointsRef().getNPoints() - 1);
}
lastStepTime = millis();
}
}
void mouseClicked() {
// Change the movement sense
clockwise = !clockwise;
if (clockwise) {
step += plot.getPointsRef().getNPoints() + 1;
plot.setTitleText("Clockwise movement");
} else {
step -= plot.getPointsRef().getNPoints() + 1;
plot.setTitleText("Anti-clockwise movement");
}
}
GPoint calculatePoint(float i, float n, float rad) {
float delta = 0.1*cos(TWO_PI*10*i/n);
float ang = TWO_PI*i/n;
return new GPoint(rad*(1 + delta)*sin(ang), rad*(1 + delta)*cos(ang));
}
}