明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3367|回复: 10

[讨论] [求助]获取多段线的点

[复制链接]
发表于 2010-10-11 22:26:00 | 显示全部楼层 |阅读模式

请问下高手这样的程序怎么可以实现。

图形变化多端的,点必须在闭合多段线里。

本帖子中包含更多资源

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

x
发表于 2010-10-11 22:57:00 | 显示全部楼层
没太整明白你要计算什么点?是不是要计算闭合多段线上等距间隔点向多段线内侧偏移一定距离的点呢?还是其他什么。。。请详细说清楚,这个应该不难!
发表于 2010-10-12 09:17:00 | 显示全部楼层
  1. ;;;(gxl-GetCurveTangent curve pt) 计算曲线上pt处切线方向角度,返回值 弧度
  2. ;;;(gxl-GetCurveTangent (car (entsel)) (getpoint))
  3. (defun gxl-GetCurveTangent (curve pt / param)
  4.   (setq param (vlax-curve-getParamAtPoint curve (setq pt (vlax-curve-getclosestpointto curve pt))))
  5.   (angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv curve param)))
  6.   )
  7. ;;;(gxl-GetCurveNormal curve pt) 计算曲线上pt处法线方向角度,返回值 弧度
  8. ;;;(gxl-GetCurveNormal (car (entsel)) (getpoint))
  9. (defun gxl-GetCurveNormal (curve pt / param)
  10.   (GXL-NUM-TANG (+ (gxl-GetCurveTangent curve pt) pi2) 2pi)
  11.   )
  12. ;;生成一个LINE
  13. ;;gxl-MAKELINE 参数:pt1:起点,pt2:终点,均为三维点,即(x y z)
  14. (DEFUN gxl-MAKELINE (PT1 PT2 /)
  15.   (setq pT1 (append '(10) pt1)
  16. pT2 (append '(11) pt2)
  17.   )
  18.   (entmake (list
  19.       '(0
  20.         .
  21.         "LINE"
  22.        )
  23.       pT1
  24.       PT2
  25.     )
  26.   )
  27.   
  28. )
  29. ;;;(gxl-clock en) 判断Polyline是顺时钟还是逆时钟走,顺时钟 nil 逆时钟 T
  30. ;;;(gxl-Clock (car (entsel)))
  31. (defun gxl-Clock (plineObj / fd ang offsetplineObj flag)
  32.   (setq plineObj (vlax-ename->vla-object plineObj))
  33.   ;(setq fd (vlax-curve-getFirstDeriv plineObj 0.5))
  34.   ;(setq ang (atan (/ (cadr fd) (car fd))))
  35.   (setq offsetplineObj
  36.   (car (vlax-safearray->list
  37.   (vlax-variant-value
  38.     (GXL-OFFSET plineObj 0.001)
  39.   ) ;_ 结束vlax-variant-value
  40.        ) ;_ 结束vlax-safearray->list
  41.   ) ;_ 结束car
  42.   ) ;_ 结束setq
  43.   (if (> (vlax-curve-getdistatparam
  44.     plineobj
  45.     (vlax-curve-getEndParam plineobj)
  46.   ) ;_ 结束vlax-curve-getdistatparam
  47.   (vlax-curve-getdistatparam
  48.     offsetplineObj
  49.     (vlax-curve-getEndParam offsetplineObj)
  50.   ) ;_ 结束vlax-curve-getdistatparam
  51.       ) ;_ 结束>
  52.     (setq flag nil)
  53.     (setq flag T)
  54.   ) ;_ 结束if
  55.   (vla-delete offsetplineObj)
  56.   flag
  57. ) ;_ 结束defun
  58. ;;;gxl-Offset 重定义 vla-offset 函数,避免在2004版下坐标大于10000时出错!
  59. (defun gxl-Offset (obj d / Flag minpoint maxpoint acadver rtn)
  60.   (setq acadver (substr (getvar "acadver") 1 2))
  61.   (if (= 'ENAME (type obj))
  62.     (setq obj (vlax-ename->vla-object obj))
  63.     )
  64.   (vla-GetBoundingBox obj 'minpoint 'maxpoint)
  65.   (setq maxpoint (vlax-safearray->list maxpoint))
  66.   (if (or (>= (abs(car maxpoint)) 10000.0)(>= (abs(cadr maxpoint)) 10000.0))
  67.     (setq Flag t)
  68.     )
  69.   (cond ((and flag (= "16" acadver) (= (vla-get-ObjectName obj) "AcDbPolyline"))
  70.   (vla-move obj minpoint (vlax-3d-point '(0 0 0)))
  71.   (setq rtn (VL-CATCH-ALL-APPLY 'vla-Offset  (list obj d)))
  72.   (if (not (VL-CATCH-ALL-ERROR-P rtn))
  73.     (progn
  74.   (vla-move obj (vlax-3d-point '(0 0 0)) minpoint)
  75.   (vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point '(0 0 0)) minpoint)
  76.   )
  77.     )
  78.   rtn
  79.   )
  80. (t
  81.   (VL-CATCH-ALL-APPLY 'vla-Offset  (list obj d))
  82.   )
  83. )
  84.   )
  85. ;;;计算曲线长度 (gxl-GetCurveLenth en)
  86. ;;; (gxl-GetCurveLenth (car (entsel)))
  87. (defun gxl-GetCurveLength (en / obj)
  88.   (vlax-curve-getdistatparam en (vlax-curve-getEndParam en))
  89. ) ;_ 结束defun
  90. (defun c:tt(/ cmdecho osmode en flag jj pj dist p1 pt pts)
  91.   (setq cmdecho (getvar "cmdecho")
  92. osmode (getvar "osmode")
  93. )
  94.   (setvar "cmdecho" 0)
  95.   (setvar "osmode" 0)
  96.   (princ "\n选择曲线:")
  97.   (setq en (car (entsel)))
  98.   (setq flag (gxl-Clock en))
  99.   (setq jj (getreal " \n输入间距:")
  100. pj (getreal " \n输入偏距:")
  101. )
  102.   (setq CurveLength (GXL-GETCURVELENGTH en)
  103. dist jj)
  104.   (while (< dist CurveLength)
  105.     (setq pt (vlax-curve-getPointAtDist en dist)
  106.    ang (GXL-GETCURVENORMAL en pt)
  107.    )
  108.     (setq p1 (polar pt (if (not flag) (+ ang pi) ang) pj))
  109.     (GXL-MAKELINE pt p1)
  110.     (setq pts (cons p1 pts))
  111.     (setq dist (+ dist jj))
  112.     )
  113.     (setvar "cmdecho" cmdecho)
  114.   (setvar "osmode" osmode)
  115.   (reverse pts)
  116.   )
调用命令:tt
 楼主| 发表于 2010-10-12 09:27:00 | 显示全部楼层

谢谢关注····

我需要找出的是这些圆的点,

这些点都是有规律的等距

 楼主| 发表于 2010-10-12 09:31:00 | 显示全部楼层
程序不能完整运行
发表于 2010-10-12 10:15:00 | 显示全部楼层
有何提示?
发表于 2010-10-12 10:38:00 | 显示全部楼层
补上一个函数,应该可以了
  1. ;;;==================================================================
  2. ;;;gxl-Num-TAng 角度相除取余
  3. ;;;==================================================================
  4.   (defun gxl-Num-TAng (ang sty / n)
  5.     (if (not *jd*) (setq *jd* 1e-5))
  6.     (setq n (rem (+ (* 2 pi) ang) sty))
  7.     (if (equal n sty *jd*)
  8.       0.0
  9.       n)
  10.   )
 楼主| 发表于 2010-10-12 17:58:00 | 显示全部楼层
  • (defun gxl-GetCurveNormal (curve pt / param)
  •   (GXL-NUM-TANG (+ (gxl-GetCurveTangent curve pt) pi2) 2pi)
  •   )
  •  

    pi2 2pi

     

    是怎么来的?还有好几个自定义函数都么有

    发表于 2010-10-12 18:33:00 | 显示全部楼层

    (setq pi2 (/ pi 2.0) 2pi (* 2 pi))

    发表于 2010-10-12 20:03:00 | 显示全部楼层

    感谢Gu_xl分享程序,谢谢!

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

    GMT+8, 2025-2-23 20:10 , Processed in 0.172975 second(s), 26 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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