QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
2 b$ ]; ~& i' h; I6 @4 s6 f问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
; s" G. i1 {5 s' F2 m* q2 l4 r代码如下:
5 E& p6 l, Z5 @6 P8 Z4 K% t7 c2 VPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
0 s$ B+ w  v, GDim Testlayer As AcadLayer/ D1 [; K  A+ o/ ?
Dim ObjCircle1 As AcadCircle                                '辅助圆; F1 Q4 ~1 c$ ~, H* q# q
Dim ObjCircle2 As AcadCircle; l0 E: c. N4 z5 f9 [
Dim SWingLength As Double
1 F. i5 r& P/ }5 l( {9 yDim SWingPitch As Double; ]# _/ L( ^3 Y
Dim PT(0 To 2) As Double
4 U8 s: t6 x4 H. Q$ S: ^3 S7 h. |Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
" J; J' `5 X1 STestlayer.color = acRed
( B) {7 ^( Y- I: @+ a5 gThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
" w6 ]: Y, g6 d( K5 C6 G0 oTestlayer.LayerOn = True
8 R2 A; c( J% e0 p6 QSWingLength = 2607
! g3 O; f; ^' ^9 E3 a- QSWingPitch = 3250
6 D) A% `! K, Y4 F6 s* H$ Q4 N7 C' W( z& G6 V; u" z3 }4 {. ?
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线, v. G5 p9 m" @# D( w
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
3 V2 |% X2 o- u
* T6 M* ]9 x' q; {9 j! F( i, HDim IntPoints As Variant* f: n& T/ ^0 v* k
  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
0 O3 I1 b% n) w: k' X. U2 d) s
  [. O. P- h+ gIf VarType(IntPoints) = vbEmpty Then! Q* X- {/ d$ a) Z
MsgBox "没有交点!"$ h( \9 p% l, c) j
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
; _" i7 D: j: k, g' K      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
" F  A$ N3 [7 ?4 D4 E' H        On Error Resume Next' y2 x- H; O7 {  _4 p
        If IntPoints(i) < BSupportCenter(1) Then
; X& f. z& S3 Z1 l0 B3 ~           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)& U4 V/ P5 m* n9 t$ \9 w) @
           GetFSupportCenter = PT                                              '函数返回值& q' T6 z. i- d+ @7 L
        End If- {" V5 @" {, |$ r% |
      Next# K( d9 p* \5 O! l; J6 C
Else$ G8 }. j! [8 H6 s  C' V
For i = LBound(IntPoints) To UBound(IntPoints) Step 3
7 j3 D! c1 |9 e3 V# Y8 K        On Error Resume Next
/ }' C  O  O$ F. a  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then( }- e: }) [1 Y" ^2 b, X
      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)- [" a7 f# r# k9 m8 N
      GetFSupportCenter = PT                                              '函数返回值
8 m; {4 _$ i- x) F! d7 N  End If
* N! f4 F, g1 `/ A% }# jNext
. b/ v( _2 d) P. w8 t) YEnd If
3 w& d+ l  x6 c7 Y* p) B'ObjCircle1.Delete( g1 s2 l$ ?9 Q+ u
'ObjCircle2.Delete
: |" n( a& i2 k+ GEnd Function
9 g: z5 L  A1 r4 j8 R& ~. h) d/ |( n0 h$ L/ @8 u
Sub trial()
- h, L$ q9 z) A/ ^0 V1 F: ^7 `0 nDim A As Variant2 p7 g9 `& E$ i
Dim B As Variant( k2 l+ K1 @' U: h% b4 |
Dim C As Variant
  P2 U' d+ p9 Y: w  U4 pA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
2 C: n% m0 a- H+ C" f! d4 ?B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )% T3 A/ x. `  Q; `5 [
C = GetFSupportCenter(A, B)
- `9 @: f/ H* L) l, J* B8 q# DMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)# P0 Y7 F$ F  v# i7 _! v8 W* {/ }
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错+ F0 Z  i/ ?: ^+ z1 n
Empty的值为0. ]. |+ ^2 U. s+ _
返回值:8 Q8 Y) _  N0 p: q& D) z/ F
常数 值 描述 . P& E+ K0 K+ f( P7 Z" e
vbEmpty 0 Empty(未初始化) - L: `0 L( l8 B3 v/ I0 I
vbNull 1 Null(无有效数据)
2 h  c8 f+ h: p6 ^# [, avbInteger 2 整数 $ {0 b& D* H# O0 G
vbLong 3 长整数 1 A1 o6 F7 L, x1 O- m  `
vbSingle 4 单精度浮点数 ' N6 |8 o" O* W5 Z; |! k8 e& ~
vbDouble 5 双精度浮点数
; ]. P0 S4 c4 t3 c1 d' SvbCurrency 6 货币值 ' q& g; Q- D$ X9 }
vbDate 7 日期
# W, Y* e3 q7 _' O) AvbString 8 字符串 , N7 m( x- e4 [+ [3 N) b) K8 b
vbObject 9 对象
) F: E2 L6 [2 E# Q; [( }+ y* a* Q) hvbError 10 错误值
  g6 e+ ~  P: i1 B. }) c3 KvbBoolean 11 Boolean 值 : R# }5 _" c1 {; x& @
vbVariant 12 Variant(只与变体中的数组一起使用)
( n8 p9 ^7 z* w+ UvbDataObject 13 数据访问对象 1 d5 U8 e1 b1 Q" N8 W
vbDecimal 14 十进制值 , B( c5 Y$ p5 ?
vbByte 17 位值
* l" {0 T, z( H7 e, d5 avbUserDefinedType 36 包含用户定义类型的变量
) n' j  v" f! r) QvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif( x* C5 o' x8 k' Q% ^. \! s3 P
VarType返回一个 Integer 所以出错

  N  q. k5 `. g# w/ ~应该是返回一个双精度数组。
, x( M% l8 x; L2 }7 {  b8 E4 C% E  b& L1 v& o2 r9 w
出错的原因是这里不应该用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 )

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