QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
做两个圆求交点,然后判断,两圆有交点时,程序运行正常。4 u, R* l* G9 O  |! J8 I+ n1 n
问题出在没有交点时,我本想输出对话框提示,然而系统报警,说“类型不匹配”,各位看看怎么回事?5 }9 `$ K& |& A/ j, s
代码如下:
' V; y$ l8 j- s) H: t  b2 v3 U0 LPrivate Function GetFSupportCenter(BSupportCenter As Variant, FSwingBasePoint As Variant) As Variant' r0 v( N$ d9 V; [
Dim Testlayer As AcadLayer) a* Q' J% B7 l9 o0 O* p& I) _
Dim ObjCircle1 As AcadCircle                                '辅助圆
7 h7 m8 ?8 ?9 {3 d/ m* w) ?Dim ObjCircle2 As AcadCircle9 g  O" ?) d- d5 `# {  {$ @! t
Dim SWingLength As Double
! B+ Z1 U# Q' S2 k" sDim SWingPitch As Double
2 G( F! o- f# J; M- @$ YDim PT(0 To 2) As Double
5 ]6 a: ]# N  v0 jSet Testlayer = ThisDrawing.Layers.Add("非显示层" )          '辅助线位于非显示层
$ a; y8 y% a: Y4 U# xTestlayer.color = acRed5 b( z( U2 L% M, z! o5 Q' O
ThisDrawing.Application.ActiveDocument.ActiveLayer = Testlayer        '激活图层
  d9 _% P! Z' I# w4 ^' L, y+ JTestlayer.LayerOn = True7 c9 q' p" K! ?/ ]
SWingLength = 2607
5 U1 u6 _- w; X6 N# v1 wSWingPitch = 3250
3 S5 C* o( R0 j* p
3 g8 N/ E8 _- c6 D& F- _; ZSet ObjCircle1 = ThisDrawing.ModelSpace.AddCircle(FSwingBasePoint, SWingLength)   '作辅助线5 T( V5 j5 |: _) N; W2 y
Set ObjCircle2 = ThisDrawing.ModelSpace.AddCircle(BSupportCenter, SWingPitch)
. S+ G5 ]# S# X: J) u8 v9 l9 _( H" @  q( \2 ^: Y* T$ d8 J
Dim IntPoints As Variant
3 l" t% T6 c5 ~" p+ r* R. D  IntPoints = ObjCircle2.IntersectWith(ObjCircle1, acExtendNone)         '获取交点并判断
5 \6 ?0 o0 b1 E7 X6 b! x& M! \9 Q5 Y1 X! y- \# ~
If VarType(IntPoints) = vbEmpty Then
% v8 S& G$ a  s( nMsgBox "没有交点!"
3 C8 u3 p5 _" ~+ iElseIf BSupportCenter(1) = FSwingBasePoint(1) Then
5 q7 L% o: }9 A$ B& |0 d! N$ |, D( N      For i = LBound(IntPoints) + 1 To UBound(IntPoints) Step 3
2 y6 h+ A& M* l; D$ D9 _" X        On Error Resume Next3 Y2 V4 E  e& @4 \! I3 {3 Q
        If IntPoints(i) < BSupportCenter(1) Then, g5 u1 N( N# D$ X" r
           PT(0) = IntPoints(i - 1): PT(1) = IntPoints(i): PT(2) = IntPoints(i + 1)
, W" x- J( {- ^! [: Y           GetFSupportCenter = PT                                              '函数返回值% A3 w; S; j2 o% D0 e
        End If
. [9 a/ u1 H0 l$ s      Next
: F1 f9 V! V- q6 {; P; @+ lElse
, M5 n  l: o  @+ ]5 [4 L. z: S' GFor i = LBound(IntPoints) To UBound(IntPoints) Step 3
/ h# I4 v5 p& G8 F3 A        On Error Resume Next: H' \4 K% @- Q& x4 t6 v1 X/ o9 K: M
  If (IntPoints(i + 1) - FSwingBasePoint(1)) / (BSupportCenter(1) - FSwingBasePoint(1)) - (IntPoints(i) - FSwingBasePoint(0)) / (BSupportCenter(0) - FSwingBasePoint(0)) < 0 Then
# x1 w# ^) N, s% W( h; B1 u      PT(0) = IntPoints(i): PT(1) = IntPoints(i + 1): PT(2) = IntPoints(i + 2)# ]  Y1 |& J% p/ `8 a
      GetFSupportCenter = PT                                              '函数返回值# T6 o; g; G8 t" b/ b, k
  End If
7 q  x) b0 o5 j( K& j# l. FNext2 K4 p0 o& }6 d. o4 D/ V7 k* b
End If
- H$ Q( C4 d0 u'ObjCircle1.Delete
/ f) j* R) F3 s! p'ObjCircle2.Delete+ U2 R8 ]8 |' G3 j
End Function* s7 }/ \- v+ I3 Z* T
, W* G% a' ~; G7 _6 y4 w9 v
Sub trial()
- Q+ ?: _/ ?4 p) H* KDim A As Variant# C# R6 k1 I# ], F& ]9 b+ ]# X9 q
Dim B As Variant
+ F. X& x1 W3 G8 a& ~Dim C As Variant
( k8 N) M  ]$ y/ g7 W* t" bA = ThisDrawing.Utility.GetPoint(, "后支撑碗中心:" )& t; k4 w, k' k6 u5 |% o
B = ThisDrawing.Utility.GetPoint(, "前摆杆上铰接点:" )
" H  F; \1 S+ {' y' y4 }6 GC = GetFSupportCenter(A, B)
5 r- B. F! r- ?' Q! hMsgBox "前支撑碗中心坐标:" & C(0) & "," & C(1) & "," & C(2)
9 z( K: _$ }% S  v/ V2 EEnd Sub

评分

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

查看全部评分

发表于 2008-12-6 17:27:40 | 显示全部楼层 来自: 中国湖南衡阳
VarType返回一个 Integer 所以出错- G* a* p- e* V9 c1 F- o& ]
Empty的值为0
  ?: g9 [, ~& J# H4 z6 n, \/ C返回值:
2 j% {5 M& V. G常数 值 描述
) e5 `' O) ?3 q( F/ nvbEmpty 0 Empty(未初始化)   z& k# Z/ r- i' i' ~. O
vbNull 1 Null(无有效数据)
( C; e# g6 y. evbInteger 2 整数
/ h8 u5 ]  ]9 X( v1 n+ u( RvbLong 3 长整数
5 M4 c, S3 e: u% q  HvbSingle 4 单精度浮点数
( B  V9 L' O9 d% vvbDouble 5 双精度浮点数 , i3 r# Z0 n( S+ }- s4 w7 B
vbCurrency 6 货币值 4 P% K: |* m3 q) ]7 e$ q: ?" G
vbDate 7 日期 4 q* G9 |$ B/ z& }. M. S6 m
vbString 8 字符串 " W. |6 o9 Z' y; `& r2 b- g
vbObject 9 对象 ; Q% @( }9 t0 q6 [
vbError 10 错误值
  ]+ s5 H1 u6 J7 E; A" yvbBoolean 11 Boolean 值
* W! g, r9 M8 R, f7 kvbVariant 12 Variant(只与变体中的数组一起使用) $ |/ ]' q7 r& {  S1 m
vbDataObject 13 数据访问对象
+ q- a5 D' V3 w& W0 N7 VvbDecimal 14 十进制值
" _' ]& q1 J# h: uvbByte 17 位值   l+ ]+ k9 k0 b" U/ q) i
vbUserDefinedType 36 包含用户定义类型的变量
; d1 H4 Y6 K6 E! \: w% u( z+ zvbArray 8192 数组
发表于 2008-12-6 18:27:44 | 显示全部楼层 来自: 中国
原帖由 artuo1208 于 2008-12-6 17:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
. G: i  S: w. {VarType返回一个 Integer 所以出错
" y/ }. a$ [% S
应该是返回一个双精度数组。5 O, r8 g- [6 d9 e, v6 Z5 U, J) y

0 }  k; c% s5 c5 a9 E. E7 C出错的原因是这里不应该用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 )

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