QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 3306|回复: 6
收起左侧

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
0 S9 x  F, j+ t) R' F/ Q4 _1 }, c! M' u# S, `8 ^$ r
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. % x, t9 k& i! s' B! J  ~3 s/ E
  2. '假设画一条有三个拟合点的样条曲线/ }' {  j/ J0 x; @2 c
  3.     '声明样条曲线
    ) |+ t5 Y9 {2 D  s7 k# C
  4.     Dim SP As AcadSpline
    . y1 ?8 K1 P/ _3 e- e- M3 E2 z" t
  5.     + W- i# D1 h( D5 M- t
  6.     '声明样条曲线拟合点坐标数组2 X* A7 n3 d6 u, X5 ?" i/ T3 I. G1 H
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    6 `) ~1 q4 l) P$ H( X' w( c
  8.     Dim fitPnts(8) As Double8 C# f' q9 e/ Y
  9.     ; Q0 D  \/ Q; {$ Q) W/ V
  10.     '声明起点切向数组0 T2 h  s$ L& B7 B# J4 Y# l3 O2 }
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组, ]& a4 F' |+ ^2 _5 w- ^
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值0 c7 e& ^# b4 i* F0 `. D  o, p
  13.     Dim sTan(2) As Double
    # d, K* N- X0 j8 e8 y
  14.     # g4 A- N1 a# O3 p' a# ?7 T4 B
  15.     '声明端点切向数组
    2 R3 ~, i2 S/ d
  16.     '和上面的起点切向相似9 N3 s% w5 u1 y* b6 A
  17.     Dim eTan(2) As Double
    : e7 E% v% S! D: U  j
  18.    
    * \2 t, L7 I& Y# B4 S' G) l$ M
  19.     '样条曲线的第一个点* w5 f7 ^* b# V/ |0 l
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 05 L0 W3 {( |1 b" N5 m3 {4 v
  21.     '样条曲线的第二个点6 K- P: M9 Z' l8 Q+ s( _
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 03 ?4 k" G0 ^4 r4 m
  23.     '样条曲线的第三个点+ m/ d' I/ y: L4 V, i# b) S+ c
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0
    7 o6 \( y; j# a
  25.    
    ) S* Y, ^! b5 p) K. W4 A# K
  26.     '假定样条曲线的起点方向为水平向右
    ) N: S: b7 H% K8 r7 K
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的8 e/ d2 O% m; G* W
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为09 U1 \* y$ W. E1 j+ A
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    - o+ u( B3 H- U( D* x; `: T  r
  30.     '假定样条曲线的终点方向为135度方向
    9 X1 A& }% ?( L: Y7 i
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0
    ' Z& E% r  \8 F; @& w
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0
    ) x* n$ E6 b7 t, u5 X% V0 _- h
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    0 X5 m! m" V& f( K) t+ A
  34.    
    $ Y, ~4 z2 {& _7 f# D) |
  35.     '画曲线
    & L+ W! ?. X; H. {1 n& u
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    ) ?  U5 K" x5 l6 w5 h. M- C
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!
! a3 B9 z! ]( e- h
2 `8 |" f: {0 E; B2 ~, h3 \6 d, {/ |% i8 G! q/ v: n
$ t: L( i- @: `, ]) X
1 F  |  l7 i% C! L" M8 c  S
Dim Xb1 As Variant, Yb1 As Variant
9 t  }- B8 R4 }; @4 y, ]

, y; l& @+ s* [2 b
Xb1 = 0
. z- o, R5 v% bYb1 = 0
1 c2 l7 O8 B; S7 K" w4 @

  G$ A7 v6 V0 n2 g; ]/ Q6 S
" R5 I4 i6 e5 Y0 H  j! X& r! V
Dim Xa1 As Variant, Ya1 As Variant
+ j" M, o3 J! C7 l2 s2 y* }' j1 H% T5 e& {1 x
Xa1 = 0.5
9 p: I! s9 ]; a, x8 FYa1 = 12
4 {5 @# m7 X- n1 W4 s  H1 z
0 @" L7 t; B. m5 U+ |2 j- b+ t: s

6 I( P& _& w& P. M
$ |, B- R! s/ w% F
* r& s3 Z2 l/ T8 @! t$ D
6 y9 w3 Z: S# E8 b# g3 W; m3 e
& x+ |5 a$ z6 y! S
Dim blockObj As AcadBlock
& e5 H0 B6 `, ^1 [$ x% E; y9 ^; S

! h7 K6 x7 {: j" o0 n/ rDim insPnt(0 To 4) As Double
5 F+ I) ^& T6 d9 i, y/ [

% A) B) g$ ]$ }3 ?# S- jDim allEnt As AcadEntity

" O: e& I; p4 T/ T4 r* G) U+ }) x0 F$ Z. T: h% h; y
Dim blkRef As AcadBlockReference
7 o, F  u. O9 g

  P2 ^- \& t. I0 xDim blkCount As Integer

, s( T3 f1 ^; H' p
# k  D$ X5 K: [+ H& S3 dDim blkName As String
) N# F( p! t: N
8 O. V- j9 l' \0 e  h+ ~

2 H6 o" E1 W" v7 F( k% v9 e: k' z. n& l4 ?1 N
For Each allEnt In ThisDrawing.ModelSpace0 \* e6 w" M0 P) H7 }7 K1 G
8 m5 R+ `1 n  h5 G  K' N; S: h
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

1 \& T+ }; j+ E& @$ S: i
7 k, a' i# Y& e" ISet blkRef = allEnt

+ h, B& H1 {- Q! [
% [" d6 i1 j- v  R5 L* l' p/ S. W' H
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

" s; h* I$ R# |0 t
# s4 ^; ^- E* ?2 }7 q7 ^& MblkCount = blkCount + 1
  l9 O3 a, ]2 _9 W3 H

7 P. r& D8 z0 E$ o8 }5 {7 IEnd If
$ A; J$ L" K5 S+ l! |3 @

6 u6 ]0 l; b3 p0 C+ X- r; OEnd If
& K/ Z% O) t; p& r1 P
9 O- }% {! i! w! g5 m/ B" V
Next

* f+ N/ y, b  G7 C0 N# w/ _6 \0 \/ _
! }4 i$ Y8 g, f# z" AblkCount = blkCount + 1

- G1 e- d/ T3 t# I& ]2 E' @( H/ S' |0 _# T. j$ @4 `9 }

; s- Z% }- \0 h' B4 U" d5 A3 LinsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0' M) k8 F5 P- Q. u; z; ~8 e2 ?
+ ^7 a" v: j3 J3 W1 z+ e
blkName = "blkGEAR" & blkCount: _2 f5 T1 v# _# o

2 c$ j' x( \5 E' B. y
  @" i$ J( C. g4 R4 lSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;
1 F3 h7 {4 {/ Q3 [; Q3 I) a1 |* R
: k1 [( f/ Q+ z' l& L' X

8 a; L5 \/ P2 }( a
3 _* D  D& N0 u; y
Dim sTan(0 To 2) As Double
) ]) t: m8 b% Q$ o' W# ?7 q% ^
4 Z7 a8 b; X6 kDim eTan(0 To 2) As Double

- P6 D$ c9 @' W
1 l- r. V% n+ G, @, QDim fitPnts(0 To 14) As Double
5 R! E# b6 Y1 z! f/ ?2 R3 o) G2 F: P- d& y7 n

0 Z+ A" f, ?$ ^6 M# a2 wDim splineL As AcadSpline

, c  i/ v2 o' N" t% U5 K! L: U
Dim splineR As AcadSpline

2 G1 u( ^1 M( r' v. f: `) g9 Y1 ^; ^/ h# F2 r! g
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0
! Q6 ~7 u# _. g, D# z! m) A3 B

* ]7 q" s( y: ^0 _eTan(0) = 0: eTan(1) = 0: eTan(2) = 0
+ U' O9 z! I# n

) R& s3 N' v' J8 ffitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

. e0 d+ c3 @! D8 w
5 S0 |7 N8 L7 _2 i- o+ B1 ifitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0
: s. t7 v9 B3 b; j4 Y; k. C
) S! T) `3 Q$ h3 h6 {
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

! a% h2 `- S6 n9 s" b
" I# K8 o+ A8 b  zfitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
2 {1 ?0 R" z! @$ x  q# f5 _

( ^) [4 p, Z& j$ W. g) z4 o1 H* }# {fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0
! l. T) N1 f) S- ?
5 c4 s$ a/ f% T9 b
5 a: x+ b5 G( \; \! A3 T

  X8 h" u# e) C2 c# Z$ Q# USet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

/ D+ z: m9 O4 D1 S8 T  y
8 |4 [8 W& o: m, L$ M! W

3 f& C( O1 X1 h
9 Y7 I5 j$ ^6 u! i& C( S[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
; x/ o  N, \4 x相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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