QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
8 E, g9 f: A) Y5 F& ~5 F/ ^( `问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
6 R6 w, g2 K2 `! m代码如下:
- I6 z  u! W9 o7 W" l- h! m: U' jPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
6 L+ g: f5 i" [+ l+ T, m8 nDim Testlayer As AcadLayer
1 y% @4 O$ ?  A1 x7 aDim ObjCircle1 As AcadCircle                                '辅助圆3 s6 n6 \6 v" x
Dim ObjCircle2 As AcadCircle
+ L' p3 d$ p9 S: \& wDim SWingLength As Double
3 Z/ }( ?" f% t4 cDim SWingPitch As Double
2 x" d! N" X3 b4 j  V/ X" DDim PT(0 To 2) As Double% {' y3 H& C% i7 N
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
1 \' J4 [: Q, ~0 s# [( jTestlayer.color = acRed+ i" c/ T, l0 T
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
# Q5 y5 E" k" i1 lTestlayer.LayerOn = True
8 k8 H$ h9 q/ |/ W  MSWingLength = 2607
6 C- x* V7 a  TSWingPitch = 3250
) S5 B, T, y+ v. w3 a2 P; b! {: M- Q' Q% }) A4 U3 u, P+ I6 K
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
4 |6 U! i2 k2 c" t$ vSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)* Q7 u* M0 ]0 G; G3 o  e9 ~

9 X: Y* U9 ^$ {) ADim IntPoints As Variant
: l( n4 o# X3 l/ `7 p, @  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断/ s+ v+ e% R$ s7 X6 }
/ m- j! Q6 _* f$ x! M6 k. i& J9 c- W
If VarType(IntPoints) = vbEmpty Then
3 z6 C: u5 b/ @; C1 q4 s( mMsgBox "没有交点!"* z( }: N+ u" G- P- n5 d7 V  O! O
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then! v- j% s  N2 r6 I
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
$ ~; d" N; o3 N% X        On Error Resume Next6 X2 n2 x6 \5 L1 a0 T6 A
        If IntPoints(i) < BSupportCenter(1) Then
; s6 n1 K5 t. y: Q1 K$ _$ v           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)! b: p5 J8 X: C& A
           GetFSupportCenter = PT                                              '函数返回值
; y- o# }6 E5 h9 q        End If: L( e, K; ~9 P8 ~7 q, F) D
      Next
/ A8 V9 Y. q+ {' m' S6 CElse
' t9 d1 R3 U, l2 z. iFor i = LBound(IntPoints) To UBound(IntPoints) Step 31 C1 R5 k# C' n( D
        On Error Resume Next$ Y$ b# |# M. P: @9 w
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
' G1 Y6 Y- ~7 }& C9 @' Z1 g7 c9 S      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)
2 a! H! U3 ?8 F( R  ^) V) ?* s& [      GetFSupportCenter = PT                                              '函数返回值, |7 z  T/ M) r
  End If& O" e  j( y0 \) h, J
Next
  N1 @( d( Y0 ?+ y+ N* rEnd If
: C' `8 j9 {* K'ObjCircle1.Delete
" L' b9 K5 ]4 C6 L8 f'ObjCircle2.Delete
( [6 L% x; T" G- a. d0 PEnd Function
" ~' I. ~; c- h! m- n0 y6 O0 `4 t  M$ u0 Y0 k
Sub trial()
  \' z/ U' Q& q' t8 J9 M; ^Dim A As Variant
; d: O5 V% t8 T' B  C# KDim B As Variant
4 P, O! \: W( lDim C As Variant
. j' Z8 @" V. }7 F# z9 h3 T; l! aA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )
" i8 O! U# w# l: J; N& }9 CB = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
% ?" o5 T/ r1 xC = GetFSupportCenter(A, B); _/ h3 B/ E  d: ^/ I4 ?
MsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)+ K" ?: g9 S& ~# y& G( x% d* F  T
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
; B; o- v# G; z# D2 b+ i" l0 VEmpty的值为0
1 f6 l, J' D; A- @* g* o, g2 }) k返回值:6 U) y3 y+ |4 b, o4 }" ]' l1 P7 o
常数 值 描述
( B" F! Y+ k$ a6 Z- s, uvbEmpty 0 Empty(未初始化) 2 g9 e  r, X$ W8 h5 F+ T: B) W1 R
vbNull 1 Null(无有效数据)
- [2 @$ j. G( z. K6 R2 X9 }: @vbInteger 2 整数 * {9 V6 c: ~* v0 a. }: h
vbLong 3 长整数 ( m$ m7 G2 i1 L; s: f
vbSingle 4 单精度浮点数
! H- Z& d6 |1 \0 _vbDouble 5 双精度浮点数
5 W# {6 H- M7 y6 ^vbCurrency 6 货币值   o& u# p  v. T6 G; a
vbDate 7 日期 1 [' P+ L8 {9 S
vbString 8 字符串
" L+ @$ X0 B( G3 IvbObject 9 对象 8 e/ f/ F) @9 ^+ T
vbError 10 错误值
9 v+ |3 p" |: N3 S* w: fvbBoolean 11 Boolean 值 0 C2 n8 o( ]7 {
vbVariant 12 Variant(只与变体中的数组一起使用)
# a% q( `$ O8 G! ~: c' h4 rvbDataObject 13 数据访问对象 . E) X$ }3 _9 L
vbDecimal 14 十进制值 " |1 n: ^: p* g
vbByte 17 位值 5 g! U5 ~, ^) ~3 `" b: m9 L- x: r
vbUserDefinedType 36 包含用户定义类型的变量 7 M! J4 f+ \; N) ~
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
; v9 u" p/ q$ v0 Z6 L+ ?5 cVarType返回一个 Integer 所以出错

) i4 s5 L% L$ h1 U4 F/ U应该是返回一个双精度数组。
1 N% }# V* H1 j9 c/ I7 N( ~6 R+ C) L0 t- o2 Z! u
出错的原因是这里不应该用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 )

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