Topological data scripting/sv

Introduktion
Här kommer vi att förklara hur du kontrollerar Del Modulen direkt från FreeCADs python tolk, eller från ett externt skript. Titta igenom Skript avsnittet och FreeCAD Skript grunder sidorna om du behöver mer information om hur python skript fungerar i FreeCAD.

För att kunna använda Delmodulens funktioner så måste du ladda Del modulen i tolken:

Here we will explain to you how to control the Part module directly from the FreeCAD Python interpreter, or from any external script. Be sure to browse the Scripting section and the FreeCAD Scripting Basics pages if you need more information about how Python scripting works in FreeCAD. If you are new to Python, it is a good idea to first read the Introduction to Python.

Klass Diagram
Detta är en UML översikt över de viktigaste klasserna i Del modulen:



This is a Unified Modeling Language (UML) overview of the most important classes of the Part module:

Geometri
De geomtriska objekten är byggblocken för alla topologiska objekt:


 * GEOM Basklass för geometriska objekt


 * LINE En rak linje i 3D, definierad av en start- och en slutpunkt


 * CIRCLE Cirkel eller cirkelsegment som definieras av en centrumpunkt, start- och en slutpunkt


 * ...... Och snart lite mer

The geometric objects are the building blocks of all topological objects:
 * Geom Base class of the geometric objects.
 * Line A straight line in 3D, defined by starting point and end point.
 * Circle Circle or circle segment defined by a center point and start and end point.
 * Etc.

Topologi
Följande topologiska datatyper finns tillgängliga:


 * COMPOUND En grupp av valfri typ av topologiska objekt.
 * COMPSOLID En kompositsolid är ett set av solider ihopkopplade genom dess ytor. Det expanderar begreppen WIRE och SHELL till solider.
 * SOLID En rymd som är begränsad av skal. Den är tredimensionell.
 * SHELL Ett set av ytor ihopkopplade genom dess kanter. Ett skal kan vara öppet eller slutet.
 * FACE I 2D så är det en del av ett plan; i 3D är det en del av en yta. Dess geometri är begränsad (trimmad) av konturer. Den är tvådimensionell.
 * WIRE Ett set av kanter som är ihopkopplade genom dess hörn. Det kan vara en öppen eller sluten kontur beroende på om kanterna är ihoplänkade eller inte.
 * EDGE Ett topologiskt element som motsvarar en begränsad kurva. En kant är vanligtvis begränsad av hörn. Det har en dimension.
 * VERTEX Ett topologiskt element som motsvarar en punkt. Dess dimension är noll.
 * SHAPE En allmän term som täcker allt ovan.

The following topological data types are available:
 * Compound A group of any type of topological objects.
 * Compsolid A composite solid is a set of solids connected by their faces. It expands the notions of WIRE and SHELL to solids.
 * Solid A part of space limited by shells. It is three dimensional.
 * Shell A set of faces connected by their edges. A shell can be open or closed.
 * Face In 2D it is part of a plane; in 3D it is part of a surface. Its geometry is constrained (trimmed) by contours. It is two dimensional.
 * Wire A set of edges connected by their vertices. It can be an open or closed contour depending on whether the edges are linked or not.
 * Edge A topological element corresponding to a restrained curve. An edge is generally limited by vertices. It has one dimension.
 * Vertex A topological element corresponding to a point. It has zero dimension.
 * Shape A generic term covering all of the above.

Skapa simpel topologi


Vi ska nu skapa en topologi genom att konstruera den utifrån enklare geometri. Som ett studiefall så använder vi en del som syns i bilden vilken består av fyra hörn, två cirklar och två linjer.

Skapa Geometri
Först så måste vi skapa de distinkt geometriska delarna av denna tråd. Och vi måste ta hänsyn till att hörnen på de geometriska delarna är på samma position. Annars kanske vi inte kan koppla ihop de geometriska delarna till en topologi!

First we create the distinct geometric parts of this wire. Making sure that parts that have to be connected later share the same vertices.

Så vi skapar punkterna först:

Cirkelbåge


