|
Povray - Open Source --- MA_Helpers_V1
In Povray fehlen enorm viele Funktionen, die man in anderen Programmiersprachen für selbstverständlich hält. Arrays sortieren und auseinandernehmen, Strings bearbeiten, Typenumwandlungen, liebliche RegExe, für all das gibt es in PHP an die hundert Funktionen.
Povray dagegen bietet für die Behandlung von Strings nur zwei hilfreiche Befehle:
substr() und strlen(). Das wars. Vielleicht noch concat(), aber das war es dann wirklich. Variablen
Da diese für meine Zwecke bei Weitem nicht ausreichen, sind über die Jahre einige Makros zusammengekommen. Hat enorm Zeit gekostet, vielleicht kann ich mit deren Veröffentlichung dem ein- oder anderen viel Zeit und Mühe ersparen.
Darüberhinaus enthält sie reparierte Funktionen, die in Povray direkt oder als Skript-Makros im Standard-Paket vorliegen und Fehler beherbergen.
Ohne ma_helpers_v*.inc läuft keines meiner größeren Pakete!
Die Datei muss überall inkludiert werden, ansonsten hagelt es Fehlermeldungen. Trotz ihrer Größe von bald 2500 Zeilen (Mai 2019) kratzt das die Performance nicht, es dürfte kaum ein Sekündchen Renderzeit obendrauf kommen. Es sei denn in der Render-Box schwitzt ein 4-86er.
Für genaue Dokumentationen der Makros, Parameter und was am Ende bei rauskommt, siehe Quellcode.
- Cam* und Lig* Debug und Logfile - MA_Terminal - MA_Error - MA_Warning - MA_Notice - MA_Deprecated - MA_Finish - Wichtiger Hinweis Spezialitäten - MA_CameraAndLight_Prepare - MA_CameraAndLight_Set - MA_RenderStyle_Set - MA_RenderStyle_Reset - MA_GetParam* - MA_GetSlope - MA_GetSlope_ByString - MA_SetClock - MA_OutputArrayString - MA_Include Strings - MA_String_Pad - MA_String_Trim - MA_String_TrimChar Arrays - MA_Array_FindString - MA_Array_Merge - MA_Array_Cut - MA_Array2D_Merge - MA_ArrayString2D_Sort - MA_ArrayString2D_MergeAndSort Umwandlungen - MA_String2Array - MA_ArrayString2String - MA_ArrayFloat2String - MA_String2Vector - MA_ArrayString2Vector - MA_Vector2String - MA_Vector2String_Base - MA_Deg2Vector* - MA_Vector2Deg Reparierte oder ergänzte Povray-Makros - MA_Circle_Text_Valigned Experimentelles / Entwicklung - MA_Testarea - MA_CenterMarker Updates Download Variablen
Im oberen Bereich der Datei sind Dutzende Variablen hinterlegt, mit denen die Funktionsweisen der Makros beeinflusst werden können. Bevor irgendwer ein Makro kopiert, umbenennt und für seine Zwecke abändert, sollte ein Blick auf die Variablen geworfen werden, ob der liebe Mä vorausschauend gearbeitet hat.Desweiteren wird von einigen meiner Skripte die Verwendung mancher Variablen vorausgesetzt. Cam* und Lig*
Betrifft folgende Variablen:CamLocation, CamLookAt, CamAngle, CamRotate, CamSky, CamType, LigVector, LigColor, LigIntensity, LigRotate Deren Inhalte werden vom Makro MA_CameraAndLight_Set() in die Tat umgesetzt. Auf diese Weise können einzelne Angaben bequem geändert werden, ohne den ganzen camera{}-Aufruf jedesmal zu erneuern. Oder die Werte werden mehrmals überschrieben, ohne das Povray wegen zuvieler Kameras in der Szene meckert. Ebenfalls möglich werden dazu einige Spielereien wie z.B. Licht langsam ein- und ausblenden. Simples Beispiel:
Debug und Logfile
MA_Terminal ( mText ) MA_Terminal_* ( mText, mValue )
MA_Terminal() schickt einen Text ans Terminal.Soll eine Variable mit ausgegeben werden, steht für jeden Variablen-Typ eine entsprechende Funktion bereit. Z.B. MA_Terminal_S(...) für Strings, MA_Terminal_F(...) für Float, *A für Array und *V für Vektoren. Eignet sich in aufwendigeren Skripten gut, um fix den Inhalt von berechneten Variablen auszugeben und zu überprüfen. MA_Error ( mMacro, mText ) MA_Warning ( mMacro, mText ) MA_Notice ( mMacro, mText ) Ist MA_Terminal_S sehr ähnlich, allerdings entsprechen Parameter und Ausgabe mehr denen der Warnings und Errors. MA_Deprecated ( mOldMacro, mNewMacro ) Lieber meckern als mit einem Error abstürzen. Beispiel:
Ausgabe im Terminal:
MA_Finish () Sollte - wenn überhaupt - ganz am Ende der ausführenden Povray-Datei verwendet werden. Wichtiger Hinweis
Ich mache den Umweg über diese Makro-Sammlung, damit ich entsprechende Texte irgendwann in ein Logfile speichern kann. Auf diese Weise brauche ich nur diese Makros anzupassen, nicht sämtliche Aufrufe in zig dutzend Dateien.
Nachteil dieser Vorgehensweise ist ganz klar, das keine ordentlichen Zeilennummern mit ausgegeben werden (können). Wer mit Fehlermeldung oder Warnung gleich über Datei und Zeile informiert werden möchte, sollte meine Makros vergessen und gleich die entsprechenden Direktiven #debug, #warning und #error verwenden.
Siehe: http://povray.org/documentation/3.7.0/r3_3.html#r3_3_2_7_1
Spezialitäten
MA_CameraAndLight_Prepare () Sollte direkt nach jeder Änderung an Kamera- oder Lichteinstellungen aufgerufen werden. MA_CameraAndLight_Set () Braucht nur einmal ganz am Ende eines Skripts aufgerufen werden, als eine der letzten Zeilen. Ein Beispiel, wie die beiden Funktionen zu verwenden sind, ist in Arbeit. MA_RenderStyle_Set ( mStyle )
MA_RenderStyle_Reset ()
MA_GetParam* ( xParams, xParamName, mDefault ) => float/string/vector/boolean MA_GetParam_S ( xParams, xParamName, mDefault ) => string
MA_GetParam_F ( xParams, xParamName, mDefault ) => float
MA_GetParam_V ( xParams, xParamName, mDefault ) => vector
MA_GetParam_B ( xParams, xParamName ) => boolean
Povray kennt weder optionale Parameter noch andere, halbwegs kontrollierbare Möglichkeiten, um eine variable Anzahl Variablen/Parameter an Makros zu übergeben. Das Problem lösen die Methoden MA_GetParam_*() rustikal aber wirksam.
Ähnlich wie bei CSS-Angaben werden Parameter und Wert mit Doppelpunkt voneinander getrennt. Die so entstandenen Paare von anderen Paaren mit Semikolon getrennt und alles zusammen in einem String gespeichert. Der String wird an die verschiedenen Makros mitsamt einem Parameter-Namen übergeben, dessen Wert - sofern vorhanden - zurückgegeben wird. Besonders wenn Objekte versteckt innerhalb von Makros und Sub-Makros erzeugt werden und man an die eigentlichen Aufrufe von außen gar nicht mehr drankommt, ist diese Methode sehr hilfreich, um Parameter dezent durchzuschleifen.
In ma_helpers ist ein komplizierteres Beispiel ganz unten hinterlegt und meine Tussi muss sich gewaltig damit herumschlagen.Hier an der Stelle sei nur die kurze Handhabung erwähnt:
MA_GetSlope ( xValue, mType, mIterations, mOffset ) => float MA_GetSlope_ByString ( xValue, mTypeMixed ) => float
switch
Bietet dieselbe Funktionalität wie MA_GetSlope(), allerdings werden die drei Slope-Parameter in einem Komma- oder Semikolon-separierten String übergeben. Optionale Parameter gleich eingebaut, Iterations und Offset können weggelassen werden, getrimmt wird ohnehin wo geht.linear cosinus cosinus+ cosinus++ bounce+ bounce-
Diese Funktion wird wahrscheinlich niemand in seinen Skripten direkt verwenden, da sie weniger leserlich ist. Gewissermaßen muss ich sie in meinen Screenplay-Makros verwenden, speziell der Matrix-Variante, da in der Matrix allemöglichen Angaben als String übergeben werden und diese dann nicht an mehreren Orten auseinandergepflückt werden müssen.
MA_SetClock ( mValue )
Stattdessen verwenden:
MA_OutputArrayString ( mArray, xFile, mOverwrite, mComment ) MA_OutputArrayString_Base ( mArray, xFile, mOverwrite, mComment, mHighestIndex )
Speichert ein String-Array hübsch formatiert in einer Textdatei ab. Sehr nett, will man zweifelnderweis wissen, was dadrin wirklich los ist.Dabei können mehrere Arrays in einer Textdatei abgelegt werden, setzt man Overwrite beim ersten Mal auf true und danach stetig auf false. Der Comment wird als Text über dem Array platziert und hilft bei der Identifizierung. Entsprechend sind Vorher/Nachher-Vergleiche auch größerer Kameraden gut möglich (und für nichts anderes war es zu Anfang gedacht). MA_Include ( mFile, mBasePath ) Bei mir liegen die gesuchten Dateien immer im Ordner der ausgeführten Datei, in dem darunter "../" oder einem Speziellen darüber. Ich war das Auskommentieren von Include-Anweisungen für Testzwecke irgendwann leid. Strings
MA_String_Pad ( xString, mLength, xPadChar, mPadPos ) => string
MA_String_Trim ( mParam ) => string MA_String_TrimChar ( mParam, mChar ) => string Arrays
MA_Array_FindString ( mString, mArray ) => boolean Ich verwende dieses Makro fast ausschließlich dazu, um irsinnig ver-undete If-Abfragen zu umgehen.
MA_Array_Merge ( mArray1, mArray2 ) => array MA_Array_Cut ( mArray, mIndexFirst, mIndexLast, mRows ) => array MA_Array2D_Merge( xArray1, xArray2 ) => 2d-array Auch dieses Makro kann alle Datentypen verkraften. MA_ArrayString2D_Sort( mArrayOld, mColSort, xDirection, xCompType ) => 2d-array MA_ArrayString2D_MergeAndSort( xArray1, xArray2, mColSort, xDirection, xCompType ) => 2d-array Umwandlungen
MA_String2Array ( mString, mSep, mTrim ) => array MA_ArrayString2String ( mArray, mSep ) => string MA_ArrayFloat2String ( mArray, mSep ) => string MA_String2Vector ( mString ) => vector MA_ArrayString2Vector ( mArray ) => vector MA_Vector2String ( mVector ) => string MA_Vector2String_Base ( mVector, mDimensions, mDigits ) => string MA_Deg2Vector* ( mRA, mDE, mRadius ) => vector MA_Deg2Vector00 ( mRA, mDE, mRadius ) => vector
MA_Deg2Vector10 ( mRA, mDE, mRadius ) => vector
MA_Deg2Vector01 ( mRA, mDE, mRadius ) => vector
MA_Deg2Vector11 ( mRA, mDE, mRadius ) => vector
Wandeln Rektaszension RA und Deklination DE in Verbindung mit der gewünschten Entfernung Radius in Vektoren um. Im Normalfall werden die Zahlenangaben für RA von -180 bis 180 und DE von -90 bis 90 Grad angegeben, was je nach Herkunft der Daten jedoch anders sein kann. Werden nur positive Werte für RA und DE geliefert, ist die Funktion MA_Deg2Vector00() zu verwenden. Bei den anderen Funktionen stehen die beiden Ziffern dafür, ob RA bzw. DE vom Makro in den positiven Bereich verschoben werden sollen, sprich ob zu RA-Werten 180 und/oder zu DE 90 addiert wird.Intern wird mit Radianten gerechnet, die nur positive Werte von 0 bis 2 Pi vertragen. MA_Vector2Deg ( mVector ) => array Wenn mir irgendwer sagen kann, wie man für Folgendes die Umkehrfunktion schreibt, wäre ich sehr dankbar.
Reparierte oder ergänzte Povray-Makros
MA_Circle_Text_Valigned ( ... ) => object
Experimentelles / Entwicklung
Für die folgenden Makros wird keine Garantie übernommen, das sie in der Form lange bestehen.Verwendung auf eigenes Risiko. MA_Testarea ( mAll ) MA_Testarea_Base ( mXN, mXP, mZN, mZP )
Zeigt eine Schachbrett-ähnliche Testumgebung.Die Parameter geben die Anzahl der Kacheln in den verschiedenen Richtungen an (X-Achse negativ, X-Achse positiv, dasselbe für Z). Wobei eine Kachel genau mittig unter <0,0,0> liegt und das ganze Feld somit um einen Unit breiter ist als die Summe der angegebenen Werte. Unter den Ganzzahlen befindet sich daher das Kachel-Innere, nicht die Grenze von einer zur nächsten. MA_CenterMarker ( mLengthAxes ) MA_CenterMarker_Base ( mRadiusSphere, mThicknessAxes, mLengthAxes, mAxes )
Markiert <0,0,0> mit einer Kugel und die Achsen mit Linien.Die Länge der Achsen wird intern um 0.5 erhöht, damit sie bündig mit den Kacheln der Testarea liegen. Updates
13. Mai 2019 - Version 1.1MA_GetParam* => Strings und erstellte Arrays werden gecached, um die Ausführung zu beschleunigen. MA_Notice => neu hinzugefügt. MA_Circle_Text_Valigned => neu hinzugefügt. 5. Mai 2019 - Version 1.0 Erste Version veröffentlicht. Download
ma_helpers_v1.7z => 300 kB 7-Zip, Version 1.1 vom 13. Mai 2019
KommentareKeine Kommentare bisher.
* Die Angabe von E-mail und Webseite optional.
Die E-Mail wird nicht mit dem Kommentartext angezeigt sondern nur intern gespeichert, sollte lediglich bei Kontaktwunsch angegeben werden.
der deutschen Seite
der englischen Seite beiden Seiten
© Mä 2014-2047
|