QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 2746|回复: 2
收起左侧

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。+ f" T2 f' n  P$ b+ c
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?
, q" s" `6 G$ |% a3 |- y+ j代码如下:
& k# \/ [7 d; B7 t! ]Private Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant: |2 y: \5 G: ?; g
Dim Testlayer As AcadLayer
0 a( v! z1 f) i0 r1 KDim ObjCircle1 As AcadCircle                                '辅助圆
8 o6 K: |: N5 K! [; WDim ObjCircle2 As AcadCircle  K5 k1 B  W* h0 a! Y
Dim SWingLength As Double$ M7 U$ K" w: ~1 t
Dim SWingPitch As Double
/ V$ X$ K% P, Z  N1 |Dim PT(0 To 2) As Double
. G' R3 t: d5 {( VSet Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层0 p+ t) T1 V; w- T6 H$ t
Testlayer.color = acRed
* D# f# ?: s4 m9 |ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
! h' _/ y1 l; m+ v4 I4 \" z+ H/ pTestlayer.LayerOn = True( V$ }: C8 \( n3 t3 O. O0 N
SWingLength = 2607, }  D3 _! A2 ?  s' v1 H  n& Y! H
SWingPitch = 3250+ p+ U: r, k7 {" C+ t
( M4 T( y* a# T) v2 \5 _7 Q5 @
Set ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线
# r. @& D* x1 s2 t5 u# s2 GSet ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)' I" @) S$ h* v2 z3 h
+ B& ?3 Y* Z. O: e8 o3 n
Dim IntPoints As Variant# z; n7 i5 f7 I2 F- H
  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
: S  g8 a* y: @4 T# P
( [1 {' c& ?; s  u# W) q. kIf VarType(IntPoints) = vbEmpty Then
, P  R3 X+ C1 f; _: u: cMsgBox "没有交点!"# s, r2 l. E6 B
ElseIf BSupportCenter(1) = FSwingBasePoint(1) Then" T9 l7 W# w6 e5 J( ?+ H
      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
; W- J, @! Y) |8 A4 B        On Error Resume Next8 S# z. S( t' M+ f' W
        If IntPoints(i) < BSupportCenter(1) Then% V" g3 D; [8 Z2 g/ I
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)& u! u5 b7 T6 M& l4 Y+ u: e% P. J
           GetFSupportCenter = PT                                              '函数返回值, s7 O3 x2 B6 c
        End If$ \$ {/ L1 {' v2 D' }. _( o& b
      Next
3 r0 G- M8 `" X9 O. D  @1 c+ ZElse
; {  u$ t8 f" V* Q& u3 i% r) p& rFor i = LBound(IntPoints) To UBound(IntPoints) Step 3
& j- |. [0 a1 ~! O  S! ?5 N        On Error Resume Next
: t. |  O: X' F( N/ \9 Z5 d, Z  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
) I/ P% n6 i  f, T, @2 H* G' j      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)) \3 s  n% j0 b9 Q( E" S
      GetFSupportCenter = PT                                              '函数返回值
1 f& k0 _) Z" G. {3 B  End If# m1 [9 v/ _" M$ s
Next' W. T/ ?- a7 z# y7 \+ g* r+ l6 }
End If3 l3 r7 _3 D, i1 `0 @
'ObjCircle1.Delete; }: Z4 F4 _/ L; F' I' A# k
'ObjCircle2.Delete
3 l3 R9 d7 e6 aEnd Function  \5 W, @6 w& W4 k8 g' u* V
3 o3 s  H5 ~9 K$ C1 H
Sub trial()
* ]1 U$ o0 q  @Dim A As Variant3 v$ t$ Z& \6 }) H8 Q, M: q" G
Dim B As Variant4 K. v* R8 F( m, u
Dim C As Variant5 A5 I! E% G5 G7 d3 z8 L: [
A = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )# k; r  A' E! s  V+ P
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
- g" p% X- w+ UC = GetFSupportCenter(A, B)
4 X3 I) i, F  j% G  B" j6 a2 kMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)7 c" {: r6 H% E. \- S1 u
End Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错
1 y6 g( r1 h' D- B1 aEmpty的值为0
% c- ~4 ?$ V( N# i- {: D% U返回值:
9 d1 ], j1 g- A8 O) u常数 值 描述 , \- ^0 y4 g( z6 f  n: J" C9 o
vbEmpty 0 Empty(未初始化) # S6 G9 J, N/ B; V
vbNull 1 Null(无有效数据) 5 {" R5 P, w& |$ }" l6 d2 U
vbInteger 2 整数
9 ^/ \  b) o0 jvbLong 3 长整数
" V; A1 N1 b* K2 NvbSingle 4 单精度浮点数 7 D5 y4 O4 N0 ]+ z& B: z
vbDouble 5 双精度浮点数 - k! ^  b1 c9 O+ ^5 q3 c
vbCurrency 6 货币值
. e" V/ |" n) L# FvbDate 7 日期 - J$ Q* [# F5 \. f/ p0 l. E. ~- \
vbString 8 字符串
; f0 j. U) U4 M% e, CvbObject 9 对象
. q9 m' u; t5 f% K- d" A+ MvbError 10 错误值
% s. A" ^6 s" }0 c. i, BvbBoolean 11 Boolean 值 * A! m/ T9 o6 O+ h
vbVariant 12 Variant(只与变体中的数组一起使用) 1 b- {& j8 s' a; Y$ [
vbDataObject 13 数据访问对象 & G7 c- h6 F2 I) u1 l( n
vbDecimal 14 十进制值
- ]& p. a* G! q5 I, Z7 ivbByte 17 位值 . B5 ]% s1 V7 {" s
vbUserDefinedType 36 包含用户定义类型的变量 ; f* M' O5 d, X( ~" j( H( i
vbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif* K* h( H' K1 ]
VarType返回一个 Integer 所以出错

. B$ c; x& @2 p' C) V  H应该是返回一个双精度数组。
7 ]" I- G" n& s% `8 u* j( n' q: U& L4 Y1 w& Z
出错的原因是这里不应该用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 )

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