| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Nachkommastellen runden (3780 mal gelesen)
|
sabjon Mitglied Bauzeichner
Beiträge: 120 Registriert: 12.02.2009 Windows 10 64 Bit, Autocad 2021
|
erstellt am: 02. Nov. 2009 16:21 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 02. Nov. 2009 16:26 <-- editieren / zitieren --> Unities abgeben: Nur für sabjon
ja .. z.B. mit dem Codeschnipsel (if(and(setq ATT(car(nentsel"\nAttribut wählen:"))) (setq ATT(entget ATT)) (=(cdr(assoc 0 ATT))"ATTRIB") (setq TEXT(cdr(assoc 1 ATT))) (setq TEXT(distof TEXT)) (setq TEXT(rtos TEXT 2 2)) ) (entmod(subst (cons 1 TEXT)(assoc 1 ATT)ATT)) ) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 02. Nov. 2009 16:27 <-- editieren / zitieren -->
Hi, >> gibt es eine Möglichkeit ein Attribut (beispielsweise 12,5486) auf zwei Nachkommastellen zu runden Grundsätzlich mal nein, denn Attribute sind Platzhalter für allgemeine Texte/Zeichen. Ob diese Zeichnen jetzt eine Zahl darstellen oder nicht, obliegt ausschliesslich dem Betrachter, für das AutoCAD selbst ist es unerheblich. Natürlich gibt es jetzt in AutoCAD mit Programmierung die Möglichkeit, so etwas umzusetzen, auch unter dem Begriff Schriftfelder könnte es zu einem solchen gewünschten Effekt kommen (Schriftfeld stellt einen anderen Attributswert formatiert als Zahl mit angebbaren Nachkommastellen dar). Damit hast Du mal Suchbegriffe zur Suche in Deiner Hilfe und in diesem Forum; bitte bei der nächsten Rückfrage die Systeminformation eintragen, denn wir wissen nichtmal Deine AutoCAD-Version (z.B. ob Du schon auf Scriftfelder hingreifen kannst, können wir erst dann sehen). - alfred - ------------------ www.hollaus.at |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 02. Nov. 2009 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für sabjon
|
sabjon Mitglied Bauzeichner
Beiträge: 120 Registriert: 12.02.2009 Windows 10 64 Bit, Autocad 2021
|
erstellt am: 04. Nov. 2009 08:25 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADmium: ja .. z.B. mit dem Codeschnipsel(if(and(setq ATT(car(nentsel"\nAttribut wählen:"))) (setq ATT(entget ATT)) (=(cdr(assoc 0 ATT))"ATTRIB") (setq TEXT(cdr(assoc 1 ATT))) (setq TEXT(distof TEXT)) (setq TEXT(rtos TEXT 2 2)) ) (entmod(subst (cons 1 TEXT)(assoc 1 ATT)ATT)) )
Das funktioniert ja prima. Habe nur leider bis zu 1000 Attribute und mehr in einer Zeichnung und möchte diese auf einmal runden. Wir setzen übrigends Autocad 2004 bis 2006 ein, sorry hatte ich letztes mal vergessen. Vielen dank für eure Hilfe. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 04. Nov. 2009 09:03 <-- editieren / zitieren --> Unities abgeben: Nur für sabjon
Zitat: Original erstellt von sabjon: Das funktioniert ja prima. Habe nur leider bis zu 1000 Attribute und mehr in einer Zeichnung und möchte diese auf einmal runden. Wir setzen übrigends Autocad 2004 bis 2006 ein, sorry hatte ich letztes mal vergessen. Vielen dank für eure Hilfe.
Naja ... das ist ja auch nur ein Codeschnipsel .... den man dann auf einen Auswahlsatz von Blockreferenzen mit Attributen oder alle Attribute der ganzen Zeichnung loslassen kann. Das werden dann noch ein paar Codezeilen mehr. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 04. Nov. 2009 10:54 <-- editieren / zitieren --> Unities abgeben: Nur für sabjon
Zitat: Original erstellt von sabjon: Das funktioniert ja prima. Habe nur leider bis zu 1000 Attribute und mehr in einer Zeichnung und möchte diese auf einmal runden. Wir setzen übrigends Autocad 2004 bis 2006 ein, sorry hatte ich letztes mal vergessen. Vielen dank für eure Hilfe.
Na ja, das könnte man mit folgendem Codeschnipsel lösen: Code:
;| Funktion rundet numerische Werte eines oder mehrerer Attribute eines oder mehrerer Blockeinfügungen auf eine bestimmte Stelle hinter dem Komma. Argumente: LST-BLOCKNAMES = Liste der Blocknamen die bearbeitet werden sollen (als Strings) LST-ATTNAMES = Liste der Attributnamen deren Werte bearbeitet werden sollen (als Strings) INT-DIGIT = Integer zur Festlegung der Stellen auf die gerundet werden sollRückgabe: Liste der bearbeiteten Blockeinfügungen als vla-Objekte Beispiel: (setq data (CAD:DE:ATTVALUEROUND '("Test" "Test2" "Test3")'("Wert1" "Wert2" "Wert3") 12)) |; (defun CAD:DE:ATTVALUEROUND (LST-BLOCKNAMES LST-ATTNAMES INT-DIGIT / ATTS BLOCKREFS INDEX LST-BLOCKREFS NEW-VAL RETVAL SAVEDIMZIN X) (setq LST-BLOCKNAMES (mapcar '(lambda (X) (strcat (strcase X) ",")) LST-BLOCKNAMES ) LST-BLOCKNAMES (apply 'strcat LST-BLOCKNAMES) ;_ Liste der Blocknamen in ein wcmatch Format bringen LST-ATTNAMES (mapcar 'strcase LST-ATTNAMES) ;_ Elemente der Attnamens-Liste in Großschreibung konvertieren ) (setq SAVEDIMZIN (getvar "DIMZIN")) ;_ für rtos sicherheitshalber einstellen (setvar "DIMZIN" 0) (if (setq BLOCKREFS (ssget "X" (list (cons 2 LST-BLOCKNAMES) (cons 410 (getvar "ctab")) ) ) ) ;_ Auswahlsatz erzeugen (progn (setq INDEX 0) (repeat (sslength BLOCKREFS) ;_ Aus Auswahlsatz Liste von vla-Objekten erzeugen (setq LST-BLOCKREFS (cons (vlax-ename->vla-object (ssname BLOCKREFS INDEX) ) LST-BLOCKREFS ) INDEX (1+ INDEX) ) ) (foreach ENAME LST-BLOCKREFS ;_ Für jede gefundene Blockeinfügung... (if (= (vla-get-hasattributes ENAME) :vlax-true) ;_ Hat er Attribute? (if (setq ATTS (vlax-safearray->list (vlax-variant-value (vlax-invoke-method ENAME 'GETATTRIBUTES) ) ) ;_ Mach Attributliste ) (foreach ATT ATTS ;_ Für jedes Attribut der Liste (if (member (vla-get-tagstring ATT) LST-ATTNAMES) ;_ Ist das Attribut in der Liste der zu bearbeitenden Attribute? (if (setq NEW-VAL (distof (vla-get-textstring ATT))) ;_ Hole Attributwert und konvertiere in real (if (not (vl-catch-all-error-p (vl-catch-all-apply ;_ setze neuen String 'vla-put-textstring (list ATT (rtos NEW-VAL 2 INT-DIGIT)) ;_ konvertiere real in string ) ) ) (if (not (member ENAME RETVAL)) ;_ Wenn bearbeitet, packe Blockreferenz in Rückgabeliste (setq RETVAL (cons ENAME RETVAL)) ) ) ) ) ) ) ) ) ) ) (setvar "DIMZIN" SAVEDIMZIN) RETVAL )
------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |