刚自学LISP写了个小程序,请大神看看可优化一下不!
本帖最后由 `中微子 于 2023-3-12 22:34 编辑本人是做装饰施工图深化的,写了个墙面材料按给定宽进行分块。看别人写的代码都很精减。
逛论坛又学了一招,加一个输入值为默认值。
;;;定义默认输入分格值函数。(20230312更新)
(defun Enter_default_value ()
(if (not spacing_a)
(setq spacing_a 1200)
)
(setq Enter_value
(getreal (strcat "\n输入要分格的间距 <初始值" (rtos spacing_a) ">")
)
)
(if (null Enter_value)
(setq Enter_value spacing_a)
(setq spacing_a Enter_value)
))
;;;自定义函数-----生成线--------
(defun Generative_line ()
(setq
Grid_line (list (cons 0 "LINE") (cons 10 line_1) (cons 11 line_2))
)
(entmake Grid_line)
)
;;;-------------主程序--------------------------
(defun c:part (/ n a pt1 pt2 pt1_x pt1_y pt2_x pt2_y spacing gap_x
average)
(setq pt1 (getpoint "\n指定起点")
pt2 (getpoint "\n指定终点")
)
;;;取得二个点的坐标
(setq pt1_x (nth 0 pt1)
pt1_y (nth 1 pt1)
pt2_x (nth 0 pt2)
pt2_y (nth 1 pt2)
)
;;;X轴总长
(setq gap_x (- pt2_x pt1_x))
;;;(setq spacing (getint "\n输入分格间距:"))一句省去直接调用分格间距函数(20230312更新)
(Enter_default_value)
(if (> gap_x spacing_a)
(progn
(setq n (fix (/ gap_x spacing_a)))
;;;第一根线X轴是总长减去N个间距再除以2
(setq average (/ (- gap_x (* spacing_a (- n 1))) 2))
(setq a 1)
(repeat n
;;;画第一根线
(if (= a 1)
(progn
(setq line_1_x (+ pt1_x average)
line_1_y pt1_y
)
(setq line_2_x line_1_x
line_2_y pt2_y
)
)
)
;;;画其它的线,X轴是输入的间距
(if (>= a 2)
(progn
(setq line_1_x (+ line_1_x spacing_a)
line_1_y pt1_y
)
(setq line_2_x line_1_x
line_2_y pt2_y
)
)
)
(setq a (+ a 1))
(setq line_1 (list line_1_x line_1_y)
line_2 (list line_2_x line_2_y)
)
;;;调入自定义函数生成线
(Generative_line)
)
)
(princ "给定长度小于分格最小值,不需要分格")
)
(princ)
)
初学能写出来已经挺好了
别急着优化
先在程序的细节上完善一下
加上注释
代码中加上一些数据反馈
比如princ总宽
pt2的获取参数加上pt1
另外可以考虑用and
完成获取交互输入的全过程 xyp1964 发表于 2023-3-13 12:33
(defun c:tt ()
(setvar "cmdecho" 0)
(if (not spacing_a)
(setq spacing_a 1200)
)
(setqEnter_value
(getreal (strcat "\n输入分板间距 <初始值"(rtos spacing_a)">")
)
)
(if (null Enter_value)
(setq Enter_value spacing_a)
(setq spacing_a Enter_value)
)
(while (and (setq pt1 (getpoint "\n指定起点: "))
(setq pt2 (getcorner pt1 "\n指定终点: "))
)
(setq pt1_x(nth 0 pt1)
pt1_y(nth 1 pt1)
pt2_x(nth 0 pt2)
)
(setq gap_x (abs (- pt1_x pt2_x)))
(setq n (rem (fix (/ gap_x spacing_a)) 2))
(if(= n 0)
(setq gap_x (+ (/ (abs (- pt1_x pt2_x)) 2) (/ spacing_a 2)))
(setq gap_x (/ (abs (- pt1_x pt2_x)) 2))
)
(if(< pt1_x pt2_x)
(setq gap (+ pt1_x gap_x))
(setq gap (+ pt2_x gap_x))
)
(setq middle (list gap pt1_y))
(command "rectang" pt1 pt2)
(setq s1 (entlast))
(command "-hatch" "p" "u" "90" spacing_a "n" "s" s1 "" "o" "s" middle "y" "")
(command "_.erase" s1 "")
)
(princ)
)
用填充确实简单多了,我加入了填充指定基点。现在可以随意框了。
还要深化把填充体放入指定图层。
(defun c:tt ()
(or dd (setq dd 1200))
(setq dd (Udist 7 "" "分格间距<输入或鼠标直接量取>" dd nil))
(while (and (setq pt1 (getpoint "\n指定起点: "))
(setq pt2 (getcorner pt1 "\n指定终点: "))
)
(command "rectang" pt1 pt2)
(setq s1 (entlast))
(command "-hatch" "p" "line" (/ dd 3.175) 90 "s" s1 "" "")
)
(princ)
) 已经很厉害了,我还是停留在 东拼西凑基础上 还有一个问题是,只能从左到右框,不能返着来。
返着来X长变成了负数,判断语句又要重新写一套。 绝对值函数ABS 不错了,
不断搜索例句,例程,组合,碎片化吸收最快,一知半解也无所谓,
先达到自己的目的,应付工作,及时有不完善的地方也没关系,反正自己知道使用环境嘛, 本帖最后由 e2002 于 2023-3-13 10:08 编辑
关于交互输入的tip:
如 (getint "\n输入分格间距:") 这样的语句,参数中提示字符串,都可以通过代码生成(或者简单的不需要更改的固定值),按照规定的格式,可以提供很多常用的可选值与命令选项关键字:
(initget "A S D")
(setq iInput "\n输入整数值 : <100> ")
这种规定格式,在AutoCAD for Windows中,右键菜单会直接列出显示,用户可以直接选择需要的常用值。 大师级的了。不错。你是怎么学的?
页:
[1]
2