Снимок экрана области моделирования

Привет, кто-нибудь знает хороший способ сделать снимок экрана симуляции таким образом, чтобы вы могли указать разрешение и получить изображение более высокого качества? единственный способ, который я могу придумать, - это увеличить масштаб и сшить несколько изображений вместе, но это занимает много времени ...

обновление:
Мне удалось успешно экспортировать всю область, волшебным параметром является: .setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false)

это заставит Anylogic рисовать всю область, а не только видимую область.
Но это не всегда работает. Мне нужно запустить код, перемещаться по области, увеличивать / уменьшать масштаб и повторить попытку. В какой-то момент это становится действительно глючным, вероятно, потому, что он начинает рисовать все, а затем код работает. Проблема в том, что я не могу понять, что именно делать, чтобы все заработало ...

   java.awt.Component alPanel = getExperiment().getPresentation().getPanel();
getExperiment().getPresentation().getPanel().setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false);
getExperiment().getPresentation().setMaximized(false);
getExperiment().getPresentation().setPanelSize(5000, 5000);
java.awt.image.BufferedImage imageExperiment = new java.awt.image.BufferedImage(
    alPanel.getWidth(),
    alPanel.getHeight(),
    java.awt.image.BufferedImage.TYPE_INT_RGB
);

getExperiment().drawPresentation(getExperiment().getPresentation().getPanel(), imageExperiment.createGraphics(), false);
java.awt.Component component = getExperiment().getPresentation().getPanel();

  // call the Component's paint method, using
  // the Graphics object of the image.
  component.paintAll( imageExperiment.getGraphics() ); // alternately use .printAll(..)

try {
    // write the image as a PNG
    javax.imageio.ImageIO.write(
      imageExperiment,
      "png",
      new File("screenshotAnylogic.png"));
} catch(Exception e) {
    e.printStackTrace();
}

person Nikolaj Klitlund Børty    schedule 11.05.2015    source источник


Ответы (2)


Хорошо ... Итак, после долгих экспериментов я обнаружил, что «магический параметр» не был таким волшебным, как я думал. но этот фрагмент кода должен иметь возможность создавать снимок экрана, расширяющий видимую область:

public void capturePanel (ShapeGroup p, String fileName) {

        Panel argPanel = p.getPresentable().getPresentation().getPanel();
        BufferedImage capture = new BufferedImage(4000, 4000, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = capture.createGraphics();
        g.setClip( -200, -200,  4000, 4000 );
        p.draw( argPanel, g, null, true );
        g.dispose();

      try {



        ImageIO.write(capture, "png", new File(fileName));



    } catch (IOException ioe) {

        System.out.println(ioe);

    }
}
person Nikolaj Klitlund Børty    schedule 20.05.2015

Что ж, для этого в Anylogic нет встроенного метода, но вы можете попробовать использовать Java, чтобы понять это. Можно получить панель, содержащую моделирование, через getExperiment().getPresentation().getPanel(), и вы можете создать из нее изображение. Это объясняется, например, здесь, и код будет выглядеть следующим образом:

public static BufferedImage getScreenShot(Component component)
{
  BufferedImage image = new BufferedImage(
  component.getWidth(),
  component.getHeight(),
  BufferedImage.TYPE_INT_RGB
  );
  // call the Component's paint method, using
  // the Graphics object of the image.
  component.paint( image.getGraphics() ); // alternately use .printAll(..)
  return image;
}

public static void saveComponentScreenshot(Component component)
{
  try {
      // write the image as a PNG
      ImageIO.write(
        getScreenShot(component),
        "png",
        new File("screenshot.png"));
    } catch(Exception e) {
      e.printStackTrace();
    }
}

К сожалению, это не дает вам большего окна просмотра, которое вы, вероятно, хотели бы иметь. Возможно, метод public final void drawPresentation(Panel panel, java.awt.Graphics2D g, boolean publicOnly), доступный из объекта Experiment, возвращенного из getExperiment (), может помочь вам нарисовать моделирование на настраиваемой панели с требуемыми размерами. Довольно хакерский, но это все, что я могу придумать ^^

person T_D    schedule 11.05.2015
comment
ну, это помогло мне на полпути, спасибо! как вы упомянули, это не решает проблему большего порта просмотра. Я изучил ваше предложение и не могу найти объекты за пределами видимой в данный момент области. Я не знаю, где это хранит Anylogic. Итак, я смотрел на то, чтобы просто расширить текущую панель, например. 5000x5000 сделайте снимок экрана, а затем восстановите его до предыдущего размера. Но по какой-то причине я не могу установить размер больше, чем мой экран, например. высота моего экрана составляет 1050 пикселей, и установка панели большего размера не работает :-( - person Nikolaj Klitlund Børty; 12.05.2015