模拟区域截图

Taking a screenshot of the simulation area

嗨,有谁知道截取模拟屏幕截图的好方法,这样您就可以指定分辨率并获得更高质量的图像? 我能想到的唯一方法是放大并将多个图像拼接在一起,但是需要很长时间...

更新:
我成功地导出了整个区域,神奇的参数是:.setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false)

它会强制 Anylogic 绘制整个区域,而不仅仅是可见区域。
但它并不总是有效。我必须 运行 代码,在该区域四处移动,缩放 in/out 并重试。在某些时候它真的会出现故障,可能是因为它开始绘制所有东西,然后代码就可以工作了。问题是我不知道该怎么做才能让它发挥作用……

   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();
}

好吧,据我所知,Anylogic 中没有针对 that.You 的内置方法,但可以尝试使用 Java 来实现这一点。可以通过 getExperiment().getPresentation().getPanel() 获取包含模拟的面板,您可以从中创建图像。例如,here 对此进行了解释,代码如下所示:

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();
    }
}

不幸的是,这并没有为您提供您可能想要的更大的视口。也许从 getExperiment() 返回的 Experiment 对象中可用的方法 public final void drawPresentation(Panel panel, java.awt.Graphics2D g, boolean publicOnly) 可以帮助您在具有所需尺寸的自定义面板上绘制模拟。相当hacky,但这就是我能想出的全部^^

好吧...经过大量实验,我发现 "magic parameter" 并不像我想象的那么神奇。 但是这段代码应该能够创建一个扩展可见区域的屏幕截图:

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);

    }
}