明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1194|回复: 6

[LISP]

[复制链接]
发表于 2005-9-9 16:32 | 显示全部楼层 |阅读模式

以前在12.0下用LISP写了一个用来连接不同宽度线的小程序,但在14.0以上就提示有错误,不知有什么可解决的?

发表于 2005-9-9 20:57 | 显示全部楼层
贴代码。可能是LWPolyline的问题
 楼主| 发表于 2005-9-14 10:38 | 显示全部楼层

(defun c:npf(/ sset1 sset2)
  (defun gg(x y)
     (setq l (+ (* x x) (* y y)))
     (setq l (sqrt l))
  )
 
 (graphscr)
 (princ "first object:")
 (setq s1 (ssget))
 (princ "another object:")
 (setq s2 (ssget))
 (setq n1 (sslength s1))
 (setq n2 (sslength s2))
 (setq n (min n1 n2))
 (setq m 0)
 (while (<= m (- n 1))
 (progn
 (setq ss1 (ssname s1 m))
 (setq ss2 (ssname s2 m))
 (setq wd1 (cdr (assoc 40 (entget ss1))))
 (setq wd2 (cdr (assoc 40 (entget ss2))))
 (setq sset1 (entnext ss1))
 (setq sset2 (entnext sset1))
 (setq sset4 (entnext ss2))
 (setq sset5 (entnext sset4))
 (setq pt1 (cdr (assoc 10 (entget sset1)))
       pt2 (cdr (assoc 10 (entget sset2)))
       pt4 (cdr (assoc 10 (entget sset4)))
       pt5 (cdr (assoc 10 (entget sset5)))
 )

 (setq pt (inters pt1 pt2 pt4 pt5 nil))
 (if (< (distance pt1 pt) (distance pt2 pt))
     (entmod (subst (cons 10 pt) (cons 10 pt1) (entget sset1)))
     (entmod (subst (cons 10 pt) (cons 10 pt2) (entget sset2)))
 )
 (if (< (distance pt4 pt) (distance pt5 pt))
     (entmod (subst (cons 10 pt) (cons 10 pt4) (entget sset4)))
     (entmod (subst (cons 10 pt) (cons 10 pt5) (entget sset5)))
 )

 (if (/= wd1 wd2)
     (progn
     (setq lay (cdr (assoc 8 (entget ss1))))
     (command "layer" "m" lay "")
     (if (> wd1 wd2)
         (progn
         (if (< (distance pt1 pt) (distance pt2 pt))
             (setq ptt pt2)
             (setq ptt pt1)
         )
         (setq x1 (car pt)
               y1 (cadr pt)
               x2 (car ptt)
               y2 (cadr ptt)
         )
         (setq ll (gg (- y2 y1) (- x2 x1)))
         (setq r (/ wd1 ll))
         (setq x (+ x1 (* r (- x2 x1))))
         (setq y (+ y1 (* r (- y2 y1))))
         (setq pt3 (list x y 0.0))
         (if (< (distance pt1 pt) (distance pt2 pt))
             (entmod (subst (cons 10 pt3) (cons 10 pt) (entget sset1)))           
             (entmod (subst (cons 10 pt3) (cons 10 pt) (entget sset2)))
         )
         (command "pline" pt "w" wd2 wd2 pt3 /r)
        )
        (progn
         (if (< (distance pt4 pt) (distance pt5 pt))
             (setq ptt pt5)
             (setq ptt pt4)
         )
         (setq x1 (car pt)
               y1 (cadr pt)
               x2 (car ptt)
               y2 (cadr ptt)
         )
         (setq ll (gg (- y2 y1) (- x2 x1)))
         (setq r (/ wd2 ll))
         (setq x (+ x1 (* r (- x2 x1))))
         (setq y (+ y1 (* r (- y2 y1))))
         (setq pt3 (list x y 0.0))
         (if (< (distance pt4 pt) (distance pt5 pt))
             (entmod (subst (cons 10 pt3) (cons 10 pt) (entget sset4)))
             (entmod (subst (cons 10 pt3) (cons 10 pt) (entget sset5)))
         )
         (command "pline" pt "w" wd1 wd1 pt3 /r)
       )
 )
 )
 )
 
 (entupd ss1)
 (entupd ss2)
 (setq m (+ m 1))
 )
 "ok!"
 

)
)

 

发表于 2005-9-14 18:50 | 显示全部楼层

程序太长,又没有说明,这样看得很辛苦的,我没有仔细看。

如果只是用来“连接不同宽度线”,PEDIT里面的JOINI不是可以实现吗?

 楼主| 发表于 2005-9-15 11:32 | 显示全部楼层

四楼讲的这个方法无法实现。

烦请懂LISP的看一下,也可以拿这个程序在12.0和2000版上试。

发表于 2005-9-15 11:48 | 显示全部楼层
(command "pline" pt "w" wd2 wd2 pt3 /r) ???
 楼主| 发表于 2005-9-15 12:05 | 显示全部楼层

我执行程序后,有这样一些提示(2000版):

命令: (load"d:/lsp/npf")
C:NPF

命令: npf
first object:
选择对象: 找到 1 个

选择对象:
another object:
选择对象: 找到 1 个

选择对象:
; 错误: 参数类型错误: lentityp nil

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

本版积分规则

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

GMT+8, 2024-5-6 21:23 , Processed in 0.679798 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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