| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: zwei Fragen (1398 mal gelesen)
|
Alfonso Mitglied Holztechniker
Beiträge: 44 Registriert: 24.08.2005 HP Workstation Z400 Intel(R) Xeon(R) CPU W3550 @ 3.06GHz 16.0 GB RAM Nvidea Quadro 4000 Windows 7 Proffessional 64bit AutoCAD 2012 Inventor 2012 Navisworks Manage 2012
|
erstellt am: 11. Jan. 2007 14:03 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, bin gerade dabei etwas zu programmieren, komme aber an manchen stellen nicht weiter. 1. Mit dem befehl "open" und "write-line" schreibe ich Textdateien für anderer Programme. Diese müssen aber in einem bestimmten Ordner liegen. Um zu prüfen ob ein Ordner vorhanden ist, habe ich diesen code gefunden (vl-directory-files "C:/....../....."). Aber wie erstelle ich einen neuen Ordner? 2. Wie kann ich mittels lisp herrausfinden, wie oft ein bestimmter block in einer Zeichnung vorhanden ist. Mit dem ergebnis möchte ich dann in lisp weiterarbeiten. Habe schon im Forum gesucht, aber nur den Befehl "blocklist" gefunden. Dieses ist mir aber zu umständlich weil damit alle Blöcke in einer Datei geschrieben werden, und ich diese dann wieder auslesen muss. Bin für jede Hilfe dankbar. mfg Alfonso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 11. Jan. 2007 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2007 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
mit (vl-file-directory-p filename) kannst du feststellen, ob ein Verzeichnis existiert. mit (vl-mkdir .. kannst du ein neues Verzeichnis erzeugen. (sslength(ssget "_X" (list(0 . "INSERT")(cons 2 BLOCKNAME)))) liefert dir die unverschachtelten Referenzen.. über die entgetliste der Blockdef kannst du dir auch eine Liste aller Referenzen erstellen ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alfonso Mitglied Holztechniker
Beiträge: 44 Registriert: 24.08.2005 HP Workstation Z400 Intel(R) Xeon(R) CPU W3550 @ 3.06GHz 16.0 GB RAM Nvidea Quadro 4000 Windows 7 Proffessional 64bit AutoCAD 2012 Inventor 2012 Navisworks Manage 2012
|
erstellt am: 16. Jan. 2007 07:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für eure Hilfe. Das mit dem Verzeichnis erstellen funktioniert super. Das mit dem Abfragen der Blocke funktioniert auch. (setq anzahl (sslength (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))))) Es gibt aber noch ein Problem. Wenn der Block noch nicht in der Zeichnung vorhanden ist, wir das Lisp-Programm mit einer Fehlermeldung abgebrochen. Habe es schon gelöst, indem ich bei jedem start den Block einfüge und ihn nacher wieder lösche. Dieses scheint mir aber keine elegante Lösung zu sein. Gibt es da noch andere Lösungswege? mfg Alfonso Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 16. Jan. 2007 07:58 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
|
Alfonso Mitglied Holztechniker
Beiträge: 44 Registriert: 24.08.2005 HP Workstation Z400 Intel(R) Xeon(R) CPU W3550 @ 3.06GHz 16.0 GB RAM Nvidea Quadro 4000 Windows 7 Proffessional 64bit AutoCAD 2012 Inventor 2012 Navisworks Manage 2012
|
erstellt am: 16. Jan. 2007 08:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, das war ja mal eine schnelle Antwort. Die Funktion "tblsearch" gibt mir aber nur nil aus, wenn der Block noch nicht vorhanden ist. Bei mir ist der Block schon vorhanden, aber noch nicht in der Zeichnung eingefügt. Ich hoffen ich drücke mich richtig aus. mfg Alfonso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 16. Jan. 2007 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Hier bekommt man nur schnelle Antworten... Dann musst du es in diese Richtugn irgendwie lösen (ich glaub bei mir versteckt sich noch ein kleiner Fehler...)
Code:
(if (>= (sslength (ssget "x" (list (cons 0 "INSERT") (cons 2 "ZCNC-Nummer")))) 1) (progn (setq anzahl (sslength (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer")))))) ) (progn (princ "Keine Objekte eingefügt") ) )
------------------ Grüsse Thomas [Diese Nachricht wurde von tunnelbauer am 16. Jan. 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: 16. Jan. 2007 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Hallo Alfonso, dann bau doch ein IF direkt für den Auswahlsatz ein: Code:
(if (setq aws (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer")))) (setq anzahl (sslength aws)) (setq anzahl 0))
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alfonso Mitglied Holztechniker
Beiträge: 44 Registriert: 24.08.2005 HP Workstation Z400 Intel(R) Xeon(R) CPU W3550 @ 3.06GHz 16.0 GB RAM Nvidea Quadro 4000 Windows 7 Proffessional 64bit AutoCAD 2012 Inventor 2012 Navisworks Manage 2012
|
erstellt am: 16. Jan. 2007 08:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, dein ansatz habe ich sofort umgesetzt und es funktioniert. (if (/= (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))) nil) (setq anzahl (sslength (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))))) (setq anzahl 0) ) vielen dank an euch. nfg Alfonso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 16. Jan. 2007 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Zitat: Original erstellt von Alfonso: Hallo Jörn,dein ansatz habe ich sofort umgesetzt und es funktioniert. (if (/= (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))) nil) (setq anzahl (sslength (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))))) (setq anzahl 0) ) vielen dank an euch. nfg Alfonso
den Ansatz von Jörn hast du nicht umgesetzt, sondern verschlimmbessert .. : 1. (ssget "x" ..) liefert einen Auswahlsatz oder nil, da muß ich nicht nochmal auf (if(/=..) testen .. 2. du läßt zweimal einen Auswahlsatz erstellen.. das kostet Rechenzeit, auch wenn du eine Variable sparst .. Sorry, aber die Kritik konnte ich jetzt mal nicht lassen..
es geht übrigens auch mit einem and/or Konstrukt: (or(and(setq AWS(ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer")))) (setq anzahl (sslength AWS)) ) (setq anzahl 0) ) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alfonso Mitglied Holztechniker
Beiträge: 44 Registriert: 24.08.2005 HP Workstation Z400 Intel(R) Xeon(R) CPU W3550 @ 3.06GHz 16.0 GB RAM Nvidea Quadro 4000 Windows 7 Proffessional 64bit AutoCAD 2012 Inventor 2012 Navisworks Manage 2012
|
erstellt am: 16. Jan. 2007 10:35 <-- editieren / zitieren --> Unities abgeben:
Hallo CADmium ich dachte immer, das der Testausdruck bei einer if Abfrage immer sowas wie (ist gleich) oder (kleiner als) beinhalten muss. Durch deine Kritik habe ich schon wieder etwas gelernt! (if (setq AWS (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer")))) (setq anzahl (sslength AWS)) (setq anzahl 0) ) mfg Alfonso
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 16. Jan. 2007 10:40 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Zitat: Original erstellt von Alfonso:
Durch deine Kritik habe ich schon wieder etwas gelernt!
besser als in Mapcars Tutorial kann ich das auch nicht erklären .. vielleicht liest du es mal in einer freien Minute.. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." 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: 16. Jan. 2007 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Hallo Alfonso, na dann verweise ich auch nochmal direkt auf Mapcar's Stilblüten, da ist das Problem von oben super erklärt: http://www.autolisp-tutorial.mapcar.net/stilfragen2.html Zitat:
Und was hat nun T damit zu tun? T ist ein Symbol, nichts weiter. Es gibt aber eine Art Vereinbarung, dass Funktionen das Symbol T zurückgeben, wenn inhaltlich ein true gemeint ist. Was würde sich ändern, wenn alle Funktionen, die bisher im Wahr-Fall T zurückgeben, ab morgen X oder SCHOENES-WETTER-HEUTE zurückgäben? Nichts! Entweder gibt eine Funktion nil zurück, dann wissen wir, dass es der Falsch-/Unwahr-/Nichts-Fall war, oder sie gibt etwas anderes zurück - dann war es der Wahr-/Richtig/Ichts-Fall. Aber was die Funktion im Einzelnen zurückgibt, spielt keinerlei Rolle. Und damit kommen wir zur AutoLisp-Stilblüte schlechthin:(if (/= irgendeine-liste nil) (dann-mach-weiter ...) (dann-lass-stecken ...) ) Wer die Anfangskapitel dieses Tutorials aufmerksam gelesen hat, kennt die Regeln: Die Argumente werden von links nach rechts verarbeitet, also ist die Klammer mit der Funktion (/= ...) zuerst dran. irgendeine-liste evaluiert dann zu nil, wenn die Liste leer ist. Was testen wir dann? Es wird getestet, ob nil ungleich nil ist. Das kann auf jden Fall nur 'wahr' ergeben. Wesentlich ist hier das Wissen, dass irgendeine-liste sowieso zu 'wahr' evaluiert, wenn sie nicht leer ist. Also warum nicht gleich so: (if irgendeine-liste (dann-mach-weiter ...) (dann-lass-stecken ...) )
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vlide Mitglied
Beiträge: 29 Registriert: 10.07.2006 AutoCAD 200x ObjectDCL 3.0
|
erstellt am: 16. Jan. 2007 13:19 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Hallo Alfonso, hier noch eine kleine nette Erweiterung: (if (setq AWS (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer")))) (alert (strcat (itoa (sslength AWS)) " Blöcke")) (alert "0 Blöcke") ) Das (ssget "x" (list (cons 0 "INSERT") (cons 2 "CNC-Nummer"))) kannst du verkürzen zu (ssget "x" '((2 . "CNC-Nummer"))) da: - du das Objekt "Inserts" direkt über den Gruppencode 2 suchst kann somit auch (cons 0 "INSERT") entfallen - das '((2 . "CNC-Nummer")) so stark verkürzt wird, da du den Blocknamen ja nicht variabel hälst und somit als nicht-auszuwertende Liste an ssget übergibst Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 16. Jan. 2007 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für Alfonso
Vorsicht Wolfgang .. da mußt du aber z.B. sicher sein, das z.B. keine Schrafurren mit Mustername "CNC-Nummer" vorhanden sind .. oder Mlines mit einem Stil solchen Namens.. auch wenn das nur hypotetisch ist, man kann gar nicht so quer denken .. deshalb ..lass das (0 . "INSERT") drin , dann ist es eindeutig ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |