QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?# m' H3 h4 e+ X5 z/ q* c7 y/ x$ K

. o( E1 b! ^, U* J- }[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. 9 t9 E0 I% r( W8 w% h$ N& f
  2. '假设画一条有三个拟合点的样条曲线
    : I0 P$ d  s6 R1 B' {1 {
  3.     '声明样条曲线
    * A7 _. g) L8 x* a
  4.     Dim SP As AcadSpline3 k; U- \7 k* m) ~5 A; p( N: [
  5.    
    8 y4 O. Z1 Z1 ~& o9 M0 j6 H
  6.     '声明样条曲线拟合点坐标数组
    9 C- q- h0 i9 x  s3 M4 s
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素5 `# h" P) U4 K& n
  8.     Dim fitPnts(8) As Double
    5 i+ [$ g' }+ t
  9.     & F3 p2 {9 |- b8 D9 u1 I& x
  10.     '声明起点切向数组+ r" y  T6 D8 L' P8 b; v2 `
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    9 E: _/ n3 `: o: ]; b
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值8 x' F0 E9 w' `9 M; ]2 C
  13.     Dim sTan(2) As Double
    / q& k4 z4 G5 U& T
  14.    
    3 l" P3 n% Z. I4 v& ?
  15.     '声明端点切向数组: @/ I" K  R# K9 A+ @. N- [
  16.     '和上面的起点切向相似& X7 e5 Q% D8 B2 v: y7 E: ]
  17.     Dim eTan(2) As Double
    ! x0 R$ {9 h% u( ~" f- W2 K
  18.    
    % }6 i" F2 G# e$ h
  19.     '样条曲线的第一个点! b4 ]$ O, m# l7 Q7 V
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    8 [+ \; \' r& S+ T' Y2 V
  21.     '样条曲线的第二个点% y( t! E$ Q% ^* A
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 05 L, d& R5 e0 L2 y( e
  23.     '样条曲线的第三个点/ s  X/ P7 C( b% d0 w* f
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 07 f4 \! n. v% o0 h% P% R2 v
  25.     3 X' U4 X9 q1 @- W2 d( V& f% H
  26.     '假定样条曲线的起点方向为水平向右
    2 P, Z+ T$ H+ J8 E2 M2 v
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的) j; Y' k9 i7 e- y
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为07 H' s% F, {5 O( R8 n* ?
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    0 k3 b7 {$ Y% I8 E5 N
  30.     '假定样条曲线的终点方向为135度方向
    + }" y% m% o( L! I# ^7 [3 n
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0
    , ^& l' g. z: b7 X
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 04 t6 q6 z" C/ R0 z% e- \
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向2 Y: ]  j, l+ `( p" N2 o
  34.     7 k: P6 l* [: q: `: m
  35.     '画曲线- `0 V$ a' |, O; x
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    8 B/ m9 a$ w) w  j
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!) U, h* u1 s" T3 @# F

3 m' |8 F  L! t7 U9 @& k" U- {% @* J: M- w0 }4 Q5 w9 b3 f
" S" y% A5 n* ?5 g: g! s

  {- a6 X# \' l/ g* bDim Xb1 As Variant, Yb1 As Variant

) j1 k) E( o9 ^% n% c, k4 V/ ]5 c2 q  F9 [' u4 Z
Xb1 = 0, K, b5 K# Q' o7 d8 W2 ~+ v% |; a8 k
Yb1 = 0
: j" {! ^( o% [

+ z: a" \$ `) d# }  T& d% j& N
: E0 z: f/ s  q9 X7 [3 g  W
Dim Xa1 As Variant, Ya1 As Variant* i0 s+ q7 D. A6 B
  G1 X& n9 K3 |0 [2 c; F. y
Xa1 = 0.55 H; N2 V9 Q0 p8 ^. p
Ya1 = 12

5 F2 C; A+ D! s) J1 J8 [- A% @! n4 u& t

, X5 P2 q, n: f. Q* j4 x  n
/ x1 n9 l1 Y$ p7 n. d3 A
. @. ~+ A! |2 m. S* ?% {! ~" d
( r. J* h, d' P- T9 K# Q# {
5 a7 v+ N/ u7 l0 s7 z+ D4 I# l9 _
Dim blockObj As AcadBlock
7 l8 e- C) P0 m$ ?" d$ Z8 w

9 {4 m4 L2 `. V' tDim insPnt(0 To 4) As Double
, z! j/ U, b, j

' G5 w9 c' [0 H0 g! @, `Dim allEnt As AcadEntity

. N) S( \6 v$ o* b3 W1 S. Y7 z8 I% u4 ?1 |
Dim blkRef As AcadBlockReference
. T! t( e- v, w
& G7 ?1 _7 H' i
Dim blkCount As Integer
" a/ k) @7 X) q8 g

/ X( l0 r/ j; H: tDim blkName As String

# ~1 f) j) n9 v1 x7 ], a
) R; z* c% y# Y2 ?( L6 _

+ Z/ Y; I0 g9 K  k- u. k5 m6 v" g! f+ G6 Q+ ^: u3 c
For Each allEnt In ThisDrawing.ModelSpace
8 f! ^& H* C% j& A+ D) M8 i5 }- z! t5 N- y" b, `+ h% I
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

2 G! o$ H1 F3 M. h0 O) I1 \; a4 J! {2 B* W% R7 `1 C( J
Set blkRef = allEnt
1 D7 u0 z/ p" M$ x7 k4 ~

* N+ R" x# T" f, F5 h: Z  T' v2 @+ y: A/ t$ [# K4 M" T$ f6 j
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
& g! [  t; u7 `+ N1 M
/ A' m6 t5 c" s) _; Q  U7 q
blkCount = blkCount + 1

5 ~! o, ]! i% q" z; ^
) k  \$ x/ f6 p4 Z! D; o" F: Q& {! F* X1 [End If
. R2 Q  S7 {4 d2 r. h% V5 a
1 j# `6 S' d% Q# ~9 R7 X8 Q
End If
; t+ H  c0 u/ K9 `4 Z1 o

, G2 s5 T( ^, J6 cNext

% c8 E2 s9 D0 U3 ~. I. H  b0 w9 U1 S: Y! g
blkCount = blkCount + 1

, A' ]9 v9 {' i/ y
7 R, L1 L0 o9 _. m4 Z3 D
3 f: I6 j2 Q% C' R# X1 }, f$ ~
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0- T+ a( h, x8 C# u& [
- h5 V: w, Y' O1 p, e$ f
blkName = "blkGEAR" & blkCount
" p# a& S  L% c
: @% y# A) p5 y; `; E

( B0 E) E6 \5 t2 SSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;( ^& ~# L7 Z% B7 e) [
; c; I# x4 j5 F# F$ T( t' x1 q
/ E, A  J* f- V& ]/ P
" m% {4 c) b$ V9 i& r
Dim sTan(0 To 2) As Double
9 B2 o& z8 Q7 ~, H& K# ]( i8 Y! v0 j/ F
Dim eTan(0 To 2) As Double
$ P% j. u7 P8 u4 ?8 c  E1 T% h

+ [& Q! r$ \; R2 u' n0 GDim fitPnts(0 To 14) As Double
$ w. S  x, I+ t# k: ~0 M6 P

- {6 I6 {1 x% t( k9 |Dim splineL As AcadSpline

! \* g, f3 J& `1 z/ |6 n& @! C
! r8 X; X' h; s' E3 F( RDim splineR As AcadSpline

' i- R$ ]9 O7 a* c* |
: w! F0 u6 j$ J2 IsTan(0) = 0: sTan(1) = 0: sTan(2) = 0
: m8 [6 ~6 h: S2 k) }, ~! D0 P7 e, i' t

/ z+ B# c: f3 c3 n7 eeTan(0) = 0: eTan(1) = 0: eTan(2) = 0
3 a+ F) |6 v* k7 b  B: J

  E% `; T1 P& W: o8 Y' GfitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
1 C! \, H; g" y4 c* z

2 W# z3 c5 ]2 h$ u& L0 F9 A& BfitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

* w* _5 i7 T# p" p8 M% x
' W( N8 @& }+ ], g' t* g; ?fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

# D4 p) B6 t5 Z8 R' j+ @% d
, m2 j9 H& a/ b1 {; ^fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
: i+ ?# j, L1 V# j3 j& `

5 s8 v" i- I7 a/ N9 xfitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

/ a, K) p4 x) L& k) y& O( d3 r+ m" Y, d0 M4 @
. e  b2 D% ?8 r8 j) z
* S( m0 a& \- }$ B& j7 {
Set splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

3 c7 h' P7 n5 A$ P! ?2 T4 k- ?
5 c+ }0 y9 ~# T0 b

7 U( B4 K! b& `; t! U1 i) v# o% U
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
2 [: \& T( O# K, s; C" n8 r相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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