明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3143|回复: 9

lisp和SCR

[复制链接]
发表于 2006-12-7 10:49:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2006-12-7 16:50:38 编辑

(defun c:huitu1()
  (setq cm (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "_.UNDO" "Group")
  (setq p (list 0 0))
  (setq ename (entnext (car (entsel "请选择要绘制的零件图所在的明细栏行:")))) 
  (repeat 2   
    (setq elist (entget ename))
    (if (= (cdr (assoc 0 elist)) "ATTRIB")
     (setq a (cdr (assoc 1 elist)))   
    )
    (setq ename (EntNext ename))
  )
  (setq f1 (strcat a ".txt"))  ;获得工程数据库文件
  (setq f1 (findfile f1))
  (setq f (open f1 "r")) 
  (setq a (read-line f ))


  (command "script" "new.scr")    ;此句在程序中没有得到执行

 
  (command "insert" a p 1 1 0)
  (setq s (ssget "x"))  ;选择插入的样本图后分解
  (command "explode" s "")
  (setq a (read-line f ))
  (setq bk a)
  (setq a (strcat "("a")"))
  (setq a (read a))
  (setq b (nth 0 a))
  (setq a (read-line f ))
  (setq a (strcat "("a")"))
  (setq a (read a))
  (setq m1 (nth 0 a))
  (setq m2 (nth 1 a))
  (setq m3 (nth 2 a))
  (setq m4 (nth 3 a))
  (setq m5 (nth 4 a))
  (command "insert" bk p "" "" "" m1 m2 m3 m4 m5)  ;插入带属性的图框
  (cond ((= b "a0") (setq p (list 999 55)))   ;当需要插入不同的图框时,把P点置为不同的坐标值
        ((= b "a1") (setq p (list 651 55)))
        ((= b "a2") (setq p (list 404 55)))
        ((= b "a3") (setq p (list 235 50)))
        ((= b "a4") (setq p (list 25 50)))
        (t nil))
  (setq a (read-line f ))
  (setq a (strcat "("a")"))
  (setq a (read a))
  (setq len (length a))
  (setq n1 1)
  (repeat len      
     (setq char-B (nth (- n1 1) a))   ;获得要替换的文字
     (setq char-A (strcat "VS" (itoa n1)))
     (reptext char-A char-B)  ;替换尺寸文本
     (prin1 char-A)
     (prin1 char-B)
     (setq n1(1+ n1))
   )
  (setq a (read-line f ))
  (setq a (strcat "("a")"))
  (setq a (read a))
  (setq b (nth 0 a))
  (while (= b "1") ;设置的判别符号,符号为1绘制明细表,否则不绘制明细表
  (setq bk "mxb")   ;插入明细表表头
  (setq p1 (list (car p) (+ (cadr p) 10)))
  (command "insert" bk p 1 1 0)
  (while (setq a (read-line f ))  ;循环插入明细表表栏,并填写相关内容
     (setq a (strcat "("a")"))
     (setq a (read a))
     (mxb a)
     (setq p1 (list (car p1) (+ 8 (cadr p1))))
   )
   )
  (command "zoom" "a") ;把图形放至最大化
  (command "script" "save.scr")
  (command "script" "close.scr")
  (command "_.UNDO" "End")
  (setvar "cmdecho" cm)
  (close f)  ;关闭数据库文件
 
  (princ)
)

这是一段根据当前总装配图绘制零件图的程序,想把零件图绘制到新建的图纸上,所以中间我尝试着加了一行执行脚本的命令,但这样做,脚本没有被执行,新绘制的零件图和总装图绘在了同一个视口上。请大家帮我看看。脚本如下:

new
...........

脚本单独执行时是正确的

发表于 2006-12-7 12:39:00 | 显示全部楼层

如果你的脚本绝对正确的话,那你就必须在new的后面加一个空行(代表回车)

 楼主| 发表于 2006-12-7 16:48:00 | 显示全部楼层

你说的是在脚本的new后加空行吗?

 我编了一个简单程序调用了一下我现有的脚本文件,执行结果就是新打开了一张空图,我看结果是对的。但不知为什么,把这句lisp语句加到主程序中就不灵了。

 程序中(command "script" "new.scr")  就没有得到执行

发表于 2006-12-8 11:47:00 | 显示全部楼层

把路径写的全一点,试试看

我一般都不用添加搜索路径的方法,容易出错,而且影响程序的运行

 

 楼主| 发表于 2006-12-9 14:51:00 | 显示全部楼层

我把方法改了,在LISP程序中调用一个打开新视图的宏,新视图已经可以打开了。但又有一个问题产生了, 原程序中(command "script" "new.scr") 后面的插入图块等绘图动作,没有在新视图中进行,仍然是绘制在了旧的视图中,该怎么样激新视图,让绘图在新视图中进行呢?

发表于 2006-12-9 16:27:00 | 显示全部楼层
Lisp程序调用script之后
其实就等於交出了掌控权
其后的执行即与它无关了
发表于 2006-12-10 17:01:00 | 显示全部楼层
在你打开图的LISP程序中另建立一个ACAD.LSP程序,其开始定义的函数名以S::STARTUP,内宾为要画的图。指定ACAD.LSP为每一个图样均加载,这样就可以在每个新图中画出你指定的图了。但在第一个程序的最后别忘了删去建立的ACAD.LSP。
 楼主| 发表于 2006-12-11 09:07:00 | 显示全部楼层
本帖最后由 作者 于 2006-12-11 9:27:40 编辑

我现在已经有了一个acad.lsp是定义图层和标注形式的,7楼的意思是不是把这两段程序合为一个acad.lsp,不再加载上面的那个程序?照这种方法试了一下,结果不行。需要说明的是,程序需要根据读入文本内,根据内容决定插入的图块。

发表于 2006-12-11 17:29:00 | 显示全部楼层

把第二段程序保存为一个单独的lisp文件如se.lsp,然后在你的new.scr中增加一句:

appload空格se.lsp空格

就可以了! 

 楼主| 发表于 2006-12-12 08:31:00 | 显示全部楼层
9楼说的第二段程序是不是指 (command "script" "new.scr")  后的那段?但两段程序中共有一个变量a,它是从第一段中根据明细栏属性取得的。程序分成两部分后,需要从程序1把变量a的内容传到程序2,我昨天想采用系统变量users1来实现a的传递,但失败了,系统变量users1只能在一段程序的内部使用,不能实现变量的外部传递。不知各位楼主可有更好的办法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-23 12:53 , Processed in 0.222823 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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