VTK Java项目构建和运行

news2025/1/11 23:42:51

date: 2019-04-02 10:24:00

VTK Java项目构建和运行

准备工作

本文的运行环境是Ubuntu。在自己建立的VTK build的文件夹(这里名称为VTK-bin,见前文),找到vtk.jar,这里在VTK-bin/lib下。

新建工程

使用JetBrains的IDEA新建一个工程,将样例代码(见附录A)添加到工程中的src中,

添加vtk.jar

make之后生成的VTK-bin/lib路径下的vtk.jar路径添加到Project Structure->Modules->Dependencies中。

添加库

Ubuntu中.so文件相当于windows下的.dll动态链接库文件,

make之后生成的VTK-bin/lib路径加入到环境变量中,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/[你自己的路径]/VTK-bin/lib

在IDEA中,File->Project Structure->Libraries(或者Ctrl+Shift+Alt+s),

编译运行

正常的结果如下:
Result

若出现类似vtkxxxx not loaded,如下图所示,原因在于make之后的库文件没有配置正确,导致程序无法调用。若vtk.jar文件配置错误,则程序本身语法上会报错(本文中没有出现这种情况)。

Error

程序不报错,但是一些vtk开头的库无法加载,

java.lang.UnsatisfiedLinkError: no vtkFiltersPointsJava in java.library.path

提示有类似上面的错误,

怀疑是java.library.path中缺少链接库。Ubuntu中.so文件相当于windows下的.dll动态链接库文件,将make之后生成的VTK-bin/lib路径加入到环境变量中,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/xxxx/VTK-bin/lib

在IDEA中,File->Project Structure->Libraries(或者Ctrl+Shift+Alt+s),将上面的路径添加进来,重新编译,成功运行。

注意

  • 在添加Library路径之前已经将vtk.jar路径添加到Project Structure->Modules->Dependencies中。
  • 有Windows下的文章说讲生成的.dll文件复制到JAVA_HOME/bin下[3],在Ubuntu下尝试类似做法,行不通。
  • IDEA中使用File->Create->Project from Existing Files,创建工程不生成src文件夹,按照相同的配置可能出错。

参考

[1] VTK Java Wrappinghttps://vtk.org/Wiki/VTK/Java_Wrapping#Linux

[2] Java加载dll或so库文件的路径 java.library.path.https://blog.csdn.net/daylight_1/article/details/70199452

[3] vtk-8.01的java版本环境配置.https://blog.csdn.net/sinat_23619409/article/details/85106858

参考

[1] https://www.particleincell.com/2011/vtk-java-visualization/

附录

附录A. 一个vtk java样例程序

来源

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JToggleButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import vtk.vtkNativeLibrary;
import vtk.vtkPanel;
import vtk.vtkActor;
import vtk.vtkSphere;
import vtk.vtkSphereSource;
import vtk.vtkSampleFunction;
import vtk.vtkContourFilter;
import vtk.vtkPlane;
import vtk.vtkCutter;
import vtk.vtkLookupTable;
import vtk.vtkPolyDataMapper;

/* ************************************************************
 * Demo applications showcasing how to use VTK with Java
 * 
 * Based on SimpleVTK.java example distributed with VTK
 * 
 * For more information see:
 * http://www.particleincell.com/2011/vtk-java-visualization
 * 
 * Information about VTK can be found at:
 * http://vtk.org/
 * 
 * ***********************************************************/

public class DemoJavaVTK extends JPanel implements ActionListener 
{
    private static final long serialVersionUID = 1L;
    private vtkPanel renWin;
    private vtkActor cutActor;
    private vtkActor isoActor;
	
    private JPanel buttons;
    private JToggleButton slicesButton;
    private JToggleButton isoButton;
    private JButton exitButton;

    /* Load VTK shared librarires (.dll) on startup, print message if not found */
    static 
    {				
        if (!vtkNativeLibrary.LoadAllNativeLibraries()) 
	{
	       for (vtkNativeLibrary lib : vtkNativeLibrary.values()) 
		{
                	if (!lib.IsLoaded()) 
				System.out.println(lib.GetLibraryName() + " not loaded");    
		}
			
		System.out.println("Make sure the search path is correct: ");
		System.out.println(System.getProperty("java.library.path"));
        }
        vtkNativeLibrary.DisableOutputWindow(null);
    }

