QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 2747|回复: 2
收起左侧

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。3 r6 s! ]+ i  b8 l
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
5 b6 k% d" h% ]3 ~$ u代码如下:) [* A4 ]9 K: t4 r1 b% \
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant; d' \: y4 {# X
Dim Testlayer As AcadLayer
; V9 z1 C/ X  h3 d" S4 n6 [Dim ObjCircle1 As AcadCircle                                '辅助圆( L$ G+ ]& f& @# H. u9 `  ?3 z
Dim ObjCircle2 As AcadCircle
. A& P# o5 j. y- W) n) j1 ODim SWingLength As Double1 g+ }4 z. P2 D4 P
Dim SWingPitch As Double0 @5 q% U) \3 \6 [
Dim PT(0 To 2) As Double4 S% ?3 c/ `% C& t/ r: g
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层, E+ [2 k, E2 E' O
Testlayer.color = acRed
0 G9 \" E1 O  a5 m2 Q5 z4 AThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
$ n/ E; r( D" w* DTestlayer.LayerOn = True
/ e6 H0 R" \, M, ]0 y3 [" c5 sSWingLength = 2607
! z0 l( x3 V5 @6 x0 e0 YSWingPitch = 3250
% H( g% q' H$ j* y$ }/ Q
) ~: y: m, \( r2 S2 a% {Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
% s4 U8 g2 r8 g# v" NSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)* L2 ?% _+ ]1 D4 \. h
- F; {6 k4 U8 q- ^3 {, N
Dim IntPoints As Variant
1 D' U5 y. f" y2 @4 I  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
% r3 S2 R8 X: T1 t. x( B$ L& ^; A% o) ], U2 p9 @
If VarType(IntPoints) = vbEmpty Then
; l5 \! b1 n$ _1 N) b& A4 GMsgBox "没有交点!"! g7 c5 T' j5 |; l
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then0 x* z( L& J$ _- p% e+ |
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
0 z' {3 x- L; h: C2 M6 \. ]        On Error Resume Next: t0 D7 M/ \2 X: J) [6 T9 q
        If IntPoints(i) < BSupportCenter(1) Then
& d. }) I& N& K6 L. y8 t           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
! h8 O" B1 B" }! ?5 v9 h           GetFSupportCenter = PT                                              '函数返回值9 D8 d# Z  Y' t+ E4 ~9 m; P7 r% B1 i: K
        End If" Z) ~/ `6 a  J; Q- w1 l+ P! f/ Q
      Next* D  d/ D' Y1 o, P. c
Else
+ D% D& F6 H+ N3 CFor i = LBound(IntPoints) To UBound(IntPoints) Step 34 J! r2 ?+ r; c; F6 ~; V
        On Error Resume Next% Q( P8 k* b, @3 T/ k8 D8 y
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then! p1 r7 k/ y; U
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)6 y7 k" C2 `. g7 |& f  F+ N
      GetFSupportCenter = PT                                              '函数返回值" q7 C& O$ e2 Q
  End If
. N4 j3 s9 M8 i6 q8 s! PNext
/ }% }1 o6 [+ M8 M" t. r4 mEnd If
1 Q# H8 h' b! J) m- m. _'ObjCircle1.Delete* `5 K' y" E6 z, O/ m0 p
'ObjCircle2.Delete7 z6 k3 ]9 D/ N$ ^* F6 }
End Function% K" b# t9 k, |& ]$ j8 C
6 Z6 t( B! ?4 r: t
Sub trial()
/ d5 j- M8 B* C! FDim A As Variant
0 V( Q+ N- O1 ^  _: W- c# sDim B As Variant' @6 B% C7 Q* q6 Y& z
Dim C As Variant
& a  X& Y8 ^& L1 F( t. |& vA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
# R: f; O5 B/ f. EB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
) y3 M3 }( q* H) mC = GetFSupportCenter(A, B)$ d& _. M% Y/ p& @( l6 M
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)) y* Q5 |1 m$ }8 C- b
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错; L/ x0 W  i9 W# _, w9 W2 N
Empty的值为0
. j% h. d. o: |1 }' j7 }返回值:
: I4 X+ O% A) @8 n) ^: Q. C2 F常数 值 描述 $ |4 U$ e( X( C, A6 M  q3 @7 v
vbEmpty 0 Empty(未初始化)
& ^. W7 U5 V- G$ d. x# v( [# FvbNull 1 Null(无有效数据) % ]* L6 e7 t/ h/ G% T4 {! Z0 X! }
vbInteger 2 整数
$ \) ?5 n! C5 E* hvbLong 3 长整数
  k. ^; l! l! `- \: R8 ^vbSingle 4 单精度浮点数
4 B& ?( A3 @; |7 |vbDouble 5 双精度浮点数
; H+ a, z$ v2 ?8 {: TvbCurrency 6 货币值 ( s# |8 y7 X3 ^. a" J6 i
vbDate 7 日期 ( r$ s$ f9 t5 N8 N0 Z6 M) D
vbString 8 字符串
- C# J, p4 f8 m) r# F/ m3 ~; NvbObject 9 对象
* A% g$ `4 t" g) ~vbError 10 错误值 ! o) f" b; m$ f0 v7 I, I
vbBoolean 11 Boolean 值 * O3 T1 e4 W  F. p. T
vbVariant 12 Variant(只与变体中的数组一起使用)
, p1 h6 Y' i( W! Z8 P4 m7 KvbDataObject 13 数据访问对象
+ k# Y1 j" ?6 E( t! xvbDecimal 14 十进制值
0 T  X7 n9 H  {$ T  p3 evbByte 17 位值
# _+ O7 |7 A! U% x) RvbUserDefinedType 36 包含用户定义类型的变量
* J' k3 r! H: ~% o& d8 X) I2 nvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
7 v- Y4 X4 H/ g# Y7 OVarType返回一个 Integer 所以出错

- u8 A  p: a  A9 r应该是返回一个双精度数组。! W1 H) e# n; z6 e) B

$ W% D: l( S8 W, r) ~% k出错的原因是这里不应该用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 )

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