Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Recover - alle Dateien in Verzeichnis

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
Autor Thema:  Recover - alle Dateien in Verzeichnis (1840 mal gelesen)
GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 24. Jul. 2010 18:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

wie kann ich alle Dateien, die ich in einer Listbox habe mit VB aufrufen, wiederherstellen (recover), bereinigen und speichern?

Vielen Dank schon mal

Georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 24. Jul. 2010 18:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

was hast Du bis jetzt probiert? 

Ich hätte es auf die Einfache gemacht und:

- FILEDIA auf 0 stellen
- EXPERT auf 5 stellen
- Für jedes Element in der Listbox
    - SendCommand _RECOVER ....
    - SendCommand (command "_PURGE" ...
    - und dann speichern
- Next

Oder hast Du bestimmte Detailfragen, woran Du hängst?

- alfred -

------------------
www.hollaus.at

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 24. Jul. 2010 19:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

ich habe das Problem, dass ich die Zeichnungen nicht in Autocad aufgerufen bekomme.

Georg

Den ersten Teil habe ich gefunden:
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html

Imports System

Imports System.Runtime.InteropServices

Imports Autodesk.AutoCAD.Interop

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.ApplicationServices

<CommandMethod("ConnectToAcad")> _

Public Sub ConnectToAcad()

  Dim acAppComObj As AcadApplication

  Dim strProgId As String = "AutoCAD.Application.18"

  On Error Resume Next

  '' Get a running instance of AutoCAD

  acAppComObj = GetObject(, strProgId)

  '' An error occurs if no instance is running

  If Err.Number > 0 Then

      Err.Clear()

      '' Create a new instance of AutoCAD

      acAppComObj = CreateObject("AutoCAD.Application.18")

      '' Check to see if an instance of AutoCAD was created

      If Err.Number > 0 Then

        Err.Clear()

        '' If an instance of AutoCAD is not created then message and exit

        MsgBox("Instance of 'AutoCAD.Application' could not be created.")

        Exit Sub

      End If

  End If

  '' Display the application and return the name and version

  acAppComObj.Visible = True

  MsgBox("Now running " & acAppComObj.Name & " version " & acAppComObj.Version)

  '' Get the active document

  Dim acDocComObj As AcadDocument

  acDocComObj = acAppComObj.ActiveDocument

  '' Optionally, load your assembly and start your command or if your assembly

  '' is demandloaded, simply start the command of your in-process assembly.

  acDocComObj.SendCommand("(command " & Chr(34) & "NETLOAD" & Chr(34) & " " & _

                          Chr(34) & "c:/myapps/mycommands.dll" & Chr(34) & ") ")

  acDocComObj.SendCommand("MyCommand ")

End Sub

[Diese Nachricht wurde von GeorgK am 24. Jul. 2010 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 24. Jul. 2010 21:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

da ist irgendwas leider nicht im Reinen.

Zum einen startest Du mit

Code:
<CommandMethod("ConnectToAcad")>  _
Public Sub ConnectToAcad()
  ....
mal einen Befehl im AutoCAD.

Und dann versuchst Du mit

Code:
acAppComObj = GetObject(, strProgId)
nochmals Zugriff auf den ActiveX-Server von AutoCAD zu bekommen. Dabei hast Du eigentlich schon alles in der Hand, läufst aber Gefahr, sollte ein zweites AutoCAD gestartet sein, dass Du zur falschen AutoCAD-Session geleitet wirst.

Also ich hätte das COM-Objekt der AcadApplication so geholt:

Code:
Dim tAcadAppCOM As Interop.AcadApplication = CType(ApplicationServices.Application.AcadApplication, Interop.AcadApplication)
Und createObject verstehe ich gar nicht mehr, denn Du bist ja schon im AutoCAD, damit brauchst Du sicher keine neue AutoCAD-Instanz anstarten!

Leider den nächsten Irrtum würde ich hier vermuten:

Code:
acDocComObj.SendCommand("(command " & Chr(34) & "NETLOAD" & Chr(34) & " " & _
  Chr(34) & "c:/myapps/mycommands.dll" & Chr(34) & ") ")
Versuchst Du damit Dein DLL zu laden? Aber das läuft doch schon, sonst hättest Du ja oben nicht mit '<CommandMethod...> einen AutoCAD-Befehl deklarieren können.

Was auch immer ich jetzt anders verstehe als Du es planst, lass uns zuerst dazu kommen, dass Du beschreibst, was Du eigentlich gerne hättest, damit ich das mal überblicken kann.

- alfred -

------------------
www.hollaus.at

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 25. Jul. 2010 15:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

ich versuche aus VB Autocad aufzurufen falls es noch nicht gestartet wurde. Wichtig ist, dass  es die richtige Version ist. Danach sollen alle Dateien aus einem Verzeichnis mit recover geöffnet und gespeichert werden. Mein derzeitiger Stand:

User kann das Verzeichnis auswählen und die Dwg's landen in einer Listbox. Weiter bin ich noch nicht gekommen, da ich bis jetzt immer in VBA meine Programme erstellt habe.
Der Aufruf der dll ist für ein weiteres Programm.

Grüße

Georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 25. Jul. 2010 15:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

lade mal die Solution hier hoch (wenn Du willst), dann kann ich es mir schon ansehen.

Wenn nicht, dann erklär mir bitte, wozu Du
dieses:      <CommandMethod("ConnectToAcad")> 
und dieses:  acDocComObj.SendCommand("(command " & Chr(34) & "NETLOAD ...
brauchst, entweder es ist ein definiertes AutoCAD-Command, dann brauchst Du AutoCAD nicht mehr starten und nicht mehr mit _NETLOAD irgendwas laden, was ja offensichtlich schon existiert.

Solange Du diese Dinge aus einer externen EXE und mit SendCommand abhandeln willst (weiß ich ja noch nicht, ob SendCommand gewünscht ist), dann brauchst Du ja auch kein dotNET-dll mehr laden, denn die SendCommand's für _RECOVER und _PURGE kannst Du ja schon direkt von der EXE aus schicken (wie Du ja auch das _NETLOAD zu schicken versuchst).

- alfred -

------------------
www.hollaus.at

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 25. Jul. 2010 15:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Könntest Du mir bitte Deine Lösung posten? Mein "Programm" ist nur eine Ansammlung verschiedener Ansätze. Du kannst gerne SendCommand verwenden.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 25. Jul. 2010 16:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Könntest Du mir bitte Deine Lösung posten?

Ich hab keine fertige Lösung für DEIN  Problem/Deine Aufgabe. Und jetzt das ganze neu erstellen (mit Assembly-Einstellungen, Formular-Design und -Controls-Handling/Events, Code neu schreiben, ...) ist mir aktuell ein zu hoher Zeitaufwand.
Für mich geht es schneller, Deinen Code zu modifizieren (sind voraussichtlich wenige Minuten), neue Projekteinrichtung: da wäre gleich mal ne halbe Stunde weg.

Reduziere Deine Solution auf das Formular-bezogene und lade es hoch oder schick mir PM (mit Link zu einem Upload), ich bau dann das AutoCAD-bezogene dazu, es spart einfach meine Zeit. 

- alfred -

------------------
www.hollaus.at

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 25. Jul. 2010 16:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

ich habe Dir den Code an die Office-Adresse geschickt.

Vielen Dank

Georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 25. Jul. 2010 16:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> ich habe Dir den Code an die Office-Adresse geschickt.

das hat keinen Sinn, denn ich mach das hier privat, aber meine MailAdresse hab ich Dir per PM gesendet.

- alfred -

------------------
www.hollaus.at


Ex-Mitglied

erstellt am: 25. Jul. 2010 19:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

...hatte ein wenig Pause in der Waagrechten, sorry für Verzögerung. 

Nun jetzt weiß ich auch, dass es unhandlich ist, mit _RECOVER ein Document per SendCommand zu machen, geht auch nicht (nahezu kommentierterweise), daher zwei Umleitungen:

a) erst ein Script erzeugen, das mit _RECOVER die Datei erzeugt
b) einen EventHandler installieren, der das Ende des Doc-Opens überwacht und dann das AUDIT beginnt.

Ein Auszug daraus (Dein Projekt bekommst Du per PM).
VORSICHT ich hab da nix ausreichend getestet und es gibt sicher noch ein paar mögliche Exceptions abzufangen, Verweise musst Du aktualisieren und Achtung auf 64bit/32bit, wenn Deine EXE anders arbeitet als Dein AutoCAD, gibt's Brösel.

Code:
  Private Const pAcadApp_ActiveX_IDStr As String = "AutoCAD.Application.18"
  Private pAcadAppCOM As Interop.AcadApplication = Nothing


  Private Function convertFile(ByVal FileName As String) As Boolean
      Dim tRetVal As Boolean = True
      Dim tAcadAppCOM As Interop.AcadApplication = getAcadSession()
      If tAcadAppCOM IsNot Nothing Then
        Try
            If tAcadAppCOM.Documents.Count = 0 Then tAcadAppCOM.Documents.Add() 'mal eine Zeichnung öffnen, damit wir ein Document haben
            If tAcadAppCOM.Documents.Count = 1 Then
              Dim tCurrentDocName As String = tAcadAppCOM.ActiveDocument.Name
              Dim tFileDiaPrev As Integer = CInt(tAcadAppCOM.ActiveDocument.GetVariable("FILEDIA"))
              Dim tSdiPrev As Integer = CInt(tAcadAppCOM.ActiveDocument.GetVariable("SDI"))
              tAcadAppCOM.ActiveDocument.SetVariable("FILEDIA", 0)
              tAcadAppCOM.ActiveDocument.SetVariable("SDI", 1)
              AddHandler tAcadAppCOM.EndOpen, AddressOf EndOpenHandler
              tAcadAppCOM.ActiveDocument.SendCommand("(command ""_.script"" """ & vbCr & createScriptForRecover(FileName).Replace("\", "/") & """)" & vbCr)
              tAcadAppCOM.ActiveDocument.SetVariable("FILEDIA", tFileDiaPrev)
              tAcadAppCOM.ActiveDocument.SetVariable("SDI", tSdiPrev)
              RemoveHandler pAcadAppCOM.EndOpen, AddressOf EndOpenHandler
            Else
              'mehr als ein DOC geöffnet, damit können wir nicht SDI auf 1 schalten

            End If
        Catch ex As Exception
            Call MsgBox("Unbekannter Fehler durch Zeichnung '" & FileName & "'" & vbNewLine & ex.Message)
        End Try
      Else
        'oops, kein AutoCAD da? Dann EXIT mit Exception
        Throw New Exception("Got no AcadSession, Cancel")
        tRetVal = False
      End If
      Return tRetVal
  End Function

  Private Function getAcadSession() As Interop.AcadApplication
      Dim tRetVal As Interop.AcadApplication = pAcadAppCOM
      If tRetVal Is Nothing Then
        'dann muessen wir AutoCAD starten
        Dim tAcadApp As Interop.AcadApplication = Nothing
        Try
            'mal probieren, auf eine bestehende Acad-Session zu bekommen
            tAcadApp = CType(GetObject(, pAcadApp_ActiveX_IDStr), Interop.AcadApplication)
        Catch ex As Exception
            'ok, offensichtlich keine AcadSession gefunden, dann starten wir eben eine
            Try
              tAcadApp = CType(CreateObject(pAcadApp_ActiveX_IDStr), Interop.AcadApplication)
            Catch ex2 As Exception
              'auch nicht startbar, schlecht, dann kommt nix zurueck und oben wird dann Exception ausgeloest
            End Try
        End Try
        If tAcadApp IsNot Nothing Then
            tAcadApp.Visible = True
            tRetVal = tAcadApp
            pAcadAppCOM = tAcadApp
        End If
      End If
      Return tRetVal
  End Function
  Private Function closeAcadSession()
      If pAcadAppCOM IsNot Nothing Then
        Try
            pAcadAppCOM.Quit()  'aufpassen, dass nicht von vorher offene Zeichnungen ungespeichert vorhanden sind!!!
        Catch ex As Exception
            Call MsgBox("AutoCAD kann nicht beendet werden" & vbNewLine & ex.Message)
        End Try
        pAcadAppCOM = Nothing
      End If
  End Function

  Private Sub EndOpenHandler()
      'das hier kommt, wenn die Zeichnung fertig geöffnet wurde, dann starten wir AUDIT, SAVE, ...
      pAcadAppCOM.ActiveDocument.SendCommand("(command ""_.AUDIT"" ""_Y"")" & vbCr)
      pAcadAppCOM.ActiveDocument.Save()
  End Sub

  Private Function createScriptForRecover(ByVal DwgFileName As String) As String
      Dim tTempPath As String = My.Computer.FileSystem.SpecialDirectories.Temp
      Dim tScrFile As String = My.Computer.FileSystem.CombinePath(tTempPath, "myRecover.scr")
      Dim tStr As String = ""
      tStr &= "_.RECOVER" & vbNewLine
      tStr &= DwgFileName & vbNewLine & vbNewLine
      Call My.Computer.FileSystem.WriteAllText(tScrFile, tStr, False)
      Return tScrFile
  End Function



- alfred -

------------------
www.hollaus.at

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

erstellt am: 25. Jul. 2010 19:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

vielen Dank für das Programm. Bin gerade am testen.

Viele Grüße

Georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

GeorgK
Mitglied



Sehen Sie sich das Profil von GeorgK an!   Senden Sie eine Private Message an GeorgK  Schreiben Sie einen Gästebucheintrag für GeorgK

Beiträge: 619
Registriert: 06.06.2001

Inventor 2017
Siemens NX 8.5 - 12.0
Autocad Mechanical 2017
Catia V5R19
3,4 GHz; 64 GB RAM
Windows 10
openSUSE Leap 42.3
Visual Studio 2010 - 2017
Windows 2012 R2
Vault 2017

erstellt am: 25. Jul. 2010 20:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

1A Sahne. Bin echt begeistert.

Viele Grüße

Georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz