CHLUCFENG 发表于 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语句之后从条件语句中获取导管面积值。
 
希望这个描述有意义。也许代码可以更好地说明这一点。请让我知道我是如何搞错这段代码的。谢谢
 

(defun c:ccc (/ phse num fs gs wireArea cc) 

  (setq cc nil)

;;; conductor area

  (setq    #14  0.0206
    #12  0.0251
    #10  0.0311
    #8   0.0598
    #6   0.0819
    #4   0.1087
    #3   0.000001
    #2   0.1473
    #1   0.2027
    #1/0 0.2367
    #2/0 0.2781
    #3/0 0.3288
    #4/0 0.3904
    #250 0.4877
    #300 0.5581
    #350 0.6291
    #400 0.6969
    #500 0.8316
    #600 1.0261
    #750 1.2252
  )

;;; conduit usable area

  (setq    c0.5  0.1200
    c0.75 0.2100
    c1    0.3400
    c1.25 0.6000
    c1.5  0.8200
    c2    1.340
    c2.5  1.920
    c3    2.950
    c3.5  3.960
    c4    5.090
    c5    8.000
  )

;;; start program
  (setq phse (getint "\nEnter phase 1 or 3: "))
  (if (= phse 1)
    (setq num 3)
    ;;else
    (setq num 4)
  )
  (setq fs (getstring "\nEnter feeder size with # (pound) sign (ex:#4/0 or #250):  Feeder: "))
  (setq gs (getstring "\nEnter ground size with # (pound) sign (ex:#4/0 or #250):  Ground: "))
  (if (or (= gs "")(= gs nil))
    (setq gs nil)
  )
  (if gs
    (setq wireArea (+ (* num (eval (read fs))) (eval (read gs))))
    ;;else
    (setq wireArea (* num (eval (read fs))))
  )
  (cond    ((< wireArea c0.5)
     (setq cc c0.5)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 1/2\" conduit."
        )
     )
    )
    ((< c0.5 wireArea c0.75)
     (setq cc c0.75)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 3/4\" conduit."
        )
     )
    )
    ((< c0.75 wireArea c1)
     (setq cc c1)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 1\" conduit."
        )
     )
    )
    ((< c1 wireArea c1.25)
     (setq cc c1.25)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 1-1/4\" conduit."
        )
     )
    )
    ((< c1.25 wireArea c1.5)
     (setq cc c1.5)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 1-1/2\" conduit."
        )
     )
    )
    ((< c1.5 wireArea c2)
     (setq cc c2)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 2\" conduit."
        )
     )
    )
    ((< c2 wireArea c2.5)
     (setq cc c2.5)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 2-1/2\" conduit."
        )
     )
    )
    ((< c2.5 wireArea c3)
     (setq cc c3)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 3\" conduit."
        )
     )
    )
    ((< c3 wireArea c3.5)
     (setq cc c3.5)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 3-1/2\" conduit."
        )
     )
    )
    ((< c3.5 wireArea c4)
     (setq cc c4)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 4\" conduit."
        )
     )
    )
    ((< c4 wireArea c5)
     (setq cc c5)
     (princ    (strcat    "\nWire area "
            (rtos wireArea 2 4)
            " is < "
            (rtos cc 2 4)
            ", use 5\" conduit."
        )
     )
    )
    (t nil)
  )
  (princ)
)                    ;end defun ccc
 
 

ronjonp 发表于 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“导管。
 

;; OK
(setq        c050.1200
        c075 0.2100
        c1   0.3400
        c125 0.6000
        c150.8200
        c2   1.340
        c251.920
        c3   2.950
        c353.960
        c4   5.090
        c5   8.000
)
;; Command: !c125 0.6
;; Bad
(setq        c0.50.1200
        c0.75 0.2100
        c1    0.3400
        c1.25 0.6000
        c1.50.8200
        c2    1.340
        c2.51.920
        c3    2.950
        c3.53.960
        c4    5.090
        c5    8.000
)
;; Command: !c1.25 0.82或者如果保留这些变量,则按如下方式设置:

(setq c0.5 0.1200)
(setq c0.75 0.2100)
(setq c1 0.3400)
(setq c1.25 0.6000)
...

CHLUCFENG 发表于 2022-7-5 13:39:06

谢谢ronjonp。
 
我不认为经期有那么大的影响。现在可以正常工作了。
 
这应该只是一个快速简单的检查程序,但你是对的,关联列表也可以很好地用于此。
 
再次感谢,
扔出

BIGAL 发表于 2022-7-5 13:44:28

我认为更多的是沿着使用列表的路线,而不是像罗恩琼普那样的setq,看看这个使用李mac listboxv1-2。你可以从他的网站上获得lsp。lst2是面积,使用如下所示的第n个lst2返回正确的面积。这会将字符串的#部分保存为您的拾取列表可以将#作为字符串的一部分。我可以在列表中听到使用对,但我试图提供一个非常简单的示例。 
 




(setq lst1 (list "c0.5"  "c1.0" "c1.25"  "c1.5" "c2.0"  "c2.5"  "c3.0" "c3.5" "c4.0" "c5.0" ) )
(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))
(if (not LM:listbox)(load "listboxV1-2"))
(setq num (nth 0 (LM:listbox "pick conduit size" lst1 2)))
(alert  (strcat "You have picked " (nth num lst1) " conduit size\n\nwith an area of " (rtos (nth num lst2) 2 3)))

