?每个顶点?
我是lisp新手,需要一些帮助。我想做的是为多边形元素创建一个新顶点。我的代码有点乱,很抱歉。
我希望我的命令“break”在代码末尾循环通过ptCATCH变量,并在列表中的每个项目上运行该命令。
我认为Foreach函数可以帮我做到这一点,但我似乎无法让它工作。
请帮我处理一下我的每一个问题,这样我就可以了解它是如何工作的。或者,如果我偏离了基准,有人能解释一下我应该使用什么函数,并解释一下为什么我在这里使用foreach函数是错误的。
;;Adds a vertex to a polly line
(defun c:TEST ( / )
(setq object (entsel))
(command "select" "l" "")
(command)
;===========================================================
(setq ptCATCH nil)
(while
(setq ptGET (getpoint "\nPick Point for New Vertices"))
(setq ptCATCH (cons ptGET ptCATCH))
)
(setq ptCATCH (reverse ptCATCH))
;===========================================================
(Foreach
CATCH
(ptCATCH)
((command "break" object "f" ptCATCH "@") (command "join" "l" "p" ""))
(princ)
)
谢谢 这个过程有点复杂。请阅读此链接。
http://www.theswamp.org/index.php?topic=18720.0
还有佩蒂。 艾伦
感谢链接,我尝试了一下,每次添加一个顶点,但我的代码也是这样。
;;Adds a vertex to a polly line
(defun c:vertex (/ object breakpoint)
;(terpri)
;(command)
(setq object (entsel))
(command "select" "l" "")
(command)
(setq breakpoint (getpoint "Pick Point for New Vertices"))
(command "break" object "f" breakpoint "@")
(command "join" "l" "p" "")
(princ)
)
我想做的是选择多个点,一次创建多个退伍军人。
了解为什么我的foreach不起作用
我真的不明白(foreach)的说法。在我看来,(foreach)语句在包含列表的变量上不起作用。似乎我必须为(foreach)语句提供一个书面列表,例如(列表1 2 3 4 5),而不是包含(列表1 2 3 4 5)的变量(CATCH)
现在我在想,我需要循环并从变量中拉出列表的各个部分,一次一个,在每个拉出的列表部分上运行我的命令。
你还提到了佩蒂特。我很熟悉pedit,但在向polly元素添加顶点时,我必须选择“下一个”,循环遍历每个现有顶点以添加新的顶点。我不想这样做,我只想选择一个点,然后bam,这是我的新顶点。我是不是忘了佩蒂的什么?
谢谢
存在语法错误
(ForeachCATCH (ptCATCH)
...
ptCATCH已经是一个列表,因此不需要额外的括号。
否则,在本例中,AutoCAD将ptCATCH作为函数进行互操作,因为它用括号括起来。这会导致运行时错误
;===========================================================
(setq ptCATCH nil)
(while
(setq ptGET (getpoint "\nPick Point for New Vertices"))
(setq ptCATCH (cons ptGET ptCATCH))
)
(setq ptCATCH (reverse ptCATCH))
;===========================================================
(ForeachCATCHptCATCH
(princ CATCH)
(terpri)
) 谢谢Jammie
它奏效了,虽然我离成功又近了一步。
这就是我试图模仿的(foreach)语句示例
(foreach a(列表1 2 3)(普林斯(+a 5)))
如您所见,(清单1、2、3)已附呈。所以我也附上了我的。
但在本例中,列表是在(foreach)语句中创建的,在我的列表中,我的列表已经在前面创建的变量中,因此我不必将ptCATCH括起来,因为它已经是一个列表。(我的思考过程是否正确?)
foreach可以工作,但由于“l”表示拾取最后一个对象,因此挂起了“join”命令。我想我可以从这里找到答案,可能需要努力一点。
syntex的错误让我大吃一惊,在我看来,这一切都是正确的。
再次感谢 卡德曼,
命令调用不可靠-为什么不按照Alan提供的链接修改多段线?
你确实是!编写示例的另一种方法可以是
(setq MyList (list 1 2 3))
(foreach a MyList
(princ (+ a 5)))
如果这有意义的话 罗恩代码的快速修改:
(defun c:AddVertex ( / e p pt nLst )
;; RJP Mod by Lee Mac 2010
(if (setq e
(LM:SelectifFoo
(lambda ( x )
(eq "LWPOLYLINE" (cdr (assoc 0 (entget x))))
)
"\nSelect LWPolyline: "
)
)
(while (setq p (getpoint "\nPick New Vertex: "))
(setq pt
(vlax-curve-getPointatParam e
(fix
(vlax-curve-getParamatPoint e
(vlax-curve-getClosestPointto e
(setq p (trans p 1 0))
)
)
)
)
nLst nil
)
(mapcar
'(lambda ( x )
(setq nLst
(if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
(cons (list 10 (car p) (cadr p)) (cons x nLst))
(cons x nLst)
)
)
)
(entget e)
)
(entmod (reverse nLst))
)
)
(princ)
)
(defun LM:SelectifFoo ( foo str / sel ent )
;; © Lee Mac~12.06.10
(while
(progn (setq sel (entsel str))
(cond
(
(vl-consp sel)
(if (not (foo (setq ent (car sel))))
(princ "\n** Invalid Object Selected **")
)
)
)
)
)
ent
)
再举几个例子
将顶点添加到多段线
将顶点添加到多段线
李麦克
我可能最终会的,但我对(foreach)声明更感好奇,这也是我这篇文章的重点。
我对Lisp和编程一般来说都是新手,我正在努力钻研自己的代码,看看哪些可行,哪些不可行,以及为什么可行或不可行。(另外,我在奋斗中学到了很多,通常与我的目标无关,想想看)
我觉得如果给我代码,我永远也学不到代码。
你告诉我命令调用不可靠,这给了我一些启示。但我必须从我觉得舒服的地方开始,并从那里成长。
我复制了Alan给我的代码来学习,现在我也学会了entmod。
所以我不想让任何人认为我不使用给我的代码或者不停地问关于我的代码的问题是困难的,我只是在努力学习。
谢谢你的帮助和建议。。。我期待更多。
页:
[1]
2