QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?
$ Z; n* z" a  ^3 n% }3 D! w: H: S+ p6 k3 {
[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算
" q( g  T# v; X. A4 O, L$ L" S. e# }" J( A/ o% ]
要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。
! V3 c' \5 U8 o0 I下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit
    0 j8 u2 W& _& J6 c" I( }* @

  2. 4 g4 c) U$ @8 n' ^& \
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String  i/ ^. ?. I9 L1 t  D+ a6 j# {9 _

  4. 4 D4 Y" ~  f& u. q# _, f- R
  5. Sub LXCD()
    7 q# m0 s8 z4 N. z* n1 h. k
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double% G6 v2 |5 N; o4 w! j8 m. W
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double/ C) }6 z7 n5 p& A( t; g1 L
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double6 o. e3 u) i5 }2 |
  9.     % C7 T( q' k& A6 D
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值* \! d( d8 M$ f/ b$ F' {
  11.     If 曲线种类 = "" Then 曲线种类 = "A"& R, g# n& C" I! C% B# A7 ~
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"  K" z- K# _6 g8 `5 y
  13.    
    6 |/ g4 P+ e  D0 ~0 R- K8 ^- I$ j+ A
  14.     On Error Resume Next1 p9 g) i9 K$ S: m( ^
  15.     With ThisDrawing4 m/ J' x% [7 M+ O! E2 H) E
  16.         Do4 g6 G5 ^8 T8 g% E2 f. b
  17.             Err.Clear
    & a0 j; F# x0 o$ H% Y0 l
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字
    $ a! y" K2 }& J" i7 {- f
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字- i# l3 ^) a  J2 w
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行- |' z) v" X6 v6 j
  21.                 Exit Do
    . R% e% V+ l( e2 T0 j+ v. ?
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    2 a5 R! U( F6 O$ u
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字8 A! \$ Q: R* \" U
  24.                 Select Case 关键字
    & I) }: X# u% B
  25.                     Case "A"
    . s+ q/ G. G7 t( v( z& L. x
  26.                         曲线种类 = "A"% H! |9 I$ a3 {5 X% v2 g7 ~
  27.                     Case "L"
    $ E) ]% v! e" @0 |/ R; A& r$ U
  28.                         曲线种类 = "L"
    : f4 V# I3 D1 ~; v4 B
  29.                     Case "P"
    6 P8 L3 s5 H% i+ q  i
  30.                         Err.Clear
      x' }4 `' h# T3 X# ?4 @
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字
    7 y8 i/ Z! g  T) x% c; p/ A
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字
    9 p+ ?3 I8 Z4 E
  33.                         If Err.Number = 0 Then1 `0 j) q0 z6 ^
  34.                             Select Case 关键字( d! B/ z" {% x1 K; R% ^& u4 d$ [0 z
  35.                                 Case "M"& f+ Q8 |0 u3 K% P1 |
  36.                                     Err.Clear
    3 S* s* M; i+ G
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数
    ( ~# \5 [+ M2 E0 v6 {6 W; H; j
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数
    ! l( e9 r) p, d+ W+ r  |& T
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出
    ! z7 e* \4 ?1 x, y
  40.                                 Case "Y"" m6 t, q3 z/ q# {+ q
  41.                                     是否保留曲线 = "Y"- C' h. t1 D$ j; N
  42.                                 Case "N"7 O  B& K9 j7 Y' v6 Q
  43.                                     是否保留曲线 = "N": V$ V# Y2 a# m' I8 y& U
  44.                             End Select. B5 b" x( e, ^; A
  45.                         Else '按下Esc退出; A/ t9 \2 _/ ]! z4 \* Y
  46.                             Exit Sub
    ( W+ F0 t. u+ K
  47.                         End If! h, |9 Q1 F/ Z% [% a/ Z* |' H
  48.                 End Select
      D  H9 a& D8 I. `2 o. R  M6 s1 q
  49.             Else '按下Esc退出
    5 J5 }* U& [4 u
  50.                 Exit Sub1 o" s  P% U) e6 ], r% E3 C
  51.             End If  H: \6 g' o* m: G+ f$ Q
  52.         Loop
    , G" o# s* h8 E, o- E; e
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )
    4 O4 ]9 e* l- w8 R4 d5 }9 U
  54.         起点极角 = 角度 '调用自定义函数获取角度5 E, l$ ^) U% r: s
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    $ L) b* q- {: s) r4 e. Z- F
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )2 ]6 d" `  a' {2 K% N" j
  57.         终点极角 = 角度/ V$ f3 s" \7 [! `% ~
  58.         If Err.Number <> 0 Then Exit Sub% t  k# V* T- ^5 s' y9 S& ]* O
  59.         On Error GoTo 10
    9 @; d1 y3 |; G; [# v8 }
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角
    8 a( [- W/ ~2 z& N9 q4 W
  61.             .Utility.InitializeUserInput 2 '规定输入不为0. ^4 Q  y0 W7 ]8 Z) M% y4 o$ A6 Z5 e
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度2 H7 A# E9 E4 o3 {- w
  63.         End If
    " o& U3 L" u  l# [7 I* g
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数
    ( ^7 z, S6 F' C+ \' c
  65.         For 循环变量 = 0 To 线段数量3 d6 k$ k/ P+ O+ c: Q/ i
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)
    ) F: L4 i3 [1 _2 F4 E& S; b
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度
    , N' G) ]  e& K
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))
    : ~* {1 @4 M; j7 {( v! `9 j
  69.             Else '按阿基米德螺线计算极径长度
    ( V) O7 K# K, q' R, S/ m; ^4 z
  70.                 极径 = 初始极径 * 极角
      s1 S* b5 H5 I8 M2 u6 ]: `: R6 _! i
  71.             End If
      |; v) Q2 k# C& e
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组
    ( D  s( f! x+ S% @! N- p! \
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)
    5 s" k. Q5 T: ~9 o
  74.         Next
    % N$ m+ {! n; n- [4 l6 ?
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线! f) p$ f. h4 G# E) J2 D
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _
    2 j: ]2 d0 J, e0 m! t' u
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _" k5 }  c3 a' z. d& q/ o
  78.             "-------------------------------------" '命令行输出结果  J/ d: `$ {- t
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线7 A5 W8 }1 n) W
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框% h$ b7 V1 U1 o7 A2 @5 C7 u! S( X
  81.     End With5 N0 ?. |( W7 O$ |
  82. 10: End Sub1 k$ b/ u' Z, V( k3 \$ L% n  b  `

  83. # Y; g% Q% x, s3 e( F; O" N
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度" U  _# I4 ]5 ]  |8 o
  85.     Dim 圆周数量 As Long, 正负数因子 As Double6 R& @4 A3 D7 k* }& c+ o
  86.     On Error Resume Next
    5 [4 f8 A/ A7 m* L/ O. z5 K) j
  87.     With ThisDrawing: s5 e' z/ r' S0 P
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数
    7 a/ n. l2 u. o; P
  89.         If Err.Number = 0 Then '用户输入的是实数
    8 T# y+ t7 p: u
  90.             If 角度 < 0 Then2 V* T3 u" d! U
  91.                 正负数因子 = -1#
    - \& |  B! E7 a; G% w$ M1 |
  92.                 角度 = -角度
    ! L  H: ?3 ~- b; A% n- p( \
  93.             Else
    5 F5 e8 M* u2 G; \
  94.                 正负数因子 = 1#- f; k: a  i, ^$ o4 w& T0 C
  95.             End If
    1 E& P8 v! {" T  h' Z
  96.             圆周数量 = 角度 \ 360 '整除" S8 b/ r! @" e- C* B
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)# f8 ?6 b( V# n4 M3 v. n; W
  98.             角度 = 角度 * 正负数因子. j/ U8 }* m' F5 K: u$ A
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    ) O7 E, F/ m; j0 k
  100.             角度 = 0
    ! i" v& j. ?/ t/ c* @6 u
  101.             Err.Clear/ @# j! i! E. E: G- N: j
  102.         End If0 m, Z( z3 W( ]
  103.     End With5 T; _7 z2 n6 m
  104. End Function, H# t! o5 y8 P5 K4 c5 N% F
复制代码

: H! k0 G/ b3 g4 d% _5 h- 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
0 S3 A: m0 n6 p* M1 A7 K其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。- \' }9 P4 C, W+ h, M  H
或者下载并解压附件,在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 )

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