ronjonp 发表于 2022-7-5 13:50:14

可能是这样的:

(defun c:foo (/ keyword a b c d l l2 w x)
;; RJP » 2018-09-14
(defun keyword (key options text default / *error* def vars)
    (defun *error* (msg)
      (mapcar '(lambda (x) (setvar (car x) (cdr x))) vars)
      (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
        (princ (strcat "\nError: " msg))
      )
      (princ)
    )
    (or (setq def (getenv key)) (setq def default))
    (setq vars (mapcar '(lambda (x) (cons x (getvar x))) (list 'dynmode 'dynprompt)))
    (mapcar '(lambda (a b) (setvar (car a) b)) vars '(1 1))
    (initget options)
    (setq def
           (cond
             ((getkword        (strcat "\n" text ": [" (vl-string-translate " " "/" options) "] <" def ">:")
              )
             )
             (def)
           )
    )
    (mapcar '(lambda (x) (setvar (car x) (cdr x))) vars)
    (setenv key def)
)
(setq        l '(("#14" 0.0206)
          ("#12" 0.0251)
          ("#10" 0.0311)
          ("#8" 0.0598)
          ("#6" 0.0819)
          ("#4" 0.1087)
          ("#3" 0.000001)
          ("#2" 0.1473)
          ("#1\\0" 0.2027)
          ("#1\\0" 0.2367)
          ("#2\\0" 0.2781)
          ("#3\\0" 0.3288)
          ("#4\\0" 0.3904)
          ("#250" 0.4877)
          ("#300" 0.5581)
          ("#350" 0.6291)
          ("#400" 0.6969)
          ("#500" 0.8316)
          ("#600" 1.0261)
          ("#750" 1.2252)
          ("none" 0)
           )
)
;; These ID's seem small? http://www.alliedeg.us/pvc/rigid-conduit/ Wouldn't it be better to use (/ ID 2.) ?
(setq        l2 '(("0.5" 0.12)
             ("0.75" 0.21)
             ("1" 0.34)
             ("1.25" 0.6)
             ("1.5" 0.82)
             ("2" 1.34)
             ("2.5" 1.92)
             ("3" 2.95)
             ("3.5" 3.96)
             ("4" 5.09)
             ("5" 8.00)
          )
)
(cond        ((and (setq a (keyword "MyPipesPhase" "1 3" "Pick Phase" "1"))
              (setq b (keyword "MyPipesFeeder"
                             (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " ")) l))
                             "Pick feeder size"
                             (caar l)
                      )
              )
              (setq c (keyword "MyPipesGround"
                             (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " ")) l))
                             "Pick ground size"
                             (caar l)
                      )
              )
       )
       (setq w (+ (* (if (= a "1")
                       3
                       4
                     )
                     (cadr (assoc b l))
                  )
                  (cadr (assoc c l))
               )
       )
       (setq d (car (vl-remove-if '(lambda (x) (>= w (cadr x))) l2)))
       (alert        (strcat        "\nWire area: "
                        (rtos w 2 4)
                        " is < "
                        (rtos (cadr d) 2 4)
                        ", use "
                        (rtos (atof (car d)) 3 2)
                        "\" conduit."
                )
       )
        )
)
(princ)
)

CHLUCFENG 发表于 2022-7-5 13:54:10

谢谢BigAL,还有ronjonp。
 
你使用了一个简单的小程序,并用dynmode对其进行了优化。这太狡猾了。我从来没用过。
 
根据代码:
仅供参考,在NEC第9章中,导线仅允许填充导管内一定百分比的面积。该程序中使用的数字已经针对最大“可用”面积进行了计算。导线面积也可以根据使用的导线类型而变化。这些横截面积基于THHW型导线,并取自NEC 1993中的表格。(我们仍然有一个放在周围,表格比新版本更容易阅读)
 

 
对于这个程序,我假设每个导管包含“超过2”根导线,因此只能接受40%的填充。
 
再次感谢你的精彩节目。我用这个,把我的丢在路边。
 
 

ronjonp 发表于 2022-7-5 14:06:07

很高兴你能使用它。。顺便提一下我在“l2”中发现一个错误,请再次复制上面的代码。
 
这些是正确的吗?

             ("3.5" 3.96)
             ("4" 5.09)
             ("5" 8.00)

CHLUCFENG 发表于 2022-7-5 14:08:52

是的,这些是正确的。
 
此外,列表l中的另一个快速更正
8#3我之前没有纠正,并且#1导线被列为#1/0

ronjonp 发表于 2022-7-5 14:18:37

固定在上面。
 
而且你可以添加这样的内容来为你计算,具体取决于材料。。然后您可以只维护'((OD ID))的列表。
为什么两根导线的横截面积小于3或更多?

CHLUCFENG 发表于 2022-7-5 14:23:51

这就是代码本的方式。 
 
来自NEC:
 
 
这也是一个好主意。这样,我可以将EMT更改为刚性,甚至柔性(金属或PVC),然后使用PVC,有不同ID的计划表40、计划表80等。
页: [1]
查看完整版本: 条件语句不工作