明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3636|回复: 8

[求助]:如何求得任意多义线(POLYLINE和LWPOLYLINE)的长度和型心坐标?

[复制链接]
发表于 2006-2-12 19:48:00 | 显示全部楼层 |阅读模式

对于多义线LWPOLYLINE的长度和型心坐标,可以看作由若干条直线组成,但是对于POLYLINE就比较复杂了,因为有的分段可能不是直线.

请各位帮帮忙,对于求多义线的长度和型心坐标,有没有什么好的方法或函数,给小弟我推荐一下吧!

发表于 2006-2-13 15:57:00 | 显示全部楼层

多义线的长度可以用vlax-curve-getDistAtParam函数来求;

第二,前提是封闭区域,你所指的型心坐标是不是指质心坐标,这个可以先用REGION生成面域后再读取质心的坐标。

 楼主| 发表于 2006-2-13 18:46:00 | 显示全部楼层

用vlax-curve-getDistAtParam函数可以求出曲线的长度,但当多义线是封闭时,求出的长度为零,显然不正确.这个问题倒好解决.

主要是任意多义线的型心不好求.我所指的型心是指曲线的型心坐标,是一维的,不是指面积的型心.当多义线的组成部分包含了直线,圆弧以后,型心就不好求了.

请各位高手帮忙解决一下吧!

发表于 2006-2-13 19:46:00 | 显示全部楼层
lwhcommon发表于2006-2-13 18:46:00 用vlax-curve-getDistAtParam函数可以求出曲线的长度,但当多义线是封闭时,求出的长度为零,显然不正确.这个问题倒好解决. 主要是任意多义线的...

为什么不行?

(defun c:test ()
  (setq ent (car (entsel)))
  (setq splineobj (vlax-ename->vla-object ent))
  (setq len (vlax-curve-getDistAtParam
       splineObj
       (vlax-curve-getEndParam splineObj)
     )
  )
  (princ (strcat "曲线长度为:" (rtos len)))
  (princ)
)

至于第二个问题,还是不明白型心指什么,中点???

发表于 2006-2-13 23:12:00 | 显示全部楼层

请教可以使用 boundary 来求质心吗?

看过 xyp_lib 版主用过这方法

  (while (setq pt (getpoint "\n选择区域内一点<退出> : "))
    (command "-boundary" "a" "o" "r" "" pt "")
    (setq s1 (entlast)
   pt (vlax-safearray->list
        (vlax-variant-value
   (vla-get-centroid (vlax-ename->vla-object s1))
        )
      )
    )

但我用的结果好像有问题?

不知道是不是因为我改成

(setq en (car (entsel "\nSelect object:")))
(setq obj (vlax-ename->vla-object en))
(setq pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj)))

使用就不行了呢?

我选取的对象确实是 封闭的 LWPOLYLINE

烦请各位高手可以解答一下~

发表于 2006-2-14 07:48:00 | 显示全部楼层
vla-get-centroid 是对region / 3dsolid物件
 楼主| 发表于 2006-2-14 20:52:00 | 显示全部楼层

我说的型心就是指物体的重量中心,也可以说是重心或质心.对于规则的几何物体,型心就是其长度或面积或体积的中心,如直线的型心是其中点,矩形的型心是其对角线的交点.但对于非规则的物体,其型心就不好求了.一个简单的方法就是将非规则物体分解为若干个规则物体,比如说一段由许多直线组成的多义线可以分解为若干的直线组成,而直线是规则的几何体,型心易求,再通过组合公式就可以计算出整个多义线的型心了.

我现在的困惑就是不知如何判断一个多义线的组成部分是直线还是圆弧,或者是其他图形,然后根据每一段的几何信息来求得重心.我只知道求出多义线各个节点的坐标,但每一段具体是什么图形好像没有相应的VLA函数.请各位高手帮忙出出主意.

boundary 只能用来求规则物体的质心.

