QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。4 ^0 k  u$ u  Q  G6 r$ C- R
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
! }% V$ W( a2 r& m. H% Q" i4 q代码如下:
8 ]: \1 O" y; g" Q; I8 MPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
# E% J6 W+ u5 R1 L+ M) W8 Y7 J& |* GDim Testlayer As AcadLayer
4 j; S8 B4 N, lDim ObjCircle1 As AcadCircle                                '辅助圆/ ]- I) C5 u4 m% n5 y! t9 z) C8 O
Dim ObjCircle2 As AcadCircle
3 Q1 ~4 g. C$ A  Y( x2 Q; GDim SWingLength As Double
* J# v! K- x& `. d0 w  sDim SWingPitch As Double( q' s" k& E3 X' z2 M6 y' L) P
Dim PT(0 To 2) As Double
  Q- Q8 T5 G0 B/ {( V3 k! B4 T  ~/ SSet Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
3 O0 x. t* \1 B/ U% {5 A2 N. Q9 kTestlayer.color = acRed
" S- J+ n  l  rThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层; |, `7 d1 A7 Y# J
Testlayer.LayerOn = True  d# e$ K, w: v+ l' i: s. a
SWingLength = 2607! L$ h- I9 d" C! J8 f5 X+ F) }$ Z
SWingPitch = 3250+ A& A7 C/ o. T

) j0 a7 v5 L5 W! wSet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线9 R+ x% R' @5 E( m3 K
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)' p# j; z' D1 }! t# K$ x

% ^: E1 i- g4 W0 }- c4 V5 {Dim IntPoints As Variant
. b' i8 n( z: R+ f% J" ^) J  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
/ H# d' Q4 K$ d6 @! z1 z3 W& u9 t
If VarType(IntPoints) = vbEmpty Then
6 `# a- U; \) s6 U/ K! L8 EMsgBox "没有交点!"4 u, D: `& M! i2 s, v( S
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
' w* }3 G: a) R6 ~( P/ g* W      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3" b# _4 @: l2 M
        On Error Resume Next
! b- `# x- s" P8 L$ n& Y/ V% Z) p        If IntPoints(i) < BSupportCenter(1) Then
/ Y2 R/ ]- H* z) C5 Q9 Z9 `; m0 C           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
2 g0 S- u0 X3 W. I& X           GetFSupportCenter = PT                                              '函数返回值/ g1 o4 m5 U, l, d8 R. h
        End If
) ~6 C. _6 a4 h  u1 o8 |0 Y/ O9 I* w      Next
* N7 r" g& ?2 q# |0 xElse
+ T7 ~1 f5 o/ |) z+ s1 A  qFor i = LBound(IntPoints) To UBound(IntPoints) Step 3
9 X- y5 [& M$ i3 f5 r        On Error Resume Next
. q7 b1 x8 Z9 m- y* r7 R  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then2 E$ {5 ^4 G( {
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)- w) W& Z* N% B. k) k
      GetFSupportCenter = PT                                              '函数返回值( J# d, X1 a+ m% k
  End If: q* D5 [( a$ ^: T" J2 e: O
Next
) F: v5 \8 m. TEnd If' z# ?; R3 @2 R8 K) a5 R, x) a
'ObjCircle1.Delete
" _  Q' L, a8 j& A'ObjCircle2.Delete
. U8 c! |9 p8 v6 l7 YEnd Function
$ U' j/ {1 C6 I( C  A* z! n, c' N% b1 E0 O) P. G$ t
Sub trial()
; ?# u7 k3 ^$ t# O) O& h7 F/ vDim A As Variant5 i+ Z( ]7 z) t- ]5 f
Dim B As Variant; g9 Q$ Y/ @) A7 |- m9 ^- b
Dim C As Variant
2 p2 I$ s  i* F' t2 |3 A( f4 P- s9 OA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )9 x2 J( O, X0 {/ T1 G/ B# {
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
$ }. b; s3 {+ s7 Y2 ]C = GetFSupportCenter(A, B): V; u1 x' F! I- G2 f
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)- V' Z" m5 j9 `
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错  ~  a* y3 |6 H0 B4 C2 [3 Z
Empty的值为0' ?/ B; h. G5 Y4 A1 {# J
返回值:' k, N- b* |% b( ]
常数 值 描述 . \- d% h4 ^7 s! m/ H+ O
vbEmpty 0 Empty(未初始化)
$ i. W9 H+ z8 \" ?4 SvbNull 1 Null(无有效数据) : ~0 I7 L9 {5 n' r/ y6 Z) m
vbInteger 2 整数 * B& U) a& I: y0 Q# h
vbLong 3 长整数
! n1 u& r( G5 \# lvbSingle 4 单精度浮点数
3 {" ]' O' m; ovbDouble 5 双精度浮点数
4 Y5 ~. {& [- N) ~vbCurrency 6 货币值
/ |5 Z1 _7 r. e+ ]4 v/ m! f( XvbDate 7 日期
( u4 i. N" D$ @; X2 G- I9 rvbString 8 字符串   E, y3 }9 H* P; [
vbObject 9 对象
$ l6 |6 E3 W* K1 [8 k4 ]vbError 10 错误值 2 t3 v, x4 R% w7 [4 A) x0 f3 G
vbBoolean 11 Boolean 值
5 S: z3 l6 ^* bvbVariant 12 Variant(只与变体中的数组一起使用)
& J& ^" x& N7 S9 f1 I4 wvbDataObject 13 数据访问对象
$ A( }7 C$ k# I8 {- _3 GvbDecimal 14 十进制值
2 ^. C& ^5 c7 n0 m5 svbByte 17 位值
3 s) q  c+ C( w8 xvbUserDefinedType 36 包含用户定义类型的变量 . s8 @+ y- h1 N+ G
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
+ G8 `( q* M8 ]' U, L( |6 tVarType返回一个 Integer 所以出错

9 r+ J/ \9 q: w. R2 W; I% P/ i应该是返回一个双精度数组。; k0 V* d( P  s- b# l: y6 f" S

5 _+ g- a3 N3 K! E' s出错的原因是这里不应该用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 )

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