明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5284|回复: 18

[源码] 浩辰CAD中的几个lisp,供参考

  [复制链接]
发表于 2014-7-1 15:04 | 显示全部楼层 |阅读模式
本帖最后由 lucas_3333 于 2014-7-1 15:13 编辑

无聊装了浩辰CAD2014版,试了下,不习惯,但是发现appload里加载的竟然有一些源码,这些论坛上已经有了(记忆中是这样)
发出来,有需要的可以参考下

  1. ;;====此程序共有四部分内容
  2. ;; 一.绘波浪线 ,命令是 PLX
  3. ;; 二.绘轴截断 ,命令是 PLZ
  4. ;; 三.绘1/4范围波浪线 命令是 PLX41
  5. ;; 四.绘3/4范围波浪线 命令是 PLX43
  6. ;;==========================================
  7. ;;镜像点函数,mirr-x为X轴镜像,mirr-y为Y轴镜像
  8. ;;px--被镜像点,po--镜像基点
  9. (defun mirr-x (px po) (list (car px) (- (* 2 (cadr po)) (cadr px))))
  10. (defun mirr-y (px po) (list (- (* 2 (car po)) (car px)) (cadr px)))
  11. (defun dtr (x) (/ (* x pi) 180));;度至弧度的转换
  12. (defun rtd (x) (/ (* x 180.0) pi))
  13. (defun midpoint (p1 p2)         ;;两点的中点函数
  14.    (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0)) )
  15. ;;绘制波浪线函数初始化INIT_PLX;;;
  16. (defun init_plx ( / q1)  
  17.   (command "pline" (setq q1 (getvar "viewctr")) "w" 0 0 q1 ""
  18.            "erase" "l" "")
  19.   (setq jsq 0)
  20.   (princ "******* 初始化成功 *******")
  21. )
  22. ;;绘制波浪线函数 PLX1
  23. (defun plx1 (p1 p2 num /
  24.              ang5 ang ang0 ang1 ang2 d12 d12mc ;;real
  25.              p0                                ;;point
  26.              num2 num3 n                       ;;int
  27.             )
  28.             ;;;pg (point)为后用;;;
  29.    (if (< num 5) (setq ang5 15.0) (setq ang5 20.0))
  30.    (setq ang (angle p1 p2)     ;;两点夹角
  31.          ang0 (dtr ang5)       ;;波浪线角ang5=15 或 20度
  32.          ang1 (+ ang ang0)     ;;++++
  33.          ang2 (- ang ang0)     ;;----
  34.          d12 (distance p1 p2)  ;;两点距离
  35.          d12mc (/ d12 num 2.0 (cos ang0));;小段斜线距离
  36.          num2 (* num 2)        ;;一个波浪线两小段
  37.          num3 (1+ num2)        ;;总段数
  38.          p0 p1
  39.    )      
  40.    (command "pline" p1)
  41.    (setq n 1)
  42.    (repeat num3         ;;;按段数绘制PLINE;;;
  43.      (if (= n num3)      
  44.       (command p2)      ;;;末点归位到第二点(末点)
  45.       (if (= n 1)       ;;;第一点画法,取D12MC之半;;;
  46.         (progn  
  47.           (command (setq p0 (polar p0 ang1 (/ d12mc 2.0)) pg p0))
  48.           ;;;(princ "***** ang=") (princ (rtd ang1))
  49.         )
  50.         (progn
  51.          (if (= (rem n 2) 0);;按奇偶数的ang1 ang2产生波浪
  52.           (command (setq p0 (polar p0 ang2 d12mc) pg p0))
  53.           (command (setq p0 (polar p0 ang1 d12mc)))
  54.          );if (= (rem n 2) 0)
  55.         );progn
  56.       );if n=1
  57.      );if n=num3
  58.      (setq n (1+ n))
  59.    );repeat
  60.    (command "")
  61.    ;(command "pedit" p0 "f" "")  ;;曲线拟合
  62.    ;(princ "请编辑所画的波浪线")
  63.     ;(command "pedit" "l" "f" "")
  64. );defun plx1
  65. ;;==========================
  66. ;;绘制波浪线命令 C:PLX
  67. (defun c:plx ( / j
  68.               jxm xzm                       ;;string
  69.               q1 q2 pg                      ;;point
  70.               nnn mmm oldos oldblip oldcmd  ;;int
  71.              )
  72.    ;;初始化pline命令的线宽为零,即W=0
  73.    ;;为防止多次运行,设置计数器 JSQ=0 或 NIL;;
  74.    (if (= jsq nil) (init_plx) )
  75.    (setq mmm 1 q1 '() q2 '())
  76.    (setq oldos (getvar "osmode"))
  77.                  ;;存储原图的捕获模式 osmode
  78. ;;   (if (/= oldos 512) (setvar "osmode" 512))
  79.                  ;;设置 osmode 为 512, 即为捕获最近点
  80.    (setq oldblip (getvar "blipmode"))
  81.                  ;;存储原图的点标记符系统变量"+'
  82.    (setq oldcmd (getvar "cmdecho"))
  83.                  ;;存储原图的响应回显信息 cmdecho
  84.    (if (= oldblip 1) (setvar "blipmode" 0))
  85.        ;;点标记符系统变量 = 0 时 无 "+"
  86.    (if (= oldcmd  1) (setvar "cmdecho" 0))
  87.                  ;;回显信息 cmdecho为0,不回显
  88.    (setq jxm "Y")
  89.    (while (= jxm "Y")
  90.     (cond
  91.       ((= mmm 1) (print) (princ "第一条线..."))
  92.       ((= mmm 2) (print) (princ "第二条线..."))
  93.       ((>= mmm 3)(print) (princ "下一条线..."))
  94.     )
  95.     (princ " 请选择捕捉方式...")
  96.     (graphscr)
  97.     (setq q1 (getpoint "\n波浪线起点 : "))
  98.     (if (= q1 '()) (setq q1 (getvar "viewctr")))
  99.     (while (= q2 '())  
  100.       (setq q2 (getpoint q1 "\n波浪线终点 : ")) )
  101.     (setq nnn 8)
  102.     (while (or (< nnn 2) (> nnn 7))
  103.       (setq nnn (getint "\n波浪线的波段数 (2--7) < 3 > "))
  104.       (if (= nnn nil) (setq nnn 3))
  105.     );
  106.     (PLX1 q1 q2 nnn)
  107.     (setq q1 '() q2 '())
  108.     (setq mmm (1+ mmm))
  109.     (setq jxm (getstring "\n还要画吗 ? (Y/N) < N > "))
  110. ;    (setq jxm "N")
  111.     (setq jxm (strcase jxm))
  112.   );while
  113.   ;;;各系统变量复位;;;;
  114. ;;  (setvar "osmode" oldos)
  115.   (setvar "cmdecho" oldcmd)
  116.   (setvar "blipmode" oldblip)
  117. ;|   (setq xzm (getstring "\n波浪线程序需要卸载吗 ?(Y/N) < Y > "))
  118.     (if (= zjm "") (setq xzm "Y"))
  119.     (setq xzm (strcase xzm))
  120.     (if (= xzm "Y")
  121.         (setq c:plz nil @xy nil mirr-x nil mirr-y nil
  122.               dtr nil rtd nil midpoint nil init_plx nil
  123.               jsq nil plx1 nil c:plx nil)
  124.     )|;if end

  125. );defun plx

  126. ;;==========================
  127. ;;绘制1/4.象限 3/4象限波浪线
  128. ;;==========================
  129. (defun h_plx (p1 p2 p0 ang num a_base /
  130.               d_a d01 d02 dcp x1 d_d d_r a r ;;real
  131.               pbf n                          ;;int
  132.               q00                            ;;point
  133.              )
  134.    (setq d_a (/ ang 1.0 num)
  135.          d01 (distance p0 p1)
  136.          d02 (distance p0 p2)
  137.          dcp (/ (+ d01 d02) 2.0)
  138.          x1  (- (car p1) (car p0))
  139.          d_d (abs (/ (- d01 d02) num))
  140.    )
  141.    ;; 此组数据不很可靠,请再试DCP-->NN;;
  142.    (cond
  143.      ((and (> dcp 0)  (<= dcp 9))   (setq nn 30))
  144.      ((and (> dcp 9)  (<= dcp 20))  (setq nn 40))
  145.      ((and (> dcp 20) (<= dcp 50))  (setq nn 50))
  146.      ((and (> dcp 50) (<= dcp 80))  (setq nn 60))
  147.      ((and (> dcp 80) (<= dcp 120)) (setq nn 70))
  148.      ((and (> dcp 120)(<= dcp 300)) (setq nn 80))
  149.      (T                             (setq nn 90))
  150.    )  
  151.    (setq d_r (/ dcp nn))
  152.    (if (>= d01 d02) (setq pbf -1) (setq pbf 1))
  153.    (command "pline" p1)
  154.    (setq n 1)
  155.    (while (<= (* n d_a) ang)     ;;;按段数绘制PLINE;;;
  156.      (if (>= (* n d_a) ang)
  157.       (command p2)      ;;;末点归位到第二点(末点)
  158.       (if (= n 1)       ;;;第一点画法,取D12MC之半;;;
  159.         (progn   
  160.            (setq r (+ d01 (* n d_d pbf) d_r)
  161.                  a (+ a_base (/ d_a 2.0)) )
  162.            (command (polar p0 (dtr a) r))
  163.         )
  164.         (progn
  165.          (if (= (rem n 2) 0);;按奇偶数的ang1 ang2产生波浪
  166.           (progn
  167.             (setq r (+ (+ d01 (* (- n 1) d_d pbf)) d_r)
  168.                   a (+ a_base (* (- n 1) d_a) (/ d_a 2.0)) )
  169.             (command (setq q00 (polar p0 (dtr a) r)))
  170.           )  
  171.           (progn
  172.             (setq r (- (+ d01 (* (1- n) d_d pbf)) d_r)
  173.                   a (+ a_base (* (1- n) d_a) (/ d_a 2.0)) )
  174.             (command (setq q00 (polar p0 (dtr a) r)))
  175.           )
  176.          );if (= (rem n 2) 0)
  177.         );progn
  178.       );if n=1
  179.      );if n=num3
  180.      (setq n (1+ n))
  181.    );while
  182.    (command "")
  183.    (command "pedit" "l" "f" "")  ;;曲线拟合
  184. );defun plx1
  185. ;;绘制1/4.象限 3/4象限波浪线
  186. (defun c:plx41 ( / r
  187.        oldos oldblip oldcmd lx     ;;int
  188.        q1 q2 q0                    ;;point
  189.        x1 x2 y1 y2 r               ;;real
  190.        angle number angbase
  191.        d_xx                        ;;string
  192.                )
  193.     (if (= jsq nil) (init_plx) )
  194.     (setq oldos (getvar "osmode"))
  195.                   ;;存储原图的扑捉模式 osmode
  196.     (if (/= oldos 512) (setvar "osmode" 512))
  197.                  ;;设置 osmode 为 512, 即为捕获最近点
  198.     (setq oldblip (getvar "blipmode"))
  199.                  ;;存储原图的点标记符系统变量"+'
  200.     (if (= oldblip 1) (setvar "blipmode" 0))
  201.                  ;;点标记符系统变量 = 0 时 无 "+"
  202.     (setq oldcmd (getvar "cmdecho"))
  203.                  ;;存储原图的响应回显信息 cmdecho
  204.     (if (= oldcmd  1) (setvar "cmdecho" 0))
  205.                  ;;回显信息 cmdecho为0,不回显
  206.     (princ " 如果想用捕获方式,请选择方式,现在默认最近点...")
  207.     (setq q1 '() q2 '())
  208.     (while (= q1 '())  
  209.       (setq q1 (getpoint  "\n在轴的母线选另一点 : ")) )
  210.     (while (= q2 '())  
  211.       (setq q2 (getpoint q1 "\n在轴的端面线选另一点 : "))
  212.       (setq x1 (car q1) y1 (cadr q1)
  213.             x2 (car q2) y2 (cadr q2))
  214.       (if (or (= x1 x2) (= y1 y2)) (setq q2 '()))
  215.     )
  216.     ;;变量D_XX为第几相限(1 2 3 4)的选定
  217.     (cond
  218.       ((> x1 x2)
  219.          (if (> y1 y2)
  220.              (setq q0 (list x2 y1) d_xx "4" angbase 270)
  221.              (setq q0 (list x2 y1) d_xx "1" angbase   0)
  222.          )
  223.       )
  224.       ((< x1 x2)
  225.          (if (> y1 y2)
  226.              (setq q0 (list x2 y1) d_xx "3" angbase 180)
  227.              (setq q0 (list x2 y1) d_xx "2" angbase  90)
  228.          )
  229.       )
  230.       ((or (= x1 x2) (= y1 y2))(prompt "不可能的情况 ! "))
  231.     );cond
  232.     (setq angle 90.0  number 15)
  233.     (cond
  234.       ((= d_xx "1") (H_PLX q1 q2 q0 angle number 0))
  235.       ((= d_xx "2") (H_PLX q2 q1 q0 angle number 90))
  236.       ((= d_xx "3") (H_PLX q1 q2 q0 angle number 180))
  237.       ((= d_xx "4") (H_PLX q2 q1 q0 angle number 270))
  238.     );cond
  239. );;此段程序未完
  240. (defun c:plx43 ( / r
  241.        oldos oldblip oldcmd lx     ;;int
  242.        q1 q2 q0                    ;;point
  243.        x1 x2 y1 y2 r               ;;real
  244.        angle number angbase
  245.        d_xx                        ;;string
  246.                )
  247.     (if (= jsq nil) (init_plx) )
  248.     (setq oldos (getvar "osmode"))
  249.                   ;;存储原图的扑捉模式 osmode
  250.     (if (/= oldos 512) (setvar "osmode" 512))
  251.                  ;;设置 osmode 为 512, 即为捕获最近点
  252.     (setq oldblip (getvar "blipmode"))
  253.                  ;;存储原图的点标记符系统变量"+'
  254.     (if (= oldblip 1) (setvar "blipmode" 0))
  255.                  ;;点标记符系统变量 = 0 时 无 "+"
  256.     (setq oldcmd (getvar "cmdecho"))
  257.                  ;;存储原图的响应回显信息 cmdecho
  258.     (if (= oldcmd  1) (setvar "cmdecho" 0))
  259.                  ;;回显信息 cmdecho为0,不回显
  260.     (princ " 如果想用捕获方式,请选择方式,现在默认最近点...")
  261.     (setq q1 '() q2 '())
  262.     (while (= q1 '())  
  263.       (setq q1 (getpoint  "\n在轴的母线选另一点 : ")) )
  264.     (while (= q2 '())  
  265.       (setq q2 (getpoint q1 "\n在轴的端面线选另一点 : "))
  266.       (setq x1 (car q1) y1 (cadr q1)
  267.             x2 (car q2) y2 (cadr q2))
  268.       (if (or (= x1 x2) (= y1 y2)) (setq q2 '()))
  269.     )
  270.     (cond
  271.       ((> x1 x2)
  272.          (if (> y1 y2)
  273.              (setq q0 (list x2 y1) d_xx "4" angbase 270)
  274.              (setq q0 (list x2 y1) d_xx "1" angbase   0)
  275.          )
  276.       )
  277.       ((< x1 x2)
  278.          (if (> y1 y2)
  279.              (setq q0 (list x2 y1) d_xx "3" angbase 180)
  280.              (setq q0 (list x2 y1) d_xx "2" angbase  90)
  281.          )
  282.       )
  283.       ((or (= x1 x2) (= y1 y2))(prompt "不可能的情况 ! "))
  284.     );cond
  285.     (setq angle 270.0  number 27)
  286.     (cond
  287.       ((= d_xx "1") (H_PLX q2 q1 q0 angle number 90))
  288.       ((= d_xx "2") (H_PLX q1 q2 q0 angle number 180))
  289.       ((= d_xx "3") (H_PLX q2 q1 q0 angle number 270))
  290.       ((= d_xx "4") (H_PLX q1 q2 q0 angle number 0))
  291.     );cond
  292. );;此段程序已完


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

代码结构相当混乱  发表于 2014-7-3 09:28
居然angle也能当变量!  发表于 2014-7-3 09:17
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-11-6 07:55 | 显示全部楼层

样条曲线多段线正好用得上,谢谢
发表于 2019-11-6 08:51 | 显示全部楼层
谢谢楼主分享,挺好用的
发表于 2019-10-30 00:15 来自手机 | 显示全部楼层
谢谢分享,学习了
发表于 2014-7-1 16:01 | 显示全部楼层
样条曲线多段线正好用得上,谢谢
发表于 2014-7-1 18:50 | 显示全部楼层
感謝 lucas_3333 分享程序!
发表于 2014-7-1 20:16 | 显示全部楼层
顶楼主,感谢分享
发表于 2014-7-1 21:38 | 显示全部楼层
感谢!下载了。
发表于 2014-7-2 08:17 | 显示全部楼层
支持!!!!!!!!!!!!
发表于 2014-7-3 08:30 | 显示全部楼层
发表于 2014-7-5 11:43 | 显示全部楼层

样条曲线多段线正好用得上,谢谢~~
发表于 2014-7-5 11:44 | 显示全部楼层

谢谢,下载了。
发表于 2014-7-7 07:56 | 显示全部楼层
谢谢分享,下来学习学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 21:26 , Processed in 0.293937 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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