| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Mehrzeilen Text in einem DCL-Fenster edetieren (1043 mal gelesen)
|
Niggemann Mitglied
Beiträge: 159 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 30. Mai. 2006 21:38 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ist es möglich in einem DCL-Fenster einen Mehrzeilen Text zu erfassen, ändern oder neu zu erstellen. Die maximale Anzahl von Textzeilen beträgt 99. Mit einer List_box bekomme ich den Text zwar in das Fenster kann ihn aber nicht bearbeiten. Der text kommt aus einer Ascii-Datei und ist als Liste in Autolisp vorhanden. Wer weiß einen Rat im Vorraus schon mal Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 31. Mai. 2006 00:25 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo, was hindert Dich die ASCII-Datei mit einem komfortablen Editor zu bearbeiten, z.B. mit dem "JFE" von Jens Altman (Freeware). Den Editor und Deine ASCII-Datei kannst Du unter Lisp ganz einfach aufrufen. Dein ganzer Code wäre nur ein par Zeilen. Gruß Theodor Schönwald Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 31. Mai. 2006 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hi, also ich habe dieses Problem folgendermaßen gelöst: Zur Erklärung: Der Text wir auf 10 Zeilen gekürzt in dem Abschnitt ": paragraph" angezeigt (könnte man natürlich auch vermindern/erhöhen). DCL-Definition s.u. Will man den Text editieren, muß man auf den Button editieren drücken und die interne Acad-Func (IMHO ETools! erforderlich) acet-ui-txted wird mit dem gespeicherten Text aufgerufen (Der gepeicherte Text wird zur Anzeige in der Dialogbox immer durch 'ne Subroutine gejagt, remember 10 Zeilen Begrenzung, aber das muß den gespeicherten Text ja nicht jucken ;-)) Einfach mal testen:
Code:
(acet-ui-txted "Ey, coole Sache das..." "Dialogtitel" "Anfrage:")
Ein wesentlicher Knackpunkt war damals das Format des Zeilen-Delimitters. Ich mußt als Zeilentrennung im gespeicherten Text das Semikolon ( ";" ) verwenden, acet-ui-txted benötigt zur Zeilentrennung aber "\r\n". Dafür habe ich dann 'nen eigenen Aufruf von acet-ui-txted geproggt, der den Delimitter des gespeicherten Textes vor Aufruf austauscht und nach der Rückgabe eben wieder zurücktauscht (siehe MS:EDIT_BOX). Nachfolgend ein paar Codes dazu, auch deren Kommentar sollte für Dich hilfreich sein. Ich weise aber darauf hin, dass es sich bei den hier veröffentlichen Codes keinesfalls um eine fertige Komplettlösung handelt. Es fehlen z.B. einige Subroutinen. Es ging mir auch nur darum einen Lösungsansatz aufzuzeigen. DCL-Definition für Anzeige des Textes:
Code:
ZVO_NOTE_10 : boxed_row { label = "Bemerkung:"; : paragraph { : text_part { key = "TEXT1"; // width = 63; } : text_part { key = "TEXT2"; // width = 63; } : text_part { key = "TEXT3"; // width = 63; } : text_part { key = "TEXT4"; // width = 63; } : text_part { key = "TEXT5"; // width = 63; } : text_part { key = "TEXT6"; // width = 63; } : text_part { key = "TEXT7"; // width = 63; } : text_part { key = "TEXT8"; // width = 63; } : text_part { key = "TEXT9"; // width = 63; } : text_part { key = "TEXT10"; // width = 63; } } : button { fixed_width = true; fixed_height = true; alignment = top; label = "Editieren"; key = "BTNEDITNOTE"; } }
Lisp-Funktionen für Edit-Box und das Befüllen der Text-Anzeige
Code:
;; Basiert auf der acetutil.arx ;; (acet-ui-txted [text [caption [note]]]) ;; Der Text geht als ";" separated rein und raus ;; intern muß jedoch der delimiter ein "\r\n" sein. ;; Die Wandlung erfolgt in dieser Sub. (defun MS:EDIT_BOX (TEXT DIALOGTITLE USERPROMPT / RETVAL) ;; Wandlung des textstrings in ein kompatibles Format: (setq TEXT (MS_STRTOKEN-SUBST TEXT "\r\n" ";")) (if (setq RETVAL (MS:SAFE-EVAL (list 'acet-ui-txted TEXT DIALOGTITLE USERPROMPT) ) ;_ end of MS:SAFE-EVAL ) ;_ end of setq (setq RETVAL (MS_STRTOKEN-SUBST RETVAL ";" "\r\n")) (setq retval (MS_STRTOKEN-SUBST TEXT ";" "\r\n")) ) ;_ end of if RETVAL ) ;_ end of defun ;; Funktion stellt den delimited-String in einem Zehnzeiligen Bemerkungs- ;; feld dar. ;; Das Argument KEY ist ein Teilstring für den KEY der weitere Teilstring ;; ergibt sich durch indizies. Also z.B. KEY = TEXT dann wird daraus TEXT1, TEXT2 usw. ;; Argumente: ;; KEY = Der Anfangsstring für den Key, wird durch eine laufende Nummer erweitert ;; NOTESTR = Ein eventuell mit 'nem Token geteilter String (csv) ;; DELIMITER = Das Trennzeichen für csv ;; NOTELEN = Anzahl der zulässigen Zeilen ;; ;; Rückgabe = Keine ;; ;; Beispielaufruf: ;; (ZVO-NOTE-IF "TEXT" "A;B;C;D;E;G" ";" 10) (defun ZVO-NOTE-IF (KEY NOTESTR DELIMITER NOTELEN / INDEX NOTELST) (setq KEY (strcase KEY) INDEX 1 ) ;_ end of setq (if (get_tile (strcat KEY (itoa INDEX))) (if NOTESTR (if (/= NOTESTR "") (progn (setq NOTELST (MS_STRTOKEN NOTESTR DELIMITER NIL) NOTELST (LIMITLIST NOTELST NOTELEN "") ) ;_ end of setq (foreach ELEM NOTELST (SET-TILE-IF (strcase (strcat KEY (itoa INDEX))) ELEM) (setq INDEX (1+ INDEX)) ) ;_ end of foreach ) ;_ end of progn ) ;_ end of if ) ;_ end of if ) ;_ end of if ) ;_ end of defun
;; Funktion limitiert die Länge einer Liste auf ;; die im Argument LSTLEN übergebene Länge ;; Ist die Liste zu lang, wird sie gekürzt ;; Ist sie zu kurz, wird sie mit dem Wert ;; des Arguments FILLPATTERN aufgefüllt (defun LIMITLIST (LST LSTLEN FILLPATTERN / LEN retval) (setq LEN (length LST)) (if (> LEN LSTLEN) (repeat LSTLEN (setq RETVAL (cons (car LST) RETVAL) LST (cdr LST) ) ;_ end of setq ) ;_ end of repeat (progn (setq RETVAL (reverse LST)) (repeat (- LSTLEN LEN) (setq RETVAL (cons FILLPATTERN RETVAL)) ) ;_ end of repeat ) ;_ end of progn ) ;_ end of if (reverse retval) ) ;_ end of defun
...------------------ Ciao, Marc [Diese Nachricht wurde von marc.scherer am 31. Mai. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 159 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 31. Mai. 2006 22:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Ich habe vergessen in meiner Frage zuerklären wofür ich diesen Editor benötige. ich möchte damit Datanorm Texte erstellen diese werden in einer bestimmten Reihenfolge in einer Ascii-Datei abgestellt vor den Texten und hinter den Texten kommen noch Zahlen, Leerfelder usw.. Mit Lisp kann ich diese Datensätze sehr leicht manipulieren das heist ich kann sie in Datanorm 3, Datanorm 4 und Datanorm 5 ausgeben. Bisher habe ich mich mit dem guten alten EDIT.COM rumgeschlagen, dieses bin ich jetzt leid da ich immer aufpassen muß das eine Textzeile nicht mehr als 40 Zeichen hat, auch das Abzählen der Semikolons, die als Trennzeichen dienen, ist mir zu aufwändig. Das ganze Betrachte ich als eine Übung wenn's klappt habe ich wieder einiges dazugelernt was mir beim nächtsten Problem wieder weiter hilft. Seit 14 Jahren bearbeite ich mit Lisp Datanormdateien für mich gibt es kein einfacheres Werkzeug was genau das macht was ich will. mfg Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 159 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 31. Mai. 2006 22:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Marc Deine Antwort ist sehr interressant, mir wäre eine Lösung, die nicht auf irgendwelche Zusatzprogramme oder Dateien zurück greift lieber. Wie du aus meiner Antwort an Theodor Schönwald entnehmen kannst, habe ich mein erstes Tool mit ACAD R9 geschrieben und meine Progs laufen noch unter ACAD R16. Für micht zählt die Konstanz der Programme, da ich nicht jeden Tag etwas in Lisp mache und diese Tools mir meine tägliche Arbeit erleichtern sollen. Eine reine Lisp-Routine möglichst ohne VL.... Komponenten wäre mir am liebsten. Solltest du eine solche Lösung wissen wäree ich dir sehr Dankbar. mfg Niggemann
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 31. Mai. 2006 23:12 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
@Niggemann, wenn ich das jetzt richtig sehe, dann hast du im grunde irgendwelche Tabellen, die du in einem mehrzeiligem Textfeld angezeigt bekommen möchtest. Wenn dem tatsächlich so ist, dann würde ich mit einer mehrspaltigen Liste arbeiten. Entsprechend der maximal möglichen Spalten definierst du in der DCL entsprechende Eingabefelder, die die Werte der gepickten Zeile anzeigen. Dann bastelst du noch die Buttons für Editieren Hinzufügen und Löschen und fertig ist das ganze. Klar das ist jetzt kein mehrzeiliger Editor, Vprteil wäre aber, dass du die Semikolons als Spaltentrennzeichen nicht mehr zählen musst. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 159 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 05. Jun. 2006 21:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Marc, Hallo Holger Habe mir eure Lösungsansätze zu Herzen genommen dabei kommen natürlich neue Fragen. Ich habe eine Variante mit untereinander angeordneten "edit_box" Feldern gewählt zwischen den Feldern ist ein unschöner Streifen, der mich stört. 1. Ist es möglich in dem DCL-Fenster die "edit_boxen" so anzuorden das diese Dichter aneinander sind? 2. Gibt es eine Möglichkeit die "Bild rauf" und "Bild runter" Tasten zu belegen damit ich in einem längeren Text scrollen kann? 3. Ist generell es möglich in einem Lisp die Funktionstasten zu Belegen? im Vorraus schon mal Danke Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 07. Jun. 2006 07:44 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
|
Niggemann Mitglied
Beiträge: 159 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 07. Jun. 2006 12:23 <-- editieren / zitieren --> Unities abgeben:
Hallo CADwiesel das weiß ich auch in Listboxen kann ich auch das Mausrad zu scrolen benutzen, aber in den editfeldern kann ich schreiben und sehe noch was davor steht bzw. was dahinter wenn ich zB. eine Zeile gelöscht habe. Dieses ist dann einfacher weil ich dann den Text besser ausrichten kann zB. Farbe : rot Material: Kunsttoff so stehen die Doppelpunkte immer untereinander und die Worte danach ebenso. Aber wie schon mal gesagt es sind reine Ascii-Daten. Der Zugriff auf die Funktionstasten der Tastatur würde mich intresieren und warum man einer "edit_box" ein "height = 5" zuweisen kann und den Rest der "edit-box" nicht Nutzbar ist. Alles andere klappt schon super. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |