| |  | 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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 24. Jul. 2010 18:14 <-- editieren / zitieren --> Unities abgeben:         
|
Ex-Mitglied
|
erstellt am: 24. Jul. 2010 18:57 <-- editieren / zitieren -->
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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 24. Jul. 2010 19:14 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 25. Jul. 2010 15:18 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 25. Jul. 2010 15:59 <-- editieren / zitieren --> Unities abgeben:         
|
Ex-Mitglied
|
erstellt am: 25. Jul. 2010 16:09 <-- editieren / zitieren -->
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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 25. Jul. 2010 16:36 <-- editieren / zitieren --> Unities abgeben:         
|
Ex-Mitglied
|
erstellt am: 25. Jul. 2010 16:39 <-- editieren / zitieren -->
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 / zitieren -->
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
  
 Beiträge: 619 Registriert: 06.06.2001
|
erstellt am: 25. Jul. 2010 19:48 <-- editieren / zitieren --> Unities abgeben:         
|
GeorgK Mitglied
  
 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 / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |