Antworten auf deine Fragen:
Neues Thema erstellen

letzter Skriptingversuch (Py4d)

K

kornyclown

Guest

So, ich beschäftige mich jetzt seit über einem Jahr mit Python. Ich habe den/die Syntax gelernt. Ich kenne Datentypen, Variablen, Objekte, Operatoren, etc. Habe mir mittlerweile sogar schon einige Strukuren in Java angesehen, weil ich Programmieren/ Skripten super interessant finde und ich gerne mehr Nutzen für meine Arbeit aus diesem vielseitigen Feld ziehen möchte.
Jedoch sind Interesse und Talent nicht miteinander verwand und ich starte jetzt offiziel meinen letzten Versuch in diese Richtung. Wenn ichs dann nich draufkrieg, akzepiere ich dass ich dafür wohl zu blöd bin. Habe die folgenden Fragen auch schon in Python speziefischen Foren recherchiert aber dort wird Code mit Code erklärt und das bringt mich nicht weiter, so wie ich auch kein Chinesisch lernen würde wenn man es mir auf chinesisch erklärt.

1. Ich verstehe bis heute nicht was __init__ macht.
Ja, diesen Post kenn ich schon aber er hat mir leider nicht geholfen. Dort taucht auch Frage 2 auf.
2. Was macht dieses self? Ich hab das schon bei ganz vielen Objekten gesehen aber ich weiß nich was es da tut.
3. Und das ist eine Py4d spezifische Frage:
Ich suche eine Funktion mit der man x,y,z Position eines Vertex auslesen und eine mit der man sie setzen kann. Ich hab nur irgendwas gefunden SetPoint der jedoch einen Vector übergibt und nicht die drei einzelnen Werte.
Ich würde mir gerne einen Helfer schreiben mit dem ich wahlweise einzele oder alle Positionsdaten von einem Vertex auf einen anderen Kopieren kann, in der Hoffnung dass das als Einsteigerskript nicht so schwer wäre.
Ich dachte da an etwas wie:

pos = ActivePoint.GetPosition(x,y,z)
ActivePoint.SetPosition(pos)

Die Befehle sind, das weiß ich selbst, weitestgehend ausgedacht. Es soll auch nur meine Idee verdeutlichen.


Bin für jede Hilfe dankbar.
 

AW: letzter Skriptingversuch (Py4d)

Zu 1.) Init bezieht sich in so ziemlich jeder Programmiersprache auf das Initialisieren des Scripts/Programms, etc.
Das heißt im Endeffekt nichts anderes, alls dass Variablen festgelegt, Dialoge erzeugt, Ressourcen geladen werden usw.
Zu 2.) self bezieht sich in allen Programmiersprachen immer auf das jweilige eigene Objekt. Bspw. kann man innerhalb eines Dialoges mit self direkt auf seine Member und Attribute usw. zugreifen, ohne Umwege über das Parent gehen zu müssen. Auch wichtig bei rekursiven Algorithmen.
Zu 3.) Kann ich Dir zwar so nicht beantworten, da ich 0 Erfahrung mit PY hab, aber wenn Du nen Vektor hast, dann hast Du bereits die Punktposition.

Ein Vektor besteht aus den 3 Werten, die kannst Du auf verschiedene Weise auseinanderpflücken. Ein Punkt hat deshalb nur einen Vektor, der die Position bestimmt, da ein Punkt niemals eine Ausrichtung haben kann.


Übrigens sind das absolute Grundlagen, die man beherrschen sollte. Da nützt auch Syntaxkenntnis nicht viel. :)

edit: nach 10sec. googeln das hier gefunden: Da steht alles drin:

edit #2:
Warum nimmst Du nicht einfach die GetPoint()-Methode? Der o.g. Link bezieht sich auf das Plugin, nicht die mitgelieferte Version. Daher unterscheiden die sich.
 
Zuletzt bearbeitet von einem Moderator:
AW: letzter Skriptingversuch (Py4d)

Erstmal danke für deine ausführliche Stellungnahme. In wie weit das absolute Grundlagen sind kann ich nich wirklich einschätzen weil init uns self in meiner Lektüre (Python und Java) auf den ersten 150 Seiten nicht einmal erwähnt wurden, deshalb bin ich davon ausgegangen das es nicht zu den Grundlagen gehört.

Die Documentation hab ich mir auch schon angesehen, da bin ich ja überhaupt darauf gestoßen das diese Methode nur einen Vector zurück gibt. Es wird leider nicht gesagt wie ich aus einem Vector die drei Werte für x,y,z zurückrechne. Ein Vector würde mir ja immer die absolute Position angeben. Wenn ich aber zum Beispiel nur die y Position kopieren will oder nur y und z, wie soll das mit einem Vector gehen?

"Rekursive Algorithmen" werde ich googeln. ;)
 
AW: letzter Skriptingversuch (Py4d)

Brauchste nicht googlen, für Dich erstmal uninteressant. :D
Nochmal zu self und init: Es gibt in Hochsprachen so ziemlich immer eine Initialisierung. Eine Variable wird initialisiert, wenn sie bspw. einen Anfangswert zugewiesen bekommt. Dies und weiteres wird in einem Initialisierungsblock zusammengefasst.

self: Gibt es nicht in jeder Sprache, aber in den meisten. Du solltest Dir übrigens nicht Python und Java-Lektüre zu Gemüte führen, sondern anfänglich Bücher über OOP und C++. Beide Sprachen bauen darauf auf. Daher wirst Du da auch am meisten lernen.
Py ist zwar nur eine Scriptsprache, aber die Konzepte sind dieselben.

Ich kann Dir nach nur einem Blick in die Dokumentation sagen, wie ich auf die 3 Vektoren getrennt zugreifen kann, ohne Python zu kennen. Das sollte Dir zu denken geben. :D

edit: Wenn Du mal auf den Parameter Vector (bei GetPoint()) klickst, kommst Du zur Typenbezeichnung von Vector. Da schau Dir mal die mysteriösen Parameter X,Y & Z an.
 
Zuletzt bearbeitet von einem Moderator:
AW: letzter Skriptingversuch (Py4d)

Das mit dem Vector gibt mir in der Tat zu denken.

Also so wie ich das jetzt verstehe müsste der Code für einen einzelenen Wert (z.B. X)

PointObject.GetPointS(Vector.x)

lauten, richtig?

Ich habe mittlerweile schon dieses OOP Tutorial gefunden und ich habe auch schon etwas mehr draüber in Erfahrung gebracht aber irgendwo in meinem Kopf is einfach ein fetter Balken der komplett schief liegt und alles versperrt. Ich weiß noch dass ich ähnlich mit mir zu kämpfen hatte, mit dem Input Prozedere in Java, da hab ich auch 1-2 Wochen dran gekaut aber nachdem der Groschen dann gefallen is kann ich sagen, das vergess ich nie mehr. Jetz muss der Groschen nurnoch bei diesem init und self fallen.
Sorry wenn ich mit meinem Unverständniss nerve.
 
AW: letzter Skriptingversuch (Py4d)

Hallo Kornyclown,

Ich habe vor ca. 2 Jahren das Skripten mit COFFEE angefangen und programmiere nun seit ca. 1 1/2 Jahren mit Python und seit geraumer Zeit in Java, C und C++. Mittlerweile gebe ich auch Privatunterricht für Python und die Py4D SDK. Für's Programmieren ist man nicht zu blöd, selbst ich konnte mir vor 3 Jahren nicht vorstellen wie überhaupt Programme geschrieben werden, und mittlerweile habe ich davon einen recht guten Einblick/Durchblick. Wenn du jetzt sagst "Oh nein, 3 Jahre?", dann lass dir sagen, dass ich bereits nach ein paar Monaten meine ersten Plugins in COFFEE erstellt habe (An dieser Stelle Danke an mp5gosu der mit damals geholfen hat mit Dialogen klar zukommen).

Als ich anfing mit Python anzufangen, hatte ich auch ersteinmal keinen Plan von der Sprache (wie du ja in dem von dir genannten Thread sehen kannst :P). Ich kann mich noch genau erinnern wie unverständlich die Py4D SDK für mich war, und dieses ganze doppel-Unterstrich Zeug hat mich ebenfalls vollkommen verwirrt. Auch bei meinem aktuellen Schüler hatte ich einige Zeit aufbringen müssen um es ihm zu erklären.
Nachdem ich den "Py4D - Anfängerfragen klären" Thread gestartet hatte und dieser zum erliegen gekommen ist, habe ich es auch ganz fix wieder aufgegeben mich mit Python zu beschäftigen. Nachdem mir aber aufgefallen ist, das Python eine stand-alone Programmier-/Skriptsprache ist (wie auch immer man es bezeichnen mag) wurde mein Interesse wieder geweckt. Ich habe ganze Nächte damit verbracht mir Python anzulernen, und dazu kann ich dir nur das empfehlen, dass ich damals bis Chapter 9 durchgearbeitet hatte.
Ich gebe zu, es ist eine recht dicke Lektüre, doch wenn dir Programmieren Spaß macht, wird es dir nicht langweilig werden weil du mit dem Python Interpreter whärend dem lesen die Beispiele direkt ausprobieren kannst!

