明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3745|回复: 17

[源码] 各种线取样提取坐标适用line,lwpolyline,polyline,spline,circle,arc,ellipse

  [复制链接]
发表于 2020-11-26 21:13:46 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2020-11-27 21:47 编辑

20201127更新,小改了一点点
;采集线坐标
;直线段间不取样,曲线段按长度相似度0.9999加密取样
;;;;WZG356 by 20181129
;;适用"line,lwpolyline,polyline,spline,circle,arc,ellipse"

;对顶点拟合或样条曲线化的多线段/样条曲线也可直接取样提取实际位置坐标

;速度尚可, 曲线段万点取样耗时不大于1.5秒

;无弧段多线段取样结果与coordinates法等等正常取值结果一致,速度影响轻微

;lwpolyline,polyline,circle,arc,ellipse弧段用角度法取点速度更快,不在此例

;;示例(outcurvept (car(entsel "\n选择对象: ")))


  1. (defun outcurvept (en / n l ls1 ls2 lo po a b p1 p2 p11 p22)
  2.   (setq ob (vlax-ename->vla-object en))
  3.   (setq ls1(list(cons 0.0(vlax-curve-getstartpoint ob))))  
  4.   (if  (wcmatch (vla-get-objectname ob) "*Polyline")
  5.     (setq n 0
  6.         x(while ;x仅匹配setq格式用
  7.             (setq po(vlax-curve-getpointatparam ob (setq n  (1+ n))))
  8.             (setq l  (vlax-curve-getDistAtParam ob n))
  9.             (setq ls2(append ls2(list(cons l po))));距离+坐标
  10.         )
  11.     )
  12.     (setq l(vlax-curve-getDistAtParam ob (vlax-curve-getendparam ob))
  13.       ls2(list(cons l(vlax-curve-getendpoint ob)))
  14.     );line,spline,circle,arc,ellipse
  15.   )  
  16.   (while
  17.     (setq p11(last ls1)  p22(car ls2))
  18.     (setq a  (car p11)  b  (- (car p22) a))
  19.     (setq p1 (cdr p11)  p2(cdr p22))
  20.     (if  (equal b(distance p1 p2) 1e-5);直线段不管
  21.       (setq ls2(cdr ls2) ls1(append ls1 (list p22)))
  22.       (setq lo (+(setq b(* b 0.5))a)
  23.           po(vlax-curve-getPointAtDist ob lo);中间点
  24.           x (if  (< (* b 0.9999) (distance p1 po))
  25.                 (setq ls2(cdr ls2) ls1(append ls1(list p22)))
  26.                 (setq ls2 (cons(cons lo po)ls2))
  27.             )
  28.       )      
  29.     )
  30.   );循环自适应
  31.   (mapcar 'cdr ls1)
  32. )





评分

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

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2020-11-26 21:17:54 | 显示全部楼层
本帖最后由 wzg356 于 2020-11-28 15:30 编辑

实操示例1
(command "pline" (foreach p (outcurvept (car(entsel "\n选择线对象转为非曲线化多线段: ")))(command p)))
适用化
(defun c:ctp ( / sel ss en pts p)
        (princ "\n 功能:将各种曲线转为轻多线段.曲线段加密采点")
        (setvar "cmdecho" 0)
        (command "undo" "be")
        (setq sel "LINE,*OLYLINE,SPLINE,CIRCLE,ARC,ELLIPSE")
        (and(setq ss(ssget (list(cons 0 sel))))
        (setq ss(vl-remove-if 'listp(mapcar 'cadr (ssnamex ss))))
        (foreach en ss
                (setq pts (outcurvept en))
                (if  (vlax-curve-isClosed en)
                        (setq pts(reverse(cons "c"(cdr(reverse pts)))))
                    )
                    (command "pline" (foreach p pts(command p)))
                    (command "_matchprop" en (entlast) "")
                    (entdel en)
                )
        )
        (command "_undo" "_e")
        (setvar "cmdecho" 1)
        (princ)       
)
 楼主| 发表于 2020-11-27 18:17:46 | 显示全部楼层
本帖最后由 wzg356 于 2020-11-27 18:18 编辑

应用例子3
多线段圆滑
(defun c:plsm ( / p e)
        (setvar "cmdecho" 0)
        (princ "\n选取要圆滑的多线段")
        (if     (setq e(ssget ":E:S" '((0 . "*POLYLINE"))))
                (progn
                        (setq e(ssname e 0))
                        (command "PEDIT" e "s" "")
                        (command "pline" (foreach p (outcurvept e)(command p)))
                        (command "_matchprop" e (entlast) "")
                        (entdel e)
                )
        )
        (setvar "cmdecho" 1)
)
 楼主| 发表于 2020-11-27 18:04:20 | 显示全部楼层
应用例子2
用多线段画1个半径20的圆
(defun c:c20 ( / p e)
        (setvar "cmdecho" 0)
        (and(setq p (getpoint "\n指定圆心"))
                (list(command "CIRCLE" p 20))
                (setq e (entlast))
                (list(command "pline" (foreach p (outcurvept e)(command p))))
                (entdel e)
        )
        (setvar "cmdecho" 1)
)
发表于 2020-11-27 23:38:18 | 显示全部楼层
先学习学习
发表于 2020-12-1 12:09:14 | 显示全部楼层
楼主写了关于坐标很多的好程序,支持
发表于 2021-10-29 16:06:08 | 显示全部楼层
好函数  刚好能用上  收藏了    谢谢!!!
发表于 2022-12-3 20:26:08 | 显示全部楼层
比较冷门,但是很专业
发表于 2022-12-8 15:37:40 | 显示全部楼层
多谢楼主分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 09:54 , Processed in 0.204768 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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