QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
5 E8 p1 a& U4 F0 l. z" X1 C& k问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?+ w7 _$ ]+ e" r& K! d4 ?
代码如下:
$ y9 F) S! b8 HPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
: `( ]8 d" |; q+ C& w% `9 g1 ^Dim Testlayer As AcadLayer
) g8 h6 G" o0 a% |. h  pDim ObjCircle1 As AcadCircle                                '辅助圆
4 w2 [( p4 }" t& T9 d7 [+ D$ g( bDim ObjCircle2 As AcadCircle
2 I9 v% A! a( A. I" ~: B0 \Dim SWingLength As Double2 W" D' w# a: ]+ P
Dim SWingPitch As Double
( J* R6 t# |6 w! ?: S2 cDim PT(0 To 2) As Double
6 L1 ]$ Y0 B* J8 T* {' b; sSet Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层! r3 Z" A) E) w
Testlayer.color = acRed9 e  s3 y  u" Q. O+ J. i5 x7 l1 u
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层  c! `$ t$ L' H0 q% j5 g
Testlayer.LayerOn = True
, ^9 Z9 m% g% BSWingLength = 2607
) Q$ G8 T( F' s! QSWingPitch = 3250
( _7 x; X, ?" K, e4 o( f6 c* [/ W! I0 s/ _7 ^6 e9 m
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线0 f9 p9 K  |: [% c' G& n- Y
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
: n$ L$ M' K7 x4 c9 K* i( d' T# F1 \, D
Dim IntPoints As Variant) u3 P: a) G, ~3 y; \9 \
  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
, c0 H8 n. v; V( O3 l
8 o2 g5 ?$ U0 c" B" B. t. Z# e2 FIf VarType(IntPoints) = vbEmpty Then
$ M1 Z7 O! h- ?* X) pMsgBox "没有交点!"1 K. x: u# z7 b$ T1 W
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
$ H0 j0 e8 G+ T+ t) N3 t9 i      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3/ \+ i7 s" N+ Z5 W1 l  [
        On Error Resume Next
3 R# ?7 ]' {# `# q  P$ X3 d        If IntPoints(i) < BSupportCenter(1) Then1 J2 k' `$ B7 ?4 W* |
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)$ I% F% K, O5 T3 X0 _6 |* |
           GetFSupportCenter = PT                                              '函数返回值
' n. G" S* P' d7 Y) v% q. ^2 D  g        End If+ n% @5 K0 l- o2 r0 U6 {: I
      Next
1 V) K* {! F: Q3 `3 u" K" {& e0 X  MElse; E9 \0 ~5 m9 ]
For i = LBound(IntPoints) To UBound(IntPoints) Step 37 E( b6 O& G8 e( |" C% p
        On Error Resume Next4 F) ~  l$ X3 {1 U
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
& D) v  @; X+ o3 X6 u3 _- s* j      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)
" Y4 \( F: P6 s" b      GetFSupportCenter = PT                                              '函数返回值
8 j, m$ T/ h: c2 S  End If$ i. Y& \0 T5 |) l  U
Next
" k  g5 V. a; d. R) }% g% e1 r: QEnd If, Z- h* ^6 J6 l% q5 P* d" z
'ObjCircle1.Delete
. j2 o+ ^2 _4 E$ B2 r4 ?* T  A'ObjCircle2.Delete
1 X% M& w9 h# Y2 c8 C6 \1 IEnd Function
% W; r3 E+ x, W# _
" e6 w. J9 @; v% y% ?Sub trial()
, Q# H! k! w# e7 O+ A1 UDim A As Variant
% ?) V4 F* O: B$ V, N/ C: hDim B As Variant, ?+ k8 ^6 n5 J' O- r% Z
Dim C As Variant0 R7 W( L  Y+ `- B6 |
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )' m0 i# m0 W/ {% E* X
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
# J  r3 x7 P+ A! X' A/ v1 r  MC = GetFSupportCenter(A, B)
" K( Q. q0 {4 j* y3 x' r2 LMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)
) A" ?3 M3 V7 _2 |End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错0 q: P+ U4 w: |( x) ^
Empty的值为0. N' [3 T" _: u: ?" \
返回值:6 b2 T2 E0 f5 V8 y0 |
常数 值 描述 $ k( c! _: R7 A1 j2 O5 \
vbEmpty 0 Empty(未初始化) , L% b# F/ P( h8 s, S1 j8 S; Z
vbNull 1 Null(无有效数据) 9 ?8 {! Q0 g5 N3 l& f* J+ o
vbInteger 2 整数
. T# {: h  J6 E/ Y' S3 HvbLong 3 长整数 6 t  E. d& `5 @* q( v1 x
vbSingle 4 单精度浮点数
* W7 k- s. |; D% F) HvbDouble 5 双精度浮点数   s- z% H# ]9 M) r" \) p
vbCurrency 6 货币值 * C! w7 N) y, e7 L  u: k
vbDate 7 日期
+ |/ {6 w! {0 y: FvbString 8 字符串 7 M  K, Z7 [) c; _+ S
vbObject 9 对象 2 A6 p$ t8 B+ i% O3 h0 ~
vbError 10 错误值 " \4 K  X# Z2 S& R6 {' Y
vbBoolean 11 Boolean 值 ' w' u# p8 v: p) k2 s# y
vbVariant 12 Variant(只与变体中的数组一起使用) 0 }& F+ l3 a6 G/ R$ D
vbDataObject 13 数据访问对象 ) c* n2 f2 P9 d0 W; g* u
vbDecimal 14 十进制值 9 }: N2 L0 u; I8 [. q- f
vbByte 17 位值
0 ~. y2 d0 \* gvbUserDefinedType 36 包含用户定义类型的变量
1 r. ]1 D! h2 A5 z9 s" `: GvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 Q" j! `& J: g! s5 V
VarType返回一个 Integer 所以出错

* J% l3 T9 W( m1 }应该是返回一个双精度数组。
! o0 W% [% s' ^) P" P. {5 J7 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 )

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