""" Kidney Surface 18.02.2014 """ import c4d import math from c4d import gui from c4d import documents # Variablen und Konstanten dialog_title = 'Kidney Surface' 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 Startwerte self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2001, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte u', c4d.BORDER_NONE) self.AddEditNumberArrows(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte v', c4d.BORDER_NONE) self.AddEditNumberArrows(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_CENTER, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1003, 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 Nu, Nv, Faktor Nu = self.GetLong(1001) Nv = self.GetLong(1002) Faktor = self.GetFloat(1003) 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.SetLong(1001, Nu, 1, 1000000000) self.SetLong(1002, Nv, 1, 1000000000) self.SetFloat(1003, Faktor) return True def CreatePolygonObject(): # Variablen uMin = 0.0 # Bereich u uMax = 2 * math.pi # Bereich u vMin = -math.pi/2 # Bereich v vMax = math.pi/2 # Bereich v zz=0 # Zaehler # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(Nu*(Nv-1)+2, Nu*Nv) obj.SetName(dialog_title) # Segmentbreiten berechnen du=(uMax-uMin)/Nu dv=(vMax-vMin)/Nv # Punkte erzeugen for i in xrange(0,Nu): for j in xrange(1,Nv): # Berechnung der Parameter u=uMin+i*du v=vMin+j*dv # Berechnung der Koordinaten x=math.cos(u)*(3*math.cos(v)-math.cos(3*v)); y=3*math.sin(v)-math.sin(3*v); z=math.sin(u)*(3*math.cos(v)-math.cos(3*v)); # Punkt speichern obj.SetPoint(zz, c4d.Vector(x*Faktor,y*Faktor,z*Faktor)) # Zähler erhöhen zz=zz+1 # Nordpol setzen obj.SetPoint(zz, c4d.Vector(0,4*Faktor,0)) zz=zz+1 # Südpol setzen obj.SetPoint(zz, c4d.Vector(0,-4*Faktor,0)) zz=zz+1 # Polygone erzeugen zz=0 # Zähler zurücksetzen for j in xrange(0,Nv-2): for i in xrange(0,Nu-1): # 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 # Längsnaht schließen for j in xrange(0,Nv-2): # Punkte für ein Quadrat definieren P1=j P2=j+1 P4=(Nv-1)*(Nu-1)+j P3=(Nv-1)*(Nu-1)+j+1 # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P4,P3,P2,P1)) # Zähler erhöhen zz=zz+1 # Südpol schliessen (Dreiecke setzen) for i in xrange(0,Nu-1): # Punkte für ein Dreieck definieren P1=Nu*(Nv-1)+1 P2=i*(Nv-1) P3=(i+1)*(Nv-1) # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P3)) # Zähler erhöhen zz=zz+1; # Letztes Dreieck (Südpol) setzen # Punkte für ein Dreieck definieren P1=Nu*(Nv-1)+1; P2=0; P3=(Nu-1)*(Nv-1); # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P3,P2,P1,P1)) # Zähler erhöhen zz=zz+1; # Nordpol schliessen (Dreiecke setzen) for i in xrange(0,Nu-1): # Punkte für ein Dreieck definieren P1=Nu*(Nv-1) P2=(i+1)*(Nv-1)-1 P3=(i+2)*(Nv-1)-1 # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P3,P2,P1,P1)) # Zähler erhöhen zz=zz+1; # Letztes Dreieck (Nordpol) setzen # Punkte für ein Dreieck definieren P1=Nu*(Nv-1) P2=Nv-2 P3=Nu*(Nv-1)-1 # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P3)) # 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) doc.SetActiveObject(plyobj) c4d.EventAdd() if __name__=='__main__': main()