| |
| 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: cond (1531 mal gelesen)
|
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 27. Jun. 2014 14:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, LISP soll mir innerhalb einer Konstruktion eine Anzahl berechnen. Die Strecke "L" soll geteilt werden, so daß der Abstand dann "<=350 " ist. (setq Anzahl (cond ((L)<=350 2) ((/ L 2)<=350 3) ((/ L 3)<=350 4) ((/ L 4)<=350 5) ) ) Mein Code funktioniert so leider noch nicht, ich habe auch noch nirgendwo ein Beispiel gefunden, wie es funktionieren könnte. Bestimmt hat jemand einen Tipp für mich. Gruß Dieter
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: 27. Jun. 2014 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 27. Jun. 2014 14:50 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Dein Code ist ja gar kein Lisp, das sieht fast nach Basic aus Code: (setq L 900.0) (setq Anzahl (cond ((<= L 350) 2) ((<= (/ L 2) 350) 3) ((<= (/ L 3) 350) 4) ((<= (/ L 4) 350) 5) ) ) (Print L) (print Anzahl)
Aber wäre eine Formel für die Anzahl nicht bequemer? ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 27. Jun. 2014 14:50 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
|
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 30. Jun. 2014 07:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, vielen Dank für eure Hilfe. @Jörn genau das hat mir gefehlt, so funktioniert es @Udo ich wusste nicht, das man in AutoCAD “Basic“ anwenden kann, oder dachtest du an VBA? Ist mein Code aus deiner Sicht kein Lisp, weil er nicht so formatiert ist? Dieses “Lisp“ schreibe ich alles im txt – Editor, da kann man das nicht per Mausklick “Lisp-formatieren“. In Excel würde ich es natürlich mit einer Formel machen, aber hier sollen die Ergebnisse im “Lisp“ weiter verwendet werden, sie fließen als Anzahl und Abstand in eine Anordnung, da brauche ich keine Ausgabe der errechneten Werte. @cadffm deine Alternative ist natürlich auch genial, ich habe sie minimal abgeändert, und dann liefert sie bei jeder beliebigen, getesteten Länge das richtige Ergebnis. Du hattest geschrieben: (setq Anzahl (1+(fix(/ L 350.0)))) Im Lisp hatte mir diese Schreibweise angewöhnt: (+(……) 1), kann man das auch anders schreiben? @all bei der Anordnung, in der die errechneten Werte weiter verwendet werden sollen habe ich ein kleines Problem: command "_arrayrect" (entlast) "" "Assoziativ" "j" "Spalten" XAnzahl XAbstand "Zeilen" YAnzahl YAbstand "x") bei diesem Code nimmt AutoCAD den XAbstand als Gesamtabstand, und nicht als Einzelabstand der Spalten. Die Zeilen macht AutoCAD bei diesem Code jedoch völlig korrekt. Andere Reihenfolge Spalten/Zeilen: command "_arrayrect" (entlast) "" "Assoziativ" "j" "Zeilen" YAnzahl YAbstand "Spalten" XAnzahl XAbstand "x") bei diesem Code nimmt AutoCAD den YAbstand als Gesamtabstand, und nicht als Einzelabstand der Zeilen. Die Spalten macht AutoCAD bei diesem Code jedoch völlig korrekt. Hat vielleicht auch dafür jemand eine Lösung? Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013 Windows 8.1 Professional 64 Bit AutoCAD 2020
|
erstellt am: 04. Jul. 2014 17:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, hat denn niemand einen Ansatz, warum AutoCAD so merkwürdig mit den Abständen umgeht Ich kann zwar diese Anordnung über die Eigenschaften sehr einfach korrigieren, aber AutoCAD müsste es doch auch sofort richtig machen können. Gruß Dieter [Diese Nachricht wurde von dwg3d am 04. Jul. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 04. Jul. 2014 19:03 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Ich habe jetzt kein Acad zur Hand, bin mir aber sicher das es an der Bedienung liegt. Tippe einfach alles per Hand in der Befehlszeile durch, lese die Hilfe wenn nötig. Aber ohne es selbst getestet zu haben ist es natürlich nur eine Mutmaßung. Oder funktioniert es in der Befehlszeile per Hand und nur im Command nicht?? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 04. Jul. 2014 19:10 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
[QUOTE]Original erstellt von dwg3d: ich wusste nicht, das man in AutoCAD “Basic“ anwenden kann, kann man IMHO auch nicht, Dein Code "riecht" nur sehr nach Basic Ist mein Code aus deiner Sicht kein Lisp, weil er nicht so formatiert ist?
eher weniger. Aber - die Syntax ist völlig falsch. Grundaufbau eines LISP-Ausdrucks: (Funktion Argument1 Argument2 ...) Also (L) kann nicht funktionieren, weil L keine Funktion ist oder auch ((/ L 2)<=350 3) kann nicht funktionieren, weil <= nicht unmittelbar nach einer öffnenden Klammer steht usw. Du hattest geschrieben: (setq Anzahl (1+(fix(/ L 350.0)))) Im Lisp hatte mir diese Schreibweise angewöhnt: (+(……) 1), kann man das auch anders schreiben?
(1+ Wert) ist die Kurzform für (+ Wert 1), praktisch kein Unterschied in der Wirkung, kannst nehmen was Dir besser gefällt (1+ ist um Nuancen schneller). @all bei der Anordnung, in der die errechneten Werte weiter verwendet werden sollen habe ich ein kleines Problem: command "_arrayrect" (entlast) "" "Assoziativ" "j" "Spalten" XAnzahl XAbstand "Zeilen" YAnzahl YAbstand "x") Hat vielleicht auch dafür jemand eine Lösung? Probier's mal so: (command "_arrayrect" (entlast) "" "Anzahl" XAnzahl YAnzahl "" XAbstand YAbstand "AS" "j" "x") HTH Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 04. Jul. 2014 19:13 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Original erstellt von cadffm: Ich habe jetzt kein Acad zur Hand,
Dummerweise fragt _arrayrect in der Befehlszeile die Eingabewerte in ganz anderer Reihenfolge ab als bei einem (command "_arrayrect" ...) Siehst Du, wenn Du mal wieder ein AutoCAD vor Dir hast (Ich hab's auch nur am Rechner austüfteln können) Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 07. Jul. 2014 18:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, wir haben wieder eine Erfolgsmeldung: wenn ich _arrayrect manuell eingebe, erstellt AutoCAD die gewünschte Anordnung. Für command habe ich Jürgens Tipp aufgegriffen: (command "_arrayrect" (entlast) "" "Anzahl" XAnzahl YAnzahl "" XAbstand YAbstand "AS" "j" "x") Ergebnis: AutoCAD erstellt die gewünschte Anordnung, bei der allerdings X und Y vertauscht sind. Jetzt habe ich im command X und Y getauscht: (command "_arrayrect" (entlast) "" "Anzahl" YAnzahl XAnzahl "" YAbstand XAbstand "AS" "j" "x") Ergebnis: AutoCAD erstellt die gewünschte Anordnung völlig korrekt, bei allen Testläufen. Vielen Dank für eure Hilfe. Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 07. Jul. 2014 19:44 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Nun ich noch einmal weil sich dies hier ja fast wie Voodoo, statt wie Logik, liest (heute MIT Acad )Wenn 2 Werte vertauscht ankommen ist ja klar das der Commandablauf anders ist und zumindest für diese beiden Werte ist klar das man sie genau anders herum angeben muß. Problem erkannt, Problem gebannt. Um nicht im trüben zu fischen, jetzt wo dir bekannt ist das der Commandablauf anders ist, testest du natürlich nicht weiter mit der normalen Befehlszeileneingabe, sondern mit der Commandvariante, so siehst du was Acad wirklich möchte. da die Objektwahl funktioniert hatte, überspringe ich das und fange gleich etwas später an: (command "_.ARRAYRECT" "_l" "") aktuelle Aufforderung ansehen: Entgegengesetzte Ecke für die Anzahl der Elemente angeben oder [Basispunkt/Winkel/Anzahl] <Anzahl>: und weiter: (command "_.ARRAYRECT" "_l" "" "ANZAHL") aktuelle Aufforderung ansehen: Anzahl der Zeilen eingeben oder [Ausdruck] <4>: und weiter: (command "_.ARRAYRECT" "_l" "" "ANZAHL" 3) usw. Einmal der ganze Ablauf Usereingabe vs. Command: Code: Befehl: REIHERECHTECK Objekte wählen: Letztes 1 gefunden Objekte wählen:Typ = Rechteckig Assoziativ = Ja Griff zum Ändern der Anordnung auswählen oder [ASsoziativ/Basispunkt/ANzahl/ABstand/Spalten/ZEilen/Ebenen/beeNden] <beeNden>: ANZAHL Anzahl von Spalten eingeben oder [Ausdruck] <4>: 5 Anzahl von Zeilen eingeben oder [Ausdruck] <3>: 3 Griff zum Ändern der Anordnung auswählen oder [ASsoziativ/Basispunkt/ANzahl/ABstand/Spalten/ZEilen/Ebenen/beeNden] <beeNden>: ABSTAND Abstand zwischen Spalten angeben oder [Zelle] <375>: 350 Abstand zwischen Zeilen angeben <375>: 450 Griff zum Ändern der Anordnung auswählen oder [ASsoziativ/Basispunkt/ANzahl/ABstand/Spalten/ZEilen/Ebenen/beeNden] <beeNden>: beeNden
Code: Befehl: (command "REIHERECHTECK" "LETZTES" "" "ANZAHL" 3 5 "ABSTAND" 450 350 "eXit") REIHERECHTECKObjekte wählen: LETZTES 1 gefunden Objekte wählen: Typ = Rechteckig Assoziativ = Ja
Entgegengesetzte Ecke für die Anzahl der Elemente angeben oder [Basispunkt/Winkel/Anzahl] <Anzahl>: ANZAHL Anzahl der Zeilen eingeben oder [Ausdruck] <4>: 3 Anzahl der Spalten eingeben oder [Ausdruck] <4>: 5 Entgegengesetzte Ecke für Abstand zwischen Elementen angeben oder [Abstand] <Abstand>: ABSTAND Abstand zwischen Zeilen angeben oder [Ausdruck] <254.7341>: 450 Abstand zwischen Spalten angeben oder [Ausdruck] <271.2161>: 350 Griff zum Ändern der Anordnung auswählen oder [ASsoziativ/Basispunkt/Zeilen/Spalten/Ebenen/eXit]<eXit>: eXit
Und jetzt wo allgemeine Punkte besprochen sind:
Es gibt die Lispfunktion INITCOMMANDVERSION, diese steuert einige Commandvarianten einiger Acad-Befehle. Schau dir die Funktion in der Hilfe an und teste dann mal folgende Abläufe dazu: Code: (progn (initcommandversion 2) (command "_.ARRAYRECT" "_l" "" "ANZAHL" 5 3 "ABSTAND" 350 450 "beeNden") )
Code: (progn (initcommandversion 1) (command "REIHERECHTECK" "LETZTES" "" "ANZAHL" 3 5 "ABSTAND" 450 350 "eXit") )
So, nun sollte der _Array gebannt sein und man ist für die nächste Command-Schlacht wieder etwas besser gerüstet.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 07. Jul. 2014 19:50 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Original erstellt von dwg3d:
Ergebnis: AutoCAD erstellt die gewünschte Anordnung, bei der allerdings X und Y vertauscht sind.
Ja - das war mein Fehler. Die Eingaben werden von (command "_arrayrect" ...) wie folgt abgefragt: ... Anzahl der Zeilen eingeben oder [aUsdruck] <4>: Anzahl der Spalten eingeben oder [aUsdruck] <4>: Entgegengesetzte Ecke für Abstand zwischen Elementen angeben oder [Abstand] <Abstand>: Abstand zwischen Zeilen angeben oder [aUsdruck] <45.6304>: Abstand zwischen Spalten angeben oder [aUsdruck] <45.6304>: ... Zeilen sind ja in Y-Richtung und Spalten in X-Richtung angeordnet. Das hatte ich übersehen, ist aber von Dir richtig erkannt und korrigiert worden. Entschuldigung, falls ich zu viel Verwirrung gestiftet haben sollte. Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 07. Jul. 2014 20:02 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Original erstellt von cadffm:
Es gibt die Lispfunktion INITCOMMANDVERSION
Super Tip. Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 09. Jul. 2014 19:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, bislang hatte ich gedacht, wenn AutoCAD nach _ARRAYRECT anbietet: [ASsoziativ/Basispunkt/ANzahl/ABstand/Spalten/ZEilen/Ebenen/beeNden] dann sollte ich ANzahl/ABstand nur dann wählen, wenn ich für Spalten/ZEilen/Ebenen den gleichen Wert haben will, ist ja auch eigentlich logisch. Aber nun ist klar geworden, das es sich anders verhält. Mit mehr ausprobieren wäre ich vielleicht auch irgendwann drauf gekommen _ARRAYRECT dürfte jetzt aber restlos entzaubert sein. “INITCOMMANDVERSION“ ist hier natürlich genial. Vielen Dank für eure Tipps Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |