找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 756|回复: 6

[LISP函数]:一个关于LISP的问题

[复制链接]
发表于 2003-5-24 19:14:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
在R2000+版中,CAD可以把一个LISP编写的非系统命令变为系统命令。方法是:在最后一行(princ)之前加入(vlax-add-cmd "3darray" 'c:3darray)--以3darray为例。据此,我编写了一个基于系统命令的LISP:(DEFUN C:3AR () (COMMAND "3DARRAY" "L" "" "R"))用来“三维阵列最后一个物体”。但是我奇怪的发现,只有先运行3darray命令之后,3AR命令才好使。这是为什么?怎样避免这种情况?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-25 10:37:18 | 显示全部楼层
3darray不是基本命令.要先load (在support中3darray.lsp)
(DEFUN C:3AR () (load "3darray")(c:3DARRAY))     ;不带参数

要完成你的意思(DEFUN C:3AR () (COMMAND "3DARRAY" "L" "" "R"))
应该要这样写:

  1. (DEFUN C:3AR ( / ss)(load "3darray")(setq ss(ssget "l"))(r-ARRAY))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-25 14:24:25 | 显示全部楼层
aeo,谢谢,您的办法是好使的。但是我还有一个问题:把(DEFUN C:3AR ( / ss)(load "3darray")(setq ss(ssget "l"))(r-ARRAY))与3darray放在一个LISP文件中就不好使了,这是为什么?是不是(DEFUN C:3AR ( / ss)(load "3darray")(setq ss(ssget "l"))(r-ARRAY))与3darray只有放在两个文件中,3AR命令才能及时起作用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-25 16:04:32 | 显示全部楼层
放一个文件中也行,但要先加载.
其实点菜单命令,里面也先加载的.
最简单的办法是把这句话加到acad2000doc.lsp中.
在cad的support里.
用其他软件时可能不行.要找路径的第一个acad2000doc.lsp.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-25 16:52:08 | 显示全部楼层
对不起,我还是不明白。是把(DEFUN C:3AR ( / ss)(load "3darray")(setq ss(ssget "l"))(r-ARRAY))这一句写在acad2000doc.lsp里吗?
实际情况是这样的:我有一段LISP,改线宽的。
;; This version of changing width and thickness routine depends on visual lisp support.
;; CWCT.LSP
;; Written by Qiu Feng, Zhejiang University. 2000

(if (car (atoms-family 1 '("vl-load-com")))
  (vl-load-com)
)

(defun cw_ucs_2_ent (p1 /)
  (setq p1 (strcat "*"
     (rtos (car p1) 1 20)
     ","
     (rtos (cadr p1) 1 20)
     ","
     (rtos (caddr p1) 1 20)
    )
  )
  (command "_.ucs" "_za" "*0.0,0.0,0.0" p1)
)

;; Change Width of Polyline
;; Support:
;; line, arc, circle, polyline, lightweightpolyline
(defun C:xw
       (/ i ss sslen obj pt cenpt thick width ucsicon rad entname lay)
  (setq ss (ssget))
  (if (null ss)
    (exit)
  )
  (setq i     0
sslen (sslength ss)
  )

  (if (null cw-width-save)
    (progn    ;then
      (setq width (getdist "\nNew Width:"))
      (while (null width) (setq width (getdist "\nNew Width:")))
    )
    (setq width
    (getdist (strcat "\nNew Width<" (rtos cw-width-save 2) ">:")
    )
    )
  )
  (if width
    (setq cw-width-save width)
  )
  (if (and cw-width-save (null width))
    (setq width cw-width-save)
  )

  (setvar "cmdecho" 0)
  (command "_.UNDO" "Auto" "off")
  (command "_.UNDO" "_GROUP")
  (setq ucsicon (getvar "ucsicon"))
  (setvar "ucsicon" 0)

  (while (< i (sslength ss))
    (setq entname (ssname ss i))
    (setq obj (vlax-ename->vla-object entname))

     ; change lines and arcs to polyline
    (if (or (= "AcDbLine" (vla-get-objectname obj))
     (= "AcDbArc" (vla-get-objectname obj))
)
      (progn
(setq pt (vlax-safearray->list
     (vlax-variant-value (vla-get-normal obj))
   )
)
(cw_ucs_2_ent pt)
(setq thick (vla-get-thickness obj))
(command "_.pedit" entname "Y" "")
(command "_.ucs" "_p")
(setq obj (vlax-ename->vla-object (entlast)))
(vla-put-thickness obj thick)
      )
    )

     ; change circle to polyline
    (if (= "AcDbCircle" (vla-get-objectname obj))
      (progn
(setq cenpt (vla-get-center obj)
       rad   (vla-get-radius obj)
       thick (vla-get-thickness obj)
       lay   (vla-get-layer obj)
)
(setq cenpt (vlax-safearray->list (vlax-variant-value cenpt)))
(setq pt (vlax-safearray->list
     (vlax-variant-value (vla-get-normal obj))
   )
)
(cw_ucs_2_ent pt)
(setq cenpt (trans cenpt 0 1))
(command "_.donut" (* 2 rad) (* 2 rad) "_non" cenpt "")
(vla-delete obj)
(command "_.ucs" "_p")
(setq obj (vlax-ename->vla-object (entlast)))
(vla-put-thickness obj thick)
(vla-put-layer obj lay)
      )
    )

     ; change polylines width
    (if (member (vla-get-objectname obj)
  '("AcDbPolyline" "AcDb2dPolyline")
)
      (vla-put-constantwidth obj width)
    )
    (setq i (1+ i))
  )

  (setvar "ucsicon" ucsicon)
  (setvar "cmdecho" 0)
  (command "_.UNDO" "END")
  (setvar "cmdecho" 1)
  (vlax-add-cmd "xw" 'c:xw)
  (princ)
)
我想象上个帖子中设置3AR命令一样,设置一个XWW命令。仿照您的东东,我是这样改的:(DEFUN C:XWW( / ss)(load "xw")(setq ss(ssget "l"))
但是我发现还是必需的先加载XW命令(这两个命令-XW与XWW-处于同一个LISP文件中)。
我该怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-25 17:03:14 | 显示全部楼层
看来你要稍微学一下lisp了:)
说不明白的.
上面的,你要xww最后的一个实体:
把这个文件的:
(defun C:xw
(/ i ss sslen obj pt cenpt thick width ucsicon rad entname lay)
(setq ss (ssget))
(if (null ss)
(exit)
)
其中(setq ss (ssget))改为(setq  ss(ssget "L"))
把C:xw改为C:xww
存成另一个文件.和用这个文件一样,加载,xww就是你要的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-25 17:25:31 | 显示全部楼层
对不起,我把您问烦了吧!!
谢谢您耐心的解答。回头有时间,我一定找两本LISP的书好好看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 09:48 , Processed in 0.194620 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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