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

Wert hinzufügen zu blockieren Attribut

  • Ersteller Ersteller Cristallo
  • Erstellt am Erstellt am

Cristallo

Guest
Dann begann ich die Embole und möchte eine Routine schreiben, die eine Reihe von Blöcken (die eine altimetrische Quote in Form eines Attributwertes enthalten) kann hinzufügen / subtrahieren eine bestimmte Delta.
die Idee ist einfach, eine Art Addval bereits auf der Website vorhanden, aber das wirkt auf die Werte von Attributen.

aber ich habe schon im ersten Schritt mit Acad geschlagen, also den Wert des im Block enthaltenen Attributs zu erhalten.
Ich bekomme die Blockliste, ich bekomme die Untereinheiten, ich sehe sie alle (alles in der Befehlszeile, also wenn vorhanden ich sehe, was ich suche), aber in keiner Weise kann ich eine Gruppe finden, die den aktuellen Wert des Attributs enthält.

Gibt mir jemand einen Tipp?
 
Geben Sie zuerst den Blocknamen und den Labelnamen in die Variablen ein.
Code:
(defun c:cambiaquota (nb ne blk n aufgeführte Option)

(setq nb ‚quota‘)
(setq ne ‚altim‘)

(vla-startundomark (vla-get-activedocument))
(ii) und
(Preis "Nselezionare in Blucochi Da modificare")
(setq blk (ssget (list '(0. "insert") (cons 2 nb))))
(Setq delta)
(Getdist (strcat "ndelta Quote" (if delta (strcat "<" (rtos delta 2 2)">: ")))))))
(zur Teilnahme)
)
)
(Repeat)
(setq bl (ssname blk)
(Fortsetzung aufgeführt (vlax-invoke (vlax-ename->vla-object bl) 'getattributes')
(wenn (Strcase (vla-get-tagstring aufgeführt))
(Prog.)
(setq attval (+ (atof (vla-get texting aufgeführt)))
(vla-put text string notiert (rtos Auswahl 2 (getvar ‘luprec))))
)
)
)
)
)
(vla-endundomark (vla-get-activedocument))
(Princ)
)
 
Wovon reden wir? Ich kann Ihnen nur hier danken.
Offensichtlich tut Ihr Code genau das, was ich suchte, jetzt muss ich nur ein wenig anwenden, um es zu verfeinern.
Danke noch mal.
 
Bitte:

wenn Sie in Vanille die Schleife auf den einzelnen Blöcken bevorzugen, können Sie so eingestellt werden:
Code:
 (Repeat)
(setq bl (ssname blk (setq n (1-n))))
(falls (setq ent)
(while (= cdr (assoc 0) "attrib")
(falls = (Strcase (cdr (assoc 2)) ne)
(Progn)
(setq attval (cdr (assoc 1))
(setq newattval (rtos (+ (atof attval) delta) 2 (getvar 'luprec))))
(entmod (subst (cons 1 newattval) (assoc 1 (entget ent1))
)
)
(setq ent1 (entnext ent1)
)
)
)
 
andere Sache, wenn Sie nicht wollen, die Lippe auf nur einen Blocknamen beschränken, können Sie sie mit einem Filter auf dem dxf 66 auswählen

(Ssget "x"(0 . "Insert") (66.1))

wenn der Wert 1 ist, folgt die Insert-Instanz einer Reihe von Attrib-Instanzen, die mit einer seqend-Instanz enden.
:smile:
 
Also...
Ich nahm den Blocknamen (arm flexibel, um ihn in der Liste anzuzeigen) durch eine einfache Zuordnung zur Gruppe 2(setq nb (cdr (assoc '2 (entget (car (entsel " Wählen Sie einen der Blöcke zum Update: "))))))Nun, wenn Sie den Tag des einzigen Attributs im Block bekommen wollen?
Verdammte Attribute, ich verstecke mich gut!
 
wenn der Block Attribute hat, gibt dieses Fragment den Namen des Labels und den Wert zurück des Cousins Attribut.

(setq bl (car (entsel "wähle einen der Blöcke zum Update: ")
(setq ent1 (entnext (cdr))))
(Setq-Label (cdr (assoc 2 ent1))
(Satzwert (cdr (assoc 1 ent1))
 
immer auf dem Stück. Es funktioniert großartig und die Tatsache, dass Sie es in mehrere Schritte aufgeteilt, erlaubt mir, auf einem anderen Aspekt zu verweisen, nämlich dass, wenn der Wert des Attributs andere Zeichen jenseits des Zählers der Quote hat, kann ich sie vor und wieder aufbauen nach (eine Sache wie "-5.70 q.p.f.") oder sogar wählen, um diese Einheit zu überspringen.

Nur für meine Kultur, wenn ich den Entroxt wiederhole, gehe ich zum nächsten Attribut, bis ich ein sequend treffe?
 
Also...
ab dem "gp" habe ich ein bisschen die Liste fixiert und jetzt fügt die lisp eine delta aus einem Block mit einem einzigen Attribut hinzu, einen möglichen Text nach der Quote zu halten.
z.B. zwei Blöcke mit "3,50" und "-3,50 estradosso", die Zugabe eines Deltas von 0,30 wird "3,80" und "-3,20 estradosso".
die Auswahl der Blöcke, auf denen die Bedienung erfolgt, mittels Pick des Blocks (es ist die Lisp, um den Blocknamen und den Tag des Attributs zu erhalten) und dann bei der Auswahl der zu ändernden Blöcke (die Lisp wählt nur diejenigen, die die Anforderungen des vorherigen Pick erfüllen).

In Ordnung, jetzt die schmerzhaften Noten.

in Version 3 funktioniert alles gut, aber wenn Sie einen dynamischen Block auswählen wird das Ergebnis des Blocknamens sein * uetc (Die dynamischen Blöcke sind so) und offensichtlich wird es keine Auswahl geben, um das Delta anzuwenden.
in der Version 4 I gelöst, addieren ErholungBezeichnung der anonymen Block, aber wenn ich gehe, um mit ssget zu wählen, gibt es keinen Block, der die ssget Zustand respektiert: und durch Kraft! Ich wähle vielleicht einen Block namens "planiquo", die Lisp findet eine Flut von Blöcken namens "*uetc"
Wie wähle ich einen dynamischen Block, aber das respektiert die Bedingungen des dynamischen Blocks, der mit dem Pick gewählt wird?

Beachten Sie nicht, dass die Variablen nach der Ausführung der Lispe voll bleiben, in der embryonalen Phase habe ich sie verlassen, um den Wert der Variablen zum Zeitpunkt des Absturzes zu haben.
 

Anhänge

Code:
Alle Blöcke erfassen
(setq blk1 (ssget "_x" ((0. "Insert"))))))

;initialisiert die Auswahlgruppe blk
(setq blk)

;loop auf allen Blöcken: wenn der tatsächliche Name dem gewünschten entspricht (nb) den Block zu blk hinzufügt
(Repeat (Setq n (sslength blk1))
(if (= nb (vlax-get-property (vlax-ename->vla-object (setq b (ssname blk1 (setq n (1- n))))))))))))
(setq blk)
)
)
 
intelligent einfache Lösung für ein scheinbar unüberwindliches Problem.
Natürlich funktioniert es, obwohl es scheint, dass ich einige Schwierigkeiten hatte, von anonym zu normal, aber ich werde es lieben.
 
mit "effektiver Name sollte die Art von Block einflussreich sein.
Ich dachte auch. aber beim zweiten Zyklus (mit anderen Block) blieb die Auswahl blk1 trotz nb (Blockname) leer.
Ich dachte, es wäre eine Frage der Entleerung einiger Variablen (die in der Entwurfsphase nicht zurückgesetzt werden), aber ich konnte nicht in sie für die Zeit.

Ich frage Sie eine neue Frage. Wir geben zu, dass der Wert des Attributs nicht für eine Zahl beginnt, aber es gibt eine erste String, wie "quota 11.23" und wir sagen, dass die Überprüfung auf var. Wert.
in diesem Fall geht alles in die Krise.
Ich versuchte, den einzigen Anfangsteil durch (Lesewert) zu isolieren und gibt mir richtig Anteil zurück, aber wenn ich versuche, ihn in der String (Setq-Wert2 (Substrate ") zu ersetzen, gibt es mich Fehler zurück.
Die Untersuchung des Leseergebnisses sieht es als Symm und nicht als String, so dass der Subst nicht geht.
Gibt es eine Möglichkeit, die Art der von Ihnen gelesenen Daten zu ändern?
 
beginnend von(setq valore "quota 11.23");imposed to 0 string Zeichenzähler(Setq n 0)alle Zeichen, bis Sie eine Nummer finden (*), der Wert n dann sperrt die Zahl, die der Position im String entspricht))

(Setq v1 (Substr valore 1 (1-n))) -> Ruhe "quota"

(setq v2 (substr valore n (strlen valore)) -> Ruhe "11.23"den Wert ändern V2 und dann mit(setq valorre (strcat v1 v2)) Wiederherstellen der Attributfolge.


(*) i caratteri Ascie 48 bis 57 Zahlen sind.
 
Schuld an Erklärungen. Ich hatte mir vorgestellt, dass von der Spitze Ihrer Magheggi es einen einfacheren Weg gab, stattdessen müssen Sie alle String Charakter durch Charakter laufen.
Aber das ist okay.
 

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