Antworten auf deine Fragen:
Neues Thema erstellen

[R15] - Python Script wird laufend aufgerufen

Drachen

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.

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:

Was du geschrieben hast muss in den Skript Manager. Wenn du den "Lego Stein" als virtuelles Objekt vom Python Generator erstellen willst, musst du es von der main() funktion zurückgeben.

Code:
def main():
    ...
    return rebrick

  • kein c4d.Eventadd()
  • kein doc.InsertObject()
  • kein if __name__ == "__main__":
 
Hi nu95
Vielen Dank für deinen Hinweis.
Werde meine Routine jetzt als Script ausbilden.

Gruss Drachen
 
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

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.867
Beiträge
1.539.637
Mitglieder
67.864
Neuestes Mitglied
Ramar_50_
Oben