Posts: 5
Registered: ‎01-26-2014
Message 1 of 3 (166 Views)
Accepted Solution

Selecting then modifing results from import command, interop

166 Views, 2 Replies
01-28-2014 09:27 PM
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Interop
Imports System.Object
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.Internal.Forms
Imports System
Imports System.IO
Imports System.Runtime.InteropServices

Namespace TestSelecting
    Public Class MyCommands

        <CommandMethod("Program")> Public Sub Program()
            '' Get the current document editor
            Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim acCurDb As Database = acDoc.Database
            Dim acDocEd As Editor = acDoc.Editor
            Dim AcadApp As Autodesk.AutoCAD.Interop.AcadApplication
            Dim acadDoc As Autodesk.AutoCAD.Interop.AcadDocument

            AcadApp = CType(GetObject(, "AutoCAD.Application.18.2"), Autodesk.AutoCAD.Interop.AcadApplication)
            '' Start a transaction
            Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

                Dim ssetObj As AcadSelectionSet

                '' Request for objects to be selected in the drawing area
                Dim acSSPrompt As PromptSelectionResult = acDocEd.GetSelection(acSelFtr)

                '' If the prompt status is OK, objects were selected
                If acSSPrompt.Status = PromptStatus.OK Then
                    Dim acSSet As SelectionSet = acSSPrompt.Value

                    '' Step through the objects in the selection set
                    For Each acSSObj As SelectedObject In acSSet

                        '' Check to make sure a valid SelectedObject object was returned
                        If Not IsDBNull(acSSObj) Then
                            '' Open the selected object for write
                            Dim acEnt As Entity = CType(acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite), Entity)
                            If Not IsDBNull(acEnt) Then
                                acadDoc = AcadApp.ActiveDocument

                                Dim point(0 To 2) As Double
                                point(0) = 2.0
                                point(1) = 2.0
                                point(2) = 0.0

                                Dim afterWMFObj As Object
                                afterWMFObj = acadDoc.Import("C:\Users\C\Documents\Drawing1.wmf", point, 2.0)
                                Dim newEntity As Entity = CType((acTrans.GetObject(CType(afterWMFObj, ObjectId), OpenMode.ForWrite)), Entity)

                                newEntity.ColorIndex = 3

                            End If
                        End If


                    '' Save the new object to the database
                End If

                '' Dispose of the transaction
            End Using
        End Sub

    End Class
End Namespace


************** Exception Text **************
System.InvalidCastException: Specified cast is not valid.
   at TestSelectingFiltering.TestSelecting.MyCommands.FilterBlueCircleOnLayer0()
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

 I'm trying to be able to add the results from the imported WMF into an entity, so that I'll be able to modify it later.

I keep getting this error. In this code I'm trying to change the imported WMF drawing to a green color.


Any help would be Awesome! -Thanks

*Expert Elite*
Posts: 987
Registered: ‎04-27-2009
Message 2 of 3 (133 Views)

Re: Selecting then modifing results from import command, interop

01-29-2014 07:06 AM in reply to: cyconnely

Have you debugged by stepping through the code line-by-line? Instead of posting a big chunk of code and exception message at the end, it would be nicer to people who may help you to do your due dilligent work to pointing out which line of the code actually causes the exception.


There are a few things regarding your code:


1. It is not necessary to use VB's GetObject() to get an COM AutoCAD application object. It is especially not good to tie the code with specific version of AutoCAD by using "AutoCAD.Application.18.2", becuse your code is .NET API code that runs inside AutoCAD, whatever version it is would be irrelevent. You obtain the COM AcadApplication by:


AcadApp=CType(Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication, AcadApplication)


As matter of fact, you do not need an AcadApplication object in this importing process. What you need is AcadDocument from current MdiActiveDocument:


Dim acadDoc As AcadDocument=CType(Application.DocumentManager.MdiActiveDocument.AcadDocument, AcadDocument)


2. I do not see why asking user to select entity or entities and has anything to do with importing WMF. Or maybe you just omitted something irrelevant with this exception, if so, forget my questioning on this.


3. From my observation of the code, the exception is after the importing is completed and when you attempt to obtain the imported entity:


Dim newEntity As Entity = CType((acTrans.GetObject(CType(afterWMFObj, ObjectId), OpenMode.ForWrite)), Entity)


Do you know what type of entity is created when an WMF file is imported into AutoCAD? It is definitely not an ObjectId in Autodesk.AutoCAD.DatabaseService namespace, thus CType(afterWMFObj, ObjectId) fails.


According to AutoCAD VBA help document, WMF file is imported into AutoCAD as AcadBlockreference (an COM object). So, after imported into AutoCAD in .NET API code, you need to obtain an .NET API object froom the COM object. The code would be like:


Dim afterWMFObj As Object
afterWMFObj = acadDoc.Import("C:\Users\C\Documents\Drawing1.wmf",....)


Dim objId As ObjectId = Entity.FromAcadObject(afterWMFObj)

Dim newEnt As Entity=acTrans.GetObject(objId,OpenMode.ForWrite)



Posts: 5
Registered: ‎01-26-2014
Message 3 of 3 (124 Views)

Re: Selecting then modifing results from import command, interop

01-29-2014 07:59 AM in reply to: norman.yuan
Thank you so much!

You were right about the AcadApp, I guess that's what I get for using code scavenged on the internet... the other fragments of code were from some other things that I took out. And your objId code worked great! Thanks again, And I don't know why I never thought to look at the vba reference for the import command... duh.
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.
Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.