Manual:Creating and manipulating geometry/pl: Difference between revisions

From FreeCAD Documentation
No edit summary
(Updating to match new version of source page)
 
(27 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{Docnav/pl
{{Docnav/pl
|[[Manual:A gentle introduction/pl|Podręcznik: Łagodny wstęp]]
|[[Manual:A gentle introduction/pl|Podręcznik: Łagodny wstęp]]
Line 7: Line 8:
}}
}}


{{Manual:TOC/pl}}
{{Manual:TOC}}


W poprzednich rozdziałach dowiedzieliśmy się o różnych środowiskach pracy programu FreeCAD oraz o tym, jak każde z nich stosuje swoje własne narzędzia i typy geometrii. Ta sama koncepcja obowiązuje przy pracy z kodem Pythona.
W poprzednich rozdziałach dowiedzieliśmy się o różnych środowiskach pracy programu FreeCAD oraz o tym, jak każde z nich stosuje swoje własne narzędzia i typy geometrii. Ta sama koncepcja obowiązuje przy pracy z kodem Pythona.


Zauważyliśmy również, że zdecydowana większość środowisk pracy FreeCAD zależy od bardzo fundamentalnego elementu: Środowiska pracy [[Part Workbench_pl|Part]]. W rzeczywistości, wiele innych środowisk pracy, takich jak [[Draft_Module|Draft]] i [[Arch_Module|Arch]], wykonuje dokładnie to, co zrobimy w tym rozdziale: używa kodu Python do tworzenia i manipulowania geometrią Części.
Zauważyliśmy również, że zdecydowana większość środowisk pracy FreeCAD zależy od bardzo fundamentalnego elementu: Środowiska pracy [[Part_Workbench/pl|Część]]. W rzeczywistości, wiele innych środowisk pracy, takich jak [[Draft_Workbench/pl|Rysunek Roboczy]] i [[Arch_Workbench|Arch]], wykonuje dokładnie to, co zrobimy w tym rozdziale: używa kodu Python do tworzenia i manipulowania geometrią Części.


Więc pierwszą rzeczą, którą musimy zrobić, aby pracować z geometrią części, jest wykonanie w środowisku Python odpowiednika przejścia do Środowiska pracy Part: zaimportuj moduł Part:
So the first thing we need to do to work with Part geometry, is to do the Python equivalent to switching to the Part Workbench: import the Part module:


{{Code|code=
{{Code|code=
Line 19: Line 20:
}}
}}


Poświęć minutę na zapoznanie się z zawartością modułu Część, wpisując Part i przeglądając różne dostępne metody. Moduł Część oferuje kilka wygodnych funkcji, takich jak makeBox, makeCircle, itp... które natychmiast zbudują dla Ciebie obiekt. Spróbuj na przykład tego:
Take a minute to explore the contents of the Part module, by typing Part. and browsing through the different methods available. The Part module offers several convenience functions such as makeBox, makeCircle, etc... which will instantly build an object for you. Try this, for example:


{{Code|code=
{{Code|code=
Line 25: Line 26:
}}
}}


Kiedy naciśniesz {{KEY|Enter}} po wpisaniu powyższej linii, nic nie pojawi się w widoku 3D, ale w konsoli Python zostanie wydrukowane coś takiego:
When you press Enter after typing the line above, nothing will appear in the 3D view, but something like this will be printed on the Python Console:


{{Code|code=
{{Code|code=
Line 31: Line 32:
}}
}}


W tym właśnie miejscu pojawia się ważna koncepcja. To, co tu stworzyliśmy, jest Kształtem Części. Nie jest to obiekt dokumentu FreeCAD ''(jeszcze)''. W programie FreeCAD, obiekty i ich geometrie są niezależne. Pomyśl o obiekcie dokumentu FreeCAD jako o kontenerze, który będzie posiadał kształt. Obiekty parametryczne będą miały również właściwości takie jak długość i szerokość oraz będą ''przeliczać'' swój kształt w locie, gdy tylko jedna z tych właściwości ulegnie zmianie. To, co zrobiliśmy tutaj, to ręczne obliczenie kształtu.
This is where an important concept takes place. What we created here is a Part Shape. It is not a FreeCAD document object (yet). In FreeCAD, objects and their geometry are independent. Think of a FreeCAD document object as a container, that will host a shape. Parametric objects will also have properties such as Length and Width, and will '''recalculate''' their Shape on-the-fly, whenever one of the properties changes. What we did here is calculate a shape manually.


Możemy teraz w prosty sposób stworzyć "ogólny" obiekt dokumentu w bieżącym dokumencie ''(upewnij się, że masz otwarty przynajmniej jeden nowy dokument)'' i nadaj mu kształt pudełka, taki jak ten, który właśnie stworzyliśmy:
We can now easily create a "generic" document object in the current document (make sure you have at least one new document open), and give it a box shape like the one we just made:


{{Code|code=
{{Code|code=
boxShape = Part.makeBox(3,5,7)
boxShape = Part.makeBox(3,5,7)
myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox")
myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox")
myObj.Shape = boxShape
myObj.Shape = boxShape
FreeCAD.ActiveDocument.recompute()
FreeCAD.ActiveDocument.recompute()
}}
}}


Note how we handled myObj.Shape , notice that it is done exactly like we did it in the previous chapter, when we changed other properties of an object, such as box.Height = 5 . In fact, '''Shape''' is also a property, just like '''Height'''. Only it takes a Part Shape, not a number. In the next chapter we will have a better look at how these parametric objects are constructed.
Zwróć uwagę, jak obchodziliśmy się z '''myObj.Shape''', zauważ, że robimy to dokładnie tak samo, jak robiliśmy to w poprzednim rozdziale, kiedy zmienialiśmy inne właściwości obiektu, takie jak '''box.Height = 5'''. W rzeczywistości, '''Kształt''' jest również właściwością, podobnie jak '''Wysokość'''. Tylko bierze ona obiekt Part Shape, a nie liczbę. W następnym rozdziale lepiej przyjrzymy się temu, jak te parametryczne obiekty konstruowane.


Na razie przyjrzyjmy się bardziej szczegółowo naszym Kształtom Części. Na końcu rozdziału o [[Manual:Traditional modeling, the CSG way/pl|Podręcznik:Modelowanie tradycyjne, według CSG]] pokazaliśmy tabelę, która wyjaśnia, jak konstruowane są Kształty Części oraz ich różne komponenty ''(wierzchołki, krawędzie, powierzchnie, itp.)''. Dokładnie te same komponenty istnieją tutaj i mogą być pobrane z Pythona. Kształty Części posiadają zawsze następujące atrybuty: wierzchołki, krawędzie, obwiednie, powierzchnie, powłoki i bryły. Wszystkie z nich są listami, które mogą zawierać dowolną liczbę pozycji lub mogą pozostać puste:
For now, let's explore our Part Shapes in more detail. At the end of the chapter about [[Manual:Traditional modeling, the CSG way|traditional modeling with the Part Workbench]] we showed a table that explains how Part Shapes are constructed, and their different components (Vertices, edges, faces, etc). The exact same components exist here and can be retrieved from Python. Part Shapes always have the following attributes: Vertexes, Edges, Wires, Faces, Shells and Solids. All of them are lists, that can contain any number of elements or be empty:


{{Code|code=
{{Code|code=
print(boxShape.Vertexes)
print(boxShape.Vertexes)
print(boxShape.Edges)
print(boxShape.Edges)
print(boxShape.Wires)
print(boxShape.Wires)
print(boxShape.Faces)
print(boxShape.Faces)
print(boxShape.Shells)
print(boxShape.Shells)
print(boxShape.Solids)
print(boxShape.Solids)
}}
}}


Na przykład, znajdźmy powyżej obszar każdej z powierzchni kształtu naszego sześcianu: ''(Pamiętaj o wcięciu drugiego wiersza, tak jak pokazano poniżej. Naciśnij dwukrotnie klawisz Enter po ostatnim wierszu, aby uruchomić polecenie środowiska Python)''.
For example, let's find the area of each face of our box shape above:


{{Code|code=
{{Code|code=
Line 62: Line 63:
}}
}}


Albo, dla każdej krawędzi, jej punkt początkowy i końcowy:
Or, for each edge, its start point and end point:


{{Code|code=
{{Code|code=
Line 73: Line 74:
}}
}}


As you see, if our boxShape has a "Vertexes" attribute, each Edge of the boxShape also has a "Vertexes" attribute. As we can expect, the boxShape will have 8 vertices, while the edge will only have 2, which are both part of the list of 8.
Jak widzisz, jeśli nasz boxShape posiada atrybut '''Vertexes''', każdy z brzegów boxShape posiada również atrybut '''Vertexes'''. Jak możemy się spodziewać, boxShape będzie posiadał 8 wierzchołków, podczas gdy krawędź będzie miała tylko 2, częścią listy tych ośmiuj.


Zawsze możemy sprawdzić, jaki jest rodzaj kształtu:
We can always check what is the type of a shape:


{{Code|code=
{{Code|code=
print(boxShape.ShapeType)
print(boxShape.ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Vertexes[2].ShapeType)
print(boxShape.Vertexes[2].ShapeType)
}}
}}


Wróćmy więc do tematu Kształty części: Wszystko zaczyna się od Wierzchołków. Z jednym lub dwoma wierzchołkami tworzysz krawędź ''(pełne koła mają tylko jeden wierzchołek)''. Z jedną lub kilkoma krawędziami tworzysz obwiednię. Z pojedynczą lub kilkoma zamkniętymi obwiedniami tworzysz powierzchnię czołową ''(dodatkowe obwiednie stają się "otworami" w powierzchni czołowej)''. Z jedną lub kilkoma powierzchniami tworzysz Powłokę. Gdy powłoka jest całkowicie zamknięta ''(wodoszczelna)'', można z niej utworzyć bryłę. I wreszcie, można połączyć dowolną liczbę dowolnych kształtów, które następnie nazywa się Związkiem.
So to resume the topic of Part Shapes: Everything starts with Vertices. With one or two vertices, you form an Edge (full circles have only one vertex). With one or more Edges, you form a Wire. With one or more closed Wires, you form a Face (the additional Wires become "holes" in the Face). With one or more Faces, you form a Shell. When a Shell is fully closed (watertight), you can form a Solid from it. And finally, you can join any number of Shapes of any types together, which is then called a Compound.


Możemy teraz próbować tworzyć złożone kształty od podstaw, konstruując wszystkie ich elementy jeden po drugim. Na przykład, spróbujmy stworzyć taką objętość:
We can now try creating complex shapes from scratch, by constructing all their components one by one. For example, let's try to create a volume like this:


[[Image:Exercise_python_03.jpg]]
[[Image:Exercise_python_03.jpg]]


Zaczniemy od stworzenia takiego planarnego kształtu:
We will start by creating a planar shape like this:


[[Image:Wire.png]]
[[Image:Wire.png]]


Po pierwsze, stwórzmy cztery punkty bazowe:
First, let's create the four base points:


{{Code|code=
{{Code|code=
V1 = FreeCAD.Vector(0,10,0)
V1 = FreeCAD.Vector(0,10,0)
V2 = FreeCAD.Vector(30,10,0)
V2 = FreeCAD.Vector(30,10,0)
V3 = FreeCAD.Vector(30,-10,0)
V3 = FreeCAD.Vector(30,-10,0)
V4 = FreeCAD.Vector(0,-10,0)
V4 = FreeCAD.Vector(0,-10,0)
}}
}}


Następnie możemy utworzyć dwa segmenty liniowe:
Then we can create the two linear segments:


[[Image:Line.png]]
[[Image:Line.png]]
Line 123: Line 124:
{{Code|code=
{{Code|code=
VC1 = FreeCAD.Vector(-10,0,0)
VC1 = FreeCAD.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
C1 = Part.Arc(V1,VC1,V4)
VC2 = FreeCAD.Vector(40,0,0)
VC2 = FreeCAD.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)
C2 = Part.Arc(V2,VC2,V3)
}}
}}


Line 132: Line 133:
{{Code|code=
{{Code|code=
E1 = Part.Edge(L1)
E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)
E4 = Part.Edge(C2)
}}
}}


