QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3304|回复: 6
收起左侧

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
9 n( y0 W/ Q4 X* ?% Q
- K7 \: j0 b, H  g# z[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. % c5 S* [0 w6 h" L( s4 M" E7 C
  2. '假设画一条有三个拟合点的样条曲线# R) I4 K; i( s; ^" K: d- V
  3.     '声明样条曲线6 z. ^4 q6 b7 R& i
  4.     Dim SP As AcadSpline5 `. \# g  c* J1 ?$ Z! q# s
  5.     ( z- n+ V8 @4 B) {( T' R! x
  6.     '声明样条曲线拟合点坐标数组; B# _7 {3 \) p, t6 g. B
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    ; q0 o2 D7 Y1 P: {) e* k, E+ G
  8.     Dim fitPnts(8) As Double! s. E7 A0 ^( Y4 @
  9.    
    ( f2 o& g# b) d7 x% z) N
  10.     '声明起点切向数组$ c4 I# B" o8 t7 {3 O8 L
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    ! {0 E* F2 E6 v0 r0 P# L
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值; D+ D+ w) P; T; K  r8 m
  13.     Dim sTan(2) As Double& W- I7 C+ P& A4 f6 N: o
  14.    
    0 Z: w2 Y" @9 G2 c
  15.     '声明端点切向数组8 |. @& U! p- _" Z
  16.     '和上面的起点切向相似
    ( }, B. E% ?+ ~) J; }) m
  17.     Dim eTan(2) As Double
    2 `- c% G* z$ E- N. H$ {) R8 W
  18.    
    8 j6 \5 H# H  r, W$ B+ w
  19.     '样条曲线的第一个点
    8 o9 q1 m/ Z! q5 V; w- L4 z5 A
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    ' X9 t3 q# N) P( I6 P5 r1 w
  21.     '样条曲线的第二个点
    ) u! ?( r# g% j( Y; F
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0
    , L" G  J! t$ N! L3 R
  23.     '样条曲线的第三个点  F, f- `- e1 `1 f  w. G$ |
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0; S, R8 ^  e% v) n3 O9 I
  25.    
    $ u3 r' {* S8 \- A  {
  26.     '假定样条曲线的起点方向为水平向右
    1 E/ P4 [4 G$ P; @. s" j
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    ! i; V: p4 o# h+ l9 H) f8 i2 {
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为06 c3 z; m  f, o0 \+ L7 }, L5 Q
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    # L' y) G9 n0 u) z8 x8 D2 n+ i2 J
  30.     '假定样条曲线的终点方向为135度方向& {' S7 s" b) a/ L& ?/ K
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为02 x& |( A& s0 X4 }0 o5 W* L9 |/ p
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0. p+ r; u5 |* f3 c- m
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    2 G( n5 Y. \: }1 m. a& u
  34.     9 {( G$ Z8 R$ b$ f) a9 E
  35.     '画曲线/ W2 m* I  _3 p9 E  d% a0 ^) e, g$ Z
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)$ y9 \2 W0 J7 Y3 U! 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!  n3 e: W# G+ [8 f; S
- |1 V5 ~0 S7 e& f' t( D3 L+ r7 D
' L% C; Y7 g( n: }

