Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Kreise durch Punkte ersetzen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Steff179 an!   Senden Sie eine Private Message an Steff179  Schreiben Sie einen Gästebucheintrag für Steff179

Beiträge: 266
Registriert: 09.08.2007

AutoCAD 2014

erstellt am: 11. Mrz. 2009 21:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13527
Registriert: 30.11.2003

.

erstellt am: 11. Mrz. 2009 21:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Steff179 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Steff179 an!   Senden Sie eine Private Message an Steff179  Schreiben Sie einen Gästebucheintrag für Steff179

Beiträge: 266
Registriert: 09.08.2007

AutoCAD 2014

erstellt am: 11. Mrz. 2009 21:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Dorfy an!   Senden Sie eine Private Message an Dorfy  Schreiben Sie einen Gästebucheintrag für Dorfy

Beiträge: 900
Registriert: 21.07.2006

AutoCad2007, ProE, HiCad

erstellt am: 12. Mrz. 2009 06:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Steff179 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Steff179 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13527
Registriert: 30.11.2003

.

erstellt am: 12. Mrz. 2009 08:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Steff179 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Steff179 an!   Senden Sie eine Private Message an Steff179  Schreiben Sie einen Gästebucheintrag für Steff179

Beiträge: 266
Registriert: 09.08.2007

AutoCAD 2014

erstellt am: 12. Mrz. 2009 09:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz