Code snippets/sv

Denna sida innehåller exempel, delar, bitar av FreeCAD pythonkod som samlats ihop från användare och diskussioner på forumen. Läs och använd dem som en början för dina egna skript...

En typisk InitGui.py fil
Varje modul måste innehålla, förutom din huvudmodul fil, en InitGui.py fil, som ansvarar för insättningen av modulen i huvudgränssnittet. Detta är ett exempel på en enkel sådan.

class ScriptWorkbench (Workbench): MenuText = "Scripts" def Initialize(self): import Scripts # med antagandet att Scripts.py är din modul list = ["Script_Cmd"] # Den listan måste innehålla kommandonamn, som kan definieras i Scripts.py        self.appendToolbar("My Scripts",list) Gui.addWorkbench(ScriptWorkbench)

En typisk modulfil
Detta är ett exempel på en huvudmodulfil, som innehåller allt som din modul gör. Det är Scripts.py filen startad i föregående exempel. Du kan ha alla dina anpassade kommandon här.

import FreeCAD, FreeCADGui class ScriptCmd: def Activated(self): # Här kan du skriva vad din ScriptCmd gör... FreeCAD.Console.PrintMessage('Hello, World!') def GetResources(self): return {'Pixmap' : 'sökväg till en ikon/myicon.png', 'MenyText': 'Kort text', 'Verktygstips': 'Mer detaljerad text'} FreeCADGui.addCommand('Script_Cmd', ScriptCmd)

Importera en ny filtyp
Att skapa en importerare för en ny filtyp i FreeCAD är lätt. FreeCAD anser inte att du importerar data i ett öppnat dokument, utan snarare att du direkt kan öppna den nya filtypen. Så vad du behöver göra är att lägga till den nya filtypen till FreeCAD's lista på kända filtyper, och skriva koden som kommer att läsa filen och skapa de FreeCAD objekt som du vill:

Denna rad måste läggas till i InitGui.py filen för att lägga till den nya filtypen till listan:

FreeCAD.addImportType("Din nya filtyp (*.ext)","Import_Ext")
 * 1) Antar att Import_Ext.py är den fil som innehåller koden för att öppna och läsa .ext filer

Sedan i filen Import_Ext.py :

def open(filename): doc=App.newDocument # Här gör du allt som du behöver göra med filnamnet, läsa, klassificera data, skapa motsvarande FreeCAD objekt doc.recompute

För att exportera ditt dokument till någon ny filtyp fungerar på samma sätt, förutom att du använder:

FreeCAD.addExportType("Din nya FilTyp (*.ext)","Export_Ext")

Lägga till en linje
En linje har 2 punkter.

import Part,PartGui doc=App.activeDocument l=Part.Line l.StartPoint=(0.0,0.0,0.0) l.EndPoint=(1.0,1.0,1.0) doc.addObject("Part::Feature","Line").Shape=l.toShape doc.recompute
 * 1) Lägg till ett linjeelement till dokumentet och sätt dess punkter

Lägga till en polygon
En polygon ett set av ihopkopplade linjesegment (en polyline i AutoCAD). Den behöver inte vara stängd.

import Part,PartGui doc=App.activeDocument n=list v=App.Vector(0,0,0) n.append(v) v=App.Vector(10,0,0) n.append(v) p=doc.addObject("Part::Polygon","Polygon") p.Nodes=n doc.recompute
 * 1) skapa en 3D vektor, sätt dess koordinater och lägg till den i listan
 * 1) ... repetera för alla noder
 * 2) Skapa ett polygon objekt och sätt dess noder

Lägga till och ta bort ett objekt till/från en grupp
doc=App.activeDocument grp=doc.addObject("App::DocumentObjectGroup", "Group") lin=doc.addObject("Part::Feature", "Line") grp.addObject(lin) # lägger till lin objektet till gruppen grp grp.removeObject(lin) # tar bort lin objektet från gruppen grp

Notera: Du kan även lägga till andra grupper till en grupp...

Lägga till ett nät
import Mesh doc=App.activeDocument m = Mesh.Mesh m.addFacet(0.0,0.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0) m.addFacet(0.0,0.0,0.0, 0.0,1.0,1.0, 0.0,1.0,0.0) m.addFacet(0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,0.0,1.0) m.addFacet(0.0,0.0,0.0, 1.0,0.0,1.0, 0.0,0.0,1.0) m.addFacet(0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0) m.addFacet(0.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0) m.addFacet(0.0,1.0,0.0, 0.0,1.0,1.0, 1.0,1.0,1.0) m.addFacet(0.0,1.0,0.0, 1.0,1.0,1.0, 1.0,1.0,0.0) m.addFacet(0.0,1.0,1.0, 0.0,0.0,1.0, 1.0,0.0,1.0) m.addFacet(0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0) m.addFacet(1.0,1.0,0.0, 1.0,1.0,1.0, 1.0,0.0,1.0) m.addFacet(1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,0.0,0.0) m.scale(100.0) me=doc.addObject("Mesh::Feature","Cube") me.Mesh=m
 * 1) skapa ett nytt tomt nät
 * 1) bygg upp en låda av 12 ytor
 * 1) skala till en kantlängd av 100
 * 1) lägg till nätet till det aktiva dokumentet

Lägga till en cirkelbåge eller en cirkel
import Part doc = App.activeDocument c = Part.Circle c.Radius=10.0 f = doc.addObject("Part::Feature", "Circle") # skapa ett dokument med en cirkel f.Shape = c.toShape # Assignera cirkelformen till form egenskapen doc.recompute

Komma åt och ändra representationen av ett objekt
Varje objekt i ett FreeCAD dokument har ett associerat vy representationsobjekt som sparar alla parametrar som definierar hur objekten syns, som färg, linjebredd, etc...

gad=Gui.activeDocument  # kommer åt det aktiva dokumentet som innehåller alla # vy representationer av funktionerna i det # motsvarande App dokumentet v=gad.getObject("Cube")   # kommer åt viyrepresentationen av Nätfunktionen 'Cube' v.ShapeColor              # skriver färgen till skärmen v.ShapeColor=(1.0,1.0,1.0) # sätter formens färg till vit

Observation av mushändelser i 3D visaren via Python
Inventor ramverket tillåter att du lägger till en eller flera återanropsnoder vill visarens scengraf. som standard i FreeCAD är en återanropsnod installerad per visare vilket tillåter att du kan lägga till globala eller statiska C++ funktioner. I en lämplig Python bindning så erbjuds några metoder för att använda denna teknik inuti Python kod.

App.newDocument v=Gui.activeDocument.activeView class ViewObserver: def logPosition(self, info): down = (info["State"] == "DOWN") pos = info["Position"] if (down): FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[0])+")\n") o = ViewObserver c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)
 * 1) Denna klass loggar musknappshändelser. då den registrerade återanropsfunktionen anropar två gånger för 'ned' och
 * 2) 'upp' händelser så behöver vi en boolesk flagga för att hantera detta.

Klicka nu någonstans i 3D visaren och observera meddelandena i utmatningsfönstret. För att avsluta observationen, anropa bara

v.removeEventCallback("SoMouseButtonEvent",c)

Följande händelsetyper stöds


 * SoEvent -- alla sorts händelser
 * SoButtonEvent -- alla musknapps och tangentbordshändelser
 * SoLocation2Event -- 2D rörelsehändelser (normalt musförflyttningar)
 * SoMotion3Event -- 3D rörelsehändelser (normalt spaceball)
 * SoKeyboardEvent -- tangentbordsknapp ned och upphändelser
 * SoMouseButtonEvent -- musknapp ned och upphändelser
 * SoSpaceballButtonEvent -- spaceballknapp ned och upphändelser

Python funktionen som kan registreras med addEventCallback förväntar sig ett lexikon. Beroende på den övervakade händelsen så kan lexikonet innehålla olika nycklar. För alla händelser så har den nycklarna:
 * Type -- händelsetypens namn d.v.s. SoMouseEvent, SoLocation2Event, ...
 * Time -- nuvarande tid som en sträng
 * Position -- en tupel med två heltal, musposition
 * ShiftDown -- en boolesk, sann om Skift var nedtryckt, annars falsk
 * CtrlDown -- en boolesk, sann om CTRL var nedtryckt, annars falsk
 * AltDown -- en boolesk, sann om Alt var nedtryckt, annars falsk

