QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?
+ V' v! q4 {0 W0 E+ C0 b7 [
2 i9 }" ^' z: I+ {% R: h* }  G[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算/ q" a" q1 Q1 n+ Z) @, l0 s
5 p4 t7 D6 K! ^4 O. _- z# o0 ~
要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。
  l( v9 `- k& r4 b. v; G下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit
      ?8 a4 z; H" E/ H' A  a7 o: Q

  2.   P7 g/ W4 G8 d9 {* z" {7 V( O
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String
    / N* t6 p2 Q+ p  e7 x7 `
  4. : K$ J! V0 _6 c* G; I: I
  5. Sub LXCD()
    & o: b3 |4 N( t: o
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double/ Q2 @* _8 Y3 a& B' p" \$ H/ j
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double( S9 [1 P- N$ o" u% g. R
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double$ `. R  p, L1 d; w0 r
  9.     8 }" V. j' R. ^6 e1 u
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值% A6 w8 A4 d# o& c
  11.     If 曲线种类 = "" Then 曲线种类 = "A"7 `2 P: J$ n6 B/ _# n' e' g0 Z
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"
      R+ M2 V! }8 n, m- Q; M  E
  13.     ' U, ]$ A3 g$ P
  14.     On Error Resume Next1 I" {. _0 m+ X. d* x6 G& r5 |, X
  15.     With ThisDrawing) R! e; N- P* B9 v. [- U$ H# M! n
  16.         Do
    " N7 Y: U& c: H1 u2 N
  17.             Err.Clear/ l+ A0 j. A3 _% V( J9 ?
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字& Q: G7 |9 l9 L4 |# p, \" e/ C
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字
    ) ]6 ]9 W# p$ c( F! k+ {* o" Z
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行# c. \& h; T  e
  21.                 Exit Do5 |' h* t$ @8 Y0 @8 }7 U
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字$ n4 E. x" c9 \( H( n2 L
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字8 Z  E% B: q/ S1 h. A
  24.                 Select Case 关键字& X% e. h& b; W
  25.                     Case "A"# I* G) o. t/ x
  26.                         曲线种类 = "A"
    / }! N% S' N8 w/ L/ h
  27.                     Case "L"
    1 @5 C* V$ x6 Y
  28.                         曲线种类 = "L"
    * A' j: e2 L/ e3 ~: m1 _
  29.                     Case "P"- U! P7 r) E: |9 Y
  30.                         Err.Clear
    & n: R/ Z. T9 W% G% a
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字! L* Y8 V2 Z: k' S$ g5 K
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字- l: {4 M1 r3 e0 K5 ~" T
  33.                         If Err.Number = 0 Then
    6 I8 |$ I, U( V; {( m' k
  34.                             Select Case 关键字
    ; R$ q& c, ?4 Y" \: J  i0 r$ y! L8 \2 G
  35.                                 Case "M"
    0 o; ~' {+ @/ J  l. }" [- h
  36.                                     Err.Clear
    + O' p, W+ ]1 U  S
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数2 ]' {4 S) g( R/ U
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数
    . U8 G0 I/ U$ Z( i6 q& {
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出2 a: d$ S' @4 [2 ?
  40.                                 Case "Y"3 p! N9 u8 H8 j% m" C7 d$ U: c
  41.                                     是否保留曲线 = "Y"
    $ I! R( U* |/ d( o2 I, ]4 t3 M
  42.                                 Case "N"" S& D6 Z" x+ G! f- F( U* [
  43.                                     是否保留曲线 = "N"
    . h8 m3 A8 F6 X
  44.                             End Select& o  l/ t! Z3 _7 x0 p* {
  45.                         Else '按下Esc退出
    ( p7 B: N7 m5 }" ?" j  E3 e
  46.                             Exit Sub' }* P3 A3 M- _4 B0 j8 l. p$ O% \
  47.                         End If' a* s; x/ Z$ @0 {! X
  48.                 End Select
    3 r+ D& X6 r! G- Z
  49.             Else '按下Esc退出9 e- c" q3 b7 |/ y$ E6 ~; Z
  50.                 Exit Sub) r; O/ c8 R4 T
  51.             End If
    3 N* M/ W6 X2 v9 m
  52.         Loop% A  Q# i$ z. R) O7 p, j5 o
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )
    - J. C- l7 T2 M9 l! D
  54.         起点极角 = 角度 '调用自定义函数获取角度8 A/ O* h* }. u4 Q) o
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    ' E" _, H9 X; v5 V# k
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )
    1 [! V3 e. j: Z( P; i, y  I
  57.         终点极角 = 角度
    6 M( w5 J* n* A' _1 U+ Q. n) Q! H
  58.         If Err.Number <> 0 Then Exit Sub
    ( Q( _% E9 ?+ p1 ^- C- J
  59.         On Error GoTo 10& J  w, E$ R# a
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角
    3 `, O8 _; E. D, q7 P2 J, u) B
  61.             .Utility.InitializeUserInput 2 '规定输入不为07 C- }+ j) b3 M  p7 l* [
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度3 V/ k4 h3 E1 R
  63.         End If4 @* q! N) W4 ~# e5 j1 }
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数3 t: `* W/ D4 I: V1 O
  65.         For 循环变量 = 0 To 线段数量9 M$ U: D- i8 Q: X3 e6 [
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)
    1 B; n5 N/ k" M& {
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度  L- l3 H) j: ?6 v
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))
    $ S8 C) |; d3 ?
  69.             Else '按阿基米德螺线计算极径长度: v) A# g$ e/ w0 T+ I5 e5 m
  70.                 极径 = 初始极径 * 极角
    & T+ m+ L/ ]! H5 O. X1 F% ]
  71.             End If
    - m& Z; D2 m2 K; o5 E8 ?
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组
    : y! F) f0 E- r) A5 |+ ~' R
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)
    ; Y* ]" c4 ?  e# O2 M  V1 n: V" ~
  74.         Next  m9 b4 C! }# J1 O
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线0 r+ {& _& W+ O% _  d
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _2 E- c3 R" r! e- _& O4 e+ g: P1 A
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _& A0 p& E8 E- |
  78.             "-------------------------------------" '命令行输出结果
    , Q; {- R2 [' L5 \- u( l
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线
    8 ~$ w, |/ a( \, d' X% z
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框4 z9 i" |5 @2 b- Y6 q
  81.     End With& W. D6 K0 u+ w5 }' ?# I& _
  82. 10: End Sub
    3 a, ~% b. H& b& \+ Q: J' [
  83. / ?7 F8 B9 G  A+ g& v
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度
    " s! u  w& g6 ?! p; [0 v
  85.     Dim 圆周数量 As Long, 正负数因子 As Double
    ' \' z  A5 b& I" R
  86.     On Error Resume Next
    ; b& E, _  `! S# q7 T
  87.     With ThisDrawing. U5 w% p8 b1 l
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    0 o, y( Q. `6 p7 Q3 r" O
  89.         If Err.Number = 0 Then '用户输入的是实数
    ) |" Z! H! T) C
  90.             If 角度 < 0 Then
    8 |3 k1 F! O9 r3 ?& W" s2 H
  91.                 正负数因子 = -1#+ x- p: j) o! i& @4 e0 C* U
  92.                 角度 = -角度
    7 [) ^, g! M8 p( t+ r7 E/ @
  93.             Else6 h" I; _& I9 G, a8 o$ Q* y
  94.                 正负数因子 = 1#7 v$ o  B& O, J9 x2 K2 l
  95.             End If
    7 ~& ]- |3 P# Y; h) o' j
  96.             圆周数量 = 角度 \ 360 '整除8 ~( V# C) D+ G2 _  I
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)& X) f6 e# `5 N) K. ?# \, q5 U* H
  98.             角度 = 角度 * 正负数因子
      P; m* {& e( D/ r. s# ?  |
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字4 Q/ ?2 Q; u0 z* M  H! S
  100.             角度 = 0
    $ f/ Z- }- X5 s& u/ F1 v
  101.             Err.Clear, l: `' ^4 x  c$ X) H" W
  102.         End If
    3 T$ [+ w- v# E9 x7 c- w
  103.     End With' S. f- c8 b3 l5 R
  104. End Function% M% U# k2 X4 e! o& H  |& I1 U1 N
复制代码
6 \; c* D; x6 L6 E, O' 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。& u1 d  J2 F; |3 M& V; E
其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。
3 w+ L+ x+ C# M' W2 `或者下载并解压附件,在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 )

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