QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3315|回复: 6
收起左侧

[已答复] 这个样条曲线用VBA程序该怎末画?

[复制链接]
发表于 2009-5-21 22:14:23 | 显示全部楼层 |阅读模式 来自: 中国陕西西安

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?2 `2 m( u8 g, n; q! C8 C# q1 ?1 U$ j

* I8 o- J" |) C7 g% T9 o: W/ E[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. : K  S* f0 U7 R0 v; |# l. b- U' X- S
  2. '假设画一条有三个拟合点的样条曲线
    8 {4 P- f8 u3 _& c  M/ N+ Z( i
  3.     '声明样条曲线
    ' M( w+ M, f! {! x5 A: S7 T
  4.     Dim SP As AcadSpline
    % L9 u2 t3 Y& x) s
  5.    
    1 E' i0 w6 X/ x. G
  6.     '声明样条曲线拟合点坐标数组
    ; N/ `/ v" v/ r" s  \
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    0 [* M  l; U1 i' [1 O* o7 P& a  M9 _
  8.     Dim fitPnts(8) As Double
      W) K6 a# y1 G4 e  p2 R5 X
  9.     0 u! i3 W9 ~8 o) w
  10.     '声明起点切向数组
    9 {- ]' V  F1 H0 T, Y6 k
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    ) [8 R# Z2 J* X- C9 m; B
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值- P* K; {( c; @. O7 O+ s
  13.     Dim sTan(2) As Double3 K5 O" ?4 A: b0 {3 N9 S
  14.     7 P9 o5 h! f! ~: l
  15.     '声明端点切向数组
    : R7 p' R0 J+ M& E4 K1 I
  16.     '和上面的起点切向相似
    2 k6 X$ z3 h( Y$ i; ?3 e+ A+ w: `% S
  17.     Dim eTan(2) As Double( i9 m" O* K& _( `$ |2 @
  18.    
    ; ^$ r, U* b/ V
  19.     '样条曲线的第一个点
    1 q0 _/ z8 ~4 H* t1 m! c3 y
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 01 z! Z; Q) X' |
  21.     '样条曲线的第二个点, Q3 J  q3 w3 O: p; h1 O
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0
    : q2 w8 B" g* Y. g
  23.     '样条曲线的第三个点
    9 ~' J2 a7 X$ s! H+ s5 D& `0 t
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0( l; R8 A; J+ s1 [, \
  25.     ! `3 q+ }  z; M6 N7 r
  26.     '假定样条曲线的起点方向为水平向右
    . H; d- r4 E: A* w2 W4 `% o3 S
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的% q- {1 y# J6 w
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0
    ) [9 n3 d& ^; x3 v
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0% _3 `" e. @! g/ C
  30.     '假定样条曲线的终点方向为135度方向' ~; o" x+ f5 ^9 H/ M8 h* z) X- j  v
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0
    ) J3 i3 Q, ?$ {# y
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0
    0 ]0 ~. s7 I5 W6 N. j- @
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向+ \1 @- S$ D+ t6 {$ p: t1 Z  Y3 t
  34.     ) F4 Q+ R4 o7 U8 u
  35.     '画曲线
    9 Z: I8 T( M6 T3 @/ c
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    1 Y" o: ^3 w2 Z0 k- U  B
复制代码
 楼主| 发表于 2009-5-22 15:17:32 | 显示全部楼层 来自: 中国陕西西安

回复 2# woaishuijia 的帖子

感谢版主的指点,我差不多已经明白了,不过我想知道起点和终点的切向怎末判断的?好像一般的画样条曲线stan和etan的切线坐标都是0
发表于 2009-5-22 19:59:07 | 显示全部楼层 来自: 中国
应该说,除非有明确的角度要求--比如样条曲线与某直线在交点部位相切--通常都可以用0(也就是默认)的。曾经遇到过特殊的情况是用导数算出的角度和切向。
 楼主| 发表于 2009-5-23 01:26:21 | 显示全部楼层 来自: 中国陕西西安

回复 4# woaishuijia 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!, C1 w& w+ g9 x& w# |
& A' ^3 X- h# U' c6 _0 G

8 }  W3 j: ?- P6 p% R# t6 o' H3 L8 x+ s' T

0 [9 u5 D. K6 MDim Xb1 As Variant, Yb1 As Variant
, F) m3 t4 W3 e4 ]' X# V' `8 q) q
! \" l4 D" x' f" H  n
Xb1 = 0+ \7 k. B, o( D  z8 }, J
Yb1 = 0

/ d* n$ e8 C2 ?8 d& [# Z: L
5 I5 ?, [2 T; n# V4 G8 o% O
# K& Q& j- w: d( o: Q
Dim Xa1 As Variant, Ya1 As Variant
& o. T: Y& z3 g5 L; S; V
9 {( X/ G  \, Z/ l
Xa1 = 0.52 Z* q! e/ n8 M! k/ |; B
Ya1 = 12

% F$ n4 y" n1 L! D4 J- e% _$ P; J9 I6 s( |

# R9 }/ ^# j( v$ b2 ^: u1 I- `
0 M. g9 k7 b( b9 ?8 i$ I$ n$ I+ |  U) b, F' h

/ f: K* s- S. L! K7 f7 U
5 C( g6 s- T5 d, |" {; b. i0 O- XDim blockObj As AcadBlock

, V! U+ M8 `' ?1 I4 r: C1 E; @. m! m1 l
Dim insPnt(0 To 4) As Double

- Q- A$ ^* h6 F  X/ e( b2 R9 K1 `# f3 n, R9 g, @  f
Dim allEnt As AcadEntity

0 m0 o. a# C6 X5 t& G3 X* g; g5 t0 y! N
Dim blkRef As AcadBlockReference
# Z7 Z7 L7 Z' t* t) Q$ v' F& [9 I
4 s- c6 P3 R* b. O7 [
Dim blkCount As Integer
2 E+ B2 D% f3 H6 {
% F2 K% J5 d0 _( X5 o
Dim blkName As String

; I  w! E" _/ V$ N6 s0 n+ e5 F
, [6 }7 T2 U: _( I! M+ G, s1 C
4 O% y: V8 u. d( o6 y2 l; I
' P: l# m+ U% S8 Q2 W! }- o' c0 \6 u
For Each allEnt In ThisDrawing.ModelSpace! a. N* [& o2 ~. o

- P/ E5 @2 V1 W4 C3 x7 O: ^( N6 \If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

# ?. `4 Z7 T! o7 M* e& Y
/ R/ f- k9 L& C  a% a0 `. U! O2 wSet blkRef = allEnt

: i/ |. G9 h* J7 p& d7 Y' E  T0 l* K: h# M1 a

# `/ m* [0 Z1 ]5 }. M, [If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

( v( `! ^) h2 V1 ^$ G! Z
6 {' l4 z) M3 b* |. F- EblkCount = blkCount + 1
5 o2 L4 K% l7 ^/ G( J

! b5 n/ s5 P+ aEnd If
+ w' U7 W1 O6 ]* B+ |( _9 J" }3 U

# _. z+ M$ m' F3 e8 f& `6 HEnd If
) V6 D1 M  [3 n; i% {  P

& g  w  W( R4 A8 s$ N0 TNext
- w5 V$ z' }7 X7 U; V
6 B$ X% c& x2 R# c; y: T9 {. _; x1 w0 t
blkCount = blkCount + 1

9 i  ]8 Y" {/ F- q9 H8 l* i3 @9 |; W4 Z8 }0 N; N3 F1 C- ]
; U7 f  i6 `7 ^( ~% i0 C, B( e
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 02 V/ P4 ~. D* u) ]
! s" s4 P2 a, M+ r( G5 |0 X
blkName = "blkGEAR" & blkCount
8 l; }3 x5 S  x; V! E# o, p
& G0 N0 g, L9 W2 U* \* d
0 }' |1 K& N4 E1 O3 w/ e# m
Set blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;$ X2 L& B" Q" j$ y
/ B8 ?3 r" z- B3 P

) Y/ v  q4 A$ G& E, V( [2 ~: w
4 r) O. J8 a) j; D
Dim sTan(0 To 2) As Double# Z# f! F( @- B: B

  H5 W. j, {2 u) aDim eTan(0 To 2) As Double

) S# q9 [; F% [4 M/ I9 C2 H2 X) W2 j$ ^
$ ^5 W+ D, t6 Z" N3 ?1 y4 |Dim fitPnts(0 To 14) As Double

/ D4 ?$ o# n9 C
6 D! r  m$ Y$ l9 _: dDim splineL As AcadSpline

0 `/ B8 a( a) g( N% ?! l2 s9 v) b# @6 y3 L; o, M' |2 \7 P2 R
Dim splineR As AcadSpline

" ^7 N8 A% c9 \& m0 K4 S8 l  c
5 }, Q: j9 R$ Z8 xsTan(0) = 0: sTan(1) = 0: sTan(2) = 0
$ B% ?. l4 ?2 H9 C8 a6 e2 N' D
. J2 g- `. Z4 p5 W7 T
eTan(0) = 0: eTan(1) = 0: eTan(2) = 0
  p% H- b1 \/ v* v0 e
& i' h$ Y5 @8 n/ {+ J
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

7 S0 z5 S  z( l5 t2 A' e7 y# t; E, ?" W% t
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

  V4 \. q. ]% m
# N  Z9 a* F7 F4 u3 X* RfitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

1 u3 l9 B6 c6 c- q" y/ h6 m4 z" S' _: O
fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
: W* S! O) }+ [& `' o* k
% h3 z1 g8 |4 ^$ M% Q' W
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0
( v7 B6 T8 \% G  d5 J
2 t5 F9 G. i0 }5 f; a
: h8 k' H1 K; N
9 l" q+ k& i+ q4 J
Set splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

0 a* a8 G; _: d) ^1 P* D7 b4 t7 ~

6 E( Y5 n# W* N" ^% |% j# f) A* v7 s' o& S
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.9 W) K( a, B% d8 x* P% D+ y
相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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