QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
+ c% M! k. l; ~, {' K* m; d
- z  L: F0 o  a2 [5 q/ a4 a[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. ! Z/ m4 _; l5 }, c2 J. X. Z! }. e& X* b& C
  2. '假设画一条有三个拟合点的样条曲线- D, K/ |4 b6 G! Q+ E
  3.     '声明样条曲线* r# _: T- u: [0 r+ w7 e# t- ~
  4.     Dim SP As AcadSpline
    & [9 b+ Z. t& `! X2 T7 U
  5.     & I/ a* y/ z- a2 G; \
  6.     '声明样条曲线拟合点坐标数组
    & D' N6 j4 x* q) |' Y+ ?3 y
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素& \* U" R+ ~5 \( v1 i9 [
  8.     Dim fitPnts(8) As Double
    ! [7 K8 b+ \5 k% y
  9.     - Y( h& }9 A' p* }
  10.     '声明起点切向数组6 D$ e0 n7 O* j4 Q1 I; y' H
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组
    2 n8 k7 Y: A% b! {% r
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值
    8 \# ~8 I3 g, z$ ]. a
  13.     Dim sTan(2) As Double
    0 v4 B$ R! W$ F: y9 e2 b5 Z+ [+ J3 ^* \
  14.       K0 p# t1 V3 E5 m
  15.     '声明端点切向数组
      j9 j7 \5 @4 }0 w0 X: q# ~
  16.     '和上面的起点切向相似! I* H$ A+ m$ y
  17.     Dim eTan(2) As Double
    + v( E8 Y) [9 o
  18.     9 _9 N2 G; T4 f0 n
  19.     '样条曲线的第一个点
    . z. c7 ?; `6 ~" b
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0( N% o% i& |8 y) r2 ~
  21.     '样条曲线的第二个点" L6 b7 d; r$ w% j3 i# E% j
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 07 a3 j/ ^- U0 B, w% Q( G7 p
  23.     '样条曲线的第三个点
    1 ]4 Z" D* b' |- [- `: b
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0+ A5 x2 ?/ m( A
  25.    
    ; W  b/ g" ~* K" `8 h& Y
  26.     '假定样条曲线的起点方向为水平向右
    , }5 F  f% n$ F+ o( K# ~3 W3 ~
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的
    0 C% X: H  f) g/ r
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为07 c/ V* Y; ]# q& S
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0' \0 y' J( c: n; p& P
  30.     '假定样条曲线的终点方向为135度方向
      g5 s8 v6 A3 z# k, t" s
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0! p& y) e. x1 W" Q3 E' V1 A6 D5 d
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 05 R0 E- ]' v. p
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    ' Q2 w2 V0 v1 D1 d' }$ p
  34.     7 B5 F5 [: O! t5 D6 Y' f
  35.     '画曲线
    $ F0 \5 E0 o5 q9 ^6 T+ Q
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)
    3 N/ ~" u* X3 p5 f4 v6 A
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!8 V# l( F5 v% C9 N- J4 `# d

" X- f1 k. K. @2 N0 T# @; t
# x& D2 h5 |0 g3 e( t& @+ }
1 f4 T0 O* o& w0 O
& q1 {' }: X/ [6 e5 V) O& L7 T& U& I8 qDim Xb1 As Variant, Yb1 As Variant
" L% T* T* }8 g0 O- l/ L2 N. q

; S0 U+ F8 i# y2 Z8 x/ G
Xb1 = 0
8 K) K$ D, J; W3 e. QYb1 = 0

2 [+ x  @- g6 ]( R& S8 @; @0 m: g
& H, c  `. e$ G4 p1 _
, N9 Z. V: E' }$ r
Dim Xa1 As Variant, Ya1 As Variant
9 `" _. f0 P* o) ]/ F* g+ N1 C! Y4 i1 a
9 T. U/ N6 O+ x& o# H0 P
Xa1 = 0.5
, Q8 [/ b; T. P9 o% r( vYa1 = 12

) [9 a3 u# u# ^, a) d4 z; l2 f8 ]! v( O$ t( V; i' @, A# `
& ^2 y. A1 s5 a( m
1 r3 v+ h" J' Q, L# f' j% A2 A

9 t. A9 }1 R2 C3 C, `+ a
) V) K: G: R2 i

% Z8 L1 k/ c, z, W3 g# qDim blockObj As AcadBlock
! d8 q/ S! F  T# l( h; W
: t6 p4 x" ]) w$ t2 n$ Q5 b
Dim insPnt(0 To 4) As Double

" j7 |1 O6 ^: O" p" G5 ?3 q" w
( Y% `  Z  e" Z8 K. lDim allEnt As AcadEntity
5 X1 R0 r$ H* C  f* w. E! _) A
) o; ~& j5 ]+ [+ Q$ [- }, |
Dim blkRef As AcadBlockReference

! I- U2 u" r& Z7 m
/ W* e5 g" ^, q8 Z1 P/ |0 sDim blkCount As Integer
3 _2 X$ s+ v6 a
3 b( G7 o; U2 j
Dim blkName As String
' |% E- W" q* l" Q' Z5 ~

' r% U4 p- z$ _5 t( Y  c

* Y# W4 h  }4 u9 l  Z4 \
3 S6 K! N8 z; Q# C0 v
For Each allEnt In ThisDrawing.ModelSpace
3 x) f5 N( _/ G3 ^7 M  x; E9 V+ r9 Y0 d( u4 p
If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

! S7 \; y& H) C, O' \' f& S1 g' Z3 F3 K5 f7 j" E, w- A
Set blkRef = allEnt

* H5 ]$ }7 F9 c( F6 s. _3 p2 j; C! j: C! C& _: V
1 C9 o$ R  V! |5 C/ ?1 l4 A7 h
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

$ A5 e1 `% m( F0 O' _6 t# t) S  n" {: H% _/ Z$ g
blkCount = blkCount + 1
" H* A* L7 x' U; x+ G& m  r
" R! \( B7 o+ X" b" m) n
End If

4 T+ {2 `  [2 Y% E; [
0 e  A; e6 ]* J- H+ fEnd If
; l% m; F8 w9 X7 d7 F% V5 A+ ?6 R

2 o4 T& B' I9 ~% U+ e* y3 E  Y) HNext
3 ^( }) N+ `. j1 Y7 Q& _( F

: G$ q3 I  z+ yblkCount = blkCount + 1

2 z5 U' m5 D$ {- A2 P  B: S
5 N* g1 i) O# e

9 m9 {; c7 Q- }8 f/ ginsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
* Q+ b# B, x8 y6 [7 C  X( M" C, u' C' L6 k1 n' I" |2 D. _, m1 x0 |% F
blkName = "blkGEAR" & blkCount
. h& B4 @4 _- `, v; v3 D8 c8 M
- n$ S: h, J+ H1 k

& z$ o+ E+ J. e7 n3 F( S" c# fSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;
) m$ z5 j) O$ Y! {) x, ~+ m5 r( {5 I! C9 }, [+ _1 y
8 i9 `* e5 G9 c+ t6 O

) z+ N1 K" j  v2 T5 u2 g9 {Dim sTan(0 To 2) As Double
" O& E0 C  r  M- j3 f
6 {, s+ ~' L4 c* V. xDim eTan(0 To 2) As Double
! ~5 O* r; h- [) G) c% g6 R
6 m. e% p$ t' L' g8 b
Dim fitPnts(0 To 14) As Double

) D, q) n0 X; d( ~# u; [, M) |
5 W. P7 O) t) q4 |' H0 u0 _8 @" ]Dim splineL As AcadSpline

2 e# z& y4 \3 w  }2 |, ]4 _# p! W' z4 s* \
Dim splineR As AcadSpline

& p4 M0 y$ O( k; ~" E0 j$ I8 F  f! D$ R; C' c4 Y9 E/ {  {
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0

8 B6 v* ~2 t4 Y9 u2 d# i
% z6 i  P0 B! UeTan(0) = 0: eTan(1) = 0: eTan(2) = 0
3 f7 s+ s' X( I/ H" w1 H+ k6 |2 w
$ [# i* _' u2 l5 k+ |& h) G& Z( W
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
) e. n, i  k. ]: v) ?3 k* T
; G9 g5 w# m* g) \5 T8 D
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

7 V7 k8 y( V2 l0 v' T* }* |) ]( G2 J4 v' V. _- O4 T* Q/ ~5 f; ~
fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

  L% u+ h( z* W) s. R
) W( k  {' |  R9 k' t3 c" S3 B  XfitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0

8 t7 |3 d) ?1 d) X
" l. N1 u2 G2 tfitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

5 B' e% }+ B, n; y8 `* X
9 c% i5 }7 f  l+ a' t) a

: t; B/ F* w4 T: m. s; A# l2 ^7 M$ `0 g3 D2 O
Set splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
& T" |0 V' s. M0 o- E
' `0 d6 E5 E; B, m1 o+ y$ X
# h, B8 N5 v* i# u  K4 F; ^- O& x

+ ?7 v' E' B9 q3 _3 \- Q) `3 Y[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.6 C% _) n! Q* G$ M8 C( j
相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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