QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?6 @  P. b  c8 O, ?7 n) M0 k

: J1 S. b5 F) n2 R$ h/ n9 d/ @[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口

  1. 9 h' z; {/ Q( \& ~; M
  2. '假设画一条有三个拟合点的样条曲线
      z" O/ ^0 A* Y5 H; D" H# W. M8 N
  3.     '声明样条曲线8 ^2 G' r; o3 }! {5 V8 A
  4.     Dim SP As AcadSpline+ l3 W7 q9 E/ q% f- n1 Z
  5.     8 F9 O+ u! K7 |" J' P4 d
  6.     '声明样条曲线拟合点坐标数组
    - d! f' i# U* I9 s% x
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    9 ?9 A# r4 z% ^4 s1 N* p5 i
  8.     Dim fitPnts(8) As Double$ Q" z# \% T, D0 \+ [: e
  9.    
    ' U0 d" P* `& V! U# {7 r# D4 C
  10.     '声明起点切向数组1 |, F6 L5 J- z/ d
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组/ v1 V7 x) b& R, N
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值: h% U1 {& E; ]3 `2 U1 L
  13.     Dim sTan(2) As Double
    ' `/ \: I& ?% `. G: n2 c2 X
  14.     9 s5 V5 h' y: f7 a: o
  15.     '声明端点切向数组$ ]# g5 z( n- X% b! W, G
  16.     '和上面的起点切向相似2 y/ K% s9 U2 s1 M, m3 r: ?
  17.     Dim eTan(2) As Double
    * N' i) _! H4 z& t
  18.    
    - u0 b* P' ]9 L  a) T9 x
  19.     '样条曲线的第一个点% R, X: f$ X! Q: y( @
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    , |7 x8 r3 V; G" t" n
  21.     '样条曲线的第二个点! m# F% x" ^* l* ]3 M9 O! ~
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 0
    & f8 \3 Y- k$ Z9 M; v- x
  23.     '样条曲线的第三个点
    # S, z8 U: z8 n; ^* r5 U9 }
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 0' u& f, s, x+ ]+ h& r
  25.     ) x8 [# s  r1 v7 h3 N& V
  26.     '假定样条曲线的起点方向为水平向右& G+ |4 ?# C8 V3 \5 r
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的) J! v; p) {" o% p6 Q
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为0$ v: m' F$ y; z, z* Y+ I* i
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0: o5 G% C! C7 m) p4 g/ T
  30.     '假定样条曲线的终点方向为135度方向$ C! q; @; B6 Z. Y: R
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0# m* i- l, o, @0 N7 Y5 L" L; T
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 0' a, C( R9 S. k/ M5 m: [
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向
    9 q0 H2 }; t$ C) B# y
  34.     6 T, F) H) ^) {7 g8 z5 V
  35.     '画曲线
    . r  E- Z5 R4 G
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)% t7 Q) ~- g8 E& b: L/ d7 S
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!7 @5 Q6 i# k) G$ i) G$ ?8 q- q# ?" h) e

7 a2 Y5 |1 Z/ [1 W: D6 u. k" r9 O: d" F! k" `  b( R' i
0 m5 t/ K% p3 k# T5 z2 |
: l& M- n  x( h) Q  `
Dim Xb1 As Variant, Yb1 As Variant
  _! `* v. c+ i4 b/ F* [8 w( B
+ d; w8 u  P- L/ I+ W* A# f
Xb1 = 0
7 z3 U6 t. V  i7 U5 `& n3 |, o$ i) iYb1 = 0

  g0 p8 w, u0 Y! Z- O6 W3 u4 `' E

1 d: a( d) O8 _$ ^$ L2 A2 @9 f! C/ |/ V7 q
Dim Xa1 As Variant, Ya1 As Variant0 \( `9 R8 a  }' o
% |0 s$ \# J' {& W/ W  a: v
Xa1 = 0.5& E& C/ }& n  ?3 l. Y9 w: [* G
Ya1 = 12
: V9 B; M4 i1 Z, V) j3 p$ C( H

/ m# C7 U+ k; C4 v% c
6 z) |# O+ v# b9 G. p

* D8 R( T* R  t, n( n5 N5 D+ A; `# k2 r
4 m- p6 B4 W$ P$ W  c
! o3 g" C+ x- w$ j4 {7 B

# q  P/ N+ x0 p: {+ A, @' L) v( WDim blockObj As AcadBlock

6 R9 j2 n; g9 ?- ]  H& ?* a, m; N0 t' z& ?3 I5 w- u# A
Dim insPnt(0 To 4) As Double
9 W/ j- O6 N, X- R! @7 J# x; k9 a
/ o/ b% y5 \, o+ y
Dim allEnt As AcadEntity

- m& D2 W( ]. C& n5 ~$ |) C4 K& I0 p) {) y
Dim blkRef As AcadBlockReference
1 ~) Q) K1 |7 A# w" j9 \& G
: |0 P$ l* ?1 w7 M
Dim blkCount As Integer

