| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Einfügen von Blöcken in einem Raster (806 mal gelesen)
|
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 24. Okt. 2007 19:33 <-- editieren / zitieren --> Unities abgeben:
Guten Abend. Vorgeschichte hier: Rund um AutoCAD - alter Thread Ich Versuche verschiedene Blöcke an verschiedenen Koordinaten einzufügen. Das mach ich bis jetzt so: (Dank ein wenig Hilfe )
Code: (setq punktliste (list '(0.0 1000.0 1.0) '(0.0 2000.0 1.0) '(0.0 3000.0 1.0) '(0.0 1000.0 2.0) '(0.0 2000.0 2.0) '(0.0 3000.0 2.0); ); ); (foreach n punktliste (command "_.insert" "block" n "" "" 90"" ));
Wie man sieht werden die Blöcke in einem Raster eingefügt. Dabei ändert sich die Y-Koordinate immer um 1000.0. Danach ändert sich die Z-Koordinate immer um 1. Ich würde das gerne automatisieren. Das ich nach dem Laden eingebe wie oft ich den Block in Y-Richtung will und wie oft ich ihn in Z-Richtung will. Hierbei sollte sich dann immer ein Rechteckiges Raster ergeben. Hab mir das gerade im "Kochbuch" angeschaut, so wie ich mir das gedacht hätte. Hab aber nichts über Abfragen/Eingaben innerhalb einer Funktion entdeckt. Und das erweitern von Koordinaten in Listen funktioniert irgendwie auch nicht. Wäre drum über jede Hilfe froh.
MfG PsycoDad
------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 24. Okt. 2007 20:15 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 24. Okt. 2007 21:47 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Hi, also ich geh mal davon aus, dass Du die Grundsätze von Lisp schon mal verstanden hast (z. B. dass jede Funktion einen Wert zurückgibt, Reihenfolge der Evaluation der Funktionen etc.). Jetzt musst Du damit arbeiten! Ein Punkt ist eine Liste aus 3 Koordinaten. Listen werden mit LIST gebildet. z. B. (List 1 2 3) ergibt (1 2 3) Variablen werden mit SETQ gespeichert. z. B. (setq y-hoch 1000) jetzt noch verbinden: (list 0 y-hoch 1) ergibt (0 1000 1) Da Du eine Koordinate (erstmal) hochzählen willst, brauchst Du eine Schleife. Die einfachste Schleife ist REPEAT. z. B. (repeat 5 (setq punktliste (cons (list 0 (setq y-hoch (+ y-hoch 1000)) 2) punktliste))) [wenn Du dieses letzte Beispiel verstanden hast, ist Deine Funktion so gut wie fertig. ] Benutzereingaben hat ja schon Ernst angedeutet: GETINT für Ganzzahlen, GETREAL für reele Zahlen. Jetzt bist Du erst mal wieder dran... Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de
[Diese Nachricht wurde von wronzky am 24. Okt. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 25. Okt. 2007 08:15 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Hallo, ich dachte ich poste mal ein Beispiel, und dann habe ich festgestellt, daß ich die Problemstellung beim überfliegen des Beitrages nicht so richtig beachtet habe. Aber das finde ich gar nicht so schlimm, denn prinzipiell kannst Du Dir das folgende Beispiel auf Dein eigenes Problem übertragen: Die folgende Funktion erstellt ein Raster in x und y:
Code:
(defun test (/ I PKT X X_N Y Y_N liste) (setq pkt (getpoint "\nStartpunkt:") x (getreal "\nAbstand in x:") x_n (getint "\nAnzahl x:") y (getreal "\nAbstand in y:") y_n (getint "\nAnzahl y:")) (repeat y_n (setq i 0) (repeat x_n (setq liste (cons (mapcar '+ pkt (list (* i x) 0.0)) liste)) (setq i (+ i 1))) (setq pkt (mapcar '+ pkt (list 0.0 y)))) liste)
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 29. Okt. 2007 12:08 <-- editieren / zitieren --> Unities abgeben:
Danke für die Hilfe. Hab da jetzt schon mal einiges versucht. Hab es jetzt mal so angefangen, da alles weitere zu viel auf einmal ist. Und bekomme hier auch schon eine Fehlermeldung. Komm mit dem Umgang der ";" noch nicht klar. Hier der Code:
Code: ( (setq x (getint "\nReihen:")) (if (= x 1) (setq punktliste (list '(0.0 1.0 0.0) '(0.0 2.0 0.0) '(0.0 3.0 0.0) '(0.0 4.0 0.0) '(0.0 5.0 0.0) ) ) (foreach n punktliste (command "_.insert" "2607157_AR_RIEGEL_1-57M" n "" "" "" ) ) ) )
AutoCad 2005 liefer das zurück:
Code: ; Fehler: Fehlerhafte Funktion: 1
Kann mir jemand helfen? ------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 29. Okt. 2007 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Hi, jede Funktion liefert ein Ergebnis zurück, das entweder ausgegeben wird, oder als Argument in der übergeordneten Klammer verwendet wird. Was passiert bei ((setq x (getint))): Die innerst Klammer ist die Abfrage (getint). Sie liefer 1 zurück (wenn Du 1 eingibst). Das Ergebnis wird an die übergeordnete Klammer übergeben: (setq x 1)setzt die Variable x auf 1 und lieifert 1 zurück. Das Ergebnis wird an die übergeordnete Klammer übergeben: ( 1) -> Da ein Lisp-Ausdruck immer in der Form (Befehl Argument[e]) aufgebaut ist, sucht AutoCAD nach der Funkion 1 - und findet sie nicht. Fehler... Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 29. Okt. 2007 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Hallo, und ich glaube Du hast noch eine schließende Klammer hinter dem (setq punktliste... vergessen. Zur Zeit läuft es so: Wenn x = 1, dann Punktliste, sonst FOREACH Mit progn kannst Du die Anweisungen hinter dem If zusammenfassen, so das es lautet Wenn x = 1, dann Punktliste und FOREACH Code:
(defun C:test ( / ) (setq x (getint "\nReihen:")) (if (= x 1) (progn (setq punktliste (list '(0.0 1.0 0.0) '(0.0 2.0 0.0) '(0.0 3.0 0.0) '(0.0 4.0 0.0) '(0.0 5.0 0.0))) (foreach n punktliste (command "_.insert" "2607157_AR_RIEGEL_1-57M" n "" "" "" )) ) ) )
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 29. Okt. 2007 13:37 <-- editieren / zitieren --> Unities abgeben:
Ok. Das hab ich glaub verstanden. Meine Variable x wird aufjedenfall gleich 1 gesetzt. (wenn ich 1 eingebe) Allerdings liefert mir mein setq x eine 1 zurück die hier nicht gebraucht wird. Heißt ich muss den Rückgabewert "1" unterdrücken, oder wie schaff ich es sonst diesen Fehler zu vermeiden und das Ausführen der "if" funktion zu erreichen? Ich will in der Tat "Wenn x = 1, dann Punktliste und FOREACH" ausführen, habe das gerade mit dem "(progn" versucht, kommt trotzdem die Fehlermeldung. Code: Befehl: ((setq x (getint "\nReihen:")) (_> (if (= x 1) ((_> (progn (((_> (setq punktliste ((((_> (list (((((_> '(0.0 1.0 0.0) (((((_> '(0.0 2.0 0.0) (((((_> '(0.0 3.0 0.0) (((((_> '(0.0 4.0 0.0) (((((_> '(0.0 5.0 0.0))) (((_> (foreach n punktliste ((((_> (command "_.insert" "2607157_AR_RIEGEL_1-57M" n "" "" "" )) (((_> ) ((_> ) (_> ) Reihen:1 ; Fehler: Fehlerhafte Funktion: 1
Ich weiß ich nerve langsam, aber würde das echt gern verstehen. ------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 29. Okt. 2007 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Hi, einfach die äussere Klammer weglassen (EDIT:und die ganz am Ende dann natürlich). statt ((setq x (getint "\nReihen:")) - (setq x (getint "\nReihen:")). "unterdrücken" kann man die Rückgabe in Lisp nicht, wäre auch gegen die Sprachlogik! Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de
[Diese Nachricht wurde von wronzky am 29. Okt. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 29. Okt. 2007 13:47 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
Ich bin mir nicht sicher ob ich Dich richtig verstanden habe, ich glaube aber, Du mußt nur ein ein IF (vor das (setq x setzen Dann könnte man es so ausdrücken, wenn ein X eingegeben wird, dann mach.
Code:
(defun C:test ( / ) (if(setq x (getint "\nReihen:")) (progn (setq punktliste (list '(0.0 1.0 0.0) '(0.0 2.0 0.0) '(0.0 3.0 0.0) '(0.0 4.0 0.0) '(0.0 5.0 0.0))) (foreach n punktliste (command "_.insert" "2607157_AR_RIEGEL_1-57M" n "" "" "" )) ) ) )
Aber jetzt habe ich nochmal eine Frage, wenn Du das X abfragst, wiese verwendest Du es nicht (oder war das jetzt erst der Anfang, den Du später "ausbauen" willst")??? ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 29. Okt. 2007 17:23 <-- editieren / zitieren --> Unities abgeben:
Ja, ist natürlich nur der Anfang. Ne Konstante "1" abfragen wäre sogar für mich ein wenig zu hart. Ne, werde die "If" Aufsplittung natürlich noch anpassen. MfG PsycoDad ------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 30. Okt. 2007 13:47 <-- editieren / zitieren --> Unities abgeben:
Hätte da noch mal eine Frage. Füge mittlerweile mehrere Blöcke in meine Zeichnung ein, dabei ist mir aufgefallen das mein AutoCad 2005 geradezu ein eigenleben entwickelt hat. Die Blöcke tauchen nicht immer an den angegebenen Koordinaten auf. Meistens verschieben sich die Blöcke nur in einer Koordinatenrichtung um ca 10 Zeicheneinheiten. Hab es jetzt mehrmals getestet, liegt das an meinem AutoCad oder ist dieser Bug bekannt? ------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3329 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 30. Okt. 2007 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
|
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 30. Okt. 2007 14:15 <-- editieren / zitieren --> Unities abgeben:
|
PsycoDad Mitglied Bauleiter
Beiträge: 54 Registriert: 10.11.2005 AutoDesk AutoCad 2005, Pentium 4 2,8Ghz 1024RAM Asus P4P800 ATI READON 9600 Pro 256MB
|
erstellt am: 30. Okt. 2007 15:11 <-- editieren / zitieren --> Unities abgeben:
Und dann noch was! Ich füge meine Blöcke so ein: Code: (command "_.insert" "block1" "2.0,0.0,0.0" "" "" "" )
Jetzt würde ich gerne die y-Koordinate als Variable haben. Also irgendwie so: Code: (setq y 0.0) (command "_.insert" "block1" "2.0,y,0.0" "" "" "" )
Das geht aber eben nicht. Oben wurde mir ja gezeigt das ich die Koordinaten in einer Liste speichern und da dann auch ändern kann. Würde die Änderung aber lieber immer direkt machen. Gibt es da ne Lösung? Im Kochbuch find ich nichts. ------------------ Essen und schlafen, macht niemand zum Grafen! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 30. Okt. 2007 15:18 <-- editieren / zitieren --> Unities abgeben: Nur für PsycoDad
|