QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 2800|回复: 2
收起左侧

[讨论] 为什么提示“类型不匹配”?

[复制链接]
发表于 2008-12-6 16:38:29 | 显示全部楼层 |阅读模式 来自: 中国江苏南京

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
/ E: y9 R  M: s5 P1 i7 |6 z问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
# N# ]! e* l6 ?' A- c( x代码如下:
; z& K$ X+ J/ @4 E: i9 K* q* V$ qPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
: Y. _% E/ a1 q9 _5 o& ODim Testlayer As AcadLayer
& @/ Q4 R1 X8 K2 S; J3 ?Dim ObjCircle1 As AcadCircle                                '辅助圆
) w) n8 D; E/ g) KDim ObjCircle2 As AcadCircle2 ~: B$ i& E  I& g8 e* N; {  c/ ^
Dim SWingLength As Double
" c9 A; e: N, b8 p4 ?5 ^Dim SWingPitch As Double
! B0 X9 }& y3 s7 p+ }# mDim PT(0 To 2) As Double4 K, b# e* ?; d% o- M
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层/ Z9 ]! B: n. b1 D4 W- y
Testlayer.color = acRed
  r' R) F; {% l( w/ q$ h* i2 t2 H% tThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层% D. F- v5 m# I  M5 b
Testlayer.LayerOn = True
9 K- e% M: F% sSWingLength = 26076 c8 v$ ?/ X: S+ E
SWingPitch = 3250
1 R4 T. ^! M. _
# b5 P: z( j# H+ x0 ~0 ASet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线: w6 l1 Q9 L% C3 K+ s. e4 H
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
5 M# q) e: I3 C# B0 @  q" O5 D* T5 w* n3 U. d/ B0 n+ y
Dim IntPoints As Variant
3 O' }( `" u0 e7 }6 D! N; o  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断2 T: s- i6 ?3 g1 s/ e8 K3 G; t( D/ R
) \. p# ?) s4 S  g
If VarType(IntPoints) = vbEmpty Then6 I8 |1 H( X: i9 p$ H3 |- M9 h( f$ Y
MsgBox "没有交点!"3 A9 R8 y( _( T8 _+ [) E0 j  D/ y
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then: I. p' O" u3 r. J' K) K- _& T
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 30 y" A8 b) U3 C" c
        On Error Resume Next, R* J# o0 P! S% v2 W6 ?  L- v
        If IntPoints(i) < BSupportCenter(1) Then
6 b2 u. {% O1 [$ l           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)' f" Z* X; l6 t
           GetFSupportCenter = PT                                              '函数返回值
; p5 v) P2 E" s/ P. h$ k        End If0 _% I  i7 L  S/ q0 G
      Next% U3 L' b8 C) b1 F
Else7 G# P* ~/ U2 n
For i = LBound(IntPoints) To UBound(IntPoints) Step 3
3 W; l9 `" b# P        On Error Resume Next" p' H9 E6 o9 K* }9 y- R7 K) C
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then# M% v: M! U6 g( P! n$ R
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)+ i# U& ~, Z$ @9 x3 a$ f
      GetFSupportCenter = PT                                              '函数返回值
" _4 N7 K. x" C3 Q8 G  End If
' m$ e) d+ O2 }' W% {+ n. n. }Next
/ r& J; n2 _; h8 gEnd If
, u. A  k3 o  X0 \! N$ g% c' |'ObjCircle1.Delete. ], g* @1 O; J/ g: M
'ObjCircle2.Delete; K4 E5 t0 [, f( U: s  j
End Function
. E4 H& O$ Y* F( m: J
! E$ P, w; Q5 l: C: V+ m& a7 eSub trial()
  j8 i& p: @$ d! s8 A1 a: vDim A As Variant& `3 f- t  C, l. f: u3 |& q+ |
Dim B As Variant  m+ i! F1 W. R- [5 ^. ^
Dim C As Variant5 _9 q7 W' M/ h1 h2 h( b
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
5 D' w1 p+ ]: A+ N) Y+ q+ eB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )& P) |% C) Y- z" Y5 z
C = GetFSupportCenter(A, B)
* K* V6 Q' F8 ^8 TMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)4 b9 d9 {# x% p( r
End Sub

评分

参与人数 1三维币 -3 收起 理由
woaishuijia -3 广告请发到相关版区

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错1 w) S: K4 ^/ W
Empty的值为0# t+ P" Z% D: Z+ \1 a% T. l
返回值:
3 N& G: z0 E, q. _8 x# q6 U6 _+ r常数 值 描述 , }0 r7 e  {) Y/ h, {
vbEmpty 0 Empty(未初始化) % `% [) V( L& h5 R4 b1 x) I
vbNull 1 Null(无有效数据) 5 u- R6 E' R0 n- E3 @
vbInteger 2 整数 8 A. j) P/ H3 C/ T
vbLong 3 长整数 9 H: M0 m0 W. q$ k" t
vbSingle 4 单精度浮点数
2 k( ~/ k: d0 T$ FvbDouble 5 双精度浮点数 $ @/ \3 p  ~5 S
vbCurrency 6 货币值 ( v. M2 P/ W; S8 b
vbDate 7 日期 5 G  D  S8 k# P: E
vbString 8 字符串
. e8 F7 q; s& O9 f4 RvbObject 9 对象 ( ^2 a' @& n2 a: j! _, x0 S. B
vbError 10 错误值
7 \, n2 L: b  N! V6 RvbBoolean 11 Boolean 值
) m$ ]) E9 W' x5 {* S0 n; pvbVariant 12 Variant(只与变体中的数组一起使用) , J) h* }5 i- c3 D' I
vbDataObject 13 数据访问对象
; E! q' A  ^* ?' n7 R" ^2 h+ XvbDecimal 14 十进制值
+ b. [1 Q- K$ e4 Z" ]* @vbByte 17 位值
- ]! d1 o) V2 [, }; [vbUserDefinedType 36 包含用户定义类型的变量 9 Q/ H) [, P: z8 H! {% [
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif) y, K- _3 ?) U  L4 D; k3 s! e9 b7 ~$ x
VarType返回一个 Integer 所以出错

( _- P/ o5 H1 s  B1 Y应该是返回一个双精度数组。
' \% z; Q, D7 j8 ^0 l
' V3 P/ {0 F6 Q3 o出错的原因是这里不应该用vartype()函数来判断,因为不论有没有交点,变体变量都会变成双精度数组,vartype()函数的返回值永远是8197(即5(双精度)+8192(数组))。只是数组元素数量与交点数量相应。这里应该用ubound()函数返回数组的最大下标并判断,如果ubound(IntPoints)=-1说明没有交点;ubound(IntPoints)=2则有一个交点;ubound(IntPoints)=5则有两个交点,其数组中元素0~2为第一个交点的三维坐标,3~5为第二个交点的三维坐标......
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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