明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2989|回复: 2

采集PL线上各顶点的坐标

[复制链接]
发表于 2011-10-20 14:15:45 | 显示全部楼层 |阅读模式
本帖最后由 zzl9105 于 2011-10-20 14:18 编辑

如题,哪位有这样的小lisp呀,想学习下,
以及我想判断一个点在不在这个闭合PL线之内,如何判断呀?
或者说我想取一个该闭合线内一点,以供函数使用,这点取点
恭请高手出招,谢谢!


该贴已经同步到 zzl9105的微博
发表于 2011-10-20 14:42:50 | 显示全部楼层

采集PL线上各顶点的坐标
  1. ;;;****************************************************
  2. ;;; 返回多段线(*POLYLINE)的所有顶点坐标  函数  
  3. ;;;****************************************************
  4. (defun GetPLineVTX (EntName1 / Obj1 vtx vtxlst PtsList i)
  5.   (cond
  6.     ((= (cdr (assoc 0 (entget EntName1))) "LWPOLYLINE")
  7.      (setq PtsList (ayGetLWPolyLineVTX EntName1))
  8.     );end_switch
  9.     ((= (cdr (assoc 0 (entget EntName1))) "POLYLINE")
  10.      (setq PtsList (ayGetPolyLineVTX EntName1))
  11.     );end_switch
  12.   );end_cond
  13.   (setq PtsList PtsList)
  14. );end_defun

  15. ;;;-----------------------------------------------
  16. ;;; 获取 LWPOLYLINE 对象所有顶点坐标   
  17. ;;;-----------------------------------------------
  18. (defun GetLWPolyLineVTX (EntName1 / Obj1 vtx vtxlst PtsList i)
  19.   (vl-load-com)
  20.   (setq Obj1 (vlax-ename->vla-object EntName1))
  21.   (setq vtx (vla-get-Coordinates Obj1))
  22.   (setq vtxLst (vlax-safearray->list (vlax-variant-value vtx)))
  23.   (setq i 0)
  24.   (setq PtsList nil)
  25.   (repeat (/ (length vtxLst) 2)
  26.     (setq PtsList (append PtsList (list (list (nth i vtxLst) (nth (1+ i) vtxLst)))))
  27.     (setq i (+ i 2))
  28.   );end_repeat
  29.   (setq PtsList PtsList)
  30. );end_defun

  31. ;;;---------------------------------------------
  32. ;;; 获取 POLYLINE 对象所有顶点坐标   
  33. ;;;---------------------------------------------
  34. (Defun GetPolyLineVTX (LwPolyEntName / entData1 entName1 pel ptp wpl wpll plp par ct
  35.                                        pen rl pn clk pt al gx bj np xc gg rr cp retList)
  36.   (setq entName1 LwPolyEntName)
  37.   (setq retList nil)
  38.   (setq entData1 (entget entName1))
  39.   (if (= "POLYLINE" (Cdr (Assoc 0 entData1)))
  40.     (progn
  41.       (setq pel  entData1             ;取出对象表.
  42.             ptp  (Cdr (Assoc 70 pel)) ;取出结束片段型.
  43.             wpl  '()                  ;自建的点位数表.
  44.             wpll '()
  45.             entName1 (EntNext entName1)
  46.             pen entName1
  47.       );end_setq
  48.       (While (/= "SEQEND" (Cdr (Assoc 0 (entget pen))));如果没束.
  49.         (setq pel (entget pen)               ;取得顶点对象数据表.
  50.               plp (Cdr (Assoc 10 pel))       ;取出控制点点位.
  51.               par (Cdr (Assoc 42 pel))       ;取出弓弦比.
  52.               wpl (Cons (List plp par) wpl)  ;将数据加到WPL表中.
  53.               wpll (cons plp wpll)
  54.         );end_setq
  55.         (setq pen (EntNext pen));搜索下一个对象.
  56.       );end_while
  57.       (setq wpll (Reverse wpll))
  58.       (setq ct (If (= 0 (Cadr (Car wpl))) "直线片段封闭" "弧片段封闭"))
  59.       (setq wpl (Cons (Last wpl) wpl);加入封闭点.
  60.             wpl (Reverse wpl)        ;整理WPL表.
  61.             rl (Length wpl)
  62.             pn 0
  63.       );end_setq
  64.       (setq clk (If (Or (= 0 ptp) (= 128 ptp)) "开口" "封闭"))  
  65.       (Repeat (1- rl)          ;逐点分析.
  66.         (setq al (Nth pn wpl)  ;取出点数据表.
  67.               pt (Car al)      ;取出点位.
  68.         );end_setq
  69.         (If (And (/= 0.0 (Cadr al)) (Nth pn wpl)) ;如果是断.
  70.            (Progn (setq gx (Cadr al)               ;取出弓比.
  71.                        bj (* (ATAN (ABS gx)) 4)   ;计算包角.
  72.                        np (Car (Nth (1+ pn) wpl)) ;取出下一点位.
  73.                        xc (* 0.5 (Distance pt np));半弦长计算.
  74.                        gg (* gx xc)               ;弓高计算.
  75.                        rr (/ (+ (* xc xc)(* gg gg)) (* 2 gg))
  76.                   );end_setq  
  77.                   (setq cp (Polar pt (setq pa (Angle pt np)) xc)  
  78.                         cp (Polar cp (+ pa (* 0.5 PI)) (- rr gg))
  79.                   );end_setq
  80.           );end_progn
  81.         );end_if
  82.         (setq pn (1+ pn))
  83.       );end_repeat
  84.       
  85.       (setq retList wpll)
  86.     );end_progn
  87.   );end_if
  88. );end_defun



判断一个点在不在这个闭合PL线之内

  1. ;;;******************************************************************************
  2. ;;; 判断点是否在多边形内                                    
  3. ;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
  4. ;;;******************************************************************************
  5. (defun isPtinPM (xPt Points)
  6. (equal PI (abs (apply '+ (mapcar '(lambda (x y)  (rem (- (angle xPt x) (angle xPt y)) PI))
  7.                 (reverse (cdr (reverse (cons (last Points) Points)))) Points)))
  8.         1e-6
  9. );end_equal
  10. );end_defun

评分

参与人数 2明经币 +2 金钱 +10 收起 理由
zzl9105 + 1 赞一个!学习了,谢谢你!
yjr111 + 1 + 10 热心人!

查看全部评分

 楼主| 发表于 2011-10-20 16:20:24 | 显示全部楼层
本帖最后由 zzl9105 于 2011-10-20 16:41 编辑
xiaxiang 发表于 2011-10-20 14:42

采集PL线上各顶点的坐标


非常感谢xiaxiang
命令: (LOAD "F:/LISP加载/练习/采集PL线上各顶点的坐标.lsp") GETPOLYLINEVTX
命令: GETPOLYLINEVTX
未知命令“GETPOLYLINEVTX”。按 F1 查看帮助。
命令: GetLWPolyLineVTX
未知命令“GETLWPOLYLINEVTX”。按 F1 查看帮助。
命令: GetPLineVTX
未知命令“GETPLINEVTX”。按 F1 查看帮助。

怎么都是未知命令,是不是不完全呀?

点评

(GETPOLYLINEVTX) 这个只是函数,不是调用的命令。请加处理程序调用之  发表于 2011-10-20 17:54
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-25 04:51 , Processed in 0.177299 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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