QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?# q& I: t7 R" C% A/ u7 ^' r, n

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

螺旋线的计算

螺旋线的计算
9 _0 p2 \. U, m1 c/ Z! w- o+ V6 b# l2 ^  P. A( q$ d' u& V: a
要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。
% Q: k* T$ ^0 C: Q& h下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit$ F; W& s3 [) h

  2. ! h# ?1 F/ Y; v, ~( D0 Y: ^) j
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String
    9 a8 M. x9 z6 e/ @1 M$ O
  4. : p# M& L$ ]. K
  5. Sub LXCD()+ _* U9 P  b/ N- o! L: T& j
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double
    0 Y2 Z! R4 w! V4 H$ d
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double$ s1 a$ s* K- {; G- ^( S6 ?
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double" x- O; y( E7 }% u2 H
  9.    
    ) @; ~" j; p& ]. r: R* {
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值! P  l+ G* V* V' m" A" h3 q
  11.     If 曲线种类 = "" Then 曲线种类 = "A"; b4 \8 _; m0 }* Q; \- ^
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"
    - |* S9 A2 |  ^4 b) U; N) F* L
  13.    
    ' n3 e+ s* X. g6 V; T3 N$ Q
  14.     On Error Resume Next3 N# d  h' a+ W& [% \+ Y
  15.     With ThisDrawing
    5 g" Y  x8 j  [* D' L
  16.         Do
    ; B) k/ q8 s( u8 e) Q
  17.             Err.Clear
      {6 w* T9 o3 D7 |$ ]
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字3 n5 Y5 ?0 p# _/ I: X! L6 y2 @
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字
    - J$ K6 t2 V) s) P
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行5 [0 K4 L/ h2 d1 D/ G- h$ j
  21.                 Exit Do, j8 b& Y5 S8 R, U/ G
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    % _( L3 H$ [$ p" F. ?" ]
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字
    % T. ~0 u" u4 Y
  24.                 Select Case 关键字
    8 ?" i0 h/ x" T! w0 n9 [' [
  25.                     Case "A"; r, G' z( B9 x4 V4 h* e
  26.                         曲线种类 = "A"/ d6 C$ v0 a* N& f7 V
  27.                     Case "L"
    6 j/ r2 Z; d; p7 A8 L" P: S
  28.                         曲线种类 = "L"7 O& }" F- i1 f' }
  29.                     Case "P"; x6 o4 ^- W+ w% U4 B1 {, t+ c# v
  30.                         Err.Clear8 V% o- k+ F5 Y& b& n
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字% O' x! q0 P7 K' H/ x; R4 a9 ?  k
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字% r1 i3 o% i" Y! i$ A! ~( s/ u& }* M
  33.                         If Err.Number = 0 Then, s, K# C( V' J7 H( F
  34.                             Select Case 关键字
    0 H' o+ ~: p/ t' D4 s
  35.                                 Case "M"
    % H' i, m9 w; p6 s
  36.                                     Err.Clear
    + v: b1 u5 \1 p3 I" J) d* a5 I
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数9 \2 Z2 T7 i: }. ?5 Z3 m5 }  }* _
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数& z. M# j- i/ w! I
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出& `, l2 J- d9 A" Q# s
  40.                                 Case "Y"
    8 U8 Y" g+ L. U" W6 n- x
  41.                                     是否保留曲线 = "Y"
    ! P5 s3 H, n, _
  42.                                 Case "N"
    # ]$ F3 W, F: O4 F- j! C+ X
  43.                                     是否保留曲线 = "N"& A8 {( {, Q% n, z3 L  Z% K
  44.                             End Select) P( F$ L( w: B4 s5 `
  45.                         Else '按下Esc退出
    - m4 u* N  a/ q
  46.                             Exit Sub
    : x/ [" s' {% {2 S* H# z$ i. m4 r
  47.                         End If+ t3 p5 ]8 R. n/ w' e
  48.                 End Select. Y% C5 o" _% V1 f- X
  49.             Else '按下Esc退出
    1 t& }( }& ^0 u: {" q" t
  50.                 Exit Sub- z; a( _& @6 w) d  f/ b5 v- \' e
  51.             End If0 K. D# f' I; L: l
  52.         Loop
    6 x! L) g; r& y: @1 L/ h
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )
    9 P, z6 V' H: ^
  54.         起点极角 = 角度 '调用自定义函数获取角度
    5 j# u2 r+ A' s$ [* [. A$ F
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    $ |  V0 {" g! j! J/ E& r
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )
    # |& P; j( k4 t% c4 h
  57.         终点极角 = 角度
    ; v- G9 D$ A5 `5 v; |- U/ P
  58.         If Err.Number <> 0 Then Exit Sub
    : ?0 k# D& |! o& j$ S$ o7 b
  59.         On Error GoTo 10
    & d1 L1 k- k2 v3 Q* Q
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角% {. E3 Z- _: I6 A
  61.             .Utility.InitializeUserInput 2 '规定输入不为0
    7 v8 `( y( R# S5 C
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度0 ^( T9 M+ @) Y" u: h
  63.         End If. @) r2 P: K3 A* x4 Y
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数
    ; c. \7 |' Q3 M7 `2 f
  65.         For 循环变量 = 0 To 线段数量
    & z, y, ~5 G& k$ X7 T
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)% t8 s9 [0 C% p. S8 t7 \2 `
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度
    9 W3 S+ i' e6 J3 h' F4 e
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))/ a+ @0 R4 a6 Y; i0 D& B
  69.             Else '按阿基米德螺线计算极径长度
    " {) ]/ d4 H8 O
  70.                 极径 = 初始极径 * 极角
    - t9 o( c' C% ]" g  b6 A4 r
  71.             End If
    - T4 i3 ?/ B9 t+ F1 m1 q* ^! J
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组
    4 N- _* h  \2 Z2 q+ m3 u5 Y
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)
    1 y4 R8 ^! i# _  V/ `* G+ J9 B
  74.         Next
    * Q# S) x6 ^  \7 I' o9 K
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线
    7 b" @1 }3 \7 V) W5 l
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _
    4 X2 E$ _# g. k" _0 }) j# G) n
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _
    9 A1 @7 p, U& x$ y  w
  78.             "-------------------------------------" '命令行输出结果) H, x2 w' k8 G9 z) e
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线' A. C. C$ Q3 S
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框
    ( x4 t- L# c6 c& D! v. U! k
  81.     End With
    6 B( c0 Q) b: s% E5 `
  82. 10: End Sub( ^" W& P/ h& E7 W2 k

  83. $ p9 a8 i5 s1 l1 m3 I, S3 O1 ]% \
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度
    ( y) L7 x1 r$ X+ p0 Z. y
  85.     Dim 圆周数量 As Long, 正负数因子 As Double
    - Z9 x; u, A% W/ p  j6 j/ A0 F
  86.     On Error Resume Next
    4 E9 |7 i: p' u
  87.     With ThisDrawing
    $ b+ p& x3 B9 t2 ^& I+ t7 r
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    & E. V: E7 B% t" Q
  89.         If Err.Number = 0 Then '用户输入的是实数
    8 G) k! x7 Q' U6 F
  90.             If 角度 < 0 Then. }% }$ I. v6 ]
  91.                 正负数因子 = -1## e( P2 o$ H* x
  92.                 角度 = -角度
    + P$ ]: i7 D" @$ _" H% t, ~3 f
  93.             Else& O! [8 A! i6 f6 N; `- L! n3 F
  94.                 正负数因子 = 1#
    * t# A( N: l" T9 s" s
  95.             End If1 y; m# J" M5 a& O
  96.             圆周数量 = 角度 \ 360 '整除
    2 {9 E4 p& \6 t" ~0 }2 r! n
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)
    & d8 E; S* s8 }, ]6 C- Y
  98.             角度 = 角度 * 正负数因子& p% h7 L9 {1 R: x  H" ?$ Y! o# G; I
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字/ u/ k- b+ Y# f. k' N$ t/ }8 w0 f. S
  100.             角度 = 0
    $ L7 s  `* S# ~- j% ?. b) u
  101.             Err.Clear
    + A3 L/ N" [  x0 \$ Z3 c" b
  102.         End If
    5 Q% Y2 A& R4 s
  103.     End With$ j5 _2 ?- r0 Q- K  o7 L
  104. End Function/ u0 i  O& x/ z% E9 X; E
复制代码

$ J. M1 U8 S  I( p[ 本帖最后由 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
' D0 H  p- D+ p. n$ a8 I其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。
# X4 y4 }' X- `& P  O+ z4 E或者下载并解压附件,在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 )

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