明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2772|回复: 16

[讨论] 刚自学LISP写了个小程序,请大神看看可优化一下不!

  [复制链接]
发表于 2023-3-12 04:32:45 | 显示全部楼层 |阅读模式
本帖最后由 `中微子 于 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)
)

评分

参与人数 2明经币 +1 金钱 +25 收起 理由
bssurvey + 1 赞一个!
zml84 + 25 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-3-12 12:41:18 | 显示全部楼层
初学能写出来已经挺好了
别急着优化
先在程序的细节上完善一下
加上注释
代码中加上一些数据反馈
比如princ总宽
pt2的获取参数加上pt1
另外可以考虑用and
完成获取交互输入的全过程
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-31 16:33:59 | 显示全部楼层

  1. (defun c:tt ()
  2.   (setvar "cmdecho" 0)
  3.   (if (not spacing_a)
  4.     (setq spacing_a 1200)
  5.   )
  6.   (setq  Enter_value
  7.    (getreal (strcat "\n输入分板间距 <初始值"(rtos spacing_a)">")
  8.    )
  9.   )
  10.   (if (null Enter_value)
  11.     (setq Enter_value spacing_a)
  12.     (setq spacing_a Enter_value)
  13.   )
  14.   (while (and (setq pt1 (getpoint "\n指定起点: "))
  15.         (setq pt2 (getcorner pt1 "\n指定终点: "))
  16.    )
  17.     (setq pt1_x  (nth 0 pt1)
  18.     pt1_y  (nth 1 pt1)
  19.     pt2_x  (nth 0 pt2)
  20.     )
  21.     (setq gap_x (abs (- pt1_x pt2_x)))
  22.     (setq n (rem (fix (/ gap_x spacing_a)) 2))
  23.     (if  (= n 0)
  24.       (setq gap_x (+ (/ (abs (- pt1_x pt2_x)) 2) (/ spacing_a 2)))
  25.       (setq gap_x (/ (abs (- pt1_x pt2_x)) 2))
  26.     )
  27.     (if  (< pt1_x pt2_x)
  28.       (setq gap (+ pt1_x gap_x))
  29.       (setq gap (+ pt2_x gap_x))
  30.     )
  31.     (setq middle (list gap pt1_y))
  32.     (command "rectang" pt1 pt2)
  33.     (setq s1 (entlast))
  34.     (command "-hatch" "p" "u" "90" spacing_a "n" "s" s1 "" "o" "s" middle "y" "")
  35.     (command "_.erase" s1 "")
  36.   )
  37.   (princ)
  38. )


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

还要深化把填充体放入指定图层。
发表于 2023-3-13 12:33:38 | 显示全部楼层
  1. (defun c:tt ()
  2.   (or dd (setq dd 1200))
  3.   (setq dd (Udist 7 "" "分格间距<输入或鼠标直接量取>" dd nil))
  4.   (while (and (setq pt1 (getpoint "\n指定起点: "))
  5.               (setq pt2 (getcorner pt1 "\n指定终点: "))
  6.          )
  7.     (command "rectang" pt1 pt2)
  8.     (setq s1 (entlast))
  9.     (command "-hatch" "p" "line" (/ dd 3.175) 90 "s" s1 "" "")
  10.   )
  11.   (princ)
  12. )
发表于 2023-3-12 20:46:47 | 显示全部楼层
已经很厉害了,我还是停留在 东拼西凑基础上
发表于 2023-3-12 22:30:00 来自手机 | 显示全部楼层
 楼主| 发表于 2023-3-12 22:38:24 | 显示全部楼层
还有一个问题是,只能从左到右框,不能返着来。
返着来X长变成了负数,判断语句又要重新写一套。
发表于 2023-3-12 22:41:00 | 显示全部楼层
绝对值函数ABS
发表于 2023-3-12 22:46:06 | 显示全部楼层
不错了,
不断搜索例句,例程,组合,碎片化吸收最快,一知半解也无所谓,
先达到自己的目的,应付工作,及时有不完善的地方也没关系,反正自己知道使用环境嘛,
发表于 2023-3-13 09:59:01 | 显示全部楼层
本帖最后由 e2002 于 2023-3-13 10:08 编辑

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


  1. (initget "A S D")
  2. (setq iInput "\n输入整数值 [1/2/4/8/10/20/40/50/100/200/500/1000/2000/样式(A)/设置(S)/方向(D)]: <100> ")

这种规定格式,在AutoCAD for Windows中,右键菜单会直接列出显示,用户可以直接选择需要的常用值。
发表于 2023-3-15 16:18:49 | 显示全部楼层
大师级的了。不错。你是怎么学的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 14:27 , Processed in 0.288909 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表