找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1374|回复: 7

[编程申请]:晓东你能帮我看看这个lsp吗?

[复制链接]
发表于 2002-4-24 23:46:26 | 显示全部楼层 |阅读模式

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

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

×
这个lsp我想从左到右,从上到下这个顺序依次生成所需点,得到类似阵列的结果,可无论我输入N行N列,它都得到2行N列,你能看看吗?

  1. (defun C:zh ()
  2.   (setq h (getint "\n行数:"))
  3.   (setq l (getint "\n列数:"))
  4.   (setq pt (getpoint "\n插入点:"))
  5.   (setq dy (cadr pt))
  6.   (setq dx (car pt))
  7.   (setq lst nil)
  8.   (setq sn 0)
  9.   (setq s 0)
  10.   (repeat l
  11.     (setq dxx (+ dx 2))
  12.     (setq lstdx (list dxx))
  13.     (setq lst (append lst lstdx))
  14.     (setq pt1 (list dxx dy))
  15.     (command ".point" pt1)
  16.     (setq dx dxx)
  17.   );end repeat
  18.   (while (< s h)
  19.     (setq dyy (- dy 2))
  20.     (repeat l
  21.       (setq dn sn)
  22.       (setq dxy (nth dn lst))
  23.       (setq sn (1+ sn))

  24.       (setq pt2 (list dxy dyy))

  25.       (command ".point" pt2)
  26.     )
  27.     (setq dy dyy)
  28.     (setq s (1+ s))
  29.   );end while
  30. );end dwfun C:zh
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-4-25 00:07:40 | 显示全部楼层
我粗看了一下,感觉程序的控制流程有问题,象这样的矩阵一般都是用二次嵌套循环的.还有你的程序中dx,dy是插入点pt的x,y坐标,好像这不是你希望的吧?应该用getdist来获得dx,dy的值
在已知pt和dx,dy的情况下你就可以获得每个Point的坐标了,用两次循环就可以得到你预期的结果了...
还要注意一点:坐标系转换的问题!

希望你改好后贴上来大家共享... 8-)

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

使用道具 举报

发表于 2002-4-25 00:42:10 | 显示全部楼层

  1. (defun C:ZH (/ H L PT DY SX LST SN S L DXX LSTDX PT1 DYY DN DXY PT2)
  2.   (setq H (- (getint "\n行数:") 1))
  3.   (setq L (getint "\n列数:"))
  4.   (setq PT (getpoint "\n插入点:"))
  5.   (setq DY (cadr PT))
  6.   (setq DX (car PT))
  7.   (setq LST NIL)
  8.   (setq S 0)
  9.   (repeat L
  10.     (setq DXX (+ DX 2))
  11.     (setq LSTDX (list DXX))
  12.     (setq LST (append LST LSTDX))
  13.     (setq PT1 (list DXX DY))
  14.     (command ".point" PT1)
  15.     (setq DX DXX)
  16.   );end repeat
  17.   (while (< S H)
  18.     (setq SN 0)
  19.     (repeat L
  20.       (setq DYY (- DY 2))
  21.       (setq DXY (nth SN LST))
  22.       (setq SN (1+ SN))
  23.       (setq PT2 (list DXY DYY))
  24.       (command ".point" PT2)
  25.     )
  26.     (setq DY DYY)
  27.     (setq S (1+ S))
  28.   );end while
  29. );end dwfun C:zh
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-25 01:54:24 | 显示全部楼层
<pre>
(repeat h
  ...
  (repeat l
   ....
     (command ".point" pt2)
  )
)</pre>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-25 02:07:46 | 显示全部楼层

推荐的LISP核心部分代码

已知:
  基点(左上点)BASE_PT,行数Y_num,列数X_num,X间距DX,Y间距DY


  1. (setq j 0)
  2. (repeat Y_num
  3.    (setq i 0)
  4.    (repeat X_num
  5.       (command ".point" (mapcar '+ (list (* i DX) 0 0) BASE_PT))
  6.       (setq i (1+ i))
  7.    )
  8.    (setq j (1+ j))
  9.    (setq BASE_PT (mapcar '- BASE_PT (list 0 DY 0)))
  10. )


用上面的代码,会发现很短,很高效,思路清晰。
大家应该好好看看LISP的MAPCAR函数构造表,用它俩可以减少很多代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-25 02:34:30 | 显示全部楼层
请教: 行数Y_num,列数X_num  不是表(list),也能行吗?

(foreach name list [expr...])

foreach 函数遍历表,将其中每一个元素依次赋给变量,并对每一个表达式求值。可以指定任意多个表达式。

参数

name

表中元素将被赋给该名称指定的变量。

list

由要求值的元素组成的表。

expr

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-25 03:00:41 | 显示全部楼层
最初由 梦断江南 发布
[B]请教: 行数Y_num,列数X_num  不是表(list),也能行吗?

(foreach name list [expr...])

foreach 函数遍历表,将其中每一个元素依次赋给变量,并对每一个表达式求值。可以指定任意多个表达式。

参数

n... [/B]


:)

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

使用道具 举报

发表于 2002-4-26 07:49:15 | 显示全部楼层
2维点阵列,可设增量

  1. [FONT=century gothic]
  2. (defun c:2dpt (/ pt xn yn dx dxa dy dya j i)
  3. (setq xn  (getint "\nx方向阵列数:")
  4.       yn (getint "\ny方向阵列数:")
  5.       pt (getpoint "\n起点:")
  6.       dx (getdist pt "\n x方向间距:")
  7.       dxa (getdist pt "\n x方向间距增量:")
  8.       dy (getdist pt"\n y方向间距:")
  9.       dya (getdist pt "\n y方向间距增量:")
  10.       j 0
  11.       pt2 pt)
  12. (if (not dxa)(setq dxa 0))
  13. (if (not dya)(setq dya 0))
  14. (repeat Yn
  15.    (setq i 0)
  16.    (repeat Xn
  17.       (command ".point" (mapcar '+ (list (* i (+ DX (* (1- i) dxa))) 0 0) PT2))
  18.       (setq i (1+ i)) )
  19.    (setq PT (mapcar '- pt (list 0 (+ dy (* j dya)) 0) )
  20.          pt2 pt
  21.          j (1+ j) )
  22. )
  23. )[/FONT]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-20 13:53 , Processed in 0.419105 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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