在一次项目开发中需要将Java生成的曲线导出图片和CAD,图片已经搞定,网上查了下Java调用AutoCAD绘图的资料和demo很少,于是自己根据官网提供的VBA调用AutoCAD绘图的文档,通过Jacob实现了间接操控AutoCAD绘图。
准备:
jacob.jar、jacob-1.16-M1-x64.dll、jacob-1.16-M1-x86.dll。可自行查找下载,我用的是jacob-1.16版本的,对应Java7,两者要相互匹配,具体可参考Jacob的docs文档。
把jacob-1.16-M1-x64.dll和jacob-1.16-M1-x86.dll拷贝到C:\Windows\System32和F:\Java\jdk-7u72\bin和F:\Java\jdk-7u72\jre\bin,三个目录最好都拷一下。
下来就可以在Java里边调用AutoCAD绘图啦,先展示一下最后的绘图效果,如下:
这里面主要用到了画直线、画圆、设置颜色、线型、保存等指令,代码如下:
登录后复制
public static void main(String[] args) {
double[] startPoint = { 100.0, 100.0, 0.0 };
double[] midPoint = { 300.0, 100.0, 0.0 };
double[] endPoint = { 300.0, 300.0, 0.0 };
double[] centerPoint = { 100.0, 100.0, 0.0 };
double radius = 200.0;
String text = "你好,中国";
double[] textPoint = { 100.0, 100.0, 0.0 };
double height = 30.0;
double[] polyLine = new double[] { 100.0, 100.0, 0.0, 200.0, 200.0, 0.0, 300.0, 300.0, 0.0 };
String savePath = "D:\\test\\test1.dwg";
String lineTypePath = "D:\\test\\acadiso.lin";
JavaForCad javaForCad = new JavaForCad();
javaForCad.initCAD();
javaForCad.loadLineType(lineTypePath, LineType.DASHED, LineType.CENTER, LineType.DASHDOT, LineType.BORDER);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
javaForCad.drawLine(startPoint, midPoint, Color.BLUE, LineType.DASHED);
javaForCad.drawLine(midPoint, endPoint, Color.YELLOW, LineType.DASHDOT);
javaForCad.drawCircle(centerPoint, radius, Color.GREEN);
javaForCad.drawCircle(midPoint, radius, Color.RED, LineType.CENTER);
javaForCad.drawText(text, textPoint, height, Color.ORANGE);
javaForCad.drawPolyLine(polyLine, Color.CYAN, LineType.BORDER);
javaForCad.saveCAD(savePath);
//javaForCad.quitCAD();
javaForCad.closeCAD();
}在这里插入代码片
下面给出部分指令的实现方法,其余的大家可参考 AutoCAD ActiveX and VBA Reference自行研究,如下图,虽然是英文的,不过只要你理解了原理,用起来还是很快的,无非是VBA的指令如何通过Java实现。
CAD初始化:
登录后复制
public void initCAD() {
ComThread.InitSTA();// 开启线程
m_application = new ActiveXComponent("AutoCAD.Application");// 获取Application对象
m_application.setProperty("Visible", new Variant(true));
m_documents = m_application.getObject();
m_document = Dispatch.call(m_application, "ActiveDocument").toDispatch();
m_modelSpace = Dispatch.get(m_document, "ModelSpace").toDispatch();
}
CAD画直线,设置颜色、线型:
登录后复制
/**
* 画直线
*
* @param startPoint
* 起点坐标
* @param endPoint
* 终点坐标
* @param color
* 颜色
* @param lineType
* 线型
*/
public void drawLine(double[] startPoint, double[] endPoint, Color color, LineType lineType) {
Dispatch lineTypeObj;
if (m_lineTypesObj != null) {
try {
lineTypeObj = Dispatch.call(m_lineTypesObj, "Item", lineType.name()).toDispatch();
} catch (Exception e) {
lineTypeObj = Dispatch.call(m_lineTypesObj, "Item", LineType.BYLAYER.name()).toDispatch();
System.out.println("drawLine未加载线型:" + lineType.name());
}
Dispatch.put(m_document, "ActiveLinetype", lineTypeObj);
}
if (m_modelSpace != null) {
Dispatch lineObj = Dispatch.call(m_modelSpace, "AddLine", startPoint, endPoint).toDispatch();
lineTypeObj = Dispatch.call(m_lineTypesObj, "Item", LineType.BYLAYER.name()).toDispatch();
Dispatch.put(m_document, "ActiveLinetype", lineTypeObj);
Dispatch colorObj = Dispatch.get(lineObj, "TrueColor").toDispatch();
float[] rgbColor = new float[3];
color.getRGBColorComponents(rgbColor);
Dispatch.call(colorObj, "SetRGB", (int) rgbColor[0] * 255, (int) rgbColor[1] * 255, rgbColor[2] * 255);
Dispatch.put(lineObj, "TrueColor", colorObj);
} else {
return;
}
}
保存CAD:
登录后复制
/**
* 保存CAD
*
* @param filePath
* 保存路径
*/
public void saveCAD(String filePath) {
if (m_document != null) {
Dispatch.call(m_document, "SaveAs", filePath);
} else {
return;
}
}
关闭CAD:
登录后复制
/**
* 关闭CAD进程
*/
public void quitCAD() {
if (m_application != null) {
Dispatch.call(m_application, "Quit");
} else {
return;
}
}
结论:
简单的一个demo,主要是在Java里边实现VBA指令控制AutoCAD绘图,重点是理解其中的各种对象调用关系,前面说的文档多研究一下,包括各个对象的方法和属性,如何使用,最好能和AutoCAD对应起来,熟悉之后你会发现,用代码画CAD的效率也可以如此之高。
不得不佩服Jacob的开发者,架起了Java与Windows应用程序之间的桥梁!
注:
AutoCAD的指令很多,包括图层、布局、块、动画等比较高级的东西,楼主做的项目只用到了一些常用的指令,有兴趣的可以自行研究一下,看看都是如何通过Java来实现的。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删