作为我的问题的背景,我正在使用COMSOL,一个有限元软件,你可以用java运行它,而不需要打开软件。正因为如此,我正在尝试将它与另一个用java编写并在Eclipse中运行的软件结合使用。我的问题是让COMSOL生成一个图像文件,比如在我的桌面上生成一个2D模拟。导出*.txt文件的代码几乎相同,并且可以工作,但它不适用于图像,我想看看是否有人可以帮助我思考在哪里查找,以找出如何实现这一点。
我附上了##代码片段,我认为这些代码足够解释我正在尝试做的事情,而不会让你们所有人陷入困境。
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) {
}
}
} 发布于 2012-08-03 07:57:32
请参见ComponentImageCapture.java以捕获Swing组件的图像。这段代码显然与AWT组件有问题。
在这种情况下,使用Robot来捕获图像,但只捕获组件的区域,而不是整个屏幕。
发布于 2015-02-18 05:16:46
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服务器实例,但我的项目并不需要这样做。
https://stackoverflow.com/questions/11757957
复制相似问题