QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
* F3 B6 |1 M- O7 R! J. K- d5 c- g
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. 7 }) w: r8 @3 W% y4 N0 k- T7 }) F3 s$ p: Z
  2. '假设画一条有三个拟合点的样条曲线
    1 p* U* q4 S& F2 k
  3.     '声明样条曲线$ q* Q$ e( D: K* @, z6 ^
  4.     Dim SP As AcadSpline9 j" V! B: h6 ?9 J4 e
  5.     " s* N& _  Q& ?* I" s
  6.     '声明样条曲线拟合点坐标数组
    , M3 l( K+ l6 p
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素. Q# k8 N. T& q$ a
  8.     Dim fitPnts(8) As Double" C$ C/ E, G/ V  n& b  z
  9.    
    9 ?5 V& I+ V1 g3 x
  10.     '声明起点切向数组4 `( g  K8 @* c1 I& p
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组- l& g1 j8 |) y5 F3 g
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值
    $ ?5 P5 a- H$ B1 u
  13.     Dim sTan(2) As Double
    + ^% j8 B) S5 S
  14.     ' H$ k, l& V0 E& e! J
  15.     '声明端点切向数组
    0 k- X; G3 {0 }+ A/ l
  16.     '和上面的起点切向相似
    . l& u4 R7 t( g3 q
  17.     Dim eTan(2) As Double6 S8 J) S: h7 d* G5 W
  18.    
    6 N& N* i" G# s3 v& ]
  19.     '样条曲线的第一个点
    2 [& M5 Q0 V# v
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0" H1 s; K4 ?9 j" ?) }; n& ~
  21.     '样条曲线的第二个点, a# G0 D6 ]: b# {4 [
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 06 u) N9 M! s4 m! @/ E
  23.     '样条曲线的第三个点
    6 J1 G' A4 H6 ~/ ^# _
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0
    " V% R% G  e! r& E# u! F9 V
  25.     2 a$ q; H- X. N& u
  26.     '假定样条曲线的起点方向为水平向右3 A, r7 x2 S. `2 M2 v  b4 M2 N' X
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    ) K2 V( M+ ]+ ~* B( |( j
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为00 l4 g; u8 a0 q# U
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    , c% j. F2 |( D: M6 K0 @9 R# S
  30.     '假定样条曲线的终点方向为135度方向0 y$ [6 _0 l) G5 N! v
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0
    ' J! e* X5 M8 R/ `
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0% o* U9 C$ T6 b/ }! ]; _/ z" r! C
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    7 E% g2 u3 q) ]' m; ?  b
  34.    
    0 s! _+ |, q* O
  35.     '画曲线5 l# a6 z# Z# `" t" J0 _% ^1 o3 c
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    6 m1 c- z8 F2 Z3 F+ p# S, d
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!
3 U% Y, H& g4 W) Z& y6 I) u& F( g9 F6 h8 K! o: n" V, f

( e6 n+ L& [/ p3 r( s" V$ Z9 T/ e; k2 y9 S7 b; Y  ^

# d, T; {9 ~9 mDim Xb1 As Variant, Yb1 As Variant
- Q/ f2 v. W: ^# t( D2 |, a
! Q0 c+ y! j+ u! z  T
Xb1 = 0) z4 z# D4 \" t: _
Yb1 = 0
4 x' x) `* u% K" J

, c" r" j6 ]$ D4 E. R2 b, \2 d* E; H3 _' G) F6 p  G
Dim Xa1 As Variant, Ya1 As Variant
4 q0 l/ i% m( f- S! q2 H- g' R) }9 F! u9 l
Xa1 = 0.5
( P# }# G, q( i; O  z6 \: SYa1 = 12
( W/ c/ ~. T  D$ A7 ~# G

* M: h& f9 }9 J) U0 r
2 k( p4 `" z7 Q" Y( a: w( Q! L6 x

. m4 f3 F& u; ^" T, ]( R8 Z( k+ P1 z- u; d4 d
+ A% i: U! E# _- J9 G
/ h2 j1 o. n9 N6 P: z- P
Dim blockObj As AcadBlock

- i0 ], T9 }' Z' c" g% R* Y$ p0 S6 y7 Q0 g/ q+ q  n* R+ J1 T7 ^
Dim insPnt(0 To 4) As Double
0 T0 P6 q$ Z( m( @* A

# K5 [) |3 z: ]8 {' LDim allEnt As AcadEntity
3 R) U8 s- \  ?2 n

5 ]) g. O/ ?5 dDim blkRef As AcadBlockReference
) P" i' z/ r2 }- e" n

9 u) Z$ Y, w5 k! J3 N. yDim blkCount As Integer
. s$ ]6 m# l; C! x; @4 a

# ?4 H* d# \5 l* z" S: @  l* dDim blkName As String
7 s# ^- C% ]" T( n% X- S$ }! n; k
6 ?# ]: Z: C& S; w1 {2 O
  t' [& F# Z* R, F; F: q( R4 g

- t- _- k2 y  _3 M" N( b6 G/ p
For Each allEnt In ThisDrawing.ModelSpace
5 x0 n  A( S& U- S' h- n6 X  l3 a' c0 v4 s
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
& b6 |, G" m# ]6 |6 {
; V  B; Z3 Y! a( h% n$ X
Set blkRef = allEnt
6 P7 m; M7 }8 O
, ~: ?7 p( m6 N+ f8 B

. C5 @% F( F1 r: y2 N5 DIf StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

4 n1 d! r! ^% f( w2 {; e- _( e
1 C  a# l& U2 XblkCount = blkCount + 1
7 K4 ~( {! k& B  z# b+ h4 B
+ O% @9 w7 l$ y# U7 m0 p8 Y
End If
! v0 t& B; F0 X! @( C" x" A9 ?
) H! A& U: E' S3 m/ z: m, B( A0 F
End If

9 p& s9 c4 P' }: d2 Z) }: z, c
& d: q* E9 u2 |  @# i5 LNext
" t* B# q* D+ ~) h( I( [" w2 U
5 o& R' |8 [! B  G! n1 s7 z
blkCount = blkCount + 1
# N- b+ G) y1 r& V* o* f
6 X  F2 |8 x  _, _- k; Z6 x

2 i5 `7 a3 j* F* p% g) minsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
8 p( [& n6 Y! ~' k4 E8 x9 G5 M1 \* J0 }
blkName = "blkGEAR" & blkCount& U; ^9 p1 c0 W6 }

( ?) A% R' ]2 A  L8 l( q
' I3 v- }2 q% V9 h* Z3 ]# t3 ~Set blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;) P5 r, T' @4 K- Z4 x2 ]1 l

) q5 U) x% {9 \5 D

) _/ \( c1 c' ?, u
5 v1 U$ X9 ~% t5 }* j# f
Dim sTan(0 To 2) As Double
& M0 G5 t* U. |3 J- V# H( j& \5 \' o# L
Dim eTan(0 To 2) As Double
6 y8 ]0 d, F, q/ s% K5 k* Q& G$ F* G4 b

