明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1522|回复: 1

选择多义线或块引用则把通过框内线打断的程序

[复制链接]
发表于 2003-12-17 19:02:00 | 显示全部楼层 |阅读模式
在efan那个打断线交点的程序上改的。
只对于方形块引用和多义线有效。而且速度比较慢。
对于通过块应用的多义线,也无效。
以上不知道如何解决。望高手指点。

主程序
  1. Sub blkTrim()
  2. On Error Resume Next
  3.   Dim ent As AcadEntity
  4.   Dim sset As AcadSelectionSet
  5.   Set sset = CreateSelectionSet("sset")
  6.   Dim fType, fData As Variant
  7.   BuildFilter fType, fData, 0, "INSERT"
  8.   ThisDrawing.Utility.Prompt "选择对象,会过滤其它对象,只留下块,若直接回车,则可选择多义线。"
  9.   sset.SelectOnScreen fType, fData
  10.   If sset.Count = 0 Then
  11.     ThisDrawing.Utility.Prompt "选择对象,会过滤其它对象,只留下多义线。"
  12.     BuildFilter fType, fData, 0, "*Polyline"
  13.     sset.SelectOnScreen fType, fData
  14.     If sset.Count = 0 Then Exit Sub
  15.   End If
  16.   
  17.   For Each ent In sset
  18.     entTrimF ent
  19.   Next
  20.   
  21.   sset.Delete
  22.   
  23. End Sub


  24. Sub entTrimF(entobj As AcadEntity)
  25.     Dim SSetObj As AcadSelectionSet
  26.     Dim Pt1 As Variant
  27.     Dim Pt2 As Variant
  28.     Dim i As Integer
  29.     Dim Pt, pnt1 As Variant
  30.     Dim bPt(0 To 1) As Double
  31.    
  32.    
  33.     On Error Resume Next
  34.     '创建选择集
  35.     Set SSetObj = CreateSelectionSet("ss1")
  36.     Err.Clear
  37.     entobj.GetBoundingBox Pt1, Pt2
  38.    
  39.   '要截断2次才能保证都截断完成
  40.   For k = 0 To 1
  41.     SSetObj.Select acSelectionSetCrossing, Pt1, Pt2
  42.     '从集合中删除自身实体
  43.     ssDelete SSetObj, entobj
  44.     If SSetObj.Count = 0 Then GoTo ErrTrap
  45.         For i = 0 To SSetObj.Count - 1
  46.             '选中了自身对象时,不进行操作
  47.             If SSetObj(i).Handle <> entobj.Handle Then
  48.                 Pt = entobj.IntersectWith(SSetObj(i), acExtendNone)
  49.                 If Not IsEmpty(Pt) Then
  50.                     For j = 0 To UBound(Pt) Step 3
  51.                         bPt(0) = Pt(j)
  52.                         bPt(1) = Pt(j + 1)
  53.                         ThisDrawing.SendCommand "_break" & vbCr & "(handent """ & SSetObj(i).Handle & """)" & vbCr & bPt(0) & "," & bPt(1) & vbCr & "@" & vbCr
  54.                     Next j
  55.                 End If
  56.             End If
  57.         Next i
  58.      SSetObj.Clear
  59.     Next k
  60.    
  61.     SSetObj.Select acSelectionSetWindow, Pt1, Pt2
  62.     ssDelete SSetObj, entobj
  63.     SSetObj.Erase
  64.    
  65.    
  66. ErrTrap:
  67.     SSetObj.Clear
  68.     SSetObj.Delete
  69. End Sub



引用的函数
  1. Public Sub BuildFilter(typeArray, dataArray, ParamArray gCodes())
  2.     Dim fType() As Integer, fData()
  3.     Dim index As Long, i As Long
  4.    
  5.     index = LBound(gCodes) - 1
  6.         
  7.     For i = LBound(gCodes) To UBound(gCodes) Step 2
  8.         index = index + 1
  9.         ReDim Preserve fType(0 To index)
  10.         ReDim Preserve fData(0 To index)
  11.         fType(index) = CInt(gCodes(i))
  12.         fData(index) = gCodes(i + 1)
  13.     Next
  14.     typeArray = fType: dataArray = fData
  15. End Sub
  16. Public Sub ssDelete(ss As AcadSelectionSet, ent As AcadEntity)

  17.     Dim objArray(0 To 0) As AcadEntity
  18.    
  19.     Set objArray(0) = ent
  20.     ss.RemoveItems objArray

  21. End Sub

  22. Public Function CreateSelectionSet(Optional ssName As String = "ss") As AcadSelectionSet

  23.     Dim ss As AcadSelectionSet
  24.    
  25.     On Error Resume Next
  26.     Set ss = ThisDrawing.SelectionSets(ssName)
  27.     If Err Then Set ss = ThisDrawing.SelectionSets.Add(ssName)
  28.     ss.Clear
  29.     Set CreateSelectionSet = ss

  30. End Function


评分

参与人数 1威望 +1 金钱 +10 贡献 +5 激情 +10 收起 理由
mccad + 1 + 10 + 5 + 10 【好评】好程序

查看全部评分

发表于 2003-12-25 19:27:00 | 显示全部楼层
谢谢,先看看.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 10:56 , Processed in 0.150372 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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