QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。3 L2 r% Q1 L! I8 F. u
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
  Y; X$ l* d+ }+ |8 X: _代码如下:1 j+ K. q  w) d& Q$ M2 Q
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
9 K6 L; D% B# eDim Testlayer As AcadLayer7 b& T% T  h1 d
Dim ObjCircle1 As AcadCircle                                '辅助圆* k8 X9 P9 `$ X. C# k  r/ B
Dim ObjCircle2 As AcadCircle  g( C* `" R9 n
Dim SWingLength As Double3 n4 E6 r% }  j3 C
Dim SWingPitch As Double7 O$ n$ K' M! s4 Z8 P
Dim PT(0 To 2) As Double
7 i: n8 q  ^) f* Y* t) gSet Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
7 ?' b5 U, o8 ~) Y- CTestlayer.color = acRed( n% ]3 L/ X6 ^6 Z, n% }
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层6 E0 M% B8 I- T( l& Y
Testlayer.LayerOn = True8 S  u8 [, p, Y& ?# ]2 d" ~
SWingLength = 26078 u1 A+ y. S7 t$ `& K# _. |6 `. B
SWingPitch = 3250# v& L- E" K2 y+ _5 a
' h- B: c+ x  h; Z( a' z) l
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
# Y' [/ A5 o3 fSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch): s# z% W/ U- M8 V) }
! U  w, ?2 G4 b9 F
Dim IntPoints As Variant
  f( l& ]9 L) f3 o0 _  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
9 r/ h! r5 d6 e8 c- F! i) N; r% J; a; G* [
If VarType(IntPoints) = vbEmpty Then% F' ?% p( [5 g
MsgBox "没有交点!"
5 T& N7 X) r6 e7 e% a) ?' c# e' cElseIf BSupportCenter(1) = FSwingBasePoint(1) Then' l1 a$ G$ d  ]5 u2 ?. L
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
2 {# K7 e8 \& Q5 S        On Error Resume Next9 o3 ]  D9 K  A$ A5 b0 @0 b
        If IntPoints(i) < BSupportCenter(1) Then$ V" h9 K) E& A
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1): }* h6 O% a1 j+ J8 _
           GetFSupportCenter = PT                                              '函数返回值
8 Z: g! \) {) j2 n/ E$ J        End If
9 J) B0 }" f; n8 A) q! |+ s      Next
" r% Y& ^' Z; ]Else; b' [# J6 ]/ e9 S% v
For i = LBound(IntPoints) To UBound(IntPoints) Step 3
1 L* D+ Y: N2 A' T        On Error Resume Next( K  R* T6 D# E! H8 A  n6 o0 T
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
( g, m$ m; h* |9 M( ]      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)! f8 c' ^) e6 A
      GetFSupportCenter = PT                                              '函数返回值
9 l' }3 j6 s3 o' N) q  End If# `* f# u9 o/ q) D& a. [7 W9 D
Next+ t8 U1 h4 [7 X/ b! N+ x4 A
End If
6 V5 Q$ r/ s) s% {'ObjCircle1.Delete0 y( Z. q- {/ Y- a( L( a0 O
'ObjCircle2.Delete
+ H9 e) V3 i1 {8 lEnd Function
- \# F' c% x6 b* `
% I1 [: \* _- @# e1 [Sub trial()
# n$ s( I! p% MDim A As Variant
3 H& Y+ B# d1 @0 v9 h" QDim B As Variant$ M% Y) A1 l6 K( m- r. Q, Q& Q6 A$ K' Q
Dim C As Variant
1 @: o! H% ^$ j2 uA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" ). k2 ~' @; R7 |  I" d" N4 [
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" ): t5 Y- c5 b- p3 g) d1 ]
C = GetFSupportCenter(A, B)1 W  ?  a' ^5 m4 m8 u
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)
+ D5 W6 J( x; `; Y2 k) N, WEnd Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错) k1 [7 ~- ]5 G! O# `
Empty的值为02 X) {0 z, U6 O0 D
返回值:
% x( @% w/ [9 S6 u! j常数 值 描述
5 `' d6 w  @7 C7 z! s2 a) }vbEmpty 0 Empty(未初始化) ' E! I  j  h% _2 }' a' F9 v% V
vbNull 1 Null(无有效数据) / |/ s# q, q% S, s" }% O: I
vbInteger 2 整数
! b# m, b/ l* O& R7 I, G" s3 pvbLong 3 长整数 6 @: r. Z( ]+ O& `. J5 I- t+ `) A
vbSingle 4 单精度浮点数
$ H& Z# Q6 ?* qvbDouble 5 双精度浮点数
. J! h' f8 |1 Y* uvbCurrency 6 货币值
% Z4 L/ f$ s* ZvbDate 7 日期 : f% c: z2 l" Y. l0 @
vbString 8 字符串 2 l' K0 N, G" D& _1 t  s# J& O
vbObject 9 对象 1 ^  V% E. T: B; ]. {, H4 S8 @' L
vbError 10 错误值 ( f# q3 z( ]9 a2 h4 ]
vbBoolean 11 Boolean 值
' p0 u8 S+ y- M$ |& h9 U4 jvbVariant 12 Variant(只与变体中的数组一起使用) 8 A+ u9 |  x, n5 m0 V& D+ \$ M
vbDataObject 13 数据访问对象 " b. h0 j7 A# L+ E6 ~# G) l
vbDecimal 14 十进制值 : V$ F6 o0 S+ c
vbByte 17 位值 $ v4 R$ d6 S# w9 w
vbUserDefinedType 36 包含用户定义类型的变量
" |) ]$ F) I( z2 Y# D8 cvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif. _! d) C4 n5 ?' m0 e
VarType返回一个 Integer 所以出错
; `  p  M. R* O# V
应该是返回一个双精度数组。& X$ w+ _7 n6 ]0 D& f# D
( L% Y; Z1 y5 k( N' N- H- j
出错的原因是这里不应该用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 )

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