QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
3 i* h9 `) w& c- L' Q& ^" N; Q
+ A7 s. V5 n  D[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. ( l$ r+ D  F2 G
  2. '假设画一条有三个拟合点的样条曲线
    4 u& s) R) h2 m9 `# Y7 |3 m
  3.     '声明样条曲线( M# K9 T6 n3 U1 u( k/ j4 ]: J
  4.     Dim SP As AcadSpline
    : P* U% o1 ~4 z( q% h. H2 B
  5.     ! W- ~$ C% G6 R5 H* m9 O) ?
  6.     '声明样条曲线拟合点坐标数组
    * K% _8 S" t: c% k) i7 h4 |; U& n/ r
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    # u! N7 V. }- C+ Z
  8.     Dim fitPnts(8) As Double
    + V2 }# E: t# }: x' z: L1 p1 a
  9.    
    : p5 F5 D( p# `! T/ G
  10.     '声明起点切向数组) I, t3 P0 x2 m* \6 w: j
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    , E" H  X% ~0 t- |9 A0 I5 Q
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值
      o: J" O  E" D2 f, H- N' |+ X! p
  13.     Dim sTan(2) As Double
    ' ^6 c9 O& M, E+ w
  14.    
    : m- X- p# i9 s. e2 p1 f
  15.     '声明端点切向数组
    6 i. p  s; k5 T$ a  t
  16.     '和上面的起点切向相似
    - ^* o# `; a4 R4 N6 H
  17.     Dim eTan(2) As Double
    3 Z1 I. f" H( d! l0 |! W
  18.    
      e5 C7 d' q( k
  19.     '样条曲线的第一个点
    % H! K, a. t8 I$ f1 U& x: ]0 w; Z
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0& M* s  a- S8 ]" s
  21.     '样条曲线的第二个点
    ! Z' [6 X9 @9 B5 K0 |; W+ w. x5 I" ?
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0
    * L  l$ t( F0 U. b3 B3 j
  23.     '样条曲线的第三个点
    7 d4 X( D# k2 t% V8 p% T
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0" ?& W& b# W. j1 W0 A4 v$ @2 I
  25.    
    # o5 d; i6 `& l0 {
  26.     '假定样条曲线的起点方向为水平向右
    5 p: J) D% w* J# x( m1 N
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    , t+ q4 G" ~9 E
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为09 W  M6 U3 o1 o8 C0 ^; E
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    ( D8 g+ c8 A: m1 Q$ r2 ^+ E
  30.     '假定样条曲线的终点方向为135度方向) y& Z7 G5 t: a! E( `9 z
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为01 n6 z+ W! Z. ^
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 06 F" C; h& E5 e  h$ |
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    % w9 a2 m8 @6 e% F5 B. A- f
  34.    
    3 |: }( v. V% u! E9 t+ Y8 _
  35.     '画曲线! x9 M" }. M, V2 a* K
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)6 r2 r% w* e. o( t9 {, r7 }" 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!/ N" c% D, a8 \/ g, S6 v* l0 x! K& U
% c/ F2 C1 Q4 u1 P

( W1 U6 T. D% C7 U& f, w# L! }& J
0 w6 `, P0 J. D' G3 s7 Y, `+ G4 s/ O- v" l0 w' o. x
Dim Xb1 As Variant, Yb1 As Variant

7 H; a9 `" M; m
/ k1 R' x8 ~- Z( `2 Y
Xb1 = 0
, q) F$ I% ~5 d7 E& L( w) YYb1 = 0

3 S4 }3 y2 R: ^3 H2 H

- j; c9 Q8 v% ^9 K* a9 e/ |& x: i% r0 g' ], P
Dim Xa1 As Variant, Ya1 As Variant
3 W8 u, m/ f/ K& ?0 _0 Z2 C! P
5 v/ m0 P) I2 _1 Z
Xa1 = 0.5; ?9 v6 w# w0 O3 B
Ya1 = 12

$ Z! G. I9 A4 A4 o# `5 J% Z; L* K- @+ h
  M5 N6 {/ e& l" q' j/ p

9 d' w& K" `9 T" }) |& ]! P$ f- t' y3 J  F

& M1 V) B) B) j$ p0 s$ b* x# [) r" w7 p9 b7 v" x
Dim blockObj As AcadBlock

! n' i8 Y2 t- _5 n* G" T% F# |$ j& g
9 _% D" W3 [2 o( j: KDim insPnt(0 To 4) As Double

3 Z& {2 S- y3 ]& l1 K
( R9 v7 ^* }2 h; Z* @) }/ O# N; ODim allEnt As AcadEntity

( f( w- k" ]$ v
; B$ f( n) \" L8 p1 \Dim blkRef As AcadBlockReference
+ @5 W+ D2 O$ K( }) G
" N  T# I- s3 o/ p* i2 O- i
Dim blkCount As Integer

9 ~; n8 g2 \0 |% D  Y( F9 ?
( p$ L& ~0 i8 s% a5 oDim blkName As String
. c" |( K4 a. Q, ^8 }
4 J& \. R: H5 T  Q9 Y8 X

* a. [- }9 j7 y" M: h3 U, H8 y8 Z5 L% Z* X
For Each allEnt In ThisDrawing.ModelSpace
5 E3 {! ~" k- J4 u! I7 T5 o- K/ c' @! h3 s& A% b; B
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
3 {, L1 O3 R2 p' @  ^

3 ]* x! g; _& R) eSet blkRef = allEnt
% z( j# b! J. K6 R* s9 l
& q$ ?: F4 F% G9 d/ V
$ S' p7 P6 U) \" f7 N1 y7 _' S6 F
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

" z0 _7 i0 V' a0 o* v, I
) }! S7 W& b, b( j9 d% a& f3 r* x. _! iblkCount = blkCount + 1
! h, `7 {; z2 N/ Q3 f. k
& L: L: F; E3 W4 p0 ?
End If
: s1 s5 T( x1 x
: Z6 ]0 O  }+ t; _" Y/ v+ F. g( J
End If
9 o4 A6 b, o/ X1 _$ ?5 T6 w

4 _7 r9 M& r; @Next
, Q8 \! E! D( X0 ~+ D8 S! R
* X' ~' ?9 e# O: j! \) N
blkCount = blkCount + 1

, n$ y6 Q. B. |
' {# f, g9 l( k; T5 d  Z
! O. y; q; X5 H; F
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0( `2 }" d5 |; k- C) ?
4 z* |* M7 F5 B, a: k3 n
blkName = "blkGEAR" & blkCount
/ d6 X$ Z+ p: n6 X7 m- m

7 C5 q. G( q# g& n
2 O3 Z; Q# ^, K8 k1 c; ZSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;
1 ?! h* }2 E2 }/ I; m8 K
6 ?; g% f5 P6 r
+ n1 |5 U2 g3 R# g' B$ k
# b* W4 b9 a( E/ m2 z0 W) r
Dim sTan(0 To 2) As Double& V, w4 N) L% v+ s
$ y4 h  e6 C0 Q; Q
Dim eTan(0 To 2) As Double
1 X2 P! B% W" Y+ f
& J7 C/ P: @- u+ q* n
Dim fitPnts(0 To 14) As Double
; I; O9 @' i/ ], M( w

$ w/ t. r$ I, r. m1 zDim splineL As AcadSpline

$ U' A0 A: w* L3 U: O9 A& u9 v1 n/ r; Y' t8 k
Dim splineR As AcadSpline
- Y3 n; B$ E( L6 E

9 ^9 t% B1 Z+ Q) x) F8 ?# G6 L3 ZsTan(0) = 0: sTan(1) = 0: sTan(2) = 0

; k( m- J. C5 m" n
' Y5 o8 ~) s$ v3 b2 }9 ZeTan(0) = 0: eTan(1) = 0: eTan(2) = 0
( q0 G" Z0 a. E  g# x+ L9 Y( l

' Z6 n3 l- Z& J- IfitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

/ a, J7 z- \9 _5 x# |) y- J8 [
7 a- d  D" r6 W1 L% Y+ z7 }* wfitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

/ a# ?; C: T6 \6 p* }1 @
- z. F" m* p0 ^0 S3 `fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0
0 o. {; ^) D0 ^  @; E3 I
; B3 Q% v- b( L& }0 f8 S3 K
fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
$ N2 d! x- w- \# b

% t4 C4 x! L' U8 dfitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

. s- ]$ _! ]. S7 R# @
1 G3 @7 W6 g$ R$ I6 K

" _7 a& H6 f4 ?( |9 g7 B' p
( e* F: w/ E+ h5 U7 y; F) TSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
7 _7 Z9 v# D2 O+ o

0 Q8 x6 e( o" @+ P( t3 ?
: z+ k# ]. v/ V
: ^6 y& i* h( ~: y1 n' X! d0 T! I* R" h
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.. v; F3 Z, t; f9 @$ J. @
相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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