Author Topic: Calling a Managed Selection Set from a P/Invoke acedEvaluateLISP  (Read 2831 times)

0 Members and 1 Guest are viewing this topic.

Peter Jamtgaard

  • Guest
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

Code: [Select]
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.html

among the other variants on the augi, autodesk and swamp discussion groups