none
Ayuda con un error en Visual Studio RRS feed

  • Pregunta

  • Buenas tardes,

    no sé si alguien me puede ayudar con esto. He generado el siguiente código:

    'Contains the AutoCad type Library

    Imports Autodesk.AutoCAD.Interop

    'Contains the AutoCad/ObjectDBX Tpe Library

    Imports Autodesk.AutoCAD.Interop.Common

    Public Class UserForm1

        Public ReadOnly Property thisdrawing As AcadDocument

            Get

                Return Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument

            End Get

        End Property

        Private Sub RutaDWG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RutaDWG.Click

            Hide()

            alertLabel.Text = ""

            TextBoxDWG.Text = getarchivo("dwg", "4")

            Show()

        End Sub

        Public Function getarchivo(ByVal ext As String, ByVal tipo As String) As String

            thisdrawing.SendCommand("(setq f (open " & Chr(34) & "c:\\VarTemp" & Chr(34) & " " & Chr(34) & "w" & Chr(34) & "))")

            ThisDrawing.SendCommand("(setq tmp (getfiled " & Chr(34) & "Directorio" & Chr(34) & " " & Chr(34) & "c:/" & Chr(34) & " " & Chr(34) & "dwg" & Chr(34) & " " & tipo & ")) ")

            ThisDrawing.SendCommand("(write-line (vl-filename-directory tmp)f)")

            ThisDrawing.SendCommand("(write-line " & Chr(34) & "" & Chr(34) & " f) ")

            ThisDrawing.SendCommand("(close f)")

            FileOpen(1, "c:\VarTemp", OpenAccess.Write)

            Input(1, getarchivo)

            FileClose(1)

        End Function

        Private Sub Aceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aceptar.Click

            Hide()

            Dim dire As String

            Dim argumentos() As Object

            dire = TextBoxDWG.Text

            If dire = "" Then

                alertLabel.Text = "El directorio de ficheros .DWG no es válido"

                Show()

                Exit Sub

            End If

            ReDim argumentos(1)

            argumentos(1) = (dire + "\")

            recorrer_dire(argumentos)

        End Sub

        Sub recorrer_dire(ByVal argumentos As Object)

            Dim i As Integer

            Dim sDir As String

            Dim dire As String

            dire = argumentos(0)

            i = 0

            sDir = Dir(dire & "*.dwg")

            Do

                If sDir <> "" Then

                    i = i + 1

                    ThisDrawing.Application.Documents.Open(dire & sDir)

                    ThisDrawing.SendCommand("z" & vbCr)

                    ThisDrawing.SendCommand("e" & vbCr)

                    ThisDrawing.SendCommand("(vl-load-com)")

                    ThisDrawing.SendCommand("(load " & """c:/insertared.lsp""" & ")" & vbCr)

                    ThisDrawing.SendCommand("(c:iedic" & ")" & vbCr)

                    ThisDrawing.Application.Documents.Item(1).Save()

                    ThisDrawing.Application.Documents.Item(1).Close()

                End If

                sDir = Dir()

            Loop Until sDir = ""

            MsgBox(i & "FICHEROS PROCESADOS")

        End Sub

        Private Sub Salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Salir.Click

            End

        End Sub

        Private Sub UserForm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        End Sub

    End Class

    Es un código que he realizado con Visual Studio 2010. Es un programa para abrir un conjunto de planos de AutoCad, de modo que, cuando ejecuto el fichero exe (ubicado en la ruta “/bin/Debug”) que genero desde la opción: “build” de VS, aparece el cuadro de diálogo que he diseñado, es un cuadro de diálogo muy sencillito, con un botón que si lo selecciono me abre el típico explorador para navegar entre las carpetas y seleccionar la ruta donde tengo los planos en los que quiero añadir la edición.

    Una vez seleccionados, el programa vuelve a este cuadro de diálogo, y mediante otro botón me permite seleccionar la edición que quiero insertar en cada plano, la edición es simplemente otro fichero de AutoCad con unos textos (Revisión, fecha, iniciales, etc..)

    Como se observa en el código, utilizo para insertar la edición una rutina realizada en AutoLisp.

    El problema que tengo es que cuando hago doble click sobre el fichero ejecutable, me aparece el cuadro de diálogo anterior, hasta ahí perfecto, pero al hacer click sobre el botón “Ficheros DWG” para seleccionar los planos en dwg me dá el siguiente error:

    (Ver Figura 1 al final de este correo)

    Esto que he comentado es el error que me da cuando ejecuto el fichero .exe.

    Pero cuando estoy en Visual Studio me da estos warnings que se ven en la figura siguiente:

    (Ver Figura 2 al final de este correo)

    Pero aun con estos warnings me deja realizar el fichero ejecutable con la opción: “Build” que he comentado antes.

    Perdón por el correo tan extenso. A ver si alguien me puede orientar sobre esto.

    Muchas gracias y un saludo.

    Figura 1:

    Figura 2:

    martes, 10 de septiembre de 2013 14:08

Todas las respuestas

  • 1.- tienes en tu directorio bin el ensamblado acmgd.dll? Has agregado su referencia al proyecto?

    2.- te recomiendo declarar una variable, para establecerla en el Input y al final de la función Return variable_nueva


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    • Editado Sergio Parra martes, 10 de septiembre de 2013 16:54
    martes, 10 de septiembre de 2013 16:53
  • Hola Sergio,

    1-      1- Creo que este primer paso que comentas si que lo he hecho, comentarte que estoy aprendiendo a utilizar Visual Studio y a programar en VB.Net, por lo que mis conocimientos son algo limitados. Incluso la figura siguiente para que veas lo que hice, en la pestaña “Referencias” añadí los ficheros: “acdbmgd.dll” y “acmgd.dll” y como se observa la “Copia Local” la puse a Falso. Me parece que es esto a lo que te refieres no?

    2-    Voy a probar a introducir una variable.

    Muchas gracias por tu ayuda Sergio.

    Javi


    miércoles, 11 de septiembre de 2013 6:36
  • Hola javi,

    1.- Si, establece como copia local ok?

    2.- puedes escribirnos tu código con la ópción "insertar bloque de código" que aparece cuando editas una respuesta? Es en la barra del cuadro de edicion de las respuestas el segundo por la derecha

    gracias!


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 11 de septiembre de 2013 6:46
  • FileOpen(1, "c:\VarTemp", OpenAccess.Write)
     
    Input(1, getarchivo)
     
    FileClose(1)
    

    Esta parte no la entiendo muy bien, qué quieres hacer ??

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 11 de septiembre de 2013 6:51
  • Si quieres escribir en un fichero

    FileOpen(1, "c:\VarTemp", OpenAccess.Write)
     
    Write(1, TU_VARIABLE)
     
    FileClose(1)


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 11 de septiembre de 2013 6:56
  • Es un fichero temporal que se crea en el directorio raiz. Para copiar datos de el y luego extraerlos.

    El problema es que este código se realizó en el editor de VB de AutoCad, es decir, como el VB6, y funciona perfectamente, y yo lo estuve migrando a VB.Net, y es precisamente aquí donde tengo las dudas y donde me dan los dos Warnings que indicaba en el mensaje de apertura.

    Saludos

    miércoles, 11 de septiembre de 2013 7:09
  • Puedes poner el código vb6 de la funcion Public Function getarchivo para ver como se ha convertido a .net??

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 11 de septiembre de 2013 7:24
  • Muchas gracias Sergio,

    ahora ando un poco liado en el trabajo, pero cuando salgo voy a probar lo que me has comentado a ver que tal.

    Muchas gracias y un saludo, ya te diré si lo he solucionado con lo que me dices.

    miércoles, 11 de septiembre de 2013 8:18
  • Perdona Sergio no había visto tu último mensaje.

    Este es el código en VB de la función getarchivo:

    Public Function getarchivo(ext As String, tipo As String) As String

    ThisDrawing.SendCommand "(setqf (open " &Chr(34) & "c:\\VarTemp" &Chr(34) & " " &Chr(34) & "w" &Chr(34) & "))"

    ‘Creo un fichero temporal, mediante la función “open”, llamado: “VarTemp” directamente en el c:, con permisos de escritura: “w”. Mediante la función: “setq” de visuallisp este fichero temporal se asocia con el descriptor de fichero: “f”. (" &Chr(34) & "equivale a comillas).

    ThisDrawing.SendCommand "(setqtmp (getfiled " &Chr(34) & "Directorio" &Chr(34) & " " &Chr(34) & "c:/" &Chr(34) & " " &Chr(34) & "dwg" &Chr(34) & " " &tipo& ")) "

    ‘La function “getfiled” de visuallisp muestra un cruadro de dialogo típico de Windows para buscar ficheros. El cuadro de diálogo aparece con el título: Directorio, la búsqueda la sitúa en el directorio raíz: c:/, buscando archivos de tipo: dwg. Y mediante la función “setq” lo asocio a la variable “tmp”.

    ThisDrawing.SendCommand "(write-line (vl-filename-directory tmp) f)"

    ThisDrawing.SendCommand "(write-line" &Chr(34) & "" &Chr(34) & " f) "´

    ThisDrawing.SendCommand "(close f)"

    Open "c:\VarTemp" For Input As #1

    Input #1, getarchivo

    Close #1

    End Function

    Un saludo

    miércoles, 11 de septiembre de 2013 9:18
  • Ves este código ??

    Open "c:\VarTemp" For Input As #1 --> en .net deberias abrir dicho fichero como lectura

    sería

    FileOpen(1, "c:\VarTemp", OpenAccess.Read) <<-- El archivo debe existir sino te saltara una excepcion


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    • Editado Sergio Parra miércoles, 11 de septiembre de 2013 9:29
    miércoles, 11 de septiembre de 2013 9:28
  • Tu codigo quedaria asi entonces

    Dim linea As String = String.Empty
    
    Try
       FileOpen(1, "c:\VarTemp", OpenAccess.Read) 
       Input(1, linea) 
       FileClose(1)
    Catch ex As Exception
       MessageBox.Show(ex.Message)
    End Try
    
    Return linea



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos



    • Editado Sergio Parra miércoles, 11 de septiembre de 2013 9:33
    miércoles, 11 de septiembre de 2013 9:31
  • Muchisimas gracias Sergio,

    cuando tenga un rato lo pruebo y te cuento.

    Saludos

    miércoles, 11 de septiembre de 2013 10:23
  • Hola,<o:p></o:p>

    Sergio ya he probado lo que me has comentado, incluyendo la excepción, y ya no aparece ningún warning ni errores, como se ve en la siguiente captura de pantalla:

    <o:p></o:p>

    pero cuando lo ejecuto me sigue ocurriendo lo mismo, si que me aparece el cuadro de dialogo con los botones, el que yo he creado, y cuando hago click en el boton para seleccionar los ficheros me sale el mensaje de error que he puesto en el primer mensaje y que habla de "Que no se puede cargar el archivo o ensamblado 'acmgd.dll'....."<o:p></o:p>

    Voy a ver si sigo investigando y averiguo que puede ser..<o:p></o:p>

    Saludos<o:p></o:p>

    <o:p></o:p>

    miércoles, 11 de septiembre de 2013 14:32
  • Hola,

    he estado buscando información por internet y lo que he encontrado sobre este problema que me ocurre, es que parece ser que los archivos como: acmgd.dll de la API.Net no pueden usarse en archivos ejecutables.

    La cuestión entonces es: cómo puedo realizar llamadas desde un código realizado en VB.Net para que abra otro programa como AutoCad?

    No sé si alguien podrá ayudarme con esto, porque me he quedado un poco atascado, de todas formas seguiré investigando por ahí.

    Saludos

    martes, 17 de septiembre de 2013 6:36
  • Hola,

    he encontrado esto: 

    http://docs.autodesk.com/ACD/2013/DEU/index.html?url=files/GUID-C8C65D7A-EC3A-42D8-BF02-4B13C2EA1A4B.htm,topicNumber=d30e709685

    es un link que lleva a un apartado de la ayuda de AutoCad. Creo que con esto queda claro que lo que intentaba hacer no es posible.

    Gracias y un saludo.

    lunes, 7 de octubre de 2013 12:22