Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Einschränkungen beim Befehl open?

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
Autor Thema:  Einschränkungen beim Befehl open? (2217 mal gelesen)
AB-CAD
Mitglied
techn. Zeichner/Sachbearbeiter HLS

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

Beiträge: 8
Registriert: 30.08.2005

8 PC mit ACAD 2000 - 2006
diverse Haustechnik-Komponenten von
CATS, Linear, ESS und AB-CAD Eigenbau

erstellt am: 26. Jul. 2006 15:00    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,

muß leider schon wieder mal ein Thema aufwärmen, das wohl mehr user plagt

gab schon mal einen ähnlichen Beitrag in 10/2003 von Peter2, der jedoch nicht zufriedenstellend aufgelöst wurde
http://ww3.cad.de/cgi-bin/ubb/forumdisplay.cgi?action=topics&forum=Lisp&number=145

Der Lisp-Befehl open scheint nicht mit allen Pfadnamen zufrieden zu sein

Hier Auszüge aus meinem Quellcode:


(setq dn2 (getvar "dwgname"))

; Name ohne .dwg-Endung
(while (= T (wcmatch dn2 "*`.*"))(setq dn2 (substr dn2 1 (1- (strlen dn2)))))

; neue Endung anhängen
(setq dn (strcat (getvar "dwgprefix") dn2 ".chg"))

; in diesem Fall soll die Datei neu erzeugt werden
(setq l-dat (open dn "w"))


; hier wird nil zurückgegeben, die Datei jedoch trotzdem erzeugt
; und genau hier liegt wohl der Hase im Pfeffer!!!
; gibt es hier irgendeine Erklärung oder Abhilfe über vl- bzw. vla-Befehle

; das hier ist eine Liste aus unterschiedlich vielen Teststrings (Anwendungsabhängig)
(setq la-dat-list (reverse la-dat-list))

; da der Dateideskriptor l-dat den Wert nil erhalten hat, wird die Datei auch nicht gefüllt und bleibt leer
(foreach li la-dat-list (write-line li l-dat))

und hier das aktuelle Beispiel, in dem es nicht Funktioniert.
Auch hier das gleiche Phänomen wie bei Peter2, dass das Ganze bei kürzerem Pfadangaben problemlos funktioniert

