| |
| 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: Bitte um Hilfe zur Präfix-Notation (1594 mal gelesen)
|
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 01. Dez. 2008 13:28 <-- editieren / zitieren --> Unities abgeben:
Hallo beisammen, in den angehängtem JPG hab ich´s Versucht meine Frage so Konkret und anschaulich wie nur möglich darzustellen. Es geht um eine Erweiterung der Folgenden LISP-Zeilen: Ich hab versucht den Befehl "get" so einzubinden, das ich bei "Textwert wählen, die Koordinaten @-0.6,-0.085 wähle, usw., das aber klappt nicht. Folgende Fehlermeldung: 'Fehlerhafter Argumenttyp: lentityp nil' Wie kann ich hier relative koordinaten für die Auswahl einbinden. Oder gibt es eine Möglichkeit dies mit LISP zu erreichen. (Das Stempel_Raum.JPG-Veranschaulicht das ganze viel besser, denk ich.)(P.S. Einfügepunkt ist zugleich der Basispunkt des Blocks.) (defun c:get (/ att) (entmod (subst (assoc 1 (entget (car (entsel "\nneuen Textwert wählen:")))) (assoc 1 (setq att (entget (setq ele (car (nentsel "\nATTRIBUT wählen:")))) ) ) att ) ) (entupd ele) ) Mit diesem get-Befehl ändere ich ein geählten Attributswert durch einen zuvor gewählten DText um. Einfacher währ es wen die LISP_Zeilen den Block Einfugen, und sogleich alle Zeilen (setq P1 als einfügepunkt, setq punkt zeile 1 (text), setq zeile 1a, attwert neben an, usw... (Siehe JPG) Ich hoff das ich soweit das nötigste "recht gut" dargestellt hab, damt es nicht all zu viel aufwand ist mir hier weiterzuhelfen... P.P.S. Den Get befehl hab ich nicht selber geschrieben. Dieser Dank gilt den CAD.de Usern hier!!! [Diese Nachricht wurde von Danijel am 01. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 01. Dez. 2008 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hier mal eine Funktion, mit der du Attributwerte ändern kannst: Die Übergabeparameter sind in der Beispielzeile dargestellt. Du muss die Attributsbezeichnung deines zu ändernden Attributes wissen Ich hoffe dies ist in Etwa sowas, was du suchst? Code:
;;; bspl. (attchange elementname "4.ATTRIBUT" 1 "Hallo") ;;; oder (attchange (cdr(assoc -1(entget(car(entsel))))) "4.ATTRIBUT" 1 "Hallo") (defun attchange (elem attname gcwert wert / aslst) (setq aslst (entget elem)) (if (= (cdr (assoc 0 aslst)) "INSERT") (progn (if (= (cdr (assoc 66 aslst)) 1) (progn (setq aslst (entget (entnext (cdr (assoc -1 aslst))))) (while (/= (cdr (assoc 0 aslst)) "SEQEND") (if (= (cdr (assoc 2 aslst)) attname) (progn (entmod (subst (cons gcwert wert) (assoc gcwert aslst) aslst ) ;_ end of subst ) ;_ end of entmod (entupd (cdr (assoc 330 aslst))) ) ;_ end of progn ) ;_ end of if (setq aslst (entget (entnext (cdr (assoc -1 aslst)))) ) ;_ end of setq ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of progn ) ;_ end of if ) ;_ end of defun
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 01. Dez. 2008 17:14 <-- editieren / zitieren --> Unities abgeben:
Die Attributsbezeichnungen, je einzelnen Block sind: RAUMNUMMER RAUMBEZEICHNUNG DINFLÄCHE DINUMFANG DINVOLUMEN <-das aber bleibt wie im block deffiniert) AUSBAUTYP-BODEN AUSBAUTYP-DECKE Ich hab das mal so eingefügt und probiert. Klappp noch nicht. Irgendwas hab ich da wohl falsch gemacht. Álá Anfänger.... Der gegebene Dtextwert soll zum neuen Attributswert im Block werden; sind ja verschiedene Raumspempel mit unterschiedlichen werten. Ich habs so probiert: Was stimmt da noch nicht ganz? (Und wo sind die weiteren Zeilen einzufügen???) (defun c:get2 (elem RAUMNUMMER gcwert wert / aslst) (setq aslst (entget elem)) (if (= (cdr (assoc 0 aslst)) "INSERT") (progn (if (= (cdr (assoc 66 aslst)) 1) (progn (setq aslst (entget (entnext (cdr (assoc -1 aslst))))) (while (/= (cdr (assoc 0 aslst)) "SEQEND") (if (= (cdr (assoc 2 aslst)) REUMBEZEICHNUNG) (progn (entmod (subst (cons gcwert wert) (assoc gcwert aslst) aslst ) ;_ end of subst ) ;_ end of entmod (entupd (cdr (assoc 330 aslst))) ) ;_ end of progn ) ;_ end of if (setq aslst (entget (entnext (cdr (assoc -1 aslst)))) ) ;_ end of setq ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of progn ) ;_ end of if ) ;_ end of defun Ob es das ist weis ich noch nicht!!! In dem JPG-Bild kannst Du meine situation mit dem Block sehen. Der rechte, weise ist der eingefügte, links daneben sind die dtext werte. Mit dem "get" in der nochmalschleife klicke ich zuerst auf den text wert, dann auf den attwert, der überschrieben wird. Macht das "attchange" dies automatisiert?
[Diese Nachricht wurde von Danijel am 01. Dez. 2008 editiert.] [Diese Nachricht wurde von Danijel am 01. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 02. Dez. 2008 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
|
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 03. Dez. 2008 09:45 <-- editieren / zitieren --> Unities abgeben:
Danke fürs drübergucken. Leider aber: Die MELDUNG zu wenig Argumente erscheint!!! (defun c:get2 (elem RAUMNUMMER gcwert wert / aslst) (setq aslst (entget elem)) (if (= (cdr (assoc 0 aslst)) "INSERT") (progn (if (= (cdr (assoc 66 aslst)) 1) (progn (setq aslst (entget (entnext (cdr (assoc -1 aslst))))) (while (/= (cdr (assoc 0 aslst)) "SEQEND") (if (= (cdr (assoc 2 aslst)) "RAUMNUMMER") (progn (entmod (subst (cons gcwert wert) (assoc gcwert aslst) aslst ) ;_ end of subst ) ;_ end of entmod (entupd (cdr (assoc 330 aslst))) ) ;_ end of progn ) ;_ end of if (setq aslst (entget (entnext (cdr (assoc -1 aslst)))) ) ;_ end of setq ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of progn ) ;_ end of if ) ;_ end of defun [Diese Nachricht wurde von Danijel am 03. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 03. Dez. 2008 10:11 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 03. Dez. 2008 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, dann probier mal folgendes: Code:
(defun get2 (elem AttName wert / aslst) (setq aslst (entget elem)) (if (= (cdr (assoc 0 aslst)) "INSERT") (if (= (cdr (assoc 66 aslst)) 1) (progn (setq aslst (entget (entnext (cdr (assoc -1 aslst))))) (while (/= (cdr (assoc 0 aslst)) "SEQEND") (if (= (cdr (assoc 2 aslst)) AttName) (progn (entmod (subst (cons 1 wert) (assoc 1 aslst) aslst) ;_ end of subst ) ;_ end of entmod (entupd (cdr (assoc 330 aslst))) ) ;_ end of progn ) ;_ end of if (setq aslst (entget (entnext (cdr (assoc -1 aslst))))) ;_ end of setq ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of if ) ;_ end of defun(defun c:get2aufruf ( / ) (get2 (car(entsel "\nBlock auswählen:")) "RAUMNUMMER" "test"))
Die Funktion (c:get2aufruf) ruft die Unterfunktion (get2) auf. Dabei werden folgende Argumente übergeben: 1. Objektname des ausgewählten Blockes 2. Name des zu ändernden Attributes 3. Der Neue Wert ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 03. Dez. 2008 13:20 <-- editieren / zitieren --> Unities abgeben:
Liebe Ingeineure, und CAD-wiesel erstmal danke eurer Annahme, meines Verbesserungswunsches. DANKE! Dorfy & Jörn, *.lsp ->(defun get2 (elem AttName wert / aslst)funktioniert, jedoch nutzt es mir so nichts. So wie ich erkenne, ändert "get2aufruf" die Attwerte eines Blocks, mit gegeben werten die in Lisp geschriben sind um. Leider für mich unbrauchbar. Denn jeder raum hat ander werte. Ich habs nochmal in dem jpg-Anhang versucht zu erklären wie sich mein zeigefinger mit dem ausgangs(alt) befehl "get" fühlt. also: aufrug nochmal; get; Textwert wählen: klick; Attributszeile wähle: klick. Somit Eine zeile fertig. nach weiteren fünf, sind alle Attributswerte eines blocks abgeändert. dies ist aber nur ein Zimmer von (ich wollts bisher noch nicht genau wissen) von wievielen noch.... Mir gehts um die jeweils sechs zeilen (vorhandener textwert in Attwert zu übernehmen) Siehe hierzu Anhang. P.S. Ich bin anfänger, was die lisp-Sprache betrifft!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 03. Dez. 2008 13:35 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, dann würde ich folgendermaßen vorgehen: 1. Einfügepunkte des Blockes in der unmittelbaren Nähe des vorhandenen Rahmens mit Texten. 2. Über einen Auswahlsatz (ssget "_cp" (Koordinatenrechteck in der näheren Umgebung des Einfügepunktes)(list '(0 "TEXT")'(8 "Layer wenn immer derselbe") 3. Die Texte aus dem Auswahlsatz (es sollten dann 6 Stück sein), wenn es mehr sind muss man diese nach dem Abstand zum Einfügepunkt sortieren und die 6 mit dem kleinsten Abstand verwenden. 4. Die 6 Texte nach y sortieren (von oben nach unten) 5. Dann gezieltes Zuweisen der Textinhalte zu den Attributsinhalten, entsprechend der Textsortierung. Aber das würde den Rahmen der Foren-Hilfe sprengen, wenn Du Dich aber selber daran versuchst wird Dir bestimmt auch weitergeholfen. ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 03. Dez. 2008 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, verstehe, den Rahmen will ich ja nicht sprengen, scheint doch nicht all zu "klaksig" zu sein, was ich brauch... zu deinem Vorschlag: Punkt 1 Ist erfüllt. einfügepunkt und Nullpunkt des blockes ist schon am Rahmen links oben. Dieser wird am vorhandenen Rahmen mit den text-infos daran rechts oben eingefügt. Punkt 2 bis 6 ist dann meine Hausaufgabe. Jetzt brauch ich nur noch ein wenig nachhilfe. ssget "_cp" (Koordinatenrechteck... ok, versteh ich. (list '(0 "TEXT")' da werden die werte gemerkt, oder? 8 "Layer wenn immer derselbe") NEIN. Alter Rahmen und alt-Text liegen auf einem layer. Die Attribute des blocks jeweils auf eigene, unterschiedliche. Punkt 3-6 gibts im web eine Seite die die Befehle auf deutsch beschreibt? Meine Englishkentnisse reichen notgezwungen zum überleben, jedoch nicht für Programmsprachen in english. Grüße Danke Jörn! [Diese Nachricht wurde von Danijel am 03. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 03. Dez. 2008 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
hi, " ssget "_cp" (Koordinatenrechteck... ok, versteh ich. (list '(0 "TEXT")' da werden die werte gemerkt, oder? 8 "Layer wenn immer derselbe") NEIN. Alter Rahmen und alt-Text liegen auf einem layer. Die Attribute des blocks " mit ssget... erhältst du alle Objekte vom Typ Text die in einem Bereich auf einen bestimmten Layer liegen (dein Ausgangs/Quelllayer) Diesen Auswahlsatz musst du nun auswerten bzw die einzelnen Textobjekte... Mapcars Seite bzw das Kochbuch immer wieder nur zu empfehlen... mfg heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 03. Dez. 2008 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, also erstmal den Auswahlsatz mit Texten. Voraussetzung, um es einfach zu halten ist, das Du das WKS aktuell geschaltet hast, und das die Textrahmen auch in diesem WKS ausgerichtet sind. Code:
(defun c:test ( / AWS_TEXT BASISPUNKT BLOCK LISTE_TEXT N RECHTSUNTEN X Y) (setq x 4.0 y 8.0);angenommene Werte für Breite (x) und Höhe(y) des Textrahmens (if(setq block (car(entsel "\Bitte Block picken"))) (progn (setq basispunkt (cdr(assoc 10 (entget block))) rechtsunten (mapcar '- basispunkt (list x y))) (if (and(setq aws_text (ssget "_c" (list basispunkt rechtsunten) (list '(0 . "TEXT") '(8 . "TEXTLAYER")))) (=(sslength aws_text)6)) (progn (setq n 0) (repeat (sslength aws_text) (setq liste_text (cons (list (cdr(assoc 10 (entget (ssname aws_text n))));;TextKoord (cdr(assoc 1(entget (ssname aws_text n))));;TextWert )liste_text) n (+ n 1))) ;;;Textliste nach Y-Werten sortieren, die kleinsten nach oben (setq liste_text (vl-sort liste_text '(lambda(e1 e2) (< (cadr(car e1)) (cadr(car e2))))))) (alert "Es wurden nicht genau 6 Texte gefunden.")) (alert "Es wurde kein Block gepickt."))) )
Ich bin jetzt erstmal davon ausgegangen, wenn ich das in Deinem Bild richtig gesehen habe, dass der Block mit dem Basispunkt an der rechten oberen Ecke des Textrahmens eingefügt ist. Also habe ich mit x und y zwei Werte für die Breite und Höhe des Textblockes angenommen, die mußt Du noch prüfen und verbessern (einfach aus der Zeichnung rausmessen) Wenn Du damit durch bist hast Du eine sortierte Textliste nach y-Werten. ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 03. Dez. 2008 17:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, hab mich bisher fleißigst (nicht besser wissend) durchgeklickt um ein gewisses Tagespensum zu erreichen. Danke dir für die Zeilen. Vielen vielen DANKE!!! Werde das ganze morgen versuchen anzuwenden. Ja, bist richtig davon ausgegangen das der block-basispunkt als auch der einfügepunkt dort liegt. (Im ersten Beitrag ganz oben ist auch noch ein JPG.Anhang) Bin schon freudig gespannt was mir der Nikolaus, (in wirklickkeit ist es der Jörn und co.) gebracht hat. DANKE vorab nochmal. So, nun muss ich zum kennenlern-essen meiner Freundins Onkel. Hochachtungsvolles Ciao... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 10:39 <-- editieren / zitieren --> Unities abgeben:
Hallo beisammen, hallo Jörn, hab das test lisp mit versucht. Meldung "zu viele Argumente" kommt dabei raus. Hab in der Zeile (=(sslength aws_text)6)) die 6 mit der sieben ausgetauscht, da es sieben zeilen sind, (sechs aber nur übernommen werden), und auch hab ich es mit positiven, und negativen Rahmenkoordinaten versucht, auch gemischt positiv und negativ. Bei allem bleibt die Meldung die selbe. Zu viele Argumente. Sind damit die "zu pickenden Text- als auch Blockzeilen gemeint??? Bezüglich der Layer könnte da evtl. die unstimmigkeit sein, oder? (Anhang 3.JPG klärt über die Layer auf) Noch ist ja nicht Nikolaus. Versuche brav und artig zu bleiben (defun c:test ( / AWS_TEXT BASISPUNKT BLOCK LISTE_TEXT N RECHTSUNTEN X Y) (setq x 0.7 y 1.19);angenommene Werte für Breite (x) und Höhe(y) des Textrahmens (if(setq block (car(entsel "\Bitte Block picken"))) (progn (setq basispunkt (cdr(assoc 10 (entget block))) rechtsunten (mapcar '- basispunkt (list x y))) (if (and(setq aws_text (ssget "_c" (list basispunkt rechtsunten) (list '(0 . "TEXT") '(8 . "TEXTLAYER")))) (=(sslength aws_text)7));Die sieben Zeilen? (Eine von den sieben soll nicht im Blockübernommen werden) (progn (setq n 0) (repeat (sslength aws_text) (setq liste_text (cons (list (cdr(assoc 10 (entget (ssname aws_text n))));;TextKoord (cdr(assoc 1(entget (ssname aws_text n))));;TextWert )liste_text) n (+ n 1))) ;;;Textliste nach Y-Werten sortieren, die kleinsten nach oben (setq liste_text (vl-sort liste_text '(lambda(e1 e2) (< (cadr(car e1)) (cadr(car e2))))))) (alert "Es wurden nicht genau 6 Texte gefunden.")) (alert "Es wurde kein Block gepickt."))) ) Bei diesen Lisp-Zeilen versteh ich nun das es etwas komplexer ist, als wie ich dachte den get.lsp mit relativ pick punkten, zum einfügepunkt einfach zu erweitern. Das scheint wohl doch nicht so einfach möglich zu sein... GRÜßE und danke für die Geduld und Ausdauer!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 04. Dez. 2008 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hi, habs nur mal überflogen, vllt. stellts du mal eine dwg mit Ausgang und Soll rein. Ich glaube du hast die Abmessungen vom Neuen bzw Zielblock genommen, dass sollte aber net das Problem sein, dein Layer (8 . "TEXTLAYER")))) müsste doch A_STE_RAU_RAH sein. Hast du den Auswahlsatz aws_text?(kannst du im Überwachungsfenster prüfen) mfg heiko [Diese Nachricht wurde von Dorfy am 04. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2008 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, da hatte ich noch einen Tippfehler drin: es muss heißen (ssget "_c" basispunkt rechtsunten (list '(0 . "TEXT")'(8 . "LAyername"))) anstatt (ssget "_c" (list basispunkt rechtsunten) (list '(0 . "TEXT")'(8 . "Layername"))) dann hatte es bei mir funktioniert. Dorfy hat aber recht, stell mal ein-DWG-Beispiel rein, es ist mühsehlig, immer ein Beispiel zu finden, was ungefähr Deinem entspricht. So, wenn Du das eingeändert hast, dann solltest Du eigentlich bis zu Deinen sortieren Texten kommen. ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 13:38 <-- editieren / zitieren --> Unities abgeben:
Hi, also bald geht das so nicht mehr weiter. Bald hab ich ein so schlechtes gewissen das ich mir da was einfallen hab zu lassen um eich gebührend zu danken... ..hab die Korrekturen vorgenommen; es auch mit negativkoordinaten in der Lispzeile für den Rahmen versucht. (Es wurden nicht genau 6 Texte gefunden erscheint) Wuste nicht das man ne dwg mit anhängen kann. Klasse!! Erlaubte Datei-Typen: .gif , .jpg , .zip , .rar , .pdf , .txt , .mid , .png ???!!! Ach so! Klar, ZIP-it,... Hier ist sie: Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2008 13:54 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, ich habe die Werte für x und y positiv gesetzt, weil ich bei der Bildung der Koordinate linksunten (die ich habe vorher fälschlicherweise "rechtsunten" benannt hatte) mit Basispunkt - (x y) erfolgt => über mapcar Dann erhalte ich die Liste wie auf dem anhängenden Bild, auf diese Liste kannst Du dann mit NTH zugreifen. z.B. (cadr(nth 5 text_liste)) => "Abst." Und jetzt kannst Du diese Werte zuweisen. ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 14:08 <-- editieren / zitieren --> Unities abgeben:
Hi, bei mir erscheinen die alert´s "Es wurden nicht genau 6 Texte gefunden. "Es wurde kein Block gepickt". Den block kann ich ja an beliebiger stelle picken oder? Da zuvor, bevor ich zur "Zuweisung" nachzufragen haben werde... mapcar---steht für was? Stimmen die Lispzeilen soweit, bzw. wenn einfacher evtl. bitte nochmal einfügen... (defun c:test ( / AWS_TEXT BASISPUNKT BLOCK LISTE_TEXT N LINKSSUNTEN X Y) (setq x 0.7 y 1.19);angenommene Werte für Breite (x) und Höhe(y) des Textrahmens (if(setq block (car(entsel "\Bitte Block picken"))) (progn (setq basispunkt (cdr(assoc 10 (entget block))) linksunten (mapcar '- basispunkt (list x y))) (if (and(setq aws_text (ssget "_c" basispunkt linksunten (list '(0 . "TEXT")'(8 . "A_STE_RAU_RAH")))) (=(sslength aws_text)6)) (progn (setq n 0) (repeat (sslength aws_text) (setq liste_text (cons (list (cdr(assoc 10 (entget (ssname aws_text n))));;TextKoord (cdr(assoc 1(entget (ssname aws_text n))));;TextWert )liste_text) n (+ n 1))) ;;;Textliste nach Y-Werten sortieren, die kleinsten nach oben (setq liste_text (vl-sort liste_text '(lambda(e1 e2) (< (cadr(car e1)) (cadr(car e2))))))) (alert "Es wurden nicht genau 6 Texte gefunden.")) (alert "Es wurde kein Block gepickt."))) ) [Diese Nachricht wurde von Danijel am 04. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 04. Dez. 2008 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hi, du prüfst gegen 6 gefunden werden aber 7... Beschäftige dich mal mit der Oberfläche deiner Vlisp-Umgebung. (Befehl: vlide) Bei cadmaro.de gibt es von Jörn Bosse ne tolle Beschreibung... Mfg Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2008 14:36 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
hallo Danijel, Code:
(defun c:test ( / AWS_TEXT BASISPUNKT BLOCK LISTE_TEXT N LINKSSUNTEN X Y) (setq x 0.7 y 1.19);angenommene Werte für Breite (x) und Höhe(y) des Textrahmens (if(setq block (car(entsel "\Bitte Block picken"))) (progn (setq basispunkt (cdr(assoc 10 (entget block))) linksunten (mapcar '- basispunkt (list x y))) (if (and(setq aws_text (ssget "_c" basispunkt linksunten (list '(0 . "TEXT")'(8 . "A_STE_RAU_RAH")))) (=(sslength aws_text)7)) (progn (setq n 0) (repeat (sslength aws_text) (setq liste_text (cons (list (cdr(assoc 10 (entget (ssname aws_text n))));;TextKoord (cdr(assoc 1(entget (ssname aws_text n))));;TextWert )liste_text) n (+ n 1))) ;;;Textliste nach Y-Werten sortieren, die kleinsten nach oben (setq liste_text (vl-sort liste_text '(lambda(e1 e2) (< (cadr(car e1)) (cadr(car e2))))))) (alert "Es wurden nicht genau 7 Texte gefunden.")) (alert "Es wurde kein Block gepickt."))) )
Dorfy war schneller, wie gesagt, es sind 7 und nicht 6 Texte ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 15:05 <-- editieren / zitieren --> Unities abgeben:
Nun versteh ich noch weniger. "Kein Block gepickt" kommt bei mir bei raus. Diese Lisp-Zeilen sind ein sehhhhhhr hohes Niveu der Programierung. (Ich überreis grad mal eine Varialbezuweisung und hab mir noch das sqrt, dir wurzelfunktion noch gemerkt. Mehr versteh ich in lisp nicht. Auch find ich nichts in der Lisp-Hilfe über "Prüfen". Letzten endes versteh ich zu jetztigem Stand der dinge, (eurer tugenhaften unterstützung) eigentlich gar nicht viel anzufangen. Tut mir leid. Bis ich so weit bin das ich das auf diesem Level überreise... Den euern hierher erstellen Lisp-befehl ausgeführt, kommt "kein Block gepickt" egal wo ich ihn anklick... Je mehr ihr mich bemüh das zu verstehn, desto ratloser werd ich und komme vom ganzen ins millionstel... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2008 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, das war noch ein Klammer falsch gesetzt, jetzt solltest Du als Rückgabewert die sortierte Liste erhalten. Die wird Dir so aber noch nichts nützen. Code:
(defun c:test ( / AWS_TEXT BASISPUNKT BLOCK LISTE_TEXT N LINKSUNTEN X Y) (setq x 0.7 y 1.19);angenommene Werte für Breite (x) und Höhe(y) des Textrahmens (if(setq block (car(entsel "\Bitte Block picken"))) (progn (setq basispunkt (cdr(assoc 10 (entget block))) linksunten (mapcar '- basispunkt (list x y))) (if (and(setq aws_text (ssget "_c" basispunkt linksunten (list '(0 . "TEXT")'(8 . "A_STE_RAU_RAH")))) (=(sslength aws_text)7)) (progn (setq n 0) (repeat (sslength aws_text) (setq liste_text (cons (list (cdr(assoc 10 (entget (ssname aws_text n))));;TextKoord (cdr(assoc 1(entget (ssname aws_text n))));;TextWert )liste_text) n (+ n 1))) ;;;Textliste nach Y-Werten sortieren, die kleinsten nach oben (setq liste_text (vl-sort liste_text '(lambda(e1 e2) (< (cadr(car e1)) (cadr(car e2))))))) (alert "Es wurden nicht genau 7 Texte gefunden."))) (alert "Es wurde kein Block gepickt.")) liste_text)
Du solltest vielleicht doch erstmal mit den Grundlagen des Visual-Lisp-Editors vertraut machen, denn erst wenn Du in der Lage bist gezielt Haltepunkte zu setzen und die Inhalte der Variablen zu kontrollieren (da gibt es extra ein Überwachungsfenster), dann kannst Du auch nachvollziehen wo die Fehler versteckt sind. Du kannst Dich nämlich Step für Step durch den Code bewegen. Also der Link zur Anleitung für die Verwendung des Editors: http://www.cadmaro.de/tipps-und-tricks/lisp/anleitung-visuallisp-editor.html Probier es mit einfachen Codes aus, wenn das klappt, dann nehm Dir wieder diesen Code vor und gehe ihn Stück für Stück durch.
------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 15:39 <-- editieren / zitieren --> Unities abgeben:
OK. Na ja, aller anfang ist sch..wer!! "Haltepunkte am besten vor klammern"... Im prüfungsmodus laufen lasen, das dürfte ich auch noch hinkreigen, bald. Aber die Befehlserläuterungen der Lisp-Hilfe im englishen!? Such a tuch to much for me... Sind die LISP-Befehle im Kochbuch-lisp auch ins deutsche übersetzt worden? Der Hauptteil der "Hausaufgabe" ist mir vertraut, zwar noch etwas schwammig aber, ich hatte das mal in der HWK-Schulung. Das kann ich auffrischen; die Benutzeroberfläche von Lisp. Befehlsüberstztung, ohhh jeh.... Ich versuch mal einie von diesem code zu verstehen. Bis dahin... Vielen dank der Mühe trotzdem nochmals an euch!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2008 16:51 <-- editieren / zitieren --> Unities abgeben: Nur für Danijel
Hallo Danijel, Zitat: Sind die LISP-Befehle im Kochbuch-lisp auch ins deutsche übersetzt worden?
Sie sind aber deutsch beschrieben, und das ist doch die Hauptsache. Die Befehle selbst aus dem Englischen zu übersetzen mach wohl nicht viel Sinn, denn Du verwendest Sie ja auch in Englisch.
------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danijel Mitglied Umsch. z. Bauzeichner
Beiträge: 19 Registriert: 03.10.2007 Umschüler zum Bauzeichner
|
erstellt am: 04. Dez. 2008 16:58 <-- editieren / zitieren --> Unities abgeben:
Da kann man sehen, wie genau ich bin, genau beschreiben kann. Das wird wohl mit den Klammern dann auch wohl so in etwa werden... Dann bis zum Fehler-Suchen... P.S. Hast du keine leichtere Hausaufabe für mich??? Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |