乐筑天下

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

[编程交流] 条件语句不工作

[复制链接]

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 13:20:35 | 显示全部楼层 |阅读模式
我对条件语句有问题。这段代码似乎做的数学正确,但它应该返回我可以用于输入的导线尺寸的最小尺寸导管。
 
例如
 
命令:CCC
进入阶段1或3:1
输入带有#(磅)符号的进料器尺寸(例如:#4/0或#250):进料器:#2
输入带有#(磅)符号的地面尺寸(例如:#4/0或#250):地面:#6
 
结果:
导线面积0.5238<0.8200,使用1”导管。
 
对于0.5238的线面积,数学是正确的,但条件语句返回<0.8200(对于1-1/2”导管),并告诉我使用1”导管(应该是1-1/4”导管,因为1”导管的线面积大于0.3400,但对于1-1/4”导管小于0.6000)。
 
我将结果语句放在一个条件短语中,我认为应该评估第一个正确(真实)的响应,而忽略所有其他响应。我不理解为什么在true语句之前从条件语句中获取文本,然后在true语句之后从条件语句中获取导管面积值。
 
希望这个描述有意义。也许代码可以更好地说明这一点。请让我知道我是如何搞错这段代码的。谢谢
 
  1. (defun c:ccc (/ phse num fs gs wireArea cc) 
  2.   (setq cc nil)
  3. ;;; conductor area
  4.   (setq    #14  0.0206
  5.     #12  0.0251
  6.     #10  0.0311
  7.     #8   0.0598
  8.     #6   0.0819
  9.     #4   0.1087
  10.     #3   0.000001
  11.     #2   0.1473
  12.     #1   0.2027
  13.     #1/0 0.2367
  14.     #2/0 0.2781
  15.     #3/0 0.3288
  16.     #4/0 0.3904
  17.     #250 0.4877
  18.     #300 0.5581
  19.     #350 0.6291
  20.     #400 0.6969
  21.     #500 0.8316
  22.     #600 1.0261
  23.     #750 1.2252
  24.   )
  25. ;;; conduit usable area
  26.   (setq    c0.5  0.1200
  27.     c0.75 0.2100
  28.     c1    0.3400
  29.     c1.25 0.6000
  30.     c1.5  0.8200
  31.     c2    1.340
  32.     c2.5  1.920
  33.     c3    2.950
  34.     c3.5  3.960
  35.     c4    5.090
  36.     c5    8.000
  37.   )
  38. ;;; start program
  39.   (setq phse (getint "\nEnter phase 1 or 3: "))
  40.   (if (= phse 1)
  41.     (setq num 3)
  42.     ;;else
  43.     (setq num 4)
  44.   )
  45.   (setq fs (getstring "\nEnter feeder size with # (pound) sign (ex:#4/0 or #250):  Feeder: "))
  46.   (setq gs (getstring "\nEnter ground size with # (pound) sign (ex:#4/0 or #250):  Ground: "))
  47.   (if (or (= gs "")(= gs nil))
  48.     (setq gs nil)
  49.   )
  50.   (if gs
  51.     (setq wireArea (+ (* num (eval (read fs))) (eval (read gs))))
  52.     ;;else
  53.     (setq wireArea (* num (eval (read fs))))
  54.   )
  55.   (cond    ((< wireArea c0.5)
  56.      (setq cc c0.5)
  57.      (princ    (strcat    "\nWire area "
  58.             (rtos wireArea 2 4)
  59.             " is < "
  60.             (rtos cc 2 4)
  61.             ", use 1/2" conduit."
  62.         )
  63.      )
  64.     )
  65.     ((< c0.5 wireArea c0.75)
  66.      (setq cc c0.75)
  67.      (princ    (strcat    "\nWire area "
  68.             (rtos wireArea 2 4)
  69.             " is < "
  70.             (rtos cc 2 4)
  71.             ", use 3/4" conduit."
  72.         )
  73.      )
  74.     )
  75.     ((< c0.75 wireArea c1)
  76.      (setq cc c1)
  77.      (princ    (strcat    "\nWire area "
  78.             (rtos wireArea 2 4)
  79.             " is < "
  80.             (rtos cc 2 4)
  81.             ", use 1" conduit."
  82.         )
  83.      )
  84.     )
  85.     ((< c1 wireArea c1.25)
  86.      (setq cc c1.25)
  87.      (princ    (strcat    "\nWire area "
  88.             (rtos wireArea 2 4)
  89.             " is < "
  90.             (rtos cc 2 4)
  91.             ", use 1-1/4" conduit."
  92.         )
  93.      )
  94.     )
  95.     ((< c1.25 wireArea c1.5)
  96.      (setq cc c1.5)
  97.      (princ    (strcat    "\nWire area "
  98.             (rtos wireArea 2 4)
  99.             " is < "
  100.             (rtos cc 2 4)
  101.             ", use 1-1/2" conduit."
  102.         )
  103.      )
  104.     )
  105.     ((< c1.5 wireArea c2)
  106.      (setq cc c2)
  107.      (princ    (strcat    "\nWire area "
  108.             (rtos wireArea 2 4)
  109.             " is < "
  110.             (rtos cc 2 4)
  111.             ", use 2" conduit."
  112.         )
  113.      )
  114.     )
  115.     ((< c2 wireArea c2.5)
  116.      (setq cc c2.5)
  117.      (princ    (strcat    "\nWire area "
  118.             (rtos wireArea 2 4)
  119.             " is < "
  120.             (rtos cc 2 4)
  121.             ", use 2-1/2" conduit."
  122.         )
  123.      )
  124.     )
  125.     ((< c2.5 wireArea c3)
  126.      (setq cc c3)
  127.      (princ    (strcat    "\nWire area "
  128.             (rtos wireArea 2 4)
  129.             " is < "
  130.             (rtos cc 2 4)
  131.             ", use 3" conduit."
  132.         )
  133.      )
  134.     )
  135.     ((< c3 wireArea c3.5)
  136.      (setq cc c3.5)
  137.      (princ    (strcat    "\nWire area "
  138.             (rtos wireArea 2 4)
  139.             " is < "
  140.             (rtos cc 2 4)
  141.             ", use 3-1/2" conduit."
  142.         )
  143.      )
  144.     )
  145.     ((< c3.5 wireArea c4)
  146.      (setq cc c4)
  147.      (princ    (strcat    "\nWire area "
  148.             (rtos wireArea 2 4)
  149.             " is < "
  150.             (rtos cc 2 4)
  151.             ", use 4" conduit."
  152.         )
  153.      )
  154.     )
  155.     ((< c4 wireArea c5)
  156.      (setq cc c5)
  157.      (princ    (strcat    "\nWire area "
  158.             (rtos wireArea 2 4)
  159.             " is < "
  160.             (rtos cc 2 4)
  161.             ", use 5" conduit."
  162.         )
  163.      )
  164.     )
  165.     (t nil)
  166.   )
  167.   (princ)
  168. )                    ;end defun ccc

 
 
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 13:32:42 | 显示全部楼层
从变量名中去掉句点。FWIW关联列表可以大大简化这一过程。
命令:CCC
进入阶段1或3:1
输入带有#(磅)符号的进料器尺寸(例如:#4/0或#250):进料器:#2
输入带有#(磅)符号的地面尺寸(例如:#4/0或#250):地面:#6
导线面积0.5238<0.6000,使用1-1/4“导管。
 
  1.   ;; OK
  2.   (setq        c05  0.1200
  3.         c075 0.2100
  4.         c1   0.3400
  5.         c125 0.6000
  6.         c15  0.8200
  7.         c2   1.340
  8.         c25  1.920
  9.         c3   2.950
  10.         c35  3.960
  11.         c4   5.090
  12.         c5   8.000
  13.   )
  14.   ;; Command: !c125 0.6
  15.   ;; Bad
  16.   (setq        c0.5  0.1200
  17.         c0.75 0.2100
  18.         c1    0.3400
  19.         c1.25 0.6000
  20.         c1.5  0.8200
  21.         c2    1.340
  22.         c2.5  1.920
  23.         c3    2.950
  24.         c3.5  3.960
  25.         c4    5.090
  26.         c5    8.000
  27.   )
  28.   ;; Command: !c1.25 0.82
或者如果保留这些变量,则按如下方式设置:
  1.   (setq c0.5 0.1200)
  2.   (setq c0.75 0.2100)
  3.   (setq c1 0.3400)
  4.   (setq c1.25 0.6000)
  5.   ...
回复

举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 13:39:06 | 显示全部楼层
谢谢ronjonp。
 
我不认为经期有那么大的影响。现在可以正常工作了。
 
这应该只是一个快速简单的检查程序,但你是对的,关联列表也可以很好地用于此。
 
再次感谢,
扔出
回复

举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 13:44:28 | 显示全部楼层
我认为更多的是沿着使用列表的路线,而不是像罗恩琼普那样的setq,看看这个使用李mac listboxv1-2。你可以从他的网站上获得lsp。lst2是面积,使用如下所示的第n个lst2返回正确的面积。这会将字符串的#部分保存为您的拾取列表可以将#作为字符串的一部分。我可以在列表中听到使用对,但我试图提供一个非常简单的示例。 
 
  1. (setq lst1 (list "c0.5"  "c1.0" "c1.25"  "c1.5" "c2.0"  "c2.5"  "c3.0" "c3.5" "c4.0" "c5.0" ) )
  2. (setq lst2 (list 0.1200 0.2100 0.3400 0.6000 0.8200 1.340 1.920 2.950 3.960 5.090 8.000))
  3. (if (not LM:listbox)(load "listboxV1-2"))
  4. (setq num (nth 0 (LM:listbox "pick conduit size" lst1 2)))
  5. (alert  (strcat "You have picked " (nth num lst1) " conduit size\n\nwith an area of " (rtos (nth num lst2) 2 3)))
