QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
2 s1 L4 b: F4 |3 }" e! Z  I8 ~: F! N' H6 e6 ?
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. 4 D4 h2 f! B0 c% e. d8 Z, `% O# i
  2. '假设画一条有三个拟合点的样条曲线
    ) i3 o" R. |3 @, k) [% }  _( d* f4 s& `
  3.     '声明样条曲线3 f4 ?7 G6 J* h/ G+ k2 J5 W( j
  4.     Dim SP As AcadSpline% j( e& ?- Q6 ~; J, \3 j
  5.     + U. D9 T/ C1 `1 A; d8 U# ^
  6.     '声明样条曲线拟合点坐标数组
    7 w4 s0 y+ m0 W! \/ e7 G3 W5 X: W
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素' f! m9 X) k8 Z' f- Q
  8.     Dim fitPnts(8) As Double
    ! p: z6 {  e7 ^( W2 k* G" D0 R  E
  9.     2 r0 F# Y7 G5 Z: ?0 Z
  10.     '声明起点切向数组
    # `7 g; Y& a7 E8 H
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    0 L+ K4 Q. y0 D) l9 |
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值& Y4 O' V( T. J1 ^# U
  13.     Dim sTan(2) As Double3 Q/ K- l. ~, a, [2 c
  14.    
    1 b0 g7 X- x$ `0 T) g' H' D
  15.     '声明端点切向数组: F6 w/ N: N. T& l
  16.     '和上面的起点切向相似
    $ X% G* B$ {7 A* v* t
  17.     Dim eTan(2) As Double
    - |4 r4 V, O2 ]0 P+ H7 q$ e2 B
  18.    
    9 q# }! b2 ~% t
  19.     '样条曲线的第一个点
    . N% p3 ?+ s" G+ \
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    ( y( `- d! J' m$ k6 a2 d9 W
  21.     '样条曲线的第二个点
    6 o& b7 n# a5 ?$ @9 Q
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0! ~. v6 O& u( e( E3 h9 L$ W
  23.     '样条曲线的第三个点2 c, @) w( ~9 C5 i: G
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0
    5 a3 ?( m% O0 A/ ~6 c
  25.     6 n3 H8 t5 k! i) X% Y* g# \; I
  26.     '假定样条曲线的起点方向为水平向右1 b& B, a) a- X7 Y! q% {
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的' s1 N: T+ \$ \( [  N* @$ I
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0
    1 x* M; \. z& o9 l5 u; W
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    5 z3 D! B1 z$ }8 }7 u
  30.     '假定样条曲线的终点方向为135度方向
    ) P4 J2 B+ R' K5 c  F
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0& ]% x& `% P: C. M% q0 k& H3 f
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0
    & N) q  k- B' m9 H% H
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    " R: h0 B; }+ A; G# l
  34.     0 }2 W! P* |  ?) K# _% C
  35.     '画曲线6 X3 E1 n1 `1 z4 S  i
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    ' e6 Q1 R# |! {5 f; p+ X( g
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!* p/ ^. T' a( c. ]& \
3 C! D6 u1 f! f$ }5 R( n, f. {
' D$ w& r9 Y- ?) a. O- l$ @# ]1 R

7 R: _% s) p! V6 w, K/ J4 D9 T2 _/ |, `+ T# T7 n
Dim Xb1 As Variant, Yb1 As Variant
: @1 b5 }) h0 s% m: o

# k" B1 p, \, M0 n! o6 N: z# z
Xb1 = 0! C5 q, i5 h6 Z  e* {
Yb1 = 0

* u9 v! |6 `/ j" Y; o: @6 B1 d
# W% X0 E) g* v! N$ {5 y: g9 [

  y5 G  z- \+ O& y. M
