Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
package com.marginallyclever.makelangelo.makeart.imageconverter;
import com.marginallyclever.donatello.select.SelectToggleButton;
import com.marginallyclever.makelangelo.Translator;
import com.marginallyclever.makelangelo.makeart.TransformedImage;
import com.marginallyclever.makelangelo.paper.Paper;
import com.marginallyclever.makelangelo.preview.RenderListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Extends {@link ImageConverter} to run in an evolving, iterative process until it converges on some goal or the user pauses it.
* Implements {@link RenderListener} to draw progress while it runs.
* @author Dan Royer
* @since 7?
*/
public abstract class ImageConverterIterative extends ImageConverter implements RenderListener {
private static final Logger logger = LoggerFactory.getLogger(ImageConverterIterative.class);
private ImageConverterThread imageConverterThread;
private final SelectToggleButton pauseButton;
protected final Lock lock = new ReentrantLock();
public ImageConverterIterative() {
super();
pauseButton = new SelectToggleButton("pauseButton",Translator.get("PlotterControls.Pause"));
add(pauseButton);
pauseButton.addSelectListener((evt) -> {
imageConverterThread.setPaused(pauseButton.isSelected());
});
}
@Override
public void start(Paper paper, TransformedImage image) {
super.start(paper,image);
logger.debug("start()");
if(imageConverterThread!=null) {
logger.warn("called while thread is still running.");
stop();
}
imageConverterThread = new ImageConverterThread(this);
imageConverterThread.execute();
}
@Override
public void stop() {
super.stop();
logger.debug("stop()");
imageConverterThread.setPaused(true);
imageConverterThread.endThreadGracefully();
while(!imageConverterThread.isDone());
imageConverterThread = null;
}
public boolean isThreadCancelled() {
return imageConverterThread != null && imageConverterThread.isCancelled();
}
public void setThread(ImageConverterThread p) {
imageConverterThread = p;
}
/**
* run one "step" of an iterative image conversion process.
* @return true if conversion should iterate again.
*/
public abstract boolean iterate();
/**
* called when the user pauses the conversion. Should generate the {@link com.marginallyclever.makelangelo.turtle.Turtle} output.
*/
public abstract void generateOutput();
protected ImageConverterThread getThread() {
return imageConverterThread;
}
public abstract void resume();
}
f99985dc8This file is pinned to the selected release. Download the original to open it in your design tool.