QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
: g: E4 s9 u1 B0 ^  a5 a
, p8 F$ Z8 i; y  f[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. # p: {8 k8 ]( [/ d3 M
  2. '假设画一条有三个拟合点的样条曲线
    4 G' S2 c9 U0 S( W- N( H9 O
  3.     '声明样条曲线6 s1 h  g; o$ v! o2 {
  4.     Dim SP As AcadSpline
      G$ e( I2 ~, Y# q" |7 N
  5.     6 Z! }9 |: d& g
  6.     '声明样条曲线拟合点坐标数组( b: t' G& M; h( q4 a2 b- m, ]
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    $ |8 `9 ]$ e- u$ L* m9 z0 Y& w4 c
  8.     Dim fitPnts(8) As Double
    0 @* C8 z( ~6 ?2 v
  9.     5 I5 U- I* H" f& ?1 ]* W1 s& }
  10.     '声明起点切向数组, B# R; \  Y' ?. r. [  R) w
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组7 k! L* w: t: J+ ~+ {, V' Q4 i
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值
    7 J2 h& w- I2 H. c
  13.     Dim sTan(2) As Double. y1 [" P  Z1 ^4 S- B) E
  14.    
    + z# f! l) Q8 i( G5 J
  15.     '声明端点切向数组3 q( y: G, d$ u+ t! @) d. J* X: ]
  16.     '和上面的起点切向相似& p. R8 v9 F7 {
  17.     Dim eTan(2) As Double* D/ t# Y  f* K* C# i
  18.    
    2 j  Q0 }3 w4 X% e: O4 b
  19.     '样条曲线的第一个点" p$ r( i- F, P* A$ n5 E% a
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    4 l% x2 j% O& l$ n4 k; C
  21.     '样条曲线的第二个点6 W$ [5 q2 V4 W
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0: e: K9 [2 p1 Y1 }% K' {: P
  23.     '样条曲线的第三个点
    ( a% n; n. }3 I- E6 w
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0/ `0 l9 {3 N: E
  25.    
    4 _  y" C3 o/ N" V
  26.     '假定样条曲线的起点方向为水平向右8 r: N- C7 ^$ v" a; n$ P
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    - z' \1 w# A6 f0 H; ^8 D0 b0 p$ i
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0) A5 K. z2 S9 g& V8 [1 x( y
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0/ r% D# X# l8 A( N1 L4 x
  30.     '假定样条曲线的终点方向为135度方向+ U# y' p: g; f9 R
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0: }8 f* d/ k! w( L# M3 W4 p2 t" O
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 02 ]% Z3 o7 T" z, q) `1 H
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    - F% k5 U6 B9 H/ r2 a' a# }2 C
  34.     % y) J7 ^  H; G4 i8 v7 A: n* R
  35.     '画曲线7 G+ d& W" b: b2 d* b- w- b7 N+ k4 B* b
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    : q8 H8 [8 n- m8 F4 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!
. e+ c9 H5 N; L3 q# q
, e/ j( ^7 Z. `$ L) r
- f2 r2 v6 u7 |3 }8 y  j! ^! N2 O9 f/ {5 D6 N6 K) [
$ G( a2 U  D7 P! l
Dim Xb1 As Variant, Yb1 As Variant
* }8 ~& X; J5 K0 Y7 S$ Z, P
+ e, i- `! \5 n4 X
Xb1 = 0
" M: }9 L' J- E- u. C5 HYb1 = 0

1 a1 I% }8 y  G

0 \; i2 ~5 \7 Y% }2 T% C: z1 b, a9 m& V: N6 u2 m
Dim Xa1 As Variant, Ya1 As Variant6 d' ]8 d* q' _- i3 u

2 R0 d7 o! o4 x9 t( O# O+ N5 Z; H
Xa1 = 0.5
+ J6 _4 a. t: ?' C6 d3 |% d& ^Ya1 = 12
* |- |" r8 W+ \) a0 e, l

' R0 x6 X5 e* m
0 f4 p7 \9 a/ V* k+ F. A+ o2 C

% e) v# j8 B' q, ?4 a/ l4 @* n+ q* p' X2 ~) g# N

" Y& ^" F4 T, p0 k& l/ ?, H. a2 c# @- u0 i
Dim blockObj As AcadBlock
+ |  N* g" X: |% d5 {

. u, y+ F2 N- K6 H- Z& BDim insPnt(0 To 4) As Double
1 w3 J/ t  m, d* {) v: Z

' M: g* H( z$ [2 o1 o, [. w: o# eDim allEnt As AcadEntity
/ H7 G8 Y# ~1 L9 i# y3 A& i
3 }7 ]# A& g& d9 N+ y! d8 C3 }; i
Dim blkRef As AcadBlockReference
( o( H, n* o0 F7 D; Z# E

& {9 ?1 W9 E: k  K. j/ `. I) ZDim blkCount As Integer

7 z( _4 M% {( [7 _0 [% Y, |+ ~  j# g. ~2 b( [
Dim blkName As String
5 U: @7 x* _: C% s' z8 M0 l7 x- ~

4 V" z8 B1 z3 T1 O0 s8 v$ K) U9 ]

+ ?! c$ ~6 s9 P9 H" o
$ H2 _) @$ ~: S+ D0 B
For Each allEnt In ThisDrawing.ModelSpace5 t, E. X& t7 m7 c2 @
/ R8 {, X. s2 U$ m; z1 S
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
/ Q$ J4 A: b6 Y. g7 B9 v$ ^" h$ u

  Z9 k6 M$ _* nSet blkRef = allEnt
( x& x1 u, ~9 c9 e$ F

. x1 e9 N) Q  v8 y3 ^$ M" D$ y( i& k; a* I( C/ Y$ o" G
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
) B; R4 m6 g- ~! a, f3 e
$ C+ z: A& w$ v6 }  e
blkCount = blkCount + 1
. d, h1 c8 F9 B& }
% {; t3 ~7 `, W8 n( Y
End If

8 R8 `/ w! ^; g5 t# x5 M
- v* b% x! P9 {2 T2 }0 wEnd If

6 N, }3 X4 O* {5 ~% h6 Z2 e4 q! ~7 O1 t3 K0 K
Next

  C, |& N9 a* I. m) F( N0 y, V: S$ c+ R0 H$ ]
blkCount = blkCount + 1

, y# c, z4 a' N2 D8 o
8 M  F( O0 U2 W, T- c7 l
$ n7 q- b1 W: ?2 U
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
, z0 c5 j/ ^" L, |! ?) N
9 G% d8 w+ E2 Y6 t3 }/ OblkName = "blkGEAR" & blkCount
1 r/ `2 ~  f2 M3 M$ ^# n6 g5 F( F' T
3 f! O+ h( o2 L7 \

7 g$ A. g, W; g' ASet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;' Z7 V% H, e+ w9 ]' }

) o- k  v0 q* }# X2 ]
. [  [+ T( Q0 T$ B
7 l) P0 J8 n  ]9 N
Dim sTan(0 To 2) As Double) p! K. R* K; u

8 w9 G$ p/ t, v' iDim eTan(0 To 2) As Double

" `0 F+ q& o" q* Z
: g8 K8 p% f( W  NDim fitPnts(0 To 14) As Double

" z" v# R- k' p/ x* T. Q
: Q* a# D5 |# y6 y1 C2 hDim splineL As AcadSpline
: ~$ `! x6 M3 f3 Z
+ j  C  w! m: _- P
Dim splineR As AcadSpline

3 w; n5 M) f. u' R+ G! I) P$ N
$ A" q2 A' r- T. xsTan(0) = 0: sTan(1) = 0: sTan(2) = 0
" f9 u' J5 j' ]. U+ l0 V# e; _9 l

3 q6 ]4 J) |4 D8 m% r* \1 F0 SeTan(0) = 0: eTan(1) = 0: eTan(2) = 0
0 m7 H- _6 A7 g4 q8 U4 i

3 ]; Y. P$ U' ~. j7 ]$ P' w' nfitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

, \. o  z9 z/ b& q& w1 f
7 i/ _2 c# E7 n6 xfitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0
! H! g5 w7 f0 {9 K8 d5 Q
+ \2 Q8 X/ ~6 T2 _: Q) n- B8 {
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

$ J4 F: y# T% p# ]" h! R- z% n* K7 j$ P; `5 C# r
fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
; i, s2 [1 F+ _$ [# }
( u' x% O% ^3 n& `: @
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0
$ o5 p) O& b' s) [( H5 c

" B# o4 Y, G8 J
5 x/ R. p2 M% ~" }7 O) |

0 j: O9 w+ ]' {9 e- r$ TSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

$ Q. D4 S4 ^6 Z  k' |+ c# G5 V' ^/ t4 e- q2 ]* T: Z! S6 p
' Y. a) B, E! y, B, }; e1 ~$ m

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

本版积分规则


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

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

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