QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
% I7 m) {0 l) g1 b( m  c问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?3 m. s) B) J1 ^& u1 w
代码如下:+ A& A. ^& x8 y: Q3 d) {: w5 I
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant" j" K$ @* k: W! Z( r+ G  M
Dim Testlayer As AcadLayer. W% |- M& X  G
Dim ObjCircle1 As AcadCircle                                '辅助圆
: F& A. v7 W1 }2 YDim ObjCircle2 As AcadCircle
3 |1 c. L5 p3 h  Q9 j6 gDim SWingLength As Double
5 W: S( l) ^% q) h0 vDim SWingPitch As Double
4 w4 A: {/ |/ [8 x- c& K) ?Dim PT(0 To 2) As Double  E# L0 n* a9 {: R& ?
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
  x: R. @: }% b+ {& S  qTestlayer.color = acRed4 E& Q8 \) j4 g
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
7 y- q  e/ o" g8 r% U8 UTestlayer.LayerOn = True
) j+ B/ y& a6 ^& k5 j% u& t$ ASWingLength = 2607+ F- A7 o% g* ]* o1 q7 }! \( P
SWingPitch = 32508 e2 c7 J4 X& V+ ^/ r

# q' v1 J' o% V. x& i  i7 a6 oSet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
4 I4 U: S; W* d4 V# @  vSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
- z  [" M, {- s# y' O9 W
) ?+ T/ G: J5 g2 m9 ODim IntPoints As Variant" K% g- t( [0 q$ K
  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断% \" f9 s  T1 I. S5 r/ R. A/ Q

4 }% n- `% {4 ^! I9 [If VarType(IntPoints) = vbEmpty Then9 f  E7 B6 ^2 G/ d4 s2 I
MsgBox "没有交点!"
: a% ^6 O1 q6 P8 o( [" L. l5 ^- `/ ^  kElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
& I9 h: E3 Z, F# C# L      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
- E! Z) s9 L! D        On Error Resume Next; M7 K% j, W2 J2 a
        If IntPoints(i) < BSupportCenter(1) Then
, v$ y& m, M2 p; U& b. r3 C1 l+ I           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)$ ?% h: G8 L6 F7 u: `9 R
           GetFSupportCenter = PT                                              '函数返回值8 d/ i8 V  |: `7 w9 u0 X" c
        End If' f. C3 X! }  ^& z8 w
      Next
( B; |0 k6 m- G  [; tElse
, e4 k: v- v. W' U! tFor i = LBound(IntPoints) To UBound(IntPoints) Step 3+ f# a' {$ B8 z* p
        On Error Resume Next* w2 i9 t- S. r  s8 F  F
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then% F, X* T5 ]# C: L0 I: B
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)" Q9 p  P9 B" `- S6 R
      GetFSupportCenter = PT                                              '函数返回值# i( Y6 A: k3 u  I: Q) U
  End If9 ?) d( F% a6 S, b8 \
Next
" L4 r4 T- c# BEnd If
  X' u7 k. f' J# C5 \; Z'ObjCircle1.Delete
" h& z& O% {1 W# h: m9 z'ObjCircle2.Delete' \: E- \. l' {' Z1 I7 ^7 ~$ a
End Function
4 M! Q& r' u( C( C% }! j
9 W. C0 o* v8 A6 n8 \7 E/ nSub trial()- P4 N+ N8 N" m
Dim A As Variant% h; q% o  g& [' K. f' i9 E: ]
Dim B As Variant) l( }+ j# U' U  U& a2 g
Dim C As Variant
9 k9 W& K4 r6 \8 D8 V: MA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
* p9 x6 S# }; o0 }; B: pB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )) m6 Y5 n' s- z4 P0 C" w$ T9 }
C = GetFSupportCenter(A, B)( V* u3 r0 U$ `' Z
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)! [3 ~; h0 I) p# N
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
4 ~5 q- ?# U! cEmpty的值为0
. ^6 {$ t; D$ A( e% p返回值:
1 k: ]; S- p( f9 B常数 值 描述 9 X" h/ T# @2 {* k6 w
vbEmpty 0 Empty(未初始化) 9 A. ^9 M2 J& F: [) I" n
vbNull 1 Null(无有效数据) 6 v% g% Y7 F) k, v
vbInteger 2 整数 . E& g) f  ^7 p' ?. v( j0 ?$ V
vbLong 3 长整数 6 H  X2 s2 y0 F$ M/ c
vbSingle 4 单精度浮点数 * m9 ^( ^, J# q5 w. m4 }& R
vbDouble 5 双精度浮点数
8 ]: H( j4 W) E9 kvbCurrency 6 货币值
' u7 d' j6 [# rvbDate 7 日期
6 p' K' b1 e' r, `2 G: lvbString 8 字符串
; k4 {) \7 V+ y/ q# `) X* vvbObject 9 对象 4 C2 g' b- m6 F1 L* I$ u
vbError 10 错误值 6 [+ m5 [- t3 d& A0 M
vbBoolean 11 Boolean 值
; ^6 ~$ {! k. {vbVariant 12 Variant(只与变体中的数组一起使用) 9 R& K: o9 v. s/ X9 ^
vbDataObject 13 数据访问对象 ) a6 k2 h3 J/ S/ o. \" ^9 j& @: L
vbDecimal 14 十进制值 0 [4 [0 Q  `* G2 x# k4 m% I4 J/ t" `
vbByte 17 位值
" x/ s" Y5 H0 f3 w0 @vbUserDefinedType 36 包含用户定义类型的变量
& }5 ?( {  c; C7 W( W5 cvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
) q4 u. t. }, ]- ?VarType返回一个 Integer 所以出错
0 N$ F# u5 j* S& n- k* Y8 O8 N7 w3 \: B# c
应该是返回一个双精度数组。- W6 K  b8 X- N9 Y  T' L8 {( v
1 ~9 K; V, x( G, O/ @9 z
出错的原因是这里不应该用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 )

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