| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: SRXTEXT Lisp suche funktioniert nicht (1326 / mal gelesen)
|
Manuel486 Mitglied Technischer Zeichner Elektro
Beiträge: 212 Registriert: 31.01.2020
|
erstellt am: 25. Jun. 2021 12:16 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe die Lisp SRXTEXT von: https://www.cadstudio.cz/en/download.asp?file=srxTEXT heruntergeladen und habe mich mit den Suchkriterien beschäftigt.
Zitat: Regular expressions: -------------------- Please note that the regular expression syntax differs in the old Express Tools version and in the VBscript version - SRXTEXT2. Using regular expressions you can perform complex replacements like changing: D19-457-03667 to Part:457/03667 Code:D19 For this case you would use the search and replace strings: \([A-Z][0-9][0-9]\)\-\(...\)\-\(.*\) Part:\2/\3 Code:\1 and in SRXTEXT2: ([A-Z][0-9][0-9])-(...)-(.*) Part:$2$3 Code:$1 SrxText supports a subset of standard regular expression syntax, SrxText2 supports the whole VBscript regex syntax. The subset: . Matches any single character. * Postfix. Preceeding item 0 or more times. + Postfix. Preceeding item 1 or more times. ^ Matches empty string at beginning of text. $ Matches empty string at end of text. [chars] Matches any character in the given class. If the first character is ^, match any character not in the given class. A range of character may be specified by first-last, as in [A-Z] to specify upper case alphabetic characters or e.g. [0-9] \( Mark the beginning of a subexpression. \) Mark the end of a subexpression. \digit Matches a repeat of the text matched earlier by the subexpression inside the nth opening parenthesis. Subexpressions may also be referenced in replace strings.
EXAMPLES: You can append strings to the beginning of your texts: ^\(.\) newprefix\1 or to the end of your texts: \(.\)$ \1newsuffix in SRXTEXT2: ^(.) newprefix$1 Or you can replace just the first occurrence of a substring in text: search: \(.\)oldtext\(.\) replace: \1newtext\2 in SRXTEXT2: (.)oldtext(.) $1newtext$2 Another example of complex replacements: KWD-5-3, KW-4-2, KWP-1-5 change to: KCD-5-1, KC-4-1, KCP-1-1 search: \(.\)W\(.*\)\-\(.\)\-\(.\) replace: \1C\2-\3-1 in SRXTEXT2: (.)W(.{0,1})-(.)-(.) $1C$2-$3-1 Cutting the number of decimal places to 1: search: \([0-9]*\)\.\([0-9]\)[0-9]* replace: \1.\2 in SRXTEXT2: (\d*)\.(\d)\d* $1.$2 Adding a thousands separator (",") to numbers. search: -?\([0-9]+\)\([0-9][0-9][0-9]\) replace: \1,\2 in SRXTEXT2: -?(\d+)(\d\d\d) $1,$2 (repeat it for million/billion/... triplets) Delete all text after the first period in text: search: ^\([^\.]*\)\..* replace: \1. in SRXTEXT2: ^([^\.]*)\..* $1. Replace trailing "A"s with "B"s: search: \(.\)A$ replace \1B in SRXTEXT2: (.)A$ $1B Delete trailing spaces: search: \(.\) +$ replace: \1 in SRXTEXT2: (.) +$ $1 Delete color control codes in MTexts: search: \(.\)\{\\C[0-9]+;\(.\) replace: \1\2 in SRXTEXT2: (.)\\C\d+; $1 Adding trailing text to texts not containing "*": search: ^\([^\*]+\)$ replace: \1 NewTrailingText in SRXTEXT2: ^([^\*]+)$ $1 NewTrailingText Erasing the first character in the text: search: ^.\(.*\) replace: \1 in SRXTEXT2: ^.(.*) $1 Replacing hard returns with soft returns in MText: search: \\P replace: _ (single space character) in SRXTEXT2: \P _ Double spacing lines in MText: search: \\P replace: \\P\\P in SRXTEXT2: \P \P\P
Ich möchte aus: TGE-3-0-GR-E00-000-- TGE-3-0-GR-E00-000-A machen. Vor dem -A können alle Werte Variieren. Ich möchte im Prinzip "nur" den Index verändern. Mein Code ist: Suche nach: \([A-Z][A-Z][A-Z]\-[0-9]\-[0-9]\-[A-Z][A-Z]\-[A-Z][0-9][0-9]\-[0-9][0-9][0-9]\-\)[0-9] Ersetzte durch: \1A Ich habe lange gebraucht um das System zu verstehen, was ich aber anscheinend immer noch nicht habe Ist da grundlegend etwas falsch oder nur ein Zeichen? Ich finde den Fehler einfach nicht... LG Manuel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1458 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 25. Jun. 2021 13:20 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
Hallo Manuel, ich kenne das Programm leider auch nicht aber in deinem Fall sollte das hier auch funktionieren: Code: (defun k_subst-nth (liste n wert / dummy_list) ;;; bestimmtes Element einer Liste austauschen (repeat n (setq dummy_list (cons (car liste) dummy_list) liste (cdr liste) ) ) (append (reverse dummy_list) (list wert) (cdr liste)) )(setq text-list (mapcar 'chr (vl-string->list "TGE-3-0-GR-E00-000--"))) (apply 'strcat (k_subst-nth text-list (1- (length text-list)) "A"))
------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manuel486 Mitglied Technischer Zeichner Elektro
Beiträge: 212 Registriert: 31.01.2020
|
erstellt am: 25. Jun. 2021 13:46 <-- editieren / zitieren --> Unities abgeben:
Der Text Kann auch TGT-5-0-GR-E01-000-- sein... Dann funktioniert der Code nicht. Bin in Lisp auch nicht fit genug um mir das umzubauen. Habe es jetzt auf srxtext2 umgeschrieben, da es im normalen srxtext Befehl sein kann, das die Express-Tools geladen sein müssen. Code:
srxtext2 R (...-.-.-..-...-...-)(.) $1A All All Y
Dieser Befehl funktioniert jetzt. Da musste ich mich wirklich erst mal reindenken. Code: Befehl: srxtext2Search texts using [Regular expression/Exact string/Substring] <Substring>: R Enter the searched pattern: (...-.-.-..-...-...-)(.) Enter the replace pattern ($1$2 for regex captures): $1A Search only in [Layer/All] <All>: All Search only [Selected/All] <All>: All Number of searched entities: 1 TGE-3-0-GR-E00-000---->TGE-3-0-GR-E00-000-A Perform [Replace/Yes to all/Exit]? <Exit>: Y Number of found/replaced entities: 1/1
Jede Klammer (Text kopiert) ist ein Bereich den man kopiert. Der Punkt (.) steht für egal welcher Inhalt, bitte kopieren. Erste Klammer = $1 Zweite Klammer = $2 usw. Er kopiert den Bereich TGE-3-0-GR-E00-000- raus, $1 ist dann der kopierte Text, + das A ergibt dann: TGE-3-0-GR-E00-000-A Der letzte Bindestrich fällt weg, weil er nicht mit $2 wieder zugewiesen wird. Wenn dieses Suchen ersetzt jetzt noch in Layoutnamen funktionieren würde wäre Mega.
Habe was gefunden (RRename), auch von Cadstudio. https://www.cadstudio.cz/en/download?files=1857%7c Selbe Vorgehensweise wie beim Srxtext.
Code: RRENAME Layouts (...-.-.-..-...-...-)(.) $1A
[Diese Nachricht wurde von Manuel486 am 25. Jun. 2021 editiert.]
[Diese Nachricht wurde von Manuel486 am 25. Jun. 2021 editiert.] [Diese Nachricht wurde von Manuel486 am 28. Jun. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 25. Jun. 2021 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
Zu der Ausgangfrage, du hast einen Doppelfehler gemacht. TGE-3-0-GR-E00-000-- Dein Code ist: Suche nach: \([A-Z][A-Z][A-Z]\-[0-9]\-[0-9]\-[A-Z][A-Z]\-[A-Z][0-9][0-9]\-[0-9][0-9][0-9]\-\)[0-9] 1. Das Zeichen "-" ist nicht in 0-9 (= 0 1 2 3 4 5 6 7 8 oder 9) enthalten
2. Auch die Schreibweise ist falsch. Für den Fall man hätte nur die Fälle ändern wollen bei denen das letzte Zeichen 0-9 entspricht: \([A-Z][A-Z][A-Z]\-[0-9]\-[0-9]\-[A-Z][A-Z]\-[A-Z][0-9][0-9]\-[0-9][0-9][0-9]\-\)\([0-9]\) Gezielt nur Text mit Index "-"
Befehl: SRXTEXT Search texts using [Regular expression/Exact string/Substring] <Substring>: r Enter the searched pattern: \([A-Z][A-Z][A-Z]\-[0-9]\-[0-9]\-[A-Z][A-Z]\-[A-Z][0-9][0-9]\-[0-9][0-9][0-9]\-\)\- Enter the replace pattern (/1/2 for regex captures): \1a Search only in [Layer/All] <All>: Search only [Selected/All] <All>: Number of searched entities: 20 TGE-3-0-AA-E00-000---->TGE-3-0-AA-E00-000-a Perform [Replace/Yes to all/Skip/skipAll/Exit]? <Skip>: y Egal welcher Index, jetzt soll dieser "s" sein Befehl: SRXTEXT Search texts using [Regular expression/Exact string/Substring] <Substring>: r Enter the searched pattern: \([A-Z][A-Z][A-Z]\-[0-9]\-[0-9]\-[A-Z][A-Z]\-[A-Z][0-9][0-9]\-[0-9][0-9][0-9]\-\)\(.\) Enter the replace pattern (/1/2 for regex captures): \1s Search only in [Layer/All] <All>: Search only [Selected/All] <All>: Number of searched entities: 20 TGE-3-0-AA-E00-000-a-->TGE-3-0-AA-E00-000-s Perform [Replace/Yes to all/Skip/skipAll/Exit]? <Skip>: y
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1458 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 29. Jun. 2021 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
Ich muss hier nochmal antworten. Zitat: Der Text Kann auch TGT-5-0-GR-E01-000-- sein... Dann funktioniert der Code nicht. Bin in Lisp auch nicht fit genug um mir das umzubauen.
ACHTUNG: Folgende Zeilen sind nicht böse gemeint ... sondern ehrlich. Im Lisp ist der Text direkt angegeben, den musst du natürlich gegen eine Variable mit dem Textinhalt austauschen. Aber das musst du ja in der Variante an die du dich die ganze Zeit klammerst ja auch. Ich denke das hast du gar nicht verstanden. Du versuchst jetzt seit einigen Tagen einfach das letzte Zeichen einer Zeichenkette auszutauschen und kommst nicht weiter. In der Zeit hättest du dir die Lisp-Befehle die man dazu braucht draufgeschafft und für Kaffee und Kuchen wäre auch noch Zeit gewesen. Deine Ausdauer ist zwar zu bewundern aber wenn du das bis Ende dieser Woche nicht gelöst bekommst würde ich mich an deiner Stelle von diesem Weg verabschieden. Schau dir doch nochmal die par Zeilen Lisp an. Da gibt es eine Funktion k_subst-nth die ein beliebiges Element einer Liste gegen ein anderes austauscht. Da wird ein Text in seine einzelnen Zeichen zerlegt und eine Liste daraus gemacht. Da wird diese Liste an die Funktion übergeben und als Position die Länge der Liste -1 (weil bei 0 gestartet wird) und das neue Listenelement übergeben. Und dann wird das Ergebnis wieder zu einem Text zusammengebaut. Man kann hier eine Beliebige Position angeben (zweites Zeichen von rechts, viertes von links,... muss man halt nur ausrechnen) aber in diesem Fall bitte immer nur einzelne Zeichen tauschen weil sonst die Länge der Zeichenkette nicht mehr passt. Ich hoffe du kommst bald auf eine für dich sinnvolle Lösung die du auch in Zukunft gut verwenden kannst. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Jun. 2021 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
Den Post von Andreas würde ich gerne so stehen lassen, aber der Anfang haut daneben, daher @Andreas Kraus >>"Aber das musst du ja in der Variante an die du dich die ganze Zeit klammerst ja auch. Aktueller Stand der Weitsicht ist die nächste Ecke: Alle Texte/Layouts nach Muster <siehe oben> suchen und das letzte Zeichen "dumm" gegen ein anderes ersetzen. "dumm" = es wird im Einzelfall vom Anwender angegeben. Es wird nur eine Platzhalter-Übereinstimmung genutzt, der Code muss daher nicht angepasst werden.
Später im Jahr oder 2022 fragt Manuel vielleicht ob "MAN" das Programm den aktuellen Index ermitteln lassen kann und dann einfach einen neuen Index eintragen lassen kann. Dabei dann bitte noch von BlockreferenzX die Attributwerte lesen, Block/Ref tausch (wenn nötig), Werte von Attribut-A in Attribut-B schreiben und die neu ermittleten Index-Daten in Attribut-A schreiben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manuel486 Mitglied Technischer Zeichner Elektro
Beiträge: 212 Registriert: 31.01.2020
|
erstellt am: 29. Jun. 2021 12:59 <-- editieren / zitieren --> Unities abgeben:
Andreas, ich bin da alles andere als verärgert, bin ja froh wenn ich Hilfe bekomme. Ich habe deinen Vorschlag vielleicht etwas schnell abgetan, wollte aber auch erst mal das, was ich angefangen habe, zu Ende bringen. Ich habe ja nicht einige Tage dran gesessen. Habe mich 2-3 Stunden rein gedacht und damit beschäftigt. Nachdem die Lösung nicht mehr weit weg sein konnte, habe ich hier mal nett gefragt wo mein Fehler liegen könnte. Habe es ja dann, mit einer anderen Schreibweise (srxtext2) selbst hinbekommen. Hatte sich leider alles etwas überschnitten. Jetzt ist es dann aber so wie cadffm sagt: Irgendwann merkt man, dass man ja Eigentlich einen Automatismus gebrauchen könnte. Der Prüft, was im Index steht. Wenn der Index A ist, erstelle Index B. Wenn der Index B ist, kopiere den Inhalt der Indexspalte B in A und erstelle Index C. Dann müssen die Layoutnamen eingebunden werden, der Dateiname muss abgeändert werden usw. usw. Das sprengt dann irgendwann den Zeit/Nutzen Faktor, zumindest was meine Kenntnisse angeht. Ich habe mich jetzt mit der Lösung alle Stempel/Blöcke in einer Zeichnung auf einmal wählen/ändern zu können abgefunden.
Code: (if(setq OBJ(car(entsel)))(progn (setq AWS(ssget "_x" (vl-remove-if-not '(lambda(x)(member (car X) '( 2 )))(entget OBJ))))(sssetfirst AWS AWS)))
Hinbekommen würde ich das sicherlich, aber mit einem solchen Zeitaufwand, dass man doch eher sagen muss, dann zahle ich besser eine Programmierung.
Edit: Wenn das jemand für mich Entgeltlich machen würde, dann bitte Rückmeldung per PM an mich. VG Manuel
[Diese Nachricht wurde von Manuel486 am 29. Jun. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1458 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 30. Jun. 2021 07:46 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
Hauptsache du hast erst mal eine Lösung mit der du weiterkommst. Zitat: Das sprengt dann irgendwann den Zeit/Nutzen Faktor, zumindest was meine Kenntnisse angeht.
Das solltest du Schritt für Schritt ändern. Jetzt hast du noch einigen Aufwand weil deine Kenntnisse noch nicht ausreichen und du viel nachfragen und rumprobieren musst. Aber "auch ein Hochhaus hat mal im Keller angefangen" Mach weiter, du bist hier gut aufgehoben ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VMichl Mitglied
Beiträge: 224 Registriert: 04.01.2001
|
erstellt am: 02. Jul. 2021 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
|
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Jul. 2021 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
|
VMichl Mitglied
Beiträge: 224 Registriert: 04.01.2001
|
erstellt am: 02. Jul. 2021 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für Manuel486
|