Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  Attribute mit Lisp an eine andere Position bewegen

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
  
Autodesk Inventor: Neuerungen - Online, ein Seminar am 22.05.2025
Autor Thema:  Attribute mit Lisp an eine andere Position bewegen (425 / mal gelesen)
100dpi
Mitglied
selbständig


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

Beiträge: 21
Registriert: 29.10.2021

ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD,
ThinkPad P72, 80GB RAM, 3 TB

erstellt am: 17. Jul. 2024 18: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

Hallo zusammen, und einen schönen Sommerabend.
Ich habe mir via ChatGPT einen LISP-Code schreiben lassen, der leider nicht das gewünschte Ergebnis bringt. Könnt Ihr mir eventuell helfen?

Problem: Ich habe Blöcke von 10 x 10mm mit zwei Attributen auf der rechten Seite. Beim Einsetzen des Block kommt es vor, dass die Attribute in andere Zeichnungsteile hineinragen so dass ich sie verschieben muss. Um das zu vereinfachen möchte ich gern einen Lisp-Befehl aufrufen, der mich den Block auswählen lässt und mich dann fragt, wohin ich die Attribute verschieben möchte (links, rechts, oben oder unten) Wenn sie nach links geschoben werden, sollen sie rechtsbündig sein. Für oben oder unten sollen sie zentriert sein.

Mit dem folgenden Code kann ich den Block auswählen und anschließend die Richtung eingeben. Bei "Rechts" bleiben die Attribute natürlich wo sie sind. Wenn ich aber "Links" "Oben" oder "Unten" eingebe, verschiebt ACAD die Attribute zum Nullpunkt der Seite:

