QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。( w6 {$ z! N- n/ q7 |
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?% |3 T4 s2 \) g
代码如下:+ X5 j, m7 J3 L, }" F
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant; i; u! _, @. q5 W- s, {
Dim Testlayer As AcadLayer" J; N7 V1 l2 D" A3 ~. T. V' F
Dim ObjCircle1 As AcadCircle                                '辅助圆
; |2 e- M. N( U% y4 uDim ObjCircle2 As AcadCircle
% [9 g* \6 m0 M) ~- v( ZDim SWingLength As Double
  l9 e; X7 E  x+ W% FDim SWingPitch As Double
: U' }% N1 c% j8 xDim PT(0 To 2) As Double% ~* [) [, H' J: i1 N  L8 Z5 Y3 W2 T8 b
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层0 W; w  v" A- k5 _* \% f
Testlayer.color = acRed8 v& `3 Z6 J. }: Q' g
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
! O4 i5 H" U. K* P* I8 Q* C1 _Testlayer.LayerOn = True7 B" Q8 b9 ~+ g! Z' F* N) I" S
SWingLength = 2607
& O* ~, t! }/ ]8 p) N9 Z2 m$ OSWingPitch = 3250+ |$ ?1 P+ ^. z9 Q% c

- {3 A% V' L4 ?% i( o6 MSet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
' n7 K/ S% P/ E6 q7 W5 r* lSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)7 ]7 t( h6 Z0 }" c, N" w/ }5 P
4 V7 D# ^% x% x: F) Q
Dim IntPoints As Variant
$ v" s, q6 H3 I& x: U  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
0 B2 R7 }5 h) Y) j+ m2 ?, a6 O' P; N) o6 ]7 k
If VarType(IntPoints) = vbEmpty Then0 r% m! Z* Q+ P
MsgBox "没有交点!"
, C" u4 ]3 P- `! sElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
) Q1 U8 b; `7 `      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3* Q/ S, ^% m# k
        On Error Resume Next1 w# G2 S% Q" z) x
        If IntPoints(i) < BSupportCenter(1) Then
$ Y( V& [! n$ Q: ?5 x- K  [           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
0 }  b( y- U& X& L+ C, O           GetFSupportCenter = PT                                              '函数返回值# U9 z* u: M9 }
        End If; F& n( R0 H7 w/ \% h0 z+ z
      Next$ Q# ~6 F7 o& w6 H+ }
Else* \' d; g2 N  Q# n, M* Q5 D
For i = LBound(IntPoints) To UBound(IntPoints) Step 3. k) \* r6 |2 M0 l% y7 v, C! h0 P
        On Error Resume Next
  u8 [. W$ z) _, ^  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then1 K' C+ U0 h5 T4 o" S1 l. @
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)8 n& [5 i2 k3 E& K, H
      GetFSupportCenter = PT                                              '函数返回值
. ~. V/ g4 o  h" ]  End If4 {/ Y. y/ E0 H6 [  r
Next
9 k  d2 K' k' i- F5 HEnd If
, ^3 g7 S$ J0 x'ObjCircle1.Delete6 _$ ]- H. B0 D4 ~7 K' [
'ObjCircle2.Delete1 N' w6 K' {+ y: Y0 u
End Function
9 w! f1 ~* X2 ]! M
5 ?: J2 E4 g% B! J2 O% @8 I+ kSub trial()
, Z8 B6 n) S6 B( nDim A As Variant
8 k0 f8 |7 @1 ]# \4 w8 j  q" hDim B As Variant7 }% @/ |4 W. w$ J& t
Dim C As Variant
# @2 J) e5 ^0 }7 xA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
# H, G  e9 j! n/ x% D) dB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
6 ]) _6 b+ f) m$ Q5 iC = GetFSupportCenter(A, B)
+ B9 \: ^: r' f7 f# fMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)
% ?6 T$ w3 ~/ f: CEnd Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
3 U$ o' J: c; h  T( _Empty的值为0. t  L% W9 G/ L% s
返回值:
5 _/ s  M( t8 u! S常数 值 描述 % y" e: Q% }- d  @( b5 D" b2 `
vbEmpty 0 Empty(未初始化) $ m+ R& H# I& V* L* o9 E. \2 B. N
vbNull 1 Null(无有效数据)
! @- ^1 s' C* ~' XvbInteger 2 整数
1 n% `+ A+ [7 N2 g* O+ \. J# }vbLong 3 长整数 + v9 r) W# b; n! K! v
vbSingle 4 单精度浮点数 9 }$ M$ t  T: k9 G
vbDouble 5 双精度浮点数 8 f- x5 w. w' J/ @6 [' U
vbCurrency 6 货币值
" ^( j1 t+ t' I: }+ FvbDate 7 日期
- c: w! J, ]* H2 jvbString 8 字符串
' a1 R0 j/ ^7 U4 l3 j" F/ xvbObject 9 对象
) [  E$ {6 ^$ f5 qvbError 10 错误值
  s8 e# }2 ~, L: x0 ZvbBoolean 11 Boolean 值 0 l( N; K8 R  m% A" ?. ~5 Q- y
vbVariant 12 Variant(只与变体中的数组一起使用) . }2 N2 r5 q5 H
vbDataObject 13 数据访问对象
- g6 Y8 x& Q: w0 e& y5 IvbDecimal 14 十进制值
& w3 c0 @  Q, j$ R' {- D4 BvbByte 17 位值 5 k5 V! m% q2 X" U" b
vbUserDefinedType 36 包含用户定义类型的变量 ) ?+ p6 a, U2 O' y- L
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif; n$ S, R7 K" n: Z  c- t8 B- z
VarType返回一个 Integer 所以出错
) \0 [. Q  u: q* Z: T1 a% V
应该是返回一个双精度数组。
4 J( Y; X9 J& @4 S
6 J) m" M/ i4 z! C4 l9 Z" i出错的原因是这里不应该用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 )

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