883 lines
50 KiB
HTML
883 lines
50 KiB
HTML
<html><head><title>Topological data scripting/sv</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link type='text/css' href='wiki.css' rel='stylesheet'></head><body><h1>Topological data scripting/sv</h1></div>
|
|
|
|
<div id="mw-content-text" lang="sv" dir="ltr" class="mw-content-ltr"><hr/>
|
|
<div class="mw-parser-output"><table class="fcinfobox wikitable ct" >
|
|
<tr>
|
|
<td class="ctTitle">
|
|
<h3><span class="mw-headline" id="Tutorial"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Base_ExampleCommandModel.png" class="image"><img alt="Base ExampleCommandModel.png" src="32px-Base_ExampleCommandModel.png" width="32" height="30" srcset="/wiki/images/thumb/9/93/Base_ExampleCommandModel.png/48px-Base_ExampleCommandModel.png 1.5x, /wiki/images/9/93/Base_ExampleCommandModel.png 2x" /></a> Tutorial</span></h3>
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Topic
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">Programming
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Level
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">Intermediate
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Time to complete
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Author
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">FreeCAD version
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Example File(s)
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven">
|
|
</td></tr>
|
|
<tr>
|
|
<td class="ctToc"><br /><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
|
|
<ul>
|
|
<li class="toclevel-1"><a href="#Tutorial"><span class="tocnumber">1</span> <span class="toctext">Tutorial</span></a></li>
|
|
<li class="toclevel-1 tocsection-1"><a href="#Introduktion"><span class="tocnumber">2</span> <span class="toctext">Introduktion</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-2"><a href="#Klass_Diagram"><span class="tocnumber">2.1</span> <span class="toctext">Klass Diagram</span></a></li>
|
|
<li class="toclevel-2 tocsection-3"><a href="#Geometri"><span class="tocnumber">2.2</span> <span class="toctext">Geometri</span></a></li>
|
|
<li class="toclevel-2 tocsection-4"><a href="#Topologi"><span class="tocnumber">2.3</span> <span class="toctext">Topologi</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-5"><a href="#Exempel"><span class="tocnumber">3</span> <span class="toctext">Exempel</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-6"><a href="#Skapa_simpel_topologi"><span class="tocnumber">3.1</span> <span class="toctext">Skapa simpel topologi</span></a>
|
|
<ul>
|
|
<li class="toclevel-3 tocsection-7"><a href="#Skapa_Geometri"><span class="tocnumber">3.1.1</span> <span class="toctext">Skapa Geometri</span></a></li>
|
|
<li class="toclevel-3 tocsection-8"><a href="#Cirkelb.C3.A5ge"><span class="tocnumber">3.1.2</span> <span class="toctext">Cirkelbåge</span></a></li>
|
|
<li class="toclevel-3 tocsection-9"><a href="#Linje"><span class="tocnumber">3.1.3</span> <span class="toctext">Linje</span></a></li>
|
|
<li class="toclevel-3 tocsection-10"><a href="#S.C3.A4tta_ihop_allt"><span class="tocnumber">3.1.4</span> <span class="toctext">Sätta ihop allt</span></a></li>
|
|
<li class="toclevel-3 tocsection-11"><a href="#Skapa_ett_prisma"><span class="tocnumber">3.1.5</span> <span class="toctext">Skapa ett prisma</span></a></li>
|
|
<li class="toclevel-3 tocsection-12"><a href="#Show_it_all"><span class="tocnumber">3.1.6</span> <span class="toctext">Show it all</span></a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-13"><a href="#Skapa_grundtyper"><span class="tocnumber">4</span> <span class="toctext">Skapa grundtyper</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-14"><a href="#Kort_beskrivning"><span class="tocnumber">4.1</span> <span class="toctext">Kort beskrivning</span></a></li>
|
|
<li class="toclevel-2 tocsection-15"><a href="#Detaljerade_f.C3.B6rklaringar"><span class="tocnumber">4.2</span> <span class="toctext">Detaljerade förklaringar</span></a>
|
|
<ul>
|
|
<li class="toclevel-3 tocsection-16"><a href="#Creating_a_Vector"><span class="tocnumber">4.2.1</span> <span class="toctext">Creating a Vector</span></a></li>
|
|
<li class="toclevel-3 tocsection-17"><a href="#Hur_skapar_man_en_kant.3F"><span class="tocnumber">4.2.2</span> <span class="toctext">Hur skapar man en kant?</span></a></li>
|
|
<li class="toclevel-3 tocsection-18"><a href="#Putting_the_shape_on_screen"><span class="tocnumber">4.2.3</span> <span class="toctext">Putting the shape on screen</span></a></li>
|
|
<li class="toclevel-3 tocsection-19"><a href="#Hur_skapar_man_en_tr.C3.A5d.3F"><span class="tocnumber">4.2.4</span> <span class="toctext">Hur skapar man en tråd?</span></a></li>
|
|
<li class="toclevel-3 tocsection-20"><a href="#Hur_skapar_man_en_yta.3F"><span class="tocnumber">4.2.5</span> <span class="toctext">Hur skapar man en yta?</span></a></li>
|
|
<li class="toclevel-3 tocsection-21"><a href="#Hur_skapar_man_en_cirkel.3F"><span class="tocnumber">4.2.6</span> <span class="toctext">Hur skapar man en cirkel?</span></a></li>
|
|
<li class="toclevel-3 tocsection-22"><a href="#Hur_skapar_man_en_cirkelb.C3.A5ge_l.C3.A4ngs_punkter.3F"><span class="tocnumber">4.2.7</span> <span class="toctext">Hur skapar man en cirkelbåge längs punkter?</span></a></li>
|
|
<li class="toclevel-3 tocsection-23"><a href="#Hur_skapar_man_en_polygon_eller_linje_l.C3.A4ngs_punkter.3F"><span class="tocnumber">4.2.8</span> <span class="toctext">Hur skapar man en polygon eller linje längs punkter?</span></a></li>
|
|
<li class="toclevel-3 tocsection-24"><a href="#Creating_a_Bezier_curve"><span class="tocnumber">4.2.9</span> <span class="toctext">Creating a Bezier curve</span></a></li>
|
|
<li class="toclevel-3 tocsection-25"><a href="#Hur_skapar_man_ett_plan.3F"><span class="tocnumber">4.2.10</span> <span class="toctext">Hur skapar man ett plan?</span></a></li>
|
|
<li class="toclevel-3 tocsection-26"><a href="#Hur_skapar_man_en_ellips.3F"><span class="tocnumber">4.2.11</span> <span class="toctext">Hur skapar man en ellips?</span></a></li>
|
|
<li class="toclevel-3 tocsection-27"><a href="#Hur_skapar_man_en_Torus.3F"><span class="tocnumber">4.2.12</span> <span class="toctext">Hur skapar man en Torus?</span></a></li>
|
|
<li class="toclevel-3 tocsection-28"><a href="#Hur_skapar_man_en_l.C3.A5da_eller_en_kub.3F"><span class="tocnumber">4.2.13</span> <span class="toctext">Hur skapar man en låda eller en kub?</span></a></li>
|
|
<li class="toclevel-3 tocsection-29"><a href="#Hur_skapar_man_en_sf.C3.A4r.3F"><span class="tocnumber">4.2.14</span> <span class="toctext">Hur skapar man en sfär?</span></a></li>
|
|
<li class="toclevel-3 tocsection-30"><a href="#Hur_skapar_men_en_Cylinder.3F"><span class="tocnumber">4.2.15</span> <span class="toctext">Hur skapar men en Cylinder?</span></a></li>
|
|
<li class="toclevel-3 tocsection-31"><a href="#Hur_skapar_man_en_Kon.3F"><span class="tocnumber">4.2.16</span> <span class="toctext">Hur skapar man en Kon?</span></a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-32"><a href="#Modifying_shapes"><span class="tocnumber">5</span> <span class="toctext">Modifying shapes</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-33"><a href="#Transform_operations"><span class="tocnumber">5.1</span> <span class="toctext">Transform operations</span></a>
|
|
<ul>
|
|
<li class="toclevel-3 tocsection-34"><a href="#Translating_a_shape"><span class="tocnumber">5.1.1</span> <span class="toctext">Translating a shape</span></a></li>
|
|
<li class="toclevel-3 tocsection-35"><a href="#Rotating_a_shape"><span class="tocnumber">5.1.2</span> <span class="toctext">Rotating a shape</span></a></li>
|
|
<li class="toclevel-3 tocsection-36"><a href="#Generic_transformations_with_matrixes"><span class="tocnumber">5.1.3</span> <span class="toctext">Generic transformations with matrixes</span></a></li>
|
|
<li class="toclevel-3 tocsection-37"><a href="#Scaling_a_shape"><span class="tocnumber">5.1.4</span> <span class="toctext">Scaling a shape</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-2 tocsection-38"><a href="#Booleska_Operationer"><span class="tocnumber">5.2</span> <span class="toctext">Booleska Operationer</span></a>
|
|
<ul>
|
|
<li class="toclevel-3 tocsection-39"><a href="#Hur_klipper_man_ut_en_form_fr.C3.A5n_en_annan.3F"><span class="tocnumber">5.2.1</span> <span class="toctext">Hur klipper man ut en form från en annan?</span></a></li>
|
|
<li class="toclevel-3 tocsection-40"><a href="#Hur_f.C3.A5r_man_det_gemensamma_mellan_tv.C3.A5_former.3F"><span class="tocnumber">5.2.2</span> <span class="toctext">Hur får man det gemensamma mellan två former?</span></a></li>
|
|
<li class="toclevel-3 tocsection-41"><a href="#Hur_f.C3.B6renar_man_tv.C3.A5_former.3F"><span class="tocnumber">5.2.3</span> <span class="toctext">Hur förenar man två former?</span></a></li>
|
|
<li class="toclevel-3 tocsection-42"><a href="#Hur_man_sektionerar_en_solid_med_given_form.3F"><span class="tocnumber">5.2.4</span> <span class="toctext">Hur man sektionerar en solid med given form?</span></a></li>
|
|
<li class="toclevel-3 tocsection-43"><a href="#Extrusion"><span class="tocnumber">5.2.5</span> <span class="toctext">Extrusion</span></a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-44"><a href="#Utforska_former"><span class="tocnumber">6</span> <span class="toctext">Utforska former</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-45"><a href="#Utforska_Kanter"><span class="tocnumber">6.1</span> <span class="toctext">Utforska Kanter</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-46"><a href="#Anv.C3.A4nda_valet"><span class="tocnumber">7</span> <span class="toctext">Använda valet</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-47"><a href="#OCC_flaskan"><span class="tocnumber">7.1</span> <span class="toctext">OCC flaskan</span></a>
|
|
<ul>
|
|
<li class="toclevel-3 tocsection-48"><a href="#Det_kompletta_skriptet"><span class="tocnumber">7.1.1</span> <span class="toctext">Det kompletta skriptet</span></a></li>
|
|
<li class="toclevel-3 tocsection-49"><a href="#Detaljerad_f.C3.B6rklaring"><span class="tocnumber">7.1.2</span> <span class="toctext">Detaljerad förklaring</span></a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-50"><a href="#Box_pierced"><span class="tocnumber">8</span> <span class="toctext">Box pierced</span></a></li>
|
|
<li class="toclevel-1 tocsection-51"><a href="#Ladda_och_spara"><span class="tocnumber">9</span> <span class="toctext">Ladda och spara</span></a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
</td></tr></table>
|
|
<p><br />
|
|
</p><p><br />
|
|
This page describes several methods for creating and modifying <a href="Part_Module.html" title="Part Module">Part shapes</a> from python. Before reading this page, if you are new to python, it is a good idea to read about <a href="Introduction_to_Python.html" title="Introduction to Python">python scripting</a> and <a href="FreeCAD_Scripting_Basics.html" title="FreeCAD Scripting Basics">how python scripting works in FreeCAD</a>.
|
|
</p>
|
|
<div class="mw-translate-fuzzy">
|
|
<h2><span class="mw-headline" id="Introduktion">Introduktion</span></h2>
|
|
<p>Här kommer vi att förklara hur du kontrollerar <a href="https://www.freecadweb.org/wiki/index.php?title=Part_Module/sv" title="Part Module/sv">Del Modulen</a> direkt från FreeCADs python tolk, eller från ett externt skript. Titta igenom <a href="https://www.freecadweb.org/wiki/index.php?title=Scripting/sv" class="mw-redirect" title="Scripting/sv">Skript</a> avsnittet och <a href="https://www.freecadweb.org/wiki/index.php?title=FreeCAD_Scripting_Basics/sv" title="FreeCAD Scripting Basics/sv">FreeCAD Skript grunder</a> sidorna om du behöver mer information om hur python skript fungerar i FreeCAD.
|
|
</p><p><br />
|
|
För att kunna använda Delmodulens funktioner så måste du ladda Del modulen i tolken:
|
|
</p><p><code>
|
|
import Part
|
|
</code>
|
|
</p>
|
|
</div>
|
|
<h3><span class="mw-headline" id="Klass_Diagram">Klass Diagram</span></h3>
|
|
<p>Detta är en UML översikt över de viktigaste klasserna i Del modulen:
|
|
</p>
|
|
<div class="center"><div class="floatnone"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Part_Classes.jpg" class="image" title="Python klasser i Del modulen"><img alt="Python klasser i Del modulen" src="Part_Classes.jpg" width="744" height="520" /></a></div></div>
|
|
<div class="mw-translate-fuzzy">
|
|
<h3><span class="mw-headline" id="Geometri">Geometri</span></h3>
|
|
<p>De geomtriska objekten är byggblocken för alla topologiska objekt:
|
|
</p>
|
|
<ul><li> <b>GEOM</b> Basklass för geometriska objekt</li></ul>
|
|
<ul><li> <b>LINE</b> En rak linje i 3D, definierad av en start- och en slutpunkt</li></ul>
|
|
<ul><li> <b>CIRCLE</b> Cirkel eller cirkelsegment som definieras av en centrumpunkt, start- och en slutpunkt</li></ul>
|
|
<ul><li> <b>......</b> Och snart lite mer</li></ul>
|
|
</div>
|
|
<h3><span class="mw-headline" id="Topologi">Topologi</span></h3>
|
|
<p>Följande topologiska datatyper finns tillgängliga:
|
|
</p>
|
|
<ul><li> <b>COMPOUND</b> En grupp av valfri typ av topologiska objekt.</li>
|
|
<li> <b>COMPSOLID</b> En kompositsolid är ett set av solider ihopkopplade genom dess ytor. Det expanderar begreppen WIRE och SHELL till solider.</li>
|
|
<li> <b>SOLID</b> En rymd som är begränsad av skal. Den är tredimensionell.</li>
|
|
<li> <b>SHELL</b> Ett set av ytor ihopkopplade genom dess kanter. Ett skal kan vara öppet eller slutet.</li>
|
|
<li> <b>FACE</b> 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.</li>
|
|
<li> <b>WIRE</b> 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.</li>
|
|
<li> <b>EDGE</b> Ett topologiskt element som motsvarar en begränsad kurva. En kant är vanligtvis begränsad av hörn. Det har en dimension.</li>
|
|
<li> <b>VERTEX</b> Ett topologiskt element som motsvarar en punkt. Dess dimension är noll.</li>
|
|
<li> <b>SHAPE</b> En allmän term som täcker allt ovan.</li></ul>
|
|
<h2><span class="mw-headline" id="Exempel">Exempel</span></h2>
|
|
<h3><span class="mw-headline" id="Skapa_simpel_topologi">Skapa simpel topologi</span></h3>
|
|
<div class="mw-translate-fuzzy">
|
|
<div class="floatright"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Wire.png" class="image" title="Wire"><img alt="Wire" src="Wire.png" width="260" height="137" /></a></div>
|
|
</div>
|
|
<p><br />
|
|
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.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Skapa_Geometri">Skapa Geometri</span></h4>
|
|
<p>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å <b>samma</b> position. Annars kanske vi inte kan koppla ihop
|
|
de geometriska delarna till en topologi!
|
|
</p><p>Så vi skapar punkterna först:
|
|
</p>
|
|
<pre>from FreeCAD import Base
|
|
V1 = Base.Vector(0,10,0)
|
|
V2 = Base.Vector(30,10,0)
|
|
V3 = Base.Vector(30,-10,0)
|
|
V4 = Base.Vector(0,-10,0) </pre>
|
|
<h4><span class="mw-headline" id="Cirkelb.C3.A5ge">Cirkelbåge</span></h4>
|
|
<div class="mw-translate-fuzzy">
|
|
<div class="floatright"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Circel.png" class="image" title="Circle"><img alt="Circle" src="Circel.png" width="111" height="135" /></a></div>
|
|
</div>
|
|
<p><br />
|
|
För att skapa en cirkelbåge så skapar vi en hjälppunkt och skapar cirkelbågen
|
|
genom tre punkter:
|
|
</p>
|
|
<pre>VC1 = Base.Vector(-10,0,0)
|
|
C1 = Part.Arc(V1,VC1,V4)
|
|
# and the second one
|
|
VC2 = Base.Vector(40,0,0)
|
|
C2 = Part.Arc(V2,VC2,V3) </pre>
|
|
<h4><span class="mw-headline" id="Linje">Linje</span></h4>
|
|
<div class="mw-translate-fuzzy">
|
|
<div class="floatright"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Line.png" class="image" title="Line"><img alt="Line" src="Line.png" width="175" height="76" /></a></div>
|
|
</div>
|
|
<p><br />
|
|
</p>
|
|
<div class="mw-translate-fuzzy">
|
|
<p>Linjen kan skapas mycket lätt ur punkterna:
|
|
</p>
|
|
</div>
|
|
<pre>L1 = Part.LineSegment(V1,V2)
|
|
# and the second one
|
|
L2 = Part.LineSegment(V3,V4) </pre>
|
|
<p><i>Note: in FreeCAD 0.16 Part.Line was used, for FreeCAD 0.17 Part.LineSegment has to be used</i>
|
|
</p>
|
|
<h4><span class="mw-headline" id="S.C3.A4tta_ihop_allt">Sätta ihop allt</span></h4>
|
|
<p>Det sista steget är att sätta ihop den geometriska grundelementen
|
|
och baka en topologisk form:
|
|
</p>
|
|
<pre>S1 = Part.Shape([C1,L1,C2,L2]) </pre>
|
|
<h4><span class="mw-headline" id="Skapa_ett_prisma">Skapa ett prisma</span></h4>
|
|
<p>Extrudera nu tråden i en riktning och skapa en äkta 3D form:
|
|
</p>
|
|
<pre>W = Part.Wire(S1.Edges)
|
|
P = W.extrude(Base.Vector(0,0,10)) </pre>
|
|
<h4><span class="mw-headline" id="Show_it_all">Show it all</span></h4>
|
|
<pre>Part.show(P) </pre>
|
|
<h2><span class="mw-headline" id="Skapa_grundtyper">Skapa grundtyper</span></h2>
|
|
<h3><span class="mw-headline" id="Kort_beskrivning">Kort beskrivning</span></h3>
|
|
<p>Du kan lätt skapa enkla topologiska objekt med "make...()" metoden från Del Modulen:
|
|
</p>
|
|
<pre>b = Part.makeBox(100,100,100)
|
|
Part.show(b) </pre>
|
|
<p>Några andra make...() metoder fom finns:
|
|
</p>
|
|
<ul><li> 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)</li>
|
|
<li> 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</li>
|
|
<li> makeCompound(list) -- Skapar en compound från en lista med former (shapes)</li>
|
|
<li> 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</li>
|
|
<li> 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</li>
|
|
<li> makeLine((x1,y1,z1),(x2,y2,z2)) -- Skapa en linje mellan två punkter</li>
|
|
<li> 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)</li>
|
|
<li> makePolygon(list) -- Skapa en polygon från en lista med punkter</li>
|
|
<li> 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</li>
|
|
<li> 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</li></ul>
|
|
<p>See the <a href="Part_API.html" title="Part API">Part API</a> page for a complete list of available methods of the Part module.
|
|
</p>
|
|
<h3><span class="mw-headline" id="Detaljerade_f.C3.B6rklaringar">Detaljerade förklaringar</span></h3>
|
|
<p>Importera först följande:
|
|
</p>
|
|
<pre>import Part
|
|
from FreeCAD import Base </pre>
|
|
<h4><span class="mw-headline" id="Creating_a_Vector">Creating a Vector</span></h4>
|
|
<p><a rel="nofollow" class="external text" href="http://en.wikipedia.org/wiki/Euclidean_vector">Vectors</a> are one of the most
|
|
important pieces of information when building shapes. They contain a 3 numbers
|
|
usually (but not necessarily always) the x, y and z cartesian coordinates. You
|
|
create a vector like this:
|
|
</p>
|
|
<pre>myVector = Base.Vector(3,2,0) </pre>
|
|
<p>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 acually nothing else than a container
|
|
for a vector. You access the vector of a vertex like this:
|
|
</p>
|
|
<pre>myVertex = myShape.Vertexes[0]
|
|
print myVertex.Point
|
|
> Vector (3, 2, 0) </pre>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_kant.3F">Hur skapar man en kant?</span></h4>
|
|
<p>En kant är inget annat än en linje med två hörn:
|
|
</p>
|
|
<pre>edge = Part.makeLine((0,0,0), (10,0,0))
|
|
edge.Vertexes
|
|
> [<Vertex object at 01877430>, <Vertex object at 014888E0>] </pre>
|
|
<p>Notera: Du kan inte skapa en kant som passerar två hörn.
|
|
</p>
|
|
<pre>vec1 = Base.Vector(0,0,0)
|
|
vec2 = Base.Vector(10,0,0)
|
|
line = Part.LineSegment(vec1,vec2)
|
|
edge = line.toShape() </pre>
|
|
<p>Du kan hitta en kants längd och centrum så här:
|
|
</p>
|
|
<pre>edge.Length
|
|
> 10.0
|
|
edge.CenterOfMass
|
|
> Vector (5, 0, 0) </pre>
|
|
<h4><span class="mw-headline" id="Putting_the_shape_on_screen">Putting the shape on screen</span></h4>
|
|
<p>So far we created an edge object, but it doesn't appear anywhere on screen.
|
|
This is because we just manipulated python objects here. The FreeCAD 3D scene
|
|
only displays what you tell it to display. To do that, we use this simple
|
|
method:
|
|
</p>
|
|
<pre>Part.show(edge) </pre>
|
|
<p>An object will be created in our FreeCAD document, and our "edge" shape
|
|
will be attributed to it. Use this whenever it's time to display your
|
|
creation on screen.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_tr.C3.A5d.3F">Hur skapar man en tråd?</span></h4>
|
|
<p>en tråd kan skapas från en lista med kanter eller en lista med trådar:
|
|
</p>
|
|
<pre>edge1 = Part.makeLine((0,0,0), (10,0,0))
|
|
edge2 = Part.makeLine((10,0,0), (10,10,0))
|
|
wire1 = Part.Wire([edge1,edge2])
|
|
edge3 = Part.makeLine((10,10,0), (0,10,0))
|
|
edge4 = Part.makeLine((0,10,0), (0,0,0))
|
|
wire2 = Part.Wire([edge3,edge4])
|
|
wire3 = Part.Wire([wire1,wire2])
|
|
wire3.Edges
|
|
> [<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>, <Edge object at 0190A788>]
|
|
Part.show(wire3) </pre>
|
|
<p>Part.show(wire3) kommer att visa fyra linjer som bildar en kvadrat:
|
|
</p>
|
|
<pre>wire3.Length
|
|
> 40.0
|
|
wire3.CenterOfMass
|
|
> Vector (5, 5, 0)
|
|
wire3.isClosed()
|
|
> True
|
|
wire2.isClosed()
|
|
> False </pre>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_yta.3F">Hur skapar man en yta?</span></h4>
|
|
<p>Endast ytor som skapats av stängda trådar är giltiga.
|
|
</p><p>I detta exempel, så är wire3 en stängd tråd men wire2 är inte det (se ovan)
|
|
</p>
|
|
<pre>face = Part.Face(wire3)
|
|
face.Area
|
|
> 99.999999999999972
|
|
face.CenterOfMass
|
|
> Vector (5, 5, 0)
|
|
face.Length
|
|
> 40.0
|
|
face.isValid()
|
|
> True
|
|
sface = Part.Face(wire2)
|
|
face.isValid()
|
|
> False </pre>
|
|
<p>Endast ytor har en area, inte trådar eller kanter.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_cirkel.3F">Hur skapar man en cirkel?</span></h4>
|
|
<p>circle = Part.makeCircle(radius,[center,dir_normal,angle1,angle2]) -- Skapa en cirkel med en given radie
|
|
</p><p>Som standard är, center=Vektor(0,0,0), dir_normal=Vektor(0,0,1), angle1=0 och angle2=360.
|
|
</p><p>En cirkel kan skapas så här:
|
|
</p>
|
|
<pre>circle = Part.makeCircle(10)
|
|
circle.Curve
|
|
> Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1)) </pre>
|
|
<p>Om du vill skapa den vid en viss position och med en viss riktning
|
|
</p>
|
|
<pre>ccircle = Part.makeCircle(10, Base.Vector(10,0,0), Base.Vector(1,0,0))
|
|
ccircle.Curve
|
|
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0)) </pre>
|
|
<p>cirkeln kommer att skapas med en distans 10 från nollpunkten i x och kommer att vara vänd mot x axeln.
|
|
</p><p>Notera: makeCircle accepterar endast Base.Vector() men inte tupler.
|
|
</p><p>Du kan också skapa en cirkelbåge genom att ge start- och slutvinkel:
|
|
</p>
|
|
<pre>from math import pi
|
|
arc1 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 0, 180)
|
|
arc2 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 180, 360) </pre>
|
|
<p>Både arc1 och arc2 kommer tillsammans skapa en cirkel.
|
|
</p><p>Vinklar ska anges i grader, om du har radianer, konvertera det genom att använda formeln:
|
|
</p><p>Grader = radianer * 180/PI
|
|
</p><p>eller genom att använda python's math modul (efter att du importerat math, förstås):
|
|
</p><p>grader = math.degrees(radianer)
|
|
</p>
|
|
<pre>degrees = math.degrees(radians) </pre>
|
|
<div class="mw-translate-fuzzy">
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_cirkelb.C3.A5ge_l.C3.A4ngs_punkter.3F">Hur skapar man en cirkelbåge längs punkter?</span></h4>
|
|
<p>Olyckligtvis så finns det ingen makeArc funktion men vi har Part.Arc funktionen för att skapa en cirkelbåge längs tre punkter.
|
|
</p><p>Det kan antas vara en cirkelbåge som förenar start- och slutpunkt genom mittenpunkten.
|
|
</p><p>Part.Arc skapar ett arc objekt på vilken .toShape() måste kallas för att få kant objektet,
|
|
</p><p>vilket i allmänhet skapas av makeLine eller makeCircle
|
|
</p>
|
|
</div>
|
|
<pre>arc = Part.Arc(Base.Vector(0,0,0),Base.Vector(0,5,0),Base.Vector(5,5,0))
|
|
arc
|
|
> <Arc object>
|
|
arc_edge = arc.toShape() </pre>
|
|
<p>Notera: Arc accepterar endast Base.Vector() för punkter men inte tupler.
|
|
</p><p>arc_edge är vad vi vill ha, vilken vi kan visa med Part.show(arc_edge).
|
|
</p><p>Om du vill ha en liten del av en cirkel som en cirkelbåge, så är det också möjligt:
|
|
</p>
|
|
<pre>from math import pi
|
|
circle = Part.Circle(Base.Vector(0,0,0),Base.Vector(0,0,1),10)
|
|
arc = Part.Arc(c,0,pi) </pre>
|
|
<p>Arcs are valid edges, like lines. So they can be used in wires too.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_polygon_eller_linje_l.C3.A4ngs_punkter.3F">Hur skapar man en polygon eller linje längs punkter?</span></h4>
|
|
<p>En linje längs multipla punkter är inget annat än att skapa en tråd med multipla kanter.
|
|
</p><p>makePolygon funktionen tar en lista med punkter och skapar en tråd längs dessa punkter:
|
|
</p>
|
|
<pre>lshape_wire = Part.makePolygon([Base.Vector(0,5,0),Base.Vector(0,0,0),Base.Vector(5,0,0)]) </pre>
|
|
<h4><span class="mw-headline" id="Creating_a_Bezier_curve">Creating a Bezier curve</span></h4>
|
|
<p>Bézier curves are used to model smooth curves using a series of poles (points) and optional weights. The function below makes a Part.BezierCurve from a series of FreeCAD.Vector points. (Note: when "getting" and "setting" a single pole or weight indices start at 1, not 0.)
|
|
</p>
|
|
<pre>def makeBCurveEdge(Points):
|
|
geomCurve = Part.BezierCurve()
|
|
geomCurve.setPoles(Points)
|
|
edge = Part.Edge(geomCurve)
|
|
return(edge) </pre>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_ett_plan.3F">Hur skapar man ett plan?</span></h4>
|
|
<p>Ett plan är en platt yta, alltså en yta i 2D
|
|
</p><p>makePlane(length,width,[start_pnt,dir_normal]) -- Skapa ett plan
|
|
</p><p>Som standard start_pnt=Vector(0,0,0) och dir_normal=Vector(0,0,1).
|
|
</p><p>dir_normal=Vector(0,0,1) kommer att skapa ett plan vinkelrätt mot z axeln.
|
|
</p><p>dir_normal=Vector(1,0,0) kommer att skapa ett plan vinkelrätt mot x axeln:
|
|
</p>
|
|
<pre>plane = Part.makePlane(2,2)
|
|
plane
|
|
><Face object at 028AF990>
|
|
plane = Part.makePlane(2,2, Base.Vector(3,0,0), Base.Vector(0,1,0))
|
|
plane.BoundBox
|
|
> BoundBox (3, 0, 0, 5, 0, 2) </pre>
|
|
<p>BoundBox är en kub som omsluter planet med en diagonal som startar vid (3,0,0) och slutar vid (5,0,2).
|
|
</p><p>Här ar BoundBox tjockleken i y axeln noll.
|
|
</p><p>Notera: makePlane accepterar endast Base.Vector() för start_pnt och dir_normal men inte tupler
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_ellips.3F">Hur skapar man en ellips?</span></h4>
|
|
<p>För att skapa en ellips så finns det flera sätt:
|
|
</p>
|
|
<pre>Part.Ellipse() </pre>
|
|
<p>Skapar en ellips med majorradie 2 och minorradie 1 med
|
|
</p><p>centrum i (0,0,0)
|
|
</p>
|
|
<pre>Part.Ellipse(Ellipse) </pre>
|
|
<p>skapa en kopia på den givna ellipsen
|
|
</p>
|
|
<pre>Part.Ellipse(S1,S2,Center) </pre>
|
|
<p>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.
|
|
</p>
|
|
<pre>Part.Ellipse(Center,MajorRadius,MinorRadius) </pre>
|
|
<p>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)
|
|
</p>
|
|
<pre>eli = Part.Ellipse(Base.Vector(10,0,0),Base.Vector(0,5,0),Base.Vector(0,0,0))
|
|
Part.show(eli.toShape()) </pre>
|
|
<p>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
|
|
</p><p>Note: Arc accepterar endast Base.Vector() för punkter men inte tupler
|
|
</p>
|
|
<pre>eli = Part.Ellipse(Base.Vector(0,0,0),10,5)
|
|
Part.show(eli.toShape()) </pre>
|
|
<p>För Ellipse konstruktören ovan så har vi gett center, MajorRadius och MinorRadius
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_Torus.3F">Hur skapar man en Torus?</span></h4>
|
|
<p>makeTorus(radius1,radius2,[pnt,dir,angle1,angle2,angle]) -- Skapa en torus med given radie och vinklar.
|
|
</p><p>Som standard är pnt=Vector(0,0,0),dir=Vector(0,0,1),angle1=0,angle1=360 och angle=360
|
|
</p><p>anse torus som en liten cirkel som sveper längs en stor cirkel:
|
|
</p><p>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:
|
|
</p>
|
|
<pre>torus = Part.makeTorus(10, 2) </pre>
|
|
<p>Ovanstående kod kommer att skapa en torus med diametern 20(radie 10) och tjocklek 4(lilla cirkelradien 2)
|
|
</p>
|
|
<pre>tor=Part.makeTorus(10,5,Base.Vector(0,0,0),Base.Vector(0,0,1),0,180) </pre>
|
|
<p>Ovanstående kod kommer att skapa en bit av en torus
|
|
</p>
|
|
<pre>tor=Part.makeTorus(10,5,Base.Vector(0,0,0),Base.Vector(0,0,1),0,360,180) </pre>
|
|
<p>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.
|
|
</p><p><br />
|
|
Genom att ge vinkeln 180 så kommer en halvtorus att skapas
|
|
</p>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_l.C3.A5da_eller_en_kub.3F">Hur skapar man en låda eller en kub?</span></h4>
|
|
<p>makeBox(length,width,height,[pnt,dir]) -- Skapar en låda placerad i pnt med dimensionerna (längd,bredd,höjd)
|
|
</p><p>Som standard är pnt=Vektor(0,0,0) och dir=Vektor(0,0,1)
|
|
</p>
|
|
<pre>box = Part.makeBox(10,10,10)
|
|
len(box.Vertexes)
|
|
> 8 </pre>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_sf.C3.A4r.3F">Hur skapar man en sfär?</span></h4>
|
|
<p>makeSphere(radius,[pnt, dir, angle1,angle2,angle3]) -- Skapa en sför med given radie.
|
|
</p><p>Som standard är pnt=Vektor(0,0,0), dir=Vektor(0,0,1), angle1=-90, angle2=90 och angle3=360.
|
|
</p><p>angle1 och angle2 är sfärens vertikala minimum och maximum ,
|
|
</p><p>angle3 sfärdiametern
|
|
</p>
|
|
<pre>sphere = Part.makeSphere(10)
|
|
hemisphere = Part.makeSphere(10,Base.Vector(0,0,0),Base.Vector(0,0,1),-90,90,180) </pre>
|
|
<h4><span class="mw-headline" id="Hur_skapar_men_en_Cylinder.3F">Hur skapar men en Cylinder?</span></h4>
|
|
<p>makeCylinder(radius,height,[pnt,dir,angle]) -- skapa en cylinder med given radie och höjd
|
|
</p><p>Som standard är pnt=Vektor(0,0,0),dir=Vektor(0,0,1) och angle=360
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cylinder = Part.makeCylinder(5,20)
|
|
partCylinder = Part.makeCylinder(5,20,Base.Vector(20,0,0),Base.Vector(0,0,1),180)</pre></div>
|
|
<h4><span class="mw-headline" id="Hur_skapar_man_en_Kon.3F">Hur skapar man en Kon?</span></h4>
|
|
<p>makeCone(radius1,radius2,height,[pnt,dir,angle]) -- skapa en kon med given radie och höjd
|
|
</p><p>Som standard är pnt=Vector(0,0,0), dir=Vector(0,0,1) och angle=360
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cone = Part.makeCone(10,0,20)
|
|
semicone = Part.makeCone(10,0,20,Base.Vector(20,0,0),Base.Vector(0,0,1),180)</pre></div>
|
|
<h2><span class="mw-headline" id="Modifying_shapes">Modifying shapes</span></h2>
|
|
<p>There are several ways to modify shapes. Some are simple transformation operations
|
|
such as moving or rotating shapes, other are more complex, such as unioning and
|
|
subtracting one shape from another. Be aware that
|
|
</p>
|
|
<h3><span class="mw-headline" id="Transform_operations">Transform operations</span></h3>
|
|
<h4><span class="mw-headline" id="Translating_a_shape">Translating a shape</span></h4>
|
|
<p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myShape = Part.makeBox(2,2,2)
|
|
myShape.translate(Base.Vector(2,0,0))</pre></div>
|
|
<p>This will move our shape "myShape" 2 units in the x direction.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Rotating_a_shape">Rotating a shape</span></h4>
|
|
<p>To rotate a shape, you need to specify the rotation center, the axis,
|
|
and the rotation angle:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myShape.rotate(Vector(0,0,0),Vector(0,0,1),180)</pre></div>
|
|
<p>The above code will rotate the shape 180 degrees around the Z Axis.
|
|
</p>
|
|
<h4><span class="mw-headline" id="Generic_transformations_with_matrixes">Generic transformations with matrixes</span></h4>
|
|
<p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myMat = Base.Matrix()
|
|
myMat.move(Base.Vector(2,0,0))
|
|
myMat.rotateZ(math.pi/2)</pre></div>
|
|
<p>Note: FreeCAD matrixes work in radians. Also, almost all matrix operations
|
|
that take a vector can also take 3 numbers, so those 2 lines do the same thing:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myMat.move(2,0,0)
|
|
myMat.move(Base.Vector(2,0,0))</pre></div>
|
|
<p>When our matrix is set, we can apply it to our shape. FreeCAD provides 2
|
|
methods to do that: transformShape() and transformGeometry(). The difference
|
|
is that with the first one, you are sure that no deformations will occur (see
|
|
"scaling a shape" below). So we can apply our transformation like this:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> myShape.trasformShape(myMat)</pre></div>
|
|
<p>or
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myShape.transformGeometry(myMat)</pre></div>
|
|
<h4><span class="mw-headline" id="Scaling_a_shape">Scaling a shape</span></h4>
|
|
<p>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
|
|
can't use the transformShape, we must use transformGeometry():
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>myMat = Base.Matrix()
|
|
myMat.scale(2,1,1)
|
|
myShape=myShape.transformGeometry(myMat)</pre></div>
|
|
<h3><span class="mw-headline" id="Booleska_Operationer">Booleska Operationer</span></h3>
|
|
<h4><span class="mw-headline" id="Hur_klipper_man_ut_en_form_fr.C3.A5n_en_annan.3F">Hur klipper man ut en form från en annan?</span></h4>
|
|
<p>cut(...)
|
|
</p><p>Skillnaden mellan denna och en given topografisk form.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cylinder = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0))
|
|
sphere = Part.makeSphere(5,Base.Vector(5,0,0))
|
|
diff = cylinder.cut(sphere)</pre></div>
|
|
<h4><span class="mw-headline" id="Hur_f.C3.A5r_man_det_gemensamma_mellan_tv.C3.A5_former.3F">Hur får man det gemensamma mellan två former?</span></h4>
|
|
<p>common(...)
|
|
</p><p>Skärning mellan denna och en given topografisk form.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0))
|
|
cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1))
|
|
common = cylinder1.common(cylinder2)</pre></div>
|
|
<h4><span class="mw-headline" id="Hur_f.C3.B6renar_man_tv.C3.A5_former.3F">Hur förenar man två former?</span></h4>
|
|
<p>fuse(...)
|
|
</p><p>Förening av denna och en given topografisk form.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0))
|
|
cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1))
|
|
fuse = cylinder1.fuse(cylinder2)</pre></div>
|
|
<h4><span class="mw-headline" id="Hur_man_sektionerar_en_solid_med_given_form.3F">Hur man sektionerar en solid med given form?</span></h4>
|
|
<p>section(...)
|
|
</p><p>Sektionering av denna med en given topografisk form.
|
|
</p><p><br />
|
|
Kommer att returnera en skärningskurva, en compound med kanter
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0))
|
|
cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1))
|
|
section = cylinder1.section(cylinder2)
|
|
section.Wires
|
|
> []
|
|
section.Edges
|
|
> [<Edge object at 0D87CFE8>, <Edge object at 019564F8>, <Edge object at 0D998458>,
|
|
<Edge object at 0D86DE18>, <Edge object at 0D9B8E80>, <Edge object at 012A3640>,
|
|
<Edge object at 0D8F4BB0>]</pre></div>
|
|
<h4><span class="mw-headline" id="Extrusion">Extrusion</span></h4>
|
|
<p>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":
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>circle = Part.makeCircle(10)
|
|
tube = circle.extrude(Base.Vector(0,0,2))</pre></div>
|
|
<p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>wire = Part.Wire(circle)
|
|
disc = Part.Face(wire)
|
|
cylinder = disc.extrude(Base.Vector(0,0,2))</pre></div>
|
|
<h2><span class="mw-headline" id="Utforska_former">Utforska former</span></h2>
|
|
<p>du kan lätt utforska den topologiska datastrukturen:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
b = Part.makeBox(100,100,100)
|
|
b.Wires
|
|
w = b.Wires[0]
|
|
w
|
|
w.Wires
|
|
w.Vertexes
|
|
Part.show(w)
|
|
w.Edges
|
|
e = w.Edges[0]
|
|
e.Vertexes
|
|
v = e.Vertexes[0]
|
|
v.Point</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<h3><span class="mw-headline" id="Utforska_Kanter">Utforska Kanter</span></h3>
|
|
<p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
box = Part.makeBox(100,100,100)
|
|
anEdge = box.Edges[0]
|
|
print anEdge.Length</pre></div>
|
|
<p>Nu kan du komma åt många av kantens egenskaper genom att använda längden som en position. Det betyder att om
|
|
</p><p>kanten är 100mm lång så är startpositionen 0 och slutpositionen 100.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>anEdge.tangentAt(0.0) # tangent direction at the beginning
|
|
anEdge.valueAt(0.0) # Point at the beginning
|
|
anEdge.valueAt(100.0) # Point at the end of the edge
|
|
anEdge.derivative1At(50.0) # first derivative of the curve in the middle
|
|
anEdge.derivative2At(50.0) # second derivative of the curve in the middle
|
|
anEdge.derivative3At(50.0) # third derivative of the curve in the middle
|
|
anEdge.centerOfCurvatureAt(50) # center of the curvature for that position
|
|
anEdge.curvatureAt(50.0) # the curvature
|
|
anEdge.normalAt(50) # normal vector at that position (if defined)</pre></div>
|
|
<h2><span class="mw-headline" id="Anv.C3.A4nda_valet">Använda valet</span></h2>
|
|
<p>Här ser vi nu hur vi kan använda det val som användaren gjorde i visaren.
|
|
</p><p>Först av allt så skapar vi en låda och visar den i visaren
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
Part.show(Part.makeBox(100,100,100))
|
|
Gui.SendMsgToActiveView("ViewFit")</pre></div>
|
|
<p>Välj nu några ytor eller kanter. Med detta skript kan du
|
|
</p><p>iterera alla valda objekt och deras delelement:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>for o in Gui.Selection.getSelectionEx():
|
|
print o.ObjectName
|
|
for s in o.SubElementNames:
|
|
print "name: ",s
|
|
for s in o.SubObjects:
|
|
print "object: ",s</pre></div>
|
|
<p>Välj några kanter och detta skript kommer att beräkna längden:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>length = 0.0
|
|
for o in Gui.Selection.getSelectionEx():
|
|
for s in o.SubObjects:
|
|
length += s.Length
|
|
print "Length of the selected edges:" ,length</pre></div>
|
|
<div class="mw-translate-fuzzy">
|
|
<h3><span class="mw-headline" id="OCC_flaskan">OCC flaskan</span></h3>
|
|
<p>Ett typiskt exempel som finns på <a rel="nofollow" class="external text" href="http://www.opencascade.org/org/gettingstarted/appli/">OpenCasCade Startsida</a> är hur man bygger en flaska.
|
|
</p><p>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.
|
|
</p><p><br />
|
|
</p><p>Hela skriptet nedan är även inkluderat i FreeCAD installationen (i Mod/Part mappen) och kan anropas från python tolken genom att skriva:
|
|
</p>
|
|
</div>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
import MakeBottle
|
|
bottle = MakeBottle.makeBottle()
|
|
Part.show(bottle)</pre></div>
|
|
<h4><span class="mw-headline" id="Det_kompletta_skriptet">Det kompletta skriptet</span></h4>
|
|
<p>Här är det kompletta MakeBottle skriptet:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part, FreeCAD, math
|
|
from FreeCAD import Base
|
|
|
|
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
|
|
aPnt1=Base.Vector(-myWidth/2.,0,0)
|
|
aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
|
|
aPnt3=Base.Vector(0,-myThickness/2.,0)
|
|
aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
|
|
aPnt5=Base.Vector(myWidth/2.,0,0)
|
|
|
|
aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
|
|
aSegment1=Part.LineSegment(aPnt1,aPnt2)
|
|
aSegment2=Part.LineSegment(aPnt4,aPnt5)
|
|
aEdge1=aSegment1.toShape()
|
|
aEdge2=aArcOfCircle.toShape()
|
|
aEdge3=aSegment2.toShape()
|
|
aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
|
|
|
|
aTrsf=Base.Matrix()
|
|
aTrsf.rotateZ(math.pi) # rotate around the z-axis
|
|
|
|
aMirroredWire=aWire.transformGeometry(aTrsf)
|
|
myWireProfile=Part.Wire([aWire,aMirroredWire])
|
|
myFaceProfile=Part.Face(myWireProfile)
|
|
aPrismVec=Base.Vector(0,0,myHeight)
|
|
myBody=myFaceProfile.extrude(aPrismVec)
|
|
myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
|
|
neckLocation=Base.Vector(0,0,myHeight)
|
|
neckNormal=Base.Vector(0,0,1)
|
|
myNeckRadius = myThickness / 4.
|
|
myNeckHeight = myHeight / 10
|
|
myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
|
|
myBody = myBody.fuse(myNeck)
|
|
|
|
faceToRemove = 0
|
|
zMax = -1.0
|
|
|
|
for xp in myBody.Faces:
|
|
try:
|
|
surf = xp.Surface
|
|
if type(surf) == Part.Plane:
|
|
z = surf.Position.z
|
|
if z > zMax:
|
|
zMax = z
|
|
faceToRemove = xp
|
|
except:
|
|
continue
|
|
|
|
myBody = myBody.makeFillet(myThickness/12.0,myBody.Edges)
|
|
|
|
return myBody
|
|
|
|
el = makeBottle()
|
|
Part.show(el)</pre></div>
|
|
<h4><span class="mw-headline" id="Detaljerad_f.C3.B6rklaring">Detaljerad förklaring</span></h4>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part, FreeCAD, math
|
|
from FreeCAD import Base</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
|
|
aPnt1=Base.Vector(-myWidth/2.,0,0)
|
|
aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
|
|
aPnt3=Base.Vector(0,-myThickness/2.,0)
|
|
aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
|
|
aPnt5=Base.Vector(myWidth/2.,0,0)</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
|
|
aSegment1=Part.LineSegment(aPnt1,aPnt2)
|
|
aSegment2=Part.LineSegment(aPnt4,aPnt5)</pre></div>
|
|
<p>Här definierar vi själva geometrin: en cirkelbåge, gjord av 3 punkter, och två linjesegment, gjorda av 2 punkter.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> aEdge1=aSegment1.toShape()
|
|
aEdge2=aArcOfCircle.toShape()
|
|
aEdge3=aSegment2.toShape()
|
|
aWire=Part.Wire([aEdge1,aEdge2,aEdge3])</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> aTrsf=Base.Matrix()
|
|
aTrsf.rotateZ(math.pi) # rotate around the z-axis
|
|
aMirroredWire=aWire.transformGeometry(aTrsf)
|
|
myWireProfile=Part.Wire([aWire,aMirroredWire])</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> myFaceProfile=Part.Face(myWireProfile)
|
|
aPrismVec=Base.Vector(0,0,myHeight)
|
|
myBody=myFaceProfile.extrude(aPrismVec)
|
|
myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)</pre></div>
|
|
<p>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?
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> neckLocation=Base.Vector(0,0,myHeight)
|
|
neckNormal=Base.Vector(0,0,1)
|
|
myNeckRadius = myThickness / 4.
|
|
myNeckHeight = myHeight / 10
|
|
myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> myBody = myBody.fuse(myNeck)</pre></div>
|
|
<p>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.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> return myBody</pre></div>
|
|
<div class="mw-translate-fuzzy">
|
|
<p>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:
|
|
</p>
|
|
</div>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>el = makeBottle()
|
|
Part.show(el)</pre></div>
|
|
<div class="mw-translate-fuzzy">
|
|
<p>eller, mer enkelt:
|
|
</p>
|
|
</div>
|
|
<h2><span class="mw-headline" id="Box_pierced">Box pierced</span></h2>
|
|
<p>Here a complete example of building a box pierced.
|
|
</p><p>The construction is done side by side and when the cube is finished, it is hollowed out of a cylinder through.
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Draft, Part, FreeCAD, math, PartGui, FreeCADGui, PyQt4
|
|
from math import sqrt, pi, sin, cos, asin
|
|
from FreeCAD import Base
|
|
|
|
size = 10
|
|
poly = Part.makePolygon( [ (0,0,0), (size, 0, 0), (size, 0, size), (0, 0, size), (0, 0, 0)])
|
|
|
|
face1 = Part.Face(poly)
|
|
face2 = Part.Face(poly)
|
|
face3 = Part.Face(poly)
|
|
face4 = Part.Face(poly)
|
|
face5 = Part.Face(poly)
|
|
face6 = Part.Face(poly)
|
|
|
|
myMat = FreeCAD.Matrix()
|
|
myMat.rotateZ(math.pi/2)
|
|
face2.transformShape(myMat)
|
|
face2.translate(FreeCAD.Vector(size, 0, 0))
|
|
|
|
myMat.rotateZ(math.pi/2)
|
|
face3.transformShape(myMat)
|
|
face3.translate(FreeCAD.Vector(size, size, 0))
|
|
|
|
myMat.rotateZ(math.pi/2)
|
|
face4.transformShape(myMat)
|
|
face4.translate(FreeCAD.Vector(0, size, 0))
|
|
|
|
myMat = FreeCAD.Matrix()
|
|
myMat.rotateX(-math.pi/2)
|
|
face5.transformShape(myMat)
|
|
|
|
face6.transformShape(myMat)
|
|
face6.translate(FreeCAD.Vector(0,0,size))
|
|
|
|
myShell = Part.makeShell([face1,face2,face3,face4,face5,face6])
|
|
|
|
mySolid = Part.makeSolid(myShell)
|
|
mySolidRev = mySolid.copy()
|
|
mySolidRev.reverse()
|
|
|
|
myCyl = Part.makeCylinder(2,20)
|
|
myCyl.translate(FreeCAD.Vector(size/2, size/2, 0))
|
|
|
|
cut_part = mySolidRev.cut(myCyl)
|
|
|
|
Part.show(cut_part)</pre></div>
|
|
<h2><span class="mw-headline" id="Ladda_och_spara">Ladda och spara</span></h2>
|
|
<p>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.
|
|
</p><p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
s = Part.makeBox(0,0,0,10,10,10)
|
|
s.exportStep("test.stp")</pre></div>
|
|
<p>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:
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>import Part
|
|
s = Part.Shape()
|
|
s.read("test.stp")</pre></div>
|
|
<p>To convert an <b>.stp</b> in <b>.igs</b> file simply :
|
|
</p>
|
|
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre> import Part
|
|
s = Part.Shape()
|
|
s.read("file.stp") # incoming file igs, stp, stl, brep
|
|
s.exportIges("file.igs") # outbound file igs</pre></div>
|
|
<p>Notera att import eller öppning av BREP, IGES eller STEP filer även kan göras direkt via Fil -> Öppna eller Fil -> Importera menyn. För närvarande är export fortfarande inte möjligt den vägen, men ska vara det snart.
|
|
</p>
|
|
|
|
<p><br />
|
|
</p>
|
|
<div style="clear:both"></div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div><div class="printfooter">
|
|
Online version: "<a dir="ltr" href="https://www.freecadweb.org/wiki/index.php?title=Topological_data_scripting/sv&oldid=289224">http://www.freecadweb.org/wiki/index.php?title=Topological_data_scripting/sv&oldid=289224</a>"</div>
|
|
<div id="catlinks" class="catlinks" data-mw="interface"></div><div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
<div id="mw-navigation">
|
|
<h2>Navigation menu</h2>
|
|
|
|
</body></html> |