明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1001|回复: 2

[源码] 快速绘制指定长度的样条曲线

[复制链接]
发表于 2023-10-11 11:16:53 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2023-10-11 11:22 编辑

  1.           ;绘制样条曲线
  2. (vl-doc-export '$c:hzytxrun$)
  3. (defun $c:hzytxrun$ (lst  /     $make-spline$
  4.          *error*  dxf     en        ents
  5.          ent-spline  l     l-all      line-jzx
  6.          line-jzx-ent     line-jzx-p2
  7.          mark  obj     pt        pts
  8.          pts-sd  tmp
  9.         )
  10.   (defun *error* (s)
  11.     (if  (and mark (entget mark))
  12.       (entdel mark)
  13.     )
  14.   )
  15.   (defun $make-Spline$ (ptn / a)
  16.     (entmakex
  17.       (append (list '(0 . "SPLINE")
  18.         '(100 . "AcDbEntity")
  19.         '(100 . "AcDbSpline")
  20.         '(71 . 3)
  21.         )
  22.         (mapcar (function (lambda (pt) (cons 11 pt))) ptn)
  23.       )
  24.     )
  25.   )
  26.   (SETQ L-ALL (GETREAL "请输入样条曲线的总长度"))
  27.   (if (and L-ALL (> L-ALL 0.5))
  28.     (progn
  29.       (setq
  30.   pt (getpoint
  31.        "点击鼠标左键开始绘制样条曲线\n连续敲两次空格结束绘制"
  32.      )
  33.       )
  34.       (if pt
  35.   (progn
  36.     (setq pts nil)
  37.     (setq pts (append pts (list pt)))
  38.     (if pt
  39.       (progn
  40.         (setq
  41.     mark (VLAX-VLA-OBJECT->ENAME
  42.            (VLA-ADDPOINT
  43.        (vla-get-ModelSpace
  44.          (vla-get-ActiveDocument
  45.            (vlax-get-acad-object)
  46.          )
  47.        )
  48.        (VLAX-3D-POINT (LIST 0 0 0))
  49.            )
  50.          )
  51.         )
  52.         (vl-cmdf "_.spline" "non" pt)
  53.           ;(setq ent (entlast))
  54.         (while (= 1 (logand 1 (getvar 'cmdactive)))
  55.     (vl-cmdf "\\")
  56.     (setq pts (append pts (list (getvar 'lastpoint))))
  57.     (SETQ TMP NIL)
  58.     (AND (setq tmp ($make-Spline$ pts))
  59.          (SETQ OBJ (VLAX-ENAME->VLA-OBJECT TMP))
  60.          (setq
  61.            L (vlax-curve-getDistAtPoint
  62.          OBJ
  63.          (vlax-curve-getEndPoint OBJ)
  64.        )
  65.          )
  66.     )
  67.     (and tmp (entget tmp) (entdel tmp))
  68.     (IF (>= L L-ALL)
  69.       (PROGN
  70.         (if  (= 1 (logand 1 (getvar 'cmdactive)))
  71.           (progn (VL-CMDF "") (VL-CMDF "") (VL-CMDF ""))
  72.         )
  73.       )
  74.     )
  75.     (print L)
  76.         )
  77.         (and ent (setq dxf (entget ent '("*"))))
  78.       )
  79.     )
  80.     (setq en mark)
  81.     (setq ents nil)
  82.     (while (setq en (entnext en))
  83.       (if  (and en (entget en))
  84.         (setq ents (append ents (list en)))
  85.       )
  86.     )        ;用en循环获取后添加到ents记录里面
  87.     (if (and mark (entget mark))
  88.       (entdel mark)
  89.     )
  90.     (setq en nil)
  91.     (setq ent-spline (car ents))
  92.     (if (and ent-spline (entget ent-spline))
  93.       (progn
  94.         (and kuozhanshuju(kuozhanshuju
  95.     ent-spline
  96.     "length"
  97.     (list (vl-princ-to-string L-ALL))
  98.     "ALL"
  99.         ))
  100.         (setq obj (vlax-ename->vla-object ent-spline))
  101.         (setq pts-sd (vlax-curve-getPointAtDist obj L-ALL))
  102.         (setq line-jzx-p2
  103.          (polar (vlax-curve-getPointAtDist obj L-ALL)
  104.           (+ (angle (vlax-curve-getPointAtDist
  105.           obj
  106.           (* L-ALL 0.99)
  107.               )
  108.               (vlax-curve-getPointAtDist
  109.           obj
  110.           (* L-ALL 1.01)
  111.               )
  112.              )
  113.              (* pi 0.5)
  114.           )
  115.           1
  116.          )
  117.         )
  118.         (setq line-jzx (vla-addLine
  119.              (vla-Get-ModelSpace
  120.          (vla-get-ActiveDocument
  121.            (vlax-get-acad-object)
  122.          )
  123.              )
  124.              (vlax-3D-Point
  125.          (vlax-curve-getPointAtDist obj L-ALL)
  126.              )
  127.              (vlax-3D-Point line-jzx-p2)
  128.            )
  129.         )
  130.         (setq line-jzx-ent (vlax-vla-object->ename line-jzx))
  131.         (VL-CMDF
  132.     "TRIM"
  133.     line-jzx-ent
  134.     ""
  135.     (LIST ent-spline
  136.           (vlax-curve-getPointAtDist obj (* L-ALL 1.0125))
  137.     )
  138.     ""
  139.         )        ;(vlax-curve-getPointAtDist obj (* L-ALL 1.0125))
  140.         (entdel line-jzx-ent)
  141.       )
  142.     )
  143.   )
  144.       )
  145.     )
  146.   )
  147. )
  148. (defun c:hzytx () ($c:hzytxrun$ nil))

评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-10-11 16:18:00 | 显示全部楼层
中文变量名,不常见啊
发表于 2023-10-12 08:52:31 | 显示全部楼层
谢谢楼主分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 06:47 , Processed in 0.160644 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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