[討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
3 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
我把 SelectOnScreen 換成 acSelectionSetAll , 後面的FilterType, FilterData好像是不起作用的? 可是看說明應該是可以的啊..
sset.SelectOnScreen FilterType, FilterData
sset.Select acSelectionSetAll, , , FilterType, FilterData
我的想法是要全選 所有叫 DJ_V2 的圖塊, 不過, 目前看來好像要先選出所有圖塊, 再一個個去看是不是DJ_V2 的圖塊
目前 我有動態圖塊路非動態圖塊2種.. DJ_v2 測出來了,動態的還搞不懂。。
Dim FilterType(0) As Integer
Dim FilterData(0) As Variant
On Error GoTo ErrorHandle1
FilterType(0) = 0
FilterData(0) = "insert"
fff:
Set sset = ThisDrawing.SelectionSets.Add("SS1")
sset.SelectOnScreen FilterType, FilterData
'sset.Select acSelectionSetAll, , , FilterType, FilterData
Dim entry As AcadEntity
For Each entry In sset
entry.color = acRed
entry.Update
Next entry
Exit Sub
ErrorHandle1:
ThisDrawing.SelectionSets.Item("SS1").Delete
GoTo fff
end sub
我把 SelectOnScreen 換成 acSelectionSetAll , 後面的FilterType, FilterData好像是不起作用的? 可是看說明應該是可以的啊..
sset.SelectOnScreen FilterType, FilterData
sset.Select acSelectionSetAll, , , FilterType, FilterData
我的想法是要全選 所有叫 DJ_V2 的圖塊, 不過, 目前看來好像要先選出所有圖塊, 再一個個去看是不是DJ_V2 的圖塊
目前 我有動態圖塊路非動態圖塊2種.. DJ_v2 測出來了,動態的還搞不懂。。
Dim FilterType(0) As Integer
Dim FilterData(0) As Variant
On Error GoTo ErrorHandle1
FilterType(0) = 0
FilterData(0) = "insert"
fff:
Set sset = ThisDrawing.SelectionSets.Add("SS1")
sset.SelectOnScreen FilterType, FilterData
'sset.Select acSelectionSetAll, , , FilterType, FilterData
Dim entry As AcadEntity
For Each entry In sset
entry.color = acRed
entry.Update
Next entry
Exit Sub
ErrorHandle1:
ThisDrawing.SelectionSets.Item("SS1").Delete
GoTo fff
end sub
蜻蜓草 在 2013-07-26, 17:30 作了第 1 次修改
蜻蜓草- 一般會員
- 文章總數 : 77
年齡 : 47
來自 : 南投
職業 : 工
愛好 : 電影
個性 : 溫和
使用年資 : 新手初學
使用版本 : 新手初學
經驗值 : 4938
威望值 : 0
注冊日期 : 2012-08-16
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
給你個範例參考,這是我以前去上課學VBA時,老師課堂上給的範例,
你研究看看就知道你那裡用錯了!
你研究看看就知道你那裡用錯了!
- 代碼:
'********************************************************************
'* 巨集名稱 : CalPolyLineTotalArea()
'* 功 能 : 顯示圖面所有的Polyline總面積和
'*
Public Sub CalPolyLineTotalArea()
Dim objAcadSelectionSet As AcadSelectionSet
Dim strName As String
Dim objAcadEntity As AcadEntity
Dim aintFilterType(0 To 3) As Integer
Dim avarFilterData(0 To 3) As Variant
Dim dblAreaSum As Double
'設定如果發生錯誤則則跳至 ExitHandle 位置
On Error GoTo ExitHandle
With ThisDrawing.Utility
'若發生錯誤則繼續執行下一行
On Error Resume Next
' Delete 方法可刪除一個選集物件
ThisDrawing.SelectionSets.Item("TestSelectionSetFilter").Delete
'如果發生錯誤則清除清除錯誤內容,修改錯誤處理方式
If Err Then
Err.Clear
'設定如果發生錯誤則則跳至 ExitHandle 位置
On Error GoTo ExitHandle
End If
' 建立新的選擇集
Set objAcadSelectionSet = ThisDrawing.SelectionSets.add("TestSelectionSetFilter")
'設定過濾圖面上物件的條件
aintFilterType(0) = -4: avarFilterData(0) = "<OR"
aintFilterType(1) = 0: avarFilterData(1) = "POLYLINE"
aintFilterType(2) = 0: avarFilterData(2) = "LWPOLYLINE"
aintFilterType(3) = -4: avarFilterData(3) = "OR>"
'執行過濾的動作
objAcadSelectionSet.Select acSelectionSetAll, , , aintFilterType, avarFilterData
'突顯出所選擇的物件
objAcadSelectionSet.Highlight True
'暫停,等待使用者輸入任意鍵才進行改變
.Prompt vbCr & objAcadSelectionSet.Count & " 個物件被選擇"
.GetString False, vbLf & " 輸入任意鍵繼續..."
For Each objAcadEntity In objAcadSelectionSet
dblAreaSum = dblAreaSum + objAcadEntity.Area
Next objAcadEntity
'顯示圖面所有的Polyline總面積和
MsgBox ("Polyline 總面積為 :" + CStr(dblAreaSum))
'將所選擇的物件恢復成一般狀態
objAcadSelectionSet.Highlight False
End With
Exit Sub
ExitHandle:
MsgBox Err.Description
'如果發現選擇集已經建立則將選擇集刪除之
If Not objAcadSelectionSet Is Nothing Then
objAcadSelectionSet.Delete
End If
End Sub
ginse0727- 高級會員
- 文章總數 : 256
年齡 : 50
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 6829
威望值 : 500
發帖精華 : 1
注冊日期 : 2010-07-13
chiuo1764 likes this post
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
還是沒試出來.. SelectOnScreen 跟Select acSelectionSetAll 來說的話
FilterType, FilterData 的參數用法應是一樣的啊...
沒道裡
sset.SelectOnScreen FilterType, FilterData (窗選會過濾)
sset.Select acSelectionSetAll, , , FilterType, FilterData (沒過濾全選)
怪了...
FilterType, FilterData 的參數用法應是一樣的啊...
沒道裡
sset.SelectOnScreen FilterType, FilterData (窗選會過濾)
sset.Select acSelectionSetAll, , , FilterType, FilterData (沒過濾全選)
怪了...
蜻蜓草- 一般會員
- 文章總數 : 77
年齡 : 47
來自 : 南投
職業 : 工
愛好 : 電影
個性 : 溫和
使用年資 : 新手初學
使用版本 : 新手初學
經驗值 : 4938
威望值 : 0
注冊日期 : 2012-08-16
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
方便的話,po 你的程式及圖檔來做測試吧!
不過這禮拜我有事外出,手邊沒有電腦可測試,可能下禮拜才有空幫忙!
不過這禮拜我有事外出,手邊沒有電腦可測試,可能下禮拜才有空幫忙!
ginse0727- 高級會員
- 文章總數 : 256
年齡 : 50
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 6829
威望值 : 500
發帖精華 : 1
注冊日期 : 2010-07-13
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
您太客氣了, 別這麼說, 有空再回就行了,
目前發現應是動態圖塊的問題..
可是這樣過濾條件就不懂怎麼設定了..
測試檔1
Sub SelectionSetFilterTest()
Dim FilterType(0 To 1) As Integer
Dim FilterData(0 To 1) As Variant
Dim sSet As AcadSelectionSet
Dim Entry As AcadEntity
FilterType(0) = 0 '?元?型
FilterData(0) = "INSERT"
FilterType(1) = 2 '?元名?
' FilterData(1) = "dj_v4"
' FilterData(1) = "marks_V2"
FilterData(1) = "圖界標2"
On Error Resume Next
ThisDrawing.SelectionSets.Item("SS1").Delete
Set sSet = ThisDrawing.SelectionSets.Add("SS1")
On Error GoTo 0
ThisDrawing.Application.ZoomExtents
'sSet.SelectOnScreen FilterType, FilterData
sSet.Select acSelectionSetAll, , , FilterType, FilterData
If sSet.Count = 0 Then Exit Sub
For Each Entry In sSet
Entry.color = acRed
Entry.Update
Next Entry
MsgBox "修改了" & sSet.Count
End Sub
目前發現應是動態圖塊的問題..
可是這樣過濾條件就不懂怎麼設定了..
測試檔1
Sub SelectionSetFilterTest()
Dim FilterType(0 To 1) As Integer
Dim FilterData(0 To 1) As Variant
Dim sSet As AcadSelectionSet
Dim Entry As AcadEntity
FilterType(0) = 0 '?元?型
FilterData(0) = "INSERT"
FilterType(1) = 2 '?元名?
' FilterData(1) = "dj_v4"
' FilterData(1) = "marks_V2"
FilterData(1) = "圖界標2"
On Error Resume Next
ThisDrawing.SelectionSets.Item("SS1").Delete
Set sSet = ThisDrawing.SelectionSets.Add("SS1")
On Error GoTo 0
ThisDrawing.Application.ZoomExtents
'sSet.SelectOnScreen FilterType, FilterData
sSet.Select acSelectionSetAll, , , FilterType, FilterData
If sSet.Count = 0 Then Exit Sub
For Each Entry In sSet
Entry.color = acRed
Entry.Update
Next Entry
MsgBox "修改了" & sSet.Count
End Sub
蜻蜓草- 一般會員
- 文章總數 : 77
年齡 : 47
來自 : 南投
職業 : 工
愛好 : 電影
個性 : 溫和
使用年資 : 新手初學
使用版本 : 新手初學
經驗值 : 4938
威望值 : 0
注冊日期 : 2012-08-16
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
FilterType(0) = 0 '?元?型
FilterData(0) = "INSERT"
FilterType(1) = 2 '?元名?
FilterData(1) = "dj_v4"
' FilterData(1) = "marks_V2"
' FilterData(1) = "圖界標2"
這個狀況測試 OK!! 找到 3 個 dj_v4
FilterData(0) = "INSERT"
FilterType(1) = 2 '?元名?
FilterData(1) = "dj_v4"
' FilterData(1) = "marks_V2"
' FilterData(1) = "圖界標2"
這個狀況測試 OK!! 找到 3 個 dj_v4
shackle_2005- 初級會員
- 文章總數 : 232
年齡 : 53
來自 : 台中
職業 : 程式設計
愛好 : 音樂
個性 : 隨和
使用年資 : 10 年
使用版本 : 2013
積分 : 3
經驗值 : 6758
威望值 : 361
注冊日期 : 2010-09-20
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
最上面的程式直接改這樣也會動
FilterType(0) = 2
FilterData(0) = "dj_v4"
FilterType(0) = 2
FilterData(0) = "dj_v4"
shackle_2005- 初級會員
- 文章總數 : 232
年齡 : 53
來自 : 台中
職業 : 程式設計
愛好 : 音樂
個性 : 隨和
使用年資 : 10 年
使用版本 : 2013
積分 : 3
經驗值 : 6758
威望值 : 361
注冊日期 : 2010-09-20
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
嗯~~這樣可以選到 dj_v4 , 但動態圖塊 "圖界標2" 就不知道要怎麼設了...資料好少
下LIST 來看 "圖界標2" , 多了匿名資訊=.="
處理碼 = 51431
圖塊名稱: "圖界標2"
匿名: "*U16"
下LIST 來看 "圖界標2" , 多了匿名資訊=.="
處理碼 = 51431
圖塊名稱: "圖界標2"
匿名: "*U16"
蜻蜓草- 一般會員
- 文章總數 : 77
年齡 : 47
來自 : 南投
職業 : 工
愛好 : 電影
個性 : 溫和
使用年資 : 新手初學
使用版本 : 新手初學
經驗值 : 4938
威望值 : 0
注冊日期 : 2012-08-16
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
' There's no way to filter dynamic block insertions other than by getting the
' names of all the 'anonymous blocks' that are used, and building a filter
' list that contains all of them.
' Autodesk is well aware of the fact that selection set filtering of dynamic
' blocks is a very common functionality requirement in AutoCAD scripting, and
' has been aware of that since dynamic blocks first appeared.
' But, because Autodesk appears to have little desire to continue to support
' generic AutoCAD scripting, this is what you end up with.
' 我看了 Autodesk 的討論區, 好像是沒辦法過濾 dynamic block
' 只能用 .IsDynamicBlock 和 .EffectiveName 來過濾
' 如果是動態圖塊, .EffectiveName 就會顯示出 "圖界標2". 目前看起來是這樣, 參考參考
Dim blkref_obj As AcadBlockReference
For Each blkref_obj In sSet
If blkref_obj.IsDynamicBlock Then
if blkref_obj.EffectiveName = "圖界標2" then .............
end if
Next blkref_obj
' names of all the 'anonymous blocks' that are used, and building a filter
' list that contains all of them.
' Autodesk is well aware of the fact that selection set filtering of dynamic
' blocks is a very common functionality requirement in AutoCAD scripting, and
' has been aware of that since dynamic blocks first appeared.
' But, because Autodesk appears to have little desire to continue to support
' generic AutoCAD scripting, this is what you end up with.
' 我看了 Autodesk 的討論區, 好像是沒辦法過濾 dynamic block
' 只能用 .IsDynamicBlock 和 .EffectiveName 來過濾
' 如果是動態圖塊, .EffectiveName 就會顯示出 "圖界標2". 目前看起來是這樣, 參考參考
Dim blkref_obj As AcadBlockReference
For Each blkref_obj In sSet
If blkref_obj.IsDynamicBlock Then
if blkref_obj.EffectiveName = "圖界標2" then .............
end if
Next blkref_obj
shackle_2005- 初級會員
- 文章總數 : 232
年齡 : 53
來自 : 台中
職業 : 程式設計
愛好 : 音樂
個性 : 隨和
使用年資 : 10 年
使用版本 : 2013
積分 : 3
經驗值 : 6758
威望值 : 361
注冊日期 : 2010-09-20
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
shackle_2005前輩已經解出你的問題了,
也就是說你無法直接過濾出動態圖塊,
簡單的做法是,
先把所有的圖塊節篩出來,
然後再利用 .IsDynamicBlock 和 .EffectiveName 來過濾
(不好意思,重覆了前輩的說法)
不曉得這樣的回覆,你的問題已經獲得解決了嗎?
也就是說你無法直接過濾出動態圖塊,
簡單的做法是,
先把所有的圖塊節篩出來,
然後再利用 .IsDynamicBlock 和 .EffectiveName 來過濾
(不好意思,重覆了前輩的說法)
不曉得這樣的回覆,你的問題已經獲得解決了嗎?
ginse0727- 高級會員
- 文章總數 : 256
年齡 : 50
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 6829
威望值 : 500
發帖精華 : 1
注冊日期 : 2010-07-13
回復: [討論]請問 使用過濾器 acSelectionSetAll 就不能下過濾條件嗎?
shackle_2005 的方式確實可以用, 已經試出來了, 太感謝 shackle_2005 和 ginse0727 兄的熱心幫忙了, 謝謝~~
蜻蜓草- 一般會員
- 文章總數 : 77
年齡 : 47
來自 : 南投
職業 : 工
愛好 : 電影
個性 : 溫和
使用年資 : 新手初學
使用版本 : 新手初學
經驗值 : 4938
威望值 : 0
注冊日期 : 2012-08-16
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章