Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by freecad-heini-1 »

Bitte seid so nett und führt folgenden Benchmark aus.

1. In Partdesign ein Quadrat zeichnen, 303x303mm, nach links unten um jeweils 3mm verschoben.
quadrat303mm.png
quadrat303mm.png (9.23 KiB) Viewed 2891 times
2. Skizze aufpolstern um 5mm
5mm-dick.png
5mm-dick.png (8.57 KiB) Viewed 2891 times
3. Zylinder platzieren auf x0, y0, z-3mm. Radius 1mm, Höhe 10mm
zylinder.png
zylinder.png (34.85 KiB) Viewed 2891 times
4. In die Draft-Workbench wechseln und das Array-Tool wählen.
Abstand in x=3mm, in y=3mm,
array.png
array.png (53.11 KiB) Viewed 2891 times
5. Number x und Number y auf je 100 setzen:
10000-array.png
10000-array.png (371.19 KiB) Viewed 2891 times
6. Zum Schluss in die Partworkbench wechseln, das Pad wählen und den Array per boolscher Operationen abziehen.

Das dauert ... und leider arbeitet nur ein Kern. Immerhin entstehen so 10.000 Bohrungen in der Platte.

Welche Möglichkeit gibt es diese Rechenoperation der boolschen Operation zu beschleunigen?
Gibt es die Möglichkeit mehrere Kerne zu aktivieren?
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by freecad-heini-1 »

Mein Freecad stürzte nach etwa 1/2 Stunde ab. D.h. die boolsche Operation wurde nicht durchgeführt.
User avatar
r-frank
Veteran
Posts: 2180
Joined: Thu Jan 24, 2013 6:26 pm
Location: Möckmühl, Germany
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by r-frank »

freecad-heini-1 wrote:Mein Freecad stürzte nach etwa 1/2 Stunde ab. D.h. die boolsche Operation wurde nicht durchgeführt.
Uff, ich dachte schon ich mach was falsch ...

Meine Erfahrungen/Überlegungen:

1.) In dem Array Fuse auf "True" stellen, dann wird der Array als ganzes Objekt und nicht jeder einzelne Zylinder abgezogen.
Nach 6 Minuten hab ich die Fuse-Operation abgebrochen ...

2.) in das Pad ein Pocket einbringen und per MultiTransform dann die Pocket mustern.
Horizontales 100er-Muster ging noch, bei dem vertikalen Muster war dann Ende Gelände ...

3.) in der Skizze das Rectangular Array auf den Kreis anwenden.
Geht aber nur bis maximal 99 Kopien :-(

Somit hatte ich auch bisher keinen Erfolg ...
freecad-heini-1 wrote:Gibt es die Möglichkeit mehrere Kerne zu aktivieren?
Nein, soweit ich weiß nicht, aber mir ist ein fieser Hack von DEEPSOIC eingefallen.
Hab ihn bisher nicht im englischen Forum wiedergefunden, daher hier in deutsch:

- FreeCAD ist darauf "fixiert" das aktuelle Dokument bei jeder Änderung einem Recompute zu unterziehen
- das führt hier dazu, daß man bei der Definition des Arrays Fusspilz vom Warten bekommt ...
- Tipp von DEEPSOIC: ein leeres Dokument erstellen und das aktiv machen.
- in der Baumansicht sieht man ja die Bäume beider Dokumente
- jetzt kann man auf den Array klicken und in Echtzeit alle Parameter ändern
- erst wenn man dann das Dokument mit dem Array aktiviert wird das Dokument aktualisiert per recompute ...

Roland
Deutsche FreeCAD Tutorials auf Youtube
My GrabCAD FreeCAD-Projects
FreeCAD lessons for beginners in english

Native german speaker - so apologies for my english, no offense intended :)
ulrich1a
Veteran
Posts: 1957
Joined: Sun Jul 07, 2013 12:08 pm

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by ulrich1a »

Ich warte gerade noch. Ein ähnliches Objekt ging in 2 Minuten. Leider hatte ich vergessen auf Solid zu stellen. Warte jetzt gerade.

Der Ansatz ohne boolsche Operation ist nur die 2D-Elemente zu erstellen:
Skizze mit dem Rechteck.
Kreis aus der Part-Workbench.
Die Kreise mit dem Draft-Array vervielfältigen.
Alles fusionieren.
Dann mit Part Extrudieren.

Lochplatte wurde nach 22 Minuten erzeugt.
Es ist bekannt, dass diese gelochten Bauteile sehr lange in der Generierung der Bildschirmdarstellung brauchen. Wenn man so ein Teil per Skript erstellt, brauchts nur einen Bruchteil für die Erstellung der Geometrie, den Rest für die Bildschirmdarstellung.

Die Datei ist 2,8 MByte groß. Also hier nur das Bild.

Ulrich

OS: Debian GNU/Linux 8.5 (jessie)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.17.8003 (Git)
Build type: Release
Branch: (losgelöst von 62cb403)
Hash: 99bdef75867e0dd84c374721396d3a0191324055
Python version: 2.7.9
Qt version: 4.8.6
Coin version: 4.0.0a
OCC version: 6.8.0.oce-0.17
Attachments
Lochplatte.png
Lochplatte.png (198.5 KiB) Viewed 2870 times
User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by microelly2 »

Ich hab mal einen Skript laufen lassen

EDIT ich muss alles nochmal zurücknehmen, mein Skript war schon am Ende der Platte und da ging das Löchern natürlich schnell :oops:
hier zweiter Versuch

Code: Select all



def run(count):
	b=App.ActiveDocument.addObject("Part::Box","Box")
	b.Length=100000
	b.Width=100

	c=App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
	c.Height=30

	s=c.Shape
	ss=[]
	for i in range(count):
		s=c.Shape.copy()
		s.Placement.Base.x=5*i
		#Part.show(s)
		ss.append(s)

	comp=Part.Compound(ss)
	Part.show(comp)

	#t=b.Shape.fuse(comp)
	#Part.show(t)

	t=b.Shape.cut(comp)
	Part.show(t)


import cProfile

cProfile.run("run(500)")

Die Rechenzeit wächst quadratisch mit den Löchern, was ja nach der Theorie auch stimmt.

Wären von 1000 auf 10000 ein Sprung von 70 auf 70 *10^2 = 7000 s =2 Stunden
Aber ich sehe auch das Problem des Arbeitsspeichers, ich war da schon auf 80%,
nach dem Berechnen geht er wieder runder,
ich habe das auch schon bei meinen Punktwolken beobachtet, es scheint als ob man FreeCAd hin und wieder ein Päuschen geben muss,
damit es aufräumen kann.

Werde mal die andere Method e analysieren: Sketch generieren und hochziehen

Code: Select all


>>> cProfile.run("run(500)")
        1009function callsin 17.993 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.017   0.017  17.993  17.993<input>:1(run)
        1   0.000   0.000  17.993  17.993<string>:1(<module>)
        2   4.608   2.304   4.608   2.304{built-in method show}
        2   0.003   0.001   0.003   0.001{method 'addObject' of 'App.Document' objects}
      500   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
      500   0.029   0.000   0.029   0.000{method 'copy' of 'Part.Shape' objects}
        1  13.337  13.337  13.337  13.337{method 'cut' of 'Part.Shape' objects}
        1   0.000   0.000   0.000   0.000{method 'disable' of '_lsprof.Profiler' objects}
        1   0.000   0.000   0.000   0.000{range}


>>> 

>>> cProfile.run("run(1000)")
        2009function callsin 70.294 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.022   0.022  70.294  70.294<input>:1(run)
        1   0.000   0.000  70.294  70.294<string>:1(<module>)
        2  16.221   8.111  16.221   8.111{built-in method show}
        2   0.003   0.001   0.003   0.001{method 'addObject' of 'App.Document' objects}
     1000   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
     1000   0.060   0.000   0.060   0.000{method 'copy' of 'Part.Shape' objects}
        1  53.987  53.987  53.987  53.987{method 'cut' of 'Part.Shape' objects}
        1   0.000   0.000   0.000   0.000{method 'disable' of '_lsprof.Profiler' objects}
        1   0.000   0.000   0.000   0.000{range}


>>> 

>>> cProfile.run("run(2000)")
        4009function callsin 376.833 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.032   0.032 376.833 376.833<input>:1(run)
        1   0.001   0.001 376.833 376.833<string>:1(<module>)
        2 134.917  67.458 134.917  67.458{built-in method show}
        2   0.003   0.001   0.003   0.001{method 'addObject' of 'App.Document' objects}
     2000   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
     2000   0.122   0.000   0.122   0.000{method 'copy' of 'Part.Shape' objects}
        1 241.759 241.759 241.759 241.759{method 'cut' of 'Part.Shape' objects}
        1   0.000   0.000   0.000   0.000{method 'disable' of '_lsprof.Profiler' objects}
        1   0.000   0.000   0.000   0.000{range}


