乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 98|回复: 5

[求助]选择集选取语法没错,为什么会漏选图元呢?求助高手!!

[复制链接]

5

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
36
发表于 2008-3-18 18:27:00 | 显示全部楼层 |阅读模式
检查了好几遍,没发现出问题,但是求不出所有的交点,是选择集出了问题,没有选取所以符合条件的图元。
至于为什么没有选到,就不知道了,求助高手啊。
语法应该没有问题

rmjssgrmcf5.jpg

rmjssgrmcf5.jpg

Private Sub CommandButton1_Click()
On Error Resume Next
UserForm1.Hide
'选择等高线
Dim EntObj(0 To 0) As AcadEntity
Dim PPt As Variant
ThisDrawing.Utility.GetEntity EntObj(0), PPt, "选择等高线: "
If EntObj(0) Is Nothing Then Exit Sub
'求直线的外框
Dim Pt1 As Variant
Dim Pt2 As Variant
EntObj(0).GetBoundingBox Pt1, Pt2
'创建选择集
Dim ssetObj As AcadSelectionSet
Set ssetObj = ThisDrawing.SelectionSets("SSET")
If Err Then Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
ssetObj.Clear
'只选取图层为DGX的图层
'选择与该直线相交或者包含在外框中的所有实体
Dim fType(0) As Integer
Dim fData(0) As Variant
fType(0) = 8: fData(0) = "dgx"
ssetObj.Select acSelectionSetCrossing, Pt1, Pt2, fType, fData
'由于其中包含了自身实体,故应从选择集中移走
'由于移去函数的参数是对象集合,所以在上面定义的是单个对象的对象集合
ssetObj.RemoveItems EntObj
Dim entTempElev As Double
entTempElev = EntObj(0).Elevation
EntObj(0).Elevation = 0
'将等高线高程暂时化为0,原高程存储到数组elevTemp()中
Dim I As Integer
Dim elevTemp() As Double
ReDim elevTemp(1 To ssetObj.Count)
For I = 1 To ssetObj.Count
    elevTemp(I) = ssetObj.Item(I).Elevation
    ssetObj.Item(I).Elevation = 0
    ssetObj.Item(I).Update
Next
'枚举交点,判断是否相交
Dim pts As Variant
Dim circle1() As AcadCircle
ReDim circle1(ssetObj.Count - 1)
Dim a As Integer
For I = 0 To ssetObj.Count - 1
    pts = ssetObj(I).IntersectWith(EntObj(0), acExtendNone)
    If Not IsEmpty(pts) Then
        Dim circleT(2) As Double
        circleT(0) = pts(0): circleT(1) = pts(1): circleT(2) = 0
   
        circle1(I) = ThisDrawing.ModelSpace.AddCircle(circleT, 0.5)
    End If
Next
EntObj(0).Elevation = entTempElev
For I = 1 To ssetObj.Count
     ssetObj.Item(I).Elevation = elevTemp(I)
     ssetObj.Item(I).Update
Next
UserForm1.Show
End Sub

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

124

主题

837

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1333
发表于 2008-3-18 20:40:00 | 显示全部楼层
我选择黑线,然后求得了交点:
没发现什么问题!

itevkclo1sq.jpg

itevkclo1sq.jpg

回复

使用道具 举报

5

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
36
发表于 2008-3-18 20:51:00 | 显示全部楼层
你用那根等高线试试,就是我贴图上的那根与另外好几根差不多同样属性的多段线试试
我试验的时候,结果想贴图的那样,应该有6个交点的,但实际只画了5个圆,只返回5个交点
回复

使用道具 举报

11

主题

49

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2008-3-18 23:25:00 | 显示全部楼层

以下红色为错误,已更改,再试试,呵呵,粗心了点
Option Explicit
Private Sub CommandButton1_Click()
On Error Resume Next
UserForm1.Hide
'选择等高线
Dim EntObj(0 To 0) As AcadEntity
Dim PPt As Variant
ThisDrawing.Utility.GetEntity EntObj(0), PPt, "选择等高线: "
If EntObj(0) Is Nothing Then Exit Sub
'求直线的外框
Dim Pt1 As Variant
Dim Pt2 As Variant
EntObj(0).GetBoundingBox Pt1, Pt2
'创建选择集
Dim ssetObj As AcadSelectionSet
Set ssetObj = ThisDrawing.SelectionSets("SSET")
If Err Then Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
ssetObj.Clear
'只选取图层为DGX的图层
'选择与该直线相交或者包含在外框中的所有实体
Dim fType(0) As Integer
Dim fData(0) As Variant
fType(0) = 8: fData(0) = "dgx"
ssetObj.Select acSelectionSetCrossing, Pt1, Pt2, fType, fData
'由于其中包含了自身实体,故应从选择集中移走
'由于移去函数的参数是对象集合,所以在上面定义的是单个对象的对象集合
ssetObj.RemoveItems EntObj
Dim entTempElev As Double
entTempElev = EntObj(0).Elevation
EntObj(0).Elevation = 0
'将等高线高程暂时化为0,原高程存储到数组elevTemp()中
Dim I As Integer
Dim elevTemp() As Double
ReDim elevTemp(0 To ssetObj.Count - 1)'这里错误,范围应为0~count-1
For I = 0 To ssetObj.Count - 1'这里错误,范围应为0~count-1
    elevTemp(I) = ssetObj.Item(I).Elevation
    ssetObj.Item(I).Elevation = 0
    ssetObj.Item(I).Update
Next
'枚举交点,判断是否相交
Dim pts As Variant
Dim circle1() As AcadCircle
ReDim circle1(ssetObj.Count - 1)
Dim a As Integer
For I = 0 To ssetObj.Count - 1
    pts = ssetObj(I).IntersectWith(EntObj(0), acExtendNone)
    If Not IsEmpty(pts) Then
        Dim circleT(2) As Double
        circleT(0) = pts(0): circleT(1) = pts(1): circleT(2) = 0
   
        circle1(I) = ThisDrawing.ModelSpace.AddCircle(circleT, 0.5)
    End If
Next
EntObj(0).Elevation = entTempElev
For I = 0 To ssetObj.Count - 1)'这里错误,范围应为0~count-1
     ssetObj.Item(I).Elevation = elevTemp(I)
     ssetObj.Item(I).Update
Next
UserForm1.Show
End Sub
回复

使用道具 举报

1

主题

28

帖子

4

银币

初来乍到

Rank: 1

铜币
32
发表于 2008-3-19 08:48:00 | 显示全部楼层
学习了 谢谢!
回复

使用道具 举报

5

主题

16

帖子

2

银币

初来乍到

Rank: 1

铜币
36
发表于 2008-3-19 19:33:00 | 显示全部楼层
真的可以了,太谢谢了,困扰了一天
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 03:43 , Processed in 0.604746 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表