package org.openpnp.gui.components.nav; import java.awt.image.BufferedImage; import org.openpnp.CameraListener; import org.openpnp.model.Configuration; import org.openpnp.model.LengthUnit; import org.openpnp.model.Location; import org.openpnp.spi.Camera; import org.openpnp.spi.Head; import org.openpnp.spi.Machine; import org.openpnp.spi.MachineListener; import org.openpnp.util.UiUtils; import javafx.application.Platform; import javafx.embed.swing.SwingFXUtils; import javafx.scene.control.Tooltip; import javafx.scene.image.ImageView; class CameraImageView extends ImageView implements CameraListener { final Camera camera; public CameraImageView(Camera camera) { this.camera = camera; Location unitsPerPixel = camera.getUnitsPerPixel().convertToUnits(LengthUnit.Millimeters); double width = unitsPerPixel.getX() * camera.getWidth(); double height = unitsPerPixel.getY() * camera.getHeight(); setFitWidth(width); setFitHeight(height); // Images are flipped with respect to display coordinates, so // flip em back. setScaleY(-1); setTranslateX(-width / 2); setTranslateY(-height / 2); setOnMouseClicked(event -> { setOpacity(getOpacity() == 1 ? 0.20 : 1); }); camera.startContinuousCapture(this, 10); UiUtils.bindTooltip(this, new Tooltip(camera.getName())); updateLocation(); Configuration.get().getMachine().addListener(machineListener); } private void updateLocation() { Location location = camera.getLocation().convertToUnits(LengthUnit.Millimeters); setX(location.getX()); setY(location.getY()); } public void frameReceived(BufferedImage img) { if (img == null) { return; } setImage(SwingFXUtils.toFXImage(img, null)); } MachineListener machineListener = new MachineListener.Adapter() { @Override public void machineHeadActivity(Machine machine, Head head) { Platform.runLater(() -> updateLocation()); } @Override public void machineEnabled(Machine machine) { Platform.runLater(() -> updateLocation()); } }; }