>>> 

User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by microelly2 »

Dieser Versuch erzeugt mit Part Design einen Sketch und legt darin das 2D Modell fest

Code: Select all


def run(count):
	App.activeDocument().addObject('Sketcher::SketchObject','Sketch')
	Gui.activeDocument().setEdit('Sketch')
	geoList = []
	geoList.append(Part.Line(App.Vector(0.000000,0.000000,0),App.Vector(246.815384,0.000000,0)))
	geoList.append(Part.Line(App.Vector(246.815384,0.000000,0),App.Vector(246.815384,124.186272,0)))
	geoList.append(Part.Line(App.Vector(246.815384,124.186272,0),App.Vector(0.000000,124.186272,0)))
	geoList.append(Part.Line(App.Vector(0.000000,124.186272,0),App.Vector(0.000000,0.000000,0)))
	App.ActiveDocument.Sketch.addGeometry(geoList,False)
	conList = []
	conList.append(Sketcher.Constraint('Coincident',0,2,1,1))
	conList.append(Sketcher.Constraint('Coincident',1,2,2,1))
	conList.append(Sketcher.Constraint('Coincident',2,2,3,1))
	conList.append(Sketcher.Constraint('Coincident',3,2,0,1))
	conList.append(Sketcher.Constraint('Horizontal',0))
	conList.append(Sketcher.Constraint('Horizontal',2))
	conList.append(Sketcher.Constraint('Vertical',1))
	conList.append(Sketcher.Constraint('Vertical',3))
	App.ActiveDocument.Sketch.addConstraint(conList)

	App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) 
	App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,246.815384)) 
	App.ActiveDocument.Sketch.addConstraint(Sketcher.Constraint('DistanceY',1,1,1,2,7681.078717)) 
	App.ActiveDocument.Sketch.setDatum(10,App.Units.Quantity('20.000000 mm'))
	App.ActiveDocument.Sketch.setDatum(9,App.Units.Quantity('100000.000000 mm'))

	App.ActiveDocument.Sketch.addGeometry(Part.Circle(App.Vector(20.0,10.0,0),App.Vector(0,0,1),1.0),False)

	for n in range(count):
		App.ActiveDocument.Sketch.addGeometry(Part.Circle(App.Vector(25.0 + 5*n,10.0,0),App.Vector(0,0,1),1.0),False)

	Gui.getDocument('Unnamed').resetEdit()
	App.getDocument('Unnamed').recompute()

	App.activeDocument().addObject("PartDesign::Pad","Pad")
	App.activeDocument().Pad.Sketch = App.activeDocument().Sketch
	App.activeDocument().Pad.Sketch = App.activeDocument().Sketch
	App.activeDocument().Pad.Length = 10.0
	App.ActiveDocument.Pad.Length = 10.000000
	App.ActiveDocument.recompute()




import cProfile

cProfile.run("run(200)")

Ergebnisse: zeitlich etwas schneller aber nicht wesentlich, diesmal frisst das Padding.
Aber man braucht keinen extra Speicherplatz ;)

Hier die Laufzeiten.

Code: Select all

>>> cProfile.run("run(100)")
        140function callsin 0.561 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        4   0.046   0.012   0.046   0.012{built-in method addConstraint}
      102   0.028   0.000   0.028   0.000{built-in method addGeometry}
        2   0.066   0.033   0.066   0.033{built-in method setDatum}
        2   0.002   0.001   0.002   0.001{method 'addObject' of 'App.Document' objects}
       12   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
        2   0.378   0.189   0.378   0.189{method 'recompute' of 'App.Document' objects}
        1   0.011   0.011   0.011   0.011{method 'resetEdit' of 'Gui.Document' objects}
        1   0.027   0.027   0.027   0.027{method 'setEdit' of 'Gui.Document' objects}

>>> 

