QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3224|回复: 6
收起左侧

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
5 }2 X" i) W0 U2 o, n& f+ x: H$ R7 Q0 Y! S* @1 V. `
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1.   \6 B2 B) m# f6 j
  2. '假设画一条有三个拟合点的样条曲线. i! e- L! p9 L) V, ^# G
  3.     '声明样条曲线* \4 _' N) O: @% M; z
  4.     Dim SP As AcadSpline# B( t) W& i- Z; d7 H
  5.     : w( g0 L1 Z4 d2 @
  6.     '声明样条曲线拟合点坐标数组. \& V) g% P% M4 U7 `
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    2 p% ^, b' E( o- @% Q9 M. h
  8.     Dim fitPnts(8) As Double+ d) n1 ]1 y1 i" a, [
  9.    
    5 W! W- D9 l' `! i4 Y2 h( Z
  10.     '声明起点切向数组
    8 j# v7 Y9 a% u( X9 I% D
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    : Q( W- k+ S9 t
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值; q& x0 k/ z+ @5 H9 h- d6 i# z
  13.     Dim sTan(2) As Double
    + p$ D( U" ^6 b# Y" L9 @
  14.    
    & O+ F# c, \4 l9 O. ]; \
  15.     '声明端点切向数组
    / W; u3 c  a0 Q  r; ?9 D
  16.     '和上面的起点切向相似
    . q1 F) f4 \7 |% f& u& b7 o7 j
  17.     Dim eTan(2) As Double
    + Z, {" f. W$ S& |
  18.     8 ~6 w! C6 @+ }5 A% L+ t
  19.     '样条曲线的第一个点
    " h/ e, B' a% e. I) }
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0+ T* l0 v7 m( `* ~, K
  21.     '样条曲线的第二个点2 J  V$ v2 a& w6 K) u! a, S4 y
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0  Q5 x# _# r2 c# P. Q( k5 G8 _& M0 O
  23.     '样条曲线的第三个点3 a  Y! @. `) D
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 08 j; G! a! w7 ^( u" m
  25.    
    * V+ _7 Q3 Y2 V( [3 _  z
  26.     '假定样条曲线的起点方向为水平向右
    ' s+ b2 S4 a- L
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的7 f! E# ]  a/ {1 O& W
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0
    " b! M. c. Q9 m  @: b7 m; u% Q3 K/ S
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    1 D+ q) ~- J. [6 D7 H
  30.     '假定样条曲线的终点方向为135度方向9 Z1 T4 D3 z/ _7 H3 l9 j/ \
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为00 P" d. f( r9 Y- B7 }  N* H$ ?1 B
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0
    & Q/ n0 s, m- g
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向) a1 }8 p' Y9 w5 y4 B; v5 k
  34.     . R# G4 d6 o7 P/ W2 C1 E" _. Z4 ]
  35.     '画曲线
    + r( Z+ b: u# h: M- q8 C7 Y
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)0 h; N; e- O5 g1 H9 g6 ]
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!1 P2 L6 W: B$ Y6 c2 s0 B

3 g, w6 S0 |. ^- e( C
( S, u; e, Y8 c9 Z6 F/ T
% @5 w  C1 w+ h5 Z# p" C
; t8 ~- X- n3 d  e$ WDim Xb1 As Variant, Yb1 As Variant

6 i! J: B/ a% Z: }8 {0 z; T) \- J5 T) o8 m9 W" G% u
Xb1 = 0  j* d6 ^0 w( Q" |/ Z
Yb1 = 0
% q9 l- v0 C; w

5 O: \3 s3 C6 v! F8 [+ z; Z' A: ~; }2 Y' R% x3 g# X
Dim Xa1 As Variant, Ya1 As Variant
) u1 t. K" G$ e# r
$ N9 l% T2 V! k' w# v: y# {+ t
Xa1 = 0.5; x( T/ X5 r: R; N
Ya1 = 12
/ h6 I1 x# a1 r1 Q4 T' i

4 O. ~- B+ m0 Y! U$ c+ G  t
% X2 o! e& x$ w& Q4 G
! m8 z& l6 K' V  x! D" C
; t6 Q7 S2 Y/ W6 }+ {1 N

$ T3 g2 \- K! z" v
0 Z+ Q7 b0 N" M% J' i; KDim blockObj As AcadBlock
! C9 c5 ?! ]1 I  w# q
6 c$ c; X6 P4 Q) m0 p0 C; I4 z* t; a& P
Dim insPnt(0 To 4) As Double
+ }$ c4 J5 i4 a2 {0 D

6 n; c# D" _' U1 c! a# H% F+ nDim allEnt As AcadEntity

1 B8 \: O3 O5 `( R& R1 j& U
8 }4 v! O* m" V' A$ c# [/ Z; D' tDim blkRef As AcadBlockReference

/ @2 K8 t! X$ {$ W
" A# s9 T1 A( I% eDim blkCount As Integer

5 P) v+ \) s- E  d, g
2 W  G3 I& _) Q( ?2 C! W( y6 kDim blkName As String
; Z, a4 n/ J. Y8 C! i! e# h) K, k

& o5 R7 |0 E% j

! d9 G# D) _, g' {9 d" d; s) ?2 Z1 @$ p4 Q
For Each allEnt In ThisDrawing.ModelSpace
2 h5 [  L; n  O( r/ e/ M
( z4 W% C1 `: Z, X6 R6 XIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
7 c0 B9 g) c# {
" w" s! e1 z+ w! K, @5 o, _
Set blkRef = allEnt
" d' d* P  y* W9 p9 X4 s9 |& P

& Z) S1 F, s* ^' `; p( J
* N) W" i6 v/ W) a# bIf StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

* Q* \# i6 U# _" N1 j5 A4 F! `: D: k
  h( k; n& G# [2 W4 U9 Y8 fblkCount = blkCount + 1

7 Q9 F* `% v* w: _1 D
. U* f1 |" @, d1 \; R- q/ v! R' GEnd If

2 L2 n" |2 m6 N; v; C6 ?
+ M) M9 {. D- V' D0 ^: a0 `6 h. N5 A5 tEnd If

4 a1 }; _% l# o, \$ x4 v
6 z2 n6 {  }2 ]  h+ O4 gNext
) |. p) ?: q7 T% `" v" N  s& G1 R
# O  \- _8 c5 r
blkCount = blkCount + 1
) U0 [9 U, }# \

% X7 Q( b' Q0 B+ p: u! T5 I

& k& V! a- R2 V. j4 ]3 H% x, FinsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0! ?1 t( G* {/ |7 ~( I

- l# n" [1 ]- \7 t+ i6 d0 r$ P. nblkName = "blkGEAR" & blkCount  I" \2 d& ?. p" v3 N; i6 e" w7 k
( `! h; m! U/ M, Z/ P
' `" s* c0 S# v( C. O. W2 h% j' K
Set blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;
- v; ~& G/ ]! D) p( k
" k' G+ |. O9 V' D$ V( R

9 G6 v8 ~7 {3 W; s* L8 Y

6 J1 D9 S+ K% `6 a1 i5 W. Z8 D5 w6 _Dim sTan(0 To 2) As Double, u7 T8 [0 V8 l- @+ \4 A9 G6 L% }
2 L; Y1 M4 L- I) [$ C1 H" s
Dim eTan(0 To 2) As Double

4 V; e, {1 T% V" p. U; @7 S- f9 {% e. Q5 @
Dim fitPnts(0 To 14) As Double

# r! c! ^$ s$ z9 ~4 j8 {6 H6 e3 y& J+ F4 V
Dim splineL As AcadSpline

, U: z. ~2 L* m! @* J: P. H$ y0 u6 o0 K1 @& d  e3 C7 t
Dim splineR As AcadSpline

$ t$ ^% @' I7 ~  i0 G4 u6 i9 L7 V7 ~
3 V2 X+ f& P# u7 h/ |7 isTan(0) = 0: sTan(1) = 0: sTan(2) = 0
. ~. V3 G0 B. F+ b5 V
/ e- {5 D3 p. C0 V/ F& Y
eTan(0) = 0: eTan(1) = 0: eTan(2) = 0

* Y5 |# \6 F6 y# A! u5 Z( j, ~( f
, w5 v# w2 b. T5 VfitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0

8 V! D- N, |/ H: t. t' ]0 r' r' R6 {0 J
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

+ M) `0 `, J/ Y* [; l
( N- g. P# L+ S0 ffitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0
; m2 \8 ~+ h4 v

& I3 t' j* z/ ~1 s$ O9 y- _4 z: zfitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0

6 }7 U- d+ S/ Y  \  e7 _, O
% v$ i9 X8 Q4 t: N& ], ufitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

: I5 `4 N0 B# H- T1 j; V6 h0 h! s$ |5 z" ]$ S$ C5 G

$ U5 j& o2 G6 k% V7 A& c/ W, K
" Z2 H) U. j, F. qSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)

0 S& F: S" T% X" y( N3 q  g1 M2 f. T7 \( S! S+ o

  i' Y/ T6 j4 c( O9 y' a
4 [) @3 W  I  E. S. k[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
* v: G8 y3 |/ N7 Q. z. N7 R- N+ K- ^相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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