Pour tester l'écriture de script python, et en vue d'un projet que j'ai, je me suis fait un petit script pour dessiner une règle graduée dans le but de la graver au laser sur une pièce.
Code: Select all
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PySide import QtGui
import Draft
import FreeCAD
def get_infos():
info = {"cm_mini":0, "cm_maxi":0, "sens":1}
r = QtGui.QInputDialog.getInt(None, u"Règle","cm Mini (ex. -2)", -1)
if r[1]:
info["cm_mini"] = r[0]
else:
# Annuler
return (False, {})
r = QtGui.QInputDialog.getInt(None, u"Règle","cm Maxi (ex. 10)", 1)
if r[1]:
info["cm_maxi"] = r[0]
else:
# Annuler
return (False, {})
r = QtGui.QMessageBox.question(None, u"Règle", u"Échelle inversée ?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
if r == QtGui.QMessageBox.Yes:
info["sens"] = -1
# Tout est OK
return (True, info)
def trace_lignes(parent, info):
groupe = parent.newObject("App::DocumentObjectGroup","lignes")
sens = info["sens"]
def ligne_mm(mm, lg):
# Trace la ligne
points=[FreeCAD.Vector(0.0,sens*mm,0.0),FreeCAD.Vector(lg,sens*mm,0.0)]
line = Draft.makeWire(points,closed=False,face=True,support=None)
groupe.addObject(line)
for cm in xrange(info["cm_mini"], info["cm_maxi"]):
for mm in xrange(0,10):
if mm==0:
ligne_mm(cm*10, 10) # ligne des cm = 10mm
elif mm==5:
ligne_mm(cm*10+mm, 7) # ligne des 1/2cm = 7mm
else:
ligne_mm(cm*10+mm, 5) # ligne des mm = 5mm
# Trace la dernière ligne des cm
ligne_mm((cm+1)*10, 10)
def trace_texte(parent, info):
police = "/usr/share/fonts/truetype/ocr-a/OCRA.ttf"
groupe = parent.newObject("App::DocumentObjectGroup","textes")
sens = info["sens"]
def texte_cm(cm):
# Ecrit les cm
texte = Draft.makeShapeString("%d" % cm, police, 2.0,0)
plm=FreeCAD.Placement()
plm.Base=FreeCAD.Vector(12.0,sens*cm*10-1.5,0.0)
texte.Placement=plm
groupe.addObject(texte)
for cm in xrange(info["cm_mini"], info["cm_maxi"]):
texte_cm(cm)
# Écrit le dernier cm
texte_cm(cm+1)
def init():
info = get_infos()
if info[0]:
nom_groupe = "regle_%d_%d" % (info[1]["cm_mini"], info[1]["cm_maxi"])
v = Draft.makeVisGroup(name=nom_groupe)
trace_lignes(v, info[1])
trace_texte(v, info[1])
App.ActiveDocument.recompute()
if __name__=="__main__":
init()
J'aimerais pouvoir fusionner tous les objets de chaque groupe pour n'obtenir que deux objets (trais + chiffres) plus faciles à déplacer, mais je sèche...
Quelqu'un a une idée ?
PS: Si vous lancez le script, attention au chemin de la police dans "trace_texte". D'autre part l'exécution est assez longue (pourquoi ?)
Code: Select all
OS: Ubuntu 18.04.1 LTS
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.17.13541 (Git)
Build type: None
Branch: releases/FreeCAD-0-17
Hash: 9948ee4f1570df9216862a79705afb367b2c6ffb
Python version: 2.7.15rc1
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: French/Switzerland (fr_CH)