Line 141: Line 142:
{{Code|code=
{{Code|code=
E1 = L1.toShape()
E1 = L1.toShape()
E2 = L2.toShape()
E2 = L2.toShape()
...
...
}}
}}


Kiedy już będziemy mieli serię krawędzi, możemy teraz stworzyć obwiednię, podając jej listę krawędzi. Musimy zadbać o porządek.
Kiedy już będziemy mieli serię krawędzi, możemy teraz stworzyć obwiednię, podając jej listę krawędzi. Musimy jednak zwrócić uwagę na kolejność. Zwróćcie też uwagę na nawiasy.


{{Code|code=
{{Code|code=
Line 157: Line 158:
}}
}}


Który wydrukuje {{Value|True}} lub {{Value|False}}. Aby wykonać powierzchnię, potrzebujemy zamkniętej obwiedni, więc zawsze warto to sprawdzić przed wykonaniem powierzchni. Teraz możemy stworzyć taką powierzchnię, nadając jej pojedynczą obwiednię ''(lub listę obwiedni, jeśli chcemy uzyskać otwory)'':
Instrukcja wydrukuje {{Value|True}} lub {{Value|False}}. Aby wykonać powierzchnię, potrzebujemy zamkniętej obwiedni, więc zawsze warto to sprawdzić przed wykonaniem powierzchni. Teraz możemy stworzyć taką powierzchnię, nadając jej pojedynczą obwiednię ''(lub listę obwiedni, jeśli chcemy uzyskać otwory)'':


