NYATI 发表于 2022-7-6 10:26:48

IF和COND参数作为范围

大家好
 
我正在编写一个lisp例程,希望创建IF和COND函数,其中第一个参数是一个范围

>5.75947弧度(330°),但
>1.04718弧度(60°),但
>2.61794弧度(150°),但
>4.18870弧度(240°),但
 
我尝试了以下方法,但似乎无法奏效
 
(setq p1(cdr(assoc 10 a2)))
(setq p2(cdr(assoc 11 a2)))
(setq a3(角度p1 p2))
 
(条件
((或(>a3 1.04718)(
((或(>a3 5.75947)(
((或(>a3 2.61794)(
((或(>a3 4.18870)(
)
 

 
(如果(或(>a3 4.18870)(
)
 
正确的语法是什么?
 
提前感谢

BlackBox 发表于 2022-7-6 10:36:12

如果过滤两个以上的潜在结果,那么cond是你的朋友,否则我会使用If。
(布莱恩,你看到我刚才做的事了吗!?-斯图·格里芬)
 
看来你错过了一些父母;你在用VLIDE吗?
 
试试这个:
 

(cond
((or (> a3 1.0471) (< a3 2.09435)) (progn . . . . . . . . .))
((or (> a3 5.75947) (< a3 0.52359)) (progn . . . . . . . . .))
((or (> a3 2.61794) (< a3 3.66512)) (progn . . . . . . . . .))
((or (> a3 4.18870) (< a3 5.2358)) (progn . . . . . . . . .)))

 
 
希望这有帮助!

NYATI 发表于 2022-7-6 10:41:35

谢谢你。
 
哎呀,缺少的参数是线程中的拼写错误,但它们在程序中。我没有使用VLIDE,我是在记事本中创建的。可能应该试试VLIDE。
 
除了cond语法之外的打字错误应该可以吗?也许我需要在我的日常生活中寻找其他不工作的地方?
 
再次感谢

BlackBox 发表于 2022-7-6 10:43:13

不客气。
 
 
 
如果要使用LISP为AutoCAD编码,我强烈建议您开始使用Visual LISP集成开发环境(VLIDE)。
 
首先,在命令行中键入VLIDE,然后按enter键。点击F1按钮,您可以从开发人员文档开始。
 
 
 
不确定。我提供给您的可能是错误的,因为我不知道您在代码中还做了什么。
 
在这种情况下,最简单的方法可能是发布代码。如果你能提供一些额外的细节,说明你想做什么,这可能会有所帮助。

alanjt 发表于 2022-7-6 10:53:32

如。
(defun foo (v)
(cond
   ((< 0. v (/ pi 2.)) (alert "1"))
   ((< (/ pi 2.) v pi) (alert "2"))
   ((< pi v (* 1.5 pi)) (alert "3"))
   ((< (* pi 2.) v (* 1.5 pi)) (alert "4"))
   ((alert "NADA"))
)
)
 
我建议你用分数代替近似值。

NYATI 发表于 2022-7-6 10:54:12

高渲染
 
不用回复wordy,以下是我想要做的!!
 
我创建了两个例程,如果在可接受的公差范围内,则将线平方到当前UCS。VA.lsp用于垂直线和HA。水平线的lsp。
 
我已经测试了一段时间,现在想:
 
1.结合到一个例程,该例程“检测”是否需要运行HA或VA
2、在多条线路上运行,而不是在一条线路上运行。
3.设置公差变量,如果低于10 mm,则程序继续,但如果高于11 mm,则检查是否继续。我还没有完成,只是设置了变量。
4.如果程序结束或中途终止,则重置当前层、osmode和osnaps。
5.检查实体是否为“线”,如果不是,则警告多边形线,并移动到下一个实体和/或干净地终止程序。最终,我希望这一例行工作的保利线太多,但需要步行之前运行!!!我已经编写了耦合检查变量,但没有完成IF函数,目前是REM语句。
 
原始HA和VA包含在HaVa中,并重命名为HA2/VA2。有些行现在是REM语句,因为组合程序不需要。
 
如果您有任何想法,我们将不胜感激。
 
再次感谢您的帮助和投入。
哈瓦。lsp

BlackBox 发表于 2022-7-6 11:04:15

不客气。
 
我很感激你最初的帖子不是一个完整的定制例程的愿望清单;我可以看出你在这方面做了一些工作,这一直是值得赞赏的。
 
我现在工作很忙,但我会在可能的时候用这个帖子回来。

David Bethel 发表于 2022-7-6 11:07:47

你应该能够将过程浓缩一些:
 

(initget 7)
(setq tolerance (getreal "\nEnter acceptable tolerance > : "))

(and (setq i -1
      ss1 (ssget '((0 . "LINE"))))
    (while (setq a1 (ssname ss1 (setq i (1+ i))))
         (setq a2 (entget a1)
               p1 (cdr (assoc 10 a2))
               p2 (cdr (assoc 11 a2))
               a3 (angle p1 p2))
         (cond ((or (> 2.09435 a3 1.04718)
                      (> 5.23588 a3 4.18870))
                  (VA2))
               ((or (> 0.52359 a3 5.75947)
                      (> 3.66512 a3 2.61794))
                  (HA2)))))

 
 
-大卫

NYATI 发表于 2022-7-6 11:11:25

大卫
 
谢谢你的代码,我很抱歉延迟回复你的帖子。我会把它和我原来的套路结合起来,看看会怎么样。

NYATI 发表于 2022-7-6 11:17:44

嗨,大卫
 
我在你的代码中工作,并设法使其全部工作,只需对你的cond程序的第4行稍作修改,我不喜欢范围参数,我认为因为它跨越了零度,所以只需将参数从0°拆分为30°和330°拆分为359.9999°
 
 
(条件((或(>2.09435 a3 1.04718)
(>5.23588 a3 4.18870))
(VA2))
((或(>0.52359 a3 0.00000)
(>6.28305 a3 5.75947)
(>3.66512 a3 2.61794))
(HA2 \40705;鼁)鼁)
 
非常感谢您的投入,也感谢Renderman和Alanjt的回复。
页: [1] 2
查看完整版本: IF和COND参数作为范围