Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Bitte seid so nett und führt folgenden Benchmark aus.
1. In Partdesign ein Quadrat zeichnen, 303x303mm, nach links unten um jeweils 3mm verschoben. 2. Skizze aufpolstern um 5mm 3. Zylinder platzieren auf x0, y0, z-3mm. Radius 1mm, Höhe 10mm 4. In die Draft-Workbench wechseln und das Array-Tool wählen.
Abstand in x=3mm, in y=3mm, 5. Number x und Number y auf je 100 setzen: 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?
1. In Partdesign ein Quadrat zeichnen, 303x303mm, nach links unten um jeweils 3mm verschoben. 2. Skizze aufpolstern um 5mm 3. Zylinder platzieren auf x0, y0, z-3mm. Radius 1mm, Höhe 10mm 4. In die Draft-Workbench wechseln und das Array-Tool wählen.
Abstand in x=3mm, in y=3mm, 5. Number x und Number y auf je 100 setzen: 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?
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Mein Freecad stürzte nach etwa 1/2 Stunde ab. D.h. die boolsche Operation wurde nicht durchgeführt.
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Uff, ich dachte schon ich mach was falsch ...freecad-heini-1 wrote:Mein Freecad stürzte nach etwa 1/2 Stunde ab. D.h. die boolsche Operation wurde nicht durchgeführt.
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 ...
Nein, soweit ich weiß nicht, aber mir ist ein fieser Hack von DEEPSOIC eingefallen.freecad-heini-1 wrote:Gibt es die Möglichkeit mehrere Kerne zu aktivieren?
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
My GrabCAD FreeCAD-Projects
FreeCAD lessons for beginners in english
Native german speaker - so apologies for my english, no offense intended
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
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
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 (198.5 KiB) Viewed 2870 times
- microelly2
- Veteran
- Posts: 4688
- Joined: Tue Nov 12, 2013 4:06 pm
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
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
hier zweiter Versuch
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
EDIT ich muss alles nochmal zurücknehmen, mein Skript war schon am Ende der Platte und da ging das Löchern natürlich schnell
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)")
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}
>>>
- microelly2
- Veteran
- Posts: 4688
- Joined: Tue Nov 12, 2013 4:06 pm
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Dieser Versuch erzeugt mit Part Design einen Sketch und legt darin das 2D Modell fest
Ergebnisse: zeitlich etwas schneller aber nicht wesentlich, diesmal frisst das Padding.
Aber man braucht keinen extra Speicherplatz
Hier die Laufzeiten.
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.
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)")
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}
>>>
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.
-
- Veteran
- Posts: 7788
- Joined: Tue Jan 07, 2014 11:10 am
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Die IT nutzte diesen Benchmark um Prozessoren, Mainboards und RAM zu checken.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.
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.
- microelly2
- Veteran
- Posts: 4688
- Joined: Tue Nov 12, 2013 4:06 pm
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
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.
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.
- microelly2
- Veteran
- Posts: 4688
- Joined: Tue Nov 12, 2013 4:06 pm
- Contact:
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
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.
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.
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)')
Re: Rechner Benchmark Lochplatte 303mm mit 10000 Bohrungen
Ich habe mal einen Microellys Methode etwas variert, um die 10000 Löcher zu erzeugen:
Das Ergebnis sieht so aus:
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
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)")
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}
Intern ist die Geometrie im Vergleich dazu sofort da.
Ulrich