För alla knapphändelser, d.v.s. tangentbord, mus eller spaceball händelser
 * State -- En sträng 'UP' om knappen var uppe, 'DOWN' om den var nera eller 'UNKNOWN' för alla andra fall

För tangentbordshändelser:
 * Key -- tecknet för den nedtryckta tangenten

För musknappshändelser
 * Button -- den nedtryckta knappen, kan vara BUTTON1, ..., BUTTON5 eller ANY

För spaceballhändelser:
 * Button -- den nedtryckta knappen, kan vara BUTTON1, ..., BUTTON7 eller ANY

Och slutligen rörelsehändelser:
 * Förflyttning -- en tupel med tre flyttal
 * Rotation -- en kvaternion för rotationen, d.v.s. en tupel med fyra flyttal

Manipulera scengrafen i Python
Det är också möjligt att hämta och ändra scengrafen i Python, med 'pivy' modulen -- en Python bindning för Coin.

from pivy.coin import *               # ladda pivy modulen view = Gui.ActiveDocument.ActiveView  # hämta den aktiva visaren root = view.getSceneGraph           # roten är en SoSeparator nod root.addChild(SoCube) view.fitAll

Pivy's Python API skapas med hjälp av verktyget SWIG. Då vi i FreeCAD använder några självskrivna noder så kan du inte skapa dem direkt i Python. Emellertid så är det möjligt att skapa en nod med dess interna namn. En instans av typen 'SoFCSelection' kan skapas med

type = SoType.fromName("SoFCSelection") node = type.createInstance

Lägga till och ta bort objekt till/från scengrafen
Addering av nya noder till scengrafen kan görass på detta sätt. Var noga med att alltid lägga till en SoSeparator för att innehålla geometrin, koordinaterna och materialinformationen på samma objekt. Följande exempel lägger till en röd linje från (0,0,0) till (10,0,0):

from pivy import coin sg = Gui.ActiveDocument.ActiveView.getSceneGraph co = coin.SoCoordinate3 pts = 0,0,0],[10,0,0 co.point.setValues(0,len(pts),pts) ma = coin.SoBaseColor ma.rgb = (1,0,0) li = coin.SoLineSet li.numVertices.setValue(2) no = coin.SoSeparator no.addChild(co) no.addChild(ma) no.addChild(li) sg.addChild(no)

För att ta bort den, skriv bara:

sg.removeChild(no)

Lägga till anpassade widgetar till gränssnittet
Du kan skapa anpassade widgetar med Qt designer, omvandla dem till ett python skript, och sedan ladda dem till FreeCAD gränssnittet med PyQt4.

Den pythonkod som producerats av Ui pythonkompilatorn (det verktyg som konverterar qt-designer .ui file till pythonkod) ser i allmänhet ut så här (det är enkelt, du kan även skriva det direkt i python):

class myWidget_Ui(object): def setupUi(self, myWidget): myWidget.setObjectName("my Nice New Widget") myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size).expandedTo(myWidget.minimumSizeHint)) # sätter widgetens storlek self.label = QtGui.QLabel(myWidget) # skapar en etikett self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sätter dess storlek self.label.setObjectName("label") # sätter dess namn, så att den kan hittas genom dess namn def retranslateUi(self, draftToolbar): # inbyggd QT funktion som hanterar widgetarnas översättning myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))

Allt du sedan behöver göra är att skapa en referens till FreeCAD's Qt fönster, sätta in en anpassad widget i det, och "omvandla" denna widget till din med den Ui kod vi just gjorde:

app = QtGui.qApp FCmw = app.activeWindow # det aktiva qt fönstret, = freecad fönstret eftersom vi är inuti det myNewFreeCADWidget = QtGui.QDockWidget # skapa en ny dckwidget myNewFreeCADWidget.ui = myWidget_Ui # ladda Ui sriptet myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # ställ in ui FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # lägg till widgeten till huvudfönstret