Seems to be worked for me many times
with no any problems (A2007 only)
Give this a shot
~'J'~
Imports System
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.DatabaseServices
Namespace Polyline.CommonUtils
Public Class PolylineManipulation
_
Public Sub GetEntity()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor()
Dim selopts As PromptEntityOptions = New PromptEntityOptions(vbCr & "Select 3DPolyline: ")
selopts.SetRejectMessage(vbCr & "3DPolyline may be selected only!")
selopts.AddAllowedClass(GetType(Polyline3d), True)
Dim entres As PromptEntityResult = ed.GetEntity(selopts)
If entres.Status = PromptStatus.OK Then
Move3DPolyVertex(entres.ObjectId)
End If
End Sub
Private Sub Move3DPolyVertex(ByVal polyID As ObjectId)
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim docLock As DocumentLock = doc.LockDocument()
Dim ed As Editor = doc.Editor
Dim db As Database = doc.Database
Using trans As Transaction = ed.Document.TransactionManager.StartTransaction()
Dim objPline As Polyline3d = CType(trans.GetObject(polyID, OpenMode.ForWrite), Polyline3d)
Dim osm As Integer = Application.GetSystemVariable("OSMODE")
Application.SetSystemVariable("OSMODE", 1)
Dim opts As New PromptPointOptions(vbCr & "Select vertex :")
opts.AllowNone = False
opts.UseBasePoint = False
Dim res As PromptPointResult = ed.GetPoint(opts)
If res.Status = PromptStatus.OK Then
Dim pfrom As Point3d = res.Value
opts.UseBasePoint = True
opts.BasePoint = pfrom
opts.Message = vbCr & "Pick destination point to move vertext at:"
Dim nres As PromptPointResult = ed.GetPoint(opts)
If nres.Status = PromptStatus.OK Then
Dim pto As Point3d = nres.Value
Dim btr As BlockTableRecord = DirectCast(trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite),
BlockTableRecord)
Dim desVex As PolylineVertex3d = New PolylineVertex3d
Dim viter As IEnumerator = objPline.GetEnumerator
While viter.MoveNext
Dim newVex As PolylineVertex3d = DirectCast(trans.GetObject(viter.Current, OpenMode.ForWrite),
PolylineVertex3d)
Dim pt As Point3d = newVex.Position
If pt.X.Equals(pfrom.X) And _
pt.Y.Equals(pfrom.Y) And _
pt.Z.Equals(pfrom.Z) Then
desVex = newVex
End If
End While
desVex.Position = New Point3d(pto.X, pto.Y, pto.Z)
Application.SetSystemVariable("OSMODE", osm)
ed.Regen()
trans.Commit()
End If
End If
docLock.Dispose()
End Using
End Sub
End Class
End Namespace