(open "N:\\18-02 Daun\\7_CAD\\Umbau 1.OG Ortho+Physik\\ankommende
Pläne\\A_Plan06\\Eingang_060721\\1og physikalische therapie und klad
orthopädie.chg" "w")

eindeutig unter 255 Zeichen, jedoch Leerzeichen und Umlaute drin.
Der Pfad war eine ACAD-Rückgabe von dwgprefix

N: ist ein Netzwerkpfad
Das System ist Windows 2000
Schreib- und Lesezugriff ist gewährleistet

Viele Grüße
von AB-CAD

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

andi2050
Mitglied



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 28. Jul. 2006 01:20    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 Nur für AB-CAD 10 Unities + Antwort hilfreich

Hallo !

Dieses Problem plagte mich auch schon vor einiger Zeit !
Ursache sind vermutlich die Leerzeichen im Pfad/Dateinamen.
Bisher habe ich das dadurch gelöst, daß bei uns Leerzeichen im Pfad bzw. Dateinamen 'verboten' waren.

Als ich Deinen Beitrag und den Beitrag "Verzeichnus löschen" durchgelesen hatte, kam mir die Idee, das Ganze über das 'FileSystemObject' anzupacken. (Vla... Lösung)

Nach einigem Googeln hab ich ein paar Funktionen gebastelt, die über das FSO die Funktionen OPEN/WRITE-LINE/CLOSE imitieren.
So wie es aussieht akzeptiert das FSO die Dateinamen anstandslos.
Zum Test hab ich mir Deinen 'Problempfad' (nur mit C: am Anfang) kopiert. Mit Standard OPEN/WRITE... wurde der Pfad NICHT akzeptiert. Mit den neuen Funktionen mittels FSO gings problemlos.

Ich hab Dir die Funktionen mal angehängt.
Die Funktionen sind aber ohne Fehlerbehandlung bzw. Typprüfung der Argumente... nur mal zum Test !

Wenn's funktioniert, gib mir bitte Bescheid, dann kann man daraus was Vernünftiges machen (mit Fehlerbehandlung, read-line etc....)

Übrigens:
"(while (= T (wcmatch dn2 "*`.*"))(setq dn2 (substr dn2 1 (1- (strlen dn2)))))" lässt sich einfach durch (vl-filename-base filename) ersetzen ...

Grüße

Andi


Code:
(defun c:fsotest (/ path filename fso datobj)
  (setq path    (getvar "DWGPREFIX")
        filename (strcat (vl-filename-base (getvar "DWGNAME")) ".TST")
        datobj    (fso-open (strcat path filename) "w")
  )
  (fso:write-line "teststring1" datobj)
  (fso:write-line "teststring2" datobj)
  (fso:close datobj)
  (princ)
)
;;;***********************************************************************************
;;;******************************* LIBRARY *******************************************
;;;***********************************************************************************
;;;-----------------------------------------------------
;;; fso-OPEN per FileSystemObject
;;; Argumente: filename - Filename+Pfad
;;; mode - "R" = lesen
;;;   "A" = anhängen
;;;   "W" = schreiben
;;; Rückgabe: Object ????
;;;-----------------------------------------------------
(defun fso-open (filename mode / fso ret)
  (setq fso  (vlax-create-object "Scripting.FilesystemObject")
        mode (strcase mode)
  )
  (setq ret (cond ;; Lesen
                  ((= "R" mode)
                  (vlax-invoke-method fso 'opentextfile
                                      ;; Filename as String
                                      filename
                                      ;; IOMode as IOMode:
                                      ;; ForAppending = 8
                                      ;; ForReading = 1
                                      ;; ForWriting = 2
                                      1
                                      ;; Create As Boolean
                                      :vlax-false
                                      ;; Format As Tristate:
                                      ;; TristateFalse = 0  'Öffnet die Datei als ASCII.
                                      ;; TristateMixed = -2 'Öffnet die Datei mit dem Systemstandard.
                                      ;; TristateTrue = -1 'Öffnet die Datei als Unicode.
                                      ;; TristateUseDefault = -2
                                      0)
                  )
                  ;; Append
                  ((= "A" mode) (vlax-invoke-method fso 'opentextfile filename 8 :vlax-true 0))
                  ;; Schreiben
                  ((= "W" mode) (vlax-invoke-method fso 'opentextfile filename 2 :vlax-true 0))
            )
  )
  (vlax-release-object fso)
  ;; Rückgabe
  ret
)
;;;--------------------------------------------------
;;; fso:WRITE-LINE per FileSystemObject
;;; Argumente: str - String, der in Datei geschrieben werden solll
;;; datobj - Vla-Obj von Datei
;;;--------------------------------------------------
(defun fso:write-line (str datobj /) (vlax-invoke-method datobj 'writeline str))
;;;--------------------------------------------------
;;; fso:CLOSE per FileSystemObject
;;; Argumente: datobj - Vla-Obj von Datei
;;;--------------------------------------------------
(defun fso:close (datobj /)
  (vlax-invoke-method datobj 'close)
  (vlax-release-object datobj)
)

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 28. Jul. 2006 08:29    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 Nur für AB-CAD 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von andi2050:

Übrigens:
"(while (= T (wcmatch dn2 "*`.*"))(setq dn2 (substr dn2 1 (1- (strlen dn2)))))" lässt sich einfach durch (vl-filename-base filename) ersetzen ...

der Vollständigkeit halber möchte ich doch noch auf die (undokumentierte) Funktion fnsplitl hinweisen :

(fnsplitl "d:\\ACAD\\acad.exe")  --> ("D:\\ACAD\\" "acad" ".exe")

wo man mittels car / cadr / caddr auf die einzelnen elemente des Dateinamens zugreifen kann..

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

AB-CAD
Mitglied
techn. Zeichner/Sachbearbeiter HLS

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

Beiträge: 8
Registriert: 30.08.2005

8 PC mit ACAD 2000 - 2006
diverse Haustechnik-Komponenten von
CATS, Linear, ESS und AB-CAD Eigenbau

erstellt am: 28. Jul. 2006 13: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,

habe den LISP-Befehl "open" in unserem Betriebsbedingungen nochmal genau geprüft

1. Funktion im Netzwerk: ist ok (N: ist ein Netzwerkpfad)
2. Betriebssystem: Windows 2000
3. Schreib- und Lesezugriff: ist gewährleistet
4. ACAD-Version: 2000, 2000i, bzw. 2002 (also die R15-Familie)
(Achim hatte seinerzeit mit der R16-Familie getestet und von 255 Zeichen gesprochen)


Getestet mit Lesezugriff:

Bei "unseren" Bedingungen ist so, daß 126 Zeichen akzeptiert werden, 127 hingegen nicht.
Dabei ist es unerheblich, ob Leerzeichen, anerkannte Sonderzeichen oder Umlaute dabei sind; ebenso wie es unerheblich ist, ob der Pfadname oder der Dateiname lang ist. Also wenn ein weiteres Unterverzeichnis mit 10 Zeichen hinzukommt, muß der Dateiname um 11 Zeichen kürzer sein (Slash und Ordner = 11 Zeichen), damit die gesamtzahl von 126 Zeichen nicht überschritten wird.

Beispielpfad mit 127 Zeichen:
"N:\\18-02 Daun\\7_CAD\\Umbau 1.OG Ortho+Physik\\ankommende
Pläne\\A_Plan06\\Eingang_060721\\10 Zeichen\\27Z 1ie und klad orthopädie.ltc"

Durch Wegname 1 Zeichens im Pfad- oder Dateinamen geht es

Dies wurde auf 2 verschiedenen Rechnern mit ACAD2000 bzw. 2002 getestet bei jeweils gleichem Ergebnis.

Vieleicht gibt es noch andere User, die mit R15-Versionen arbeiten und ähnliches festgestellt haben.
Die Ursache dieses Phänomens ist wohl nur Autodesk-Insidern bekannt, wenn überhaupt. Tatsache ist jedoch, dass es diese Einschränkung gibt und sie evtl. von weiteren verschiedenen bekannten und unbekannten Faktoren abhängt.

Interessanterweise werden beim Schreiben Dateien mit mehr als 127 Zeichen im Pad/Dateinamen zunächst wohl erzeugt

(setq Dateidescriptor (open Dateiname "w"))

allerdings wird nil zurückgegeben, so dass

(write-line "beliebiger String" Dateidescriptor)

nicht mehr greifen kann

Habe nun die fso (vlax-Lösung) von Andi getestet. Hier wird die Hürde einwandfrei genommen (zumindest bei den getesteten 145 Zeichen) Vielen Dank für den Lösungsansatz.
Habe noch folgende Definition ergänzt:
(defun fso:read-line (datobj /)(vlax-invoke-method datobj 'readline))
da ich ja auch die erzeugten Dateien auslesen möchte


übrigends: wo finde ich in der Hilfe die Befehlsreferenz für 'opentextfile, 'writeline, 'readline ..?
Da ich ein Lisper seit 1993 (ACAD R12) bin, arbeite ich noch sehr gern mit dem "Purem" Lisp ohne VL-Zusätze  auch wegen der Kompatibilität mit diversen LT-Extendern. Dennoch die unbedarfte Frage:Welcher Sprache sind diese Zusätze entlehnt? ActiveX, Visual-Lisp, oder beides oder VBA


PS:

Zitat:
der Vollständigkeit halber möchte ich doch noch auf die (undokumentierte) Funktion fnsplitl hinweisen :

(fnsplitl "d:\\ACAD\\acad.exe")  --> ("D:\\ACAD\\" "acad" ".exe")

wo man mittels car / cadr / caddr auf die einzelnen elemente des Dateinamens zugreifen kann..



Hallo Thomas und Kollegen,

ich finde die Formulierung "wo man ..." allein schon deshalb so super, weil sie aufzeigt, dass man es auf CAD.de mit ganz normalen Menschen wie du und ich zu tun hat. Gerade das ist das schöne an CAD.de. Ich finde, auch das sollte mal ab und zu gesagt werden.

...übrigens, gibt es da noch mehr so undokumentierte Funktionen?

Grüße Armin

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 28. Jul. 2006 13:22    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 Nur für AB-CAD 10 Unities + Antwort hilfreich

 
Zitat:
Original erstellt von AB-CAD:

...übrigens, gibt es da noch mehr so undokumentierte Funktionen?


(acad_truecolordlg 1) steht -glaube ich- auch nirgenswo drin
...


und zu opentextfile usw. das sind Methoden, die das FSO-Objekt von Windows bereitstellt und worauf man über die ActivX-Schnittstelle zugreifen kann. Da findet man z.B: hier was


------------------
      - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

andi2050
Mitglied



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 28. Jul. 2006 15:10    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 Nur für AB-CAD 10 Unities + Antwort hilfreich

Hallo

Meine Infos über das FSO habe ich von folgenden Seiten:
www.devtrain.de/artikel_310.aspx
www.devtrain.de/artikel_311.aspx
www.microsoft.com/germany/technet/datenbank/articles/600360.mspx


Mit (vlax-dump-object obj 'T) erhält man alle Eigenschaften und Methoden eines Objekts (z.B FSO oder FileObject)
(vlax-dump-object(vlax-create-object "Scripting.FilesystemObject") 'T)
--->
; IFileSystem3: FileSystemObject
; Eigenschaftswerte:
;  Drives (RO) = #<VLA-OBJECT IDriveCollection 01156130>
; Unterstützte Methoden:
;  BuildPath (2)
;  CopyFile (3)
;  CopyFolder (3)
;  CreateFolder (1)
;  CreateTextFile (3)
;  DeleteFile (2)
;  DeleteFolder (2)
;  DriveExists (1)
;  FileExists (1)
;  FolderExists (1)
;  GetAbsolutePathName (1)
;  GetBaseName (1)
;  GetDrive (1)
;  GetDriveName (1)
;  GetExtensionName (1)
;  GetFile (1)
;  GetFileName (1)
;  GetFileVersion (1)
;  GetFolder (1)
;  GetParentFolderName (1)
;  GetSpecialFolder (1)
;  GetStandardStream (2)
;  GetTempName ()
;  MoveFile (2)
;  MoveFolder (2)
;  OpenTextFile (4)

Die Zahl hinter den Methoden steht für die Anzahl der benötigten Argumente

Die Argumente lassen sich gut mit dem VBA-Editor auskundschaften.
Zuerst die ensprechende DLL im Editor verfügbar machen:
Extras -> Verweise -> 'Microsoft Scripting Runtime' aktivieren

Dann kann der Objekt Katalog durchsucht werden:
Ansicht -> Objekt Katalog [F2] -> 'Scripting'-Bibliothek anwählen -> im Browser können dann die Eigenschafte und Methoden durchsucht werden

Grüße Andi

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)2023 CAD.de | Impressum | Datenschutz