* x; ]1 M, \* A; }& ?3 Z+ Q/ X
) F; j5 N, [" ^6 t+ a, zDim blkName As String

$ Z; @" h8 g: V! A# V4 d2 f# }
4 T2 z; M$ @. g$ h# ]6 A/ I
; R2 \4 y1 N8 ~8 `
For Each allEnt In ThisDrawing.ModelSpace
8 s$ {$ j! m! d9 I. O9 Q' c
+ P" B5 G+ _6 F  wIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then

8 k% @5 D/ b7 S8 [5 X/ ^
9 ~. \+ y' m" _7 T0 b" ASet blkRef = allEnt
9 C0 m% T+ k0 }) p4 m
/ l  `7 w- k/ q8 @& Z9 B
& H* \' `0 e( r( l" E0 `9 w# c6 _
If StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then

1 b$ x) U, J  |: C/ ]
8 e" O7 w6 j. U4 F9 m/ h0 A7 JblkCount = blkCount + 1
' L+ f  g0 Z& c/ {7 }- c1 b
/ ]4 ^( n2 S; Q4 g, s
End If

" f8 ~$ J" ^9 W0 |  @
' {$ I/ J  s/ k  l- F+ PEnd If

/ h3 L4 n  k  V0 q3 w+ L  T, K( U) f3 n+ Y3 U5 o+ d6 T% i6 K
Next
3 j# u* e% G& \4 V; f
6 ~; U2 V  {- P# ?: k8 t7 p
blkCount = blkCount + 1

* Y/ x* q& }0 c8 h- ^) T% x6 k
% {' I* w' S. @( U2 ?0 q

7 X9 I8 B6 B+ tinsPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0% ~, S1 \5 T# Q; |- \

& ~7 J' t4 o0 n' @1 k/ pblkName = "blkGEAR" & blkCount
2 |# n, v0 _" N/ o9 Z% r
/ X! p" K# s  e7 R8 B" M# t
- y; O: c# W" V! b$ V6 ~
Set blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;
, i4 J  S8 }$ P* y
; b( s5 k; @' W4 T+ z+ E. f. s

/ t9 q" @, k. _9 p  e6 P9 d

' o6 l% q5 Z3 t' ODim sTan(0 To 2) As Double! g& R) D/ H6 k

, ^( p2 r$ t8 Q0 w4 K, m* tDim eTan(0 To 2) As Double
4 D( ^5 D' h5 F
2 j$ T" E) w- d% G5 c2 _. \# ?
Dim fitPnts(0 To 14) As Double
1 T+ E8 M! |. p. D7 w) [( [- g3 [; }

; w, B8 a" |+ m6 Q: ?7 H  _' [Dim splineL As AcadSpline
+ m, y) ^; @2 c

( N5 r: K8 p* L& n" w8 _  K' GDim splineR As AcadSpline

- p9 N8 y; t" f% M; @  k
/ ?$ l2 q7 \; r9 fsTan(0) = 0: sTan(1) = 0: sTan(2) = 0

& w0 v* Z  n, p* v3 c: v# ?" _; ?0 ^' d7 l
eTan(0) = 0: eTan(1) = 0: eTan(2) = 0

3 J1 r! `- p+ S8 A/ p' b9 k  p' D4 v) w
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
# T  M4 {6 |2 V0 W0 E3 |

" w7 x  T) W% ]# r8 i" jfitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

" f! _( ~# E2 M" M
- d" x' b: L: efitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0
9 }* l: M+ J7 P9 p1 p
) T' h: h! k" r2 H
fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0
" X$ c% k" u2 k* ~8 G5 S
, C. N. a1 V6 u7 n* _: K9 }5 i: n  ]0 b
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

6 ?6 P# Y- i) k) N2 c; D; d, j/ v  q
8 u  X) }7 {0 }/ n: Q4 f" Y

2 B4 G# c& A! q( A- E; p# OSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
3 }: W: j9 d: J7 `5 `8 X

9 _0 I( V4 R' G

7 F9 o" C; |0 T4 j5 w/ }5 C% O: ^+ o; _1 o5 j! b
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
- e3 o+ n/ ^. Y- a相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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