    /* Constructor - generates visualization pipeline and adds actors*/
    public DemoJavaVTK() 
    {
        super(new BorderLayout()); /* large center and small border areas*/
		
        double radius = 0.8;		/*sphere radius*/
		
	/**** 1) INPUT DATA: Sphere Implicit Function ****/
	vtkSphere sphere = new vtkSphere();
	sphere.SetRadius(radius);
		
	vtkSampleFunction sample = new vtkSampleFunction();
	sample.SetSampleDimensions(50,50,50);
	sample.SetImplicitFunction(sphere);
		
	/**** 2) PIPELINE 1: Isosurface Actor ****/
		
	/* contour filter - will generate isosurfaces from 3D data*/
	vtkContourFilter contour = new vtkContourFilter();
	contour.SetInputConnection(sample.GetOutputPort());
	contour.GenerateValues(3,0,1);
		
	/* mapper, translates polygonal representation to graphics primitives */
	vtkPolyDataMapper isoMapper = new vtkPolyDataMapper();
        isoMapper.SetInputConnection(contour.GetOutputPort());
		
	/*isosurface actor*/
        isoActor = new vtkActor();
        isoActor.SetMapper(isoMapper);
	
	/**** 3) PIPELINE 2: Cutting Plane Actor ****/
		
	/* define a plane in x-y plane and passing through the origin*/
	vtkPlane plane = new vtkPlane();
	plane.SetOrigin(0,0,0);
	plane.SetNormal(0,0,1);
		
	/* cutter, basically interpolates source data onto the plane */
	vtkCutter planeCut = new vtkCutter();
	planeCut.SetInputConnection(sample.GetOutputPort());
	planeCut.SetCutFunction(plane);
	/*this will actually create 3 planes at the subspace where the implicit
	 * function evaluates to -0.7, 0, 0.7 (0 would be original plane). In 
	 * our case this will create three x-y planes passing through 
	 * z=-0.7, z=0, and z=+0.7*/
	planeCut.GenerateValues(3,-0.7,0.7);
		
	/* look up table, we want to reduce number of values to get discrete bands */
	vtkLookupTable lut = new vtkLookupTable();
	lut.SetNumberOfTableValues(5);
		
	/* mapper, using our custom LUT */
	vtkPolyDataMapper cutMapper = new vtkPolyDataMapper();
        cutMapper.SetInputConnection(planeCut.GetOutputPort());
	cutMapper.SetLookupTable(lut);
		
	/* cutting plane actor, looks much better with flat shading */
	cutActor = new vtkActor();
        cutActor.SetMapper(cutMapper);
	cutActor.GetProperty().SetInterpolationToFlat();
		
	/**** 4) PIPELINE 3: Surface Geometry Actor ****/
		
	/* create polygonal representation of a sphere */
	vtkSphereSource surf = new vtkSphereSource();
	surf.SetRadius(radius);
		
	/* another mapper*/
	vtkPolyDataMapper surfMapper = new vtkPolyDataMapper();
	surfMapper.SetInputConnection(surf.GetOutputPort());
		
	/* surface geometry actor, turn on edges and apply flat shading*/
	vtkActor surfActor = new vtkActor();
	surfActor.SetMapper(surfMapper);
	surfActor.GetProperty().EdgeVisibilityOn();
	surfActor.GetProperty().SetEdgeColor(0.2,0.2,0.2);
	surfActor.GetProperty().SetInterpolationToFlat();

	/**** 5) RENDER WINDOW ****/
		
	/* vtkPanel - this is the interface between Java and VTK */
	renWin = new vtkPanel();
		
	/* add the surface geometry plus the isosurface */
	renWin.GetRenderer().AddActor(surfActor);
	renWin.GetRenderer().AddActor(isoActor);
		
	/* the default zoom is whacky, zoom out to see the whole domain */
        renWin.GetRenderer().GetActiveCamera().Dolly(0.2); 
	renWin.GetRenderer().SetBackground(1, 1, 1);
		
	/**** 6) CREATE PANEL FOR BUTTONS ****/
	buttons  = new JPanel();
	buttons.setLayout(new GridLayout(1,0));
		
        /* isosurface button, clicked by default */
	isoButton = new JToggleButton("Isosurfaces",true);
        isoButton.addActionListener(this);
		
	/* cutting planes button */
        slicesButton = new JToggleButton("Slices");
        slicesButton.addActionListener(this);
		
	/* exit button */
	exitButton = new JButton("Exit");
        exitButton.addActionListener(this);
		
	/* add buttons to the panel */
	buttons.add(isoButton); 
	buttons.add(slicesButton);
	buttons.add(exitButton); 

	/**** 7) POPULATE MAIN PANEL ****/
        add(renWin, BorderLayout.CENTER);
        add(buttons, BorderLayout.SOUTH);	
    }

    /* ActionListener that responds to button clicks
     * Toggling iso/slices buttons results in addition or removal
     * of the corresponding actor */
    public void actionPerformed(ActionEvent e) 
    {
	/*cutting planes button, add or remove cutActor */
	if (e.getSource().equals(slicesButton))
	{
		if (slicesButton.isSelected())
			renWin.GetRenderer().AddActor(cutActor);
		else
			renWin.GetRenderer().RemoveActor(cutActor);
			
		renWin.Render();
	}
	/*isosurface button, add or remove isoActor */
	else if (e.getSource().equals(isoButton))
	{
		if (isoButton.isSelected())
			renWin.GetRenderer().AddActor(isoActor);
		else
			renWin.GetRenderer().RemoveActor(isoActor);
		renWin.Render();
	}
	/*exit button, end application */
	else if (e.getSource().equals(exitButton)) 
	{
            System.exit(0);
        }
    }

    /* main, creates a new JFrame and populates it with the DemoJavaVTK panel */
    public static void main(String s[]) 
    {
        SwingUtilities.invokeLater(new Runnable() 
	{
            @Override
            public void run() 
	    {
                JFrame frame = new JFrame("Java and VTK Demo");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().setLayout(new BorderLayout());
                frame.getContentPane().add(new DemoJavaVTK(), BorderLayout.CENTER);
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图】概念、存储结构、广度优先遍历遍历、深度优先遍历 - 详解

目录 前言 一、图 1.1、基本概念 二、图的存储结构 2.1、存储结构 2.1、邻接矩阵(考察重点) 2.1.1、代码实现 2.2、邻接表 2.3.1、无向邻接表存储 2.3.2、有向图邻接表存储 3.1、图的广度优先遍历(层序遍历) 3.2、图的…

Wails + Go 实现图形化桌面应用

效果展示 编写一个热点查看程序,包含百度热搜、微博热搜、头条、知乎等,废话不说上效果图: 效果图1: 效果图2 打包大小 涉及技术点 Golang 使用golang 1.9 编写代码 Wails vue3 使用Wails技术实现GUI渲染,页…

网络——网络协议总结

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

笔记本安装CentOS

目标: 1.利用闲置笔记本 2.省电/提高利用率/不安装图形桌面/最小化安装/附加选项:开发工具 step1:镜像下载 CentOS-7.9 163镜像 阿里云镜像 清华大学镜像 随便选一个 step2: 下载U盘系统盘制作工具Rufus U盘写入镜像/安装 step3: 安装完毕进入系统 …

2023年上半年软考学习总结(超详细)

目录 前言 一、背景1.1上次考试感受:1.2这次考试感受:1.3方法: 二、 过程2.1计算机网络概论计算机组成数据表示相关知识校验码相关知识计算机体系结构网络体系结构OSI/RM和TCP/IP计算机安全性可靠性性能评价 2.2 程序设计语言基础知识编译和解…

如何在华为OD机试中获得满分?Java实现【求最小公倍数】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

【Unity3D】广告牌特效

1 前言 广告牌特效是指:空间中的一个 2D 对象始终(或尽可能)面向相机,使得用户能够尽可能看清楚该 2D 物体。广告牌特效一共有以下 3 种: 正视广告牌:广告牌始终以正视图姿态面向相机,即广告牌…

异常检测进阶梳理1:Tabular AD视角

接触异常检测领域也有一年多的时间了,过程中遇到不少坑,知识体系也在不断更新完善,这里以专题的形式进行知识体系的梳理~ 异常检测(Anomaly Detection, AD)领域内的划分体系较多,这里基于异常检测最常用到的…

【P39】JMeter 随机顺序控制器(Random Order Controller)

文章目录 一、随机顺序控制器(Random Order Controller)参数说明二、测试计划设计2.1、测试计划一2.2、测试计划二 一、随机顺序控制器(Random Order Controller)参数说明 可以让控制器内部的组件按随机顺序执行(内部…

Alibaba Arthas学习与使用

Alibaba Arthas学习与使用 目录 下载安装卸载退出快捷键重点部分: 命令 dashboardthreadjvmsyspropsysenvvmoptiongetstaticognlscsmjadmcredefinedumpclassloadermonitorwatchtracestackttoptionsprofiler 下载安装 # 下载 curl -O https://alibaba.github.io/arthas/art…

Apache Kafka - 如何实现可靠的数据传递

文章目录 可靠的数据传递导图 可靠的数据传递 Kafka 通过以下几个方面实现可靠的数据传递: 分区副本 - Kafka 的分区有多个副本,如果某个副本失效,其他副本可以继续服务。生产者重试 - 生产者在发送消息失败时会自动重试,一直到成功发送或者达到最大重试次数。批量确认 - 生产…

云服务器和专用服务器之间的区别

在当今数字化时代,服务器是构建和支持各种应用和服务的基础设施之一。随着技术的发展和需求的增加,出现了不同类型的服务器,其中最常见的是云服务器和专用服务器。本文将详细介绍云服务器和专用服务器之间的区别,以帮助您更好地了…

SpringSecurity从入门到实战

SpringSecurity从入门到实战 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有…

【LAMP架构】

目录 一、LAMP架构1、组件作用 二、编译安装Apache httpd服务2、安装环境依赖包3、配置软件模块4、编译及安装5、优化配置文件路径,并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别6.添加httpd系统服务7.修改httpd 服务配置文件8.浏览器访问验证…

【云原生|探索 Kubernetes 系列 5】简化 Kubernetes 的部署,深入解析其工作流程

前言 大家好,我是秋意零。 在前面 4 个章节中,我们充分了解了容器技术和 Kubernes 原生时代引擎的架构和设计思想,今天分享的主要内容是,探索 Kubernetes 部署,深入解析其工作流程 👿 简介 &#x1f3e0…

[元带你学: eMMC协议详解 11] Data transfer mode 数据传输模式

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 全文2300 字, 主要介绍数据传输模式,本节数据传输模式图非常重要。数据传输模式图可以说是我查对过最频繁的图之一了。eMMC 限定了这么…

数据库基础——6.排序与分页

这篇文章来讲一下数据库的排序与分页 目录 1.排序数据 1.1排序规则 1.2 单列排序 1.3 多列排序 2.分页 2.1 背景 2.2 实现规则 2.3 拓展 1.排序数据 1.1排序规则 使用 ORDER BY 子句排序 ASC(ascend):升序 ; DESC&a…

怎么一键保存浏览器中打开的所有标签页?

2023年5月28日,周日晚上: 被这个问题困扰很久了,之前一直不知道怎么全部保存浏览器中打开的所有标签页,浪费了不少的时间,今天下午偶然发现了解决办法。 很简单,直接在浏览器里使用快捷键“CtrlShiftD” …

本周大新闻|传Meta与Magic Leap谈专利授权;PS VR2前6周出货60万台

本周XR大新闻,AR方面,苹果XR项目核心高管曝光;传Meta与Magic Leap洽谈专利授权合作;歌尔光学公布新一代AR显示模组;Lumus公布二代波导Z-Lens最新细节;JBD X-cube发布全彩Micro LED光机Hummingbird&#xff…

我用GPT写了一个关于GPT的文章,大家看看写的如何

声明:以下内容来自GPT-3.5大模型(图片除外) 目录 I. 引言 1.1 研究背景和意义 1.2 现有研究综述 II. ChatGPT技术介绍 2.1 ChatGPT技术原理 2.2 ChatGPT技术优势 III. ChatGPT技术在智能客服中的应用和挑战 3.1 ChatGPT技术在智能客…