För att skapa en cirkelbåge så skapar vi en hjälppunkt och skapar cirkelbågen genom tre punkter:

Linje


Linjen kan skapas mycket lätt ur punkterna:

Sätta ihop allt
Det sista steget är att sätta ihop den geometriska grundelementen och baka en topologisk form:

The last step is to put the geometric base elements together and bake a topological shape:

Skapa ett prisma
Extrudera nu tråden i en riktning och skapa en äkta 3D form:

Now extrude the wire in a direction and make an actual 3D shape:

Kort beskrivning
Du kan lätt skapa enkla topologiska objekt med "make..." metoden från Del Modulen:

You can easily create basic topological objects with the methods from the Part module:

Några andra make... metoder fom finns:


 * makeBox(l,w,h,[p,d]) -- Skapa en låda placerad i p och pekar i riktningen d med dimensionerna (l,w,h). Som standard är p Vektor(0,0,0) och d är Vektor(0,0,1)
 * makeCircle(radius,[p,d,angle1,angle2]) -- Skapa en cirkel med en given radie. Som standard är p Vektor(0,0,0), d är Vektor(0,0,1) angle1=0 och angle2=360
 * makeCompound(list) -- Skapar en compound från en lista med former (shapes)
 * makeCone(radius1,radius2,height,[p,d,angle]) -- Skapa en kon med given radie och höjd. Som standard är p Vektor(0,0,0), d är Vektor(0,0,1) och angle=360
 * makeCylinder(radius,height,[p,d,angle]) -- Skapa en cylinder med given radie och höjd. Som standard är p Vektor(0,0,0), d är Vektor(0,0,1) och angle=360
 * makeLine((x1,y1,z1),(x2,y2,z2)) -- Skapa en linje mellan två punkter
 * makePlane(length,width,[p,d]) -- Skapa ett plan med längd och bredd. med given radie och höjd. Som standard är p Vektor(0,0,0), och d är Vektor(0,0,1)
 * makePolygon(list) -- Skapa en polygon från en lista med punkter
 * makeSphere(radius,[p,d,angle1,angle2,angle3]) -- Skapa en sfär med given radie. Som standard är p Vektor(0,0,0), d Vektor(0,0,1), angle1=0, angle2=90 och angle3=360
 * makeTorus(radius1,radius2,[p,d,angle1,angle2,angle3]) -- Skapa en torus med given radie. Som standard är p Vektor(0,0,0), d Vektor(0,0,1), angle1=0, angle2=360 och angle3=360

See the Part API page for a complete list of available methods of the Part module.

Detaljerade förklaringar
Importera först följande:

First we need to import the FreeCAD and Part modules so we can use their contents in Python:

Create a vector
Vectors are one of the most important pieces of information when building shapes. They usually contain three numbers (but not necessarily always): the X, Y and Z cartesian coordinates. You create a vector like this:

We just created a vector at coordinates X = 3, Y = 2, Z = 0. In the Part module, vectors are used everywhere. Part shapes also use another kind of point representation called Vertex which is simply a container for a vector. You access the vector of a vertex like this:

Hur skapar man en kant?
En kant är inget annat än en linje med två hörn:

An edge is nothing but a line with two vertices:

Notera: Du kan inte skapa en kant som passerar två hörn.

Du kan hitta en kants längd och centrum så här:

Put the shape on screen
So far we created an edge object, but it doesn't appear anywhere on the screen. This is because the FreeCAD 3D scene only displays what you tell it to display. To do that, we use this simple method:

The show function creates an object in our FreeCAD document and assigns our "edge" shape to it. Use this whenever it is time to display your creation on screen.

Hur skapar man en tråd?
en tråd kan skapas från en lista med kanter eller en lista med trådar:

A wire is a multi-edge line and can be created from a list of edges or even a list of wires:

Part.show(wire3) kommer att visa fyra linjer som bildar en kvadrat:

Hur skapar man en yta?
Endast ytor som skapats av stängda trådar är giltiga.

I detta exempel, så är wire3 en stängd tråd men wire2 är inte det (se ovan)

