""" Enneper´s Surface 18.02.2014 """ import c4d from c4d import gui from c4d import documents # Variablen und Konstanten dialog_title = 'Enneper´s Surface' uMin = -2.0 # Bereich u uMax = 2.0 # Bereich u vMin = -2.0 # Bereich v vMax = 2.0 # Bereich v Nu = 25 # Anzahl Punkte u Nv = 25 # Anzahl Punkte v Faktor = 25 # Skalierungsfaktor # Eingabedialog class MyDialogs(gui.GeDialog): res = False # Erzeugung des Layouts def CreateLayout(self): self.SetTitle(dialog_title) # Eingabe der Konstanten self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Bereich der Enneper Surface") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(90, 2) self.AddStaticText(2001, c4d.BFH_CENTER, 0, 0, 'u-Min', c4d.BORDER_NONE) self.AddEditNumber(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_CENTER, 0, 0, 'u-Max', c4d.BORDER_NONE) self.AddEditNumber(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_CENTER, 0, 0, 'v-Min', c4d.BORDER_NONE) self.AddEditNumber(1003, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2004, c4d.BFH_CENTER, 0, 0, 'v-Max', c4d.BORDER_NONE) self.AddEditNumber(1004, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Eingabe der Startwerte self.GroupBegin(2005, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2006, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte u', c4d.BORDER_NONE) self.AddEditNumberArrows(1005, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2007, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte v', c4d.BORDER_NONE) self.AddEditNumberArrows(1006, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2008, c4d.BFH_CENTER, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1007, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Dialog mit OK schließen self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL) return False # Werte übernehmen wenn Dialog geschlossen def AskClose(self): global umin, umax, vmin, vmax, Nu, Nv, Faktor uMin = self.GetFloat(1001) uMax = self.GetFloat(1002) vMin = self.GetFloat(1003) vMax = self.GetFloat(1004) Nu = self.GetLong(1005) Nv = self.GetLong(1006) Faktor = self.GetFloat(1007) return False # ????? def Command(self, id, msg): if id == 1:self.res = True if id == 1 or id == 2: self.Close() return True # Variablen im Eingabemenü setzen def InitValues(self): self.SetFloat(1001, uMin) self.SetFloat(1002, uMax) self.SetFloat(1003, vMin) self.SetFloat(1004, vMax) self.SetLong(1005, Nu, 1, 1000000000) self.SetLong(1006, Nv, 1, 1000000000) self.SetFloat(1007, Faktor) return True def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject((Nu+1)*(Nv+1), Nu*Nv) obj.SetName(dialog_title) # Variablen zz=0 # Zaehler # Segmentbreiten berechnen du=(uMax-uMin)/Nu dv=(vMax-vMin)/Nv # Punkte erzeugen for i in xrange(0,Nu+1): for j in xrange(0,Nv+1): # Berechnung der Parameter u=uMin+i*du v=vMin+j*dv # Berechnung der Koordinaten x= (u-(u*u*u/3.0)+u*v*v) y= (u*u-v*v) z= (v-(v*v*v/3.0)+u*u*v) # Punkt speichern obj.SetPoint(zz, c4d.Vector(x*Faktor,y*Faktor,z*Faktor)) # Zähler erhöhen zz=zz+1 # Polygone erzeugen zz=0 # Zähler zurücksetzen for j in xrange(0,Nv): for i in xrange(0,Nu): # Punkte für ein Quadrat definieren P1=i*(Nv+1)+j P2=i*(Nv+1)+j+1 P3=(i+1)*(Nv+1)+j+1 P4=(i+1)*(Nv+1)+j # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zähler erhöhen zz=zz+1 # obj.Message(c4d.MSG_UPDATE) return obj def main(): dlg = MyDialogs() dlg.Open(c4d.DLG_TYPE_MODAL) if dlg.res: plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) c4d.EventAdd() if __name__=='__main__': main()