Dim Xa1 As Variant, Ya1 As Variant
* q" w5 \3 _; ?: i# L5 e. o' H" i+ `1 l
Xa1 = 0.5, b0 H! k( f2 B/ y& T& ~# W
Ya1 = 12

' G& |7 I! s! P/ q! d# G& k
6 i* b: v: q2 t8 b+ n, J

: `' p8 i7 [( ?8 n% s7 l5 ]: e
" A: z8 p. \- A2 m4 P% A' ~4 y. h+ a
5 z, X! y, d8 @/ v$ R/ H+ V2 X
9 C0 _& N3 I' |3 |' P, `

: z8 q* g9 [& f4 F. mDim blockObj As AcadBlock

7 C- p' V& f# K* n" \( w; `
+ j7 E' i7 o& sDim insPnt(0 To 4) As Double
1 `& z" `8 w* M5 ?; h# J
4 g7 K7 ^, A+ @" x
Dim allEnt As AcadEntity
* {7 g; n* \2 y' [# N% F

, H, J% g% \- S0 lDim blkRef As AcadBlockReference
! V8 |# G6 _2 u  B! Z) [, I$ {

# ^- F/ L8 z5 V$ _1 ^6 P4 NDim blkCount As Integer

! m3 P3 k1 d/ z! C% f
, E; {! B( T. h  ?Dim blkName As String

1 I9 ]% Q' W! h/ D; ]# `
/ N# |' @4 o- \
, L# w: L. l- N2 n/ V

. k. H$ Z! T' A  U  M1 k
For Each allEnt In ThisDrawing.ModelSpace
, n9 z$ p% {8 j6 W- U2 a
( L/ y3 }: X7 f. o  vIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

' ~. `4 z1 E" p5 ^1 z* V* G8 e, y. ~+ M$ u  Q
Set blkRef = allEnt
: s( M+ G0 t. |2 d

. P" M' B2 @1 ~% X' c: v; N' b) U1 ~$ ^4 b
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
# N  T* L, E( i/ @: s" D! v
% c3 C3 K# [  W* a; g" f$ q
blkCount = blkCount + 1

# a2 D0 C5 x4 ]. h# i: o, o, v* z3 [9 C# i3 S
End If
! g0 Q+ m( @% t  d
) F' J3 Y7 g# d2 L
End If
- q% V, P$ a/ j  b, B

0 Y9 w4 w, o/ M! o' M4 q8 _; fNext

) E' S" w* w3 W+ E6 }4 p5 K
# k4 p! F7 c" @( ?blkCount = blkCount + 1
. W( t# |1 \5 A' J

; I2 n2 o6 _3 t* ?* a8 @3 k5 R

0 K( g+ F/ @& _4 m. A* f9 Z; b- P- m: vinsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0% _, l" _' m4 I* E

6 V* m1 C" g) Z/ X" d( |% DblkName = "blkGEAR" & blkCount
" _) o+ C& Q2 o( [
4 i. L, D) J9 d, c, A3 k% ^

. u( e$ H+ g! C0 }1 m1 |Set blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;7 N4 t0 s$ v/ k) B1 }& }( e
0 w$ o) }0 P/ B0 `8 `
. W/ p# {4 ]$ j$ k

1 w$ B  o# M% {- K/ `' C" YDim sTan(0 To 2) As Double
2 R+ I: V; c+ X* Y( Q, Y0 i& }) h$ @$ k% S
Dim eTan(0 To 2) As Double
9 J6 O2 P/ `1 M5 t" C

- n: A1 {& A! _Dim fitPnts(0 To 14) As Double
$ l4 v! e, i: Y' h& Y: w
) y. P8 d( i* L% t
Dim splineL As AcadSpline

) u1 H/ g, W. Q1 n# s- b. c% _: j! t- h# C" B- e
Dim splineR As AcadSpline
2 E& U+ @1 D, B
4 q: N+ B& E8 Z( n6 c7 J7 X7 u$ _
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0

5 X4 n( Q9 Q$ m4 Q! m4 I3 x* W, M& e
eTan(0) = 0: eTan(1) = 0: eTan(2) = 0
. @) T+ r2 T3 C: B+ x
  Q( K2 K  S% x$ |* B/ W3 y: @
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
- \* R) Q: P. `) ], K! H, r
3 f  t% U0 B$ C, Q
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0
: b3 i! O" M/ {4 b7 M# h! R
8 O5 c. p; }  d4 @$ M! x
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

  r$ [, c# g& w: O8 t2 v
! p3 }( q7 h" o0 P3 _fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0

4 L( \# u5 J' i$ K0 B/ n2 M' h6 g) U% S" ?3 O& p- \
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

  y* V0 X1 }9 A) x* Q- s) H# o! G4 C( S

! ]4 z5 U. J8 ?- O$ `! Y
* V" O0 `) \5 H- h! p2 e$ p# k5 ESet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

- i7 W$ C6 }4 ^% ]
$ d8 z4 Q( t! X8 N' A

- l* i+ A, ^3 A& Y" _
7 V) [1 u; g2 b7 Q2 m/ ^" b[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
5 i8 u8 [9 Y$ d# L/ E相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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