QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4412|回复: 11
收起左侧

[已解决] 怎么计算螺旋体的长度?

[复制链接]
发表于 2008-10-15 07:10:54 | 显示全部楼层 |阅读模式 来自: 美国

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
用什么方法可以求出平面螺旋体的长度?; g5 M6 \( C) o; D. K( d$ n1 G; T5 ]
, m" f; J' r5 O. `$ M
[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算$ r- t8 U; {! q- {; ^2 R: m
( j# p* p* C) d
要合成一条线才可以
1.gif

评分

参与人数 1三维币 +5 收起 理由
2005llnn + 5 应助

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。, O4 m/ V4 n0 W: _1 S
下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit% \3 @; u* B& P/ }5 b/ O5 y. q

  2. 9 q! M( c6 H7 e2 o! o+ K
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String* Y9 M: d( M! u1 e

  4. 7 D8 e/ s0 D5 t- a* x7 D( d- b
  5. Sub LXCD()
    $ N" `6 t( ~" Q$ R/ ], ^+ ~* C, {
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double
    ) k* p1 w( R* ?+ w: J  q$ r& J' X
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double
    8 m! o& i- Y  C; N
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double$ @" j' T; I7 Q- f7 ~7 c8 \* @
  9.    
    5 O: O7 b" O7 d4 ^* N$ l  t
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值0 c9 l8 M' {6 R3 b' n' s9 B8 Y+ ~
  11.     If 曲线种类 = "" Then 曲线种类 = "A"
    ( {% L5 c" }. n& H& X2 I
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"
    " B1 C  t: K' v3 Q! O2 g6 I
  13.    
    " V, C+ v6 l( [  ]
  14.     On Error Resume Next7 C' n8 d! t& m# I$ \5 Q+ q# P
  15.     With ThisDrawing
    . J2 }' L# G  n4 I$ [; {4 F" V
  16.         Do' C' _8 V; s  B" ^: `# Z9 \9 Y% X
  17.             Err.Clear
    * `- C$ L" F) m( n4 b( z3 H$ ?' v
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字; l4 n8 d0 E3 L2 L% ]" `
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字$ K( j: d5 w! R  Y$ ^- w0 E6 f' @1 k
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行+ _* j! |/ d4 _6 c* w: `8 l
  21.                 Exit Do! n- t9 x& B9 ^. w
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字0 K* c, C& G' ^2 I+ @9 F
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字
      T3 x+ R  D& p2 F: O
  24.                 Select Case 关键字
    / ~/ C  T) m# ?: }7 T
  25.                     Case "A"
    : b9 u8 K, l4 I- k, `
  26.                         曲线种类 = "A"
    & J/ L8 H. r" g5 _2 s
  27.                     Case "L"
    * T& h/ M; L* h
  28.                         曲线种类 = "L"1 T! C- w8 S4 L9 w3 e5 V, C1 r
  29.                     Case "P"
    / j+ z2 i2 G6 J( k% }) u/ P
  30.                         Err.Clear/ ], A  G3 e+ b+ [( v
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字  b$ R4 ]0 T0 N1 W& T
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字
    0 j/ x7 o. U  E7 g& w+ H0 V4 J
  33.                         If Err.Number = 0 Then
    . A: \! n7 ^9 @( x) R
  34.                             Select Case 关键字  H2 }7 R6 P. ]/ U! Z
  35.                                 Case "M"8 S; O) B: k2 W6 ?, h& w: L7 p
  36.                                     Err.Clear0 ]: r  a! C+ X" A
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数2 I" B' j4 G; F' I
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数! G9 f# F3 f9 O' E0 \9 |' @
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出$ J. \7 f1 |# r4 X& t2 T/ f/ D
  40.                                 Case "Y"/ s8 _7 _  Y# m( Y' c
  41.                                     是否保留曲线 = "Y"
    ! T4 y& s/ Y/ I( g- v5 K9 o* i
  42.                                 Case "N"
    3 b- ?' J. W/ B$ b4 `- D9 Q
  43.                                     是否保留曲线 = "N"- t6 W; j3 Q' `) ~' o
  44.                             End Select
    ! C& k; P3 E! f6 x  W! n+ v
  45.                         Else '按下Esc退出, [# h" m4 Z  C( K: T
  46.                             Exit Sub$ ]/ V( p+ \; ?' v
  47.                         End If
    2 v& A6 d& K7 T# Q- ~
  48.                 End Select- ?) f6 |. y( K7 L& }7 A& i
  49.             Else '按下Esc退出) `# Y4 b- U& t8 u
  50.                 Exit Sub
    $ k; c" W6 J. `5 c
  51.             End If/ s/ D9 H' V2 F7 J3 s
  52.         Loop
    " U3 s9 Y. M7 |1 |# E
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )' d( u7 W( V6 q1 H2 P7 e) n" X
  54.         起点极角 = 角度 '调用自定义函数获取角度% V% R0 o4 h" i+ _& Z$ Z5 y  f5 ~2 v
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出/ l' L" a# @1 I: Y
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )
    * O  s* E( Z; E1 |% ?, i
  57.         终点极角 = 角度/ Y; b' i1 N, s8 N) y4 @
  58.         If Err.Number <> 0 Then Exit Sub
    7 u4 o* r3 V/ Q0 S
  59.         On Error GoTo 10
    & |9 J8 s: N6 w  N( a
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角
    5 F0 k6 E3 I. n
  61.             .Utility.InitializeUserInput 2 '规定输入不为0
    ! ]) }$ f" j# F, I
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度
    * b/ D* M" @1 i- ]9 P1 a# d
  63.         End If/ o7 I; A: P$ e* G1 W5 B
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数
    2 B( }8 ]$ v  M
  65.         For 循环变量 = 0 To 线段数量
    $ U- y2 H: k0 Y- R: g/ e7 d; P1 d
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)
    / N5 {$ E* t, f5 j4 ]
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度% b- ]4 Y" n8 K8 e+ e
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))0 A9 @7 e" R& z8 Q0 I1 w
  69.             Else '按阿基米德螺线计算极径长度
    3 l9 ~+ {! c0 c- |
  70.                 极径 = 初始极径 * 极角, s' j' |" E  I+ T, O' [) h% h
  71.             End If: j. d. Y- V! t8 L# ]5 g/ ]
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组( V; n/ p+ y. Z& d  S+ u
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)7 a( e8 F; {& i2 K: [: u
  74.         Next4 h/ d. p; V5 c0 F7 i6 l
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线  Y$ r+ w" Q2 D+ z
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _
    + D. }, I* L: i  C
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _0 b" _1 `" [! r- |: n! y) [. L1 O) R
  78.             "-------------------------------------" '命令行输出结果' q! `7 j: q' I
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线0 t1 v5 u; c4 _+ E1 g1 {6 R
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框
    * {( m. Y8 Y" j: @1 w
  81.     End With8 I: h. A8 ]8 Y3 \0 D  H3 F0 }
  82. 10: End Sub9 E: f4 T+ ]5 ?, `$ a
  83. # R9 b6 Z5 @" p9 K
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度/ O. h2 e7 ^' x7 ?
  85.     Dim 圆周数量 As Long, 正负数因子 As Double
    2 m1 j) a, M/ k% Q
  86.     On Error Resume Next
    4 N8 E, z. h* J  `
  87.     With ThisDrawing
    ! r8 e8 T, `" h3 [+ P: {) `1 Q8 G+ o; p
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    5 |# l/ q! r1 ^+ V6 s
  89.         If Err.Number = 0 Then '用户输入的是实数
    3 e$ G0 {+ q$ G. x. M
  90.             If 角度 < 0 Then2 t- m$ J- b! T, }
  91.                 正负数因子 = -1#) O8 ?$ ~' L5 ?" F
  92.                 角度 = -角度: Y* j3 ?- V3 L& D! {# g0 |- ^
  93.             Else1 B' n9 P: c3 B
  94.                 正负数因子 = 1#
    - f! C8 q, u4 l) }; v7 {8 `8 S: L
  95.             End If
    & y! A5 B  C. O3 q  g0 N
  96.             圆周数量 = 角度 \ 360 '整除
    6 T' _7 r3 a% W$ M" N" E- d
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)
    , `9 k4 l5 H8 z' Y3 }) r9 l
  98.             角度 = 角度 * 正负数因子0 H" t2 Z+ V0 d2 @% L" A
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字% {/ k: \  p1 {" i& U# ]6 g. Z
  100.             角度 = 0( Y8 R, c% W! v
  101.             Err.Clear
    0 S" C$ i2 r$ L
  102.         End If
    4 C! E2 p% o# Y7 @* e+ K
  103.     End With
    5 Z1 i  j6 i8 H6 [* W
  104. End Function! \5 |, ^# ?+ _( }' J# K7 Y+ w  z
复制代码

4 s; g- b* z* }* j# w  ?[ 本帖最后由 woaishuijia 于 2008-10-29 06:37 编辑 ]

LXCD.rar

10.03 KB, 下载次数: 31

LXCD(适用于英文版).rar

6.65 KB, 下载次数: 6

评分

参与人数 1三维币 +5 收起 理由
2005llnn + 5 应助

查看全部评分

发表于 2008-10-15 21:05:48 | 显示全部楼层 来自: 中国上海
好复杂啊,看不懂
 楼主| 发表于 2008-10-16 11:02:16 | 显示全部楼层 来自: 美国

回复 3# gaoweihe 的帖子

谢谢.照你的方法求不出来呀,我把这个螺旋体的图放上来了.
 楼主| 发表于 2008-10-16 11:07:10 | 显示全部楼层 来自: 美国

回复 4# woaishuijia 的帖子

谢谢你的回复,这个方法太复杂了,没有其他法子了吗?
发表于 2008-10-16 12:04:23 | 显示全部楼层 来自: 中国
用2007以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。; {  [7 |5 n. C: I
其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。
0 w" \' a* Z" o或者下载并解压附件,在CAD图形界面键入“VBALOAD”(“APPLOAD”也行),加载程序,“Alt+F8”、“Alt+R”,按命令行提示操作即可。

评分

参与人数 1三维币 +5 收起 理由
2005llnn + 5 应助

查看全部评分

 楼主| 发表于 2008-10-22 00:02:47 | 显示全部楼层 来自: 美国
看不到所有的回贴,是网络问题,还是这些贴子有时效性呀?
发表于 2008-10-22 08:31:38 | 显示全部楼层 来自: 中国安徽合肥
初学,有些看不懂,不知道螺旋线是怎么画出来的。
发表于 2010-8-4 20:59:55 | 显示全部楼层 来自: 中国四川成都
说的很好,谢谢了。
发表于 2011-10-24 13:15:33 | 显示全部楼层 来自: 中国内蒙古包头
不错的哦,我很受益啊,谢谢楼主。谢谢楼主。谢谢楼主。谢谢楼主。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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