发表于 2006-2-14 21:31:00 | 显示全部楼层
相关函数及曾经写过的程序:
  1. (load "xyp_lib.vlx") ;版本 V.20060210
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib")
  5. ■2·在每个程序内增加(load"xyp_lib")
  6. ■3·在command下,输入(load"xyp_lib")
  7. ■4·在菜单.mnl中增加(load"xyp_lib")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]dispbbs.asp?boardID=3&ID=37554&page=1[/url]
  11. |;
  12. ;;;封闭域的形心、惯性矩、惯性积、旋转半径
  13. (defun c:test285 ()
  14.   (cmdlasc0)
  15.   (setvar "osmode" 0)
  16.   (mkla "中心线" 1)
  17.   (while (setq pt (getpoint "\n选择区域内一点<退出> : "))
  18.     (command "-boundary" "a" "o" "r" "" pt "")
  19.     (setq s1 (entlast)
  20.    pt (vlax-safearray->list
  21.         (vlax-variant-value
  22.    (vla-get-centroid (vlax-ename->vla-object s1))
  23.         )
  24.       )
  25.     )
  26.     (XYP_SZX pt (* sc 100))
  27.     (command "MASSPROP" s1 "" "y" "c:/tmp.mpr")
  28.     (mkla "面域标注" 4)
  29.     (write-tmp)
  30.     (redraw)
  31.   )
  32.   (cmdla1)
  33. )
  34. (defun write-tmp ()
  35.   (setq f (open "c:/tmp.mpr" "r"))
  36.   (read-line f)
  37.   (read-line f)
  38.   (read-line f)
  39.   (while (setq txt (read-line f))
  40.     (setq pt (list (car pt) (- (cadr pt) (* sc 800))))
  41.     (xyp-Text pt 1 txt)
  42.   )
  43.   (close f)
  44. )
  45. ;|
  46. 相关vl函数:
  47. AutoLISP 对象名 : (setq s1 (car(entsel)))
  48. VL实体 : (setq Object (vlax-ename->vla-object s1))
  49. 面积 : (vla-get-Area (vlax-ename->vla-object s1))
  50. 周长 : (vla-get-Perimeter (vlax-ename->vla-object s1))
  51. 边界框 : (xyp-get-MinMaxPoint s1 1)
  52.          (xyp-get-MinMaxPoint s1 9)
  53. 质心 : (vlax-safearray->list
  54.         (vlax-variant-value
  55.    (vla-get-Centroid (vlax-ename->vla-object s1))
  56.         )
  57.       )
  58. 惯性矩 : (vlax-safearray->list
  59.         (vlax-variant-value
  60.    (vla-get-MomentOfInertia (vlax-ename->vla-object s1))
  61.         )
  62.       )
  63. 惯性积 : (vla-get-ProductOfInertia (vlax-ename->vla-object s1))
  64. 旋转半径 : (vlax-safearray->list
  65.         (vlax-variant-value
  66.    (vla-get-RadiiOfGyration (vlax-ename->vla-object s1))
  67.         )
  68.       )
  69. 主力矩与质心的 X-Y 方向 : (vlax-safearray->list
  70.         (vlax-variant-value
  71.    (vla-get-PrincipalMoments (vlax-ename->vla-object s1))
  72.         )
  73.       )
  74. |;
发表于 2006-2-14 21:36:00 | 显示全部楼层

to 7楼,为什么不用一下2楼提到的先用region生成面域,再直接读取质心坐标呢。

还有你3楼提到:“主要是任意多义线的型心不好求.我所指的型心是指曲线的型心坐标,是一维的的型心.当多义线的组成部分包含了直线,圆弧以后,型心就不好求了.”

所以我发现你对“质心”的概念还不清楚,事实上我还没听说过“型心”这种叫法。

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

本版积分规则

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

GMT+8, 2025-6-22 05:22 , Processed in 0.181822 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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