| | | 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: Mit ssget alle Linien aus Zeichnung löschen funktioniert nicht (2468 mal gelesen)
|
fewoer Mitglied
Beiträge: 28 Registriert: 09.01.2012 AutoCAD Architecture 2011 Graitec Advance Steel 2012 Windows Vista 64 Bit
|
erstellt am: 17. Jul. 2012 14:41 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, und wieder einmal ein Problem, bei dem ich schon wieder den ganzen Tag am Brüten bin. Ich will folgendes erreichen: es sollen alle Advance Steel Körper in ACIS-Körper umgewandelt werden, um die Betrachtung unserer AutoCAD Modelle auch ohne Graitec Advance Steel Aufsatz zu ermöglichen. Kopfbolzen müssen normal explodiert werden, da es sonst Fehler gibt und Schnitte o.ä. plötzlich beim Umwandeln herausgelöscht werden. Schweißnähte bleiben nach dem Umwandeln in ACIS Körper später als Kreuze aus Linien in der Zeichnung übrig - diese sollen aber ebenfalls gelöscht werden. Mein Ansatz war, über ssget alle Linien auszuwählen und anschließend zu löschen. Wenn ich nur den Code Code:
(setq l (ssget "X" '((0 . "LINE")))) (command "_erase" l ""); ENDE Routine Linien löschen
dazu nutze, dann macht er das auch anständigerweise wie ich das will. Sobald ich aber den Code in das restliche Programm einbaue, bringt er mir einen Fehler, dass es eine ungültige Auswahl wäre und er einen Punkt erwartet. Wo ist denn da bitte mein Denkfehler? Danke euch schon mal für eure wie immer vermutlich schnelle und kompetente Hilfe :redface:) Hier der vollständige Programmcode: Code:
(defun c:feacis(/) ; BEGINN Routine Kopfbolzen normal explodieren (setq ausw (ssget "X")) (setq koelae (sslength ausw)) (while (> koelae 0) (setq name (ssname ausw (setq koelae (- koelae 1)))) (setq art (cdr (assoc 0 (entget name)))) ; ; --- ab hier AST-Elemente, die in ACIS-Körper umgewandelt werden sollen ------------- (if (or (= art "ASTCONNECTOR") (= art "AstConnector")); Kopfbolzen werden hiermit normal aufgebrochen (progn (command "_explode" name) )) (princ) ); ENDE Routine Kopfbolzen normal explodieren ; ; BEGINN Routine alle Advanced Steel Objekte markieren, selektieren und in ACIS Objekte umwandeln (command "_AstM4CommSelectAllDscObjects" "ALL") (command "_AstM4CommExplodeToAcis"); ENDE ACIS-Routine (princ) ; ; BEGINN Routine Linien löschen (setq l (ssget "X" '((0 . "LINE")))) (command "_erase" l ""); ENDE Routine Linien löschen ); end c:feacis
[Diese Nachricht wurde von fewoer am 17. Jul. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADblue Mitglied
Beiträge: 117 Registriert: 20.07.2011 ACAD18,Linear19
|
erstellt am: 17. Jul. 2012 15:42 <-- editieren / zitieren --> Unities abgeben: Nur für fewoer
hey fewoer, ich hab mir gerade mal testhalber nur dieses codestück reingeladen:
Code:
(princ) (setq l (ssget "X" '((0 . "LINE")))) (command "_erase" l "")
ohne "princ" lief es einwandfrei, mit "princ" jedoch hat es mir den letzen befehl wiederholt und mich aufgefordert ebenfalls einen punkt anzugeben. "princ" mal weglassen? mfg blue Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fewoer Mitglied
Beiträge: 28 Registriert: 09.01.2012 AutoCAD Architecture 2011 Graitec Advance Steel 2012 Windows Vista 64 Bit
|
erstellt am: 17. Jul. 2012 16:23 <-- editieren / zitieren --> Unities abgeben:
Hey CADblue, danke für die schnelle Antwort, bei mir läuft es allerdings auch ohne das princ nicht. Das hatte ich nachträglich eingefügt, weil ich dachte es würde helfen. Ich habe momentan die Vermutung, dass es an der Stelle gegen Ende hängt:
Code:
(command "_AstM4CommExplodeToAcis") (setq l (ssget "X" '((0 . "LINE")))) (command "_erase" l "")
Ich glaube, er führt zuerst das Kommando AstM4CommExplodeToAcis aus, sucht sofort nach Linien und versucht die zu löschen. Aber es gibt eben erst Linien in der Zeichnung, wenn alle Advance Steel Körper in ACIS-Körper umgewandelt wurden. Daher vermute ich, findet er keine Linien und will dann eben wissen, was er denn löschen soll. Ergibt das Sinn? Ich doktore gerade behelfsweise mit einer Pause oder Delay Funktion rum - aber bisher funktioniert es noch nicht und wäre auch nicht meine liebste Lösung. Gut wäre, wenn er irgendwie erst nach Linien sucht, wenn tatsächlich alle Körper umgewandelt wurden. Aber wie kann man das anstellen - da bin ich auch etwas ratlos leider. 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: 17. Jul. 2012 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für fewoer
ne Schleife while oder repeat und mit if oder sonstwas den Auswahlsatz prüfen ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." -Lots of irritating superfluous parentheses!- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADblue Mitglied
Beiträge: 117 Registriert: 20.07.2011 ACAD18,Linear19
|
erstellt am: 18. Jul. 2012 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für fewoer
versuch mal den (if) code einzubauen, einfach mal um zu prüfen ob der befehl "astm4..." übergangen wird... (command "_AstM4CommExplodeToAcis") (if (/= nil (setq l (ssget "x" '((0 . "line")))))(command "_erase" l "")(alert "keine linien gefunden")) 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: 18. Jul. 2012 18:39 <-- editieren / zitieren --> Unities abgeben: Nur für fewoer
wenn's daran liegt, dass "_AstM4CommExplodeToAcis" noch arbeitet, Dein Program aber schon weiterläuft, solltest Du warten, bis der Befehl beendet ist: also: Code: ... (command "_AstM4CommExplodeToAcis") (while (> 0 (getvar "cmdactive")) (wait-v2 1)) ... (defun wait-v2 (secs) (setq endt (+ (getvar "DATE") (/ secs 86400.0))) (while (< (getvar "DATE") endt) T) )
Vielleicht hilfts.Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fewoer Mitglied
Beiträge: 28 Registriert: 09.01.2012 AutoCAD Architecture 2011 Graitec Advance Steel 2012 Windows Vista 64 Bit
|
erstellt am: 26. Jul. 2012 11:20 <-- editieren / zitieren --> Unities abgeben:
Tut mir leid für die späte Antwort - geht gerade ein bißchen rund bei uns. @Dorfy: Hab's mal mit einer while Schleife probiert, irgendwie sind mir aber keine sinnvollen Kriterien eingefallen wie mit ssget die Anzahl der Auswahlsätze für Linien zu überprüfen. Habe festgestellt, dass die Zeichnung durchaus auch schon von Anfang an Linien enthalten kann - Hilfslinien beispielsweise. Sollen auch herausgelöscht werden. Ich hab's dann versucht so zu lösen, dass er die Anzahl der Auswahlsätze überprüft, 500ms wartet und dann die Anzahl der Auswahlsätze nochmal überprüft. Sobald dann die Differenz ungleich 0 ist, soll er anfangen Linien zu löschen. Irgendwie kommen aber nie neue Linien hinzu, egal wie lang die Schleife läuft. Daher läuft sie dann endlos. Ich poste mal den Code, vielleicht habe ich auch einen Denkfehler. Code:
(setq Linie (ssget "X" '((0 . "LINE")))) (setq AnzahlAuswahlsatz1 (sslength Linie)) (command "_.DELAY" 500); Wartezeit 500ms (setq Linie (ssget "X" '((0 . "LINE")))) (setq AnzahlAuswahlsatz2 (sslength Linie)) (setq DifferenzAuswahlsatz (- AnzahlAuwahlsatz2 AnzahlAuswahlsatz1)) (while (= DifferenzAuswahlsatz 0) (setq Linie (ssget "X" '((0 . "LINE")))) (setq AnzahlAuswahlsatz1 (sslength Linie)) (command "_.DELAY" 500); Wartezeit 500ms (setq Linie (ssget "X" '((0 . "LINE")))) (setq AnzahlAuswahlsatz2 (sslength Linie)) (setq DifferenzAuswahlsatz (- AnzahlAuswahlsatz2 AnzahlAuswahlsatz1)) (setq Name (ssname Linie (setq AnzahlAuswahlsatz1 (- AnzahlAuswahlsatz1 1)))) (setq Art (cdr (assoc 0 (entget Name)))) (if (or (= Art "LINE") (= Art "Line")) (progn (command "_erase" Name "") ) ) ); end while
@CADblue: Habe den Code mal eingebunden, wieder der gleiche Fehler: ungültige Auswahl, erwartet einen Punkt. Der alert wird garnicht erst ausgegeben. @wronzky: Vielen Dank! Der Codeschnipsel hat tatsächlich geholfen ) - auch wenn mir noch nicht so ganz klar ist, warum es so funktioniert und mit einem einfachen Delay, das lang genug ist zumindest der Fehler unterdrückt wird. Ein riesengroßes Dankeschön auch an alle, die mitgedacht und versucht haben zu helfen. This made my day! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|