.NET
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Buddy, you have to create two selectionsets,
one for polylines and points and the second one for lines only,
bot with the same window coordinates
Try again please
~'J'~
C6309D9E0751D165D0934D0621DFF27919
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Sorry as mentioned I am a beginner to programming in .net as well as programming things for autocad.
I do not have any training at all in any programming, I just kind of jump into things, but that is how I learn the best.
ok, for a moment lets forget about the points and polylines as I know that they work.
focusing on the lines could I use the code that use gave for "TestLinesForPoints" can create its own command?
if, so in doing that how would I add the code to add the block to the lines?
The same as before?
for some reason I am missing something probably really easy and stupid.
sorry if you are getting frustrated or anything, again I really appreciate the help.
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Try this code instead, see how to use two selection sets
with the same coordinates, i've added some handlers
to check if appropriate entities selected, probably you
may want to remove them from code
Code:
<CommandMethod("insblk")> _
Public Sub TestForInsert()
'Selects the dwg file to be used as the block that is inserted
Dim ofd As New OpenFileDialog(title:="Block Selection", defaultName:="", dialogName:="Block Selection", extension:="dwg", flags:=OpenFileDialog.OpenFileDialogFlags.NoFtpSit es)
ofd.ShowDialog()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Dim points As IDictionary(Of Point3d, Integer) = New Dictionary(Of Point3d, Integer)
'Specifies the selection area
Dim ppo As New PromptPointOptions(vbLf & "First Corner:")
Dim ppr As PromptPointResult = ed.GetPoint(ppo)
Dim pco As New PromptCornerOptions(vbLf & "Second Corner:", ppr.Value)
Dim pcr As PromptPointResult = ed.GetCorner(pco)
'Gets the start and end points of the selected polylines
Dim p1 As Point3d = ppr.Value
Dim p2 As Point3d = pcr.Value
Dim pts As New Point3dCollection()
pts.Add(p1)
pts.Add(New Point3d(p2.X, p1.Y, 0))
pts.Add(p2)
pts.Add(New Point3d(p1.X, p2.Y, 0))
'Creates a selection filter
Dim tv As TypedValue() = New TypedValue() {New TypedValue(DxfCode.Start, "LWPOLYLINE,POINT")}
Dim flt As New SelectionFilter(tv)
Dim res As PromptSelectionResult = ed.SelectCrossingPolygon(pts, flt)
If res.Status <> PromptStatus.OK Then Return
Dim tv1 As TypedValue() = New TypedValue() {New TypedValue(DxfCode.Start, "LINE")}
Dim flt1 As New SelectionFilter(tv1)
Dim res1 As PromptSelectionResult = ed.SelectCrossingPolygon(pts, flt1)
If res1.Status <> PromptStatus.OK Then Return
Using doclock As DocumentLock = doc.LockDocument
Using tr As Transaction = db.TransactionManager.StartTransaction()
Try
'Creates the specified block within the dwg
Dim bt As BlockTable
bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim blkid As ObjectId
Dim ndb As Database = New Database(False, True)
ndb.ReadDwgFile(ofd.Filename, FileOpenMode.OpenForReadAndReadShare, True, Nothing)
Dim name As String = SymbolUtilityServices.GetBlockNameFromInsertPathNa me(ofd.Filename)
Dim btr As BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
blkid = db.Insert(name, ndb, True)
For Each selobj As SelectedObject In res.Value
Dim ent As Entity = tr.GetObject(selobj.ObjectId, OpenMode.ForRead)
'Gets the selected polylines
Dim pline As Polyline
pline = TryCast(ent, Polyline)
'Gets the selected points
Dim pt As DBPoint
pt = TryCast(ent, DBPoint)
If pline IsNot Nothing Then
'Runs the shared function to get the coordinates of the polylines
Dim vertices As Point3dCollection = New Point3dCollection()
For i As Integer = 0 To pline.NumberOfVertices - 1
vertices.Add(pline.GetPoint3dAt(i))
'Adds the block to the polylines
Dim br As BlockReference = New BlockReference(vertices(i), blkid)
br.SetDatabaseDefaults()
btr.AppendEntity(br)
tr.AddNewlyCreatedDBObject(br, True)
Next
Else
If pt IsNot Nothing Then
Dim verts As Point3d = pt.Position
'Adds the block to the points
Dim br2 As BlockReference = New BlockReference(verts, blkid)
br2.SetDatabaseDefaults()
btr.AppendEntity(br2)
tr.AddNewlyCreatedDBObject(br2, True)
End If
End If
Next
For Each selobj As SelectedObject In res1.Value
Dim ent As Entity = tr.GetObject(selobj.ObjectId, OpenMode.ForRead)
'Gets the selected lines
Dim ln As Line
ln = TryCast(ent, Line)
If ln IsNot Nothing Then
Dim i As Integer = 1
Dim ps As Point3d = ln.StartPoint
Dim pe As Point3d = ln.EndPoint
Try
points.Add(New KeyValuePair(Of Point3d, Integer)(ps, i))
i += 1
points.Add(New KeyValuePair(Of Point3d, Integer)(pe, i))
i += 1
Catch
End Try
Dim inspts As Point3dCollection = New Point3dCollection
For Each kvp As KeyValuePair(Of Point3d, Integer) In points
inspts.Add(kvp.Key)
Next kvp
'Adds the block to the lines
For Each pt As Point3d In inspts
Dim br3 As BlockReference = New BlockReference(pt, blkid)
br3.SetDatabaseDefaults()
btr.AppendEntity(br3)
tr.AddNewlyCreatedDBObject(br3, True)
Next
End If
Next
'Commits to the changes made
tr.Commit()
Catch ex As System.Exception
ed.WriteMessage(ex.Message + vbLf + ex.StackTrace)
End Try
End Using
End Using
End SubLet me know if this code is working for ou
~'J'~
C6309D9E0751D165D0934D0621DFF27919
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
I copied all the code over and tried it.
the first time autocad gave a fatal exception not sure why.
I removed the if res.status and if res1.status lines not sure if I should have done that or not
after that I tried again and autocad says this:
Object reference not set to an instance of an object at TestProj.Class1.TestForInsert()
it gives that at line 83 if I select a polyline and line 51 if I select lines
both of those lines are the for each selobj as selectedobject lines
every time this is close to completion it takes two steps backwards
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
ok, I added the if res.status and if res1.status lines back in which resolved the issue with the
two fro each selobj lines
however it does not insert the block on the lines or polylines
its like it does not know where to put the blocks or what block to put there,
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
sorry for the multiple posts, but I just thought I should mention that I am using AutoCAD 2010 if that matters at all.
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
I've changed my code see if this working on your end
Code:
<CommandMethod("insblk")> _
Public Sub TestForInsert()
'Selects the dwg file to be used as the block that is inserted
Dim ofd As New OpenFileDialog(title:="Block Selection", defaultName:="", dialogName:="Block Selection", extension:="dwg", flags:=OpenFileDialog.OpenFileDialogFlags.NoFtpSit es)
ofd.ShowDialog()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Dim points As IDictionary(Of Point3d, Integer) = New Dictionary(Of Point3d, Integer)
'Specifies the selection area
Dim ppo As New PromptPointOptions(vbLf & "First Corner:")
Dim ppr As PromptPointResult = ed.GetPoint(ppo)
Dim pco As New PromptCornerOptions(vbLf & "Second Corner:", ppr.Value)
Dim pcr As PromptPointResult = ed.GetCorner(pco)
'Gets the start and end points of the selected polylines
Dim p1 As Point3d = ppr.Value
Dim p2 As Point3d = pcr.Value
Dim pts As New Point3dCollection()
pts.Add(p1)
pts.Add(New Point3d(p2.X, p1.Y, 0))
pts.Add(p2)
pts.Add(New Point3d(p1.X, p2.Y, 0))
Using doclock As DocumentLock = doc.LockDocument
Using tr As Transaction = db.TransactionManager.StartTransaction()
Try
'Creates the specified block within the dwg
Dim bt As BlockTable
bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
Dim blkid As ObjectId
Dim ndb As Database = New Database(False, True)
ndb.ReadDwgFile(ofd.Filename, FileOpenMode.OpenForReadAndReadShare, True, Nothing)
Dim name As String = SymbolUtilityServices.GetBlockNameFromInsertPathNa me(ofd.Filename)
Dim btr As BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
blkid = db.Insert(name, ndb, True)
'Creates a selection filter
Dim tv As TypedValue() = New TypedValue() {New TypedValue(DxfCode.Start, "LWPOLYLINE,POINT")}
Dim flt As New SelectionFilter(tv)
Dim res As PromptSelectionResult = ed.SelectCrossingPolygon(pts, flt)
'check if something selected
If res.Status = PromptStatus.OK Then
'check if selected equal one or more than one item
If res.Value.Count > 0 Then
For Each selobj As SelectedObject In res.Value
Dim ent As Entity = tr.GetObject(selobj.ObjectId, OpenMode.ForRead)
'Gets the selected polylines
Dim pline As Polyline
pline = TryCast(ent, Polyline)
'Gets the selected points
Dim pt As DBPoint
pt = TryCast(ent, DBPoint)
If pline IsNot Nothing Then
'Runs the shared function to get the coordinates of the polylines
Dim vertices As Point3dCollection = New Point3dCollection()
For i As Integer = 0 To pline.NumberOfVertices - 1
vertices.Add(pline.GetPoint3dAt(i))
'Adds the block to the polylines
Dim br As BlockReference = New BlockReference(vertices(i), blkid)
br.SetDatabaseDefaults()
btr.AppendEntity(br)
tr.AddNewlyCreatedDBObject(br, True)
Next
Else
If pt IsNot Nothing Then
Dim verts As Point3d = pt.Position
'Adds the block to the points
Dim br2 As BlockReference = New BlockReference(verts, blkid)
br2.SetDatabaseDefaults()
btr.AppendEntity(br2)
tr.AddNewlyCreatedDBObject(br2, True)
End If
End If
Next
End If
End If
Dim tv1 As TypedValue() = New TypedValue() {New TypedValue(DxfCode.Start, "LINE")}
Dim flt1 As New SelectionFilter(tv1)
Dim res1 As PromptSelectionResult = ed.SelectCrossingPolygon(pts, flt1)
'check if something selected
If res1.Status = PromptStatus.OK Then
'check if selected equal one or more than one item
If res1.Value.Count > 0 Then
For Each selobj As SelectedObject In res1.Value
Dim ent As Entity = tr.GetObject(selobj.ObjectId, OpenMode.ForRead)
'Gets the selected lines
Dim ln As Line
ln = TryCast(ent, Line)
If ln IsNot Nothing Then
Dim i As Integer = 1
Dim ps As Point3d = ln.StartPoint
Dim pe As Point3d = ln.EndPoint
Try
points.Add(New KeyValuePair(Of Point3d, Integer)(ps, i))
i += 1
points.Add(New KeyValuePair(Of Point3d, Integer)(pe, i))
i += 1
Catch
End Try
Dim inspts As Point3dCollection = New Point3dCollection
For Each kvp As KeyValuePair(Of Point3d, Integer) In points
inspts.Add(kvp.Key)
Next kvp
'Adds the block to the lines
For Each pt As Point3d In inspts
Dim br3 As BlockReference = New BlockReference(pt, blkid)
br3.SetDatabaseDefaults()
btr.AppendEntity(br3)
tr.AddNewlyCreatedDBObject(br3, True)
Next
End If
Next
End If
End If
'Commits to the changes made
tr.Commit()
Catch ex As System.Exception
ed.WriteMessage(ex.Message + vbLf + ex.StackTrace)
End Try
End Using
End Using
End Sub
~'J'~
C6309D9E0751D165D0934D0621DFF27919
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
ok. tried that and it does work on polylines and lines
however, when doing lines such as 5 lines that are connected
it will put one block at the start point of the first line
two blocks at the endpoint of the first line and the start point of the second line
three blocks at the endpoint of the second line and the startpoint of the third line and so on
so instead of only added an additional block at the start and end point connections of the lines it increases with the number of lines that you have.
is this where the if (math.abs(p1.y-p2.y)<0.0001) And _ comes into play?
or am I completely missing something?
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Let me check this out,
Later
~'J'~
C6309D9E0751D165D0934D0621DFF27919
Re: Insert Block on Multiple Selected Points
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
ok
on a side note with another project that I am going to be woring on which involves working with sheet sets
I am having issues with being able to bring in the acsmcomponents18lib.tlb file in as a reference.
I am using vb express 2008, I have vb express 2010, but 2008 seems to work better for autocad 2010.
could you possible give me a hint or something of how to add that?
everywhere I look it says to add it as you would a normal reference, but that does not seem to work for me for some reason.
again thanks for all your help.


