找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1549|回复: 17

[求助] [求助]:请大家看看我编写的这个Lisp有什么问题?

[复制链接]
发表于 2005-2-5 10:09:33 | 显示全部楼层 |阅读模式

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

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

×
如图所示:
首先判断线段papb、pcpd是否在同一方向;
我的方法是用angle函数;如果是则用直线命令连接pa、pd形成新线段papd,并删除线段papb和pcpd;刚刚学lisp,请大家指教;

(defun c:Link()
  (setq L1 (entsel "\n选取左边直线:"))
  (setq L2 (entsel "\n选取右边直线:"))
  (setq n1 (car L1))
  (setq n2 (car L2))
  (setq d1 (entget n1))
  (setq d2 (entget n2))
  (setq pa (cdr (assoc 10 d1)))
  (setq pb (cdr (assoc 11 d1)))
  (setq pc (cdr (assoc 10 d2)))
  (setq pd (cdr (assoc 11 d2)))
  (setq ang1 (angle pa pc))
  (setq ang2 (angle pa pd))
  (if (= ang1 ang2)
    (progn
      (command "line" pa pd "")
      (command "erase" L1 L2 "")
      )
    (alert "\n所选取的两直线不在同一直线上")
    )
  )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-2-5 10:27:31 | 显示全部楼层

Re: [求助]:请大家看看我编写的这个Lisp有什么问题?

最初由 gjt1244 发布
[B]如图所示:
首先判断线段papb、pcpd是否在同一方向;
我的方法是用angle函数;如果是则用直线命令连接pa、pd形成新线段papd,并删除线段papb和pcpd;刚刚学lisp,请大家指教;

(defun c:Link()
  (setq L1 (en... [/B]



问题比较多,首先一点缺少判断,就是你怎么会知道pa和pd就是最远点,也是说pa和pd  的距离最远!
其次,(command "erase" n1 n2 ""),而不是(command "erase" L1 L2 "")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 10:42:57 | 显示全部楼层
一 “你怎么会知道pa和pd就是最远点,也是说pa和pd 的距离最远”
      那我知道应该怎样做了。
二 “(command "erase" n1 n2 ""),而不是(command "erase" L1 L2 "")”
      entsel 返回的是一个表, 此表的第一个元素是被选取图元的图元名, 而第二个元素则是用来选取    图元的点坐标(UCS)。也就是说L1、L2是一个表,n1、n2才是图元的名称;按照我的方法是可以删除实体的,我试过了;

问题的关键我想是angle,如果我按照这样判断是否很正确的判断两线段在同一方向上?
如图:如果两线段在是水平上的,程序可以成功;否则(如上图)就显示“两直线不在同一方向上”;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 10:56:32 | 显示全部楼层
这是我好几年之前写得,跟你的想法一样,只是我增加一些判断,可能当时水平有限,凑合着用了
(DEFUN C:JL()
    (setq a1 (entsel "\n 请选择第一条线:"))
    (setq a2 (entsel "\n 请选择第二条线:"))
    (setq b1(entget (car a1)))
    (setq b2(entget (car a2)))
    (setq c1(cdr (assoc 0 b1)))
    (setq c2(cdr (assoc 0 b2)))
    (if (and (= c1 "LINE") (= c2 "LINE"))
         (progn
            (setq p1(cdr (assoc 10 b1)))
            (setq p2(cdr (assoc 11 b1)))
            (setq p3(cdr (assoc 10 b2)))
            (setq p4(cdr (assoc 11 b2)))
            (setq n1(car a1))
            (setq n2(car a2))
            (setq d1(distance p1 p2))
            (setq d2(distance p2 p3))
            (setq d3(distance p1 p3))
            (setq d4(distance p3 p4))
            (setq d5(distance p2 p4))
            (if (equal (+ d1 d2) d3 0.0001)
                (progn
                   (if (equal (+ d2 d4) d5 0.0001)
                      (progn
                         (command "line" p1 p4 "")
                         (command "erase" n1 n2 "")
                      )
                      (progn
                            (command "line" p1 p3 "")
                            (command "erase" n1 n2 "")
                      )
                    )
                 )
                 (progn
                    (if (equal (+ d2 d4) d5 0.0001)
                        (progn
                           (command "line" p2 p4 "")
                           (command "erase" n1 n2 "")
                        )
                        (progn
                               (command "line" p2 p3 "")
                               (command "erase" n1 n2 "")
                        )
                     )
                  )
             )
             )
           (prompt "\n 未选到边界线,请重新输入!!\n")
         )
   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 11:22:21 | 显示全部楼层
(equal (+ d1 d2) d3 0.0001);
我不明白其中的意思,不可以用“=”代替equal吗?还有最后那个0.0001有什么意义?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 11:47:18 | 显示全部楼层
(equal (+ d1 d2) d3 0.0001)    改成   (= (+ d1 d2) d3)
如果两条线段是水平或是竖直的,不会有问题,如果是斜的就会判断出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 13:05:30 | 显示全部楼层
看样子楼主的是用来合并直线,这样的功能没有这么简单,判断是否在一个直线,用 angle 只能判断平行,但不一定在一条直线上。CAD中的 Line 是线段,表现相同,angle 可能相差 PI,还是学学数学吧,会有更好的算法的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 13:49:44 | 显示全部楼层
搜索论坛,有判断两条直线是否共线的贴子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 13:58:10 | 显示全部楼层
感激2楼主和7楼主的指教,看来要多学学数学,但关键还是多练练lisp,刚学不久,经验缺乏,不知道什么时候用什么函数比较好!
以下是修改了2楼主的lisp,增加了用所选取线段的所在图层重新绘制新线段,最后恢复旧图层的功能!

(DEFUN C:JL()
(setq a1 (entsel "\n 请选择第一条线:"))
(setq a2 (entsel "\n 请选择第二条线:"))
(setq b1(entget (car a1)))
(setq b2(entget (car a2)))
(setq old_lay (getvar "clayer"))        ;取得当前使用的图层名称
(setq new_lay (cdr (assoc 8 b1)))        ;取得第一条线段所在的图层名称
(setq c1(cdr (assoc 0 b1)))
(setq c2(cdr (assoc 0 b2)))
(if (and (= c1 "LINE") (= c2 "LINE"))
(progn
(setq p1(cdr (assoc 10 b1)))        ;取得第一条线段的起点坐标
(setq p2(cdr (assoc 11 b1)))        ;取得第一条线段的终点坐标
(setq p3(cdr (assoc 10 b2)))        ;取得第二条线段的起点坐标
(setq p4(cdr (assoc 11 b2)))        ;取得第二条线段的终点坐标
(setq n1(car a1))
(setq n2(car a2))
(setq d1(distance p1 p2))
(setq d2(distance p2 p3))
(setq d3(distance p1 p3))
(setq d4(distance p3 p4))
(setq d5(distance p2 p4))
(if (equal (+ d1 d2) d3 0.0001)
(progn
(setvar "clayer" new_lay)        ;应用所选取线段的图层
(if (equal (+ d2 d4) d5 0.0001)
(progn
(command "line" p1 p4 "")
(command "erase" n1 n2 "")
)
(progn
(command "line" p1 p3 "")
(command "erase" n1 n2 "")
)
)
)
(progn
(setvar "clayer" new_lay)
(if (equal (+ d2 d4) d5 0.0001)
(progn
(command "line" p2 p4 "")
(command "erase" n1 n2 "")
)
(progn
(command "line" p2 p3 "")
(command "erase" n1 n2 "")
)
)
)
)
)
(prompt "\n 未选到边界线,请重新输入!!\n")
)
(setvar "clayer" old_lay)        ;恢复旧图层
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 16:37:43 | 显示全部楼层
[iframe h=600 w=100%]http://www.frontfree.net/view/article_748.html#矢量叉积[/iframe]


  1. (defun c:tt (/ e1 e2 el1 el2 sp1 ep1 sp2 ep2 intpt ptl minpt maxpt)
  2.   (if (and (setq e1 (car (entsel "\nSelect First Line: ")))
  3.            (setq e2 (car (entsel "\nSelect Second Line: ")))
  4.       )
  5.     (progn
  6.       (setq el1        (entget e1)
  7.             el2        (entget e2)
  8.       )
  9.       (setq sp1        (cdr (assoc 10 el1))
  10.             ep1        (cdr (assoc 11 el1))
  11.             sp2        (cdr (assoc 10 el2))
  12.             ep2        (cdr (assoc 11 el2))
  13.       )
  14.       (setq intpt (inters sp1 ep1 sp2 ep2 nil))
  15.       (if (not intpt)
  16.         (progn
  17.           (setq ptl (list sp1 ep1 sp2 ep2))
  18.           (setq        minpt (list (apply 'min (mapcar 'car ptl))
  19.                             (apply 'min (mapcar 'cadr ptl))
  20.                             (apply 'min (mapcar 'last ptl))
  21.                       )
  22.                 maxpt (list (apply 'max (mapcar 'car ptl))
  23.                             (apply 'max (mapcar 'cadr ptl))
  24.                             (apply 'max (mapcar 'last ptl))
  25.                       )
  26.           )
  27.           (setq        el1 (subst (cons 10 minpt)
  28.                            (assoc 10 el1)
  29.                            el1
  30.                     )
  31.                 el1 (subst (cons 11 maxpt)
  32.                            (assoc 11 el1)
  33.                            el1
  34.                     )
  35.           )
  36.           (entmod el1)
  37.           (entdel e2)
  38.         )
  39.       )
  40.     )
  41.   )
  42.   (princ)
  43. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 20:03:28 | 显示全部楼层
好东西,谢谢10楼主的分享,对以后编写lisp很有帮助!在下又编写了一个程序,不知道出了什么问题,请大家指教!不要见笑:

程序功能:选择现有的多线,提示输入新的比例,并显示更改比例后的多线;;;


(defun c:chgml()
  (
    (setq ml (entsel "\n请选择多线:"))
    (setq en_ml (entget (car ml)))
    (setq sca_list (assoc 40 en_ml))
    (setq sca (cdr sca_list))       
    (princ "\n你所选取的多线的比例S= ")(princ sca)
    (setq new_sca (getreal "请输入多线的新比例:"))       
    (setq new_sca_list (cons 40 new_sca))
    (setq en_ml (subst new_sca_list sca_list en_ml))
    (entmod en_ml)
    (entupd ml)
    (prin1)
    )
  )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 20:24:18 | 显示全部楼层
(setq intpt (inters sp1 ep1 sp2 ep2 nil))
      (if (not intpt) ...)
两共线直线有部分重合的时候,这个判断不充分

楼上的朋友注意 括号的使用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 20:56:39 | 显示全部楼层
(entupd ml) 要改成(entupd en_ml)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 21:01:34 | 显示全部楼层
更改后如下:
(defun c:chgml ()
   (setq ml (entsel "\n请选择多线:"))
    (setq en_ml (entget (car ml)))
    (setq sca_list (assoc 40 en_ml))
    (setq sca (cdr sca_list))
    (princ "\n你所选取的多线的比例S= ")
    (princ sca)
    (setq new_sca (getreal "请输入多线的新比例:"))
    (setq new_sca_list (cons 40 new_sca))
    (setq en_ml (subst new_sca_list sca_list en_ml))
    (entmod en_ml)
    (entupd ml)
    (prin1)
)

仍然不能成功,显示参数类型错误,为何?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-5 21:19:49 | 显示全部楼层
最初由 梦断江南 发布
[B](setq intpt (inters sp1 ep1 sp2 ep2 nil))
      (if (not intpt) ...)
两共线直线有部分重合的时候,这个判断不充分

楼上的朋友注意 括号的使用 [/B]

如斑竹所言,本程序是一时有兴趣临时写的,没有考虑详细。
合并直线这样点来点去的就没有多少使用价值,还是能框选的好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 21:15 , Processed in 0.278908 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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