`中微子 发表于 2023-3-12 04:32:45

刚自学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)
)

masterlong 发表于 2023-3-12 12:41:18

初学能写出来已经挺好了
别急着优化
先在程序的细节上完善一下
加上注释
代码中加上一些数据反馈
比如princ总宽
pt2的获取参数加上pt1
另外可以考虑用and
完成获取交互输入的全过程

`中微子 发表于 2023-3-31 16:33:59

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)
)

用填充确实简单多了,我加入了填充指定基点。现在可以随意框了。

还要深化把填充体放入指定图层。

xyp1964 发表于 2023-3-13 12:33:38

(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)
)

zmzk 发表于 2023-3-12 20:46:47

已经很厉害了,我还是停留在 东拼西凑基础上

lxl217114 发表于 2023-3-12 22:30:00

`中微子 发表于 2023-3-12 22:38:24

还有一个问题是,只能从左到右框,不能返着来。
返着来X长变成了负数,判断语句又要重新写一套。

masterlong 发表于 2023-3-12 22:41:00

绝对值函数ABS

wzg356 发表于 2023-3-12 22:46:06

不错了,
不断搜索例句,例程,组合,碎片化吸收最快,一知半解也无所谓,
先达到自己的目的,应付工作,及时有不完善的地方也没关系,反正自己知道使用环境嘛,

e2002 发表于 2023-3-13 09:59:01

本帖最后由 e2002 于 2023-3-13 10:08 编辑

关于交互输入的tip:
如 (getint "\n输入分格间距:") 这样的语句,参数中提示字符串,都可以通过代码生成(或者简单的不需要更改的固定值),按照规定的格式,可以提供很多常用的可选值与命令选项关键字:


(initget "A S D")
(setq iInput "\n输入整数值 : <100> ")
这种规定格式,在AutoCAD for Windows中,右键菜单会直接列出显示,用户可以直接选择需要的常用值。

tomonkey239 发表于 2023-3-15 16:18:49

大师级的了。不错。你是怎么学的?
页: [1] 2
查看完整版本: 刚自学LISP写了个小程序,请大神看看可优化一下不!