.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Creating a new selection set

2 REPLIES 2
Reply
Message 1 of 3
Anonymous
306 Views, 2 Replies

Creating a new selection set

Hello. I would like to add a command that resembles the QSELECT command in AutoCAD. The aim of the "SM" command (listed bellow) is to search through a selection of dynamic blocks using a filter (searchlist array) and to maintain selected only the blocks that match the criteria. So far I am giving them a red color (as seen bellow) as a solution because I wasn't able to maintain a selection set active after ending the command.
(The method selects only dynamic blocks with the name "Marca1" to "Marca11a" and see if they match the criteria: "MARCA", "NRBARE", etc.)

[code] [CommandMethod("SM")] _
Public Sub SM()
Dim searchfrm As New SMfrm

If searchfrm.ShowDialog = Windows.Forms.DialogResult.Yes Then
Dim i As Integer
Dim cdoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim res As PromptSelectionResult = ed.GetSelection()
Dim Sset As Autodesk.AutoCAD.EditorInput.SelectionSet = res.Value

If Sset Is Nothing Then
Exit Sub
End If


Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Dim myT As Transaction = tm.StartTransaction()
Dim idarray As ObjectId() = Sset.GetObjectIds()

Dim id As ObjectId
For Each id In idarray
Dim entity As Entity = tm.GetObject(id, OpenMode.ForRead, True)
Dim ewr As Entity = tm.GetObject(id, OpenMode.ForWrite, True)

If entity.GetType().Name = "BlockReference" Then
Dim mark As BlockReference
Dim markwr As BlockReference
Dim sentinel As Boolean = False
mark = entity
markwr = ewr
If mark.IsDynamicBlock = True Then
Dim dynObjectID As ObjectId = mark.DynamicBlockTableRecord
Dim dynBtr As BlockTableRecord = CType(tm.GetObject(dynObjectID, OpenMode.ForRead, False), BlockTableRecord)
If dynBtr.Name = "Marca1" Or dynBtr.Name = "Marca1a" Or dynBtr.Name = "Marca2" Or dynBtr.Name = "Marca2a" _
Or dynBtr.Name = "Marca3" Or dynBtr.Name = "Marca3a" Or dynBtr.Name = "Marca4" Or dynBtr.Name = "Marca4a" _
Or dynBtr.Name = "Marca5" Or dynBtr.Name = "Marca5a" Or dynBtr.Name = "Marca6" Or dynBtr.Name = "Marca6a" _
Or dynBtr.Name = "Marca7" Or dynBtr.Name = "Marca7a" Or dynBtr.Name = "Marca8" Or dynBtr.Name = "Marca8a" _
Or dynBtr.Name = "Marca9" Or dynBtr.Name = "Marca9a" Or dynBtr.Name = "Marca10" Or dynBtr.Name = "Marca10a" _
Or dynBtr.Name = "Marca11" Or dynBtr.Name = "Marca11a" Then
For i = 0 To mark.AttributeCollection.Count - 1
Dim temp As AttributeReference = mark.AttributeCollection.Item(i).GetObject(OpenMode.ForRead)

If temp.Tag = "MARCA" And searchlist(0) "X" Then
If searchlist(0) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "NRBARE" And searchlist(1) "X" Then
If searchlist(1) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DIAMETRUL" And searchlist(2) "X" Then
If searchlist(2) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "OTEL" And searchlist(3) "X" Then
If searchlist(3) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "REPETARE" And searchlist(4) "X" Then
If searchlist(4) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "LUNGIME" Or temp.Tag = "LUNGIME1") And searchlist(5) "X" Then
If searchlist(5) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "LUNGIME2" And searchlist(6) "X" Then
If searchlist(6) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "DISTANTA1" Or temp.Tag = "DISTANTA") And searchlist(7) "X" Then
If searchlist(7) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DISTANTA2" And searchlist(8) "X" Then
If searchlist(8) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
Next
If sentinel Then
markwr.Color = Autodesk.AutoCAD.Colors.Color.FromColor(Drawing.Color.Red)
End If
End If
End If
End If
Next
myT.Commit()
myT.Dispose()
End If
End Sub [/code]

Any help would be greatly appreciated. Thanks in advance.
2 REPLIES 2
Message 2 of 3
Anonymous
in reply to: Anonymous

You don't need to create a selectionset for this.

Reference AcMgdInternal.dll in your project,
then use this:

ObjectId[] ids = // an array of the object ids to be selected

Autodesk.AutoCAD.Internal.Utils.SelectObjects(ids);

You must also use the CommandFlags.Redraw flag in
your command method for this to work.

--
http://www.caddzone.com

AcadXTabs: MDI Document Tabs for AutoCAD 2008
Supporting AutoCAD 2000 through 2008
http://www.acadxtabs.com

wrote in message news:5672932@discussion.autodesk.com...
Hello. I would like to add a command that resembles the QSELECT command in AutoCAD. The aim of the "SM" command (listed bellow) is to search through a selection of dynamic blocks using a filter (searchlist array) and to maintain selected only the blocks that match the criteria. So far I am giving them a red color (as seen bellow) as a solution because I wasn't able to maintain a selection set active after ending the command.
(The method selects only dynamic blocks with the name "Marca1" to "Marca11a" and see if they match the criteria: "MARCA", "NRBARE", etc.)

[code] [CommandMethod("SM")] _
Public Sub SM()
Dim searchfrm As New SMfrm

If searchfrm.ShowDialog = Windows.Forms.DialogResult.Yes Then
Dim i As Integer
Dim cdoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim res As PromptSelectionResult = ed.GetSelection()
Dim Sset As Autodesk.AutoCAD.EditorInput.SelectionSet = res.Value

If Sset Is Nothing Then
Exit Sub
End If


Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Dim myT As Transaction = tm.StartTransaction()
Dim idarray As ObjectId() = Sset.GetObjectIds()

Dim id As ObjectId
For Each id In idarray
Dim entity As Entity = tm.GetObject(id, OpenMode.ForRead, True)
Dim ewr As Entity = tm.GetObject(id, OpenMode.ForWrite, True)

If entity.GetType().Name = "BlockReference" Then
Dim mark As BlockReference
Dim markwr As BlockReference
Dim sentinel As Boolean = False
mark = entity
markwr = ewr
If mark.IsDynamicBlock = True Then
Dim dynObjectID As ObjectId = mark.DynamicBlockTableRecord
Dim dynBtr As BlockTableRecord = CType(tm.GetObject(dynObjectID, OpenMode.ForRead, False), BlockTableRecord)
If dynBtr.Name = "Marca1" Or dynBtr.Name = "Marca1a" Or dynBtr.Name = "Marca2" Or dynBtr.Name = "Marca2a" _
Or dynBtr.Name = "Marca3" Or dynBtr.Name = "Marca3a" Or dynBtr.Name = "Marca4" Or dynBtr.Name = "Marca4a" _
Or dynBtr.Name = "Marca5" Or dynBtr.Name = "Marca5a" Or dynBtr.Name = "Marca6" Or dynBtr.Name = "Marca6a" _
Or dynBtr.Name = "Marca7" Or dynBtr.Name = "Marca7a" Or dynBtr.Name = "Marca8" Or dynBtr.Name = "Marca8a" _
Or dynBtr.Name = "Marca9" Or dynBtr.Name = "Marca9a" Or dynBtr.Name = "Marca10" Or dynBtr.Name = "Marca10a" _
Or dynBtr.Name = "Marca11" Or dynBtr.Name = "Marca11a" Then
For i = 0 To mark.AttributeCollection.Count - 1
Dim temp As AttributeReference = mark.AttributeCollection.Item(i).GetObject(OpenMode.ForRead)

If temp.Tag = "MARCA" And searchlist(0) "X" Then
If searchlist(0) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "NRBARE" And searchlist(1) "X" Then
If searchlist(1) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DIAMETRUL" And searchlist(2) "X" Then
If searchlist(2) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "OTEL" And searchlist(3) "X" Then
If searchlist(3) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "REPETARE" And searchlist(4) "X" Then
If searchlist(4) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "LUNGIME" Or temp.Tag = "LUNGIME1") And searchlist(5) "X" Then
If searchlist(5) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "LUNGIME2" And searchlist(6) "X" Then
If searchlist(6) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "DISTANTA1" Or temp.Tag = "DISTANTA") And searchlist(7) "X" Then
If searchlist(7) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DISTANTA2" And searchlist(8) "X" Then
If searchlist(8) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
Next
If sentinel Then
markwr.Color = Autodesk.AutoCAD.Colors.Color.FromColor(Drawing.Color.Red)
End If
End If
End If
End If
Next
myT.Commit()
myT.Dispose()
End If
End Sub [/code]