Back 2 Topic: Ich werde vorerst auf deine Punkte aus dem ersten Post auffassen und dann den bisherigen Verlauf des Threads kommentieren.

1.
__init__
ist eine von Python's special methods die beim erstellen eines Objekts aufgerufen wird. Es ist equivalent zum Konstruktor in C++/Java was du ja vielleicht kennst. Eine weitere Spezial-method ist zum Beispiel __del__, welche aufgerufen wird wenn alle Referenzen zu dem Objekt verloren gegangen sind und es aus dem Speicher gelöscht wird. Weitere Informationen gibt es zum Beispiel .

2.
self
ist equivalent zu this in C++/Java. Es repräsentiert die Instanz einer Klasse innerhalb von Methoden dieser Klasse. Whärend this in C++ und Java ein fest vorgegebener Name in der Scope der Methode ist, ist die Namensgebung self in Python nur eine Konvention. Du kannst sie nennen wie du willst, ist aber schlechter Programmierstil. ;)

3.
Mit SetPoint liegst du schon garnicht so falsch! Die c4d.PointObject Klasse implementiert die Methoden GetPoint und SetPoint. Die Punkte werden nur als Vektoren dargestellt und haben keine Klasse für sich.
Ein Beispiel für den Skript Manager (vergiss nicht ein Polygon Objekt zu selektieren)

import c4d
point = op.GetPoint(0)
point = point + c4d.Vector(100, 100, -100)
op.SetPoint(0, point)
op.Message(c4d.MSG_UPDATE)
c4d.EventAdd()


@mp5gosu: Nicht in jeder Programmiersprache bezieht sich self auf die Instanz einer Klasse im jeweiligen Kontext, das ist eher Python spezifisch. :)
// Sehe gerade das hast du ja in deinem zweiten Posting erwähnt.

mp5gosu schrieb:
Auch wichtig bei rekursiven Algorithmen. [...] Brauchste nicht googlen, für Dich erstmal uninteressant.
biggrin.png
Verstehe nicht ganz was self mit rekursion zu tun hat. :D Aber damit haste recht, das sind fortgeschrittene Programmiertechnicken!

kornyclown schrieb:
in meiner Lektüre (Python und Java) auf den ersten 150 Seiten nicht einmal erwähnt wurden
So? Nun, ich kenne das Buch nicht, allerdings werden solche Sachen meistens nur erwähnt und sollten vom Lernenden so hingenommen werden, aber zumindest erklärt das self sich auf die Instanz einer Klasse bezieht wäre schon zu erwarten (natürlich Vorrausgesetzt in dem Buch sind Klassen bereits angesprochen worden).
Um zu Erklären warum Python den self parameter bei Methoden einer Klasse (und nicht wie Java und C++ das automatisch verfügbare this verwendet) erwartet müsste man um einiges tiefer in Python und ihre Semantiken eintauchen, aber das würde hier und wahrscheinlich in deinem Buch ersteinmal zu weit führen. ;)

kornyclown schrieb:
Es wird leider nicht gesagt wie ich aus einem Vector die drei Werte für x,y,z zurückrechne. Ein Vector würde mir ja immer die absolute Position angeben. Wenn ich aber zum Beispiel nur die y Position kopieren will oder nur y und z, wie soll das mit einem Vector gehen?
Ich verstehe leider nicht ganz was du meinst. Die Position eines Vektors (mathemathisch nicht ganz richtig, aber egal :P), wird durch den Vektor selbst bestimmt. Ob relative oder absolut hängt immer vom Zusammenhang ab. Wenn du den y-Wert eines Vektors erhalten willst, dann knöpfst du dir einfach das Attribut mit dem Name y vor.

import c4d
vector = c4d.Vector(100, 50, -40)
print vector.y

vector.y = 999
print vector.y


mp5gosu schrieb:
sondern anfänglich Bücher über OOP und C++.
Das würde ich nicht sagen. Python ist eine gute Programmiersprache für den Einstieg und auch im effektiven Development gefragt. C++ würde da erstmal verwirren.

kornyclown schrieb:
Also so wie ich das jetzt verstehe müsste der Code für einen einzelenen Wert (z.B. X)

PointObject.GetPointS(Vector.x)
Nein. Die Dokumentation besagt eindeutig dass ~.GetPointS() die selektierten Punkte zurückgibt. Damit ist aber keine Ansammlung von Vektoren gemeint. Der Rückgabewert ist eine c4d.BaseSelect instanz welche zum Auslesen der selektierten Punkte dient.

Btw, hast du dir die Python SDK schon vom plugincafe gedownloadet? Diese Py4D Documentation (von mp5gosu's link) ist veraltet aber leider immernoch auffindbar. Da sollte mal die neue hochgeladen werden! :rolleyes:

Ich hoffe das hat einige deiner Fragen beantwortet, und hoffentlich auch neue Fragen aufgeworfen (im positiven Sinne, versteht sich)! Viel Spaß noch beim lernen! Bei Fragen die direkt die Py4D SDK etwas angehen kannst du auch das besuchen!

Grüße,
Niklas

PS: Rechtschreibfehler lassen Grüßen!
 
Zuletzt bearbeitet:
AW: letzter Skriptingversuch (Py4d)

Das aktuelle SDK habe ich schon runtergeladen.

Nochmal zu init und self:

Es wird immer gesagt das die Methode __init__ aufgerufen wird wenn blablabla.
In dem oben verlinkten Tutorial aber ist das so dargestellt

class OurClass(object):
"""Class docstring."""

def __init__(self, arg1, arg2):
"""Method docstring."""
self.arg1 = arg1
self.arg2 = arg2

def printargs(self):
"""Method docstring."""
print self.arg1
print self.arg2

Hier wird __init__ doch ganz offensichtlich nicht aufgerufen sondern erzeugt, oder nich? Ich meine da steht doch ganz klar def __init__.....DEF __init__....?!
Was self betrifft, versteh ich das richtig:
Das self is also nur eine konventionierte Instanz der übergeordneten Klasse, sprich eine Variable auf die man sich geeinigt hat, die auf die Klasse verweist. Also könnte ich auch anstatt von self den Namen der Klasse eingeben?
 
AW: letzter Skriptingversuch (Py4d)

Na in dem Beispiel da oben wird es noch nicht aufgerufen. Die Methode wird erstellt und der Klasse zugewiesen, ja. Die Method wird erst dann aufgerufen wenn du ein Objekt erzeugst.

obj = OurClass('arg1', 'arg2')

Ja du könntest den Namen der Klasse eingeben, aber was hätte das fuer einen Sinn?

PS: Benutz bitte die CODE Tags für Code mit indentation, ansonsten macht eine Monospace Font das ganze auch ansehnlicher.
 
Zuletzt bearbeitet:
AW: letzter Skriptingversuch (Py4d)

Sorry wegen des Codes, ich werde drauf achten.
Aber wenn die __init__ Methode dort aufgerufen wird müsste es doch heißen:

Code:
obj = OurClass.__init__(arg1, arg2)
oder nich?

Also im Ganzen

Code:
class OurClass(object):    # die Klasse OurClass wird erzeugt

    def __init__(self, arg1, arg2)    # die Methode __init__ wird erzeugt
        self.arg1 = arg1    # keine Ahnung was hier passiert
        self.arg2 = arg2
    
    obj = OurClass.__init__(arg1, arg2)    #aus der Klasse OurClass wird die Methode __init__ aufgerufen
also so hätte ich es jetzt vestanden.
Bitte korrigieren
 
Zuletzt bearbeitet von einem Moderator:
AW: letzter Skriptingversuch (Py4d)

Das ist ja gerade was die Methode so Spezial macht. Die letzte Zeile ist Falsch. Ich fürchte du hast keine blassen Schimmer von OOP und was das eigentlich heißt, und unter anderem auch nicht wie man Danke sagt, weshalb ich dich hier erneut auf das weiterleite.

-N
 
AW: letzter Skriptingversuch (Py4d)

1. Find ich es nich in Ordnung dass ich nur weil ich Probleme mit diesem speziellen Teil von OOP habe, ich hingestellt werde als hätte ich von garnichts eine Ahnung. Wie gesagt beschäftige ich mich schon über ein Jahr damit und ich gebe mir sehr viel Mühe das zu verstehen.
2. Ich bin sehr dankbar für eure Hilfe und die Zeit die ihr euch nehmt aber zum Beispiel dieses Python Tutorial, da bin ich im Laufe des oben besagten Jahres auch schon drüber gestolpert aber schon auf den ersten Seiten wurde ich von einer Flut von Fragezeichen überrannt, dass ich davor zurückgeschreckt bin wie von einer heißen Herdplatte.

Als ich mit Python anfing, hab ich es mir runtergeladen, installiert habs gestartet und ein wunderschön intuitiver Editor hat sich geöffnet (Python IDE) und ich konnte einfach anfangen mit skripten parrallel zur Lektüre. Diese IDE war nach einer zwangsläufigen Neuinstallation weg, es öffnet sich nurnoch ein Fenster das aussieht wie die Windows Kommandozeile.
Auf einmal soll ich anfangen Path variablen zu setzen, den Interpreter mit irgendwelchen Eingaben zu starten und zu beenden. Es ist nich so, dass ich nich bereit wäre das zu lernen aber dort in diesem Tutorial wird einfach gesagt mach das, mach das ohne zu erklären was das überhaupt soll. Damals mit dieser IDE und der Lektüre (Python: Das umfassende Handbuch, Galileo Computing) habe ich nach nur wenigen Tagen schon mein erstes kleines Programm geschrieben, ohne Probleme. Jetzt, je mehr ich versuche zu lernen, umso mehr Bahnhof versteh ich und ich hab das Gefühl dass alles was ich damals gelernt hab falsch war, zumindest kann ich mit dem Wissen was ich von damals hab heute nichts mehr anfangen.

Sorry das ich mich jetz hier so ausgekotzt habe.
 
AW: letzter Skriptingversuch (Py4d)

1. Nun, so ist es aber. Wenn du nicht weisst wie man einen Würfel in C4D erstellt wird dir auch von jedem geraten in das Handbuch zu sehen. Denn das ist echt eine absolute Grundlage.
2.Ich schreib mir die Elle ausm Arm und das einzige was du sagen kannst ist "Ja hab ich gemacht, aber nochmal zu init und self"? Dazu auch noch die Aufforderung "Bitte Korrigieren" finde ich nicht ganz in Ordnung. Schließlich sieht mein Tagesablauf auch noch etwas anderes vor als deinen Aufforderungen nach zukommen.

Genug der bösen Worte. Tippe idle in die Windows commando-zeile ein und die IDLE öffnet sich wieder.

-N
 
AW: letzter Skriptingversuch (Py4d)

Ok, das "Bitte korrigieren" ist vielleicht auffordender rübergekommen als ich es eigentlich meinte, verzeihung.

Oh man jetzt nach langem Suchen konnte ich endlich das Verzeichniss finden wo sich idle Versteckt hat, danke für den Tipp.
Bin jetzt auch dabei nochmal die ganzen OOP Grundlagen durchzugehen aber das Python Tutorial, so wertvoll es auch sein mag, is mir zu hoch.

Danke trotzdem für die Mühen.

P.S. Also ich habe mir jetzt noch mal einige Sachen angesehen und befürchte dass ich mir gewaltig an den Kopf klatschen muss wenn das jetzt stimmt:
Könnte man nicht __init__ grob mit Startwert/Anfangswert übersetzen? So wie mir z.B. in C4D ein Würfel standartmäßig mit 200x200x200 erstellt wird? Also ist das was ich in diese __init__ Funktion reinschreibe quasi der Startwert von meinem Objekt und dieser wird dann durch Funktionen mehr oder weniger Modifiziert?
 
Zuletzt bearbeitet von einem Moderator:
AW: letzter Skriptingversuch (Py4d)

Ja sorry, wie gesagt, fetter Balken im Kopf. :kopfpatsch:
Hat etwas gedauert aber ich glaub jetz bin ich einen guten Schritt weiter gekommen, danke nochmal und sorry für die Unannehmlichkeiten.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
119.005
Beiträge
1.540.339
Mitglieder
23.166
Neuestes Mitglied
jinfol
Oben