QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
- t/ s" W1 S! R0 U问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
4 B8 ]* I7 L# s8 a% u0 g  M: L代码如下:. b2 s9 x8 [1 S$ a
Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant; X; P" t# K+ R
Dim Testlayer As AcadLayer4 M  d: y) W( K! \# \- \& [
Dim ObjCircle1 As AcadCircle                                '辅助圆
3 G9 X" Z8 d- _) {$ S) Z4 e1 hDim ObjCircle2 As AcadCircle# x* T8 e! W( j+ ?( R: k
Dim SWingLength As Double4 @% Y: P+ z- Y4 I5 U
Dim SWingPitch As Double& h5 ^  J7 P9 r" S5 h7 Z
Dim PT(0 To 2) As Double5 E8 D3 ~( F# {+ l9 A+ w) N
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层3 q" H( V% K/ ^9 l& t3 F# D/ |
Testlayer.color = acRed4 T6 P+ d9 A* g9 X+ J
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
/ Z5 B( T, ?% [  FTestlayer.LayerOn = True3 E$ p3 _- R4 B" {- Y0 ^. H
SWingLength = 26077 I" ?8 F& Q4 M' r5 V6 o
SWingPitch = 3250
+ A5 k! W% [0 |
; [2 a# Q5 t  Y; a4 i6 aSet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
+ [8 w9 F3 h  p% ASet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
% {2 c/ h/ W) i( u& i$ t: Q5 d( Z8 Z: ~5 g% D) O2 f: E& R
Dim IntPoints As Variant
% z2 _- N' }( a% w. n  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断3 V) s- q( Z) F% X

. R( p8 I) I- z" ?If VarType(IntPoints) = vbEmpty Then
4 A+ {# U2 F$ v* y; v* tMsgBox "没有交点!"
( b, ^6 }. t7 t2 \ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then# u+ `1 j- B" p0 ?7 R" V
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
4 o" t- @7 X9 r; \) A5 g        On Error Resume Next* f' W4 }8 T7 i1 B# o& X4 E0 m
        If IntPoints(i) < BSupportCenter(1) Then. s3 k* P% s. W& K* k& {+ x
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
& B9 w8 I6 O( p# A+ V1 n1 V           GetFSupportCenter = PT                                              '函数返回值: A8 S) j0 ~+ f( G
        End If" X! l+ p0 o- M3 Q9 ^
      Next( Y+ T8 _/ T$ J8 y5 M
Else
* n# \" T( p; HFor i = LBound(IntPoints) To UBound(IntPoints) Step 3
% R7 U8 ~+ t' {8 p7 \# {4 S        On Error Resume Next+ H' J  b0 i. P1 }, o1 f8 J1 \
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
& H# }" S6 E# U% e      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)
+ a+ ?4 v6 j# E# D7 m      GetFSupportCenter = PT                                              '函数返回值
; q$ O* c! i& ]: M$ h  End If
2 Z9 Z( g, P1 M5 Z! K. z$ s( d- s" RNext
& P+ X! P$ ]/ wEnd If
8 z6 }. a% l) X  m4 Q( b8 G, v'ObjCircle1.Delete
/ M. v, r( ~8 z9 j& H( M  y'ObjCircle2.Delete
9 h% k  g9 H4 q- WEnd Function8 [, V5 Z! n% u
# X. |. h( S" |3 b
Sub trial(). S; D$ t+ |+ Z" k( }
Dim A As Variant
0 H% y; T+ N7 k3 ^! T& q5 Y  F  x( W2 VDim B As Variant
7 T$ ^1 Y) {4 D* u3 a, mDim C As Variant1 m2 v/ h* Y% J& R
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
% T6 @% @- I+ m/ O" q7 z+ bB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
" Q  i( f) i# r* p$ b% NC = GetFSupportCenter(A, B)
$ e9 O5 ~  M/ \8 _. |MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)5 @/ Q8 ^! j' R$ p3 @
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
' a. q0 A, Y+ s6 GEmpty的值为0
8 T  l# c, P' R8 E6 V  S9 B! }/ H返回值:( r' L7 d/ v7 i  E4 U8 O
常数 值 描述
! k& o; g- z5 h. ]' XvbEmpty 0 Empty(未初始化)
& r; x- I: W  e) Q4 c- QvbNull 1 Null(无有效数据) * C2 M/ z# W1 K) c
vbInteger 2 整数 * `' |. k; C9 O6 M( J
vbLong 3 长整数 $ @0 u3 Q& s& N
vbSingle 4 单精度浮点数 3 O& h) u: Z  L
vbDouble 5 双精度浮点数
& i3 w* r0 M: xvbCurrency 6 货币值 1 e1 y/ P& p/ W
vbDate 7 日期 7 j- Z+ s* @3 t: U$ C4 K2 N
vbString 8 字符串 7 A  a( \6 m$ x% a& k4 F
vbObject 9 对象 0 }* z3 X  e$ I( k' v+ B- b
vbError 10 错误值 % n6 w' r( \& }
vbBoolean 11 Boolean 值 % ^5 e/ x' V' G8 H  I
vbVariant 12 Variant(只与变体中的数组一起使用) 9 O6 `* A, |8 r0 Y/ C# l
vbDataObject 13 数据访问对象 5 X/ W  |8 o6 _& f
vbDecimal 14 十进制值
9 D1 L4 e7 ?1 [- i. ?8 O, r* rvbByte 17 位值 ; b  S; A3 z. f1 o1 W9 Z+ L9 f' P
vbUserDefinedType 36 包含用户定义类型的变量
0 c3 Q' c- V7 [5 y: ~" [vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
4 ^/ ]9 E) p" X; X0 {2 EVarType返回一个 Integer 所以出错
- `) V# F; e: B" P; H
应该是返回一个双精度数组。9 J  `% ?3 u! I; l9 v
. j$ s4 j9 Y) T1 P0 R. Z/ V" N
出错的原因是这里不应该用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 )

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