QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?+ p4 t1 v6 @* n7 ]8 P

5 }9 ]9 w; g7 p7 |6 ]" B* {7 {2 c[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算( a- w/ Z$ S& c) @" A9 e* [
- Z1 A  J& [% b1 _  V6 e$ ^
要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。4 l. I6 Z( i- I  k2 |
下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit. \* ^6 Q' \5 ^6 e, L

  2. ' H& D- t7 a- K4 J4 K& R) |6 b" D: M
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String! u% J. B# J# ^0 V( ^- T
  4. - m( H1 a) O  r: }
  5. Sub LXCD()
      a: x6 Z: F; E# E$ |3 _
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double
    ' q5 w  l9 M$ B+ O
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double
    8 E* X. \" M& i
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double
    0 Z; C" Y! \: t& s6 d" ~/ A
  9.    
    " f3 N+ A7 X4 T; E) M+ D; N: R
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值8 j7 g' k" ^3 F. l) A
  11.     If 曲线种类 = "" Then 曲线种类 = "A"& P0 l, i: t% {. F
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N": ]7 t, X0 E" a" v, R0 c
  13.    
      B5 K# b! m# _8 n* @2 h. F/ P
  14.     On Error Resume Next
    ( Y* y: Q9 D4 p+ g. d
  15.     With ThisDrawing# m5 ]+ S# f- \; s5 P
  16.         Do
    4 Z& w3 p1 d& J) @
  17.             Err.Clear* A1 |+ ?, m# m8 P5 H5 g7 o$ _  ?
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字
    , `. Y% j0 h, Y& v( p) U
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字8 R7 ~1 R( v0 o3 i3 z
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行
    1 @6 R6 f3 z4 g# \
  21.                 Exit Do
    ' x- Y, ]+ ?) s( x! ^) y% Y  ]5 ~7 @
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    0 A- ]! a! }* s/ U  g* n! t
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字" H0 n2 q, P3 i
  24.                 Select Case 关键字
    1 \; L4 `& g4 B/ C- f9 q6 _, s
  25.                     Case "A"
    1 j: C- D" ^" h0 `
  26.                         曲线种类 = "A"/ L* Y( O0 r( Y/ }1 V" S3 u4 j
  27.                     Case "L": K0 _5 c: P, T# j' g- ~
  28.                         曲线种类 = "L"
    / u: |1 j; v9 _
  29.                     Case "P"' U2 M: M6 f6 E
  30.                         Err.Clear
    $ x! i: V0 h" V, F5 E1 F
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字
    ' o- c2 ]/ W: n+ N
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字
    5 s* R5 k3 e0 R8 L* ]
  33.                         If Err.Number = 0 Then1 _( l( q: N2 K+ o
  34.                             Select Case 关键字$ u  w7 [! e: N- z' f
  35.                                 Case "M"& S* Z* K. d# [% Z6 }
  36.                                     Err.Clear
    ; T1 n) x/ s' E9 K; O' h# O
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数
    % Q, j- b4 N3 h# G
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数) o  z3 H; Y! I% F1 L
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出% C4 i6 }4 r) N3 \6 k* L- V
  40.                                 Case "Y"
    6 j% g/ K8 n* x2 E% ^& X7 q
  41.                                     是否保留曲线 = "Y"+ G' e) ?  R0 G' j$ a9 [3 u  I
  42.                                 Case "N"2 _! O! E$ s; e( P( W) a
  43.                                     是否保留曲线 = "N"
      _) L+ E$ N1 |# y" P
  44.                             End Select
    / n$ B) Q* M6 G1 J& V* S
  45.                         Else '按下Esc退出# ^! E2 D% U7 j! j$ X
  46.                             Exit Sub' Y7 Y  j' d8 O( e. w5 W) u
  47.                         End If1 o2 V& U% z/ R: E7 D) Q0 F$ H
  48.                 End Select/ @! N4 o8 L* h/ h  T; u
  49.             Else '按下Esc退出
    . }! c4 w; P1 @; c& V& d
  50.                 Exit Sub3 F% |$ d+ X. k: D" U
  51.             End If
    * V; j- |: L; q; X* z9 t. ~
  52.         Loop
    / l1 y! [' t2 J0 t& i2 Z; \+ l
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )+ O/ z& O; t8 E) C
  54.         起点极角 = 角度 '调用自定义函数获取角度/ [4 M3 Y) d5 {9 H
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    6 ~3 i5 G0 |3 }+ {$ i2 ]) ^
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )
    ' d! ]! Y9 Y! y8 S( H2 e4 l
  57.         终点极角 = 角度
    9 m$ z0 n2 Q$ \9 F# W
  58.         If Err.Number <> 0 Then Exit Sub* f! x8 ^4 m9 a" ]
  59.         On Error GoTo 10
    3 @# }# b6 v2 n+ W
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角7 V, a; E3 ~- N
  61.             .Utility.InitializeUserInput 2 '规定输入不为0. V; \3 @2 J& O3 N" h% x7 r
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度7 _/ r; B; V' T# z1 G* c. I( b7 ^$ }
  63.         End If
    ! \/ i- o6 e/ \/ z
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数
    ! y1 V7 o2 B2 F. H0 Q
  65.         For 循环变量 = 0 To 线段数量
    % j$ o  j+ x% Q
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)0 X9 c2 E3 a5 n, ~3 z
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度
    ' H* Z, v4 m, v8 p2 [9 i
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角)). V4 D2 x6 y8 R+ k& ^3 D1 n
  69.             Else '按阿基米德螺线计算极径长度9 X$ G. C9 Y" G  l' p: s
  70.                 极径 = 初始极径 * 极角5 t7 A7 I/ h& G. O1 S/ T
  71.             End If6 z4 d2 ?- j% K
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组4 t1 z7 n/ ~2 M$ u/ B6 G
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)
    $ }7 j: y6 O3 K6 w% `; `
  74.         Next6 ]$ h$ J) w6 `4 A) N2 o' B
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线* A# q/ h+ B. V' w- u* ^7 S
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _1 S( J* ?% q( Y
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _1 k9 {: r; j; s' R$ |
  78.             "-------------------------------------" '命令行输出结果
    1 S  u' I2 p. S$ W' E( c
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线
    0 @. \' ~  l+ Q% [* x: Z
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框, p9 ^- l/ X1 b
  81.     End With% p1 l4 j) [# g& b: P# O2 d
  82. 10: End Sub
    ; B) a: {  @+ H
  83. % F, |+ w1 \  k2 ^3 t
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度! w$ }) T9 l6 }* }
  85.     Dim 圆周数量 As Long, 正负数因子 As Double3 z# B% j! E. z2 M  o
  86.     On Error Resume Next- v) }  Y! B) N+ S1 H
  87.     With ThisDrawing
    + c3 A  W  i, X6 L- v0 h6 w
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    + r/ @/ H2 D+ `- b6 r( R7 l
  89.         If Err.Number = 0 Then '用户输入的是实数/ n7 }. v6 l8 s3 \
  90.             If 角度 < 0 Then
    : D. n9 i  R. n' y1 i
  91.                 正负数因子 = -1#
    8 x3 ]8 m  C5 q
  92.                 角度 = -角度2 L/ L6 f- Q( u0 Q* G; {
  93.             Else
    + j$ ?/ ~, Q* o- f
  94.                 正负数因子 = 1#
    $ Z/ W( Q8 R) n. }. F
  95.             End If6 o# E2 j' }+ \5 O1 I; X  z
  96.             圆周数量 = 角度 \ 360 '整除
    ( p* r, \" G, b8 h" g# x
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)
    0 a5 N5 w9 `7 c0 O3 B2 l9 W
  98.             角度 = 角度 * 正负数因子/ g1 E* a# k' Z3 F" F4 G3 l
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    ( A, l- t* R8 c$ r, w2 p9 k& ?+ R
  100.             角度 = 0
    7 q  V1 d& J) _* U! V& l
  101.             Err.Clear
    , Z( X! S, n' X! T5 b
  102.         End If
    2 S( `) j6 L! _, o7 z& ?
  103.     End With
    ' R* n( @, ^/ ]  v2 g
  104. End Function
    . a! I7 [$ n8 Z9 {2 c2 A
复制代码
9 |+ z" b. E, i4 ]% h  r# s
[ 本帖最后由 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
3 F5 f) o- `; ~其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。. z4 G8 ]* U! t9 k/ u9 G
或者下载并解压附件,在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 )

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