Java解码CAD:dat与dwg文件识别指南

在一次项目开发中需要将Java生成的曲线导出图片和CAD,图片已经搞定,网上查了下Java调用AutoCAD绘图的资料和demo很少,于是自己根据官网提供的VBA调用AutoCAD绘图的文档,通过Jacob实现了间接操控AutoCAD绘图。

准备

jacob.jarjacob-1.16-M1-x64.dlljacob-1.16-M1-x86.dll。可自行查找下载,我用的是jacob-1.16版本的,对应Java7,两者要相互匹配,具体可参考Jacob的docs文档。

java识别dat Java识别cad图纸_Java

java识别dat Java识别cad图纸_vba_02


把jacob-1.16-M1-x64.dll和jacob-1.16-M1-x86.dll拷贝到C:\Windows\System32F:\Java\jdk-7u72\binF:\Java\jdk-7u72\jre\bin,三个目录最好都拷一下。

下来就可以在Java里边调用AutoCAD绘图啦,先展示一下最后的绘图效果,如下:

java识别dat Java识别cad图纸_vba_03


这里面主要用到了画直线、画圆、设置颜色、线型、保存等指令,代码如下:

登录后复制

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实现。

java识别dat Java识别cad图纸_java识别dat_04


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来实现的。

               

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空