QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
这个曲线如果用VBA语言编程的话,该怎么编?我知道AddSpline(fitPnts,sTan,eTan)命令,但是里面的参数具体该怎样设置?
8 g; r, q# I  e0 `/ E. Q$ Z7 a8 N, i+ Z/ [, Y4 R7 [8 N! P
[ 本帖最后由 蓝莲花。11 于 2009-5-22 12:19 编辑 ]
修形.gif
发表于 2009-5-22 14:58:56 | 显示全部楼层 来自: 中国辽宁营口
  1. / H1 m9 D6 z7 ~4 U
  2. '假设画一条有三个拟合点的样条曲线
    , q" A- ]* ^" |8 m
  3.     '声明样条曲线
    5 {: z& J3 N, k7 [3 a  S7 l8 o
  4.     Dim SP As AcadSpline& K) T' g$ A$ b3 X  |! ~
  5.    
    ; N6 {" `2 C7 g  ?9 Y0 H3 b
  6.     '声明样条曲线拟合点坐标数组1 W/ M0 Z3 K: J/ [; |7 V1 X, Q9 E
  7.     '拟合点坐标必须是WCS的三维坐标,每个点的坐标需要数组中三个元素,三个点共九个元素
    $ k! m; p7 k6 }7 p& {
  8.     Dim fitPnts(8) As Double( Z7 y7 ~  {3 e* {" c( y, p/ M. o
  9.     ) F) e0 p; C9 e3 @: U
  10.     '声明起点切向数组& F. L% Q$ J( A. L$ W$ w
  11.     '切向是矢量,由X方向Y方向Z方向组成,也就是说这是一个有三个元素的双精度数组" N3 X9 M& w" w
  12.     '三个元素的数值可以这样得到:以切线起点为WCS坐标原点,这个切线在XYZ三个坐标轴上的投影就是这个数组的三个值6 O4 R- @7 U( d1 a9 `, ?5 e
  13.     Dim sTan(2) As Double- ~# b( G: x7 M9 z; Y  F$ n
  14.    
    " V3 y  H, G% i+ ?  S
  15.     '声明端点切向数组
    6 k& w8 P7 C* P( ?" q
  16.     '和上面的起点切向相似0 ?6 X+ U6 D( b2 Y! ^# L3 n- }
  17.     Dim eTan(2) As Double
    % ?+ c+ }' E0 A% X  S
  18.    
    ) w2 j, S7 d" Z, m- M7 c
  19.     '样条曲线的第一个点
    ! I$ S5 C0 `, K7 y
  20.     fitPnts(0) = 10: fitPnts(1) = 10: fitPnts(2) = 0
    / h, V# f6 ?+ w0 }) @/ P' a: n
  21.     '样条曲线的第二个点6 M1 Y$ B" |8 U' g# m# p" R
  22.     fitPnts(3) = 20: fitPnts(4) = 10: fitPnts(5) = 03 O  b4 d# ~8 f  R  Q* |
  23.     '样条曲线的第三个点' E; i: m$ H7 w
  24.     fitPnts(6) = 20: fitPnts(7) = 20: fitPnts(8) = 05 C  L" c+ U! F( L- v
  25.     4 p) _1 ^# C) c! j2 R
  26.     '假定样条曲线的起点方向为水平向右" V+ S8 L& Z: Z( P* X# P6 O
  27.     '需要注意的是:VBA中的样条曲线起点切向与画图时不同.画图时起点切向与曲线方向是相反的,而编程时是同方向的- H; B; j- \' y
  28.     '设切线长度为1,水平向右的切线其X分量为1,Y分量为0,Z分量也为03 X* V" B. a4 l! D5 [4 }
  29.     sTan(0) = 1: sTan(1) = 0: sTan(2) = 0
    * J, ?4 e# k% u, b
  30.     '假定样条曲线的终点方向为135度方向+ K4 B4 h# \3 B
  31.     '设切线长度为1,135度方向切线的X分量为负二分之根号二,Y分量为二分之根号二,Z分量为0/ k' t5 M  o/ N
  32.     eTan(0) = -Sqr(2) / 2: eTan(1) = Sqr(2) / 2: eTan(2) = 04 k6 F, [+ @+ @3 }
  33.     '如果起点切向或端点切向的三个元素均为0,则切线方向为默认方向+ r+ z. w7 I: a1 u; a( Z2 m
  34.     $ }  ~  A5 f& _. w5 a
  35.     '画曲线: g$ Z; G' v* B5 k4 t4 I, I
  36.     Set SP = ThisDrawing.ModelSpace.AddSpline(fitPnts, sTan, eTan)8 l$ f* f7 z; ~  }
复制代码
 楼主| 发表于 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 的帖子

我自己大概做了一下这个图的程序(中间块部分也不是很理解),系统提示红色标出的语句有问题,能帮我看一下吗?将十分感谢!!
/ y1 A+ ^/ ^- ]  X3 R( u/ l8 C) [1 A6 o( o4 h' j

1 M& F9 I6 o7 L9 X1 a3 w" F# i. a; b) D) v9 A1 a& U2 b
, f4 u5 j# v. \
Dim Xb1 As Variant, Yb1 As Variant

5 t: @7 Z: h2 I8 ^' M$ f$ q+ u! w% K+ c; ?. `- i2 v
Xb1 = 07 m- u! l" `" H: u3 n
Yb1 = 0

' I$ p# T; z5 y& b0 H
( A- Q/ t7 M+ p' h7 N9 H! F1 S
; P+ _; Z0 C, ]( k) [( h8 d* P+ u
Dim Xa1 As Variant, Ya1 As Variant
3 w3 {0 V7 T7 R
1 r) W, Z+ z! v
Xa1 = 0.5
$ M* S# V9 f# Q3 t2 r/ bYa1 = 12
+ w. E7 _( i( J: B

% M" {& z, C# ^( Z; w  E9 j# ~

2 j- Z2 u- [2 K. I5 P! M4 G) H3 t0 d. [  o  c8 W6 Y$ y' O
  v+ P  c, o7 X8 W
+ R/ g# p! s4 N' L7 W+ R
0 E5 S) j0 R% b2 k
Dim blockObj As AcadBlock
4 ^! R! u" v0 Q7 A! l& r4 P' J1 @) b
; W" B, B, _6 [& w
Dim insPnt(0 To 4) As Double

# l2 s  D" _& F! n. \* a$ ?" D( }3 t, ?9 Y& G
Dim allEnt As AcadEntity
0 P  r8 a& I- x, Y( x  E# t

( a" r' n/ q' q" }8 Q7 ~Dim blkRef As AcadBlockReference
$ A; C/ }* G) L# S/ r$ l

$ z4 `' d! ]7 v+ B8 F" b% p) vDim blkCount As Integer

8 \7 J" p9 \! \% r9 g
1 ~. z# D2 q5 N) [7 bDim blkName As String
4 w& p& V  Y2 V3 z: v( B) \
# E/ q% Y: A) q/ l4 c4 t7 D3 e- h" ]
2 L  h9 N; q5 y" O* E& B3 Z

5 L, Y) g+ D4 M2 v7 d# t4 D
For Each allEnt In ThisDrawing.ModelSpace9 E! |) h2 L; ~2 S

, x& B9 g- i1 m9 k" LIf StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
) w# C! }, J2 y1 z/ K5 S

1 P# ]5 `) }8 H7 N) @9 @Set blkRef = allEnt
& ]' Q4 x, {7 `! G9 F7 z1 `$ h

: U5 ]6 t  x1 v6 _7 `$ f
1 c3 \% P: k: S+ D# R) n9 aIf StrComp(Left(blkRef.Name, 7), "blkGEAR", 1) = 0 Then
1 b4 |* X9 f& ?2 p
3 V: \: k# n4 Q" E+ W
blkCount = blkCount + 1

: p- P4 V# p) H, @4 Y; \
; N! |9 o* ]  G3 [% H: \End If

( z/ b/ J( }0 e# q5 X$ D) V. n3 m% {  f1 \
End If

2 T( I2 c- O; \9 o3 m, R" P4 T0 _) u6 s5 k. q6 @5 i# P
Next

4 [6 M; Q8 U8 a! Z- e2 T- T# ]7 |1 {( K( Y# N
blkCount = blkCount + 1

( G: B4 Q3 y; W! Y, L* u& u; Z; K
" J' J2 f4 \" l2 r
) m4 l: E9 B9 [  D
insPnt(0) = 0:insPn t(1) = 0: insPnt(2) = 0: insPnt(3) = 0: insPnt(4)= 0
1 |* u& ?8 B% r$ {8 L4 G
6 ?+ i* u  B/ x( v* q  BblkName = "blkGEAR" & blkCount
% F4 ~. `8 \+ y* I* i* p( @

- R  \& T: q$ L8 A& k" H( F0 e' u
2 Q7 B% D- D7 d, ?9 pSet blockObj = ThisDrawing.Blocks.Add(insPnt, blkName)
;该处系统提示有问题;; f, `( y" J% H

, V% n- b' O7 B4 E, ?+ Z0 X% R4 l
& T  R( [4 ~4 M

6 N5 U5 M  k9 R9 a1 G" z& X; G% @; dDim sTan(0 To 2) As Double
2 c0 [. B! `5 X) Z  C( ]
( a2 z; x) M$ g& ODim eTan(0 To 2) As Double

  q2 u& r' j. Y8 \" f, Q
" R/ W" q* }4 K0 MDim fitPnts(0 To 14) As Double
4 D4 [/ w" l  K7 |7 a
/ ~9 A& I6 v( r8 J. Q
Dim splineL As AcadSpline
: T& D: a" H# Q$ d0 Y

  [# E% i/ P/ C% ]2 j" J% {' f0 TDim splineR As AcadSpline
! {! ~( S+ j) ]+ g# N: }# H) L
' p/ X& [4 [, j6 }, V* r" l( q! R
sTan(0) = 0: sTan(1) = 0: sTan(2) = 0

( g* {- e! S# o2 N: j
- Y; q$ W$ O; ~: B3 TeTan(0) = 0: eTan(1) = 0: eTan(2) = 0
! V8 _9 I% F! B# U
! Y; H+ F' {* k! h- K6 ^+ w
fitPnts(0) = Xb1: fitPnts(1) = Yb1: fitPnts(2) = 0
. U1 n" {/ g" L4 e% R
* e# t% y! s( h2 R! S$ @5 _
fitPnts(3) = Xb1 + 1: fitPnts(4) = Yb1 + 3.75: fitPnts(5) = 0

7 ?# p4 c2 J5 S. O% `6 F4 c0 Q
7 q% G- c9 t! |fitPnts(6) = Xb1 - 1: fitPnts(7) = Yb1 + 4: fitPnts(8) = 0

% _* S; N5 J1 V% G( i9 t/ Y/ T" \- s- m* g* p  f, I6 i0 k
fitPnts(9) = Xb1 + 1.5: fitPnts(10) = Yb1 + 4.25: fitPnts(11) =0

$ T+ V: f9 v" ~/ D# f/ i$ I1 ^: t1 o7 h
fitPnts(12) = Xa1: fitPnts(13) = Ya1: fitPnts(14) = 0

% i. D* Y! u% t4 q* C: T
& @$ }; V. S3 o  M3 F7 e
! e1 l$ O& R3 |) v3 \' H# `

0 o$ S# b$ b9 l  t% f2 nSet splineL = blockObj.AddSpline(fitPnts, sTan, eTan)
2 H6 l- s" p4 j( A2 |
, k5 ^- X4 n* H& D9 Y  o" f

/ y' ]: V* c& c/ U; A9 U4 K4 w/ c8 ?4 \8 I; Q/ Y+ J' S4 M  O
[ 本帖最后由 蓝莲花。11 于 2009-5-23 03:12 编辑 ]
发表于 2009-5-23 07:24:52 | 显示全部楼层 来自: 中国
insPnt应该声明为有三个元素的双精度数组,因为这是块插入点的三维坐标.
5 H( ?5 O- Q, j! j, B  v' ?相应地,红色代码行上面两行多余的赋值语句应删除
 楼主| 发表于 2009-5-23 19:42:56 | 显示全部楼层 来自: 中国陕西西安
对,已经好了,太感谢了。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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