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

Mehrere Auswahl von Blöcken basierend auf dem Attributwert

  • Ersteller Ersteller Giuseppe Beatrice
  • Erstellt am Erstellt am

Giuseppe Beatrice

Guest
hallo, ich habe ein problem in bezug auf die realisierung eines teils von lisp-code für die verwendung mit autocad 2007.
ich möchte mit dem befehl ssget von autolisp zwischen einer reihe von blöcken mit attributen wählen, nur diejenigen, deren attribut einen bestimmten wert hat, um es mit entsprechenden anweisungen, immer in lisp variieren zu können.
ist es möglich, dies zu tun, mit ssget oder, möglicherweise, mit verschiedenen anweisungen, die ich nicht weiß?
vielen dank für ihre zusammenarbeit.
 
danke, gp.
die datei, die sie empfohlen haben, half mir viel, nach blöcken mit einem bestimmten attribut zu suchen.
allerdings ich habe noch ein problem, da die suche, die ich durchgeführt habe, mir nicht erlaubt, die letzte aufgabe auszuführen, die den wert eines zweiten blockattributs auf einen neuen wert zu ändern.
mit anderen worten, mit einem fragment der empfohlenen datei lisp erstellte ich eine auswahlgruppe, in der alle blöcke, die den angegebenen wert des ersten attributs haben, enthalten sind; für jedes mitglied dieser auswahlgruppe kann ich jedoch den wert eines zweiten attributs auf einen neuen zugewiesenen wert nicht ändern..
kannst du mir noch mal helfen? danke nochmal und entschuldigen sie mich für die mühe.
 
sie müssen das wettenpaar entsprechend dem attributwert ersetzen und das db mit (entmod) aktualisieren.
in diesem beispiel, wenn der ausgewählte block ein "topolino" attribut hat, durch "pluto" ersetzt wird
HTML:
(setq ent (entget))

(if (= (cdr (assoc 0 ent)) "Insert")
(Prog.)
(setq ogg (cdr (car ent)))
(setq ent1 (entnext ogg))
(Vorhanden fällt)
(Prog.)
(setq tipo (cdr (assoc 0 (entget ent1)))
(while (= tipo "attrib")
(setq valore_attributeeo (cdr (assoc 1 (entget ent1))))

(if (= valore_attribute "topolino")
(Prog.)
(setq attrib (entget ent1)
(setq neu (cons 1 "pluto"))
(setq alt (association 1 (entget ent1)))
(setq attrib (neue alte Attrib)
(entmod attrib)
)

(setq ent1 (entnext ent1)
(setq tipo (cdr (assoc 0 (entget ent1)))
)
)
)
)
)
 
danke, gp.
ich habe ihre code-fraktion verwendet, um den block zu ändern, nur die letzte anweisung hinzufügen
(entmod ent)
mit dem sie den block auf dem design ändern.
nur eine neugierde: denn wenn ich die bildung starten
(entupd mod)
kommt es zu einem fehler?
wie auch immer, vielen dank, du bist ein freund!
 
mit (entupd) aktualisieren sie den block, das ist die haupteinheit.

wenn du mod es war:

((-1). <nome 7ed91b78="" entità:="">) (0 . "insert") (330. <nome 7ed92cf8="" entità:="">) (5 . "b0f") (100 . "acdbentity") (67).

sie sollten schreiben (entupd (cdr (car mod)))

aber die attribute werden nicht mit dem entmod allein aktualisiert?</nome></nome>
 
wenn du ideen klären musst, überlasse ich diese notiz.
entmod arbeitet in einer komplementären weise zu entget: entget erholt sich von der datenbank das entity (individuell vom paar (-1). <nome entità="">), dann folgt eine mögliche änderung, und am ende entmod gibt das entity (in form einer liste) in die datenbank zurück, aktualisiert; entmod auch regeneriert eine einfache entität auf dem bildschirm, aber nicht neu auf dem bildschirm eine komplexe entität, wie eine polylinie oder ein block, wenn eine subentität, beispielsweise ein vertex geändert wird.
im gegenteil, verwirrte aktualisierungen, um alle einheiten, einfach oder komplex zu überwachen; sein argument kann sowohl der name des unternehmens als auch der seiner untergruppe sein, aber in jedem fall neu gestaltet es die ganze einheit.
anstatt alle instanzen der blöcke zu aktualisieren, ist es bei einer änderung nicht genug verwirrt, aber es ist notwendig, einen regen hinzuzufügen.</nome>
 
ich danke allen für den beitrag zur diskussion, und ich entschuldige mich für den unfreiwilligen irrtum, vielleicht am ursprung beider antworten, die ich mit dem hinweis auf bildung betraut habe. (gereicht) als ob es eine weitere variable gibt modes ist nicht da.
was ich meinte, ist, dass mit der ersten instanz (in der Halle) der durch gp angegebenen code, der inhalt der untereinheit wird aktualisiert In den Warenkorb des blocks mit dem neuen attrib-wert und der realen einheit, die dieses attribut enthält, wird auf der zeichnung nicht aktualisiert (der in der ent-variable der datei identifizierte block): ich konnte das sehen, endlich weiterbilden (entmod ent), sogar die blockade wird tatsächlich auf der zeichnung mit dem neuen wert des attributs geändert (die frage, dass gp mich fragte, ist richtig, dass anweisung an sich notwendig und ausreichend, um das problem vollständig zu lösen).
der zweifel - nur philosophisch an diesem punkt - das bleibt im gegenteil, im zusammenhang mit dem tatsächlichen funktionieren der bildung entupd: weil durch die einführung von bildung (entupd ent), sowohl an ort und nach (entmod ent), ein fehler erzeugt wird?
 
wahrscheinlich, wie gp. bereits gesagt hat, die entupd funktion braucht, als argument, nicht die einheit, sondern der name der einheit, daher:
nicht entupd (ent)
aber entupd (cdr (car (ent))).
 
mit anderen worten, mit einem fragment der empfohlenen datei lisp erstellte ich eine auswahlgruppe, in der alle blöcke, die den angegebenen wert des ersten attributs haben, enthalten sind;
bye,
ich brauche nur ein skript wie das, was du gemacht hast. ich sollte tatsächlich eine gruppe von blöcken basierend auf dem wert eines attributs auswählen, dann in der lage sein, zu kopieren, zu bewegen, usw.
würdest du so freundlich sein, das ergebnis deiner arbeit zu posten?

vielen dank.
römische herren
 
caro romnexus6, the lisp i'm working on tut nicht die dinge, die sie fragen: in der tat extrahiert es einfach, aus dem container erstellt von der "sssget" funktion mit allen blöcken eines designs, diejenigen mit einem bestimmten textwert (in meinem fall stellen sie die elektrischen leitungen von der leistung einer reihe von lasten, jeweils mit dem namen der geladenen last, und für sie habe ich separat platziert "nd" der wert von der i die für jeden abschnitt berechneten werte sind daher mit dem namen der last verbunden und in einer txt-datei geschrieben, die aus meiner lisp-liste gelesen wird, die dann ordentlich in der zeichnung ersetzt, für jede powered load, den wert, der mit dem abschnitt zum vorherigen text "nd" verbunden ist. der kern, der mir erlaubt hat, dieses problem zu lösen, wie sie sehen sehr spezifisch, war der code lisp von gp, die ich denke, kann die grundlage auch sein, um ihr problem zu lösen, da sie es nur an ihre bedürfnisse anpassen müssen, um die notwendigen maßnahmen zu ihrem fall auf den blöcken durchzuführen, vielleicht mit der anweisung "befehl". natürlich werde ich keine mühe haben, meine liste zu bekommen, wenn sie es immer noch notwendig fühlen, sobald ich fertig bin.
 
bye,

vielleicht kann mir dein drehbuch helfen.
was ich im detail tun möchte, ist:

- suche nach allen blöcken, die ein attribut haben = string
- sie alle in eine andere schicht bringen

was denkst du?

römischer roman
 
hier ist eine liste, die ich hoffe, ihnen helfen wird:
;; modifizierungsfunktion der einsatzschichtblöcke mit einem vorgegebenen attributwert
;; den text, der in den attributen der blöcke zu finden ist, zu digitalisieren, auch teilweise und korrekt angezeigt großbuchstaben und kleinbuchstaben
(defun c:mod_lay)
(sing)
" aufmerksamkeit: das programm wird die schicht aller blöcke ersetzen, die den angegebenen text enthalten!!! "
(setq sel (ssget "_x"((0. "insert")))))); aufbau der auswahlgruppe mit allen zeichenblöcken
(sectq)
txt (getstring)
"indizieren sie text, der im block gesucht werden soll (schreiben sie auch die kapitale richtig)

(setq schicht (getstring "\new layer on which to move the block : <0> ")
(wenn (nicht schicht) ; wenn sie nur drücken senden
(setq-schicht "0")
(research sel txt)
(modifiziert sel_rist layer) ; wechselt schmale gruppenblöcke mit dem neuen abschnitt
)
(schläft) (schlafen) [Schläft] [Schläft] [Schläft] (schläft) (schläft) (schlafen) (schlafen) (schlafen) (schlafen) [Schläft] [Schläft] [Schläft] (schläft) [Schläft] [Schläft] [Schläft] (schläft) [schlafen] [schlafen] (schläft) (schläft) [Schläft] [Schläft] [Schläft] [schlafen [schlafen] (schläft) [schlafen [schlafen] [schlafen] [schlafen] (schläft) [Schläft] [Schläft] [Schläft] [schlafen]
[Schläft] [Schläft] [Schläft] suche nach tracktext
(defun research (sel txtcer / ent1 index ogg name num type txtrov)
(setq num (sslength sel)); die anzahl der in der auswahl vorhandenen blöcke
(setq sel_rist (ssadd)); baut leere auswahl auf, um blöcke zum kriterium hinzuzufügen
(satzindex 0)
(repeat num ; verwendung von codefragment vorgeschlagen von gp (cad3d.it)
(satzname sel index)
(setq ent (entget name)); definition der haupteinheit (block)
(setq ogg)
(setq ent1 (entnext ogg));sub entität (außer nil nur, wenn der block attribute enthält)
(falls ent)
(progn)
(setq type (cdr (assoc 0 (entget ent1))))
(while (= typ "attrib")
(setq txtrov (cdr (assoc 1)))
(wenn (= txtrov txtcer)
(xdname sel_rist)); die entität, die dem kriterium der beschränkten gruppe entspricht
(setq ent1 (entnext ent1)
(setq-typ (cdr (assoc 0 (entget ent1))))
(satzindex (+ index 1))
) wiederholende; die enge gruppe ist vollständig gebaut
)

(schläft) (schlafen) [Schläft] [Schläft] [Schläft] (schläft) (schläft) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) (schlafen) [Schläft] [Schläft] [Schläft] (schläft) [schlafen [schlafen] (schläft) [Schläft] [Schläft] [Schläft] [Schläft] (schläft) [schlafen] [schlafen] [Schläft [schlafen] [schlafen] [schlafen] (schläft) [Schläft] [Schläft] [Schläft] [schlafen]
änderung der funktion des einzigen abschnitts in der art des kabels des gesuchten blocks
(defun edit (sel_rist layer /)
(setq num (sslength sel_rist))
(satzindex 0)

(repeat num)
(satzname sel_rist index)
(setq ent (entget name)
(setq oldlayer (assoc 8 ent));_liste der definition der haupteinheit (block)
(setq newlayer (cons 8 layer))


(setq ent)
(entmod ent)
(satzindex (+ index 1))
) ;_update the index by move to the next block of the group

)
 
danke giuseppe,

ich war sehr hilfsbereit und lehrreich.

ich fand auch eine andere möglichkeit, das zu tun, was ich sagte, d.h. wählen sie die blöcke, die einen bestimmten attributwert haben.

- alle blöcke auswählen
- finden
- die zeichenfolge zur suche angeben, dann eingeben
- klicken sie auf "alles auswählen"

ich hoffe, dass dieses verfahren auch anderen benutzern helfen wird.

danke noch mal.
hi.

römischer roman
 
sicher, die lösung, die sie gefunden haben, ist definitiv gültig und hat den vorteil, bereit zu sein.
auf der anderen seite finde ich, dass alle autocad-befehle nur eine reihe von lisp-funktionen sind, so dass das schreiben eines teils unserer erfindung nur dazu dient, die durchführung bestimmter verfahren zu beschleunigen, die wir damals benötigen.
 
guten morgen sind alle fabrizio
mein problem ist, dass ich nicht mit einer lisp "take" innerhalb eines blocks die verschiedenen (etwa zehn) werte des attributs. die schwierigkeit liegt darin, dass die koordinaten, die ich zur auswahl habe, auf das letzte attribut gesetzt ist und ich keine möglichkeit habe, es zu ändern.
danke im voraus... ich hoffe, dass es klar war!!!
hallo alle
 
das lesen der attribute eines blocks erfordert zunächst die erkennung der "externen" block-entität, und dies können sie tun, zum beispiel mit dem befehl (setq noment (car (entsel "select the block))))
dann mit dem nächsten befehl die blockdefinition einstellen:
(setq defent (entget noment)
auf diese weise müssen sie punkt, schicht, etc...
zum lesen von attributen müssen sie eine reihe von anderen späteren schritten des gleichen typs machen:
(setq noment (entnext noment)
(setq defent (entget noment)
sie werden sehen, dass jedes mal, wenn sie diese beiden befehlszeilen ausführen, sie eine liste mit dem attributwert erhalten, der mit dem dxf-code verbunden ist anhang
das verfahren endet, wenn der dem code dxf 0 zugeordnete wert "seqend" ist.
ich hoffe, ich war ganz klar.
 
das lesen der attribute eines blocks erfordert zunächst die erkennung der "externen" block-entität, und dies können sie tun, zum beispiel mit dem befehl (setq noment (car (entsel "select the block))))
dann mit dem nächsten befehl die blockdefinition einstellen:
(setq defent (entget noment)
auf diese weise müssen sie punkt, schicht, etc...
zum lesen von attributen müssen sie eine reihe von anderen späteren schritten des gleichen typs machen:
(setq noment (entnext noment)
(setq defent (entget noment)
sie werden sehen, dass jedes mal, wenn sie diese beiden befehlszeilen ausführen, sie eine liste mit dem attributwert erhalten, der mit dem dxf-code verbunden ist anhang
das verfahren endet, wenn der dem code dxf 0 zugeordnete wert "seqend" ist.
ich hoffe, ich war ganz klar.
danke. ich versuche es und werde es wissen
 
Bye,
Anchio, wie Mr. Ladies, würde ich dieses Skript für mehrere Blöcke benötigen, die den gleichen Attributwert haben.
Ich wäre sehr dankbar!

Danke im Voraus!
Fancen
 
Bye,
Anchio, wie Mr. Ladies, würde ich dieses Skript für mehrere Blöcke benötigen, die den gleichen Attributwert haben.
Ich wäre sehr dankbar!

Danke im Voraus!
Fancen
Tut mir leid, aber ist die Liste nicht schon im Gespräch?
finden Sie es in rot durch Scrollen der Reihenfolge der Fragen und Antworten.:gemischt:
 

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