>>> cProfile.run("run(1000)")
        1040function callsin 44.933 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        4   0.041   0.010   0.041   0.010{built-in method addConstraint}
     1002   0.399   0.000   0.399   0.000{built-in method addGeometry}
        2   0.067   0.033   0.067   0.033{built-in method setDatum}
        2   0.002   0.001   0.002   0.001{method 'addObject' of 'App.Document' objects}
       12   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
        2  44.157  22.079  44.157  22.079{method 'recompute' of 'App.Document' objects}
        1   0.228   0.228   0.228   0.228{method 'resetEdit' of 'Gui.Document' objects}
        1   0.029   0.029   0.029   0.029{method 'setEdit' of 'Gui.Document' objects}

>>> 

>>> cProfile.run("run(2000)")
        2040function callsin 214.081 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        4   0.044   0.011   0.044   0.011{built-in method addConstraint}
     2002   1.204   0.001   1.204   0.001{built-in method addGeometry}
        2   0.066   0.033   0.066   0.033{built-in method setDatum}
        2   0.002   0.001   0.002   0.001{method 'addObject' of 'App.Document' objects}
       12   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
        2 211.827 105.913 211.827 105.913{method 'recompute' of 'App.Document' objects}
        1   0.890   0.890   0.890   0.890{method 'resetEdit' of 'Gui.Document' objects}
        1   0.028   0.028   0.028   0.028{method 'setEdit' of 'Gui.Document' objects}

>>> 
100 -> 10000 Faktor 100
Zeit 100^2 = 10 000 * 0.6 sec = 6000 sec (2 h)

Wenn man jetzt am Teil eine noch so kleine Veränderung macht braucht es wieder seeeehr lange.
Ist wahrscheinlich besser, auf die Platte eine Textur draufzulegen, die die Bohrungen nur visualisiert. :roll:
freecad-heini-1
Veteran
Posts: 7788
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by freecad-heini-1 »

microelly2 wrote: Wenn man jetzt am Teil eine noch so kleine Veränderung macht braucht es wieder seeeehr lange.
Ist wahrscheinlich besser, auf die Platte eine Textur draufzulegen, die die Bohrungen nur visualisiert. :roll:
Die IT nutzte diesen Benchmark um Prozessoren, Mainboards und RAM zu checken.
Eine lahme Krücke entlarvt sich relativ schnell, die High-End-Workstation hat die Nase vorne.
Im Bereich Füllsimulation für Kunststoffteile kann man nie genug CPU-Leistung, Kerne und RAM haben.

Hab grad mal den Test in Pro/E gemacht, über VirtualBox und Virtmanager. Man sieht sehr schön wie hier mehrere "virtuelle" Kerne gemeinsam werkeln.
Dennoch dauert es laaange, zu lange, deswegen habe ich den Test abgebrochen.
Mein PC ist leider auch nicht der allerschnellste.
User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by microelly2 »

Was man sieht ist die lange Rechenzeit für das show bzw. das recompute , also das Ausarbeiten der 3D-Ansicht.
Aber da kann man nichts parallelisieren.
Für reine Hintegrundberechnungen geht schon eher was. Wenn ich Pointcloud Collsionen mit einer Wand berechne, brauche ich für einen Punkt 1ms,
da kann man die Rechnung gruppenweise auf andere Rechner delegieren. Das Visualisieren einer Pointcloud geht dann auch wieder erstaunlich schnell.

Ich werde mal anfangen Stress Tests für Linienmodelle machen. Bei Blender hab ich die Marke 100 000 Punkte für flottes Arbeiten.
User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by microelly2 »

Ich habe das Gitter für eine Nurbsfläche anzeigen lassen 100 x 100 = 10 000 Rechtecke in 0.14 s, das ist ausreichend für interaktiv-Modus,
bei 1 Mill. Punkte/Quadrate sind es dann 12 Sekunden
Die meiste Zeit braucht hier die Berechnung der Punkte (50%), was bei einer lokalen Änderung drastisch reduziert werden kann.
Bedeutet für mich: Anzeige von Drahtgittermodellen wird auch bei kompexen Modellen machbar sein.
bp_072.png
bp_072.png (48.68 KiB) Viewed 2806 times

Code: Select all

'''
>>> cProfile.run('run(10)')
        581function callsin 0.004 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.002   0.002   0.002   0.002{built-in method show}
      264   0.000   0.000   0.000   0.000{method 'append' of 'list' objects}
      244   0.001   0.000   0.001   0.000{method 'valueAt' of 'Part.Face' objects}


>>> cProfile.run('run(100)')
        41620function callsin 0.139 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.043   0.043   0.043   0.043{built-in method show}
    20604   0.002   0.000   0.002   0.000{method 'append' of 'list' objects}
      202   0.010   0.000   0.010   0.000{method 'interpolate' of 'Part.GeomBSplineCurve' objects}
      202   0.001   0.000   0.001   0.000{method 'toShape' of 'Part.GeomCurve' objects}
    20404   0.064   0.000   0.064   0.000{method 'valueAt' of 'Part.Face' objects}

>>> cProfile.run('run(1000)')
        4016020function callsin 12.124 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   3.243   3.243   3.243   3.243{built-in method show}
  2006004   0.139   0.000   0.139   0.000{method 'append' of 'list' objects}
     2002   0.844   0.000   0.844   0.000{method 'interpolate' of 'Part.GeomBSplineCurve' objects}
     2002   0.014   0.000   0.014   0.000{method 'toShape' of 'Part.GeomCurve' objects}
  2004004   6.110   0.000   6.110   0.000{method 'valueAt' of 'Part.Face' objects}
     2004   0.082   0.000   0.082   0.000{range}

>>> 
'''

Code: Select all

def run(ct=20):
	t=App.ActiveDocument.Nurbs.Shape
	f=t.Faces[0]

	sss=[]

	st=1.0/ct
	for iu in range(ct+1):
		pps=[]
		for iv in range(ct+1):
			p=f.valueAt(st*iu,st*iv)
			pps.append(p)
		tt=Part.BSplineCurve()
		tt.interpolate(pps)
		ss=tt.toShape()
		sss.append(ss)

	for iv in range(ct+1):
		pps=[]
		for iu in range(ct+1):
			p=f.valueAt(st*iu,st*iv)
			pps.append(p)
		tt=Part.BSplineCurve()
		tt.interpolate(pps)
		ss=tt.toShape()
		sss.append(ss)

	comp=Part.Compound(sss)
	Part.show(comp)

import cProfile;
cProfile.run('run(10)')
cProfile.run('run(100)')
cProfile.run('run(1000)')
ulrich1a
Veteran
Posts: 1957
Joined: Sun Jul 07, 2013 12:08 pm

Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen

Post by ulrich1a »

Ich habe mal einen Microellys Methode etwas variert, um die 10000 Löcher zu erzeugen:

Code: Select all

import Part
import FreeCAD as App
from FreeCAD import Vector
from FreeCAD import Base
if(App.activeDocument() == None):App.newDocument()

def run(count):
  pA = Base.Vector(-3.0, -3.0, 0.0)
  pB = Base.Vector(-3.0, 300.0, 0.0)
  pC = Base.Vector(300.0, 300.0, 0.0)
  pD = Base.Vector(300.0, -3.0, 0.0)
  myWire = Part.makePolygon([pA, pD, pC, pB, pA])

  circleList = [myWire]
  
  for i in range(count):
    for j in range(count):
      theCircle = Part.Circle(Base.Vector(i*3.0,j*3.0,0), Base.Vector(0,0,1), 1.0)
      cWire = Part.Wire(theCircle.toShape())
      circleList.append(cWire)
  
  myFace = Part.Face(circleList)
  myPlate = myFace.extrude(Base.Vector(0,0,5))
  Part.show(myPlate)

import cProfile

cProfile.run("run(100)")
Das Ergebnis sieht so aus:

Code: Select all

        20111function callsin 311.795 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percallfilename:lineno(function)
        1   0.004   0.004 311.795 311.795<string>:1(<module>)
        1   0.061   0.061 311.791 311.791profiling1.py:8(run)
        4   0.000   0.000   0.000   0.000{built-in method makeLine}
        1   0.000   0.000   0.000   0.000{built-in method makePolygon}
        1 311.376 311.376 311.376 311.376{built-in method show}
    10000   0.001   0.000   0.001   0.000{method 'append' of 'list' objects}
        1   0.000   0.000   0.000   0.000{method 'disable' of '_lsprof.Profiler' objects}
        1   0.327   0.327   0.327   0.327{method 'extrude' of 'Part.Shape' objects}
    10000   0.027   0.000   0.027   0.000{method 'toShape' of 'Part.GeomCurve' objects}
      101   0.000   0.000   0.000   0.000{range}
Jetzt wird nahezu die ganze Zeit benötigt, um die Lochplatte mit den 10000 Löchern anzuzeigen.
Intern ist die Geometrie im Vergleich dazu sofort da.

Ulrich
Post Reply