QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。
6 Z$ x. |6 T' c# G* O. X; T% \" V( v问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
1 q2 G! Q8 I/ m- J" Y代码如下:
9 L2 ~, B  v4 m) u8 C% V8 BPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant
" ?) N# U% L! _Dim Testlayer As AcadLayer( {- |0 J9 L6 }( I7 U
Dim ObjCircle1 As AcadCircle                                '辅助圆
: u& c* m6 v* u) A  J  [Dim ObjCircle2 As AcadCircle+ `' x' E* N8 }6 r7 P, I( z' v1 `
Dim SWingLength As Double
! j/ Q4 W6 N- ^- v* c7 ^1 M1 eDim SWingPitch As Double" ~( k) F3 X$ A) P3 s, x
Dim PT(0 To 2) As Double* X+ Z9 |8 K. O6 R6 J: h% p. W
Set Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
8 B" Z* B2 a' y9 k, jTestlayer.color = acRed
0 @' x! l7 y; m: m! A( FThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层* [; q3 U/ X2 T( m/ Q
Testlayer.LayerOn = True
, |, X8 v$ [! w+ e6 dSWingLength = 2607
! r/ k* e9 f# q# W" ]SWingPitch = 3250
) s( [5 r) l6 \  K) D  L$ g" \; v, l. P7 [
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
$ f5 R1 L5 I7 m( x  ]Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
7 J' v% B4 W0 Z- s9 I1 M  {
# z1 w1 d  w2 p# D& b0 G6 v% n# CDim IntPoints As Variant
1 c5 N0 @. m% b6 N% _/ v  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断; z; {' U. V* n" [8 h7 G" H
. @/ O5 s3 J  S% r6 m2 p. T4 ~5 H4 I
If VarType(IntPoints) = vbEmpty Then
3 z! G3 O  f2 E& I) w* Z3 ^# b6 WMsgBox "没有交点!"$ [1 [- E6 y" N; J3 F3 z
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then" b# _" o  ]# G2 j$ y! ?: N
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
6 h6 b. A+ k9 W& B        On Error Resume Next$ F  _: A. }. U* G# b/ t
        If IntPoints(i) < BSupportCenter(1) Then' v" t! k3 V+ o9 K* r+ _% c
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)4 J' m0 U$ X0 _$ n$ O1 S
           GetFSupportCenter = PT                                              '函数返回值; P, P, M# Z9 r8 V, m
        End If
3 f/ t3 {. l3 T: H* {      Next
0 Y/ z8 I( J, n  iElse
! M& D; c4 r. m+ o& s8 VFor i = LBound(IntPoints) To UBound(IntPoints) Step 34 S' B8 G+ e$ z
        On Error Resume Next
+ S" T: t1 G/ J/ K  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
7 F1 T  |) h6 C1 }! q      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2), R1 O" s6 a: {9 J* e$ e1 y
      GetFSupportCenter = PT                                              '函数返回值0 m8 j8 S; T; I  Q* y& C& ~- Y
  End If7 W( q/ k0 @* s  w/ T" w
Next
( ^2 M# z; P5 v# cEnd If
. I5 A" q, o& a3 z9 E$ t! Y'ObjCircle1.Delete; ]8 `6 ?: Q. Y9 D% \
'ObjCircle2.Delete9 X3 m2 D, O4 N
End Function
8 |- i4 n! U) N' f5 b2 l7 A( ]! k
Sub trial()
% Y! X+ _' W' f! wDim A As Variant( K! ]2 i  b7 O+ F$ A* S$ l. s3 C
Dim B As Variant
) I! z( Y# W6 vDim C As Variant0 |. }/ v% ]9 D# `
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )3 T2 i. T. }! t' C) @( T6 @1 V" r
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
3 l- S6 ]. K, t* OC = GetFSupportCenter(A, B)
/ o7 J* M" M% m. {0 pMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)- h7 {* G7 z8 a
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
9 l! t. b7 b' i' H4 k& p. G1 PEmpty的值为0; r/ b1 m! q! j6 W9 f  {6 Z' {
返回值:
( i0 q7 V4 e3 K: ?3 G' D' ~: V3 N常数 值 描述
2 h$ h2 x3 C' ?4 Z. O' n0 ]vbEmpty 0 Empty(未初始化) 0 |6 {. j& a5 a0 F) t( N
vbNull 1 Null(无有效数据)
1 V3 J$ z. x$ t% D( IvbInteger 2 整数
0 P& f; V1 C- |  |0 k. P4 rvbLong 3 长整数
/ x" m# ~% p6 [" @6 uvbSingle 4 单精度浮点数
, o( L) Q" t' O: S/ T; avbDouble 5 双精度浮点数
1 M+ J, v4 @$ n+ u/ [* cvbCurrency 6 货币值
9 G& V; x' f, r# o/ i8 o* P" ovbDate 7 日期 6 D3 w, g/ B4 P' i
vbString 8 字符串
2 Q, S! K8 A' J, ]) Z+ f4 g3 y- [vbObject 9 对象
* I6 j/ P" |. [( lvbError 10 错误值 : `& y( V9 N, J3 W4 @9 t, d
vbBoolean 11 Boolean 值
2 p5 q7 y5 p* B. Y* LvbVariant 12 Variant(只与变体中的数组一起使用)
6 D* v4 k: q: j, y7 h% w! {# H7 `/ q+ pvbDataObject 13 数据访问对象
: o6 l' S+ g2 N) T7 k% s1 gvbDecimal 14 十进制值
& B( w; S: `1 T& ~$ _! ZvbByte 17 位值
. U" C2 ^- \, L6 w; C' ~vbUserDefinedType 36 包含用户定义类型的变量
. {  ?# C0 a9 s. L6 VvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
' w5 I9 a6 E% A: T1 z' DVarType返回一个 Integer 所以出错

' {7 ^" B) K3 Q" e( D0 ]应该是返回一个双精度数组。" J' R5 P5 w, x6 j5 B& ?
6 V! X3 d0 D7 e: f; s& j
出错的原因是这里不应该用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 )

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