Je suivais le projet Freecad depuis un certain temps, mais je commence tous juste à l'utiliser pour faire mes premiers scripts.
Pour résumé, j'utilise Freecad pour faire des petites pièces que j'intègre ensuite dans des plans 2D.
J'ai réussi a créer des script de pièces simples (1er code ci-dessous). Ce script (surement perfectible) me convient et met en plan la pièce créée.
Mais j’essaie de faire un programme (2ème code ci-dessous) qui met le document actif en plan, et là je tourne en rond. Il y encore beaucoup de chose que je ne comprend pas et j'aurais besoin d'aide sur ce point.
Code: Select all
# -*- coding:Utf-8 -*-
#####################################
# Importation de fonctions externes :
#from os import *
import FreeCAD, FreeCADGui, Part, Draft, math, MeshPart, Mesh, Drawing
from PyQt4 import QtGui,QtCore
from FreeCAD import Base
App=FreeCAD
Gui=FreeCADGui
##################################
# Défnition Class :
class Corniere:
def __init__(self, obj):
obj.addProperty("App::PropertyLength","L1","Corniere","Largeur 1").L1=20.0
obj.addProperty("App::PropertyLength","L2","Corniere","Largeur 2").L2=20.0
obj.addProperty("App::PropertyLength","e1","Corniere","Epaisseur 1").e1=2.0
#obj.addProperty("App::PropertyLength","e2","Corniere","Epaisseur 2").e2=2.0
obj.addProperty("App::PropertyLength","Longueur","Corniere","Longueur").Longueur=200.0
obj.Proxy = self
def execute(self, fp):
P1=Base.Vector(fp.e1,fp.e1,0)
S1=Part.makeBox(fp.L1,fp.L2,fp.Longueur)
S2=Part.makeBox(fp.L1-fp.e1,fp.L2-fp.e1,fp.Longueur,P1)
fp.Shape=S1.cut(S2)
##################################
# Défnition locale de fonctions :
def proceed():
QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor)
if FreeCAD.ActiveDocument==None:
FreeCAD.newDocument("Corniere")
oldDocumentObjects=App.ActiveDocument.Objects
try:
QL1 = float(l1.text())
QL2 = float(l2.text())
Qe = float(l3.text())
QLongueur = float(l4.text())
except:
FreeCAD.Console.PrintError("Wrong input! Only numbers allowed...\n")
Cor=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Corniere")
Corniere(Cor)
Cor.ViewObject.Proxy=0
App.ActiveDocument.Corniere.L1=QL1
App.ActiveDocument.Corniere.L2=QL2
App.ActiveDocument.Corniere.e1=Qe
App.ActiveDocument.Corniere.Longueur=QLongueur
App.ActiveDocument.recompute()
Gui.SendMsgToActiveView("ViewFit")
QtGui.qApp.restoreOverrideCursor()
Plan()
hide()
def hide():
dialog.hide()
def Plan():
ObjetProjete=App.ActiveDocument.Corniere.Shape
TailleX=ObjetProjete.BoundBox.XLength
TailleY=ObjetProjete.BoundBox.YLength
TailleZ=ObjetProjete.BoundBox.ZLength
App.activeDocument().addObject('Drawing::FeaturePage','Page')
App.activeDocument().Page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Nico.svg'
App.activeDocument().addObject('Drawing::FeatureViewPart','VueProfil')
App.activeDocument().VueProfil.Source = App.activeDocument().Corniere
App.activeDocument().VueProfil.Direction = (0.0,0.0,1.0)
App.activeDocument().VueProfil.Scale = 1.0
App.activeDocument().VueProfil.X = 50.0
App.activeDocument().VueProfil.Y = 50.0
App.activeDocument().Page.addObject(App.activeDocument().VueProfil)
App.activeDocument().addObject('Drawing::FeatureViewPart','Vuegauche')
App.activeDocument().Vuegauche.Source = App.activeDocument().Corniere
App.activeDocument().Vuegauche.Direction = (-1.0,0.0,0.0)
App.activeDocument().Vuegauche.ShowHiddenLines = True
App.activeDocument().Vuegauche.Scale = 1.0
App.activeDocument().Vuegauche.Rotation = 180.0
App.activeDocument().Vuegauche.X = 50.0+TailleX/2+TailleX
App.activeDocument().Vuegauche.Y = 50.0
App.activeDocument().Page.addObject(App.activeDocument().Vuegauche)
App.activeDocument().addObject('Drawing::FeatureViewPart','Vuedessus')
App.activeDocument().Vuedessus.Source = App.activeDocument().Corniere
App.activeDocument().Vuedessus.Direction = (0.0,-1.0,0.0)
App.activeDocument().Vuedessus.ShowHiddenLines = True
App.activeDocument().Vuedessus.Scale = 1.0
App.activeDocument().Vuedessus.Rotation = 180.0
App.activeDocument().Vuedessus.X = 50.0+TailleX/2+TailleX
App.activeDocument().Vuedessus.Y = 50.0+TailleX/2+TailleY+TailleX
App.activeDocument().Page.addObject(App.activeDocument().Vuedessus)
App.activeDocument().recompute()
PageFile = open(App.activeDocument().Page.PageResult,'r')
OutFile = open('C:/Documents and Settings/User/Bureau/temp.svg','w')
OutFile.write(PageFile.read())
del OutFile,PageFile
dialog = QtGui.QDialog()
dialog.resize(200,200)
dialog.setWindowTitle("Corniere")
la = QtGui.QVBoxLayout(dialog)
e1 = QtGui.QLabel("Dimessions de la corniere")
commentFont=QtGui.QFont("Arial",10,True)
e1.setFont(commentFont)
la.addWidget(e1)
t1 = QtGui.QLabel("L1")
la.addWidget(t1)
l1 = QtGui.QLineEdit()
l1.setText("20")
la.addWidget(l1)
t2 = QtGui.QLabel("L2")
la.addWidget(t2)
l2 = QtGui.QLineEdit()
l2.setText("20")
la.addWidget(l2)
t3 = QtGui.QLabel("e")
la.addWidget(t3)
l3 = QtGui.QLineEdit()
l3.setText("2")
la.addWidget(l3)
t4 = QtGui.QLabel("Longueur")
la.addWidget(t4)
l4 = QtGui.QLineEdit()
l4.setText("300")
la.addWidget(l4)
okbox = QtGui.QDialogButtonBox(dialog)
okbox.setOrientation(QtCore.Qt.Horizontal)
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
la.addWidget(okbox)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), proceed)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), hide)
QtCore.QMetaObject.connectSlotsByName(dialog)
dialog.show()
Code: Select all
def Plan():
ObjetProjete=App.ActiveDocument.ActiveObject.Shape
TailleX=ObjetProjete.BoundBox.XLength
TailleY=ObjetProjete.BoundBox.YLength
TailleZ=ObjetProjete.BoundBox.ZLength
App.activeDocument().addObject('Drawing::FeaturePage','Page')
App.activeDocument().Page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Nico.svg'
App.activeDocument().addObject('Drawing::FeatureViewPart','VueProfil')
App.activeDocument().VueProfil.Source = App.activeDocument().ActiveObject
App.activeDocument().VueProfil.Direction = (0.0,0.0,1.0)
App.activeDocument().VueProfil.Scale = 1.0
App.activeDocument().VueProfil.X = TailleZ+TailleX/2
App.activeDocument().VueProfil.Y = 3*TailleZ+TailleY/2
App.activeDocument().Page.addObject(App.activeDocument().VueProfil)
App.activeDocument().addObject('Drawing::FeatureViewPart','Vuegauche')
App.activeDocument().Vuegauche.Source = App.activeDocument().ActiveObject
App.activeDocument().Vuegauche.Direction = (-1.0,0.0,0.0)
App.activeDocument().Vuegauche.ShowHiddenLines = True
App.activeDocument().Vuegauche.Scale = 1.0
App.activeDocument().Vuegauche.Rotation = 180.0
App.activeDocument().Vuegauche.X = TailleX+2*TailleZ
App.activeDocument().Vuegauche.Y = 3*TailleZ+TailleY/2
App.activeDocument().Page.addObject(App.activeDocument().Vuegauche)
App.activeDocument().addObject('Drawing::FeatureViewPart','Vuedessus')
App.activeDocument().Vuedessus.Source = App.activeDocument().ActiveObject
App.activeDocument().Vuedessus.Direction = (0.0,-1.0,0.0)
App.activeDocument().Vuedessus.ShowHiddenLines = True
App.activeDocument().Vuedessus.Scale = 1.0
App.activeDocument().Vuedessus.Rotation = 90.0
App.activeDocument().Vuedessus.X = TailleZ+TailleX/2
App.activeDocument().Vuedessus.Y = 2*TailleZ
App.activeDocument().Page.addObject(App.activeDocument().Vuedessus)
App.activeDocument().addObject('Drawing::FeatureViewPart','VueIso')
App.activeDocument().VueIso.Source = App.activeDocument().ActiveObject
App.activeDocument().VueIso.Direction = (-1.0,-1.0,0.5)
App.activeDocument().VueIso.Scale = 1.0
App.activeDocument().VueIso.ShowSmoothLines = True
App.activeDocument().VueIso.X = TailleZ+TailleX/2
App.activeDocument().VueIso.Y = 7*TailleZ+3*TailleY
App.activeDocument().Page.addObject(App.activeDocument().VueIso)
App.activeDocument().recompute()
PageFile = open(App.activeDocument().Page.PageResult,'r')
OutFile = open('C:/Documents and Settings/User/Bureau/temp.svg','w')
OutFile.write(PageFile.read())
del OutFile,PageFile
Plan()
App.activeDocument().recompute()
Exception: FC++ exception thrown (The graph must be a DAG.)
Unhandled std::exception caught in GUIApplication::notify.
The error message is: The graph must be a DAG.
Sinon bravo pour votre travail avec Freecad, c'est déjà un outil puissant, et j’espère que le projet grandira encore...
Nico