明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3304|回复: 20

[提问] 自动加载并运行LSP

[复制链接]
发表于 2020-4-26 21:43:05 | 显示全部楼层 |阅读模式
1、编写了1个LISP程序,程序如下。在CAD里输入tt,程序可正常运行。
(defun c:tt()
  (setq p1 (list 0 20))
  (setq p2 (list 10 100))
(command "line" p1 p2 "")
(command "zoom" "e")
(command "_qsave" "close")
  )
(c:tt)

2、在APPLOAD-启动组里将tt.lsp设置成自动加载.
3、打开CAD,出现以下情况。

或者出现:

请高手指点如何会出现这种情况,手动加载程序可正常运行。

本帖子中包含更多资源

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

x
 楼主| 发表于 2020-4-27 16:25:51 | 显示全部楼层
gaics 发表于 2020-4-26 23:36
(defun c:tt(/ p1 p2)
  (vl-load-com)
  (setq p1 (list 0 20))

经测试CAD2019可用, CAD2014会出现致命错误。再请教下:
(defun c:tt(/ p1 p2)括号里加P1 P2 和不加有什么区别?
另外,我写了一个替换图纸版本的LISP,手动加载是可以的,但自动加载后出现问题:参数类型错误:lselsetp nil
以下是程序:
(defun c:ab()
  (vl-load-com)
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "QAFLAGS" 1)
  (setq pp1 (getvar "extmax"))
  (setq pp3 (list (car pp1) 5))
  (setq p1 (polar pp3 (* PI 0.75) 16))
  (setq p2 (polar pp3 (* PI 0.75) 22))
  (setq ss (ssget "c" p1 p2))
  (setq ent (ssname ss 0))
  (setq ent_data (entget ent))
  (setq pp2 (cdr (assoc 0 ent_data)))
  (if (= pp2 "INSERT")
    (command "explode" ss "")
    )
  (setq ss (ssget "c" p1 p2))
  (setq ent (ssname ss 0))
  (setq ent_data (entget ent))
  (setq rev (cdr (assoc 1 ent_data)))
  (setq newrev (vl-string-subst "B" "A" rev 0))
  (setq ent_data (subst (cons 1 newrev) (assoc 1 ent_data) ent_data))
  (entmod ent_data)
  (setvar "osmode" osm)
  (SETVAR "QAFLAGS" 0)
  (vla-Save (vla-get-activedocument (vlax-get-acad-object)))
  (command "close")
(princ)
)
(c:ab)
发表于 2020-4-28 14:37:58 | 显示全部楼层
本帖最后由 gaics 于 2020-4-28 14:40 编辑
erlong 发表于 2020-4-28 13:58
感谢回复了这么多。我就是不知道怎么使用批处理脚本,能不能给个思路

1、在记事本里写入下面的代码保存为bat格式文件。
dir *.dwg /s /b > list.txt
2、把上面的bat文件放在要处理的dwg文件夹内,双击运行,获取所有dwg文件的地址+文件名。如下:
D:\目录\01.dwg
D:\目录\02.dwg
......
3、借助excel生成以下文本,放入记事本中保存,后缀名改为scr,即脚本文件:
open D:\目录\01.dwg ab qsave close
open D:\目录\02.dwg ab qsave close
.......
其中ab是你的lisp命令,提前加入cad启动项。去除lisp里面的保存和关闭功能,因为脚本文件已经包含。
4、CAD中运行script命令,打开scr文件,开始批处理。scr文件需要放在CAD支持搜索路径中。
发表于 2020-4-26 23:36:50 | 显示全部楼层
(defun c:tt(/ p1 p2)
  (vl-load-com)
  (setq p1 (list 0 20))
  (setq p2 (list 10 100))
  (command "line" p1 p2 "")
  (command "zoom" "e")
  (vla-Save (vla-get-activedocument (vlax-get-acad-object)))
  (command "close")
)
(c:tt)


把(command "_qsave" )改为(vla-Save (vla-get-activedocument (vlax-get-acad-object))),测试没问题。
发表于 2020-4-26 21:59:49 | 显示全部楼层
把最后一句 (c:tt) 删除
 楼主| 发表于 2020-4-26 22:17:13 | 显示全部楼层
start4444 发表于 2020-4-26 21:59
把最后一句 (c:tt) 删除

不加最后一句,不会出现问题。但是加入最后一句(c:tt)是为了程序自动加载后,能在不输入tt的情况直接执行命令,要批量做这个动作,不想每个文件都输入tt再执行命令。
发表于 2020-4-26 22:36:23 | 显示全部楼层
本帖最后由 gaics 于 2020-4-26 23:27 编辑

打开现有图纸没问题,新建图纸时有问题。

问题应该出在(command "_qsave"  "close")这里。

发表于 2020-4-26 23:09:18 | 显示全部楼层
erlong 发表于 2020-4-26 22:17
不加最后一句,不会出现问题。但是加入最后一句(c:tt)是为了程序自动加载后,能在不输入tt的情况直接执 ...

08试了放启动组没问题
发表于 2020-4-27 16:43:43 | 显示全部楼层
"一个替换图纸版本的LISP",谁有?常打不开不专业人员传的2020版cad文件,太麻烦的,
发表于 2020-4-27 17:32:58 | 显示全部楼层
erlong 发表于 2020-4-27 16:25
经测试CAD2019可用, CAD2014会出现致命错误。再请教下:
(defun c:tt(/ p1 p2)括号里加P1 P2 和不加有 ...

括号里加P1 P2 是定义局部变量。
出错是因为ss没有选到对象, 导致(ssname ss 0)出错。
(setq ss (ssget "c" p1 p2))
  (setq ent (ssname ss 0))
发表于 2020-4-27 17:35:47 | 显示全部楼层
刚好需要,谢谢啦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 05:51 , Processed in 0.188044 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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