(defun c:MoveBlockAttributes (/ ss blk blkData blkName blkScale blkPos attrList attrData newPos side distance xOffset yOffset attr)
  (setq distance 2.0)  ; Abstand von der Kante des Blocks

  ;; Auswahl des Blocks
  (prompt "\nWählen Sie einen Block aus: ")
  (setq ss (ssget '((0 . "INSERT"))))
  (if (not ss)
    (progn
      (prompt "\nKeine Blöcke ausgewählt.")
      (exit)
    )
  )

  (setq blk (ssname ss 0))
  (setq blkData (entget blk))
  (setq blkName (cdr (assoc 2 blkData)))
  (setq blkScale (cdr (assoc 41 blkData)))  ; Annahme: Uniforme Skalierung
  (setq blkPos (cdr (assoc 10 blkData)))

  ;; Abfrage der Attribute
  (setq attrList nil)
  (setq attr (entnext blk))
  (while (and attr (/= (cdr (assoc 0 (entget attr))) "SEQEND"))
    (if (eq (cdr (assoc 0 (entget attr))) "ATTRIB")
      (setq attrList (cons attr attrList))
    )
    (setq attr (entnext attr))
  )

  ;; Debugging-Ausgabe
  (print (strcat "\nAnzahl der Attribute gefunden: " (itoa (length attrList))))

  ;; Sicherstellen, dass genau zwei Attribute vorhanden sind
  (if (/= (length attrList) 2)
    (progn
      (prompt "\nDer Block muss genau zwei Attribute enthalten.")
      (exit)
    )
  )

  ;; Abfrage der gewünschten Seite
  (setq side (strcase (getstring "\nGeben Sie die Seite ein (oben, unten, links, rechts): ")))

  ;; Berechnung der neuen Positionen und Ausrichtung der Attribute
  (cond
    ((or (equal side "OBEN") (equal side "UNTEN"))
    (setq yOffset (* distance blkScale))
    (if (equal side "UNTEN")
      (setq yOffset (- yOffset))
    )
    (foreach attr attrList
      (setq attrData (entget attr))
      (setq newPos (list (car blkPos) (+ (cadr blkPos) yOffset) (caddr blkPos)))
      (entmod (subst (cons 10 newPos) (assoc 10 attrData) attrData))
      (entmod (subst (cons 72 1) (assoc 72 attrData) attrData))  ; Zentriert
      (entupd attr)  ; Aktualisieren des Attributs
    )
    )
    ((or (equal side "LINKS") (equal side "RECHTS"))
    (setq xOffset (* distance blkScale))
    (if (equal side "LINKS")
      (setq xOffset (- xOffset))
    )
    (foreach attr attrList
      (setq attrData (entget attr))
      (setq newPos (list (+ (car blkPos) xOffset) (cadr blkPos) (caddr blkPos)))
      (entmod (subst (cons 10 newPos) (assoc 10 attrData) attrData))
      (if (equal side "LINKS")
        (entmod (subst (cons 72 2) (assoc 72 attrData) attrData))  ; Rechtsbündig
        (entmod (subst (cons 72 0) (assoc 72 attrData) attrData)))  ; Linksbündig
      (entupd attr)  ; Aktualisieren des Attributs
    )
    )
    (t
    (prompt "\nUngültige Eingabe."))
  )

  (princ)
)

Habt Ihr da einen Lösungsansatz?
Vielen Dank schon mal.

Gruß 100dpi

------------------
I like to move it...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

spider_dd
Mitglied



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

Beiträge: 1144
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 18. Jul. 2024 12:39    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 100dpi 10 Unities + Antwort hilfreich

Hallo 100dpi,

der Beitrag wäre im Lisp-Forum besser aufgehoben, aber egal, lass ihn jetzt hier.

Im Code sind einige "Kröten" enthalten, hier ein paar Hinweise:

die Variable distance nutzt einen Namen, den es so schon als Systemvariabe gibt, ganz schlecht. Nenne alle Vorkommen von distance in z. B. ndistance um.

Die neue Position der Attribute ermittels Du nicht aus der Position der Attribute, sondern aus der Blockposition, d. h. alle Attribute erhalten die gleiche Position.

Wenn die Ausrictung (GC 72) nicht 0 = linksbündig ist, wird die Textposition nicht aus dem GC 10 sondern aus dem GC 11 (Ausrichtepunkt) ermittelt.

Für die Umsetzung nach links habe ich dieses mal behoben. Tausche mal den Block

ab ((or (equal side "LINKS")  einschließlich der zugehörigen schließenden Klammer mit folgenden Zeilen

Code:

((or (equal side "LINKS") (equal side "RECHTS"))
    (setq xOffset (* ndistance blkScale))
    (if (equal side "LINKS")
      (setq xOffset (- xOffset))
    )
    (foreach attr attrList
      (setq attrData (entget attr))
      (setq oldPos (cdr (assoc 10 attrData)))
      (setq newPos (list (+ (car blkPos) xOffset) (cadr oldPos) (caddr oldPos)))  ;x aus Blockeinfügepunkt, y und z aus Att-Position
      (setq attrData (subst (cons 10 newPos) (assoc 10 attrData) attrData))
      (entmod attrData)
      (if (equal side "LINKS")
(Progn
  (setq attrData (subst (cons 11 newPos) (assoc 11 attrData) attrData)) ; wird genutzt, wenn 72 nicht 0
  (setq attrData (subst (cons 72 2) (assoc 72 attrData) attrData))

(setq attrData (subst (cons 72 0) (assoc 72 attrData) attrData))
      )
      (entmod attrData)
;      (entupd attr)  ; Aktualisieren des Attributs
    )
    )

Für x nutze ich noch die Position des Blockes, wenn Du alles aus der aktuellen Attributsposition ableiten willst, musst Du dieses noch entsprechend ändern.

Teste mal und berichte.

Gruß
Thomas

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadwomen
Ehrenmitglied V.I.P. h.c.
Mädchen für fast alles


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

Beiträge: 3074
Registriert: 26.08.2002

ACAD R11 - 2022
(Plant3D)
AVIS
ACAD LT 2013- 2021
ZWCAD 2015 Versuch "nun ja"
[s]History P3D 2012/(13) SP und Hotfix([/s]<P>
Windows 10 / 64 Bit
Xeon CPU 3.5GHz
16GB Ram
NVIDIA Quadro P2000
3x Dell TV100 88P Monitore

erstellt am: 18. Jul. 2024 12:39    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 100dpi 10 Unities + Antwort hilfreich

Hallo 100dpi

unter https://ww3.cad.de/cgi-bin/ubb/forumdisplay.cgi?action=topics&number=145

wäre deine Frage ggf besser aufgehoben.

cu cw

------------------
Also ich finde Unities gut ... und andere sicher auch
------------------------------------------------
cadwomen™
Plant ist nur die Spitze des Berges der da treibt ?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

100dpi
Mitglied
selbständig


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

Beiträge: 21
Registriert: 29.10.2021

ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD,
ThinkPad P72, 80GB RAM, 3 TB

erstellt am: 18. Jul. 2024 19:20    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 spider_dd,

danke Dir für den Lösungsansatz. Hier die Ausgabe von ACAD:

Befehl:  MOVEBLOCKATTRIBUTES
Wählen Sie einen Block aus:
Objekte wählen: MoveBlockAttributes
*Ungültige Auswahl*
Erwartet einen Punkt oder Fenster/Letztes/Kreuzen/QUADER/ALLE/ZAun/FPolygon/KPolygon/Gruppe/Hinzufügen/Entfernen/Mehrere/Vorher/ZUrück/AUto/EInzeln
Objekte wählen: 1 gefunden
Objekte wählen:
"\nAnzahl der Attribute gefunden: 2"
Geben Sie die Seite ein (oben, unten, links, rechts): links
; Fehler: Fehlerhafter Argumenttyp: numberp: nil

gibt es da noch eine Optimierung?
Gruß 100dpi

------------------
I like to move it...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

100dpi
Mitglied
selbständig


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

Beiträge: 21
Registriert: 29.10.2021

ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD,
ThinkPad P72, 80GB RAM, 3 TB

erstellt am: 18. Jul. 2024 19:23    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 cadwoman,

danke für den Hinweis...
Gibt es eine Möglichkeit, die Frage zu verschieben? Oder soll ich sie neu stellen?

Gruß 100dpi

------------------
I like to move it...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Entsorger01
Moderator
Techniker




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

Beiträge: 3314
Registriert: 07.07.2006

ACAD 2021
Acrobat Prof.
Creative Suite
WIN10

erstellt am: 19. Jul. 2024 07:45    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 100dpi 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von 100dpi:

Gibt es eine Möglichkeit, die Frage zu verschieben? Oder soll ich sie neu stellen?

Guten Morgen,

alles OK - die meisten Lispler lesen hier auch mit. Aber die nächste Lisp-Frage dann bitte "drüben" 

------------------
Gruß

Michi

""Mögen hätt ich schon wollen, aber dürfen hab ich mich nicht getraut."
Karl Valentin

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

spider_dd
Mitglied



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

Beiträge: 1144
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 19. Jul. 2024 07:46    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 100dpi 10 Unities + Antwort hilfreich

Hallo 100dpi,

ohne den vollständigen Code kann man da wenig zu sagen.
Du kannst Dich aber auch selbst auf die Fehlersuche begeben. Öffne den Visual-Lisp Editor (Befehl:  VLISP), öffne Dir dort Dein Lisp und lade es von dort in die Zeichnung. Du hast dann dort diverse Möglichkeiten der Programmverfolgung und Fehlersuche.
Ansosnten müsstest Du den aktuellen Stand Deiner Datei mal hier hochladen.

Gruß
Thomas

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