/ |3 C' W: Q  N) SDim fitPnts(0 To 14) As Double

8 X# F# }" \1 d! J* V
  X$ r7 ]  b3 @, A8 MDim splineL As AcadSpline
9 i$ ]2 V# q5 U5 {( c- c
  j; F# j3 R" t; I2 y' d
Dim splineR As AcadSpline

8 \/ v9 f) Y* H, O: d! z6 Y1 ]* k1 m9 w: |* K. k' n) }
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0
, a0 v) K3 W% f; C0 d% D7 }

+ V2 s- H( F- S" K  m4 W1 deTan(0) = 0: eTan(1) = 0: eTan(2) = 0
& v' J* R  g/ q/ v! c0 f
! [! S$ m( ^# W
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

( I& o# T6 c0 n+ ^6 m
3 r3 N7 {; q7 l9 |fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

6 N  {0 f: |7 V  h+ x6 S9 j( j* v% @
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

9 k$ B  Z9 g& w
! O; \- e2 @- _# NfitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0

. y. Y: @( `/ x4 }" L& M* g; Z1 R% G* K+ o/ l4 f% l  ^, ~7 K- M
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0
* U- }" Y' X* g" l9 c% I7 W
" J4 v3 i, f- F9 J

! g. f5 V9 {+ z- j0 M' H( B
/ q9 ?4 g' {8 b/ [. a' USet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
0 F' _2 K! T' R) u+ Q

. a" d, {' X3 V; s+ I/ G; O. i! E
6 o. z. M. i5 u; E
  x4 V( X  B: a% Z. v4 e
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.! I: G- i3 F- z- B2 T
相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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