通过Jacob调用AutoCAD绘图的Demo示例

在一次项目开发中需要将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文档。
在这里插入图片描述

在这里插入图片描述
把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绘图啦,先展示一下最后的绘图效果,如下:
在这里插入图片描述
这里面主要用到了画直线、画圆、设置颜色、线型、保存等指令,代码如下:

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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyz0300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值