• Dieses Forum ist die maschinengenerierte Übersetzung von www.cad3d.it/forum1 - der italienischen Design-Community. Einige Begriffe sind nicht korrekt übersetzt.

Rename Label (TAG) Blockattribut

  • Ersteller Ersteller 77marco77
  • Erstellt am Erstellt am

77marco77

Guest
Guten Abend,
um den Namen des Attributlabels zu ändern Ich fand diese Lisp
HTML:
(defun c:c1 ( / alttagname newtagname tagname ss x n blk att att )
(vl-load-com)
(setq alttagname "aukstis")
(setq newtagname "ag")
(setq ss nill)
(prompt "\npick alle Blöcke zu ändern: ")
(setq ss (ssget))
(falls (und (/= alttagname "")(/= newtagname "")(/= ss nil))
(Prog.)
(Setq x 0 n 0)
(Repeat)
(setq blk (vlax-ename->vla-object (ssname ss x)))
(wenn (Safearray-Wert (setq atts (vlax-variant-value (vla-getattributes blk))))
(Prog.)
(setq atts (vlax-safearray->list (vlax-variant-value (vla-getattributes blk))))
(foreach att att
(setq tagname (strcase (vla-get-tagstring att))); tagname
(wenn (und (/= Newtagname "")(= Tagname Oldtagname))
(Prog.)
(vla-put-tagstring att newtagname)
(Setq n (+ n 1))
);
wenn
);
);
wenn
(Setq x (+ x 1))
); Wiederholungslänge ss
(alert (strcat "changed " (itoa n) " tagnames to: " newtagname))
);
wenn
(princ)
Funktion
qui Zurück zur Übersichtund tun, was er sollte.
Ich möchte es so ändern können, dass es die Anweisungen auch dann abschließt, wenn sie zwischen den anderen einen Block oder ein Element auswählen, das das Etikett nicht enthält (im Moment durch Fehler und Austritt aus dem Befehl).
wenn man auch das Attribut zur Änderung und den neuen Namen fragen könnte, ohne jedes Mal ändern zu müssen, wäre die Lispe das Maximum, aber ich würde mit einer Hilfe auch nur für den ersten Teil begeistert sein:)
 
Code:
(defun c:c1 (/oldtagname newtagname ss x n blk atts)
(vl-load-com)
(setq alttagname (strcase)
Newtagname (Strcase (getstring "\nnuova etichetta:")
n 0
)
(wahrscheinlich alle Blöcke zu ändern)
(setq ss (ssget '(0. "Insert"))))
(und ss (/= alttagname)
(Prog.)
(Repeat)
(setq blk (vlax-ename->vla-object)
(falls (vla-get-hasattributes :vlax-true)
(Prog.)
(setq toss (vlax-safearray->list (vlax variant-value (vla-getattributes blk))))
(Foreach Elem Atts
(wenn (vla-get-tagstring elem) alttagname
(Prog.)
(vla-put-tagstring elem newtagname)
(Setq n (1+ n))
)
)
)
)
)
)
)
)
(alert (strcat "changed" (itoa n)" genannt: "newtagname")
(Princ)
)
 
Hallo confutatis, damit sind wir drei, die in einer sehr kurzen Zeit mir helfen!
der Code tut genau das, was ich wollte (ich stelle mir vor, die Szene, in der Sie es mit der linken Hand geschrieben haben, während mit dem rechten Getränk den Kaffee und/oder die Zeitung durchsuchen. .

Vielen Dank!
 
Hallo confutatis,
Ich erkannte jetzt nur, dass der Code oben tut, was ich in seiner Zeit gefragt habe, aber nicht alles, was ich heute brauche. .
Ich muss Attribute Tags übersetzen, damit ich Tags in Blockdefinitionen ändern muss, und ich bin auf der Suche nach dem Weg, den Tag-Namen eines Mehrfach-Block-Attributs gleichzeitig zu ändern.
die Modifikation sollte in der Definition des Attributs erfolgen (und nicht nur in der Referenz), d.h. wenn ich den Block mit dem Blockeditor nach dem Starten der Lisp über dem Tag öffnen sollte den neuen Namen haben, aber leider ist es nicht so.
Außerdem, wenn ich sincatt löscht die Änderungen und Berichte Tags und Attribute auf den ursprünglichen Namen und die Definition des Blocks dann verlieren auch die Informationen im Attribut.

Ich hätte diesen Code gefunden (ich weiß nicht, wo...):
Code:
;;; Attribute umbenennen
(defun renattrib ($blk $old $new / Blöcke bo eo ao)
;; erhalten Blöcke Sammlung in der aktuellen Zeichnung
(setq Blöcke (vla-get-blöcke (vla-get-activedocument (vlax-get-acad-object))))
Schritt durch alle Blöcke
(vlax-für bo Blöcke)
Schritt durch alle Einheiten in Block
(vlax-für eo bo
(cond)
;; wenn attdef & im Zielblock & alt tag
(und (= (vla-get-objectname eo) "acdbattributedefinition")
(Strcase (vla-get-name bo)) (Strcase $blk))
(= (vla-get-tagstring eo) $old)
)
(vla-put-tagstring eo $new)
)

;; wenn Block Referenz & Zielblock
(und (= (vla-get-objectname eo) "acdbblockreference")
(= (Strcase (vla-get-effektivename eo)))
)
Schritt durch alle Attribute
(vlax-safearray->list (vlax-variant-value (vla-getattributes eo)))
;; überprüfen, ob Ziel attrib
(wenn (= (Strcase (vla-get-tagstring ao)))))
(vla-put-tagstring ao $new)
)
)
)
)
) ;_ Ende des vlax-for
) ;_ Ende des vlax-for
)
;;;;;
das tut, was ich brauche, aber um es gehen zu lassen, muss ich den Befehl der Aufforderung für jeden einzelnen Block und für jedes einzelne Attribut geben.
würde es einen Weg geben, das Verfahren zu beschleunigen?
Danke im Voraus
 
Ja, es gibt insgesamt 6358 Blöcke, mit einer variablen Anzahl von Attributen zwischen 6 und 28. alle Blöcke haben diese 6 Tags immer gleich, ca. 80% der Blöcke hat zusätzliche 6 gleiche Attribute und die restlichen 20% haben zusätzliche Zahl variieren zwischen 2 und 14 (auch gleich).
 
Ich weiß nicht, ob du das wolltest...
Code:
;;; Attribute umbenennen
(defun c:renatt (/ Blöcke bo eo ao)
;; erhalten Blöcke Sammlung in der aktuellen Zeichnung
(setq oldtag (strcase (getstring "\nold tag: "))))
(setq newtag (strcase (getstring "\nnew tag: "))))
(setq Blöcke (vla-get-blöcke (vla-get-activedocument (vlax-get-acad-object))))
Schritt durch alle Blöcke
(vlax-für bo Blöcke)
Schritt durch alle Einheiten in Block
(vlax-für eo bo
(cond)
;; wenn attdef & im Zielblock & alt tag
(und (= (vla-get-objectname eo) "acdbattributedefinition")
(= (vla-get-tagstring eo) oldtag)
)
(vla-put-tagstring eo newtag)
)
)
) ;_ Ende des vlax-for
) ;_ Ende des vlax-for
(vl-cmdf "_attsync" "n" "*")
(princ)
)
 
Zuletzt bearbeitet:
Code tut genau, was es sollte (und bei der Geschwindigkeit des Lichts!).

was ich wirklich mag über Ihre Codes ist die "simplicity" und Eleganz, die sie aussehen lassen (und leider nur aussehen) ein Teenager-Spiel.

Vielen Dank!
 

Statistik des Forums

Themen
58.521
Beiträge
499.056
Mitglieder
104.110
Neuestes Mitglied
ChristianR

Zurzeit aktive Besucher

Keine Mitglieder online.
Zurück
Oben