Mise en Plan

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
nicotuf
Posts: 14
Joined: Mon Jul 20, 2009 1:51 pm

Mise en Plan

Post by nicotuf »

Bonjour,

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()
Message d'erreur obtenu :
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
galou_breizh
Posts: 436
Joined: Wed Sep 15, 2010 9:38 am

Re: Mise en Plan

Post by galou_breizh »

Bonjour,

le problème vient peut-être de "App.ActiveDocument.ActiveObject". Es-tu sûr que l'"ActiveObject" est bien l'objet souhaité et de type souhaité.

Concernant la perfectibilité de ta macro, effecitvement, il y a des choses à faire (ou plutôt ne pas faire). Tu utilises par exemple "App.ActiveDocument.Corniere". Ceci n'est pas bon puisque seul le premier object apparaît "App.ActiveDocument.Corniere" et à condition qu'il n'existe pas déjà un tel objet. Si tu appelles une deuxième fois ta macro, tu crées bien une deuxième cornière, mais tu modifies la première et tu fais les plans de la priemière cornière. J'ai corrigé ta macro ci-dessous:

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
   Cor.L1=QL1
   Cor.L2=QL2
   Cor.e1=Qe
   Cor.Longueur=QLongueur

   App.ActiveDocument.recompute()
   Gui.SendMsgToActiveView("ViewFit")

   QtGui.qApp.restoreOverrideCursor()
   
   Plan(Cor)
   
   dialog.hide()

def hide():

   dialog.hide()

def Plan(obj):

   ObjetProjete=obj.Shape

   TailleX=ObjetProjete.BoundBox.XLength
   TailleY=ObjetProjete.BoundBox.YLength
   TailleZ=ObjetProjete.BoundBox.ZLength

   page = App.activeDocument().addObject('Drawing::FeaturePage','Page')
   page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Landscape.svg'   
   vueprofil = App.activeDocument().addObject('Drawing::FeatureViewPart','VueProfil')
   vueprofil.Source = obj
   vueprofil.Direction = (0.0,0.0,1.0)
   vueprofil.Scale = 1.0
   vueprofil.X = 50.0
   vueprofil.Y = 50.0
   page.addObject(vueprofil)

   vuegauche = App.activeDocument().addObject('Drawing::FeatureViewPart','Vuegauche')
   vuegauche.Source = obj
   vuegauche.Direction = (-1.0,0.0,0.0)
   vuegauche.ShowHiddenLines = True
   vuegauche.Scale = 1.0
   vuegauche.Rotation = 180.0
   vuegauche.X = 50.0+TailleX/2+TailleX
   vuegauche.Y = 50.0
   page.addObject(vuegauche)

   vuedessus = App.activeDocument().addObject('Drawing::FeatureViewPart','Vuedessus')
   vuedessus.Source = obj
   vuedessus.Direction = (0.0,-1.0,0.0)
   vuedessus.ShowHiddenLines = True
   vuedessus.Scale = 1.0
   vuedessus.Rotation = 180.0
   vuedessus.X = 50.0+TailleX/2+TailleX
   vuedessus.Y = 50.0+TailleX/2+TailleY+TailleX
   page.addObject(vuedessus)

   vueiso = App.activeDocument().addObject('Drawing::FeatureViewPart','VueIso')
   vueiso.Source = obj
   vueiso.Direction = (-1.0,-1.0,0.5)
   vueiso.Scale = 1.0
   vueiso.ShowSmoothLines = True
   vueiso.X = TailleZ+TailleX/2
   vueiso.Y = 7*TailleZ+3*TailleY
   page.addObject(vueiso)
   

   App.activeDocument().recompute()

   PageFile = open(page.PageResult,'r')
   OutFile = open('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("Dimensions 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()

Il existe sinon une macro pour faire des plans automatiques: https://sourceforge.net/apps/mediawiki/ ... ic_Drawing.

J'espère que ça t'aidera.

Gaël
nicotuf
Posts: 14
Joined: Mon Jul 20, 2009 1:51 pm

Re: Mise en Plan

Post by nicotuf »

Merci Gaël pour le lien, ça m'a bien aidé, j'ai réussi à faire ce que je voulais...

Et merci pour l'amélioration de mon petit programme, c'est effectivement plus "propre" comme ça.

Nicolas
User avatar
yorik
Founder
Posts: 13640
Joined: Tue Feb 17, 2009 9:16 pm
Location: Brussels
Contact:

Re: Mise en Plan

Post by yorik »

Bravo pour le travail de script en tous cas. C'est très bon pour le projet quand ce genre de chose commence a apparaître... Nicolas, je peux mettre cette macro sur le wiki ( http://sourceforge.net/apps/mediawiki/f ... os_recipes )? C'est un excellent exemple d'une petite application bien faite...
nicotuf
Posts: 14
Joined: Mon Jul 20, 2009 1:51 pm

Re: Mise en Plan

Post by nicotuf »

Pas de soucis pour mettre la macro sur le wiki.
Post Reply