{{Code|code=
{{Code|code=
Line 179: Line 180:
{{Code|code=
{{Code|code=
S = W.extrude(FreeCAD.Vector(0,0,10))
S = W.extrude(FreeCAD.Vector(0,0,10))
print(s.ShapeType)
print(S.ShapeType)
}}
}}


Line 188: Line 189:
{{Code|code=
{{Code|code=
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2.Shape = P
myObj2.Shape = P
FreeCAD.ActiveDocument.recompute()
FreeCAD.ActiveDocument.recompute()
}}
}}


Line 204: Line 205:
* [[Part_Workbench/pl|Środowisko pracy Part]]
* [[Part_Workbench/pl|Środowisko pracy Part]]
* [[Topological_data_scripting/pl|Skrypty danych topologicznych]]
* [[Topological_data_scripting/pl|Skrypty danych topologicznych]]



{{Docnav/pl
{{Docnav/pl

Latest revision as of 19:28, 4 November 2023

W poprzednich rozdziałach dowiedzieliśmy się o różnych środowiskach pracy programu FreeCAD oraz o tym, jak każde z nich stosuje swoje własne narzędzia i typy geometrii. Ta sama koncepcja obowiązuje przy pracy z kodem Pythona.

Zauważyliśmy również, że zdecydowana większość środowisk pracy FreeCAD zależy od bardzo fundamentalnego elementu: Środowiska pracy Część. W rzeczywistości, wiele innych środowisk pracy, takich jak Rysunek Roboczy i Arch, wykonuje dokładnie to, co zrobimy w tym rozdziale: używa kodu Python do tworzenia i manipulowania geometrią Części.

Więc pierwszą rzeczą, którą musimy zrobić, aby pracować z geometrią części, jest wykonanie w środowisku Python odpowiednika przejścia do Środowiska pracy Part: zaimportuj moduł Part:

import Part

Poświęć minutę na zapoznanie się z zawartością modułu Część, wpisując Part i przeglądając różne dostępne metody. Moduł Część oferuje kilka wygodnych funkcji, takich jak makeBox, makeCircle, itp... które natychmiast zbudują dla Ciebie obiekt. Spróbuj na przykład tego:

Part.makeBox(3,5,7)

Kiedy naciśniesz Enter po wpisaniu powyższej linii, nic nie pojawi się w widoku 3D, ale w konsoli Python zostanie wydrukowane coś takiego:

<Solid object at 0x5f43600>

W tym właśnie miejscu pojawia się ważna koncepcja. To, co tu stworzyliśmy, jest Kształtem Części. Nie jest to obiekt dokumentu FreeCAD (jeszcze). W programie FreeCAD, obiekty i ich geometrie są niezależne. Pomyśl o obiekcie dokumentu FreeCAD jako o kontenerze, który będzie posiadał kształt. Obiekty parametryczne będą miały również właściwości takie jak długość i szerokość oraz będą przeliczać swój kształt w locie, gdy tylko jedna z tych właściwości ulegnie zmianie. To, co zrobiliśmy tutaj, to ręczne obliczenie kształtu.

Możemy teraz w prosty sposób stworzyć "ogólny" obiekt dokumentu w bieżącym dokumencie (upewnij się, że masz otwarty przynajmniej jeden nowy dokument) i nadaj mu kształt pudełka, taki jak ten, który właśnie stworzyliśmy:

boxShape = Part.makeBox(3,5,7)
myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox")
myObj.Shape = boxShape
FreeCAD.ActiveDocument.recompute()

Zwróć uwagę, jak obchodziliśmy się z myObj.Shape, zauważ, że robimy to dokładnie tak samo, jak robiliśmy to w poprzednim rozdziale, kiedy zmienialiśmy inne właściwości obiektu, takie jak box.Height = 5. W rzeczywistości, Kształt jest również właściwością, podobnie jak Wysokość. Tylko bierze ona obiekt Part Shape, a nie liczbę. W następnym rozdziale lepiej przyjrzymy się temu, jak te parametryczne obiekty są konstruowane.

Na razie przyjrzyjmy się bardziej szczegółowo naszym Kształtom Części. Na końcu rozdziału o Podręcznik:Modelowanie tradycyjne, według CSG pokazaliśmy tabelę, która wyjaśnia, jak konstruowane są Kształty Części oraz ich różne komponenty (wierzchołki, krawędzie, powierzchnie, itp.). Dokładnie te same komponenty istnieją tutaj i mogą być pobrane z Pythona. Kształty Części posiadają zawsze następujące atrybuty: wierzchołki, krawędzie, obwiednie, powierzchnie, powłoki i bryły. Wszystkie z nich są listami, które mogą zawierać dowolną liczbę pozycji lub mogą pozostać puste:

print(boxShape.Vertexes)
print(boxShape.Edges)
print(boxShape.Wires)
print(boxShape.Faces)
print(boxShape.Shells)
print(boxShape.Solids)

Na przykład, znajdźmy powyżej obszar każdej z powierzchni kształtu naszego sześcianu: (Pamiętaj o wcięciu drugiego wiersza, tak jak pokazano poniżej. Naciśnij dwukrotnie klawisz Enter po ostatnim wierszu, aby uruchomić polecenie środowiska Python).

for f in boxShape.Faces:
   print(f.Area)

Albo, dla każdej krawędzi, jej punkt początkowy i końcowy:

for e in boxShape.Edges:
   print("New edge")
   print("Start point:")
   print(e.Vertexes[0].Point)
   print("End point:")
   print(e.Vertexes[1].Point)

Jak widzisz, jeśli nasz boxShape posiada atrybut Vertexes, każdy z brzegów boxShape posiada również atrybut Vertexes. Jak możemy się spodziewać, boxShape będzie posiadał 8 wierzchołków, podczas gdy krawędź będzie miała tylko 2, są częścią listy tych ośmiuj.

Zawsze możemy sprawdzić, jaki jest rodzaj kształtu:

print(boxShape.ShapeType)
print(boxShape.Faces[0].ShapeType)
print(boxShape.Vertexes[2].ShapeType)

Wróćmy więc do tematu Kształty części: Wszystko zaczyna się od Wierzchołków. Z jednym lub dwoma wierzchołkami tworzysz krawędź (pełne koła mają tylko jeden wierzchołek). Z jedną lub kilkoma krawędziami tworzysz obwiednię. Z pojedynczą lub kilkoma zamkniętymi obwiedniami tworzysz powierzchnię czołową (dodatkowe obwiednie stają się "otworami" w powierzchni czołowej). Z jedną lub kilkoma powierzchniami tworzysz Powłokę. Gdy powłoka jest całkowicie zamknięta (wodoszczelna), można z niej utworzyć bryłę. I wreszcie, można połączyć dowolną liczbę dowolnych kształtów, które następnie nazywa się Związkiem.

Możemy teraz próbować tworzyć złożone kształty od podstaw, konstruując wszystkie ich elementy jeden po drugim. Na przykład, spróbujmy stworzyć taką objętość:

Zaczniemy od stworzenia takiego planarnego kształtu:

Po pierwsze, stwórzmy cztery punkty bazowe:

V1 = FreeCAD.Vector(0,10,0)
V2 = FreeCAD.Vector(30,10,0)
V3 = FreeCAD.Vector(30,-10,0)
V4 = FreeCAD.Vector(0,-10,0)

Następnie możemy utworzyć dwa segmenty liniowe:

L1 = Part.LineSegment(V1,V2)
L2 = Part.LineSegment(V4,V3)

Zauważ, że nie musieliśmy tworzyć wierzchołków. Mogliśmy natychmiast stworzyć Part.LineSegmenty za pomocą FreeCAD Vectors. To dlatego, że tutaj nie stworzyliśmy jeszcze Krawędzi. Part.LineSegment (jak również Part.Circle, Part.Arc, Part.Ellipse czy Part.BSpline) nie tworzy krawędzi, ale raczej bazową geometrię, na której zostanie utworzony obiekt Edge. Krawędzie są zawsze tworzone z takiej geometrii bazowej, która jest zapisana w atrybucie Curve. Więc jeśli masz krawędzie, to zrób to:

print(Edge.Curve)

pokaże Ci, jaki to rodzaj obiektu Edge, tzn. czy jest oparty na linii, łuku, itd... Ale wróćmy do naszego ćwiczenia, i zbudujmy segmenty łuku. Do tego będziemy potrzebowali trzeciego punktu, więc możemy użyć wygodnego Part.Arc, który pobiera 3 punkty:

VC1 = FreeCAD.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
VC2 = FreeCAD.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)

Teraz mamy dwie linie (L1 i L2) i dwa łuki (C1 i C2). Musimy zamienić je na krawędzie:

E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)

Alternatywnie, geometrie bazowe mają również funkcję toShape(), która robi dokładnie to samo:

E1 = L1.toShape()
E2 = L2.toShape()
 ...

Kiedy już będziemy mieli serię krawędzi, możemy teraz stworzyć obwiednię, podając jej listę krawędzi. Musimy jednak zwrócić uwagę na kolejność. Zwróćcie też uwagę na nawiasy.

W = Part.Wire([E1,E4,E2,E3])

I możemy sprawdzić, czy nasza obwiednia została prawidłowo wykonana, i czy jest prawidłowo zamknięta:

print( W.isClosed() )

Instrukcja wydrukuje True lub False. Aby wykonać powierzchnię, potrzebujemy zamkniętej obwiedni, więc zawsze warto to sprawdzić przed wykonaniem powierzchni. Teraz możemy stworzyć taką powierzchnię, nadając jej pojedynczą obwiednię (lub listę obwiedni, jeśli chcemy uzyskać otwory):

F = Part.Face(W)

Potem go wyciągamy:

P = F.extrude(FreeCAD.Vector(0,0,10))

Należy pamiętać, że P jest już bryłą:

print(P.ShapeType)

To dlatego, że kiedy wyciągamy pojedynczą powierzchnię, zawsze otrzymujemy bryłę. Nie miałoby to miejsca, na przykład, gdybyśmy zamiast tego wyciągnęli obwiednię:

S = W.extrude(FreeCAD.Vector(0,0,10))
print(S.ShapeType)

Co oczywiście da nam pustą powłokę, z brakującą górną i dolną powierzchnią.

Teraz, gdy mamy nasz ostateczny kształt, chcemy go zobaczyć na ekranie! Stwórzmy więc ogólny obiekt, i przypiszmy do niego naszą nową bryłę:

myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid")
myObj2.Shape = P
FreeCAD.ActiveDocument.recompute()

Alternatywnie, Środowisko pracy Part dostarcza również skrót, który przyspiesza powyższą operację (ale nie możesz wybrać nazwy obiektu):

Part.show(P)

Wszystko to, oraz wiele więcej, zostało szczegółowo wyjaśnione na stronie Skrypty danych topologicznych, wraz z przykładami.

Więcej informacji: