| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Zugriff auf iPropertiy mit Dateiname (1894 / mal gelesen)
|
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 03. Jul. 2020 11:55 <-- editieren / zitieren --> Unities abgeben:
Ich beginne mich gerade erst mit VBA zu beschäftigen, bin also noch Anfänger. Bitte also etwas Nachsicht. Ich möchte auf den Dateinamen (ohne Pfad) der gerade geöffneten Inventordatei zugreifen, d.h. sie als String in eine Variable einlesen. Leider kann ich die entsprechende iProperty (im Reiter "Allgemein" oben der erste Eintrag) nicht unter ThisApplication.ActiveDocument finden. Alternativ habe ich ThisApplication.ActiveDocument.DisplayName verwendet. Das funktioniert erst mal, aber wenn das Inventorteil im Baum umbenannt wurde, dann entspricht der Eintrag nicht mehr dem Dateinamen. Ich hoffe, ich habe es nachvollziehbar erklärt und es findet sich jemand, der die Lösung kennt. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 03. Jul. 2020 14:12 <-- editieren / zitieren --> Unities abgeben:
Ich habe etwas herumprobiert. Man kann ThisApplication.ActiveDocument.DisplayName auf den eigentlichen Dateinamen zurücksetzen, indem man "" zuweist. Wenn der alte Name (Umbenennung) noch benötigt wird, kann man in vorher in einer temporären Variable zwischensichern und später zurückschreiben. Das funktioniert einigermaßen. Inventor ignoriert aber nach dem Zurückschreiben in der Umbenennung manche Endungen ( "XXXXX.ipt" wird zu "XXXXX" ) Ich finde sowieso solche Umbenennungen ungünstig und vermeide sie. Dennoch ist es eben nicht ganz sauber. Ein Zugriff auf den Dateinamen ohne über ThisApplication.ActiveDocument.DisplayName zu gehen, wäre mir also lieber. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 03. Jul. 2020 18:41 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
|
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 03. Jul. 2020 21:53 <-- editieren / zitieren --> Unities abgeben:
Danke für die Hinweise. Ich mache ja was ähnliches. Ich möchte Pfad und Dateinamen getrennt in jeweils einzelne Variablen als String. Bislang löse ich das so: Sub Ersetzen() Dim eString As String eString = ThisApplication.ActiveDocument.FullDocumentName ' Eingabestring = gesamter Pfad + Dateiname MsgBox ("Eingabestring: " & eString) Dim tempString As String tempString = ThisApplication.ActiveDocument.DisplayName ' Inhalt von DisplayName wird zwischgespeichert ThisApplication.ActiveDocument.DisplayName = "" ' DisplayName wird auf Dateinamen zurück gesetzt Dim dString As String dString = ThisApplication.ActiveDocument.DisplayName ' Suchstring = Dateiname MsgBox ("Dateiname: " & dString) Dim aString As String ' Ausgabestring aString = Replace(eString, "\" & dString, "") ' Ausgabestring = Dateipfad ohne Dateiname und ohne "\" am Ende MsgBox ("Dateipfad: " & aString) ThisApplication.ActiveDocument.DisplayName = tempString ' DisplayName wird auf alten zwischengespeichertem Inhalt zurück gesetzt End Sub Das funktioniert so weit, aber scheint mir noch etwas umständlich und ist nicht ganz sauber, da das Zurückschreiben u.U. nicht korrekt erfolgt. Ich werde mal die verlinkten Beispiele begutachten, oder jemand hat noch eine bessere Idee.
. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 200x, Civil, LDD, MDT, ARD, ACA(ADT) Inventor AIP 4-11,200x WinXP, W2K
|
erstellt am: 05. Jul. 2020 01:16 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
|
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 05. Jul. 2020 20:20 <-- editieren / zitieren --> Unities abgeben:
|
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 07. Jul. 2020 15:15 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo, wie man den Fullname auseinandernimmt: Code:
Sub Dateinamensplit() Dim sDateiName As String ' Dateiname Dim sPfadName As String ' Pfadname Dim sFullName As String 'kompletter (full-) NameIf ThisApplication.ActiveDocument Is Nothing Then Exit Sub 'Raus, wenn keine Datei geöffnet ist sFullName = ThisApplication.ActiveDocument.FullFileName ' kompletten Namen holen If sFullName = "" Then Exit Sub ' Raus wenn Datei ungespeichert (dann ist fullfilename leer, bzw. filesavecounter=0) 'Dateiname steht nach dem letzten slash sDateiName = Right(sFullName, Len(sFullName) - InStrRev(sFullName, "\")) 'holt den Dateinamen sPfadName = Left(sFullName, InStrRev(sFullName, "\")) ' holt den Pfad 'Debugausgabe ins Direktfenster (ggf. Strg+G zur Anzeige): Debug.Print sFullName Debug.Print sPfadName Debug.Print sDateiName End Sub
Anmerkungen: In ThisApplication.ActiveDocument.FullFileName ist der komplette Dateinamen zu finden. Displayname bezeichnet den im Browser (oder anderweitig, bspw. in der dwf-Ausgabe) angezeigten Namen - dieser kann vom Benutzer verändert werden und hat auf den Dateinamen keinen Einfluß. Oben ist das letzte Zeichen des Pfades der Backslash "\", sollte das nicht gewünscht sein, dann
Code:
sPfadName = Left(sFullName, InStrRev(sFullName, "\")-1)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 07. Jul. 2020 15:37 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Frank, FullDocumentName beinhaltet auch - in spitzen Klammern eingeschlossen - die aktive Detailgenauigkeit. Displayname auch - hier allerdings in runde Klammern eingeschlossen. Da wir es aber auf den Datei- und nicht auf einen Anzeigenamen abgesehen haben, wäre die passendere Stelle ThisApplication.ActiveDocument.FullFileName, um Pfad- und Dateinamen daraus zu setzieren. etwas sperrig (und ohne jegliche Überprüfung auf irgendwas):
Code:
DateiName = Right(ThisApplication.ActiveDocument.FullFileName, Len(ThisApplication.ActiveDocument.FullFileName) - InStrRev(ThisApplication.ActiveDocument.FullFileName, "\")) Pfad = Left(ThisApplication.ActiveDocument.FullFileName, InStrRev(ThisApplication.ActiveDocument.FullFileName, "\"))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 07. Jul. 2020 16:23 <-- editieren / zitieren --> Unities abgeben:
Bei mir funktioniert sowohl ThisApplication.ActiveDocument.FullFileName als auch ThisApplication.ActiveDocument.FullDocumentName Ich benutze aktuell die Split-Funktion: Sub Test2() Dim sFullFileName As String sFullFileName = ThisApplication.ActiveDocument.FullFileName Dim oArray() As String oArray = Split(sFullFileName, "\") ' Feld wird gefüllt, Trennung durch "\" Dim sFileName As String sFileName = oArray(UBound(oArray)) ' Nur das letzte Feld beinhaltet den Dateinamen MsgBox ("Dateiname: " & sFileName) Dim sPfad As String ' Ausgabestring sPfad = Replace(sFullFileName, "\" & sFileName, "") ' Ausgabestring = Dateipfad ohne Dateiname und ohne "\" am Ende MsgBox ("Dateipfad: " & sPfad) End Sub Zwischenzeitlich hatte ich eine Variante, bei der ich den Eingabestring reversiert habe, dann das erste "\" gesucht und den String dort getrennt. Zum Schluss beide Teilstrings wieder reversiert. Da kannte ich die UBound-Funktion noch nicht. Bin ja noch blutiger Anfänger.
.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 07. Jul. 2020 16:41 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Zitat: Original erstellt von Frankx: Bei mir funktioniert sowohl ThisApplication.ActiveDocument.FullFileName als auch ThisApplication.ActiveDocument.FullDocumentName
Es ist aber nicht dasselbe. Beim Fulldocumentname hängt bei einer iam evtl. noch die Detailgenauigkeit dran Zitat:
Ich benutze aktuell die Split-Funktion:
Warum? Was lässt sich über die gesuchten Elemente Dateiname und Pfad in einem String, der beides enthält (also der FullFilename ist), sicher sagen? Der Pfad endet mit dem letzten Backslash, und der Dateiname fängt nach dem letzten Backslash an. Also ermittelt man mit instrrev genau dessen Position. Vor der Pos. ist der Pfad, danach der Dateiname. Zitat:
Zwischenzeitlich hatte ich eine Variante, bei der ich den Eingabestring reversiert habe, dann das erste "\" gesucht und den String dort getrennt. Zum Schluss beide Teilstrings wieder reversiert. Da kannte ich die UBound-Funktion noch nicht. Bin ja noch blutiger Anfänger.
Macht nix, wir haben alle irgendwie mal angefangen. Dabei ist das Forum hier auch bzgl. VBA sehr hilfreich, da eine wahre Fundgrube.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 08. Jul. 2020 08:57 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bkrüger: Hallo Frank, FullDocumentName beinhaltet auch - in spitzen Klammern eingeschlossen - die aktive Detailgenauigkeit. Displayname auch - hier allerdings in runde Klammern eingeschlossen.Da wir es aber auf den Datei- und nicht auf einen Anzeigenamen abgesehen haben, wäre die passendere Stelle ThisApplication.ActiveDocument.FullFileName, um Pfad- und Dateinamen daraus zu setzieren. etwas sperrig (und ohne jegliche Überprüfung auf irgendwas):
Code:
DateiName = Right(ThisApplication.ActiveDocument.FullFileName, Len(ThisApplication.ActiveDocument.FullFileName) - InStrRev(ThisApplication.ActiveDocument.FullFileName, "\")) Pfad = Left(ThisApplication.ActiveDocument.FullFileName, InStrRev(ThisApplication.ActiveDocument.FullFileName, "\"))
Das ist eine sehr kompakte Variante. Allerdings hängt hier beim Pfad immer noch das "\" am Ende dran. Das auch noch weg zu bekommen ist aber kein Problem. Mir reicht vorerst der Dateiname. Wieder was gelernt. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 55 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 08. Jul. 2020 09:08 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bkrüger:
Es ist aber nicht dasselbe. Beim Fulldocumentname hängt bei einer iam evtl. noch die Detailgenauigkeit dran
Danke für den Hinweis. Ich habe den Unterschied getestet und erst jetzt richtig begriffen. Das ist ein wichtiger Punkt, da es u.U. zu Ausgabefehlern oder Programmabbruch führen kann. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 08. Jul. 2020 15:53 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Zitat: Original erstellt von Frankx:
Das ist eine sehr kompakte Variante. Allerdings hängt hier beim Pfad immer noch das "\" am Ende dran. Das auch noch weg zu bekommen ist aber kein Problem. .
Man muss es ja nicht weg bekommen - man schneidet einfach ein Zeichen früher ab:
Code:
Pfad = Left(ThisApplication.ActiveDocument.FullFileName, InStrRev(ThisApplication.ActiveDocument.FullFileName, "\")-1)
Ich verwende Pfadnamen innerhalb meiner Scripte immer mit abschließenden Backslash, macht sich einfacher wenn man sich Pfade und Namen zusammentackert. Ist aber letztlich Geschmackssache.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |