QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?, E  z# g6 z% j9 @4 j! x. q% j
. |# V* a2 ^  Y7 I$ ?  w1 l
[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算
7 T7 L- n. @: }( h/ \% p5 w$ J
8 c* C+ \& }& {: u' [要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。
! C1 s, k$ j: a下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit5 |/ X5 N5 j5 w" J& }6 e+ I
  2. , d) y5 v6 K  c$ ~( o
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String
    * y5 s2 j7 ]. w4 u  R7 ?

  4. 4 D+ X# y% N9 y' K+ D, ~( S
  5. Sub LXCD()
    9 ~- W: v9 f7 K, Q$ U
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double
    1 X+ P5 Q. V5 ^: c1 Y! e3 ]2 n
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double
    0 m9 Y( `& _7 e7 l$ Y$ z/ P
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double8 W; g8 P* w5 q2 c2 {
  9.     . b: T& ^2 C& ^! W. D9 t  V
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值
      I1 I: P* g3 B: t- A) g+ [2 V$ b5 j
  11.     If 曲线种类 = "" Then 曲线种类 = "A"
    / Z  H$ B9 t; Y0 X. P' d% X
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"+ E8 L5 A) S2 V8 x2 U1 ]+ O0 n
  13.     ( D; f( `3 Z) |4 g+ P6 v- D+ j( f
  14.     On Error Resume Next
    , {/ g$ k5 A0 H% I
  15.     With ThisDrawing6 P# K9 M, T  {9 Q0 q
  16.         Do4 C0 w" F5 w* T, F0 y3 ]- w7 q
  17.             Err.Clear
    3 C3 ^7 K4 o5 ~
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字7 X) o$ a; I  H) G9 R* X7 H% l
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字4 v: I! M) d+ X7 J; Q$ }+ N
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行3 g2 J  Q  a& Z5 P- ?% C, M
  21.                 Exit Do
    ; t) j, v- i* v. w+ ?, Q
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    3 |7 N5 D+ U$ G( ]% w6 R
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字
    ! K1 n" H3 `* L
  24.                 Select Case 关键字
    2 p$ c0 a6 |0 U! \; E
  25.                     Case "A"% F# [: R7 ^& E% {! l
  26.                         曲线种类 = "A"
    ' v9 j! }. |& J! Z1 o
  27.                     Case "L"
    . K2 J5 q) m- L' n* v7 b
  28.                         曲线种类 = "L"- t* H7 u) G: g$ k5 p! ~% h
  29.                     Case "P"3 G- i1 t/ U; P6 o- g4 g4 \( @
  30.                         Err.Clear
    + a8 Z: T9 l  Z" h* n! [  q9 ^) @
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字/ z. ^( G) ^4 H2 r9 [; W
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字3 l3 b( f  a5 M. V" `. |" V
  33.                         If Err.Number = 0 Then  k$ @, y! J' R5 n; e, k
  34.                             Select Case 关键字
    ' O0 ^! C# U9 D' x' V: u
  35.                                 Case "M"
    0 E) e" X: D" ]3 Z( v5 _- u
  36.                                     Err.Clear
    + e2 ]8 X+ {3 n% N0 X! w2 H7 _, F+ X$ i6 M
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数$ o! _% o! j" ?
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数; D4 D) [  `: K: P, U" g5 Y0 O
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出
    / c6 ^2 v2 Q( N! A* g4 M, F
  40.                                 Case "Y". e7 n4 s) K9 s- C* ~8 u
  41.                                     是否保留曲线 = "Y"
      u3 j, ~, `6 U3 G7 k) d, ~
  42.                                 Case "N"6 K1 K/ B1 c; q3 e, e
  43.                                     是否保留曲线 = "N"
    7 n6 w, f, c7 t- r/ i% H; X
  44.                             End Select- V# y/ @5 o) N/ r, x
  45.                         Else '按下Esc退出
    # A  U$ l4 v5 ~+ Y9 G6 C: j8 ?
  46.                             Exit Sub" W) Q0 w. I7 M" a$ G* I6 H
  47.                         End If1 [5 [+ }. {' ?# {2 f3 q
  48.                 End Select
    + p0 ~0 G5 F! l6 L9 ^
  49.             Else '按下Esc退出
    ( G5 U; Y! m9 }! o! M4 H; W
  50.                 Exit Sub8 H! e$ B- v% ]: C# x6 q- L
  51.             End If9 _( n5 a4 B, m/ f5 \! V, ~
  52.         Loop. |$ O' r5 p# p' x' i
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )
    # q: M; `% u- G
  54.         起点极角 = 角度 '调用自定义函数获取角度4 K1 x( C9 [4 w* i4 d4 ^& {
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出
    8 O% y7 |1 I4 W' }3 J/ |
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )
    9 u: Q" ]: s! f* ]0 k) D
  57.         终点极角 = 角度
    9 i. o3 G4 c4 V1 L) @( }, H
  58.         If Err.Number <> 0 Then Exit Sub! S) [- W9 c0 {6 m' y  s9 I
  59.         On Error GoTo 10% G# ?9 c3 |. V) f9 N- x% o5 \
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角
    + B4 d" `/ P( J1 g2 W! p- }
  61.             .Utility.InitializeUserInput 2 '规定输入不为08 U1 H! s, Q3 A9 f, }
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度. g! s* I; Q+ Y* k5 {
  63.         End If3 L6 j4 _* P+ x: a! @
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数! Q* D9 H  A2 S: a2 X7 d
  65.         For 循环变量 = 0 To 线段数量. ~, q1 ?3 C! L1 ?0 i
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角)! ^% [9 X2 G  Q
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度* L% c! l8 h/ F1 S: c0 ]2 U* h, s
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))5 I9 x0 L* K# D+ `* f& R; _  y0 R
  69.             Else '按阿基米德螺线计算极径长度3 m  Y& y, D. L
  70.                 极径 = 初始极径 * 极角! T& J5 @5 l/ D( s. n) \
  71.             End If- U9 ?0 y5 R  j7 M7 D
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组% `* {- H1 l; ]) {: h
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)* k! U: ]1 |3 I; {- n7 S) ?
  74.         Next) I/ B2 u) h0 o( N: W, }2 c- ?. F! J# V
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线  ?, w8 l( ^8 F. _$ P, W8 j( n
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _
    ' U$ ^' n* c1 T7 m. I
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _; E6 f& a. r3 |0 ^
  78.             "-------------------------------------" '命令行输出结果( w* n" u2 F  q# E0 t: q
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线, E3 n; ~1 i! Z, t8 S& U& C
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框  Q  i+ J6 G1 T! k# {7 b, D9 V- a
  81.     End With
    1 @& k! a" g. F/ O3 W! d
  82. 10: End Sub& o, G0 y9 m5 T

  83. * D5 q+ N$ _8 T; d& g5 Q
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度
    : h) r: X# s- ~
  85.     Dim 圆周数量 As Long, 正负数因子 As Double  i& y. c0 `( \% @* B
  86.     On Error Resume Next" d3 B) P3 X1 v3 {
  87.     With ThisDrawing
    + ?4 W3 p- }8 _" }, b1 X. f7 ~! I
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数1 p# D+ O+ R: Z- S# C. F& J
  89.         If Err.Number = 0 Then '用户输入的是实数
    ' j# r% P& W9 m
  90.             If 角度 < 0 Then1 R% H) H5 _; o0 X
  91.                 正负数因子 = -1#' j6 B, ~/ b* @" W
  92.                 角度 = -角度
    % d2 E) d5 h. D* Z5 v. d
  93.             Else( D9 A1 d! {$ U' k% P4 r
  94.                 正负数因子 = 1#
    , m1 L/ Q2 q( o8 A
  95.             End If
    ' t- n' C7 ]4 V/ z( I5 ~
  96.             圆周数量 = 角度 \ 360 '整除
    ' {& k/ g* q7 f6 R$ O/ L
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)
    8 \0 j9 }  i- r) j% k) R; Q
  98.             角度 = 角度 * 正负数因子
    + X2 p! t, c  n4 E& j) H+ z$ G  k
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字* V1 d1 @' I; e( A7 V7 S* F& K
  100.             角度 = 0
    7 k$ ^/ Q' C% h7 V1 H
  101.             Err.Clear( Q4 J1 F: |; S0 `6 h
  102.         End If$ G* d8 S' H1 H5 G5 V8 K
  103.     End With' F. D+ d! K- u1 F
  104. End Function
    , j' U! Z. @2 K' b( x
复制代码
  r, P6 |7 z# e6 n: c4 |, E7 U( H
[ 本帖最后由 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
/ R; Y) y% F0 `8 a* }, R其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。
% c: [$ H" K( u( H9 O% i或者下载并解压附件,在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 )

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