Lee Mac 发表于 2022-7-6 06:45:23

注意,传递给foreach函数的符号是任意的(当然前提是它不是受保护的符号)。
考虑以下示例:
我会让你找出为什么会有额外的“5”

Bhull1985 发表于 2022-7-6 06:47:32

啊哈!
丁丁,
所以foreach语句使用一个任意赋值,Henrique称之为“a”,因为实际上它是属性,但foreach语句的工作方式是
对于attlist(属性列表)中的每个项目,执行以下功能;
 

(setq rt (vla-get-Rotation a))
(if (and (> rt (/ pi 2.)) (< rt (* pi 1.5)));; and
(progn
    (setq rt (+ pi rt))
    (vlax-put-property a 'Rotation rt)

 
简单地说,a=foreach中给出的列表中的每个项目,而不是指定的变量或受保护的符号,
但是,为了得到每个属性的旋转,并将其设置为变量“rt”,然后例程将其转换为弧度或其他值,仍然可以理解最后几行。例程如何知道如何将它们与被修改的块的属性相关联,我不确定,但这似乎就是它的行为方式,并且理解foreach是第1步、第2步或其他什么。还有一些,但进展很好。
 
谢谢李,
对于列表(1、2、3、4、5)中的每个项目(x/y/z),创建该项目。因此,在所有foreach语句上都是12345,返回最后一个值,即5,这就是为什么它被追加到末尾。
...至少我相信

Bhull1985 发表于 2022-7-6 06:49:56

为了证实和加深我的理解,

(foreach z '(1 2 3 4 5) (princ (+ z 1)))

按预期返回234566。
很好,这很有帮助,我知道有一个断开,但一旦理解了最初lsp中的“a”是如何得出的,我就很接近了。谢谢你告诉我这是一个任意值,如果我的理解正确的话,它的意思是“给定列表中的项目”

neophoible 发表于 2022-7-6 06:54:02

听起来你已经知道了。TWISI,该名称与您可能选择在函数中其他位置创建的任何变量名称一样任意,但它专门用于该子例程,即foreach,因此不需要作为局部变量列出。

marko_ribar 发表于 2022-7-6 06:59:03

事实上,“a”不是(foreach)循环的局部变量,而是它的参数。。。
例如,您可以使用此代码模拟(foreach)函数:
 

(defun _foreach ( el lst expr / n r )
(setq n -1)
(while (set el (nth (setq n (1+ n)) lst))
   (setq r (eval expr))
)
r
)

(_foreach 'a (list 1 2 3 4)
(quote
   (progn
   (if (null x) (setq x 0))
   (setq x (+ x a))
   )
)
)

 
但使用实(foreach)函数执行相同的操作更简单:
 

(foreach a (list 1 2 3 4)
(if (null x) (setq x 0))
(setq x (+ x a))
)

 
正如你所见,它只有4行。。。
 
M、 R。

Bhull1985 发表于 2022-7-6 07:00:06

是的,neophoible的反应很有趣。
让我考虑下一步使用lambdas,因为我注意到只有在lambdas中,现在foreach中才有只需要vars作为参数的子函数,
而不是使用while和repeat,这是其他循环函数。重复似乎很简单,但我需要做一些研究的时候。。。

Lee Mac 发表于 2022-7-6 07:04:59

 
对的

Bhull1985 发表于 2022-7-6 07:05:52

 
嘿,irneb,我意识到你用最后一句话很好地回答了我的问题,特别是“它取一个列表,并将该列表中的每一项放入变量you name”,如果我能够在此之前建立连接,那当然就足够了,但我认为正是李的示例帮助我准确理解了var的使用方式。感谢你们和今天早上我对你们关于属性旋转的第一句话很感兴趣。。。“基本上,您需要计算每个属性的插入点和框大小,因此在旋转它们之后,您也需要将它们彼此移开。”
那么,让我抓拍一些图片来展示它现在的表现:

有一个相同阀门的两个相互旋转180度的快速快照。你可以看到这对文本是如何成立的,但我们试图让它看起来是这样的:

如果90度旋转的每个配件都将其文本设置为270度旋转,但设置为270度旋转的阀门附带的文本将很好,如上图所示,不需要任何旋转。
 
我确实知道这些块上的插入点设置在拟合的中间,所以希望这对任何需要插入点的编码都有帮助。
早上好,干杯!

Lee Mac 发表于 2022-7-6 07:09:43

试试这个修改Brandon,
检查属性的旋转是否在90度和270度之间。在弧度中,pi=180度,因此pi/2=90度,1.5*pi=270。我来给你分一下
请注意,这些函数一次可以比较多个项目。这可用于使其更容易:
现在,在您的情况下,您希望文本始终介于180度(倒置)、270度(作为附件)和360度以下(即0-刚好在右侧向上之前)。因此,您可以使用以下测试来查看它们是否在180之前:
12

irneb 发表于 2022-7-6 07:12:00

页: 1 [2]
查看完整版本: 旋转属性问题