Nicht mehr ganz neu hier
Hallo an Alle
In Sachen Pythonprogrammierung bin ich absulter Anfänger, darum ist es für mich unverstänlich wie ich C4D dazu veranlassen kann mein Script nur einmal auf zurufen.
Aber von ganz vorne, worum es eigentlich geht.
Ich habe vor mir eine 3D-Datenbank auf zubauen für Legostein. Ja ich weis es gibt genügend Legoprogramme die auch sehr Gut sind in ihre Arbeit. Aber nicht jedes Programm hat alle Legoteile. Ich habe mir immer so geholfen, die Teile die ich brauche habe ich aus den jeweiligen Legoprogramm exportiert und dann in C4D eingefügt, damit ich das Modell dann bauen konnte. Das hat mich mit der Zeit ziemlich genervt. Ich habe mir überlegt ob ich vielleicht die 3D-Daten aus machnen Legoprogramme verwenden kann um so die Steine zu bekommen. Leider war das ein Schuss in den Ofen. Die Legoprogramme behandeln die 3D-Daten anderes als C4D. Also habe ich weider überlegt wie ich an die 3D-Daten rankomme. Habe mir als mal einen Stein in C4D geholt um nach zu schauen wie Maxon die Daten behandelt. Irgend wann ist mir eingefallen das ja C4D die Punkt-Daten, sowie die Polygon-Daten als Text-Datei abspeichern kann. Also brauche ich ja nur eine Routine um die Text-Datei wieder einzulesen. Also habe ich mich im Netzt schlau gemacht wie ich das unter Python machen kann. Habe nach langen Suchen dann eine Routine entdeckt.
so sieht sie aus. Ich habe Sie noch ein wenig angepasst.
(Formatierung ist nicht korrekt)
Jetzt habe ich aber das Problem, wenn ich den Python Genarator verwende, das er nach einer gewissen Zeit immer wieder einen Legostein erzeugt. Was muss ich machen, damit er das nur einmal macht.
Wie man einen Plug-In programmiert weis ich leider auch nicht. Das muss ich mir erst noch an eignen.
Habe aber noch mehr Fragen:
Gibt es ein Gutes Buch über Python in C4D. Mit der Python SDK HTML 2014 komme ich nicht ganz zu recht. Es wird zwar jeder Befehl aufgelistet, aber es fehlen für mich immer ein paar Beispiele wie man so ein Befehl anwendet.
Noch eine Frage.
Kann man den Code etwas kürzen, oder anders ausgedrückt effizienter gestalten.
So das war es erst mal. Hoffe ihr könnt mir ein paar Tipps zu kommen lassen
Gruss Drachen
In Sachen Pythonprogrammierung bin ich absulter Anfänger, darum ist es für mich unverstänlich wie ich C4D dazu veranlassen kann mein Script nur einmal auf zurufen.
Aber von ganz vorne, worum es eigentlich geht.
Ich habe vor mir eine 3D-Datenbank auf zubauen für Legostein. Ja ich weis es gibt genügend Legoprogramme die auch sehr Gut sind in ihre Arbeit. Aber nicht jedes Programm hat alle Legoteile. Ich habe mir immer so geholfen, die Teile die ich brauche habe ich aus den jeweiligen Legoprogramm exportiert und dann in C4D eingefügt, damit ich das Modell dann bauen konnte. Das hat mich mit der Zeit ziemlich genervt. Ich habe mir überlegt ob ich vielleicht die 3D-Daten aus machnen Legoprogramme verwenden kann um so die Steine zu bekommen. Leider war das ein Schuss in den Ofen. Die Legoprogramme behandeln die 3D-Daten anderes als C4D. Also habe ich weider überlegt wie ich an die 3D-Daten rankomme. Habe mir als mal einen Stein in C4D geholt um nach zu schauen wie Maxon die Daten behandelt. Irgend wann ist mir eingefallen das ja C4D die Punkt-Daten, sowie die Polygon-Daten als Text-Datei abspeichern kann. Also brauche ich ja nur eine Routine um die Text-Datei wieder einzulesen. Also habe ich mich im Netzt schlau gemacht wie ich das unter Python machen kann. Habe nach langen Suchen dann eine Routine entdeckt.
so sieht sie aus. Ich habe Sie noch ein wenig angepasst.
Code:
import c4d
#Welcome to the world of Python
#
# lese eine Ascii-File und erzeuge ein Objekt
#
def main():
legoNamen = "Brick 1x1"
FehlerDaten = "Leider konnte ich den Legostein nicht konstruieren, \nda mir die Datei mit den Daten fehlen!"
pointFile = "d:\Temp\Test\Brick1x1_Punkte.txt"
polysFile = "d:\Temp\Test\Brick1x1_Polygone.txt"
try:
fpoints = open(pointFile)
fpolys = open(polysFile)
except IOError:
c4d.gui.MessageDialog(FehlerDaten)
return
#teile die Datei in eine Linen-Liste
lines = fpoints.readlines()
linesPolys = fpolys.readlines()
#wieviele Linien? pro Punkt und Polygone
nrPoints = len(lines)
nrPolys = len(linesPolys)
#-1 for erste Linie
print "Nr. points-polys: ", nrPoints-1, nrPolys-1
#erzeuge eine Polygon Objekt mit Punktezähler der Linien
rebrick = c4d.BaseObject(c4d.Opolygon)
rebrick.ResizeObject(nrPoints-1, nrPolys-1)
#Punkte
for i, line in enumerate(lines):
#teile die Linien in Komponente
coord = line.split(",")
#ignoriere korrupte csv Linie
if len(coord)<4 : continue
try:
nr = int(coord[0])
x = float(coord[1])
y = float(coord[2])
z = float(coord[3])
except ValueError:
continue
rebrick.SetPoint(i-1,c4d.Vector(x,y,z))
print "Punkt eingefügt: ", i-1,x,y,z
#Polygone
for i, line in enumerate (linesPolys):
#teile die Linien in Komponente
coord = line.split(",")
#ignoriere korrupte csv Linie
if len(coord)<4 : continue
try:
nr = int(coord[0])
p1 = int(coord[1])
p2 = int(coord[2])
p3 = int(coord[3])
except ValueError:
continue
rebrick.SetPolygon(nr,c4d.CPolygon(p1,p2,p3))
print "Polygon eingefügt: ", nr,p1, p2, p3
doc.InsertObject(rebrick)
rebrick.Message (c4d.MSG_UPDATE)
c4d.EventAdd()
if __name__=='__main__':
main()
(Formatierung ist nicht korrekt)
Jetzt habe ich aber das Problem, wenn ich den Python Genarator verwende, das er nach einer gewissen Zeit immer wieder einen Legostein erzeugt. Was muss ich machen, damit er das nur einmal macht.
Wie man einen Plug-In programmiert weis ich leider auch nicht. Das muss ich mir erst noch an eignen.
Habe aber noch mehr Fragen:
Gibt es ein Gutes Buch über Python in C4D. Mit der Python SDK HTML 2014 komme ich nicht ganz zu recht. Es wird zwar jeder Befehl aufgelistet, aber es fehlen für mich immer ein paar Beispiele wie man so ein Befehl anwendet.
Noch eine Frage.
Kann man den Code etwas kürzen, oder anders ausgedrückt effizienter gestalten.
So das war es erst mal. Hoffe ihr könnt mir ein paar Tipps zu kommen lassen
Gruss Drachen
Zuletzt bearbeitet: