Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Mit Lisp Blöcke auslesen und Teile des Inhalts in Textzeilen abbilden

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
  
Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
Autor Thema:  Mit Lisp Blöcke auslesen und Teile des Inhalts in Textzeilen abbilden (238 / 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: 26
Registriert: 29.10.2021

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

erstellt am: 24. Nov. 2024 15:03    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 Gemeinde,

ich bin seit zwei Tagen im Zwiegespräch mit ChatGPT  und komme nicht ans Ziel...
Problemstellung: Ich bekomme von einem Architekten ACAD-Dateien von Etagen. In den Räumen befinden sich jeweils Raumstempel mit (für mich) überflüssigen Angaben über Raum-Größe und Umfang etc. Ich versuche aus den Blöcken den Zimmernamen und die Raumnummer zu extrahieren um sie anschließend an der Stelle des Plocks zu platzieren und den Block ansich auf den Layer "Ausschalten" zu schieben. Folgendes Script ist der aktuelle Stand:

(defun c:REMFIELD (/ blockRef attributes roomName roomNumber selection newText1 newText2 insertionPoint x y z layer)
  (vl-load-com)  ;; COM-Schnittstellen laden

  ;; Block auswählen
  (prompt "\nWählen Sie einen Block aus: ")
  (setq selection (entsel))  ;; Benutzer wählt Block aus

  (if selection
    (progn
      (setq blockRef (vlax-ename->vla-object (car selection)))  ;; Blockreferenz holen

      ;; Überprüfen, ob es sich um eine Blockreferenz handelt
      (if (eq (vla-get-ObjectName blockRef) "AcDbBlockReference")
        (progn
          ;; Attributwerte holen
          (setq attributes (vlax-invoke blockRef 'GetAttributes))

          ;; Durch die Attribute iterieren und ROOM_NAME und ROOM_NUMBER extrahieren
          (foreach attr attributes
            (setq tag (strcase (vla-get-TagString attr)))  ;; Tag des Attributs
            (setq value (vla-get-TextString attr))        ;; Wert des Attributs

            (cond
              ((equal tag "ROOM_NAME") (setq roomName value))
              ((equal tag "ROOM_NUMBER") (setq roomNumber value))
            ))

          ;; Ausgabe der Werte in der Befehlszeile
          (princ (strcat "\nROOM_NAME: " roomName))
          (princ (strcat "\nROOM_NUMBER: " roomNumber))

          ;; InsertionPoint des Blocks holen und als Liste erhalten
          (setq insertionPoint (vla-get-InsertionPoint blockRef))

          ;; Manuelles Extrahieren der Koordinaten (x, y, z)
          (setq x (vlax-get insertionPoint 'x))
          (setq y (vlax-get insertionPoint 'y))
          (setq z (vlax-get insertionPoint 'z))

          ;; Ausgabe des InsertionPoints
          (princ (strcat "\nInsertion Point: " (rtos x 2 2) ", "
                        (rtos y 2 2)))

          ;; Textobjekte erstellen
          ;; Text 1 für ROOM_NAME, 1.0 für die Höhe, keine Rotation
          (setq newText1 (vla-addtext
                          (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
                          roomName
                          (list x y z)
                          1.0))  ;; Höhe des Textes auf 1.0 gesetzt
         
          ;; Text 2 für ROOM_NUMBER, leicht versetzt unter dem ersten Text
          (setq newText2 (vla-addtext
                          (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
                          roomNumber
                          (list x (+ y -0.2) z)
                          1.0))  ;; Höhe des Textes ebenfalls auf 1.0 gesetzt
         
          ;; Block auf Layer "Ausschalten" verschieben
          (vla-put-Layer blockRef "Ausschalten")

        )
        (princ "\nFehler: Das ausgewählte Objekt ist kein Block."))
    )
    (princ "\nFehler: Kein Objekt ausgewählt.")
  )

  (princ)  ;; Abschluss
)

Dieser führt allerdings seit Stunden zu diesem Ergebnis bei Ausführung:

Befehl: REMFIELD
Wählen Sie einen Block aus:
Objekt wählen:
ROOM_NAME: KU/MU
ROOM_NUMBER: A0.027; Fehler: Fehlerhafter Argumenttyp: VLA-OBJECT #<variant 8197 ...>

Habt Ihr da eine Lösung?

Danke schon mal für Eure Mühe

Gruß 100dpi

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

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: 3082
Registriert: 26.08.2002

ACAD R11 - 2018.1.2
(Plant3D)
AVIS
ACAD LT 2013- 2020
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: 25. Nov. 2024 10:09    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

Hy,

klar man kann fast alles mit Lisp machen, aber warum , Block editieren ( extra Layer für die Attribute geh ich mal aus )
Bloch updaten und Layerschalten und gut ( max 10min )

Bitte Block posten , dann kann ich meinen Ansatz auch das macht.

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: 26
Registriert: 29.10.2021

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

erstellt am: 25. Nov. 2024 10:18    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

So dieses Script funktioniert soweit:

(defun c:remfield ()
  (prompt "\nWählen Sie mehrere Blöcke aus:")  ; Benutzeraufforderung für die Auswahl
  (setq blk-selection (ssget '((0 . "INSERT"))))  ; Alle eingefügten Blöcke auswählen

  (if blk-selection
    (progn
      (setq blk-count (sslength blk-selection))  ; Anzahl der ausgewählten Blöcke
      (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt."))

      (repeat blk-count
        (setq blk (ssname blk-selection (1- blk-count)))  ; Nächsten Block aus der Auswahl holen
        (setq vla-blk (vlax-ename->vla-object blk))  ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt

        (if (and (vlax-property-available-p vla-blk 'HasAttributes)  ; Prüft, ob der Block Attribute hat
                (= (vla-get-HasAttributes vla-blk) :vlax-true))
          (progn
            (setq attr-list (vlax-invoke vla-blk 'GetAttributes))  ; Ruft die Attribute ab
            (setq room-name "")
            (setq room-number "")
            (setq text-height 1.0)  ; Standard-Schrifthöhe, falls keine gefunden wird

            (foreach attr attr-list
              (setq tag (strcase (vla-get-TagString attr)))  ; Tag des Attributs holen
              (setq value (vla-get-TextString attr))  ; Wert des Attributs holen
              (setq text-height (vla-get-Height attr))  ; Schrifthöhe des Attributs holen
              (cond
                ((= tag "ROOM_NAME") (setq room-name value))
                ((= tag "ROOM_NUMBER") (setq room-number value))
              )
            )

            ; Block auf Layer "Ausschalten" verschieben
            (vla-put-Layer vla-blk "Ausschalten")
            (vla-update vla-blk)
            (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.")

            ; Wenn beide Werte gefunden sind, Text erstellen
            (if (and room-name room-number)
              (progn
                (setq ins-point (vlax-get vla-blk 'InsertionPoint))  ; Einfügepunkt des Blocks
                (setq x (car ins-point)
                      y (cadr ins-point)
                      z (caddr ins-point))

                ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu"
                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x y z))  ; Position des Textes
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-name)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen

                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x (- y (* text-height 1.5)) z))  ; Zweite Zeile etwas tiefer
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-number)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen

                (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.")
              )
              (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.")
            )
          )
          (princ "\nDer ausgewählte Block hat keine Attribute.")
        )
        (setq blk-count (1- blk-count))  ; Zähler für die Schleife dekrementieren
      )
    )
    (princ "\nEs wurden keine Blöcke ausgewählt.")
  )
  (princ)
)

Hat vielleicht jemand eine Idee, wie ich ACAD dazu bekomme, den neu zu erstellenden Text mitte zentr. zu setzen? 

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

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

Andreas Kraus
Mitglied
Elektrotechniker


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

Beiträge: 1465
Registriert: 11.01.2006

erstellt am: 25. Nov. 2024 14:05    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:
Hat vielleicht jemand eine Idee, wie ich ACAD dazu bekomme, den neu zu erstellenden Text mitte zentr. zu setzen?

Gruppencode 72 auf 1 und 73 auf 2

Also einfach '(72 . 1) '(73 . 2) beim entmake ergänzen

------------------
Geht nicht, gibts nicht

Gruß
Andreas

http://kraus-cad.de

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: 26
Registriert: 29.10.2021

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

erstellt am: 25. Nov. 2024 14:47    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

Vielen Dank für die Antworten 
@cadwoman: Block editieren weil es dynamische Raumstempel sind, aus denen ich bloß zwei Infos in den Grundrissen brauche. Diese Architektenpläne erzeugen wohl für jeden Raumstempel einen eigenen Block mit den selben Attributen. Ich müsste also zig Blöcke einzeln editieren. So bin ich den Weg gegangen die Werte der Attribute zu extrahieren und dann in zwei Textzeilen schreiben zu lassen. Zur Erklärung: Ich erstelle Feuerwehrpläne und da benötige ich keine m²-Daten.
@Andreas: Das genau hab ich versucht, Acad schiebt die Texte dann aber ALLE zum Punkt 0,0 

Gruß 100dpi

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

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1770
Registriert: 11.10.2004

Window 11
ACAD 2021
CIVIL 2021
BricsCAD ab V14
11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
32.0GB RAM
NVIDIA GeForce MX450<P>

erstellt am: 26. Nov. 2024 08:01    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,
mit folgendem Code kann der mit ENTMAKE erstellte Text auf Mitte-Zentrisch umgestellt werden, die Position sollte erhalten bleiben:
Code:

(defun TextMitteZentrisch (ename / P VLA-OBJ)
  (setq vla-obj (vlax-ename->vla-object ename))
  (setq p (vla-get-InsertionPoint vla-obj))
  (vla-put-alignment vla-obj 10)
  (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p)   
  (vla-update vla-obj)
  )

(defun c:test ( / )
  (TextMitteZentrisch (car(entsel)))
  )


Das Einbinden in Deinen Code:
Direkt nach der ENTMAKE-Funktion mit (TextMitteZentrisch (entlast))

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

das Flächenstempel_Tool(2023)

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1770
Registriert: 11.10.2004

Window 11
ACAD 2021
CIVIL 2021
BricsCAD ab V14
11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
32.0GB RAM
NVIDIA GeForce MX450<P>

erstellt am: 26. Nov. 2024 08:11    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,
ich habe auch mal ChatGPT gefragt was mein Code so alles macht, eine erstaunlich gute Erklärung (finde ich):

Erkläre mit bitte folgenden AutoLISP-Programmcode:
(defun TextMitteZentrisch (ename / P VLA-OBJ)
(setq vla-obj (vlax-ename->vla-object ename))
(setq p (vla-get-InsertionPoint vla-obj))
(vla-put-alignment vla-obj 10)
(vla-move vla-obj (vla-get-InsertionPoint vla-obj)p)
(vla-update vla-obj)
)

ChatGPT:
ChatGPT

Dieser AutoLISP-Code definiert eine Funktion namens TextMitteZentrisch, die darauf abzielt, die Ausrichtung eines Textobjekts in AutoCAD auf "zentriert" zu setzen und es korrekt zu positionieren. Hier ist eine schrittweise Erklärung des Codes:
1. Funktionsdeklaration

(defun TextMitteZentrisch (ename / P VLA-OBJ)

    TextMitteZentrisch ist der Name der Funktion.
    ename ist ein Parameter und erwartet die Eingabe eines Entitätsnamens (z. B. ein Textobjekt in AutoCAD).
    Der / trennt die Eingabeparameter von den lokal deklarierten Variablen. Die lokalen Variablen sind hier P und VLA-OBJ.

2. Objektreferenz erstellen

(setq vla-obj (vlax-ename->vla-object ename))

    Mit vlax-ename->vla-object wird der AutoCAD-Entitätsname (ename) in ein VLA-Objekt umgewandelt, das für ActiveX-Methoden verwendet werden kann.
    vla-obj repräsentiert das Textobjekt, das bearbeitet werden soll.

3. Einfügepunkt des Textes abrufen

(setq p (vla-get-InsertionPoint vla-obj))

    vla-get-InsertionPoint holt die Koordinaten des Einfügepunkts des Textobjekts.
    Der Einfügepunkt wird in der Variablen p gespeichert. Dieser Punkt wird später für die Neuausrichtung genutzt.

4. Ausrichtung auf zentriert setzen

(vla-put-alignment vla-obj 10)

    vla-put-alignment ändert die Ausrichtung des Textobjekts.
    10 ist der numerische Code für die zentrierte Ausrichtung (Middle Center) in AutoCAD.

5. Position anpassen

(vla-move vla-obj (vla-get-InsertionPoint vla-obj) p)

    Hier wird das Objekt mit vla-move verschoben.
    Der Startpunkt ist der neue Einfügepunkt (nach der Änderung der Ausrichtung).
    Der Endpunkt (p) ist der ursprüngliche Einfügepunkt. Damit wird sichergestellt, dass sich der Text nicht bewegt, obwohl seine Ausrichtung geändert wurde.

6. Aktualisierung erzwingen

(vla-update vla-obj)

    vla-update stellt sicher, dass die Änderungen an dem Objekt sofort sichtbar werden.

Gesamtfunktion

Die Funktion nimmt ein Textobjekt, setzt dessen Ausrichtung auf "zentriert" und justiert die Position, sodass der Text optisch an derselben Stelle bleibt, obwohl die Ausrichtung geändert wurde.

Beispielanwendung:

(TextMitteZentrisch (car (entsel "Wählen Sie einen Text aus: ")))

    entsel lässt den Benutzer ein Textobjekt auswählen.
    Der Entitätsname (ename) wird an die Funktion übergeben.
    Nach der Ausführung ist der Text zentriert ausgerichtet.

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

das Flächenstempel_Tool(2023)

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: 1148
Registriert: 27.11.2003

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

erstellt am: 26. Nov. 2024 08:33    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:
...
@Andreas: Das genau hab ich versucht, Acad schiebt die Texte dann aber ALLE zum Punkt 0,0   



Du musst den GC 11 noch setzen, der wird bei Ausrichtungen anders als links verwendet.
Also:
(cons 11 (list x y z))

bzw.

(cons 11 (list x (- y (* text-height 1.5)) z))

noch in die entmake Listen nehmen.

Gruß
Thomas

[Diese Nachricht wurde von spider_dd am 26. Nov. 2024 editiert.]

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: 26
Registriert: 29.10.2021

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

erstellt am: 27. Nov. 2024 11:49    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 Jörn, hallo Thomas,

vielen Dank, aber es ändert sich nichts. Die Attribute bleiben in der Ausrichtung auf "unten links"
Angehängt habe ich Euren Code an den ersten Text (wie im Code unten zu sehen) Vielleicht noch weitere Ideen?

(defun c:remfield ()
  (prompt "\nWählen Sie mehrere Blöcke aus:")  ; Benutzeraufforderung für die Auswahl
  (setq blk-selection (ssget '((0 . "INSERT"))))  ; Alle eingefügten Blöcke auswählen

  (if blk-selection
    (progn
      (setq blk-count (sslength blk-selection))  ; Anzahl der ausgewählten Blöcke
      (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt."))

      (repeat blk-count
        (setq blk (ssname blk-selection (1- blk-count)))  ; Nächsten Block aus der Auswahl holen
        (setq vla-blk (vlax-ename->vla-object blk))  ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt

        (if (and (vlax-property-available-p vla-blk 'HasAttributes)  ; Prüft, ob der Block Attribute hat
                (= (vla-get-HasAttributes vla-blk) :vlax-true))
          (progn
            (setq attr-list (vlax-invoke vla-blk 'GetAttributes))  ; Ruft die Attribute ab
            (setq room-name "")
            (setq room-number "")
            (setq text-height 1.0)  ; Standard-Schrifthöhe, falls keine gefunden wird

            (foreach attr attr-list
              (setq tag (strcase (vla-get-TagString attr)))  ; Tag des Attributs holen
              (setq value (vla-get-TextString attr))  ; Wert des Attributs holen
              (setq text-height (vla-get-Height attr))  ; Schrifthöhe des Attributs holen
              (cond
                ((= tag "ROOM_NAME") (setq room-name value))
                ((= tag "ROOM_NUMBER") (setq room-number value))
              )
            )

            ; Block auf Layer "Ausschalten" verschieben
            (vla-put-Layer vla-blk "Ausschalten")
            (vla-update vla-blk)
            (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.")

            ; Wenn beide Werte gefunden sind, Text erstellen
            (if (and room-name room-number)
              (progn
                (setq ins-point (vlax-get vla-blk 'InsertionPoint))  ; Einfügepunkt des Blocks
                (setq x (car ins-point)
                      y (cadr ins-point)
                      z (caddr ins-point))

                ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu"
                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x y z))  ; Position des Textes
                        (cons 11 (list x (- y (* text-height 1.5)) z))
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-name)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen
                       
                        (defun TextMitteZentrisch (ename / P VLA-OBJ)
                            (setq vla-obj (vlax-ename->vla-object ename))
                            (setq p (vla-get-InsertionPoint vla-obj))
                            (vla-put-alignment vla-obj 10)
                            (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p) 
                            (vla-update vla-obj)
                            )
                        (defun c:test ( / )
                            (TextMitteZentrisch (car(entsel)))
                            )

                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x (- y (* text-height 1.5)) z))  ; Zweite Zeile etwas tiefer
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-number)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen

                (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.")
              )
              (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.")
            )
          )
          (princ "\nDer ausgewählte Block hat keine Attribute.")
        )
        (setq blk-count (1- blk-count))  ; Zähler für die Schleife dekrementieren
      )
    )
    (princ "\nEs wurden keine Blöcke ausgewählt.")
  )
  (princ)
)

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

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1770
Registriert: 11.10.2004

Window 11
ACAD 2021
CIVIL 2021
BricsCAD ab V14
11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
32.0GB RAM
NVIDIA GeForce MX450<P>

erstellt am: 27. Nov. 2024 12:10    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,
probier es mal wie folgt, ist aber ungetestet:
[code]
(defun c:remfield ()

  (defun TextMitteZentrisch (ename / P VLA-OBJ)
                            (setq vla-obj (vlax-ename->vla-object ename))
                            (setq p (vla-get-InsertionPoint vla-obj))
                            (vla-put-alignment vla-obj 10)
                            (vla-move vla-obj (vla-get-InsertionPoint vla-obj)p)
                            (vla-update vla-obj)
                            )

 
  (prompt "\nWählen Sie mehrere Blöcke aus:")  ; Benutzeraufforderung für die Auswahl
  (setq blk-selection (ssget '((0 . "INSERT"))))  ; Alle eingefügten Blöcke auswählen

  (if blk-selection
    (progn
      (setq blk-count (sslength blk-selection))  ; Anzahl der ausgewählten Blöcke
      (princ (strcat "\nEs wurden " (itoa blk-count) " Blöcke ausgewählt."))

      (repeat blk-count
        (setq blk (ssname blk-selection (1- blk-count)))  ; Nächsten Block aus der Auswahl holen
        (setq vla-blk (vlax-ename->vla-object blk))  ; Verwandelt das ausgewählte Objekt in ein VLA-Objekt

        (if (and (vlax-property-available-p vla-blk 'HasAttributes)  ; Prüft, ob der Block Attribute hat
                (= (vla-get-HasAttributes vla-blk) :vlax-true))
          (progn
            (setq attr-list (vlax-invoke vla-blk 'GetAttributes))  ; Ruft die Attribute ab
            (setq room-name "")
            (setq room-number "")
            (setq text-height 1.0)  ; Standard-Schrifthöhe, falls keine gefunden wird

            (foreach attr attr-list
              (setq tag (strcase (vla-get-TagString attr)))  ; Tag des Attributs holen
              (setq value (vla-get-TextString attr))  ; Wert des Attributs holen
              (setq text-height (vla-get-Height attr))  ; Schrifthöhe des Attributs holen
              (cond
                ((= tag "ROOM_NAME") (setq room-name value))
                ((= tag "ROOM_NUMBER") (setq room-number value))
              )
            )

            ; Block auf Layer "Ausschalten" verschieben
            (vla-put-Layer vla-blk "Ausschalten")
            (vla-update vla-blk)
            (princ "\nBlock wurde auf den Layer 'Ausschalten' verschoben.")

            ; Wenn beide Werte gefunden sind, Text erstellen
            (if (and room-name room-number)
              (progn
                (setq ins-point (vlax-get vla-blk 'InsertionPoint))  ; Einfügepunkt des Blocks
                (setq x (car ins-point)
                      y (cadr ins-point)
                      z (caddr ins-point))

                ; Erstellen der Textzeilen auf dem Layer "Beschriftung_neu"
                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x y z))  ; Position des Textes
                        (cons 11 (list x (- y (* text-height 1.5)) z))
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-name)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen

                (TextMitteZentrisch (entlast))
                     
                     

                (entmake
                  (list '(0 . "TEXT")
                        (cons 10 (list x (- y (* text-height 1.5)) z))  ; Zweite Zeile etwas tiefer
                        (cons 40 text-height)  ; Dynamische Schrifthöhe
                        (cons 1 room-number)  ; Textinhalt
                        '(7 . "Standard")  ; Standard-Schriftstil
                        '(8 . "Beschriftung_neu")))  ; Layer setzen

                (TextMitteZentrisch (entlast))

                (princ "\nText wurde erstellt und auf den Layer 'Beschriftung_neu' verschoben.")
              )
              (princ "\nROOM_NAME oder ROOM_NUMBER fehlt, keine Textzeilen erstellt.")
            )
          )
          (princ "\nDer ausgewählte Block hat keine Attribute.")
        )
        (setq blk-count (1- blk-count))  ; Zähler für die Schleife dekrementieren
      )
    )
    (princ "\nEs wurden keine Blöcke ausgewählt.")
  )
  (princ)
)



                       
{/code]

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

das Flächenstempel_Tool(2023)

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: 26
Registriert: 29.10.2021

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

erstellt am: 27. Nov. 2024 13:01    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


Bild_2024-11-27_125132816.png


Bild_2024-11-27_125209501.png

 
Vielen Dank Jörn,

Text ist jetzt schön mittig zentriert.
Kleiner Haken noch: Acad positioniert den neuen Text am rechten Rand (siehe Bilder, grüner Rahmen zur Orientierung)
Gibt es auch dafür eine Lösung?


Gruß Ralf

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

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1770
Registriert: 11.10.2004

Window 11
ACAD 2021
CIVIL 2021
BricsCAD ab V14
11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
32.0GB RAM
NVIDIA GeForce MX450<P>

erstellt am: 27. Nov. 2024 13: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 Ralf,
für eine bündige Ausrichtung kannst Du mal nach der Funktion TEXTBOX schauen, es werden die relativen Koordianten linksunten und rechtsoben des Textes ermittelt.
aus diesen können dann über POLAR die Punkte rechtsunten und linksoben berechnet werden (im Beispiel mit Winkel 0, bei gedrehten Texten gibt es Murks)
Wenn dann diesen Eckkoordinaten der Einfügepunkt des Textes hinzuaddiert wird hat man die Weltkoordinaten und kann z.B. ein Umgrenzung zeichnen oder aus den Umgrenzungskoordinaten Funktionen schreiben, die für eine gemeinschaftliche, linke Begrenzungslinie verwendet werden können.

Code:

(defun c:test ( / COORDS OBJ P P1 P2 P3 P4)
  (if (setq obj (car(entsel "\nText picken:")))
    (progn
      (setq coords (textbox (entget obj)))
      (setq p (cdr(assoc 10 (entget obj))))
      (setq p1 (polar '(0.0 0.0) (+ (angle '(0.0 0.0) (car coords)) 0) (distance '(0.0 0.0) (car coords)))
            p2 (polar p1 0 (- (car (cadr coords)) (car (car coords))))
            p3 (polar p2 (+ 0 (* pi 0.5)) (- (cadr (cadr coords)) (cadr (car coords))))
            p4 (polar p3 pi (- (car (cadr coords)) (car (car coords)))))
      (setq coords (list p1 p2 p3 p4))
      (setq coords (mapcar '(lambda(coord)
                              (mapcar '+ coord p))coords))
                   
      ;;;Umgrenzungslinie
      (entmake (list (cons 0 "LINE")(cons 10 (car coords))(cons 11 (cadr coords))(cons 62 6)))
      (entmake (list (cons 0 "LINE")(cons 10 (cadr coords))(cons 11 (caddr coords))(cons 62 6)))
      (entmake (list (cons 0 "LINE")(cons 10 (caddr coords))(cons 11 (cadddr coords))(cons 62 6)))
      (entmake (list (cons 0 "LINE")(cons 10 (cadddr coords))(cons 11 (car coords))(cons 62 6)))
      )
    )
  (princ)
  )

Also, das Beispiel ist nur für nicht gedrehte Texte im WKS.

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

das Flächenstempel_Tool(2023)

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