Any help would be greatly appreciated. Thanks in advance.
Message 3 of 3
vladibalan
in reply to: Anonymous

Thank you very much. This code does exactly what I wanted.

[code]CommandMethod("SM", CommandFlags.Redraw) _
Public Sub SM()
Dim searchfrm As New SMfrm

If searchfrm.ShowDialog = Windows.Forms.DialogResult.Yes Then
Dim i As Integer
Dim cdoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim res As PromptSelectionResult = ed.GetSelection()
Dim Sset As Autodesk.AutoCAD.EditorInput.SelectionSet = res.Value
Dim ids As ObjectId() = Array.CreateInstance(GetType(Autodesk.AutoCAD.DatabaseServices.ObjectId), 0)

If Sset Is Nothing Then
Exit Sub
End If


Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Dim myT As Transaction = tm.StartTransaction()
Dim idarray As ObjectId() = Sset.GetObjectIds()

Dim id As ObjectId
For Each id In idarray
Dim entity As Entity = tm.GetObject(id, OpenMode.ForRead, True)
Dim ewr As Entity = tm.GetObject(id, OpenMode.ForWrite, True)

If entity.GetType().Name = "BlockReference" Then
Dim mark As BlockReference
Dim markwr As BlockReference
Dim sentinel As Boolean = False
mark = entity
markwr = ewr
If mark.IsDynamicBlock = True Then
Dim dynObjectID As ObjectId = mark.DynamicBlockTableRecord
Dim dynBtr As BlockTableRecord = CType(tm.GetObject(dynObjectID, OpenMode.ForRead, False), BlockTableRecord)
If dynBtr.Name = "Marca1" Or dynBtr.Name = "Marca1a" Or dynBtr.Name = "Marca2" Or dynBtr.Name = "Marca2a" _
Or dynBtr.Name = "Marca3" Or dynBtr.Name = "Marca3a" Or dynBtr.Name = "Marca4" Or dynBtr.Name = "Marca4a" _
Or dynBtr.Name = "Marca5" Or dynBtr.Name = "Marca5a" Or dynBtr.Name = "Marca6" Or dynBtr.Name = "Marca6a" _
Or dynBtr.Name = "Marca7" Or dynBtr.Name = "Marca7a" Or dynBtr.Name = "Marca8" Or dynBtr.Name = "Marca8a" _
Or dynBtr.Name = "Marca9" Or dynBtr.Name = "Marca9a" Or dynBtr.Name = "Marca10" Or dynBtr.Name = "Marca10a" _
Or dynBtr.Name = "Marca11" Or dynBtr.Name = "Marca11a" Then
For i = 0 To mark.AttributeCollection.Count - 1
Dim temp As AttributeReference = mark.AttributeCollection.Item(i).GetObject(OpenMode.ForRead)

If temp.Tag = "MARCA" And searchlist(0) <> "X" Then
If searchlist(0) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "NRBARE" And searchlist(1) <> "X" Then
If searchlist(1) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DIAMETRUL" And searchlist(2) <> "X" Then
If searchlist(2) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "OTEL" And searchlist(3) <> "X" Then
If searchlist(3) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "REPETARE" And searchlist(4) <> "X" Then
If searchlist(4) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "LUNGIME" Or temp.Tag = "LUNGIME1") And searchlist(5) <> "X" Then
If searchlist(5) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "LUNGIME2" And searchlist(6) <> "X" Then
If searchlist(6) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If (temp.Tag = "DISTANTA1" Or temp.Tag = "DISTANTA") And searchlist(7) <> "X" Then
If searchlist(7) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
If temp.Tag = "DISTANTA2" And searchlist(8) <> "X" Then
If searchlist(8) = temp.TextString Then
sentinel = True
Else
sentinel = False
Exit For
End If
End If
Next
If sentinel Then
ReDim Preserve ids(ids.GetLength(0))
ids.SetValue(id, ids.GetLength(0) - 1)
End If
End If
End If
End If
Next
If Not (ids Is Nothing) Then
Autodesk.AutoCAD.Internal.Utils.SelectObjects(ids)
End If
myT.Commit()
myT.Dispose()
End If
End Sub[/code]

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost