Antworten auf deine Fragen:
Neues Thema erstellen

Py4D Austauschthread

nux95

Developer, C4D Betatester

So, da Py4D so langsam im kommen ist, dacht ich mir so'n Sammelthread wäre nicht so schlecht. :) Das ganze sollte sich so ähnlich wie ein FAQ zusammentragen, von verschiedenen Usern.

Ich eröffne den Thread für folgende Angelegenheiten:

+ Fragen zu Py4D die (hoffentlich) beantwortet werden können
+ veröffentlichung von Beispielen zu Python Skripten
+ posten von Tuts
+ etc.

Einige scheuen sich vielleicht extra einen Thread für ihre Fragen zu einem Problem usw. zu eröffnen, die können hier aber gerne ihr Problem stellen.
:)

Ich werde diesen ersten Post immerwieder aktualisieren und mit einem Inhaltsverzeichnisses des Threads versehen.


Ich hätte da gleich mal was für die Python Anfänger. Ein simples Klonobjekt erstellt mit dem Python Generator. Der Code ist auf englisch kommentiert und dürfte deswegen auch von Neueinsteigern leicht zu verstehen sein.


Download der Datei hier:


Ausserdem noch einen Python Generator der Gravitation für TP simuliert, unkommentiert. Nichts für komplette Neueinsteiger .
:p

Download der Datei hier:




Inhaltsverzeichnis:

Fragen + Antworten:

E
Erweitern von Py4D mit Third Party Packages |
S
, Antwort folgt

Tutorials:

Beispieldateien & Skripts:
K

kommentiert, für Anfänger geeignet
O

T

- Thinking Particles:
unkommentiert
P
- Plugins



Funktionen
O
Alle selektierten Objekte ausgeben
K


[/SIZE]
 
Zuletzt bearbeitet:

nux95

Developer, C4D Betatester

Objekt intern konvertieren | MakeEditable(op)

Eine Funktion um ein Objekt intern zu konvertieren:

Code:
def MakeEditable(op):
    import c4d
    if (not op) | op.CheckType(c4d.Opolygon) | op.CheckType(c4d.Ospline): return op

    op = [op.Get*****()]
    doc = c4d.documents.BaseDocument()
    doc.InsertObject(op[0],None,None)
    op = c4d.utils.SendModelingCommand(
                              command = c4d.MCOMMAND_MAKEEDITABLE,
                              list = op,
                              doc = doc )
    return op[0]
Bitte beachten, dass PSD-Tutorials das Wort C.lone (ohne Punkt) zensiert, deshalb die Sterne im Code. "*****" also durch "C.lone" (ohne Punkt) ersetzen

Cheers, nux
 
Zuletzt bearbeitet:

nux95

Developer, C4D Betatester

Alle selektierten Objekte | GetActiveObjects(doc)

Eine Funktion, bzw 2, die eine benötigt die andere, welche alle selektierten Objekte einer Szene in eine list packt.

Code:
def GetHNext(op):
    if not op: return
    if op.GetDown(): return op.GetDown()
    while not op.GetNext() and op.GetUp():
        op = op.GetUp()
    return op.GetNext()

def GetActiveObjects(doc):
    import c4d
    lst = list()
    op = doc.GetFirstObject()
    while op:
        if op.GetBit(c4d.BIT_ACTIVE) == True: lst.append(op)
        op = GetHNext(op)
    return lst
cheers, nux
 
Zuletzt bearbeitet:

MadMad

... can't stand still

AW: Py4D Austauschthread


Ich eröffne den Thread für folgende Angelegenheiten:

+ Fragen zu Py4D die (hoffentlich) beantwortet werden können


Dann will ich mich auch mal in Form einer Frage beteiligen :D
Wie bekomme ich eigentlich neue Packages ins Python integriert(welche sich später via import ansprechen lassen)?

Das Python von Cinema scheint ja völlig unabhängig von einer eventuell vorhandenen installierten Version zu sein. Normalerweise stelle ich für meine installierte Version ein package zur Verfügung indem ich es installiere(z.B. via python setup.py install). Wie mache ich das für die C4D-Version?

Eine zweite Frage: Gibt es sowas wie ein Respository für die C4D-Python Version ala CPAN für Perl?

Habe zu beiden Fragen in der Hilfe nichts gefunden...
 

NT2005

Von dannen.

AW: Py4D Austauschthread

Hallo MadMad,

Wie bekomme ich eigentlich neue Packages ins Python integriert(welche sich später via import ansprechen lassen)?

Gar nicht. Die Python-Version, welche in Cinema 4D Standardmäßig ist, kann man nicht selbst aktualisiert/erweitern. Nur vom Entwickler von Py4D (Stefan). Sie ist unabhängig von der jeweiligen Python-Version auf dem Rechner.

Gibt es sowas wie ein Respository für die C4D-Python Version ala CPAN für Perl?
Nein, das musst du dir selber zusammen suchen. ;)
 

MadMad

... can't stand still

AW: Py4D Austauschthread

Hi nt2005,

Gar nicht. Die Python-Version, welche in Cinema 4D Standardmäßig ist, kann man nicht selbst aktualisiert/erweitern. Nur vom Entwickler von Py4D (Stefan). Sie ist unabhängig von der jeweiligen Python-Version auf dem Rechner.
/QUOTE]

Das hatt ich mir schon gedacht :D

Nein, das musst du dir selber zusammen suchen. ;)

Yep, die einzig sinnvolle Referenz. Danke dafür.
 

nux95

Developer, C4D Betatester

AW: Py4D Austauschthread

Hallo NT2005,

laut Sebastian Rath ist Py4D erweiterbar. Ich warte noch auf seine Antwort in der er mir hoffentlich erklärt wie genau das funktioniert.

Soviel weiss ich zumindest schon:
donelgreeko auf cgsociety.org (Sebastian Rath) schrieb:
Ja, das ist möglich. Schau dir entsprechende Tutorials für Python an.
Die erzeugten Packages kannst du dann unter "$userpath/library/python/packages" einfügen.

NT2005 schrieb:
Nur vom Entwickler von Py4D (Stefan)
Einer von uns beiden ist da falsch informiert, oder nur nicht komplett :lol:

lg nux
 
Zuletzt bearbeitet:

NT2005

Von dannen.

AW: Py4D Austauschthread

Hallo Niklas,

Oh, du hast recht. Mein Fehler, ich bin von der Python-Version ausgegangen.
Und um welches Package würdest du am liebsten erweitern? :uhm: Kenne mich da nicht so gut aus....

Jetzt hau ich auch noch den Namen durch einander von den Entwicklern (VRay und Py4D).
 

nux95

Developer, C4D Betatester

AW: Py4D Austauschthread

//edit: Nochmal gescheit, als quasi Tutorial:

Zu allerersteinmal muss man Python auf dem System installiert haben. Wenn nicht vorhanden: http://www.python.org/getit/

Packages kann man zum Beispiel hier runterladen: http://pypi.python.org/pypi?:action=browse

Als Beispiel nehme ich das pyfo - Package, welches es erleichtert XML Dateien zu erstellen.
Downloaden kann man es hier: http://pypi.python.org/pypi/pyfo/0.6
Wir benötigen die Source, nicht das Python Egg.

Nach dem Download entpacken wir das Archiv direkt auf die Festplatte, das wir per Konsole darauf zugreifen müssen und wir keinen ewig langen Pfadnamen eingeben wollen.
In meinem Fall "C:\tmp\pyfo-0.6\"

Jedes System hat eine Kommandozeile (Windows Konsole, Unix Terminal, etc)
Dort müssen wir ersteinmal in das Archiv von pyfo wechseln. Unter Windows geht das mit cd, wie es bei Mac etc ist weiss ich nicht.

cd C:\tmp\pyfo-0.6\

danach müssen wir nurnoch die setup.py "bauen"

python setup.py build

Wenn das builden erfolgreich war, schauen wir in den Ordner von pyfo. Dort ist ein neuer Ordner entstanden mit dem Namen "build".
In diesem befindet sich wieder ein neuer Ordner genannt "lib". Alles was sich nun in diesem Ordner befindet, kopieren wir genau so in folgenden Ordner:

$Userpath\Maxon\Cinema 4D R12\library\python\packages\$mysis

Wobei $Userpath bei mir auf Windows 7 für

C:\Benutzer\nux\App Data\Roaming\

steht.

Nun können wir das Package schon in Cinema 4D verwenden.
Wenn es sich um ein C-Package handelt, muss man es entsprechend kompilieren. Habe ich aber ehrlich gesagt noch nicht ausprobiert. ;)

lg nux
 
Zuletzt bearbeitet:
N

neosun

Guest

AW: Py4D Austauschthread

Hi, erstmal danke für die Beispiele,

ich hab das Gefühl an den Befehl "convert selection" komm ich mit
SendModelingCommand nicht ran? Finde zumindest auch keine
Parameter/ID's mit denen man die Einstellungen übermitteln könnte.

müsste eigentlich gehen.. in coffee ist es anscheinend machbar

ein Auszug und hier die Quelle
Code:
 var bc = new(BaseContainer);
  bc->SetData(MDATA_CONVERTSELECTION_LEFT, 0);
  bc->SetData(MDATA_CONVERTSELECTION_RIGHT, 1);
 
  SendModelingCommand(
Python will aber die Settings, also die Einstellungen für dieses Fenster
nur per IDs geladen bekommen, wie im Beispiel aus der aktuellen
Python (C4DSDK)
Code:
settings[2033] = 50

Gruß,
Paul
 
Zuletzt bearbeitet von einem Moderator:

nux95

Developer, C4D Betatester

AW: Py4D Austauschthread

Oh man, sorry das ich das erst so spät sehe !

Ich hoffe das hilft dir weiter:

Code:
import  c4d
from    c4d.utils       import SendModelingCommand      as SMC

CONVERT_POINTS, CONVERT_EDGES, CONVERT_EDGES, CONVERT_CURRENT   = 0, 1, 2, 3

def main():
    bc      = c4d.BaseContainer()
    bc[c4d.MDATA_CONVERTSELECTION_LEFT]     = CONVERT_CURRENT
    bc[c4d.MDATA_CONVERTSELECTION_RIGHT]    = CONVERT_POINTS
    bc[c4d.MDATA_CONVERTSELECTION_TOLERANT] = True

    SMC(c4d.MCOMMAND_CONVERTSELECTION, [op], c4d.MODIFY_ALL, bc, doc)

main()
Cheers,
Niklas
 

nux95

Developer, C4D Betatester

TagData - Plugin Example, Demonstriert Message-Methode

Ein voll funktionsfähiges TagPlugin. Es demonstriert den gebrauch der Message-Methode und von Descriptionfiles.
 
Zuletzt bearbeitet:

nux95

Developer, C4D Betatester

Objekt ID aufspüren

Ein Skript um die ID eines Objektes zu finden. Die sind ja manchmal nirgends zu finden.

PHP:
import  c4d
from    c4d         import CopyStringToClipboard
from    c4d.gui     import MessageDialog

def main():
    if op is None:
        return

    id    = op.GetType()

    for k, v in c4d.__dict__.iteritems():
        if v == id:
            result = MessageDialog(
                "The ID for '%s' is:\n\nc4d.%s\n\nCopy to Clipboard ?" % (op.GetTypeName(), k),
                c4d.GEMB_YESNO
            )

            if result == c4d.GEMB_R_YES:
                CopyStringToClipboard("c4d." + k)

            return True

    MessageDialog( "The ID for this Object is not defined in the c4d-module." )

main()
Lässt sich natürlich für Tags, etc erweitern.
 
N

neosun

Guest

AW: Py4D Austauschthread

Oh man, sorry das ich das erst so spät sehe !
Ich hoffe das hilft dir weiter:
Spitze, funktioniert, danke! Kein Problem, besser spät als nie. :rolleyes:
Da war ich mit meinen Ansätzen irgendwo auf dem Holzweg,
sieht bei dir gleich viel logischer aus.

Gruß,
Paul
 
Zuletzt bearbeitet von einem Moderator:

Cyres90

Noch nicht viel geschrieben

AW: Py4D Austauschthread

Wie kann ich ein Skript warten lassen, bis ich im Viewport einen Klick ausführe?
Und wie lese ich dann die Koordinaten des Klicks aus?

Es geht darum, dass ich ein Objekt an dem Punkt erstellen möchte, wo ich hinklicke.

Der nächste Schritt wäre dann zu überprüfen, ob an der position eine Fläche ist, sodass sich die Objektachse auf der Fläche befindet.

Hoffe auf hilfe ;)
 
Zuletzt bearbeitet:

nux95

Developer, C4D Betatester

AW: Py4D Austauschthread

Ein Skript ist dafür nicht gut geeignet. Ein ToolData Plugin wäre der bessere Weg. :)
Wenn du allerdings trotzdem unbedingt ein Skript verwenden willst, muss es mindestens ein CommandData Plugin sein. Denn um ein Skript warten zu lassen und whärenddessen noch etwas anderes im ausfuehrenden Programm machen zu koennen benötigt man einen Thread. Das starten von Threads ist im C4D Scriptmanager aber leider nicht möglich.
Ich bin mir allerdings unsicher, ob man ausserhalb eines ToolData Plugins einen klick im Editor feststellen kann.
Zum ermitteln der Position auf dem Objekt kannst du die GeRayCollider Klasse verwenden.

Wenn ich später an meinem Pc bin kann ich noch genaueres sagen.

Grüße,
Niklas
 
M

mp5gosu

Guest

AW: Py4D Austauschthread

Das Skript muss nicht warten, denk ich mal. hast Du sowas ähnliches vor wie AutoGrid-Funktion in Max? Wenn ja->Snapping nutzen.
 

nux95

Developer, C4D Betatester

AW: Py4D Austauschthread

Er will doch sein eigenes Skript schreiben, nicht ein vorhandenes Tool probieren. Natürlich nur zu Übungszwecken sinnvoll. ;-)

Ich denke er meint soetwas wie
 
Zuletzt bearbeitet:

Cyres90

Noch nicht viel geschrieben

AW: Py4D Austauschthread

Erstmal danke für die Antworten, ich hatte die letzten Tage leider kein Internet und konnte deshalb nicht den Topic weiterhin verfolgen.

Was genau ist denn ein Tool-Data-Plugin?

Es gibt ja die Möglichkeit, per Input die Mausposition rauszufinden, an der der Benutzer geklickt hat. Gibt es keine Möglichkeit, nachdem das Script gestartet wurde, eine Abfrage zu machen, ob ein Mausklick getätigt wurde, und wenn ja, an welcher Position dies geschah?

Edit: Ich habe in der Documentation in Python die Tooldata gefunden, jetzt ist die sache, wie genau wende ich das an? Hat dafür wer Beispiele?


Cheers
Cyres
 
Zuletzt bearbeitet:
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
118.612
Beiträge
1.538.343
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben