明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4424|回复: 10

[【不死猫】] Java平台远程调用Lisp的实现

  [复制链接]
发表于 2014-7-9 16:06:11 | 显示全部楼层 |阅读模式
本帖最后由 不死猫 于 2021-5-17 10:27 编辑

声明:本文由不死猫在明经通道首发,转载请注明出处和作者(也就是猫老师我啦)。
运行环境Win7x64+JRE1.5+Tomcat6+AutoCAD2006
首先我们需要准备的架包是jacob.jar
然后需要jacob-1.15-M3-x64.dll或jacob-1.15-M3-x86.dll放在JDK的bin下面和JRE的bin下面。

我们先简单用控制台程序来测试

  1. import com.jacob.activeX.ActiveXComponent;
  2. import com.jacob.com.Dispatch;
  3. import com.jacob.com.Variant;

  4. public class main {
  5.   /**
  6.    * 不死猫出品
  7.    */
  8.   public static void main(String[] args) {
  9.     // TODO 自动生成的方法存根
  10.     try {
  11.       ActiveXComponent ACAD = new ActiveXComponent("AutoCAD.Application");
  12.       ACAD.setProperty("visible",true);
  13.       //调用方法1
  14.       Dispatch VL = ACAD.invoke("GetInterfaceObject","vl.application.16").toDispatch();
  15.       Dispatch VLD = Dispatch.get(VL,"ActiveDocument").toDispatch();
  16.       Dispatch Functions = Dispatch.get(VLD,"Functions").toDispatch();
  17.       Dispatch eval = Dispatch.call(Functions,"item","eval").toDispatch();
  18.       Dispatch read = Dispatch.call(Functions,"item","read").toDispatch();
  19.       Dispatch lispcode;
  20.       lispcode = Dispatch.call(read,"funcall","(defun test()(print 123)(print 345))").toDispatch();
  21.       Dispatch.call(eval,"funcall",lispcode);
  22.       lispcode = Dispatch.call(read,"funcall","(test)").toDispatch();
  23.       Dispatch.call(eval,"funcall",lispcode);
  24.       //调用方法2
  25.       Dispatch Adoc = Dispatch.get(ACAD,"ActiveDocument").toDispatch();
  26.       Dispatch.call(Adoc, "SendCommand","(test) ");
  27.       //Dispatch retval = Dispatch.call(eval,"funcall",new Variant(lispcode)).toDispatch();
  28.       System.out.println(ACAD.getProperty("name"));
  29.     } catch (Exception e) {
  30.       // TODO: handle exception
  31.     }
  32.     //ACAD.invoke("quit");
  33.     System.out.println("ok");
  34.   }
  35. }


执行结果:
一个新的ACAD进程起动,输出我们的结果
命令:
123
345 (test)
123
345 345

然后我们用远程执行代码:
  1. package com.lisp.plot;

  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;

  8. import com.jacob.activeX.ActiveXComponent;
  9. import com.jacob.com.Dispatch;

  10. public class FileUploadServlet extends HttpServlet {
  11.   @Override
  12.   public void doGet(HttpServletRequest request, HttpServletResponse response)
  13.       throws ServletException, IOException {
  14.     PrintWriter out = response.getWriter();
  15.     out.println("<html>");//输出的内容要放在body中
  16.     out.println("<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />");
  17.     out.println("<body>");
  18.     String modeString = request.getParameter("mode");
  19.    
  20.     if (modeString.equals("draw")){
  21.       out.println("ok");
  22.       try {
  23.         ActiveXComponent ACAD = new ActiveXComponent("AutoCAD.Application");
  24.         ACAD.setProperty("visible",true);
  25.         
  26.         Dispatch VL = ACAD.invoke("GetInterfaceObject","vl.application.16").toDispatch();
  27.         Dispatch VLD = Dispatch.get(VL,"ActiveDocument").toDispatch();
  28.         Dispatch Functions = Dispatch.get(VLD,"Functions").toDispatch();
  29.         Dispatch eval = Dispatch.call(Functions,"item","eval").toDispatch();
  30.         Dispatch read = Dispatch.call(Functions,"item","read").toDispatch();
  31.         Dispatch lispcode;
  32.         lispcode = Dispatch.call(read,"funcall","(defun test()(print 123)(print 345))").toDispatch();
  33.         Dispatch.call(eval,"funcall",lispcode);
  34.         lispcode = Dispatch.call(read,"funcall","(test)").toDispatch();
  35.         Dispatch.call(eval,"funcall",lispcode);
  36.         
  37.         Dispatch Adoc = Dispatch.get(ACAD,"ActiveDocument").toDispatch();
  38.         Dispatch.call(Adoc, "SendCommand","(test) ");
  39.         //Dispatch retval = Dispatch.call(eval,"funcall",new Variant(lispcode)).toDispatch();
  40.         out.println(ACAD.getProperty("name"));
  41.       } catch (Exception e) {
  42.         // TODO: handle exception
  43.       }
  44.       //ACAD.invoke("quit");
  45.       System.out.println("ok");
  46.     }
  47.     out.println("</body>");
  48.     out.println("</html>");
  49.     out.close();
  50.   }
  51.   @Override
  52.   public void doPost(HttpServletRequest request, HttpServletResponse response)
  53.       throws ServletException, IOException {
  54.     //System.out.println("post\n");
  55.    
  56.    
  57.   }
  58. }
tomcat发布后,通过远程页面访问:
http://192.168.0.66:8080/LispPlot/upload?mode=draw
远程页面返回内容:
ok AutoCAD
此时服务器ACAD进程打开执行了Lisp程序。
CAD执行结果同上。

由于每个远程会话需要开启一个CAD进程来执行,因此多用户访问会对服务器开销产生压力。
不过Lisp也可以实现远程执行,也是比较有趣的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

阳春白雪,高大上  发表于 2014-7-9 20:28
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-7-9 16:16:28 | 显示全部楼层
本帖最后由 风树 于 2014-7-9 16:28 编辑

沙发,
怎么有种要把lisp搓圆摁扁的感觉呢


发表于 2014-7-9 18:04:33 | 显示全部楼层
猫教师,这样是不是偏离了轨道?
发表于 2014-7-9 18:04:47 | 显示全部楼层
啥都没看懂。。。。。。
发表于 2014-7-10 08:31:23 | 显示全部楼层
同没看懂,很高大上的样子。
发表于 2014-7-10 10:13:11 | 显示全部楼层
虽然什么也看不懂
但猫老师的为人师表
精湛高超的开发技术
高端大气上档次的形象
总是要支持一下的
发表于 2014-7-10 11:24:32 | 显示全部楼层
曲高和寡,路远人稀。。。
发表于 2014-7-11 08:34:53 | 显示全部楼层
玩的就是高深...
发表于 2015-6-23 10:27:50 | 显示全部楼层
本帖最后由 我爱lisp 于 2015-6-23 10:29 编辑

猫的理想远大,你懂的
猫请看:
http://www.hqew.com/tech/doc/486166.html
发表于 2015-11-13 18:36:13 | 显示全部楼层
不明觉厉啊!不明白,但是感觉很厉害的样子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 08:22 , Processed in 0.212563 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表