QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?
, H' C1 s% _, `8 v1 C* V' v. @  K# n3 ~9 a  W$ c
[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算/ w3 X2 T3 M& J) |9 J
: M  x/ \4 q$ E' f3 C
要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。1 ^8 X% v  F1 v! d
下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit
    - B3 `3 m: y1 I6 m0 T
  2. $ f6 r7 @$ d& W' T
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String
    + Z. _) n% K% D3 V  }) i
  4. * M7 u: ?+ f: g( B! a
  5. Sub LXCD()
    1 O6 J: b- ~( A2 q2 N' I
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double  P* o1 }9 G5 g- a: [0 S
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double- o: c' X3 T- i2 h; A% ^. l; t
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double
    * f0 J8 O3 \* Q9 G
  9.    
    4 H% G! `! ^% b
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值5 R+ z. c/ W! L! s( ~! V9 E% W
  11.     If 曲线种类 = "" Then 曲线种类 = "A"/ J$ ^, ?1 `# u/ T1 }0 }1 {$ S
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"7 |# `. U3 V. D5 o
  13.     4 r7 U0 A) C+ P1 ?2 q, ~
  14.     On Error Resume Next* L3 ?* ^1 X$ g" @9 o
  15.     With ThisDrawing
    9 l$ ]' ^+ O. M3 v% m
  16.         Do
    3 D, q/ |* m/ }6 M' H, ^
  17.             Err.Clear
    - \; _1 ]0 [* |
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字! ^# m" f) i/ ?
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字
    $ D# Z* P9 f5 l. {0 l$ q
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行
    6 W0 X" q' a4 {  u9 U
  21.                 Exit Do, ^" n( m* A5 M3 N# m
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字: a) j1 p) f/ b; @# b$ d# y* v; A
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字: ]6 E0 D" N9 g
  24.                 Select Case 关键字
    6 @, {1 H, g0 O: n6 T+ |/ i
  25.                     Case "A"
      J1 c: U2 D, P" _6 A/ ]# r
  26.                         曲线种类 = "A"
    $ x8 L# t. O* R# L8 o! ~
  27.                     Case "L"* P9 J) D5 B5 y5 f, ?6 J! o
  28.                         曲线种类 = "L"/ H& e  i1 I# |9 R
  29.                     Case "P"
    ; ^+ i8 [! X2 A$ M4 A9 }- y
  30.                         Err.Clear
    $ D) M9 J. j6 g
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字
    $ b& @. a# ^. k
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字
    - O/ d  K3 h5 ^8 Q
  33.                         If Err.Number = 0 Then3 P$ {3 V" a5 g4 @
  34.                             Select Case 关键字* A. \% R6 ~- Z$ e" g  k- B8 x& v' D
  35.                                 Case "M"2 Z2 u0 M* ?/ K+ Z! W- S' ~" l5 l1 D  Z
  36.                                     Err.Clear% ]  V% k+ i! E& O
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数8 c1 _( T4 s5 T5 ?
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数7 ?0 _( d( Z6 s0 l9 f
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出1 u2 b7 k$ P3 Q
  40.                                 Case "Y"6 p" |. k; [& `! W8 W; f8 Y; ^6 x
  41.                                     是否保留曲线 = "Y": D4 {1 f+ d7 `; U/ L2 M
  42.                                 Case "N"
    ' \( n: Q- K" \
  43.                                     是否保留曲线 = "N"; A, A4 ?' R. t& d
  44.                             End Select* V+ F1 C* [+ ^% E( U3 s" d8 y( e
  45.                         Else '按下Esc退出
    / H; }3 Y6 k5 A5 B1 x
  46.                             Exit Sub
    7 W) N! s! Z& m* t' }2 I* K
  47.                         End If6 |* W2 ~. t8 O  S& R3 @
  48.                 End Select
    - X3 t* r; R- n! V; K
  49.             Else '按下Esc退出$ v: n9 E. H# [
  50.                 Exit Sub5 @9 @/ |* z7 E
  51.             End If
    ( [6 F$ O5 B/ k7 T" c: A& W
  52.         Loop. [6 }/ G$ O, ]7 [8 y+ I% w
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )
    4 S- y$ ^9 }# L6 j
  54.         起点极角 = 角度 '调用自定义函数获取角度
    * k' X( ]  O% a+ y+ g9 x
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    - V. {, I6 S: n4 o. q& s+ a# l
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )0 f/ l$ r6 e, o  w
  57.         终点极角 = 角度) M, c" g: @4 E+ s3 _( ^
  58.         If Err.Number <> 0 Then Exit Sub
    & ?- h3 f( J) ]. O/ S
  59.         On Error GoTo 10
      E+ i# E) L& y; A! O+ c
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角' m' ^2 V+ n8 l, X# K9 ~$ M
  61.             .Utility.InitializeUserInput 2 '规定输入不为05 i# V' a$ h& ^: T0 ^+ P
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度5 B0 Q: ~( F; S. W/ Q
  63.         End If
    ; S1 l6 X. `6 Z4 y/ }
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数# c) J0 c" [: x+ L4 E7 w
  65.         For 循环变量 = 0 To 线段数量
    7 n* m% `# _8 j+ ~* P! b
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)" b9 ]  \/ D+ t5 `/ {
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度5 {8 s/ K* \* O) f% S
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))% \, L5 M* w6 |3 [6 M& u) p
  69.             Else '按阿基米德螺线计算极径长度
      A' @+ P: e3 K3 k, l3 b4 }
  70.                 极径 = 初始极径 * 极角
    ! J4 x5 y" b6 k" P
  71.             End If4 e( T. o: Y* c5 G4 P0 w2 ]. g4 D
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组6 D9 @' w& Q4 O& n8 B
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)! T* m; g/ |* V* U  ]
  74.         Next
    9 O5 X& _6 C' M5 m
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线
    5 w6 @( Y+ v/ g2 B2 [
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _# {4 L2 ^9 j* G: t
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _
    " l) [2 F- W6 ^" ]6 s- x
  78.             "-------------------------------------" '命令行输出结果8 a. v1 Z' V9 p4 {2 Q) Q& f& Y
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线
      {% T' }4 q1 h% ~
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框+ H  L. L( N! @9 T
  81.     End With
    + f+ J2 y" l* }$ O/ E; Q0 E, N, J: T+ E
  82. 10: End Sub
    3 `0 }# F6 Z+ H3 n, x. {
  83. - ]1 K; N1 T- w' w4 J" |# B& t
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度3 p0 Y. T7 p6 C8 h& x( i" F4 F
  85.     Dim 圆周数量 As Long, 正负数因子 As Double( J& g: ?# f& Y! M. u; D$ m4 P5 |6 e
  86.     On Error Resume Next# y* _6 f5 m, U+ D1 h' h1 J& _% H
  87.     With ThisDrawing
    4 J- v; {, M* ^
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    1 z0 L) J5 x4 {3 `2 g2 A7 z
  89.         If Err.Number = 0 Then '用户输入的是实数
    % C* R- Z4 ]$ ]
  90.             If 角度 < 0 Then
    ) }  L7 k1 ^  \% l5 H1 x
  91.                 正负数因子 = -1#5 W6 b5 E2 V$ c& Q# b
  92.                 角度 = -角度
    6 r5 _7 ~' U- M) u- U  W, K
  93.             Else
    ' G& o, d9 ^; g. X  [$ P
  94.                 正负数因子 = 1#
    $ _# M) |4 u$ R3 E% R5 Q
  95.             End If7 B: u! l; C3 `* w
  96.             圆周数量 = 角度 \ 360 '整除5 L: _& z/ Z+ g  L; S
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees): `0 U3 `; W; Q" P% G  T5 v
  98.             角度 = 角度 * 正负数因子; s% Q5 ]( P2 L+ X% u# a
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    & `9 T- V! p! a. ?8 i
  100.             角度 = 0
    5 M% A9 ^! T4 E. T! o4 h! x
  101.             Err.Clear9 _6 K" s4 W1 @& m( Q7 i
  102.         End If2 Y6 {9 `: ~* C- R! w0 t. I
  103.     End With& H+ o1 d5 R# b6 M% E
  104. End Function5 V, n( P+ S0 r2 @2 P
复制代码
. U* u6 j& S2 b1 l( T: v& ~  ]' z
[ 本帖最后由 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
$ u/ H9 o3 s6 l: U9 B其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。
) x; @* k3 A4 V+ Y, n7 D或者下载并解压附件,在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 )

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