我的第一个高效口齿不清
作为一名自学成才的程序员,我为这一小小的成就感到自豪。。。我将此提交给您审阅/审查/娱乐。。。。。我只是在等别人说,“你本可以用5行来完成这件事!”它是我们日常使用的标准部件。
通常直径=6,长度=15
最后,我想添加一个错误陷阱和一些条件。。。长度不能小于4,直径不能小于2.25,并应用IF。。。。但这是一个好的开始。。。对我来说,无论如何。。。
; ;
;; SIMPLE BAR EJECTOR;;
; ;
; JPLANERA ;
(defun C:EJ ()
(setq dia(getreal "\nEnter bar diameter: ")
lg (getreal "\nEnter ejector height: ")
IP (getpoint "\nSelect insertion point:")
OLDORTHO (GETVAR "ORTHOMODE")
rad (/ dia 2)
;ALL POS X VALUES
X1 (+(car ip) 0.75)
X2 (+(car ip) 1)
X3 (+(car ip) 1.125)
X4 (-(+(car ip) rad) 0.125)
X5 (+(car ip) rad)
;ALL POS Y VALUES
Y1 (cadr ip)
Y2 (+(cadr ip) 0.25)
Y3 (+(cadr ip) 8.875)
Y4 (+(cadr ip) 9)
Y5 (+(cadr ip) 9.125)
Y6 (+(cadr ip) 11)
Y7 (+(cadr ip) 11.7089)
Y8 (-(+(cadr ip) lg 9) 2.7089)
Y9 (-(+(cadr ip) lg 9) 2)
Y10(-(+(cadr ip) lg 9) 0.125)
Y11(+(cadr ip) lg 9)
;LIST GENERATOR
p1 (list X1 Y1)
p2 (list X2 Y2)
p3 (list X2 Y3)
p4 (list X3 Y4)
p5 (list X4 Y4)
p6 (list X5 Y5)
p7 (list X5 Y6)
p8 (list X4 Y7)
p9 (list X4 Y8)
p10 (list X5 Y9)
p11 (list X5 Y10)
p12 (list X4 Y11)
)
(SETVAR "ORTHOMODE" 1)
(entmake (list '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 14)
'(8 . "EJECTORS")
(cons 10 ip)
(cons 10 p1)
(cons 420.414214)
(cons 10 p2)
(cons 10 p3)
(cons 42-0.414214)
(cons 10 p4)
(cons 10 p5)
(cons 420.414214)
(cons 10 p6)
(cons 10 p7)
(cons 10 p8)
(cons 10 p9)
(cons 10 p10)
(cons 10 p11)
(cons 420.414214)
(cons 10 p12)
(list 10 (car ip) (+(cadr ip) lg 9))
'(70 . 0)))
(command "mirror" "l" "" ip "@0,1" "")
(SETVAR "ORTHOMODE" OLDORTHO)
)
恭喜!
干得好!
它看起来像是一个你击打某人的桨,他们回答:“谢谢你,先生,我可以再要一个吗?”
我希望这些有很大的需求? 只是几点建议,这只是我做事的方式,如果你的代码正常,就没有对错,不要改变它
Y1(cadr ip),然后y2(+Y1 0.25),而不是每次的cadr,对于X相同
将“osmode”设置为0是一个好习惯Autocad有时会捕捉到一个近在咫尺的对象,如果将cmdecho设置为1,则会停止命令行显示您在做什么,这只是在调试时分散了注意力而已
例如(setq OLDORTHO(GETVAR“ORTHOMODE”)oldsnap(GETVAR“osmode”)(setvar“cmdecho”1)完成后重置
大概
(setq直径3.9)
(虽然(
(setq dia(getreal“\n输入棒直径:”)
) 谢谢AL,
发布原始代码后,我返回并添加了所有必要的变量设置。我还将程序分解为两个子例程,用于不同的情况。我将进一步调整,并尝试您的建议来简化代码。WHILE语句的目的是什么?这是不是说,“只有当直径大于4时才是真实的?” “while”构成循环
祝贺你第一次编码! 您说过长度不能小于4以上,所以while is的想法是,它会不断要求输入,直到您回答4或以上,也会对其进行更改
(虽然(
(setq dia(getreal“\n输入棒直径:”);按回车键=4.0作为答案只是标准答案的捷径
(if(=直径nil)(setq dia 4.0))
) 啊,我明白了。。。我已将程序细化为包含2个子例程,因此我的主程序包含所有输入信息。因为我已经添加了第二个例程,我不需要while循环,我可以只运行第二个例程,它可以调整大小。。这是正确的程序/格式吗??
(defun C:EJ ()
(initget 7)
(setq dia(getreal "\nEnter bar diameter: "))
(if (<= 2.5 dia)
(progn
(initget 7)
(setq lg (getreal "\nEnter ejector height: "))
(initget 7)
(setq IP (getpoint "\nSelect insertion point: "))
(if (>= lg 5.5)(EJSTANDARD)(EJFLAT))
)
(progn
(alert "BAR DIAMETER MUST BE\nGREATER THAN 2.500\"")
(PRINC)
);End progn
);End if
);End defun
谢谢大家的意见。
编辑:现在我想到了。。我可以把while循环放在那里,而不是警报,用于2.500!杜 你好,JPlanera,
我个人不喜欢强迫用户点击Esc退出程序,因为这被认为是一个错误。如果用户不提供商品,我宁愿允许程序退出。
以下是我可能会如何处理提示:
(定义c:EJ(/dia lg ip)(while(and(setq dia(getdist)“\n指定棒直径:”)(<dia 2.5))(princ“\n**棒直径必须大于或等于2.5**”)(if(and dia(progn(initget 6)(setq lg(getdist”\n指定喷射器高度:”))(setq ip(getpoint“\n选择插入点:”)(if( 谢谢李。我的经验缺乏的一点是良好的错误管理,或者输入保护(如果愿意的话)。我一直在努力让我的公司为一些正式课程买单,但老实说,在你和杰夫·桑德斯的网站之间,我慢慢不需要这些课程了!!哈哈哦顺便说一句,你最近去过聊天区吗?
页:
[1]
2