Only faces created from closed wires will be valid. In this example, wire3 is a closed wire but wire2 is not (see above):

Endast ytor har en area, inte trådar eller kanter.

Hur skapar man en cirkel?
circle = Part.makeCircle(radius,[center,dir_normal,angle1,angle2]) -- Skapa en cirkel med en given radie

Som standard är, center=Vektor(0,0,0), dir_normal=Vektor(0,0,1), angle1=0 och angle2=360.

En cirkel kan skapas så här:

A circle can be created like this:

Om du vill skapa den vid en viss position och med en viss riktning

cirkeln kommer att skapas med en distans 10 från nollpunkten i x och kommer att vara vänd mot x axeln.

Notera: makeCircle accepterar endast Base.Vector men inte tupler.

Du kan också skapa en cirkelbåge genom att ge start- och slutvinkel:

Både arc1 och arc2 kommer tillsammans skapa en cirkel.

Vinklar ska anges i grader, om du har radianer, konvertera det genom att använda formeln:

Grader = radianer * 180/PI

eller genom att använda python's math modul (efter att du importerat math, förstås):

grader = math.degrees(radianer)

Hur skapar man en cirkelbåge längs punkter?
Olyckligtvis så finns det ingen makeArc funktion men vi har Part.Arc funktionen för att skapa en cirkelbåge längs tre punkter.

Det kan antas vara en cirkelbåge som förenar start- och slutpunkt genom mittenpunkten.

Part.Arc skapar ett arc objekt på vilken .toShape måste kallas för att få kant objektet,

vilket i allmänhet skapas av makeLine eller makeCircle

Unfortunately there is no function, but we have the  function to create an arc through three points. It creates an arc object joining the start point to the end point through the middle point. The arc object's function must be called to get an edge object, the same as when using  instead of.

Notera: Arc accepterar endast Base.Vector för punkter men inte tupler.

arc_edge är vad vi vill ha, vilken vi kan visa med Part.show(arc_edge).

Om du vill ha en liten del av en cirkel som en cirkelbåge, så är det också möjligt:

Arcs are valid edges like lines, so they can be used in wires also.

Hur skapar man en polygon eller linje längs punkter?
En linje längs multipla punkter är inget annat än att skapa en tråd med multipla kanter.

makePolygon funktionen tar en lista med punkter och skapar en tråd längs dessa punkter:

A polygon is simply a wire with multiple straight edges. The function takes a list of points and creates a wire through those points:

Create a Bézier curve
Bézier curves are used to model smooth curves using a series of poles (points) and optional weights. The function below makes a from a series of  points. Note: when "getting" and "setting" a single pole or weight, indices start at 1, not 0.

Hur skapar man ett plan?
Ett plan är en platt yta, alltså en yta i 2D

makePlane(length,width,[start_pnt,dir_normal]) -- Skapa ett plan

Som standard start_pnt=Vector(0,0,0) och dir_normal=Vector(0,0,1).

dir_normal=Vector(0,0,1) kommer att skapa ett plan vinkelrätt mot z axeln.

dir_normal=Vector(1,0,0) kommer att skapa ett plan vinkelrätt mot x axeln:

A Plane is a flat rectangular surface. The method used to create one is. By default start_pnt = Vector(0, 0, 0) and dir_normal = Vector(0, 0, 1). Using dir_normal = Vector(0, 0, 1) will create the plane facing in the positive Z axis direction, while dir_normal = Vector(1, 0, 0) will create the plane facing in the positive X axis direction:

BoundBox är en kub som omsluter planet med en diagonal som startar vid (3,0,0) och slutar vid (5,0,2).

Här ar BoundBox tjockleken i y axeln noll.

Notera: makePlane accepterar endast Base.Vector för start_pnt och dir_normal men inte tupler

Hur skapar man en ellips?
För att skapa en ellips så finns det flera sätt:

There are several ways to create an ellipse:

Skapar en ellips med majorradie 2 och minorradie 1 med

centrum i (0,0,0)

skapa en kopia på den givna ellipsen

Skapar en ellips centrerad på punkten Center, där ellipsens plan är definierad av Center, S1 och S2, dess majoraxel är definierad av Center och S1, dess majorradie är avståndet mellan Center och S1, och dess minorradie är avståndet mellan S2 och majoraxeln.

Skapar en ellips med major och minor radierna MajorRadius och MinorRadius, och är placerad i det plan som definieras av Center och normalen (0,0,1)

I koden ovan så har vi gett S1, S2 och centrum. I likhet med Arc, så skapar Ellipse också ett ellipsobjekt men inte kant, så vi behöver konvertera den till en kant genom att använda toShape för att visa den

Note: Arc accepterar endast Base.Vector för punkter men inte tupler

För Ellipse konstruktören ovan så har vi gett center, MajorRadius och MinorRadius

Hur skapar man en Torus?
makeTorus(radius1,radius2,[pnt,dir,angle1,angle2,angle]) -- Skapa en torus med given radie och vinklar.

Som standard är pnt=Vector(0,0,0),dir=Vector(0,0,1),angle1=0,angle1=360 och angle=360

anse torus som en liten cirkel som sveper längs en stor cirkel:

radius1 den stora cirkelns radie, radius2 är den lilla cirkelns radie, pnt torusens centrum och dir är normalriktningen. angle1 och angle2 är vinklar i radianer för den lilla cirkeln, för att skapa en cirkelbåge den sista parametervinkeln är för att sektionera torusen:

Using. By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = 0, angle2 = 360 and angle = 360. Consider a torus as small circle sweeping along a big circle. Radius1 is the radius of the big circle, radius2 is the radius of the small circle, pnt is the center of the torus and dir is the normal direction. angle1 and angle2 are angles in degrees for the small circle; the last angle parameter is to make a section of the torus:

Ovanstående kod kommer att skapa en torus med diametern 20(radie 10) och tjocklek 4(lilla cirkelradien 2)

Ovanstående kod kommer att skapa en bit av en torus

Ovanstående kod kommer att skapa en semi torus, endast den sista parametern är ändrad d.v.s. vinkeln och de kvarvarande vinklarna är standardvärden.

Genom att ge vinkeln 180 så kommer en halvtorus att skapas

Hur skapar man en låda eller en kub?
makeBox(length,width,height,[pnt,dir]) -- Skapar en låda placerad i pnt med dimensionerna (längd,bredd,höjd)

Som standard är pnt=Vektor(0,0,0) och dir=Vektor(0,0,1)

Using. By default pnt = Vector(0, 0, 0) and dir = Vector(0, 0, 1).

Hur skapar man en sfär?
makeSphere(radius,[pnt, dir, angle1,angle2,angle3]) -- Skapa en sför med given radie.

Som standard är pnt=Vektor(0,0,0), dir=Vektor(0,0,1), angle1=-90, angle2=90 och angle3=360.

angle1 och angle2 är sfärens vertikala minimum och maximum ,

angle3 sfärdiametern

Using. By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 and angle3 = 360. Angle1 and angle2 are the vertical minimum and maximum of the sphere, angle3 is the sphere diameter.

Hur skapar men en Cylinder?
makeCylinder(radius,height,[pnt,dir,angle]) -- skapa en cylinder med given radie och höjd

Som standard är pnt=Vektor(0,0,0),dir=Vektor(0,0,1) och angle=360

Using. By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) and angle = 360.

Hur skapar man en Kon?
makeCone(radius1,radius2,height,[pnt,dir,angle]) -- skapa en kon med given radie och höjd

Som standard är pnt=Vector(0,0,0), dir=Vector(0,0,1) och angle=360

Using. By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) and angle = 360.

Modify shapes
There are several ways to modify shapes. Some are simple transformation operations such as moving or rotating shapes, others are more complex, such as unioning and subtracting one shape from another.

Translate a shape
Translating is the act of moving a shape from one place to another. Any shape (edge, face, cube, etc...) can be translated the same way:

This will move our shape "myShape" 2 units in the X direction.

