| |
| 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: Kreise durch Punkte ersetzen (3565 mal gelesen)
|
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 11. Mrz. 2009 21:14 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen ich habe mir vorher ein kleines lisp geschrieben das mir alle gewählten kreise durch punkte ersetzt. funktioniert bestens. würde mich freuen wenn jemand zeit und lust hat, dies anzuschauen, ein wenig kritik hinterlassen würde. ;Kreise in Punkte umwandeln ;--------------------------------------------------------- (DEFUN C:kreiszupunkt () (setq vZAEHLER 0) (setq vPOSIT 0) (setq vSET (ssget)) (setq vLAENGE (- (sslength vSET) 1)) (setq vWargesperrt 0) (while(<= vPOSIT vLAENGE)
(setq vTrueKreis (cdr(assoc 0(entget(ssname vSET vPOSIT))))) (setq vLayer (cdr(assoc 8(entget(ssname vSET vPOSIT))))) (setq vSperre(cdr(assoc 70(entget(tblobjname "layer" vLayer))))) (if(= vSperre 0) (progn (if(equal vTrueKreis "CIRCLE") (progn (setq vKoord (cdr(assoc 10(entget(ssname vSET vPOSIT))))) (entmake (List '(0 . "POINT") ;Element-Typ (cons 10 vkoord) ;Absetzpunkt ) ) (entdel (ssname vSET vPOSIT)) (setq vZAEHLER (+ vZAEHLER 1)) ) ) ) (setq vWargesperrt (+ vWargesperrt 1) )) (setq vPOSIT (+ vPOSIT 1)) ) (Princ "\nEs Wurden ") (princ vZAEHLER) (princ " Kreise ersetzt!") (cond ((= vWargesperrt 1) (Princ "\nAchtung ") (princ vWargesperrt) (princ " Objekt war auf einem Gesperrten Layer und konnte nicht ersetzt werden!") ) ((/= vWargesperrt 0) (Princ "\nAchtung ") (princ vWargesperrt) (princ " Objekte waren auf einem Gesperrten Layer und konnte nicht ersetzt werden!") ) ) (princ) ) ;--------------------------------------------------------- gruss steff Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Mrz. 2009 21:27 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Warum keine lokale Variablen ? Warum ssget nicht gleich nur auf Kreise anwenden? Warum keine ordentliche Verzweigung , falls der Auswahlsatz leer ist? Warum keine Umwandlung Auswahlsatz->Objektliste und dann Weiterarbeien mit der Liste, z.B mit mapcar ... Aber wenn es deinen Ansprüchen genügt, soll es ok sein ... (meine ich jetzt positiv) denn du bist derjenige, der es einsetzten soll, und der mit etwaigen Mucken klarkommen muss.. Haste dich nun schon mit dem Tutorial vom Mapcar befaßt ? ------------------ - 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 |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 11. Mrz. 2009 21:43 <-- editieren / zitieren --> Unities abgeben:
danke für den comment werde mir das zu herzen nehmen... an dem tutorial von mapcar bin ich dran (gerade jetzt ) aber muss sagen ich halte jeweils nicht lange durch. liegt nicht am tutorial. das ist echt gut. so long ich kämpfe mal weiter. gruss 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: 12. Mrz. 2009 06:24 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Hallo Steff, Es geht doch vorran , weiter so... Deine Ausgabe/Rückmeldungen kannst du mit "strcat" und "rtos" noch ein wenig zusammenfassen. In diesem Zuge kannst du "setq" auch gleich zusammenfassen. (setq a 1 b 2 c 3) (setq vLAENGE (- (sslength vSET) 1))--> hier ziehst du 1 ab (<= vPOSIT vLAENGE) --> hier vergleichst du gegen <= ?? ohne Abzug gegn < vergleichen ?? 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: 12. Mrz. 2009 08:21 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Hallo Steff, ich habe Deinen Code mal ein bißchen schlanker gemacht, auf ein paar Variablen verzichtet und diese lokal deklariert. Zudem habe ich aus der While-Schleife ein Repeat gemacht. Vergleiche einfach mal die Codes, aber denke jetzt bitte nicht, das ist der ultimative Code, es ist nur eine andere Variante (da hat zum Glück jeder seinen eigenen Stil) Code:
(DEFUN C:kreiszupunkt ( / VPOSIT VSET VWARGESPERRT VZAEHLER) (if (setq vSet (ssget (list (cons 0 "CIRCLE")))) (progn (setq vZAEHLER 0 vPOSIT 0 vWargesperrt 0) (repeat (sslength vSET) (if(/=(logand (cdr (assoc 70 (entget(tblobjname "LAYER" (cdr(assoc 8 (entget (ssname vSET vPOSIT))))))))4)4) ;;;wenn nicht gesperrt (progn (entmake (List '(0 . "POINT");Element-Typ (cons 10 (cdr(assoc 10(entget(ssname vSET vPOSIT))))) ;Absetzpunkt )) (entdel (ssname vSET vPOSIT)) (setq vZAEHLER (+ vZAEHLER 1)) ) (setq vWargesperrt (+ vWargesperrt 1) )) (setq vPOSIT (+ vPOSIT 1))) (Princ (strcat "\nEs Wurden " (itoa vZAEHLER) " Kreise ersetzt!")) (if (> vWargesperrt 0) (Princ (strcat "\nEs waren " (itoa vWargesperrt) " Kreise auf einem gesperrten Layer und konnten nicht ersetzt werden!"))) ) (alert "\Es wurden keine Objekte ausgewählt.")) (princ) )
Zitat:
70 Standard-Flags (bitcodierte Werte):1 = Layer ist gefroren, ansonsten getaut. 2 = Layer ist in neuen Ansichtsfenstern standardmäßig gefroren. 4 = Layer ist gesperrt. 16 = Wenn dieses Bit gesetzt ist, ist der Tabelleneintrag extern von einer XRef abhängig. 32 = Wenn sowohl dieses Bit als auch Bit 16 gesetzt sind, wurde die extern abhängige XRef erfolgreich gelöst. 64 = Wenn dieses Bit gesetzt ist, wurde der Tabelleneintrag bei der letzten Bearbeitung der Zeichnung von mindestens einem Element in der Zeichnung referenziert. (Dieses Flag ist für AutoCAD -Befehle vorgesehen. Das Flag kann von den meisten Programmen ignoriert werden, die die DXF-Dateien auslesen; bei Programmen, die in eine DXF-Datei schreiben, erübrigt sich das Setzen des Flags.)
D.h., wenn ein Layer in neuen Ansichtsfenstern standardmäßig gefroren ist bekommt er den Code 2, bei Deiner Abfrage wäre der Kreis nicht durch einen Punkt ersetzt worden, weil der Code ungleich Null ist. Wenn der Layer jetzt aber zudem auch noch gesperrt ist, dann würde der Code 2+4=6 lauten. D.h. wiederum, eine Abfrage, ob der Code 4 ist würde auch nicht reichen. Dafür gibt es die Funktion LOGAND, kannst ja mal im Forum nach suchen, da gibt es glaube ich so einige Beiträge. ------------------ viele Grüße Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 12. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 12. Mrz. 2009 08:50 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
ok .. so hätte ich 's gemacht : (defun C:kreiszupunkt (/ VSET I OBJLIST L1) (if(setq VSET (ssget '((0 . "CIRCLE")))) (progn (setq I -1) (repeat (sslength VSET) (setq OBJLIST(cons(ssname VSET(setq I(1+ I)))OBJLIST)) ) (setq L1(mapcar '(lambda(X / Y LAY) (if(and(setq Y(entget X)) (/=(logand(cdr(assoc 70 (entget(tblobjname "LAYER"(cdr(assoc 8 Y))))))4)4) (entmake (list '(0 . "POINT") (assoc 10 Y) ) ) ) (progn (entdel X) (entlast) ) ) ) OBJLIST ) ) (prompt(strcat (itoa(length OBJLIST)) " Kreise gewählt. Davon " (itoa(length (vl-remove-if 'null L1))) " umgewandelt\n" ) ) ) (prompt "\nKeine Kreise gewählt!\n") ) ) da hab ich in L1 auch gleich die Liste der Punkte, wenn was weiterverarbeitet werden soll ... usw. Wenns um große Kreisanzahl geht, kann man sich vorher auch ne Liste der gesperrten Layer anlegen und dann bloß mit member vergleichen, ob Kreislayer dazugehört .... spart Rechenzeit .. ------------------ - 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 |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 12. Mrz. 2009 09:53 <-- editieren / zitieren --> Unities abgeben:
hallo zusammen besten dank für die vielen anregungen. hab einiges dazugelernt. @jörn besten dank für den hinweis der bitcodierten werte das hab ich nicht gewusst...
@dorfy "<" werde ich mir merken keine ahnung wiso ich das nicht so gelöst habe... @CADmium ich brauche glaube ich noch ein paar jahre bis meine lisps so kompakt werden. im moment bin ich nur froh wenn ich verstehe was ich mache L1 ist sicher nie schlecht mann weiss ja nie was noch kommt. so jetzt mal die pause nutzen und in ruhe nochmal alles anschauen...
danke euch allen
[Diese Nachricht wurde von Steff179 am 12. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |