说起来,其实我自己也感觉这个要求挺奇怪的,Java操作CAD,好吧,目前比较完善的类库有一个是jdwglib,但是我没找到,而且公司刚好有OpenDesign的账号,因此,需要使用Teigha来进行操作,这期间遇到了相当的问题,我在这里把他们进行一些总结。
0x01 首先要有一个Teigha
从openDesign的首页就可以看到一个FreeTrial的链接,似乎是试用版,我把它down了下来(这个是要登录才可以下载的),要选择Java版,我的系统是64位的,估计多数新的pc都是64位,因此应该使用amd64版本。
接下来就是使用了,通过system.loadLibrary加载本地的动态库,然后就可以像使用其他Java类库一样使用这些关于CAD的api了。
System.loadLibrary("TeighaJavaCore");
System.loadLibrary("TeighaJavaDwg");
然后呢?这就是第一个问题了,我们会得到一个本地库的link异常,Windows下会告诉你找不到依赖库,mac下的提示信息会说找不到一个tx文件。这是由于下载的动态库不完整的原因,有一个位置是只有登录之后才可以找到的,在这个位置可以选择各种版本以及对应的操作系统,Java版需要kernel和drawing的支持,这一点是在我们下载之前的那个页面,有一个结构图上面可以看出。
就像这样。
好了,找到了OpenDesign的会员中心,下载了相应的文件,然后再次运行,OK,依然找不到依赖库。我们应该把这些依赖库放到哪里他才能找到呢?这个和系统有关。
Windows系统放到环境变量PATH就可以了,Linux是LD_LIBRARY_PATH,至于mac,我忘了。不过有一个地方不管那个系统都能找到,就是工程的根目录,和src文件夹平级的那个,如果不怕文件多的话直接放到那里也是可以的。
到此为止,Teigha已经可以正常加载了。
0x02 然后JVM就crash了
就是这么神奇。Teigha有两个初始化方法,一个会报Error,另一个直接Crash,解决也很好解决,激活他,就会生成一个激活的java类,立即就可以解决这个问题。
我们只需要继承他的RxSystemServicesImpl这个类,然后在类的构造方法调用Global的激活方法,传入激活类的两个字段,然后通过这个新类初始化,就不会有任何问题。
0x03 那么多ERROR啊
在操作CAD文件的时候,我们会发现,这个鬼API写的简直了,就像是从其他语言生搬硬套过来的一样,按照官方给出的demo,很快我就读了一个CAD文件,结果发现,似乎只要修改他的内容就会出现OdError,这些异常都只有一个ERROR,没有任何原因的那种,呵呵呵呵。
这个时候我重新翻了下例子,才发现在safeOpenObject的时候有一个OpenMode,这个东西是什么呢?就是读取这个对象的时候,你读取的目的,把他写为write才可以set。
之前是这样读文件的,但是这样如果set的话就会有ERROR
// 读取文件
OdDbDatabase db = appServices.readFile("C:\\Users\\123\\Downloads\\architectural_example-imperial.dwg");
OdDbLayerTable layers = OdDbLayerTable.cast(db.getLayerTableId().safeOpenObject());
这样就可以了:
// 读取文件
OdDbDatabase db = appServices.readFile("C:\\Users\\123\\Downloads\\architectural_example-imperial.dwg");
OdDbLayerTable layers = OdDbLayerTable.cast(db.getLayerTableId().safeOpenObject(OpenMode.kForWrite));
OK,都做到这一步了,下面就应该去写文件了,OdDbDataBase类本身就含有写文件的方法:writeFile这个方法有一些重载,我在这里使用的是这个:
public void writeFile(String fileName, SaveType type, DwgVersion version);
分别是文件的路径(含文件名),文件类型(当然是dwg了),版本。
OdDbDataBase类本身含有一个version方法,可以返回当前版本,但是注意,你如果需要使用AutoCAD查看,而文件本身版本比较高,就需要你自己设置了。首先打印出version方法的版本,然后在DwgVersion枚举里面选一个比他低一些的版本就行,执行完毕,就可以看到在指定位置输出的新文件了。
附录
之前提到的几个Teigha的网站地址:
OpenDesign的Teigha的Java文档
OpenDesign的会员中心,下载支持库的位置,需要注册才进得去
OpenDesign库的激活地址