乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 48|回复: 19

[编程交流] ?每个顶点?

[复制链接]

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 10:54:29 | 显示全部楼层 |阅读模式
我是lisp新手,需要一些帮助。
 
我想做的是为多边形元素创建一个新顶点。我的代码有点乱,很抱歉。
 
我希望我的命令“break”在代码末尾循环通过ptCATCH变量,并在列表中的每个项目上运行该命令。
 
我认为Foreach函数可以帮我做到这一点,但我似乎无法让它工作。
 
请帮我处理一下我的每一个问题,这样我就可以了解它是如何工作的。或者,如果我偏离了基准,有人能解释一下我应该使用什么函数,并解释一下为什么我在这里使用foreach函数是错误的。
 
 
 
  1. ;;Adds a vertex to a polly line
  2. (defun c:TEST ( / )
  3. (setq object (entsel))
  4. (command "select" "l" "")
  5. (command)
  6. ;===========================================================
  7. (setq ptCATCH nil)
  8. (while
  9.    (setq ptGET (getpoint "\nPick Point for New Vertices"))
  10.    (setq ptCATCH (cons ptGET ptCATCH))
  11. )
  12. (setq ptCATCH (reverse ptCATCH))
  13. ;===========================================================
  14. (Foreach
  15.    CATCH
  16.    (ptCATCH)
  17.    ((command "break" object "f" ptCATCH "@") (command "join" "l" "p" ""))
  18. (princ)
  19. )

 
谢谢
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 10:59:21 | 显示全部楼层
这个过程有点复杂。请阅读此链接。
http://www.theswamp.org/index.php?topic=18720.0
 
还有佩蒂。
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 11:03:15 | 显示全部楼层
艾伦
 
感谢链接,我尝试了一下,每次添加一个顶点,但我的代码也是这样。
 
 
 
  1. ;;Adds a vertex to a polly line
  2. (defun c:vertex (/ object breakpoint)
  3. ;(terpri)
  4. ;(command)
  5. (setq object (entsel))
  6. (command "select" "l" "")
  7. (command)
  8. (setq breakpoint (getpoint "Pick Point for New Vertices"))
  9. (command "break" object "f" breakpoint "@")
  10. (command "join" "l" "p" "")
  11. (princ)
  12. )

 
 
 
我想做的是选择多个点,一次创建多个退伍军人。
 
了解为什么我的foreach不起作用
 
我真的不明白(foreach)的说法。在我看来,(foreach)语句在包含列表的变量上不起作用。似乎我必须为(foreach)语句提供一个书面列表,例如(列表1 2 3 4 5),而不是包含(列表1 2 3 4 5)的变量(CATCH)
 
现在我在想,我需要循环并从变量中拉出列表的各个部分,一次一个,在每个拉出的列表部分上运行我的命令。
 
 
你还提到了佩蒂特。我很熟悉pedit,但在向polly元素添加顶点时,我必须选择“下一个”,循环遍历每个现有顶点以添加新的顶点。我不想这样做,我只想选择一个点,然后bam,这是我的新顶点。我是不是忘了佩蒂的什么?
 
谢谢
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 11:04:24 | 显示全部楼层
 
存在语法错误
 
  1. (Foreach  CATCH   [b][color="red"] ([/color][/b]ptCATCH[color="Red"][b])[/b][/color]
  2. ...

 
ptCATCH已经是一个列表,因此不需要额外的括号。
否则,在本例中,AutoCAD将ptCATCH作为函数进行互操作,因为它用括号括起来。这会导致运行时错误
 
  1. ;===========================================================
  2. (setq ptCATCH nil)
  3. (while
  4.    (setq ptGET (getpoint "\nPick Point for New Vertices"))
  5.    (setq ptCATCH (cons ptGET ptCATCH))
  6. )
  7. (setq ptCATCH (reverse ptCATCH))
  8. ;===========================================================
  9. (Foreach  CATCH  ptCATCH
  10.    (princ CATCH)
  11.    (terpri)
  12.    )
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 11:08:23 | 显示全部楼层
谢谢Jammie
 
它奏效了,虽然我离成功又近了一步。
 
这就是我试图模仿的(foreach)语句示例
 
(foreach a(列表1 2 3)(普林斯(+a 5)))
 
 
如您所见,(清单1、2、3)已附呈。所以我也附上了我的。
 
但在本例中,列表是在(foreach)语句中创建的,在我的列表中,我的列表已经在前面创建的变量中,因此我不必将ptCATCH括起来,因为它已经是一个列表。(我的思考过程是否正确?)
 
 
 
 
 
foreach可以工作,但由于“l”表示拾取最后一个对象,因此挂起了“join”命令。我想我可以从这里找到答案,可能需要努力一点。
 
syntex的错误让我大吃一惊,在我看来,这一切都是正确的。
 
再次感谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:13:02 | 显示全部楼层
卡德曼,
 
命令调用不可靠-为什么不按照Alan提供的链接修改多段线?
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 11:14:04 | 显示全部楼层
 
你确实是!编写示例的另一种方法可以是
 
  1. (setq MyList (list 1 2 3))
  2. (foreach a MyList
  3. (princ (+ a 5)))

 
如果这有意义的话
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:19:46 | 显示全部楼层
罗恩代码的快速修改:
 
  1. (defun c:AddVertex ( / e p pt nLst )
  2. ;; RJP Mod by Lee Mac 2010
  3. (if (setq e
  4.        (LM:SelectifFoo
  5.          (lambda ( x )
  6.            (eq "LWPOLYLINE" (cdr (assoc 0 (entget x))))
  7.          )
  8.          "\nSelect LWPolyline: "
  9.        )
  10.      )
  11.    
  12.    (while (setq p (getpoint "\nPick New Vertex: "))
  13.      (setq pt
  14.        (vlax-curve-getPointatParam e
  15.          (fix
  16.            (vlax-curve-getParamatPoint e
  17.              (vlax-curve-getClosestPointto e
  18.                (setq p (trans p 1 0))
  19.              )
  20.            )
  21.          )
  22.        )
  23.        nLst nil
  24.      )
  25.      (mapcar
  26.        '(lambda ( x )
  27.           (setq nLst
  28.             (if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
  29.               (cons (list 10 (car p) (cadr p)) (cons x nLst))
  30.               (cons x nLst)
  31.             )
  32.           )
  33.         )
  34.        (entget e)
  35.      )
  36.      (entmod (reverse nLst))
  37.    )
  38. )
  39. (princ)
  40. )
  41. (defun LM:SelectifFoo ( foo str / sel ent )
  42. ;; © Lee Mac  ~  12.06.10
  43. (while
  44.    (progn (setq sel (entsel str))      
  45.      (cond
  46.        (
  47.          (vl-consp sel)
  48.          (if (not (foo (setq ent (car sel))))
  49.            (princ "\n** Invalid Object Selected **")
  50.          )
  51.        )
  52.      )
  53.    )
  54. )
  55. ent
  56. )
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 11:20:50 | 显示全部楼层
再举几个例子
将顶点添加到多段线
将顶点添加到多段线
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 11:24:09 | 显示全部楼层
 
 
李麦克
 
我可能最终会的,但我对(foreach)声明更感好奇,这也是我这篇文章的重点。
 
我对Lisp和编程一般来说都是新手,我正在努力钻研自己的代码,看看哪些可行,哪些不可行,以及为什么可行或不可行。(另外,我在奋斗中学到了很多,通常与我的目标无关,想想看)
 
我觉得如果给我代码,我永远也学不到代码。
 
 
你告诉我命令调用不可靠,这给了我一些启示。但我必须从我觉得舒服的地方开始,并从那里成长。
 
我复制了Alan给我的代码来学习,现在我也学会了entmod。
 
 
 
所以我不想让任何人认为我不使用给我的代码或者不停地问关于我的代码的问题是困难的,我只是在努力学习。
 
谢谢你的帮助和建议。。。我期待更多。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 11:59 , Processed in 0.507444 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表