找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 539|回复: 0

[讨论]:多段线定距转换(包含转角角度判定)

[复制链接]
发表于 2004-9-23 20:10:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
;;;;*******其中STA和END为关闭扑捉和记忆变量等
;;;;;这个是沿多段线(不含弧线)等距离取点,并连成多段线,其中包;
;;;含对角度的判断,当超过一定角度时候,距离重新判断
;;;;修改多断线端点
(defun c:pld (/ n pl_ss pl_n pl_name pl_dd_0 pl_dd_tz)
  (princ "请选择多段线")
  (setq pl_ss (ssget (list (cons 0' "LWPOLYLINE"))))
  (princ "\n请输入顶点间距")
  (if (/= pl_jl0 nil) (princ pl_jl0))(princ ":")
  (setq pl_jl (getint))
  (princ "\n请输入最大转角")
   (if (/= pl_jd nil) (princ pl_jd0))(princ ":")
  (setq pl_jd (getint))
  (sta)
  (if (= pl_jl nil) (setq pl_jl pl_jl0) (setq pl_jl0 pl_jl))
  (if (= pl_jd nil) (setq pl_jd pl_jd0) (setq pl_jd0 pl_jd))
  (setq n 0)
  (while (< n (sslength pl_ss))
    (setq pl_n (ssname pl_ss n))
    (pl_duandian pl_n);;;; 返回点集合pl_dd2
    (pl_duandian_tiaozhen pl_dd2 pl_jl pl_jd);;;返回调整后点集合pl_dd4
    (pl_huizhi pl_dd4)
    (setq n (1+ n))
   )
  (end)
  )
;;;;********************
;;;;读多段线端点    输入多段线   返回点标pl_dd2                                 
(defun pl_duandian (pl_name / n pl_dd1 pl_en_n )
  (setq pl_en (entget pl_name))
  (setq n 0)
  (while (< n (length pl_en));;;读表取点
    (setq pl_en_n (nth n pl_en))
    (cond
      ((eq '10 (nth 0 pl_en_n))
       (setq pl_dd1 (cons (cdr pl_en_n) pl_dd1))
       ))
    (setq n (1+ n))
  )
  (if (= 1 (cdr (assoc '70 pl_en)))
    (setq pl_dd1 (cons (cdr (assoc '10 pl_en)) pl_dd1)))
  (setq pl_dd2 pl_dd1)
  ;..........
  ;(princ "顶点")(princ pl_dd_0)(princ);;读点
  )
;;**********************
  ;;;重组多断线端点           输入端点 距离 转角  返回点表pl_dd_4
(defun pl_duandian_tiaozhen(pl_dd2 ld0 pl_jd / m ptst pten jdst jden jd ldst lden pl_dd3)
  (setq ptst (nth 0 pl_dd2))
  (setq pten (nth 1 pl_dd2))
  (setq jdst (angle ptst pten))
  (setq ldst ld0)
  (setq pl_dd3 (cons ptst pl_dd3));;加入
   (setq m 1)  
  (while (< m (length pl_dd2))
    (setq pten (nth m pl_dd2));;;取第m个坐标
    (setq jden (angle ptst pten));;;读取方向
;;;;角度判定                                       
    (setq jd (- jden jdst));;计算角度
    (if (< jd 0) (setq jd (* -1 jd)))
    (cond
      ((> jd (/ (* pl_jd pi) 180));;;角度过大
        (setq pl_dd3 (cons ptst pl_dd3));;加入
        (setq ldst ld0);;,归零
        (setq jden (angle ptst pten))
        (setq jdst (angle ptst pten))
       ))
;;;距离判定                                       
        (setq lden (distance ptst pten))
        (while (> lden ldst);;;距离过大
          (setq ptst (polar ptst jden ldst))
          (setq pl_dd3 (cons ptst pl_dd3));;加入
          (setq lden (distance ptst pten))
          (setq jdst jden)
          (setq ldst ld0)
          )
    (cond ((<= lden ldst);;;距离过小
           (setq ptst pten)
           (setq ldst (- ldst lden))
           (setq jdst jden))
          )
    (setq m (1+ m))
         )

  (setq pl_dd3 (cons ptst pl_dd3));;加入
  (setq pl_dd4 pl_dd3)
  ;;.........
  ;(princ "调整后顶点")(princ pl_dd_tz)(princ)
  )
;;;**************
;;;;;由点表画线  输入点表  返回线
(defun pl_huizhi (pl_dd4 / m ss ss0)
  (setq m 1)
  (setq ss (ssadd))
  (while (< m (length pl_dd4))
    (command "line" (trans (nth (1- m) pl_dd4) 0 1) (trans (nth m pl_dd4) 0 1)"");;;坐标转换
    (setq ss0 (ssadd (ssname (ssget "l") 0) ss))
    ;(princ ss)
    (setq m (1+ m)))
  (command "pedit" "m" ss0 "" "y" "j" "" "")
  )
;;;;;书写表格
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-7 15:31 , Processed in 0.164261 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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