QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
用什么方法可以求出平面螺旋体的长度?
1 x# v0 e9 `/ \; ?
* N4 p2 J) p1 ]: Q* v0 ^( e[ 本帖最后由 mdt6.0 于 2008-10-16 11:10 编辑 ]
Spiral.png
发表于 2008-10-15 08:22:27 | 显示全部楼层 来自: 中国辽宁鞍山
将平面螺旋线转换为多段线, 然后用LIST命令就可以求出了
发表于 2008-10-15 15:19:39 | 显示全部楼层 来自: 中国北京

螺旋线的计算

螺旋线的计算% a' y2 n# @, ?$ e8 v

( ]. ]1 e0 e4 F' Q( e: V6 b要合成一条线才可以
1.gif

评分

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

查看全部评分

发表于 2008-10-15 21:02:46 | 显示全部楼层 来自: 中国
用VBA方法画近似螺旋线的多段线并获得长度。线段数量越多,精度就越高。
, n9 X, h) @  O' U9 U( r下面代码可以画(求)两种螺旋线(阿基米德螺线和对数螺线)。
  1. Option Explicit4 q* F% g, T" Z( J, I0 R( P
  2. ) y; r. l* V2 P% n2 @6 B& @5 X
  3. Dim 线段数量 As Integer, 曲线种类 As String, 是否保留曲线 As String
    1 r* i  r8 R5 K5 A  W( w, [
  4. 2 Q$ }. w7 z: j, h' f% H# h
  5. Sub LXCD()
    / R1 a: @; ~3 w! @/ S3 U) c# _
  6.     Dim 多段线 As AcadLWPolyline, 顶点坐标() As Double: C  [+ s: W- {
  7.     Dim 关键字 As String, 起点极角 As Double, 终点极角 As Double, 初始极径 As Double, 对数曲线夹角 As Double
    ) d1 l8 l) D( Z
  8.     Dim 循环变量 As Long, 极角 As Double, 极径 As Double
    6 k9 X4 H# M" k7 b+ B% e/ M) ^2 o
  9.     7 g; a0 J' S( S3 m+ o7 Q
  10.     If 线段数量 = 0 Then 线段数量 = 1000 '默认值
    - u8 z% a; j0 D% N9 ~: O
  11.     If 曲线种类 = "" Then 曲线种类 = "A"
    2 j3 ?0 i1 \" l" I" N
  12.     If 是否保留曲线 = "" Then 是否保留曲线 = "N"
    $ a+ {7 V% C: u) r
  13.    
    9 H/ u# r2 n* F
  14.     On Error Resume Next
    & z8 g7 t$ {9 k4 T
  15.     With ThisDrawing
    ! Z+ n# ]4 v1 U; J8 L/ ]2 ~
  16.         Do3 J. V1 ]: U4 e
  17.             Err.Clear( _, J4 I) {7 J
  18.             .Utility.InitializeUserInput 6, "A L P" '规定输入不为0或负数,规定可以输入的关键字6 F6 m  S. n( g& G$ ?+ D  n. d# b
  19.             初始极径 = .Utility.GetDistance(, vbCrLf & "输入初始极径(常数)[阿基米德螺线(A)/对数螺线(L)/选项(P)]<" & 曲线种类 & ">:" ) '用户用鼠标或键盘输入距离或关键字
    ! ?( a1 j1 ^3 {/ a  T7 \" \7 p
  20.             If Err.Number = 0 Then '输入的是初始极径(阿基米德螺线的常数或对数螺线的R0),退出循环向下进行
    5 r3 z' ]1 H, K; N$ A
  21.                 Exit Do# a7 X& Q+ c( R& }) A5 g0 V
  22.             ElseIf Err.Description = "用户输入的是关键字" Then '使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    + W/ q2 s8 A2 R6 K) }& _. c
  23.                 关键字 = .Utility.GetInput '获取用户输入的关键字' M6 P* q" b; s& H; h; [' i
  24.                 Select Case 关键字
    2 k/ L8 K) f, x2 e5 }  N2 c3 ?
  25.                     Case "A"0 j5 o5 X' T; K) i% E- t+ r
  26.                         曲线种类 = "A"( E) }$ V" `$ P
  27.                     Case "L") A% J2 f/ L# ]; J+ k3 B" K
  28.                         曲线种类 = "L"; h3 [8 ~& N4 W; V9 `; ^$ k
  29.                     Case "P"
    & l# ?2 y2 Q  n6 Y
  30.                         Err.Clear
    1 n# o5 J% h; W# Z9 X) @$ Y
  31.                         .Utility.InitializeUserInput 0, "Y N M" '规定本步骤可以输入的关键字
    $ W7 C8 h& T+ ~( M% _$ d' O$ p+ M
  32.                         关键字 = .Utility.GetKeyword(vbCrLf & "选项[以WCS原点为中心画螺线(Y)/不画螺线(N)/拟合线段数量(M)]<" & 是否保留曲线 & ">:" ) '用户键盘输入关键字
    ) U( J+ C) k6 P+ l% F$ s8 ~" t4 O
  33.                         If Err.Number = 0 Then
    # ?6 b5 A. R6 K6 n3 S9 p/ u
  34.                             Select Case 关键字
    7 M0 Z& E. D& q2 |, h/ _4 ?
  35.                                 Case "M"( J7 T8 [. ?# t& @! T- Q
  36.                                     Err.Clear
    / P  U" J, g$ K# J: h% R
  37.                                     .Utility.InitializeUserInput 6 '规定输入不为0或负数4 R; Z- E& C5 a
  38.                                     线段数量 = .Utility.GetInteger(vbCrLf & "输入拟合线段数量<" & 线段数量 & ">:" ) '用户键盘输入整型数. Z; |/ {6 w4 _6 h% l& ~8 ~5 z
  39.                                     If Err.Number = -2147352567 Then Exit Sub '按下Esc退出
    # U; b& g0 s' r& l' F( i# @/ S
  40.                                 Case "Y"8 U% ^/ P' p5 x, i. r2 [) P8 ^* @
  41.                                     是否保留曲线 = "Y"
    6 p3 s1 Y1 `  t6 [9 \% w5 G" y! x
  42.                                 Case "N"& H, V9 W' j- [1 Z1 X4 h6 E! z. V
  43.                                     是否保留曲线 = "N"  f& ~1 |! {% w0 G5 Q! W
  44.                             End Select7 q( V5 \' m7 C9 C4 Z2 A
  45.                         Else '按下Esc退出$ s1 s/ J; l3 [9 j5 d
  46.                             Exit Sub1 g* q& Y- x4 F" S9 R9 p* G
  47.                         End If
    ; y1 T  g( f! a
  48.                 End Select/ O3 K$ h7 g  h, a% g2 P& p, {
  49.             Else '按下Esc退出1 F& d( J# L$ m  b, z
  50.                 Exit Sub
    ) t; w' F, y0 \4 d' g
  51.             End If9 A. w2 J2 _9 C  Z
  52.         Loop
    % f5 b" g+ i5 c  r- P: b9 H
  53.         .Utility.Prompt (vbCrLf & "输入起点极角:" )- o1 W  q, v( s
  54.         起点极角 = 角度 '调用自定义函数获取角度6 `6 r0 y1 A0 M) M
  55.         If Err.Number <> 0 Then Exit Sub '按下Esc退出7 E5 v3 D. v$ ^6 J$ x" W
  56.         .Utility.Prompt (vbCrLf & "输入终点极角:" )' `. M: z5 Y: G7 P6 _! g
  57.         终点极角 = 角度# R* T0 f; i& M0 S4 t3 j: ^6 i
  58.         If Err.Number <> 0 Then Exit Sub$ Q: X" r2 F: i7 h, w; d+ N
  59.         On Error GoTo 10  @( n9 z6 Q# `$ h  ~
  60.         If 曲线种类 = "L" Then '对数螺线需要输入极径与切线夹角+ C8 v$ I* j$ }$ E2 A6 X
  61.             .Utility.InitializeUserInput 2 '规定输入不为08 a+ A7 u- a* f' t; n+ t
  62.             对数曲线夹角 = .Utility.GetAngle(, vbCrLf & "输入对数曲线夹角:" ) '用户鼠标或键盘输入角度
    , j: P2 n9 d' P0 v6 q1 W4 c
  63.         End If# @5 y7 x/ n3 Y6 q6 p1 U
  64.         ReDim 顶点坐标(CLng(线段数量) * 2 + 1) '根据线段数量重新定义坐标数组元素数1 X1 s4 O/ g' I! X& l
  65.         For 循环变量 = 0 To 线段数量
    + B& Z3 M: I; q' e
  66.             极角 = 起点极角 + CDbl(循环变量) / CDbl(线段数量) * (终点极角 - 起点极角); D! K3 q" z% [( g% o
  67.             If 曲线种类 = "L" Then '按对数螺线计算极径长度. _0 D9 H# {8 I1 j2 A; W) m
  68.                 极径 = 初始极径 * Exp(极角 / Tan(对数曲线夹角))! P/ b' |  |" B: s
  69.             Else '按阿基米德螺线计算极径长度. d: _: {4 N2 s: [6 A  R. N
  70.                 极径 = 初始极径 * 极角- o1 E: I. O: v; I9 p, W
  71.             End If5 \9 N; U/ T- U, F6 Y" I
  72.             顶点坐标(循环变量 * 2) = 极径 * Cos(极角) '计算直角坐标并赋值给顶点坐标数组
    1 v6 n2 O, k2 F5 q
  73.             顶点坐标(循环变量 * 2 + 1) = 极径 * Sin(极角)  L0 Y6 H; [! H7 k3 k
  74.         Next
    , O* G9 F1 b! |' E5 R7 M: K
  75.         Set 多段线 = .ModelSpace.AddLightWeightPolyline(顶点坐标) '在模型空间画多段线$ S( f3 C2 n. O  c! c9 R1 }: N1 @
  76.         .Utility.Prompt vbCrLf & "-------------------------------------" & vbLf & vbLf & _: @7 |" H4 I& e$ S- x3 p
  77.             "     螺线长度:          " & 多段线.Length & vbLf & vbLf & _
    % a$ `, E4 X, B; o" h
  78.             "-------------------------------------" '命令行输出结果
    4 @% A! R1 a& P; ^1 A% x
  79.         If 是否保留曲线 <> "Y" Then 多段线.Delete '根据用户输入,删除或保留多段线; c4 M( ]( t* A% L
  80.         SendKeys "{F2}" '模拟键盘按下“F2”功能键,打开命令行文本框
      W; b) E; Z3 L3 w! r( G% y- f' H
  81.     End With
    7 }# ]& L3 _  d5 F
  82. 10: End Sub- `1 H8 s2 J& D) d

  83. ! }% X& }( \! i0 `, X
  84. Private Function 角度() As Double 'CAD图形界面或命令行中获得角度只能在0到360度(不含)之间,所以定义一个函数获取更大范围的角度
    3 K: A0 O4 e2 f
  85.     Dim 圆周数量 As Long, 正负数因子 As Double
    ! k: W8 A+ d# I/ ?1 `: a2 W
  86.     On Error Resume Next
    % Q$ e4 x3 L6 H* H& h) S; ^
  87.     With ThisDrawing6 J0 Y/ z" T6 b$ T
  88.         角度 = .Utility.GetReal("十进制角度<0>:" ) '用户键盘输入实数2 ^* j+ P9 T8 {4 o$ }
  89.         If Err.Number = 0 Then '用户输入的是实数" d- W: q: ]' S5 Y7 a/ L& l
  90.             If 角度 < 0 Then8 M, N2 y0 q! O6 E" l6 M
  91.                 正负数因子 = -1#. Z8 M- V, T  f! _5 k
  92.                 角度 = -角度+ t; G6 J2 {, R6 j# M
  93.             Else
    - G2 b" z$ E& `5 [1 K
  94.                 正负数因子 = 1#& Y$ F" c  I# W5 A4 `1 i
  95.             End If
    . P% ]8 q% k1 Y# i
  96.             圆周数量 = 角度 \ 360 '整除: R+ j  g$ ?5 [, ^% |
  97.             角度 = .Utility.AngleToReal("180", acDegrees) * 2# * 圆周数量 + .Utility.AngleToReal(Str(角度 - 360# * 圆周数量), acDegrees)
    / ~6 \1 M8 g1 p" t! N
  98.             角度 = 角度 * 正负数因子
    . P! \$ L$ M9 V8 d) G- ^! w1 H' H0 ^9 f
  99.         ElseIf Err.Description = "用户输入的是关键字" Then '用户按下右键或回车或空格,角度默认为0;使用英文版的朋友请用"User input is a keyword"代替本行代码中的汉字
    ) T$ n# G8 q  S! }
  100.             角度 = 0
    0 d4 s8 K4 r5 h6 _1 A/ A9 d
  101.             Err.Clear
    & o3 d9 a  _. e$ e. \: E
  102.         End If& T9 r+ H5 d" W7 X& }' j" a" t
  103.     End With7 ^4 I, \& E1 m  \8 V
  104. End Function
    % |9 x4 T* b( J( x
复制代码

' z" V& h" ?+ p( V  S* ]/ Q. y. d. K[ 本帖最后由 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以上版本,可以按你的尺寸画出螺旋线,在“特性”选项板上或用“列表”查询。
% X; \& c: t+ w* D: d其它版本可以用4楼的程序,很简单呀。点帖子“代码”框上的“复制内容到剪贴板”,在CAD图形界面按“Alt+F11”打开VBA编辑器,在“工程”资源管理器上双击“Thisdrawing”对象,在弹出的“代码”窗口上粘贴,关闭VBA编辑器或按“Alt+F11”返回图形界面,“Alt+F8”、“Alt+R”,按命令行提示操作即可。6 X. b5 A7 _" i9 {7 n
或者下载并解压附件,在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 )

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