QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 2744|回复: 2
收起左侧

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
( F; N$ W8 `9 t: J" R5 T问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?: w; f& F* k* U4 t% b! ~
代码如下:
& p6 C4 ~$ z1 a; F/ o, hPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant" M! F; X' T. S
Dim Testlayer As AcadLayer$ K6 a( g+ J( o) j/ o4 Z
Dim ObjCircle1 As AcadCircle                                '辅助圆  v/ [5 x1 b% l
Dim ObjCircle2 As AcadCircle# p* H0 V" r; E# w  `! n( s( t% U
Dim SWingLength As Double& i! V, I1 L; A1 c" ]" P& E
Dim SWingPitch As Double
6 e. I0 C& W& G. _0 H, pDim PT(0 To 2) As Double7 G4 t. o1 |3 E2 j* z6 z
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
! \( d/ Z5 u5 `  dTestlayer.color = acRed& c4 `" U( C* x1 ^. r
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
: l6 O' w% q5 [$ @; hTestlayer.LayerOn = True& f* E- V2 }! V
SWingLength = 2607
) j" O& e9 Y/ pSWingPitch = 3250
5 i/ P+ j2 v, x( b1 O& w# Y! H5 h8 W" G
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
* b7 r) E- x9 ~1 ^- l# y2 V8 gSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)+ f* v% n1 B: M1 O7 Z- @2 j
1 N4 O' `* e1 g6 ]6 F. _  O) B
Dim IntPoints As Variant* k9 @% k& \0 a. w- ~
  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
9 i0 b+ q0 u7 q  s4 g8 H5 K- B; K: m/ E3 e
If VarType(IntPoints) = vbEmpty Then  J' [; A& D# o/ y
MsgBox "没有交点!"
! k: r' A! n" `% J$ {$ X% iElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
0 C, |9 N% f, T      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3( f/ p! r$ q' f4 k
        On Error Resume Next
+ Q& m; S+ {! L. S( O2 h# K4 H0 B        If IntPoints(i) < BSupportCenter(1) Then
' _- u5 n2 J2 q' E3 j           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)  {! [5 y7 B( ^' \' j1 N9 r
           GetFSupportCenter = PT                                              '函数返回值7 D- _" U1 t; m/ t" @1 o& n
        End If6 a1 @4 P1 I7 M
      Next, N, {0 D! \$ b0 F" x1 [# k8 e
Else
+ u* ?0 @) T; `; y" \" n) @1 vFor i = LBound(IntPoints) To UBound(IntPoints) Step 3
$ d) [; H; q! p# i/ o4 F        On Error Resume Next
* i% j3 t. ~# J, c# K  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
) n  D# F9 G; D6 e      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)
6 X# n6 l' o$ G9 T, t! }0 D- q      GetFSupportCenter = PT                                              '函数返回值
' V! {; y, ^1 {/ K7 |0 G  End If
4 V9 Y7 e6 E, NNext
& ]  W7 P4 H$ w7 x( DEnd If) h6 ?  d! {; O' e+ T3 \
'ObjCircle1.Delete, ?+ e8 g2 ~  t* e; G/ Q( z  C1 B+ b
'ObjCircle2.Delete
  h; P' _, I5 n. T; `! _End Function9 n1 F- Q* J' l$ Y

) I* |  @$ p' ~! A4 U- ?% \9 _% aSub trial()
& E7 k* i$ ?1 W! Y; {4 Y7 DDim A As Variant
; Y5 a1 _  J2 D7 s4 \9 b7 j3 fDim B As Variant
2 \5 H: V4 I5 F' @, bDim C As Variant8 [3 M  r& E  C* x( J  [
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
. T  @/ \$ F8 n8 o1 P7 G8 YB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
3 `; _1 P8 e: ~. bC = GetFSupportCenter(A, B)
  [2 e7 K8 S# {1 `( yMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)0 U2 P$ M  Q! B7 _3 _! K% V, U
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错: V# o% [# A. d- w+ d' L( A
Empty的值为0
9 V  M# m& v) G返回值:
' Z5 Q1 Y' t' Y- L  N常数 值 描述 - H0 l, t% E7 u& I3 H
vbEmpty 0 Empty(未初始化) 5 L# O) _5 C3 ]. @/ G8 V
vbNull 1 Null(无有效数据)
* f7 Y* i8 \- k% JvbInteger 2 整数
4 q" B0 k/ Z2 m/ I3 }! _( n" \vbLong 3 长整数 ! s6 @, R# B" k( X$ Y7 T
vbSingle 4 单精度浮点数 * K, g/ a, R8 N2 X; K: z& u$ L) y
vbDouble 5 双精度浮点数
! h* g9 D( t* z4 J4 s6 {vbCurrency 6 货币值
- G' c# k4 e% r+ f3 ^! e9 w+ FvbDate 7 日期
' \6 d! v0 o, q! t0 @vbString 8 字符串 $ c0 b2 e1 e7 J1 o3 S
vbObject 9 对象
2 g9 d* }+ ]/ g1 u+ b- TvbError 10 错误值 9 ]7 M- H6 S# y4 O/ Y/ y: Y0 j2 H  L
vbBoolean 11 Boolean 值
8 D- e( N% o7 }1 ~vbVariant 12 Variant(只与变体中的数组一起使用)
) a9 N7 [; J1 r# b: ?# Z9 avbDataObject 13 数据访问对象 , `* `# h6 _- d  n& B1 \
vbDecimal 14 十进制值 ; y& ~5 f$ O) e# r! N: G  m+ S
vbByte 17 位值 + x+ D' y$ t: y8 P
vbUserDefinedType 36 包含用户定义类型的变量 ' V  ?2 s' u1 I: N7 H5 T5 i
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
. w$ j* o9 L7 E& h) OVarType返回一个 Integer 所以出错
: @. w, V2 Q3 r
应该是返回一个双精度数组。" D7 I0 ~3 T! M5 b+ k3 c
! `1 s+ V5 ^! K8 _7 k+ V
出错的原因是这里不应该用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 )

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