Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  nur teile eines String

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:  nur teile eines String (1795 mal gelesen)
Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 03. Jun. 2004 14:15    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 Leute

Ich hab folgendes Problem, ich habe in einem Plankopf (zur kontrolle) einen String der in meinem Fall den Dateinamen und den den ganzen Pfad wo die Zeichnung liegt enthält-anzeigt!! Ok, so weit so gut hab ich das auch hinbekommen. Nun bin ich aber draufgekommen das diese ganze lange Wurst nicht in mein vorgesehenes Feld past! Kann ich auch nur einen Teil anzeigen lassen z.b.:
jetzt schaut es so aus:
Z:\999999\dwg\01 Zechnungen\Schalung\Detail\B001-20-5-001-.dwg

und so würd ich es ganz gerne haben:

\Schalung\Detail\B001-20-5-001-.dwg

Ist das überhaupt möglich?? ich hab das erst so erstellt:
$(getvar,dwgprefix)$(getvar,dwgname)

Wenn ja, bitte helt mir

Danke
Petra

------------------
LG Petra

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: 03. Jun. 2004 14:35    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 Petra_Sp 10 Unities + Antwort hilfreich

.. die Spaltet den Path in eine Liste auf

(defun PATH->List (PATH /  POS  LST)
  (if (=(type PATH)'STR)
    (progn           
      (setq PATH (strcat PATH "/"))
      (while (or(vl-string-position (ascii "\\") PATH)
                (vl-string-position (ascii  "/") PATH)
             )                               
        (if (setq POS (if(< (if (vl-string-position (ascii "\\") PATH)
                                  (vl-string-position (ascii "\\") PATH)
                                  (1+ (strlen PATH))
                            ) 
                            (if (vl-string-position (ascii "/") PATH)
                                  (vl-string-position (ascii "/") PATH)
                                  (1+ (strlen PATH))
                            )
                         )  
                        (vl-string-position (ascii "\\") PATH)
                        (vl-string-position (ascii "/") PATH)
                      )
            )         
          (progn           
    (if(>(strlen(substr PATH 1 POS))0)
              (setq LST (append LST (list (substr PATH 1 POS))))
            )    
            (setq PATH (substr PATH (+ POS 2)))       
          )
        )   
      )     
    )
  )
  LST
)

.... Die Funktion schneidet bei einer Anzahl Verzeichnissen ab:

(defun Zchnstr ( VERZEICHNISSE / RETURN)
  (if (=(type VERZEICHNISSE)'INT)
    (progn
      (setq LST (reverse(path->List(getvar "dwgprefix"))))
      (if (> Verzeichnisse (length LST))(setq Verzeichnisse (length LST)))     
      (setq RETURN (getvar "dwgname"))
      (setq Index -1)
      (repeat VERZEICHNISSE
        (setq RETURN (strcat (nth (setq INDEX(1+ INDEX))LST) "\\" RETURN))
      )
    )
  )
  RETURN
)

.... und die bei einer Anzahl Buchstaben ..

(defun Zchnstr ( ANZAHL / RETURN)
  (if (=(type VERZEICHNISSE)'INT)
    (progn
      (setq RETURN (strcat(getvar "dwgprefix")(getvar "dwgname")))
      (setq RETURN (substr RETURN (-(strlen RETURN)Anzahl) (+ Anzahl 1)))
    )
  )
)

Hoffe, kannst was mit anfangen und bei dir reinbasteln..

------------------
  - Thomas -

[Diese Nachricht wurde von CADmium am 03. Jun. 2004 editiert.]

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

Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 03. Jun. 2004 14:40    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

Danke Thomas

für deine Antwort! Aber wie bekomme ich das in meinen Plankopf hinein???
Ich hab das erste mit rtext ertellt!!

LG Petra

------------------
LG Petra

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: 03. Jun. 2004 14:46    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 Petra_Sp 10 Unities + Antwort hilfreich

Ach sooooooo ... mit Rtext!!! -> glaube nicht, das DIESEL da was bietet ... nur weil du im Lispforum fragtest.

------------------
- Thomas -

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


Ex-Mitglied

erstellt am: 03. Jun. 2004 15:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von CADmium:
.. die Spaltet den Path in eine Liste auf

(defun PATH->List (PATH /  POS  LST)
[...]


Das geht kürzer:

(defun path->list (path)
  (while (vl-string-search "\\" path)
    (setq path (vl-string-subst "\" \"" "\\" path))
  )
  (read (strcat "(\"" path "\")"))
)

... und hier gibt's einen kleinen Fehler - statt (type VERZEICHNISSE) muss da (type ANZAHL) stehen:

Zitat:
 
(defun Zchnstr ( ANZAHL / RETURN)
  (if (=(type VERZEICHNISSE)'INT)
    (progn
      (setq RETURN (strcat(getvar "dwgprefix")(getvar "dwgname")))
      (setq RETURN (substr RETURN (-(strlen RETURN)Anzahl) (+ Anzahl 1)))
    )
  )
)

Davon abgesehen würde ich die Prüfung der Übergabeparameter immer in die aufrufende Funktion verlegen, um den Code möglichst sauber und redundanzfrei zu halten - d.h. also nur bei den Funktionen prüfen, die der Anwender selbst direkt aufruft.

Tom Berger

------------------
Architekturwerkzeuge für AutoCAD: http://www.archtools.de

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: 03. Jun. 2004 15:13    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 Petra_Sp 10 Unities + Antwort hilfreich

na wenn dann so     (der Allgemeingültigkeit wegen )

(defun path->list (path)
  (while (or(vl-string-search "\\" path)
            (vl-string-search "/" path)
         )  
    (setq path (vl-string-subst "\" \"" "\\" path))
    (setq path (vl-string-subst "\" \"" "/" path))
  )
  (read (strcat "(\"" path "\")"))
)

da Verzeichnisse in Lisp durch "\\" oder "/" getrennt werden können.

Ansonsten muß ich dir rechtgeben.

------------------
  - Thomas -

[Diese Nachricht wurde von CADmium am 03. Jun. 2004 editiert.]

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


Ex-Mitglied

erstellt am: 03. Jun. 2004 18:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von CADmium:
na wenn dann so      (der Allgemeingültigkeit wegen )
[...]
da Verzeichnisse in Lisp durch "\\" oder "/" getrennt werden können.

Wo Du Recht hast, hast Du Recht :-)

Und dann wird es natürlich auch Zeit für die allseits beliebte String->LIST Funktion mit beliebigem Trennzeichen:

(defun string->list (string separator)
  (while (vl-string-search separator string)
    (setq string (vl-string-subst "\" \"" separator string))
  )
  (read (strcat "(\"" string "\")"))
)

Und daraus basteln wir nun die ultimativ "richtige" path->list Funktion:

(defun path->list (path)
  (apply 'apend
(mapcar (function (lambda (tok)
    (string->list tok "/")
  )
)
(string->list path "\\")
)
  )
)

Keine Gewähr für Tippfehler. Und für Eleganz sowieso schon mal nicht :-)

T:-)m Berger

------------------
Architekturwerkzeuge für AutoCAD: http://www.archtools.de

Dabrunz
Mitglied



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

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 14. Jun. 2004 11:28    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 Petra_Sp 10 Unities + Antwort hilfreich

Zitat:
Und dann wird es natürlich auch Zeit für die allseits beliebte String->LIST Funktion mit beliebigem Trennzeichen:

(defun string->list (string separator)
  (while (vl-string-search separator string)
    (setq string (vl-string-subst "\" \"" separator string))
  )
  (read (strcat "(\"" string "\")"))
)


Die ist vielleicht allseits beliebt, funktioniert aber nur in einigen Fällen. Versuch's mal mit (string->list(getenv"ACAD")";") - das zeigt ziemlich drastisch, dass mit dem read in diesem Fall kein Blumentopf zu gewinnen ist.

Ich würde an dieser Stelle eher folgende Lösung bevorzugen:

Code:

(defun string->list  (string separator / pos tokenOffset wordList)
  (setq pos (vl-string-search separator string);** 1.Pos.wo d.Pattern <separator> auftaucht
        tokenOffset (1+(strlen separator));** Verschiebung im String zum Auffinden des
                                          ;** nächsten Tokens (1+ TokenLength)
  )
  (while pos
    (setq wordList (cons (substr string 1 pos) wordList)
          string  (substr string (+ pos tokenOffset))
          pos      (vl-string-search separator string)
    )
  )
  (reverse (cons string wordList))
)

Achim Dabrunz

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


Ex-Mitglied

erstellt am: 14. Jun. 2004 12:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Dabrunz:
Die ist vielleicht allseits beliebt, funktioniert aber nur in einigen Fällen. Versuch's mal mit [b](string->list(getenv"ACAD")";") - das zeigt ziemlich drastisch, dass mit dem read in diesem Fall kein Blumentopf zu gewinnen ist.
Achim Dabrunz[/B]

Interessant! Auf dieses Verhalten von READ bin ich in meiner Laufbahn noch nie gestossen. Ich würde das als Bug einordnen.

Gruß
Tom Berger

------------------

ArchTools: AutoCAD-Werkzeuge für Architektur, Bauplanung und Immobilienverwaltung


  • architekturgerechte Bemaßung, beliebige Einheiten, hochgestellte Millimeter, Öffnungsmaße uvm ...
  • "doppelt" assoziative Höhenkoten für Schnittdarstellung und Grundriss
  • assoziative Flächenermittlung nach DIN 277 und II.BVO
  • Textautomatisierung, Plotstempel uvm ...

Hier geht's zum ArchTools Forum, und hier zu weiteren Infos und zur kostenlosen Demoversion

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 14. Jun. 2004 12:15    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 Petra_Sp 10 Unities + Antwort hilfreich

ist zwar nicht elegant, aber funktioniert
dieser string im rtext eingebau, beschneidet den Pfad rechtsbündig auf 20 Zeichen (allerdings nicht beim nächsten \ sondern genau bei 20 Zeichen also meist mitten in einem Verzeichnisnamen)
wenn du mehr oder weniger als 20 Zeichen willst, musst halt die 20 zweimal in diesem code auf deine gewünschte länge ändern

$(if,$(>,$(strlen,$(getvar,dwgprefix)),20),$(substr,$(getvar,dwgprefix),$(-,$(strlen,$(getvar,dwgprefix)),20)),$(getvar,dwgprefix))$(getvar,dwgname)

------------------

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


Ex-Mitglied

erstellt am: 14. Jun. 2004 14:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Dabrunz:
Ich würde an dieser Stelle eher folgende Lösung bevorzugen: [...]

Hallo Achim,

da musste ich in meiner Mittagspause natürlich eine etwas LISPischere :-) Lösung finden. Hier ist sie:

(defun string->list (string separator / tok result)
  (setq string (vl-string->list string)
separator (vl-string->list separator)
  )
  (while string
    (if (equal separator (n-car (length separator) string))
      (setq result (cons (reverse tok) result)
    tok   nil
    string (n-cdr (length separator) string)
      )
      (setq tok   (cons (car string) tok)
    string (cdr string)
      )
    )
  )
  (mapcar 'vl-list->string (reverse result))
)

Die Funktion liesse sich sicherlich noch verbessern. Bis heute abend probiere ich das mal als Rekursion.

Es werden zwei Hilfsfunktionen benötigt, die sowieso Bestandteil jeder Funktionsbibliothek sein sollten. Sie machen genau das, was sie sollen, nämlich die n ersten Elemente einer Liste zurück geben bzw eine Liste ohne ihre n ersten Elemente:

(defun n-car (n lst / res)
  (repeat n
    (setq res (cons (car lst) res)
  lst (cdr lst)
    )
  )
  (reverse res)
)

(defun n-cdr (n lst)
  (repeat n
(setq lst (cdr lst))
  )
)

Gruß
Tom Berger

------------------

ArchTools: AutoCAD-Werkzeuge für Architektur, Bauplanung und Immobilienverwaltung


  • architekturgerechte Bemaßung, beliebige Einheiten, hochgestellte Millimeter, Öffnungsmaße uvm ...
  • "doppelt" assoziative Höhenkoten für Schnittdarstellung und Grundriss
  • assoziative Flächenermittlung nach DIN 277 und II.BVO
  • Textautomatisierung, Plotstempel uvm ...

Hier geht's zum ArchTools Forum, und hier zu weiteren Infos und zur kostenlosen Demoversion

Dabrunz
Mitglied



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

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 15. Jun. 2004 11:35    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 Petra_Sp 10 Unities + Antwort hilfreich

Zitat:
Interessant! Auf dieses Verhalten von READ bin ich in meiner Laufbahn noch nie gestossen. Ich würde das als Bug einordnen.

Nein, das würde ich nicht. Ist schon korrektes Verhalten:

(read "\\t") -> <TAB>

Wird dann eben zur ESCAPE-Sequence und das kann ich schon akzeptieren.

Netter Ansatz übrigens mit den ASCII-Code-Listen. Ist ziemlich performant und hat darüber hinaus auch noch den Vorteil, damit Unicode-Dateien parsen zu können - geht mit meiner Lösung definitiv nicht, dafür ist zu stark vl-string-zentriert und da ist Unicode noch immer ein Fremdwort ..

Allerdings gibt's dennoch von mir einen Vorschlag für 'ne rekursive Umsetzung des STRING-zentrischen Ansatzes (hat eh nur akademischen Wert und ist übertragbar):

Code:

(defun ::string->list (string separator / pos tokenoffset wordlist)
  (_string->list string separator (1+ (strlen separator)))
)

(defun _string->list (string separator tokenoffset)
  ((lambda (pos)
    (cond
      (pos
        (cons (substr string 1 pos)
              (_string->list
                (substr string (+ pos tokenoffset))
                separator
                tokenoffset
              )
        )
      )
      ('else string)
    )
  )
    (vl-string-search separator string)
  )
)


Achim Dabrunz

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 15. Jun. 2004 12: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 Petra_Sp 10 Unities + Antwort hilfreich

Zitat:
Achim schrub: Ist schon korrektes Verhalten

Seh ich auch so - es ist das einzig plausible Verhalten. READ ist ja nicht eine 'eingebaute' Funktion zur Zeichenkettenbearbeitung wie SUBSTR, sondern der Lisp-Parser, also der erste Teil der READ-EVAL-PRINT-Loop. Deshalb muss das Verhalten zwangsläufig konsistent sein, und das bedeutet: Würde sich READ nicht so verhalten, gäb's keine Steuerzeichen in Lisp, denn *jede* Eingabe in Lisp wird erstmal durch ein READ geschoben. Ein expliziter Aufruf von (EVAL ...) verhält sich auch nicht anders als eine implizite Evaluation.

Leider ist aber abzusehen, dass die 'allseits beliebte Lösung' spätestens übermorgen wieder irgendwo auftaucht:-(

Gruß, Axel

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

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


Ex-Mitglied

erstellt am: 15. Jun. 2004 12:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Dabrunz:
Nein, das würde ich nicht. Ist schon korrektes Verhalten:

(read "\\t") -> <TAB>

Wird dann eben zur ESCAPE-Sequence und das kann ich schon akzeptieren.


Stimmt, ich stand ein wenig auf dem Schlauch. Der String "a\b" ist ja gar nicht anzeigbar, da muss ja auch das "\" durch ein Escape-Zeichen maskiert werden. Ein "\\" im String wird als "\" angezeigt, und wenn ich eine n String in einen anderen verschachtele, dann benötige ich für die innere Struktur natürlich "\\\\", um bei Auflösung der äusseren Struktur ein "\\" zu erhalten. Richtig lautet der Pfad deshalb:

(read "\"C:\\\\Pfad\"")

Zitat:

Netter Ansatz übrigens mit den ASCII-Code-Listen. Ist ziemlich performant und hat darüber hinaus auch noch den Vorteil, damit [b]Unicode-Dateien
parsen zu können - geht mit meiner Lösung definitiv nicht, dafür ist zu stark vl-string-zentriert und da ist Unicode noch immer ein Fremdwort ..

Allerdings gibt's dennoch von mir einen Vorschlag für 'ne rekursive Umsetzung des STRING-zentrischen Ansatzes (hat eh nur akademischen Wert und ist übertragbar):

Code:

(defun ::string->list (string separator / pos tokenoffset wordlist)
  (_string->list string separator (1+ (strlen separator)))
)

(defun _string->list (string separator tokenoffset)
  ((lambda (pos)
     (cond
       (pos
        (cons (substr string 1 pos)
              (_string->list
                (substr string (+ pos tokenoffset))
                separator
                tokenoffset
              )
        )
       )
       ('else string)
     )
   )
    (vl-string-search separator string)
  )
)


Achim Dabrunz[/B]


Sehr schön :-)

Dein 'else finde ich auch nett und v.a. für BASIC und PASCAL Programmierer recht verständlich, aber Leute, die mit LISP als erster Sprache anfangen, könnten dadurch eher verwirrt werden.

Vielleicht sollten wir hier ab und zu kleine LISP-Wettbewerbe austragen, ich jedenfalls hätte sicher Spaß dran. Bewertung der Funktionen erfolgt nach verschiedenen Kriterien:

- beste Performance
- kürzester Code
- eleganteste Lösung

Wenn Du eine Idee für eine Aufgabenstellung hast, dann poste die doch mal in einen neuen Thread. Als Titel für's Wiederfinden empfehle ich "LISP Challenge" o.ä.

Gruß
Tom Berger

------------------

ArchTools: AutoCAD-Werkzeuge für Architektur, Bauplanung und Immobilienverwaltung


  • architekturgerechte Bemaßung, beliebige Einheiten, hochgestellte Millimeter, Öffnungsmaße uvm ...
  • "doppelt" assoziative Höhenkoten für Schnittdarstellung und Grundriss
  • assoziative Flächenermittlung nach DIN 277 und II.BVO
  • Textautomatisierung, Plotstempel uvm ...

Hier geht's zum ArchTools Forum, und hier zu weiteren Infos und zur kostenlosen Demoversion

Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 16. Jun. 2004 10:24    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 Leute

Vielen vielen vielen Dank für eure Antworten!
Ich hab nur sehr wenig Ahnung von Lisp, drum würde ich noch eure Hilfe und Untestützung brauchen!!
1. Wie kann ich das am besten in meinem Plankopf einbauen der mittels Block einfügen eingesetzt wird!
2. Der User sollte auser das er diesen Kopf einfügt im Prinzip sonst nicht viel machen auser seine Felder (Attripute) ausfüllen.
3. Ist das überhaupt möglich mittels Lisp und so?
4. Wenn ja wie funktioniert das das er mir automatisch den Pfad an eine genau definierte Stelle schreibt und automatisch den Pfad nach einer bestimmten Länge abschneidet.
eben z.b.: statt Z:\999999\dwg\01 Zeichnungen\Schalung\Detail\B001-20-5-001-.dwg
auf z.b. diese Länge: chnungen\Schalung\Detail\B001-20-5-001-.dwg
5. Ich möchte das der Benutzer überhaupt nichts machen braucht da sonst nur Chaos und Vergessenheit auftetten.
6. Gibt es so etwas überhaupt schon?

Bitte Helft mir
Danke

------------------
LG Petra

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

Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 16. Jun. 2004 10:27    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 fuchsi

danke für deine Antwort
Was meinst du mit "die 20 zweimal in diesem code auf deine gewünschte länge ändern"
Heist das einfsch statt den 20 zweimal auf 40 umändern oder etwas anderes??

LG PEtra

------------------
LG Petra

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


Ex-Mitglied

erstellt am: 16. Jun. 2004 10:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Petra_Sp:
6. Gibt es so etwas überhaupt schon?
[B][QUOTE]

Du kannst Dier mal mein Programmn ansehen und darin das Modul DynaText. Das macht sowas automatisch, wobei die Texte auch vollautomatisch bei von Dir definierten Ereignissen aktualisiert werden. Beispielsweise kannst Du für einen Text, der das aktuelle Datum, den Dateinamen und den Pfad enthält, die Aktualisierung "vor dem Plotten" aktivieren, udn dann wird immer vollautomatisch vor dem Plotten der Plotstempel aktualisiert, ohne dass Du Dich drum kümmern musst.



Bitte Helft mir
Danke
[/B][/QUOTE]

Nöö, Deine Wünsche gehen jedenfalls mir bei Weitem zu weit für eine kostenfreie Wunscherfüllung.

Tom Berger

------------------

ArchTools: AutoCAD-Werkzeuge für Architektur, Bauplanung und Immobilienverwaltung


  • architekturgerechte Bemaßung, beliebige Einheiten, hochgestellte Millimeter, Öffnungsmaße uvm ...
  • "doppelt" assoziative Höhenkoten für Schnittdarstellung und Grundriss
  • assoziative Flächenermittlung nach DIN 277 und II.BVO
  • Textautomatisierung, Plotstempel uvm ...

Hier geht's zum ArchTools Forum, und hier zu weiteren Infos und zur kostenlosen Demoversion

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 16. Jun. 2004 15:05    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 Petra_Sp 10 Unities + Antwort hilfreich

ja das heisst es: um den Pfad auf 40 Stellen zu beschränken lautet der string so

$(if,$(>,$(strlen,$(getvar,dwgprefix)),40),$(substr,$(getvar,dwgprefix),$(-,$(strlen,$(getvar,dwgprefix)),40)),$(getvar,dwgprefix))$(getvar,dwgname)

aber Achtung : Es wird NUR der Pfad auf 40 Stellen beschränkt und mit dem DWGNAMEN ergänzt.

------------------

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 16. Jun. 2004 15:17    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 Petra_Sp 10 Unities + Antwort hilfreich

Z:\999999\dwg\01 Zeichnungen\Schalung\Detail\B001-20-5-001-.dwg
soll ergeben  chnungen\Schalung\Detail\B001-20-5-001-.dwg

hab dir den Diesel-Ausdruck so umgebaut , dass das jetzt so rauskommt, d.h. auch die länge des Dateinamens (und nicht nur des pfades) wird jetzt berücksichtigt

$(if,$(>,$(strlen,$(getvar,dwgprefix)$(getvar,dwgname)),40),$(substr,$(getvar,dwgprefix)$(getvar,dwgname),$(-,$(strlen,$(getvar,dwgprefix)$(getvar,dwgname)),40)),$(getvar,dwgpre fix)$(getvar,dwgname))

------------------

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

Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 16. Jun. 2004 15:32    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

Danke für deine Mühe noch mal Fuchsi

Werd das gleich mal ausprobieren!!

Danke, melde mich wenn es funktioniert hat

LG Petra

------------------
LG Petra

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

Petra_Sp
Mitglied



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

Beiträge: 130
Registriert: 28.10.2003

AutoCad 2004 Deutsch
AutoCad 2004 Englisch
Jetzt auch AutoCad 2006 Deutsch

erstellt am: 17. Jun. 2004 09:15    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 Fuchsi

Danke nochmal, hat prima Funktioniert. Du hast mir sehr damit geholfen!!

Eine Frag noch an alle:
Kann ich mir aus einem Dateinamen
z.b. Detail\B001-20-5-001-.dwg
einen ganz bestimmete Position z.b. den 1 er (6. Position von rechts) rausfiltern und in meinen Plankopf automatisch auf eine bestimmte Position eintragen-verwenden?
Ist das möglich??
Oder der umgekehrte Weg wäre auch nicht schlecht. Ich habe z.b. in meinem Plankopf Attripute wie Art (4), Plannr. (001) und Index (-). Diese sollen dann beim Abspeichern automatisch der abzuspeichernde Name ergebenergeben. z.b 4001-.dwg So das ich beim speichern gar nicht mehr überlegen muß wie die Zeichnung heißt.

Ich kann mir denken das so was ganz schön eitaufwändig zum Programmieren?
Aber vielleicht kann mir ja jemand weiterhelfen oder einen Ansatz geben als Lisp-Neuling?!

Danke LG Petra

------------------
LG Petra

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


Ex-Mitglied

erstellt am: 17. Jun. 2004 12:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Petra_Sp:
Ich kann mir denken das so was ganz schön eitaufwändig zum Programmieren?
Aber vielleicht kann mir ja jemand weiterhelfen oder einen Ansatz geben als Lisp-Neuling?!

Solche Funktionen sind schon Bestandteil der Standardfunktionen jedes LISP Interpreters. Schau einfach mal in Deiner VisualLISP Online-Hilfe nach SUBSTR und STRCAT

Tom Berger

------------------

ArchTools: AutoCAD-Werkzeuge für Architektur, Bauplanung und Immobilienverwaltung


  • architekturgerechte Bemaßung, beliebige Einheiten, hochgestellte Millimeter, Öffnungsmaße uvm ...
  • "doppelt" assoziative Höhenkoten für Schnittdarstellung und Grundriss
  • assoziative Flächenermittlung nach DIN 277 und II.BVO
  • Textautomatisierung, Plotstempel uvm ...

Hier geht's zum ArchTools Forum, und hier zu weiteren Infos und zur kostenlosen Demoversion

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 17. Jun. 2004 13:41    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 Petra_Sp 10 Unities + Antwort hilfreich

Kann ich mir aus einem Dateinamen
z.b. Detail\B001-20-5-001-.dwg
einen ganz bestimmete Position z.b. den 1 er (6. Position von rechts) rausfiltern und in meinen Plankopf automatisch auf eine bestimmte Position eintragen-verwenden?
Ist das möglich??


würd ich im Zeichnungskopf auch mit nem rtext machen
$(substr,$(getvar,dwgname),$(-,$(strlen,$(getvar,dwgname)),5),1)

das filtert genau das 6. Zeichen von rechts, 1 Stelle lang heraus.

brauchst du jedoch , die Zeichen von Links, z.B.: das 001
dann schaut der Diesel-Ausdruck so aus
$(substr,$(getvar,dwgname),2,3)
das 2,3 sagt aus, nimm AB dem 2. Zeichen die nächsten 3 Zeichen

Wüdest du nur das B benötigen braucht du ab dem 1. Zeichen 1 Zeichen lang also
$(substr,$(getvar,dwgname),1,1)

------------------

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