| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für BricsCAD |
Autor
|
Thema: Attribute Standort beeinflussen (611 / mal gelesen)
|
100dpi Mitglied selbständig
Beiträge: 8 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB MSI WS76, 64GB RAM, 4 TB
|
erstellt am: 10. Jan. 2023 15:35 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, hab da mal eine spezielle Frage. Ist es möglich, den Standort eines Attributes beim Verschieben des zugehörigen Blocks zu beeinflussen? Vielleicht via Script? Scenario: Ich füge einen Block ein und betexte das zugehörige Attribut. Ter Text steht jetzt an der Ausgangsposition (die ich ja bei Anlage bestimmt habe). Ich nehme den "Anfasser vom Attribut und schiebe es an eine andere Stelle. Nach einer Weile stelle ich fest, dass der Block an einer falschen Stelle positioniert ist und schiebe ihn an die richtige stelle. Beim Loslassen des Blocks, möchte ich gern dass das Attribut an seinen Ursprung zurückkehrt... Ist sowas möglich? Danke schon mal für Euer Interesse... Gruß RalfB ------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 BricsCAD V11 - V22 Pro Visual Basic
|
erstellt am: 10. Jan. 2023 18:16 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Hallo Ralf, Mir ist hier leider mit Bordmitteln nichts bekannt. Man könnte natürlich ein AttSync machen, aber dann werden die Attribute von allen Blockreferenzen des Blockes auf den ursprünglichen Ort zurückgesetzt. Als Workaround könnte man natürlich den gleichen Block auf dem Blockreferenzpunkt neu einfügen, alle Attribute mit X, und hat dann einen Bezugspunkt zum manuellen zurücksetzen. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 11. Jan. 2023 00:57 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
@100dpi WENN ich es richtig verstehen, dann denke ich das es so eine Funktion nicht ootb gibt, aber Bricscad ist erweiterbar und dein Anliegen erscheint mir häufig benötigt, daher wird es so eine Funktion bereits geben - man muss nur suchen! Normalerweise wird "Mehrere/alle Attribute ohne Blockreferenz verschieben", du suchst das Gegenteil und ich wunderte mich so ein Werkzeug nicht zu haben, ein funktionierendes Beispiel (unschön und unvollendet zur Anschauung und Diskussionsgrundlage: MOVEXA) Code: (defun c:MOVEXA (/ Aws1 Aws2 XL) ; Dieser Beispielcode kümmert sich nicht um Layer Eigenschaft gesperrt oder Attribute mit 'gesperrt' Eigenschaft (setvar 'CMDECHO 1) (if (setq Aws1 (ssget ":L")) (if (setq Aws2 (ssget "_P" '((0 . "INSERT")(66 . 1)))) (progn (foreach BlkRef (vl-remove-if 'listp (mapcar 'cadr (ssnamex Aws2))) (setq OBJ (entnext BlkRef)) (while (/= "SEQEND" (cdr(assoc 0 (setq tmp (entget OBJ))))) (setq xl (cons (list (cdr(assoc -1 tmp))(assoc 10 tmp)(assoc 11 tmp)) xl)) (setq OBJ (entnext OBJ)) ) ) (setvar 'CMDECHO 1) (command "_.MOVE" Aws1 "" PAUSE PAUSE) (while (> (getvar "CMDACTIVE") 0) (command PAUSE)) (foreach Att xl (setq OBJ (entget (car Att))) (entmod (subst (nth 1 Att)(assoc 10 OBJ)(subst (nth 2 Att)(assoc 11 OBJ) OBJ))) ) ) (progn(command "_.MOVE" Aws1 "" PAUSE PAUSE)(while (> (getvar "CMDACTIVE") 0) (command PAUSE))) ) (princ "\nKeine Objekte gewählt") ) (princ) ) (princ "\nMOVEXA verschiebt Objekte, ausser Attribute") (princ)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 11. Jan. 2023 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Ich glaube was Ralf braucht ist, dass die Attribute nicht dort bleiben wo sie sind und nur der Block verschoben wird sondern dass die Attribute an ihre Ursprungsposition kommen als hätte er den Block gerade eingefügt und noch kein Attribut über die Griffe verschoben. Das könnte man über eine Analyse der zugehörigen Blockdefinition machen. Allerdings muss man da auch berücksichtigen dass man Attribute gleich benennen kann und (worst Case) die Definitionen nicht mit den tatsächlichen Attributen übereinstimmen müssen. Ohne solche Sachen könnte das etwa so aussehen. Ist aber was separates also nichts was beim Loslassen des Blocks vollautomatisch funktioniert. Könnte man aber auch machen. Code: (if (setq satz (ssget '((0 . "INSERT")))) (progn (foreach obj_name (mapcar 'vlax-ename->vla-object (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) (setq att_list (vlax-invoke obj_name 'GetAttributes)) (setq blk_def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)) ) (vla-get-name obj_name) ) ) (setq att-def_list (list)) (vlax-for dummy blk_def (if (= (vla-get-ObjectName dummy) "AcDbAttributeDefinition") (setq att-def_list (cons dummy att-def_list)) ) ) (setq att-def_list (reverse att-def_list)) (if (= (length att-def_list) (length att_list)) (progn (setq n 0) (repeat (length att_list) (vla-put-InsertionPoint (nth n att_list) (VLAX-3D-POINT (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint (nth n att-def_list)) ) ) (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj_name)) ) ) ) ) (vl-catch-all-apply 'vla-put-TextAlignmentPoint (list (nth n att_list) (VLAX-3D-POINT (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-TextAlignmentPoint (nth n att-def_list)) ) ) (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj_name)) ) ) ) ) ) (setq n (1+ n)) ) ) ) ) ) )
------------------ 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
Beiträge: 8 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB MSI WS76, 64GB RAM, 4 TB
|
erstellt am: 11. Jan. 2023 14:55 <-- editieren / zitieren --> Unities abgeben:
Hey, wow Danke für Euren Eisatz @Andreas:Genau so hab ich es gemeint. Als Variante: Den Standort des Attributes im Bezug auf den Block neu bestimmen und die Textformatierung ändern können. Bsp. Ich fertige Dokumentationen von Brandmeldeanlagen an. In den Etagenplänen muss ich (der Übersicht halber) die Attribute oft anders am Block anordnen und den Text umformatieren (Größe ändern etc.) Diese Blöcke kopiere ich dann mit Kabelwegen in das Blockschaltbild. In diesem Blockschaltbild (welches sich in der selben Zeichnung in einem neuen Layout befindet), müssen die Attribute umständlich wieder "zurück- formatiert und gesetzt werden (sollen da ja alle gleich aussehen) Kann ich Deinen Code in einer Lisp-Datei speichern und damit rumprobieren? (bin kein Programmierer ) Gruß RalfB ------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 11. Jan. 2023 15:10 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Na da wäre ich nie draufgekommen, sorry. Klar kannst du das machen, füge nur am Ende eine schließende Klammer an: ) und als erste Zeile (defun c:AttPosReset nil zum Beispiel, um es mit AttPosReset als neuen Befehl zu testen.
[Diese Nachricht wurde von cadffm am 11. Jan. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
100dpi Mitglied selbständig
Beiträge: 8 Registriert: 29.10.2021 ACAD, BricsCAD, ArcadiaBIM, SolidWorks, ProfiCAD, ThinkPad P72, 80GB RAM, 3 TB MSI WS76, 64GB RAM, 4 TB
|
erstellt am: 12. Jan. 2023 19:06 <-- editieren / zitieren --> Unities abgeben:
Ihr seid so geil... Das spart richtig Zeit... Darf ich fragen, was ich in die Lisp noch einfügen muss, um den Text in die ursprüngliche Formatierung zurück zu setzen? Danke Euch ganz herzlich Gruß RalfB
------------------ I like to move it... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Bauzeichner/Bautechniker (m/w/d) | Wir sind ein Ingenieurbüro im Bereich der Planung und Bauüberwachung von Infrastrukturanlagen mit etwa 100 Mitarbeiterinnen und Mitarbeitern in acht Niederlassungen. Für öffentliche und private Auftraggeber bieten wir die komplette Bandbreite der Ingenieurdienstleistungen. Unsere Aufgaben liegen hierbei schwerpunktmäßig in der Verkehrs- und Verkehrsanlagenplanung sowie in sämtlichen wasserwirtschaftlichen und wasserbaulichen Planungs- und Sanierungsaufgaben inkl.... | Anzeige ansehen | Technischer Zeichner, Bauzeichner |
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 13. Feb. 2023 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für 100dpi
Eben erst gelesen, war geschäflich weg und dann krank. Blödes timing ... ich weis Du fügst vor die Zeile: (setq n (1+ n)) Das hier ein: (vla-put-StyleName (nth n att_list) (vla-get-StyleName (nth n att-def_list))) Da kannst du natürlich auch noch andere Sachen reinschreiben wie Textausrichtung, Drehung, Farbe, Layer usw. (nth n att_list) holt sich aus einer Liste mit Attributen (die vorher erstellt wurde) ein Attribut wobei n ein Zähler ist. (nth n att-def_list) macht das selbe mit einer Liste die Attributdefinitionen enthält. Die Beiden müssen natürlich zusammenpassen (also Definition und Attribut) das wird in dieser einfachen Programmversion nicht weiter geprüft. vla-put-... weist etwas zu ws mit vla-get-... geholt wird Also: weise dem Attribut etwas zu was aus der Definition geholt wird. Das kann ja dann alles Mögliche sein. Viel Spaß damit ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |