条件语句不工作
我对条件语句有问题。这段代码似乎做的数学正确,但它应该返回我可以用于输入的导线尺寸的最小尺寸导管。例如
命令: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
从变量名中去掉句点。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)
... 谢谢ronjonp。
我不认为经期有那么大的影响。现在可以正常工作了。
这应该只是一个快速简单的检查程序,但你是对的,关联列表也可以很好地用于此。
再次感谢,
扔出 我认为更多的是沿着使用列表的路线,而不是像罗恩琼普那样的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)))
可能是这样的:
(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)
)
谢谢BigAL,还有ronjonp。
你使用了一个简单的小程序,并用dynmode对其进行了优化。这太狡猾了。我从来没用过。
根据代码:
仅供参考,在NEC第9章中,导线仅允许填充导管内一定百分比的面积。该程序中使用的数字已经针对最大“可用”面积进行了计算。导线面积也可以根据使用的导线类型而变化。这些横截面积基于THHW型导线,并取自NEC 1993中的表格。(我们仍然有一个放在周围,表格比新版本更容易阅读)
对于这个程序,我假设每个导管包含“超过2”根导线,因此只能接受40%的填充。
再次感谢你的精彩节目。我用这个,把我的丢在路边。
很高兴你能使用它。。顺便提一下我在“l2”中发现一个错误,请再次复制上面的代码。
这些是正确的吗?
("3.5" 3.96)
("4" 5.09)
("5" 8.00) 是的,这些是正确的。
此外,列表l中的另一个快速更正
8#3我之前没有纠正,并且#1导线被列为#1/0 固定在上面。
而且你可以添加这样的内容来为你计算,具体取决于材料。。然后您可以只维护'((OD ID))的列表。
为什么两根导线的横截面积小于3或更多? 这就是代码本的方式。
来自NEC:
这也是一个好主意。这样,我可以将EMT更改为刚性,甚至柔性(金属或PVC),然后使用PVC,有不同ID的计划表40、计划表80等。
页:
[1]