QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 3310|回复: 6
收起左侧

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
8 g( i  {; `1 ~' m  i7 M9 _# {& u8 b* v! C- E" c! g
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. / V1 S$ e) x1 f$ I; \
  2. '假设画一条有三个拟合点的样条曲线
    ) P$ _" a) p  J' A& J* [
  3.     '声明样条曲线
    ! B( ^4 w' e' \( j. ?
  4.     Dim SP As AcadSpline% G4 ?4 q! s, V1 m' c6 C
  5.     - R7 H: j9 F( }: c& B, H' h
  6.     '声明样条曲线拟合点坐标数组
    ! @8 z) G6 `7 ^6 E* U' d
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    / s$ D. s, c- q+ ~$ d+ Y8 h2 d) F
  8.     Dim fitPnts(8) As Double* U8 x" w$ e0 P+ k
  9.    
    9 c  x* n3 Y6 [6 D0 r
  10.     '声明起点切向数组5 T6 D6 ~9 H* }# X$ A- s7 C
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组* l; }1 r1 a4 ], h7 O
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值$ i; o$ `2 ]* e% s6 A* e2 D
  13.     Dim sTan(2) As Double8 V2 P. a# P7 @  Y4 O' `3 r8 H" V
  14.     9 f$ G7 `/ `) F, s7 l8 M" k
  15.     '声明端点切向数组
    & K" U  T. |) u9 R0 y
  16.     '和上面的起点切向相似
    4 Z$ |1 G* L. _  s7 O
  17.     Dim eTan(2) As Double. I" q$ `0 [3 _8 Z" o
  18.    
    $ n2 Y( d' R7 f# N# O( s, x# B; {
  19.     '样条曲线的第一个点
    ( ~5 S* M7 ^( r" E4 H8 _7 n- C
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    3 B3 C6 w" C% t( i; h% m
  21.     '样条曲线的第二个点+ |7 w: V$ v8 l  {' r6 f# h
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0
    ; u, P# ]5 j2 {# y7 k3 ~8 X
  23.     '样条曲线的第三个点% u% l+ C$ O3 ?) t5 P7 K* I
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0
    ( r/ Y. A; r0 V6 ?7 f* I
  25.     $ W( J$ f! f+ h% N
  26.     '假定样条曲线的起点方向为水平向右$ y8 {0 h( R- q/ \4 s6 Y& U' [
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    # z. S8 J7 H# m3 p+ @/ y6 ^  q$ H
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0
    . Z' W4 P1 ~2 G. s; W% \
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    7 }& R  M$ p; Q
  30.     '假定样条曲线的终点方向为135度方向! @2 W  o* Z& M6 G8 q7 ^: A) |. [
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0
    9 W9 \5 s. L- \8 K# s4 l  b; Q
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0
    # X: c" B- A% \1 w
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    - M/ d( f- F8 B6 n
  34.    
    8 B. M- p) Z9 U3 m
  35.     '画曲线1 u2 i& S3 K; E& _3 y+ J
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    1 |( j" i3 f) ?6 I' S
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!
4 C  Q: R% m3 Z3 l+ C, c; u
! g9 _( W* Q, o! ^$ H. R6 y3 q
! i9 R/ m# w2 \: n3 h, X0 e; R8 ]1 e. N5 b7 C) }

7 \" y4 m5 O+ W, k. v  O: i; n2 mDim Xb1 As Variant, Yb1 As Variant

9 P9 C! f1 ]+ W& Y. a
% ~6 G6 E' ?% Q3 ?5 W$ f+ D
Xb1 = 0" X1 A7 I0 `& n9 c. C: J1 w) N9 q
Yb1 = 0
) i. h  B8 j* p9 Z" X

7 V1 l, K+ F- K2 d9 G" [- X1 f4 V. O9 ^, I! s1 D
Dim Xa1 As Variant, Ya1 As Variant3 i, C  b- o1 x1 U
, m! K( E4 ^0 A8 f0 h) L
Xa1 = 0.5
* h/ E3 e& h& @- e* |Ya1 = 12

& t3 H7 G) n2 j& n
# F# B! k6 T; N) b- z, p

4 B- G! w1 W5 I! e  s
( U; ^8 X: }! z, i8 W) Z4 o0 Q, V/ K9 A/ _! K
; f! D& i9 L; a( s

6 d0 [6 e) ?$ ]) Q6 N# TDim blockObj As AcadBlock
$ x1 o  o8 O3 e! \

. W% }! A2 x9 B) O6 MDim insPnt(0 To 4) As Double
2 |/ _/ z6 J9 {  d
6 H8 N, p$ S0 K5 a
Dim allEnt As AcadEntity

% h* Q8 S6 O: q
; j! P7 S( g& kDim blkRef As AcadBlockReference

" @, T2 `  K# \4 q- Q4 {: j* g. b
$ i; s, {$ ^: ~+ b3 p" v+ L' vDim blkCount As Integer
! ^# D7 P4 b0 {( s% Y; d! ^
: G0 y/ Y# O% L: p. j/ s1 F4 H
Dim blkName As String

. i0 S+ b8 q- o% Y3 z5 h) E  F
9 G; n9 p  j: C8 {9 t

- r  k2 H2 u# \. j# b# Q% O- Y  u' u- \( c- K, x
For Each allEnt In ThisDrawing.ModelSpace0 B  {7 h, s. v5 {0 r# T

0 a5 t* F6 F: i3 QIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
- \: d- `4 ?8 U% U1 r; c
  S" E# o  [) n5 ^/ r! d+ a
Set blkRef = allEnt

$ ^: |  R0 [2 Z4 u
2 ?3 g/ v5 v: ?4 v- Z1 o
. R2 _% q$ q6 F" [If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
3 @4 {2 B- `1 t2 O" ?$ t5 b: r

% B/ P+ W/ ~$ o  q7 NblkCount = blkCount + 1
+ ^! r( c; P( d2 P1 |5 \
1 M& E& E) O6 H  _! j. }. ~
End If
, b4 q6 `0 B- q1 V

! P, }" R! O! i. W  [End If

- B0 i$ r0 f! L% d$ r, [7 r/ F5 i& ?9 _
Next

" q$ ]5 H5 \/ _. g# L/ v
3 O& b8 A2 i2 H7 a8 G4 b8 Y8 Q7 tblkCount = blkCount + 1

/ l( ^9 m" i1 u( u+ A# ^/ p
- _( o. }% ?+ f5 a6 W

5 v1 P! ]6 Y8 D# G2 h- C) k! ZinsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
6 }2 l( c2 O% }1 e$ `8 b/ d; J
4 f- C4 C$ Q. V) h; [' _8 a2 r% lblkName = "blkGEAR" & blkCount! I$ B( r& l8 H6 G
, I( j- I+ o1 N& i$ ]

7 N3 ]' |" V! [/ H$ Z" HSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;% C! z$ h9 @6 B1 _
0 u: f* S9 u* f! S. a

' |! M, n. r1 }  P$ S) N* q3 o  W

# W. E* g4 M. C; s9 z' ODim sTan(0 To 2) As Double) @9 A: U9 T! `% ^% g

& s! E( E  S" {3 b- KDim eTan(0 To 2) As Double
( g3 r0 N# E' C5 W# _' j$ z( K

# [# _3 ]: D8 i( y$ nDim fitPnts(0 To 14) As Double

" g: B- p9 [, a2 A3 S4 {& {0 K# \4 C7 ^) X9 L6 }& A
Dim splineL As AcadSpline
8 ^8 ~1 L( R4 z# t

. `0 v1 W$ b# }7 C0 K3 e0 v! hDim splineR As AcadSpline
+ I1 E7 C4 N8 }1 Y; \( F* l# U
" A6 C$ i+ c2 x& D
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0

3 G6 b( q7 ]& Z: t7 @# l% G8 v4 `* w4 [* E( }( l  z. |
eTan(0) = 0: eTan(1) = 0: eTan(2) = 0

1 s8 J* d) \0 H1 q+ l( E+ `4 w- o1 g+ [9 c
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
, m# c! o/ Q) s! u, ^6 h
6 Q. \; S2 ~1 E" q5 @7 p5 W
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

9 n6 ]/ m3 R/ L. Y# Z0 x% L4 N9 J5 {4 x+ f
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

. ?5 Z. k% N/ [% e1 K
# {5 d7 ?1 R8 Y" ~  \# L7 RfitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
0 ~5 B7 o$ X) m. V$ K

7 T0 t2 E6 z$ t' I2 Q/ |: BfitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

; r+ X, {: i2 j. K9 m0 N# _# r
9 t& d9 N+ P8 ^; x
7 T1 E. A# U  ]; n# B* h+ n: `

" O$ |. i" C* q' N( hSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
: T: y8 b- |0 P8 n

0 x0 C1 g: ]# {6 K" G0 H0 h3 J

9 f# M* E0 j* I( [; J6 K
: @; O% Q4 U2 {; u1 z3 |[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.4 ^/ Q1 d6 \3 g# ]# O$ L
相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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