Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Nachkommastellen

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
  
PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
Autor Thema:  Nachkommastellen (184 / mal gelesen)
Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 11. Feb. 2025 14: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

Moin!

Ich möchte in Abhängigkeit von der Größe des Zahlenwertes null bis drei Nachkommastellen anzeigen lassen. Mein erster naiver Versuch (s. u.) taugt nichts, weil negative Werte entstehen können, die nicht akzeptiert werden.

  sAB = Round(oCD.MassProperties.Area,    Log(1 / oCD.MassProperties.Area))
  sVB = Round(oCD.MassProperties.Volume , Log(1 / oCD.MassProperties.Volume))

Mag mir vielleicht jemand kurz zeigen, wie es richtig geht?

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 727
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 12. Feb. 2025 09:19    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 Roland Schröder 10 Unities + Antwort hilfreich

wie wäre das?
Code:
Sub test()
    Dim A As Double
    A = 999  'eine Fläche zum Ausprobieren
    A = A + 0.123456    'irgendwelche Nachkommastellen anhängen
   
    Dim sAB As Double, AnzStellen As Long
    Select Case A
    Case 0 To 5
        AnzStellen = 3
    Case 5 To 100
        AnzStellen = 2
    Case 100 To 1000
        AnzStellen = 1
    Case Else
        AnzStellen = 0
    End Select
   
    'das eigentliche Runden
    sAB = Round(A, AnzStellen)
   
    MsgBox A & vbCrLf & sAB, , "Stellen: " & AnzStellen
   
End Sub

------------------
Gruß KraBBy

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 12. Feb. 2025 11:54    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

Ja, so kann man das natürlich machen, aber das sind dann auch zehn mal so viel Zeilen.

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




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

Beiträge: 2743
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 12. Feb. 2025 12: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 Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

Weniger Zeilen machen es nicht per se besser. Oder liest sich das einfacher?

Code:

Dim i As Integer: i = 1: If Len(Left(CStr(oCD.MassProperties.Area), InStr(CStr(oCD.MassProperties.Area), ",") - 1)) = 1 Then i = 3: If Len(Left(CStr(oCD.MassProperties.Area), InStr(CStr(oCD.MassProperties.Area), ",") - 1)) = 2 Then i = 2

------------------
MfG
Ralf

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 12. Feb. 2025 12:51    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

Nein 

Vielleicht ist es nur eine Spielerei und ich bin nicht pragmatisch genug, aber ich kann nicht glauben, dass eine so einfache Regel nicht auch einfach formuliert werden kann.

Der Logarithmus hat eigentlich schon genau das gewünschte Verhalten, ich müsste nur das Ergebnis eingrenzen.

In der Inventor-Parametertabelle gibt es dafür die Funktionen Min und Max; gibt es in VBA nichts Entsprechendes?

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




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

Beiträge: 2743
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 12. Feb. 2025 13:15    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 Roland Schröder 10 Unities + Antwort hilfreich

Moin

Benötigt wäre eine Treppenfunktion, da das Ergebnis über einen Wertebereich hinweg konstant bleibt und sich nur bei definierten Grenzwerten sprunghaft ändert. Die Select-Case Anweisung oder auch ein If-Then ist die programmatische Umsetzung.
Hinter einer Min,Max Funktion steckt auch nur ein mehrzeiliger Programmcode mit einem Vergleich. Es erspart dem Anwender Tipparbeit, wenn sich wiederholende Programmteile in Funktionen gekapselt werden. Manchmal mit skurilen Entwicklungen. Mein persönlicher Favorit:

Code:

Private Function Invert(ByVal Zahl as Double) As Double
    Invert = Zahl * (-1)
End Function


------------------
MfG
Ralf

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 12. Feb. 2025 13:37    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

Die "Treppe" ergibt sich bereits dadurch, dass die Funktion Round schon selber für die Anzahl Nachkommastellen aus einem beliebigen Wert eine Ganzzahl macht.

Denkt so nur ein Programmier-Dilettant wie ich?

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




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

Beiträge: 2743
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 13. Feb. 2025 15: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 Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

Nein, das stimmt so nicht. Die Funktion Round erwartet als zweites Argument eine Integer Wert für die Anzahl der Nachkommastellen. Die Logfunktion liefert aber einen Double Wert als Ergebnis. VBA konvertiert diesen für die Ausführung der Roundfunktion automatisch in einen Integer. Das sollte vermieden werden, da es zu unerwartetem Programmverhalten führen kann. Die Roundfunktion rundet dann die Fläche bzw. das Volumen auf die Anzahl Nachkommastellen die von Log (genauer gesagt von der automatischen Double zu Integer Konvertierung) zurückgegeben werden. Bei einem negativen Wert weiß ich ehrlich gesagt auch nicht aus dem Kopf was passiert.

Die Funktion liefert aber keine sprunghaften Wertänderungen. Ich sehe keine Möglichkeit daraus eine Abstufung mit 0, 1, 2 und 3 zu machen. Möglicherweise gibt es eine Funktion die annähernd die Werte liefert. Die müßte mM zu Beginn einen steileren Anstieg als der natürliche Logarithmus haben und dann gegen 3 oder die Eulerzahl als Grenzwert laufen.

------------------
MfG
Ralf

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 13. Feb. 2025 16:02    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

Ah, Danke für die Erklärung! Aber ein Round() oder ein Int() einzufügen, wäre doch kein Problem.

Was bei negativen Werten passiert, kann ich Dir sagen, denn das habe ich ja beim Herumprobieren erzeugt: Die Ausführung stoppt mit Fehlermeldung.

Aber die Sache lässt mich nicht los. Ich sehe es als mathematische Übung. Sudokus sind langweilig. Ich experimentiere deshalb grad mit Arcus-Tangens, die Funktion hat einen Definitionsbereich von +/- Unendlich während der Wertebereich streng begrenzt ist auf +/- Pi/2. Vermutlich erzeugt das Lösen einer Winkelfunktion und eines Logarithmus' im Hintergrund weit mehr Rechnerlast als eine schlichte Abfrage, aber ich will einfach wissen, ob es geht   .

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

[Diese Nachricht wurde von Roland Schröder am 13. Feb. 2025 editiert.]

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

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




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

Beiträge: 2743
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 13. Feb. 2025 16: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 Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

Aha, wie so ein Pitbull mit Kiefersperre. Einmal reingebissen, Kiefer ausgerenkt, Loslassen unmöglich. 
Ob eine Lösung effizient ist, kann man ja erst beurteilen wenn man sie gefunden hat. Ich hatte in die Richtung überlegt, statt dem Zahlenwert von X die Anzahl der Dezimalstellen vor dem Komma zu nehmen. Das würde den Wertebereich auf ganze positive Zahlen von 1 bis vielleicht 10 einschränken. In meinem jugendlichen Leichtsinn kam mir dann die Idee es mal wie etwas wie

Y = 1/X^4 + 1/X^3 + 1/X^2

zu probieren. Das ergäbe für x=1 y=3, also für 1-stellige Werte, drei Nachkommastellen. Die Funktion fällt dann mit stetig geringer werdender Neigung gegen 0 ab. Aber egal wie man es dreht, entweder ist am Anfang das Gefälle zu stark oder hinten raus zu gering. Das bringt keine Lösung.
Dann kam mir die Idee aufgrund des beschränkten Wertebereiches es vielleicht mal im endlichen Zahlenkörper eines Galois Feld zu versuchen. Und blitzartig wurde mir wieder klar, warum ich das im Studium so gehasst habe. 

------------------
MfG
Ralf

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 13. Feb. 2025 17:55    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,
Code:
sVB = Round(dVB, Round(Atn(Log(70.71 / dVB))) / 1.57 + 1)
funktioniert tatsächlich. Ich bekomme so schon mal je nach Ausgangswert 0, 1 oder 2 Nachkommastellen. Immerhin.

70.71 ist die logarithmische Mitte zwischen 10 und 100, wo es jeweils von 2 auf 1 bzw. von 1 auf 0 Nachkommastellen umschlagen soll. Der Logarithmus ist dort dann 0, und die Steigung des Atn maximal. Die Umschlagpunkte passen jetzt allerdings noch nicht genau, da muss ich noch einen Faktor einfügen.

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 727
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 13. Feb. 2025 18:22    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 Roland Schröder 10 Unities + Antwort hilfreich

Jetzt ist es also eine kleine challenge 

Als Sprungfunktion wäre mir sgn(Zahl) bekannt. Das gibt abhängig vom Vorzeichen -1 / 0 / +1 zurück. Wenn man das zu 1 addiert und dann halbiert, hat man einen Sprung von 0 auf 1. Dass dabei auch noch 0,5 raus kommen kann wenn Zahl=0 ignoriere ich im folgenden.

"Zahl" kann man schieben, so dass der Sprung am gewünschten Ort liegt: x-a (x: unsere Variable zb. Fläche  a: Grenzwert wo der Sprung sein soll)

Wenn man das nun 3x macht mit unterschiedlichen a und diese sgn summiert, hat man eine aufsteigende Treppe von 0 bis 3.

Das muss dann nur noch umgekehrt werden, weil wir ja eine absteigenden Treppe haben wollen. (kleine Zahlen 3 Stellen, große Zahlen 0 Stellen)
Also :
3 - (1+sgn(x-A1))/2 - (1+sgn(x-A2))/2 - (1+sgn(x-A3))/2

Ich hab das nicht ausprobiert. Kann sein, dass Tipp und Denkfehler dabei sind.

Wenn mir sowas unter die Augen kommt, ohne dass ich das innerhalb der letzten Tage selbst gemacht hab, braucht es schon eine Weile, um das wieder zu verstehen. Oder eben einige Zeilen Kommentar zur Erklärung, was dann aber die vorher gesparten Zeilen wieder egalisiert. Deshalb bin ich bei Ralf: das ganze in eine function packen und diese verwenden.

------------------
Gruß KraBBy

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

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



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

Beiträge: 13502
Registriert: 02.04.2004

Inventor

erstellt am: 14. Feb. 2025 20:28    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


NachkommastellenmitArcustangens2025-02-13.zip

 
Moin!

Ja, sign() ist auch gut, hat aber nur drei mögliche Ergebnisse.

Ich habe inzwischen meine Atn-Formel fertig getunt, und nun liefert sie auch alle vier Möglichkeiten von 0 bis 3. Der "Fixpunkt" liegt dann bei 10, und die beiden anderen Umschlagpunkte, 1 und 100, im logarithmischen Sinne symmetrisch dazu, das klappt ziemlich gut:

Code:
sAB = Round(dAB, Round(Atn(1.8 * Log(9.999 / dAB))) / 1.0472 + 1.5)

Interessant ist, dass die Inventor-Gleichungskurve bei der Darstellung der aus Log und Atn kombinierten Funktion versagt. Deshalb habe ich Excel zu Hilfe genommen und damit den nötigen Faktor durch Ausprobieren bestimmt. 

Die Umschlagpunkte exakt zu treffen, ist ein bisschen schwierig, aber auch nicht ganz so wichtig.

Es spricht im Übrigen nichts dagegen, das Ganze in eine function zu packen. Dass es dort dann egal ist, ob es eine Zeile braucht oder zehn, sehe ich auch ein. Aber es macht doch großen Spaß, auch noch mal die gute alte Trigonometrie anzuwenden. Und eine oder mehrere Kommentarzeilen ist mir das auch das wert!

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

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)2025 CAD.de | Impressum | Datenschutz