2012-08-01 98 views
0

用于我的问题背景,我正在使用COMSOL,一种有限元软件,您可以在不打开软件的情况下使用它运行java。因此,我试图将它与另一个用java编写并在Eclipse中运行的软件耦合。我的问题是让COMSOL生成一个图像文件,比如在我的桌面上进行2D模拟。用于导出* .txt文件的代码几乎是相同的,并且可以工作,但它不适用于图像,我想查看是否有人可以帮助我考虑在哪里查找以找出如何完成此操作。用java生成图像

我已经附上##代码片段,我想足够解释我想做什么而不会让所有人陷入困境。

import com.comsol.model.*; 
import com.comsol.model.util.*; 

/** Model exported on Jul 24 2012, 13:33 by COMSOL 4.2.1.110. */ 
public class COMSOL_Model { 

    public static Model run() { 
    Model model = ModelUtil.create("Model"); 

    //code to set up and solve the model 
    // and then at the end, you tell COMSOL what to export... 


     //this code works... 
     model.result("pg1").feature("glob1").set("data", "dset"+i); 
    model.result().export("plot1").set("filename", C:\\Users\\Alex\\Desktop\\temp_data_"+i+".txt"); 
    model.result().export("plot1").run(); 


     //this code does NOT work 
    model.result("pg2").feature("surf1").set("data", "dset"+i); 
    model.result("pg2").set("window", "window"+i); 
    model.result("pg2").run(); 
    model.result().export().create("img"+i, "Image2D"); 
    model.result("pg2").set("window", "graphics"); 
    model.result("pg2").set("windowtitle", ""); 
    model.result().export("img"+i) 
     .set("pngfilename", "C:\\Users\\Alex\\Desktop\\surface.png"); 
    model.result().export("img1").run(); 

所以我的第一个问题是,有人可以也许解释了为什么,在理论上或代码,为什么这不工作?我猜,因为我需要一个像“ImageIO.write”这样的特殊方法。任何提示或想法将不胜感激。

我试图绕过这个由COMSOL提供的代码来创建一个GUI,显示模拟的进展,然后打印,例如,在GUI上的2D/3D图像。我在一个大的'for'循环中使用了这个,其中java为每次迭代创建一个GUI和一个新的绘图。问题是,我可以让java复制框架和进度条以及GUI的所有内容,除了打印在其上的图片,我想看看是否有人有任何建议。我的一个想法是让java截图,然后裁剪图像。有什么想法吗?

以下是最有意见的代码,我认为是必要的:

import com.comsol.model.*; 
import com.comsol.model.util.*; 
import com.comsol.modelguiswing.SwingGraphicsPanel; 
import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Transparency; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.*; 


public class reuse_solver { 

//paste this into configurations 
//C:\Program Files\COMSOL\COMSOL42a\lib\win64 

private Model model; 

public static void main(String[] args) { 
    reuse_solver recycler= new reuse_solver(); 
    recycler.init(); 
    recycler.looper(); 
} 

public void looper() { 
    model = original.run(); 
    for (int iSimul = 1; iSimul<5; iSimul++){ 
      start(iSimul); 
     } 
    } 

    //this is the code to have eclipse run comsol  
private void init() { 
    ModelUtil.initStandalone(true);  
} 

private void start(int iSimul) { 

    if (iSimul==1){  
     Progress(iSimul); 
     synchronized(model){ 
      try { 
       model.wait(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      } 
    }else{ 
     Studier(iSimul); 
     Progress(iSimul); 
     synchronized(model){ 
      try { 
       model.wait(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 
} 

/this creates the GUI and then runs COMSOL, showing the progress 
private void Progress(int i){ 
    final String sol = "sol"+i; 
    final int k = i; 
    lookandfeel(); 
    final JFrame frame = new JFrame("This is an example GUI for Frying"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(1000, 730); 
    final JPanel mainPanel = new JPanel(); 
    frame.getContentPane().add(mainPanel); 
    mainPanel.setLayout(new BorderLayout()); 
    final SwingGraphicsPanel graphicsPanel = new SwingGraphicsPanel("window"+i, "Window"+i); 
    mainPanel.add(graphicsPanel, BorderLayout.CENTER); 
    SwingProgressPanel progressPanel =new SwingProgressPanel(); 
    mainPanel.add(progressPanel, BorderLayout.PAGE_END); 
    progressPanel.updateProgressLog("Starting\n"+i+"\n"); 
    ProgressWorker.setContext(new SwingDemoProgressContext(progressPanel)); 
    final int pWidth = frame.getWidth(); 
    final int pHeight = frame.getHeight(); 
    frame.setVisible(true); 

    ProgressWorker.run(new Runnable() { 
     public void run() { 
      model.sol(sol).feature().create("t1","PlotWhileSolving"); 
      model.sol(sol).runAll(); 

      exporter(k, pHeight, pWidth, frame);  

     } 

    }); 



} 

//code to help COMSOL run in a loop 
private void Studier(int i) { 
    //COMSOL code goes here  
} 

private void exporter(int i, int pHeight, int pWidth, JFrame frame) { 

      //this code will tell java to put the image in the GUI window once the simulation is done 

      model.result("pg2").feature("surf1").set("data", "dset"+i); 
    model.result("pg2").set("window", "window"+i); 
    model.result("pg2").run(); 

    // this will generate an image on my desktop, but it will not put the image that was put in the GUI 

    BufferedImage bi = new BufferedImage(pWidth,pHeight, BufferedImage.TYPE_INT_RGB); 
    Graphics g = bi.createGraphics(); 
    frame.paint(g); //this == JComponent 
    g.dispose(); 
    try{ImageIO.write(bi,"png",new File("C:\\Users\\Alex\\Desktop\\surf_"+i+".png"));}catch (Exception e) {} 

    synchronized(model){ 
     model.notify(); 
    } 
} 

private void lookandfeel() { 
    try { 
    UIManager.setLookAndFeel(
    UIManager.getSystemLookAndFeelClassName()); 
    } 
    catch (Exception e) { 
    } 
    } 
} 
+0

这是我在找的东西,但问题是这样的:http://imgur.com/vjWwT我得到java来打印顶部图像,但GUI看起来像是底部。 GUI看起来像顶部,然后出现大圆圈,然后执行for循环中的下一步并重复该过程。我需要做些什么来获得底部图像?我希望这更清楚。 – 2012-08-02 22:08:39

回答

1

ComponentImageCapture.java捕捉到一个Swing组件的图像。该代码显然在AWT组件中存在问题。

在这种情况下,使用Robot捕获图像,但只捕获组件的区域,而不是整个屏幕。

0

COMSOL使用图形窗口创建图像以便导出。当COMSOL以独立模式启动时,图形引擎不会以允许导出的方式加载。但是,通过使用客户端服务器模型从Java运行COMSOL,而不是在服务器实例上使用独立版本和启用图形,可以解决此问题。

下面是我用来从COMSOL桌面运行或直接调用java的一些代码。

public static void main(String[] args) throws IOException { 
    String tag1 = System.getProperty("cs.currentmodel"); 
    if (tag1 == null) { 
     // ModelUtil.initStandalone(true); 
     ModelUtil.connect(); 
     ModelUtil.showProgress(false); 
     model = ModelUtil.load("ModelTag", args[0]); 
     run(); 
     ModelUtil.clear(); 
     ModelUtil.disconnect(); 
     System.exit(0); 
    } 
    else { 
     model = ModelUtil.model(tag1); 
     run(); 
    } 
} 

然后你可以使用图形选项启动COMSOL服务器:

comsolserver -graphics 

这将使你的出口工作。我确信有一种方法可以在java中启动COMSOL服务器实例,但我不必为我的项目做这件事。