回复

举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 13:50:14 | 显示全部楼层
可能是这样的:
  1. (defun c:foo (/ keyword a b c d l l2 w x)
  2.   ;; RJP » 2018-09-14
  3.   (defun keyword (key options text default / *error* def vars)
  4.     (defun *error* (msg)
  5.       (mapcar '(lambda (x) (setvar (car x) (cdr x))) vars)
  6.       (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
  7.         (princ (strcat "\nError: " msg))
  8.       )
  9.       (princ)
  10.     )
  11.     (or (setq def (getenv key)) (setq def default))
  12.     (setq vars (mapcar '(lambda (x) (cons x (getvar x))) (list 'dynmode 'dynprompt)))
  13.     (mapcar '(lambda (a b) (setvar (car a) b)) vars '(1 1))
  14.     (initget options)
  15.     (setq def
  16.            (cond
  17.              ((getkword        (strcat "\n" text ": [" (vl-string-translate " " "/" options) "] <" def ">:")
  18.               )
  19.              )
  20.              (def)
  21.            )
  22.     )
  23.     (mapcar '(lambda (x) (setvar (car x) (cdr x))) vars)
  24.     (setenv key def)
  25.   )
  26.   (setq        l '(("#14" 0.0206)
  27.             ("#12" 0.0251)
  28.             ("#10" 0.0311)
  29.             ("#8" 0.0598)
  30.             ("#6" 0.0819)
  31.             ("#4" 0.1087)
  32.             ("#3" 0.000001)
  33.             ("#2" 0.1473)
  34.             ("#1\\0" 0.2027)
  35.             ("#1\\0" 0.2367)
  36.             ("#2\\0" 0.2781)
  37.             ("#3\\0" 0.3288)
  38.             ("#4\\0" 0.3904)
  39.             ("#250" 0.4877)
  40.             ("#300" 0.5581)
  41.             ("#350" 0.6291)
  42.             ("#400" 0.6969)
  43.             ("#500" 0.8316)
  44.             ("#600" 1.0261)
  45.             ("#750" 1.2252)
  46.             ("none" 0)
  47.            )
  48.   )
  49.   ;; These ID's seem small? http://www.alliedeg.us/pvc/rigid-conduit/ Wouldn't it be better to use (/ ID 2.) ?
  50.   (setq        l2 '(("0.5" 0.12)
  51.              ("0.75" 0.21)
  52.              ("1" 0.34)
  53.              ("1.25" 0.6)
  54.              ("1.5" 0.82)
  55.              ("2" 1.34)
  56.              ("2.5" 1.92)
  57.              ("3" 2.95)
  58.              ("3.5" 3.96)
  59.              ("4" 5.09)
  60.              ("5" 8.00)
  61.             )
  62.   )
  63.   (cond        ((and (setq a (keyword "MyPipesPhase" "1 3" "Pick Phase" "1"))
  64.               (setq b (keyword "MyPipesFeeder"
  65.                                (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " ")) l))
  66.                                "Pick feeder size"
  67.                                (caar l)
  68.                       )
  69.               )
  70.               (setq c (keyword "MyPipesGround"
  71.                                (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " ")) l))
  72.                                "Pick ground size"
  73.                                (caar l)
  74.                       )
  75.               )
  76.          )
  77.          (setq w (+ (* (if (= a "1")
  78.                          3
  79.                          4
  80.                        )
  81.                        (cadr (assoc b l))
  82.                     )
  83.                     (cadr (assoc c l))
  84.                  )
  85.          )
  86.          (setq d (car (vl-remove-if '(lambda (x) (>= w (cadr x))) l2)))
  87.          (alert        (strcat        "\nWire area: "
  88.                         (rtos w 2 4)
  89.                         " is < "
  90.                         (rtos (cadr d) 2 4)
  91.                         ", use "
  92.                         (rtos (atof (car d)) 3 2)
  93.                         "" conduit."
  94.                 )
  95.          )
  96.         )
  97.   )
  98.   (princ)
  99. )

142041qmz9f0u3ezu17r7r.png
回复

举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 13:54:10 | 显示全部楼层
谢谢BigAL,还有ronjonp。
 
你使用了一个简单的小程序,并用dynmode对其进行了优化。这太狡猾了。我从来没用过。
 
根据代码:
仅供参考,在NEC第9章中,导线仅允许填充导管内一定百分比的面积。该程序中使用的数字已经针对最大“可用”面积进行了计算。导线面积也可以根据使用的导线类型而变化。这些横截面积基于THHW型导线,并取自NEC 1993中的表格。(我们仍然有一个放在周围,表格比新版本更容易阅读)
 
142045n8c260cyziw6zxt2.png
 
对于这个程序,我假设每个导管包含“超过2”根导线,因此只能接受40%的填充。
 
再次感谢你的精彩节目。我用这个,把我的丢在路边。
 
 
回复

举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:06:07 | 显示全部楼层
很高兴你能使用它 142048juqbw2aasuuzw0st.png 。。顺便提一下我在“l2”中发现一个错误,请再次复制上面的代码。
 
这些是正确的吗?
  1.              ("3.5" 3.96)
  2.              ("4" 5.09)
  3.              ("5" 8.00)
回复

举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 14:08:52 | 显示全部楼层
是的,这些是正确的。
 
此外,列表l中的另一个快速更正
  1. 8
#3我之前没有纠正,并且#1导线被列为#1/0
回复

举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:18:37 | 显示全部楼层
固定在上面。
 
而且你可以添加这样的内容来为你计算,具体取决于材料。。然后您可以只维护'((OD ID))的列表。
为什么两根导线的横截面积小于3或更多?
回复

举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 14:23:51 | 显示全部楼层
这就是代码本的方式。 
 
来自NEC:
 
 
这也是一个好主意。这样,我可以将EMT更改为刚性,甚至柔性(金属或PVC),然后使用PVC,有不同ID的计划表40、计划表80等。
回复

举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 09:02 , Processed in 1.608719 second(s), 74 queries .

© 2020-2025 乐筑天下

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