明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 861|回复: 5

[提问] (已自行解决)大神麻烦如何抽稀线段不失真,圆弧只要起点中点终点三点就好

[复制链接]
发表于 2022-4-19 12:50:59 | 显示全部楼层 |阅读模式
本帖最后由 song宋_74729 于 2022-4-20 08:31 编辑

如何抽稀线段不失真,圆弧只要起点中点终点三点就好


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-4-19 14:24:58 | 显示全部楼层
圆弧变成三点,其他非圆弧咋取点,要有详细的抽稀

规则
 楼主| 发表于 2022-4-19 15:25:38 | 显示全部楼层
guosheyang 发表于 2022-4-19 14:24
圆弧变成三点,其他非圆弧咋取点,要有详细的抽稀

规则

圆弧段就好
发表于 2022-4-19 16:37:33 | 显示全部楼层
那识别出圆弧  然后改成两线段就可以了
 楼主| 发表于 2022-4-19 17:29:00 | 显示全部楼层
guosheyang 发表于 2022-4-19 16:37
那识别出圆弧  然后改成两线段就可以了

没错 识别出圆弧  然后改成两线段
 楼主| 发表于 2022-4-19 17:50:08 | 显示全部楼层
song宋_74729 发表于 2022-4-19 17:29
没错 识别出圆弧  然后改成两线段
  1. (defun cutpoint        (ptsnew / pt0 pt1 pt2 pt3 pt4 dist0 dist1 dist2 ang1 ang2 len) ;    Τ拜  
  2.   (setq        len    (- (length ptsnew) 4)
  3.         pt0    (car ptsnew)
  4.         ptsnew (cdr ptsnew)
  5.         pt1    (car ptsnew)
  6.         ptsnew (cdr ptsnew)
  7.         pt2    (car ptsnew)
  8.         ptsnew (cdr ptsnew)
  9.         pt3    (car ptsnew)
  10.         ptsnew (cdr ptsnew)
  11.         return (list pt1 pt0)
  12.         dist0  (distance pt0 pt1)
  13.   )
  14.   (repeat len
  15.     (setq pt4         (car ptsnew)
  16.           ptsnew (cdr ptsnew)
  17.           dist1         (distance pt1 pt3)
  18.           dist2         (distance pt3 pt4)
  19.     )
  20.     (if        (and (> dist1 0) (> (/ dist0 dist1) 0.3) (< (/ dist0 dist1) 3))
  21.       (setq ang1 ang)
  22.       (setq ang1 (/ ang 2))
  23.     )
  24.     (if        (and (> dist2 0) (> (/ dist1 dist2) 0.3) (< (/ dist1 dist2) 3))
  25.       (setq ang2 ang)
  26.       (setq ang2 (/ ang 2))
  27.     )
  28.     (if        (and (< dist1 dist_max) (corner pt0 pt1 pt3 ang1) (corner pt1 pt3 pt4 ang2))
  29.       t
  30.       (setq return (cons pt2 return)
  31.             dist0  (distance pt2 pt1)
  32.             pt0           pt1
  33.             pt1           pt2
  34.       )
  35.     )
  36.     (setq pt2 pt3)
  37.     (setq pt3 pt4)
  38.   )
  39.   (apply 'append (cons pt4 (cons pt2 return)))
  40. )

  41. (defun corner (c_p1 c_p2 c_p3 c_an / c_1 c_2 temp)
  42.   (setq        c_1 (angle c_p2 c_p1)
  43.         c_2 (angle c_p2 c_p3)
  44.   )
  45.   (if (< c_1 c_2)
  46.     (setq temp (abs (- c_2 c_1 pi)))
  47.     (setq temp (abs (- c_1 c_2 pi)))
  48.   )
  49.   (<= temp c_an)
  50. )
  51. (defun poly_pts        (points / po_pts po_pt)
  52.   (setq        po_pts (list (list (car points) (cadr points) 0)))
  53.   (setq points (cdddr points))
  54.   (while points
  55.     (setq po_pt         (list (car points) (cadr points) 0))
  56.     (setq points (cdddr points))
  57.     (if        (> (distance (car po_pts) po_pt) dist_min)
  58.       (setq po_pts (cons po_pt po_pts))
  59.     )
  60.   )
  61.   (setq po_pts (cons po_pt po_pts))
  62.   (if (> (length po_pts) 4)
  63.     (cutpoint po_pts)
  64.   )
  65. )
  66. (defun lwpoly_pts (points / lw_pts lw_pt)
  67.   (setq lw_pts (list (list (car points) (cadr points))))
  68.   (setq points (cddr points))
  69.   (while points
  70.     (setq lw_pt         (list (car points) (cadr points)))
  71.     (setq points (cddr points))
  72.     (if        (> (distance (car lw_pts) lw_pt) dist_min)
  73.       (setq lw_pts (cons lw_pt lw_pts))
  74.     )
  75.   )
  76.   (setq lw_pts (cons lw_pt lw_pts))
  77.   (if (> (length lw_pts) 4)
  78.     (cutpoint lw_pts)
  79.   )
  80. )
  81. (defun c:choudian (/ layers dist_min dist_max ang ss m n ename object points ptsnew)
  82.   (setq layers (layer_names))
  83.   (if (= (getvar "plinetype") 2)
  84.     (setq ss (ssget (list (cons 0 "lwpolyline") (cons 8 layers))))
  85.     (setq ss (ssget (list (cons 0 "polyline") (cons 8 layers))))
  86.   )
  87.   (if ss
  88.     (progn
  89.       (setvar "cmdecho" 0)
  90.       (command "undo" "g")
  91.       (initget 6)
  92.       (if (setq dist_min (getreal "请输入最小步长:<1>"))
  93.         (setq dist_max (* dist_min 30))
  94.         (setq dist_min 1
  95.               dist_max (* dist_min 30)
  96.         )
  97.       )
  98.       (initget 6)
  99.       (if (null (setq ang (getorient "请输入最大转角:<12度>")))
  100.         (setq ang 0.21)
  101.       )
  102.       (setq m (sslength ss)
  103.             n (1- m)
  104.       )
  105.       (repeat m
  106.         (print n)
  107.         (setq ename  (ssname ss n)
  108.               n             (1- n)
  109.               object (vlax-ename->vla-object ename)
  110.               pts_li (vla-get-Coordinates object)
  111.         )
  112.         (if (= (getvar "plinetype") 2)
  113.           (setq ptsnew (lwpoly_pts pts_li))
  114.           (setq ptsnew (poly_pts pts_li))
  115.         )
  116.         (if (> (length ptsnew) 5)
  117.           (progn
  118.             (vla-put-Coordinates object ptsnew)
  119.             (command "pedit" ename "w" (cdr (assoc 40 (entget ename))) "")
  120.           )
  121.         )
  122.         (vlax-release-object object)
  123.       )
  124.       (command "undo" "e")
  125.       (prin1)
  126.     )
  127.   )
  128. )

明经cad找到这,麻烦优化  谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 11:29 , Processed in 0.171986 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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