QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
' L. w$ |- U& ^" _0 m+ J问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
- |4 {2 N0 H* d代码如下:0 g. T1 h$ d. }8 V/ z' [! e" _
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant% w2 H/ e% G7 e
Dim Testlayer As AcadLayer: o: E- ]" [( o, ?7 S
Dim ObjCircle1 As AcadCircle                                '辅助圆
+ V5 p* E& I: e9 GDim ObjCircle2 As AcadCircle
$ i: z: v8 Y; m# xDim SWingLength As Double( r2 k) z% }+ r1 C; v8 k4 k+ ^. @
Dim SWingPitch As Double
7 }) j& i- |* u( DDim PT(0 To 2) As Double7 p' L" A' a$ |! O7 O
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
/ k: @8 [; w" T" J' j* G: F, ZTestlayer.color = acRed( F7 V8 v2 B: U* J( u
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
3 O3 n) w% }" s- jTestlayer.LayerOn = True
  x3 S* ]+ m5 D6 PSWingLength = 2607
) B- t7 o& @* t2 C4 rSWingPitch = 32508 z- V8 M8 E0 E* [* E
! x* p+ o0 f* S1 ]
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线! Z: Q  `& b" b8 z  }& C4 m
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)8 ?# `. G* P4 Z% q7 a  U

5 f, O6 ], q. r& J* MDim IntPoints As Variant
/ l, _( l2 ]1 q5 j: H  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
& c* t$ b" c) L/ p7 s
! Y  X* N: N! ~8 yIf VarType(IntPoints) = vbEmpty Then) c4 ]( p9 ^) e  j
MsgBox "没有交点!"/ v7 q+ m# ~  R, e3 ~* R
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then5 g  F3 R+ v* J
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
& [0 q+ T. ~$ R; |" f# t        On Error Resume Next
' g% F; l$ }+ G8 h8 r        If IntPoints(i) < BSupportCenter(1) Then
! ~- q7 I7 X0 D7 f0 C2 H           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
$ h' [& G6 ?3 r# w8 _           GetFSupportCenter = PT                                              '函数返回值' G; s& |9 G8 t
        End If3 u  z; M4 ]+ U/ W/ `
      Next/ d& F& N5 R4 t) t- q
Else# H% F& Q1 J, @% k9 `" V
For i = LBound(IntPoints) To UBound(IntPoints) Step 3
5 X- m+ a+ U9 U7 `# l  Q0 p        On Error Resume Next5 v7 u  t) @& D5 I  j
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
  U9 \5 F, z, j% E+ w  V      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)
* `) q$ E) H" C      GetFSupportCenter = PT                                              '函数返回值
( q' _0 S4 ?1 O7 x/ P5 Q  End If
$ E/ p5 r3 p. e/ s$ |Next' Y7 O5 T8 V. I$ `
End If. N' b  ]: n, G7 W/ u
'ObjCircle1.Delete' d0 }7 X- j1 I6 F! h: D9 {2 n
'ObjCircle2.Delete* p# q$ T, O4 O+ d
End Function. d( c8 Q7 R) W* U$ t- m6 [5 C

; \" K/ s0 ]0 w" E6 Y$ Z; t$ }Sub trial()
) N- o" p/ f; R( ?+ z! aDim A As Variant
0 G3 X2 N% k5 t% L- ~: H/ o% G7 wDim B As Variant
- C, i' r4 n2 n+ [0 q+ ]: v5 ?" N% {Dim C As Variant3 }$ W& p0 j# g
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
/ I* \$ U! c% h! u8 kB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
; n. [$ P+ F0 q: CC = GetFSupportCenter(A, B)( i3 l: j. M2 ~# o- B* K
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)
% B9 Q$ L) \" zEnd Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错( C& L, a! K% C0 y
Empty的值为0
' b+ A  U: S' ?8 C" y* T/ |8 U返回值:) I- Y/ C# H( [" t/ N8 x
常数 值 描述 . m" h3 H/ l6 f1 r6 b) n
vbEmpty 0 Empty(未初始化) / I  Q; k) {8 p) A6 P0 U
vbNull 1 Null(无有效数据)   q! r8 A$ q, k% E, f
vbInteger 2 整数
6 x& o, t& \+ H- i9 C& M" k" G0 z0 TvbLong 3 长整数
, _  K" K) H2 n; i! Q* F* K- LvbSingle 4 单精度浮点数
2 E9 d. H! ~" k7 p6 _7 x2 d! m7 QvbDouble 5 双精度浮点数
- d9 j8 e6 l! g! i" KvbCurrency 6 货币值
9 O# w" N+ D: `2 j! yvbDate 7 日期 , }+ v2 Q8 Z- v& W1 Q/ k, j# n
vbString 8 字符串 0 `, z2 W+ P! U3 R+ P9 \2 N
vbObject 9 对象
' B" o& s# N5 s* |# r% i7 n" `vbError 10 错误值
; s  K  I6 Z+ A2 d, k' k$ kvbBoolean 11 Boolean 值
( S2 ^: E  n- {; g- UvbVariant 12 Variant(只与变体中的数组一起使用) ' G+ \6 M) ^4 Y
vbDataObject 13 数据访问对象
& j/ O( [* f# X9 D3 JvbDecimal 14 十进制值 4 |$ p: M5 B* D2 ~
vbByte 17 位值
( Y# y* E* }/ `6 u. E( RvbUserDefinedType 36 包含用户定义类型的变量
+ t& g! ~7 P& ^* v3 E. d  e6 hvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif- s- p% [9 j$ m! a
VarType返回一个 Integer 所以出错
) l1 I" j2 e2 g9 w5 W9 V
应该是返回一个双精度数组。
! [5 J6 |) X- X  D* r; F8 c4 }+ B; B. L+ t& x9 A, B- O8 |3 s4 t
出错的原因是这里不应该用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 )

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