Rotate a shape
To rotate a shape, you need to specify the rotation center, the axis, and the rotation angle:

The above code will rotate the shape 180 degrees around the Z Axis.

Matrix transformations
A matrix is a very convenient way to store transformations in the 3D world. In a single matrix, you can set translation, rotation and scaling values to be applied to an object. For example:

Note: FreeCAD matrixes work in radians. Also, almost all matrix operations that take a vector can also take three numbers, so these two lines do the same thing:

Once our matrix is set, we can apply it to our shape. FreeCAD provides two methods for doing that: and. The difference is that with the first one, you are sure that no deformations will occur (see Scaling a shape below). We can apply our transformation like this:

or

Scale a shape
Scaling a shape is a more dangerous operation because, unlike translation or rotation, scaling non-uniformly (with different values for X, Y and Z) can modify the structure of the shape. For example, scaling a circle with a higher value horizontally than vertically will transform it into an ellipse, which behaves mathematically very differently. For scaling, we cannot use the, we must use :

Hur klipper man ut en form från en annan?
cut(...)

Skillnaden mellan denna och en given topografisk form.

Subtracting a shape from another one is called "cut" in FreeCAD and is done like this:

Hur får man det gemensamma mellan två former?
common(...)

Skärning mellan denna och en given topografisk form.

The same way, the intersection between two shapes is called "common" and is done this way:

Hur förenar man två former?
fuse(...)

Förening av denna och en given topografisk form.

Union is called "fuse" and works the same way:

Hur man sektionerar en solid med given form?
section(...)

Sektionering av denna med en given topografisk form.

Kommer att returnera en skärningskurva, en compound med kanter

A "section" is the intersection between a solid shape and a plane shape. It will return an intersection curve, a compound curve composed of edges.

Extrusion
Extrusion is the act of "pushing" a flat shape in a certain direction, resulting in a solid body. Think of a circle becoming a tube by "pushing it out":

If your circle is hollow, you will obtain a hollow tube. If your circle is actually a disc with a filled face, you will obtain a solid cylinder:

Utforska former
du kan lätt utforska den topologiska datastrukturen:

You can easily explore the topological data structure:

Genom att skriva in ovanstående rader i python tolken, kommer du att få en god förståelse av Del objektens struktur. Här skapade vårt makeBox kommando en solid form. Denna solid, liksom alla Del solider, innehåller ytor. Ytor innehåller alltid trådar, vilka är listor på kanter som gränsar till ytan. Varje yta har exakt en stängd tråd. I tråden, så kan vi titta på varje kant separat, och inuti varje kant, så kan vi se hörnen. Raka kanter har förstås endast två hörn. Del Hörn är OCC former, men de har ett punktattribut vilket returnerar en snygg FreeCAD Vektor.

Utforska Kanter
I fallet Kanter, vilken är en godtycklig kurva, så är det mycket troligt att du vill göra en diskretisering. I FreeCAD så är kanterna parametriserade av dess längder. Det innebär att du kan gå en kant/kurva genom dess längd:

In case of an edge, which is an arbitrary curve, it's most likely you want to do a discretization. In FreeCAD the edges are parametrized by their lengths. That means you can walk an edge/curve by its length:

Nu kan du komma åt många av kantens egenskaper genom att använda längden som en position. Det betyder att om

kanten är 100mm lång så är startpositionen 0 och slutpositionen 100.

Använda valet
Här ser vi nu hur vi kan använda det val som användaren gjorde i visaren.

Först av allt så skapar vi en låda och visar den i visaren

Here we see now how we can use a selection the user did in the viewer. First of all we create a box and show it in the viewer.

Välj nu några ytor eller kanter. Med detta skript kan du

iterera alla valda objekt och deras delelement:

Välj några kanter och detta skript kommer att beräkna längden:

OCC flaskan
Ett typiskt exempel som finns på OpenCasCade Startsida är hur man bygger en flaska.

Detta är en god övning även för FreeCAD. Du kan faktiskt följa vårt exempel nedan och OCC sidan samtidigt, du kommer att få en god förståelse om hur OCC strukturer är implementerade i FreeCAD.

Hela skriptet nedan är även inkluderat i FreeCAD installationen (i Mod/Part mappen) och kan anropas från python tolken genom att skriva:

A typical example found on the OpenCasCade Technology website is how to build a bottle. This is a good exercise for FreeCAD too. In fact, if you follow our example below and the OCC page simultaneously, you will see how well OCC structures are implemented in FreeCAD. The script is included in the FreeCAD installation (inside the folder) and can be called from the Python interpreter by typing:

Det kompletta skriptet
Här är det kompletta MakeBottle skriptet:

For the purpose of this tutorial we will consider a reduced version of the script. In this version the bottle will not be hollowed out, and the neck of the bottle will not be threaded.

Detaljerad förklaring
Vi kommer förstås behöva Del modulen, men också FreeCAD.Base modulen, vilken innehåller grundläggande FreeCAD strukturer som vektorer och matriser.

Här definierar vi vår makeBottle funktion. Denna funktion kan anropas utan argument, som vi gjorde ovan, i vilket fall standardvärden för bredd, höjd, och tjocklek kommer att användas. Sedan så definierar vi ett par punkter som kommer att användas för att bygga vår grundprofil.

Här definierar vi själva geometrin: en cirkelbåge, gjord av 3 punkter, och två linjesegment, gjorda av 2 punkter.

Kommer du ihåg skillnaden mellan geometri och former? Här bygger vi former utifrån vår konstruktionsgeometri. 3 kanter (kanter kan vara raka eller krökta), sedan en tråd av dessa tre kanter.

Tills nu så har vi bara byggt en halv profil. Lättare än att bygga hela profilen på samma sätt, så behöver vi bara spegla det vi har gjort, och limma ihop båda halvorna. Så vi skapar först en matris. En matris är ett mycket vanligt sätt att tillämpa omvandlingar på objekt i 3D världen, eftersom den i en struktur kan innehålla alla grundläggande omvandlingar som 3D objekt kan påtvingas (flytta, rotera och skala). Här, efter att vi skapat matrisen, så speglar vi den, och vi skapar en kopia av vår tråd med tillämpning av vår omvandlingsmatris. Vi har nu två trådar, och vi kan göra en tredje tråd från dem, eftersom trådar egentligen är listor med kanter.

Nu när vi har en stängd tråd, så kan den omvandlas till en yta. När vi väl har en yta, så kan vi extrudera den. Genom att göra så, så skapar vi en solid. Sedan tillämpar vi en snygg liten fasning på vårt objekt för vi vill ha en bra design, eller hur?

När vår flaskas kropp är skapad, så behöver vi fortfarande skapa en hals. Så vi gör en ny solid, med en cylinder.

Ihopsmältningsoperationen, vilket i andra applikationer ibland kallas för förening, är mycket kraftfull. Den kommer att limma ihop det som behövs, och ta bort de delar som inte behövs.

Sedan så får vi tillbaka vår Del solid som ett resultat av vår funktion. Denna Del solid, liksom andra Del former, kan tillskrivas ett objekt i ett FreeCAD dokument, med:

eller, mer enkelt:

Example: Pierced box
Here is a complete example of building a pierced box.

The construction is done one side at a time. When the cube is finished, it is hollowed out by cutting a cylinder through it.

Ladda och spara
Det finns flera sätt att spara ditt arbetet i Del modulen. Du kan förstås spara ditt FreeCAD dokument, men du kan också spara Del objekt direkt till vanliga CAD format, som BREP, IGS, STEP och STL.

There are several ways to save your work. You can of course save your FreeCAD document, but you can also save Part objects directly to common CAD formats, such as BREP, IGS, STEP and STL.

Att spara en form till en fil är lätt. det finns exportBrep, exportIges, exportStl och exportStep metoder tillgängliga för alla form objekt. Så genom att göra:

detta kommer att spara vår låda i en STEP fil. För att ladda en BREP, IGES eller STEP fil, gör bara motsatsen:

To convert a STEP file to an IGS file: