Swamp,
I was told that it was difficult to pass a managed selection set to a LISP
function in the Package Invoke acedInvoke or acedEvaluateLISP arx
entry points.
I tried one way to use a string of objectID's which worked, but lost all of the selection method etc...
It is not perfect but...
Using .NET create the managed selection set, commit it and then call
the P/Invoke expression using the (ssget "p") expression to pull the
managed selection set into the LISP expression.
I would appreciate your comments?
Peter
Imports Autodesk.AutoCAD
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.GraphicsInterface
Imports System.Runtime.InteropServices 'for DllImport()
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Windows
Imports acadApplication = Autodesk.AutoCAD.ApplicationServices.Application
Public Class vbvlClass
' Use P/Invoke for acedEvaluateLISP
<System.Security.SuppressUnmanagedCodeSecurity(), DllImport("acad.exe", _
CharSet:=CharSet.Unicode, _
CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?acedEvaluateLisp@@YAHPB_WAAPAUresbuf@@@Z")> _
Private Shared Function acedEvaluateLISP(ByVal strLISPExpression As String, ByRef intHandle As IntPtr) As Integer
End Function
<LispFunction("SelectObjects")> _
Public Function SelectObjects(ByVal rbfArguments As ResultBuffer) As ResultBuffer
Dim rbfReturn As New ResultBuffer
Dim docActiveDrawing As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim objTransManager As DatabaseServices.TransactionManager = docActiveDrawing.TransactionManager
Dim objTransaction As DatabaseServices.Transaction = objTransManager.StartTransaction
Dim objPromptSelectionResult As PromptSelectionResult = docActiveDrawing.Editor.GetSelection()
If (objPromptSelectionResult.Status = PromptStatus.OK) Then
Try
Dim arrSelectionSet() As ObjectId = objPromptSelectionResult.Value.GetObjectIds
For Each intObjectID As ObjectId In arrSelectionSet
Dim entItem As Entity = CType(objTransaction.GetObject(intObjectID, OpenMode.ForWrite, False, True), Entity)
entItem.Layer = "0"
Next
objTransaction.Commit()
rbfReturn.Add(New TypedValue(&H138D, "OK"))
Catch Ex As Exception
rbfReturn.Add(New TypedValue(&H138D, "Catch " & Ex.Message))
Return rbfReturn
End Try
End If
objTransaction.Dispose()
objTransManager.Dispose()
'(entdel (ssname (ssget "p") 0))
EvaluateLispExpression("(entdel (ssname (ssget " & Chr(34) & "P" & Chr(34) & ") 0))")
Return rbfReturn
End Function
Public Shared Function EvaluateLispExpression(ByVal strLISPExpression As String) As ResultBuffer
Dim rbfObject As IntPtr = IntPtr.Zero
Dim rbfReturn As New ResultBuffer
Try
acedEvaluateLISP(strLISPExpression, rbfObject)
If (rbfObject <> IntPtr.Zero) Then
rbfReturn = CType(DisposableWrapper.Create(GetType(ResultBuffer), rbfObject, True), ResultBuffer)
Return rbfReturn
Else
rbfReturn.Add(New TypedValue(&H138D, "Error"))
End If
Catch Ex As System.Exception
rbfReturn.Add(New TypedValue(&H138D, "Error " & Ex.Message))
Return rbfReturn
End Try
Return Nothing
End Function
End Class
The P/Invoke EvaluateLISP is a variation based on this example by Alexander Rivilis
http://cadxp.cadmag.info/XForum+print-fid-42-tid-26781.htmlamong the other variants on the augi, autodesk and swamp discussion groups