|  |  | 
|  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | 
|  |  | 
|  | Von Digital Twins bis Hochleistungs-Computing: PNY präsentiert seine Zukunftstechnologien für die Industrie von morgen, eine Pressemitteilung 
 | 
| Autor | Thema:  In LiSP: statt Klicken soll ein Auswahlrechteck her (1843 mal gelesen) | 
 | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 13:36  <-- editieren / zitieren -->    Unities abgeben:            
  Hallo, brauche diese Hilfe, um den Code vom Tool ATT-Clone anzupassen. Ich möchte dabei die Blöcke, welche die Attributwerte des zuerst angeklickten Source-Blocks übernehmen sollen, nicht anklicken müssen, sondern per Auswahlrechteck markieren. Sonst müsste ich zig tausendmal klicken. Hier der Code von ATT-Clone: ;;; ***********************************************************************;;; * ATT-CLONE dient zum Übertragen von Attributwerten eines Blockes auf *
 ;;; * beleibige andere Blöcke.                                            *
 ;;; * Bei identischen "Feldnamen" (also AttributNAMEN) wird der Wert des  *
 ;;; * Quellblocks als Wert des zu klickenden Zielblocks eingetragen.      *
 ;;; * Versuch's mit der dem Original-Zip Archiv beiliegenden              *
 ;;; * "Test-Att-Clone.dwg"                                                *
 ;;; *                                                                     *
 ;;; * Written by Marc Scherer in 2002                                     *
 ;;; *                                                                     *
 ;;; * Anregungen/Kritik an "marc.scherer@zvo.com"                         *
 ;;; *                                                                     *
 ;;; * Dieses Programm folgt der "Better than Nothing" Philosophie des     *
 ;;; * Leonid Nemirovsky: (http://home.pacifier.com/~nemi/)                *
 ;;; * Zitat:                                                              *
 ;;; * The AutoLISP programs you are about to check - are NOT shareware    *
 ;;; * or freeware. They are BTN - Better Than Nothing Software.           *
 ;;; * You can freely use them in any way you choose.                      *
 ;;; * Just remember one thing.......                                      *
 ;;; * If they do not perform the way you expect -                         *
 ;;; *                                it is still BETTER THAN NOTHING !!!  *
 ;;; * I wrote those programs for my every day work.                       *
 ;;; * Some of them are more useful, some - are SO SO.                     *
 ;;; * ... Good Luck !                                                     *
 ;;; ***********************************************************************
 ;;; Funktionsaufruf zum Pinselübertragen
 ;;; Überträgt Attributwerte von einem Quellblock auf beliebig
 ;;; viele Zielblöcke
 (defun C:ATT-CLONE (/ ATT-LST CHK OBJ OBJ-DATA)
 (while
 (/= (if (setq OBJ
 (car
 (entsel
 "\nBitte Quellblock für Attributwert-Übertragung wählen: "
 ) ;_ end of entsel
 ) ;_ end of car
 ) ;_ end of setq
 (progn
 (setq CHK (cdr (assoc 0 (setq OBJ-DATA (entget OBJ)))))
 (if (/= CHK "INSERT")
 (princ "\nKein BLOCK-Objekt geklickt, versuch's noch einmal...")
 ) ;_ end if
 CHK
 ) ;_ end of progn
 (princ "\nNICHTS geklickt, versuch's noch einmal...")
 ) ;_ end of if
 "INSERT"
 ) ;_ end of /=
 ) ;_ end of while
 (if OBJ-DATA
 (progn
 (if (CHK-ENT OBJ)
 (progn
 (setq ATT-LST (ALL-BL-TXT OBJ))
 (if (not ATT-LST)
 (princ
 "\nQuell-Block enthält keinerlei Attributsdaten... Funktionsende !"
 ) ;_ end princ
 (progn
 (while (setq OBJ
 (car
 (entsel
 "\nBitte Zielblock für Attributwert-Übertragung wählen (R.Klick=Ende): "
 ) ;_ end of entsel
 ) ;_ end of car
 ) ;_ end of setq
 (if (CHK-ENT OBJ)
 (progn
 (if (assoc 66 (entget OBJ))
 (progn
 (foreach ELEM ATT-LST
 (princ (ED-ATT ELEM OBJ))
 ) ;_ end foreach
 ) ;_ end progn
 (princ "\nZielblock enthält keine Attribute !")
 ) ;_ end if
 ) ;_ end progn
 (princ "\nObjekt war KEIN Block oder UNGÜLTIG!")
 ) ;_ end of if
 ) ;_ end of while
 ) ;_ end progn
 ) ;_ end if
 ) ;_ end progn
 (princ "\nObjekt war KEIN Block oder UNGÜLTIG!")
 ) ;_ end of if
 ) ;_ end of progn
 ) ;_ end of if
 (princ)
 ) ;_ end defun
 ;;; Funktion checkt, ob Objekt ein regulärer Block oder'n Xref
 ;;; ist, bzw. ob's überhaupt 'n Insert ist...
 ;;; Rückgabe: Wenn kein Block, dann nil, ansonsten Ausgabe wie Eingabe
 (defun CHK-ENT (ENT / ENT-DATA)
 (if (= (type ent) 'ENAME)
 (setq ent-data (entget ent))
 (setq ent-data (entget (car ent)))
 ) ;_ end of if
 (cond
 ((= (cdr (assoc 0 ENT-DATA))
 "INSERT"
 ) ;_ end =
 (if
 (>= (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 ENT-DATA))))
 ) ;_ end cdr
 4
 ) ;_ Wenn T dann Xref!!!
 (progn
 (princ
 "\nGeklicktes Objekt war ein XREF. Versuch's noch mal..."
 ) ;_ end princ
 (setq ENT NIL)
 ) ;_ end progn
 (setq ENT ENT)
 ) ;_ end if
 )
 (t
 (princ
 "\nGeklicktes Objekt war KEIN Block. Versuch's noch mal..."
 ) ;_ end princ
 (setq ENT NIL)
 )
 ) ;_ end cond
 ENT
 ) ;_ end defun
 ;;; Funktion tauscht Attributwerte aus.
 ;;; Zu übergeben ist eine cons List aus
 ;;; ("ATTBEZEICHNUNG" . "NEUER TEXTWERT")
 ;;; sowie der Elementname des Blocks, dessen Werte verändert werden sollen
 (defun ED-ATT (CHANGELST OBJNAME / ATTNAME BACK CHK OBJDATA TXTWRT)
 (setq ATTNAME (car CHANGELST)
 TXTWRT  (cdr CHANGELST)
 OBJDATA (entget OBJNAME)
 ) ;_ end of setq
 (while (/= (cdr (assoc 0 OBJDATA)) "SEQEND")
 (setq OBJDATA (entget (entnext (cdr (assoc -1 OBJDATA)))))
 (if (eq (cdr (assoc 2 OBJDATA)) ATTNAME)
 (progn
 (setq OBJDATA (subst (cons 1 TXTWRT) (assoc 1 OBJDATA) OBJDATA))
 (entmod OBJDATA)
 (setq CHK (entupd OBJNAME)
 OBJDATA (list (cons 0 "SEQEND"))
 ) ;_ end setq
 ) ;_ end progn
 ) ;_ end if
 ) ;_ end while
 (if CHK
 (setq BACK (strcat "\nWert: \""      TXTWRT
 "\" für: \""      ATTNAME
 "\" eingesetzt..."
 ) ;_ end strcat
 ) ;_ end of setq
 (setq BACK
 (strcat "\nFeld: \"" ATTNAME "\" im Zielblock nicht vorhanden...")
 ) ;_ end of setq
 ) ;_ end of if
 BACK
 ) ;_ end of defun
 ;;; Funktion durchsucht den Block, der über ename übergeben wird,
 ;;; nach ATTRIB's und erzeugt 'ne Textliste
 ;;; Retval: Liste der Texte oder nil
 (defun ALL-BL-TXT (ENAME / EDATA RETVAL)
 (setq RETVAL '() ;_ Liste initialiseren
 EDATA  (entget ENAME)
 ) ;_ end setq
 (if (assoc 66 EDATA) ;_ GC 66 fehlt, wenn Block keine Attrib's hat
 (progn
 (while (/= (cdr (assoc 0 EDATA)) "SEQEND") ;_ Solange die Sequenz nicht endet...
 (setq EDATA (entget (entnext (cdr (assoc -1 EDATA)))))
 (if (= (cdr (assoc 0 EDATA)) "ATTRIB")
 (setq RETVAL
 (cons
 (cons (cdr (assoc 2 EDATA)) (cdr (assoc 1 EDATA)))
 RETVAL
 ) ;_ end cons
 ) ;_ end setq
 ) ;_ end if
 ) ;_ end while
 (setq RETVAL (reverse RETVAL))
 ) ;_ end progn
 ) ;_ end if
 RETVAL
 ) ;_ end defun
 (princ "\n\"ATT-CLONE\"->\"Pinselübertragung\" von Attribut-WERTEN...") (princ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | CADmium Moderator
 Maschinenbaukonstrukteur
 
         
 
  
 
      Beiträge: 13533Registriert: 30.11.2003
 . |    erstellt am: 04. Apr. 2007 13:38  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   | 
                        | cadffm Moderator
 良い精神
 
         
 
  
 
      Beiträge: 22689Registriert: 03.06.2002
 Alles |    erstellt am: 04. Apr. 2007 13:40  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   | 
                        | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 13:43  <-- editieren / zitieren -->    Unities abgeben:            
  Weil es auch extrem viele Attribute sind... Sorry für das Cross-Posting    ich versuche den thread zu löschen. hatte beim ersten Mal einfach im falschen Forum gepostet. [Diese Nachricht wurde von toXin am 04. Apr. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | Brischke Moderator
 CAD on demand GmbH
 
         
 
  
 
      Beiträge: 4201Registriert: 17.05.2001
 AutoCAD 20XX, defun-tools (d-tools.eu) |    erstellt am: 04. Apr. 2007 14:04  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   
  wie weit bist du denn schon gekommen, bei deinen Eigenversuchen? Ich denke, du solltest dir die AutoLISP-Befehle(ssget ..) in Verbindung mit der Filterliste ansehen.
 Dann brauchst du eigentlich nur noch die (while -Schleife für die Elemente des Auswahlsatzes durchlaufen.
 (setq Auswahlsatz(ssget ..))(while Auswahlsatz
 (setq OBJ (ssname Auswahlsatz 0)
 Auswahlsatz (ssdel OBJ Auswahlsatz)
 )
 ...
 Alles klar? Grüße Holger ------------------Holger Brischke
 CAD on demand GmbH
 Individuelle Lösungen von Heute auf Morgen.
 
   Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 14:23  <-- editieren / zitieren -->    Unities abgeben:            
  @Brischke Danke! Ich muss jedoch zu meiner Schande zugeben, dass ich absolut keine Ahnung von LISP habe - es aber wohl Zeit wird, sich damit zu beschäftigen. Ich verstehe sehr wohl, dass ich hier nicht einfach nur "für mich arbeiten" lassen darf- dafür entschuldige ich mich.  Dann wird jetzt erstmal... weiterge"klickt".   Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | CADmium Moderator
 Maschinenbaukonstrukteur
 
         
 
  
 
      Beiträge: 13533Registriert: 30.11.2003
 . |    erstellt am: 04. Apr. 2007 14:29  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   
 Zitat:Original erstellt von toXin:
 @Brischke
 Danke! Ich muss jedoch zu meiner Schande zugeben, dass ich absolut keine Ahnung von LISP habe - es aber wohl Zeit wird, sich damit zu beschäftigen. Ich verstehe sehr wohl, dass ich hier nicht einfach nur "für mich arbeiten" lassen darf- dafür entschuldige ich mich.  Dann wird jetzt erstmal... weiterge"klickt".     
 Top-Einstellung .. vielleicht findet Marc ja die Zeit , sein Tool für dich anzupassen. Vielleicht möchtest du aber in der Zwischenzeit einen kleinen Einstieg in Lisp? .. dann ist Mapcars Tutorial ein Muss! ------------------
 
  - 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 | 
                        | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 14:43  <-- editieren / zitieren -->    Unities abgeben:            | 
                        | gmk Mitglied
 Dipl.-Ing.(FH) Vermessung
 
    
 
      Beiträge: 672Registriert: 23.10.2002
 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM |    erstellt am: 04. Apr. 2007 16:01  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   | 
                        | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 16:32  <-- editieren / zitieren -->    Unities abgeben:            | 
                        | gmk Mitglied
 Dipl.-Ing.(FH) Vermessung
 
    
 
      Beiträge: 672Registriert: 23.10.2002
 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM |    erstellt am: 04. Apr. 2007 16:58  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   | 
                        | toXin Mitglied
 
 
  
 
      Beiträge: 20Registriert: 16.08.2006
 |    erstellt am: 04. Apr. 2007 17:33  <-- editieren / zitieren -->    Unities abgeben:            | 
                       
| 
  
 |  | 
 | Theodor Schoenwald Ehrenmitglied
 
 
      
 
      Beiträge: 1672Registriert: 16.04.2002
 |    erstellt am: 04. Apr. 2007 19:05  <-- editieren / zitieren -->    Unities abgeben:           Nur für toXin   |