[Python] Fusionner les éléments d'un dossier

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
Post Reply
User avatar
churchill
Posts: 8
Joined: Wed Feb 28, 2018 12:27 pm

[Python] Fusionner les éléments d'un dossier

Post by churchill »

Bonjour,

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()
Je créé un "VisGroup" pour pouvoir changer d'un coup la couleur des traits de tous les objets (pour séparer la découpe de la gravure). Et dans ce VisGroup je créé deux groupes, l'un avec des vecteurs, et l'autre avec les chiffres de la règle. Mais peut-être mon approche n'est pas la bonne.

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)
User avatar
meme2704
Veteran
Posts: 2926
Joined: Sat Apr 01, 2017 2:47 pm
Location: Vosges

Re: [Python] Fusionner les éléments d'un dossier

Post by meme2704 »

Salut Churchil
Si t'as aimer mon pied à coulisse, il reste à y ajouter quelque chiffres
https://forum.freecadweb.org/viewtopic. ... 632400e25e
User avatar
Vincent B
Veteran
Posts: 4739
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: [Python] Fusionner les éléments d'un dossier

Post by Vincent B »

Voici une méthode que j'ai employée. J'ai fait des lignes draft à partir d'un sketch.
Quel type de fichier comptes tu faire. Freecad a de grosses lacunes avec le DXF (les épaisseurs de traits ne semble pas gérées, les écritures devient crénelées... :roll: )
Attachments
grads.FCStd
(17.83 KiB) Downloaded 19 times
User avatar
churchill
Posts: 8
Joined: Wed Feb 28, 2018 12:27 pm

Re: [Python] Fusionner les éléments d'un dossier

Post by churchill »

GlouGlou wrote: Fri Oct 19, 2018 4:40 pm Voici une méthode que j'ai employée. J'ai fait des lignes draft à partir d'un sketch.
Quel type de fichier comptes tu faire. Freecad a de grosses lacunes avec le DXF (les épaisseurs de traits ne semble pas gérées, les écritures devient crénelées... :roll: )
Effectivement je devrais peut-être utiliser les array, ça parrait une bonne solution.

Je compte exporter en dxf effectivement. J'ai testé deux polices, une en ttf (OCR-A) et une en opentype (OCR-B) et la police opentype donnait un résultat désastreux en export. Je ne sais pas si c'est dû à la police elle-même ou au type (ttf/opentype). L'idéal serait de trouver une police "trait" pour les tout petits caractères...
User avatar
Vincent B
Veteran
Posts: 4739
Joined: Sun Apr 05, 2015 9:02 am
Location: La Rochelle, France

Re: [Python] Fusionner les éléments d'un dossier

Post by Vincent B »

Je suis en train de faire la même opération que toi, graver au laser, je vais reprendre mes inscriptions avec librecad. Les inscriptions sont correctes.
Mais il faut aussi reprendre toutes les épaisseurs de traits... :roll:
Attachments
Capture.PNG
Capture.PNG (43.85 KiB) Viewed 523 times
User avatar
meme2704
Veteran
Posts: 2926
Joined: Sat Apr 01, 2017 2:47 pm
Location: Vosges

Re: [Python] Fusionner les éléments d'un dossier

Post by meme2704 »

Je vais recyclé le poste précédent et le proposer en DXF
Attachments
pied de pouleDXF.PNG
pied de pouleDXF.PNG (15.17 KiB) Viewed 508 times
pied de poule.dxf
(124.76 KiB) Downloaded 17 times
Post Reply