; t* T+ P9 r* v- D5 B% o. u6 a  `0 o1 _1 E
Dim Xb1 As Variant, Yb1 As Variant

( D$ H6 M9 y: ]. ]. h1 e& Y
- T4 s) E1 A" B2 w
Xb1 = 0
  m8 {* @  J$ X) ]1 TYb1 = 0
6 k. y! S7 |/ ?' Y) S7 I4 y

; J* k8 D) c2 H5 X
5 b; W  y4 k; I8 \  `, x/ J8 F) Y) {
Dim Xa1 As Variant, Ya1 As Variant
2 p* j- j- r# s. \. ^
" s5 R8 d$ J1 w
Xa1 = 0.5
4 p- i; @5 z6 z1 PYa1 = 12
1 ]' U% L# h( c, R+ F
( |4 N7 \" W4 L/ s' F
" \/ c& b& [+ K1 M; i' i( R

; G! t( O4 m! \; `$ A
) D# Y2 s3 r7 V  M

7 \. X  }6 u: u, f1 x/ Z3 w8 S
$ ~5 O; S5 x$ a' w$ B+ R' T6 m! hDim blockObj As AcadBlock
; t* b; @' N0 A, ~

2 I3 X6 s0 V+ `! |$ m; A( {( kDim insPnt(0 To 4) As Double

4 v; _5 N( E4 U% w+ U* t+ j  U  e( _2 W0 J$ g
Dim allEnt As AcadEntity
) n  p4 |2 i: R# A, q

3 w/ v5 v8 ?1 G) RDim blkRef As AcadBlockReference
. E- U! q1 L/ d8 t& l: n) L
& o" N0 I; ~5 ]3 y& b
Dim blkCount As Integer
- P" ~* o6 }7 b. C1 x! U) e
9 d+ l' J& L* C* J4 @7 H1 i2 i$ ]
Dim blkName As String

; c1 p5 X1 ?/ ?9 B
% e" M5 d  a$ \8 `
; |! n  S9 q  p* ?
; s) Y' _' z" t
For Each allEnt In ThisDrawing.ModelSpace
2 e, j0 b. }9 I, h: d
- U8 ]* H" `/ {: r$ JIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

% }9 M1 ~- r$ X9 l8 u/ w! G
( O# v6 Z) P( PSet blkRef = allEnt
' j) X1 n* t8 E
+ K8 d* \& v+ S1 l8 m( P" w0 w
8 f7 s# I- B4 l# w2 Y8 w
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
9 x% a# j8 f% O  n7 c

% P8 U( j* W) R0 s# v5 [1 MblkCount = blkCount + 1
& I* p0 q# k" @/ F# B8 z1 J

9 X; h2 o0 E3 ~' u8 j/ E" [$ {End If

* t/ v1 d$ a0 d( ~$ ?4 ?; f" i9 m# L1 C5 F0 p) E
End If
0 ]. p. `1 Z1 m0 r
: p, F( `" O0 }& X8 ^& q
Next

- e" C, X9 o* C7 p! G! a6 f3 _* }& s5 J) G2 u% _: g- ^
blkCount = blkCount + 1
8 k8 a' {9 G& W7 m1 I# P
. T9 w' x! c# e0 D
# D# P( G9 s7 G
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
3 X' M! [& F! G' j3 r' |
; v& @; l' }5 i9 e# Y" Y, g- gblkName = "blkGEAR" & blkCount
8 t" N2 \  B- s
3 d! K" m/ G' J: M- O# R9 q

( K2 \. K$ I  \9 ySet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;6 X" @/ c/ J# i: W: _. ~$ B

% ]1 A( Z2 a1 k1 R- N

+ Q1 l2 f: d7 r8 \

( ^" K. Y. x# _$ V5 z* uDim sTan(0 To 2) As Double
6 o+ i% u: r: g( N- H
9 `3 k; M8 M) q# ~Dim eTan(0 To 2) As Double

5 q0 k4 H( ^7 y, b& `7 @
9 o; f6 C8 J3 _, QDim fitPnts(0 To 14) As Double
5 t! c' {( m4 a& R
# B3 \  Y8 Q6 u
Dim splineL As AcadSpline
3 S- w/ l) d* e6 h" c, `1 K
) r; b, R! E4 q
Dim splineR As AcadSpline
) q5 Y  M$ [$ Y7 I9 W: \
, N2 v- K  h. P( J8 V
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0

3 N( r+ J, {$ D( H7 Z
! G/ M8 z/ [% S1 peTan(0) = 0: eTan(1) = 0: eTan(2) = 0

' o, z1 u% v/ j& d: c5 i. y
6 _$ x( O! y) l5 u. e# LfitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
- o1 W4 A5 D: S5 @, x. O$ n, j
2 S* h  W# T6 v" b/ [
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0
( b- t8 ~9 S" c0 G! G

! t3 h, D# H0 H9 l/ E2 QfitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

( b. y8 M8 N( n- H
, P5 X3 R, j" m+ ~fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
1 l8 r4 ~. H  ^" }; {, g/ H, m% |

! |% s3 v6 L# Y& \0 bfitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0
. e& q$ W0 ^) O9 K  g" ^7 B7 r

6 {8 D5 \$ [. ^* w0 s/ n  q

4 Y( }* D# x4 [8 v7 R
$ [# Y9 J5 m# c7 e5 I, K$ V& Q9 v  VSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

; l- U: O' S( N0 S- e& ~* i# d
' I/ S$ l2 C+ a* o& y- }: @
# H2 V" ?" D( [# ]1 {0 N$ N

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

本版积分规则


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

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

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