Gestion d'une fenetre et des variables destinées au dessin

Forum destiné aux questions et discussions en français
Forum rules
Be nice to others! Read the FreeCAD code of conduct!
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

blonblon wrote: Sat Jul 13, 2019 10:29 am Le code fonctionne ça active ou désactive la visibilité des divers éléments.

Il me reste à trouver une astuce pour que les poulies s'empilent.
:+1: Bon courage. ;) Si tu as besoin d'aide, il faudra un peu plus de code pour comprendre. :)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

J'ai ajouté une barre de progression pour visualiser l'avancement du programme.
Il reste un problème les Pad ne s'empilent pas mais reste sur le plan Z=0 je n'arrive pas à trouver l'erreur.
voici le code.

Code: Select all

#-*- coding: utf-8 -*-
#
# Dessin pignon GT2
#

import Draft, Part
import sys
import math
import Part
import sys
import PartDesignGui
import FreeCAD, FreeCADGui
import Sketcher, PartDesign
import ProfileLib.RegularPolygon
from FreeCAD import Base
from PySide import QtCore, QtGui

__DBG__ = False #True #Mettre à False pour supprimer la sortie de debug
def pdbg(text):
###
   if __DBG__: #Si on est en mode debug
      App.Console.PrintMessage(text)
###
def proceed():
###
   Type = t0.currentText() # on récupére le type de poulie
   progress.setValue(5)

###
###
# Données nécessaires au dessin poulie GT2
   if 'GT2' == Type:
      pdbg('Type = ' + str(Type)+"\n")
      nombre_de_dents = float(s1.text())
      pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
      pas = 2
      pdbg('Pas = ' + str(pas)+"\n")
      PLD = 0.254
      pdbg('PLD = ' + str(PLD)+"\n")
      h = 0.75
      pdbg('h = ' + str(h)+"\n")
      circonference = nombre_de_dents * pas
      pdbg('circonference = ' + str(circonference)+"\n")
      diametre_primitif = circonference / math.pi
      pdbg('diametre_primitif = ' + str(diametre_primitif)+"\n")
      diametre_poulie = diametre_primitif - (PLD * 2)
      pdbg('diametre_poulie = ' + str(diametre_poulie)+"\n")
      rayon_poulie = diametre_poulie / 2
      pdbg('rayon_poulie = ' + str(rayon_poulie)+"\n")
      largeur_poulie = float(s2.text())
      pdbg('largeur_poulie = ' + str(largeur_poulie)+"\n")
      R1 = 0.15
      pdbg('rayon_R1 = ' + str(R1)+"\n")
      R2 = 1
      pdbg('rayon_R2 = ' + str(R2)+"\n")
      R3 = 0.555
      pdbg('rayon_R3 = ' + str(R3)+"\n")
      b = 0.4
      b2 = b*2
   elif 'GT3' == Type:
      pdbg('Type = ' + str(Type)+"\n")
      nombre_de_dents = float(s1.text())
      pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
      pas = 3
      pdbg('Pas = ' + str(pas)+"\n")
      PLD = 0.381
      pdbg('PLD = ' + str(PLD)+"\n")
      h = 1.14
      pdbg('h = ' + str(h)+"\n")
      circonference = nombre_de_dents * pas
      pdbg('circonference = ' + str(circonference)+"\n")
      diametre_primitif = circonference / math.pi
      pdbg('diametre_primitif = ' + str(diametre_primitif)+"\n")
      diametre_poulie = diametre_primitif - (PLD * 2)
      pdbg('diametre_poulie = ' + str(diametre_poulie)+"\n")
      rayon_poulie = diametre_poulie / 2
      pdbg('rayon_poulie = ' + str(rayon_poulie)+"\n")
      largeur_poulie = float(s2.text())
      pdbg('largeur_poulie = ' + str(largeur_poulie)+"\n")
      R1 = 0.25
      pdbg('rayon_R1 = ' + str(R1)+"\n")
      R2 = 1.52
      pdbg('rayon_R2 = ' + str(R2)+"\n")
      R3 = 0.85
      pdbg('rayon_R3 = ' + str(R3)+"\n")
      b = 0.61
      b2 = b*2
   elif 'GT5' == Type:
      pdbg('Type = ' + str(Type)+"\n")
      nombre_de_dents = float(s1.text())
      pdbg('Nb dents = ' + str(nombre_de_dents)+"\n")
      pas = 5
      PLD = 0.43
      pdbg('PLD = ' + str(PLD)+"\n")
      h = 1.2
      pdbg('h = ' + str(h)+"\n")
      circonference = nombre_de_dents * pas
      pdbg('circonference = ' + str(circonference)+"\n")
      diametre_primitif = circonference / math.pi
      pdbg('diametre_primitif = ' + str(diametre_primitif)+"\n")
      diametre_poulie = diametre_primitif - (PLD * 2)
      pdbg('diametre_poulie = ' + str(diametre_poulie)+"\n")
      rayon_poulie = diametre_poulie / 2
      pdbg('rayon_poulie = ' + str(rayon_poulie)+"\n")
      largeur_poulie = float(s2.text())
      pdbg('largeur_poulie = ' + str(largeur_poulie)+"\n")
      largeurDent = 2.65
      angleDent = 40
###
###
# ici on insére le teste de présence nouveau fichier part body sketch
   myDoc = App.ActiveDocument
   if myDoc == None: #il n'y a pas de Document on le crée
      myDoc = App.newDocument("Pignon" + Type)
############
   objs = [obj for obj in myDoc.Objects if str(obj) == "<Part object>"]
   if len(objs) == 0: #Il n'y a pas de Part on le crée 
      myPart = myDoc.addObject('App::Part','Part')
      myPart.Label = "Pièce"
   else: #Il y a (au moins) un Part dans le document
      myPart = objs[0] #On utilise par ex. le premier Part dans la suite
############
   objs = [obj for obj in myDoc.Objects if str(obj) == "<body object>"]
   if len(objs) != 0 and t1.isChecked() == False:
      myBody = objs[ - 1]
      mySketch = myBody.newObject('Sketcher::SketchObject','Sketch')
#      mySketch.Support = (App.ActiveDocument.Pad,[''])
      a = 0
      a = App.ActiveDocument.Pad.Length
#      App.activeDocument().Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,00,1,0))
      print('obj != 0')
      print(str(a))
   else:
      myBody = myDoc.addObject('PartDesign::Body','Body')
#      App.activeDocument().Part.addObject(App.ActiveDocument.Body)
      mySketch = myBody.newObject('Sketcher::SketchObject','Sketch')
      mySketch.Support = (myDoc.XY_Plane001, [''])
      mySketch.MapMode = 'FlatFace'
      a = 0
#      App.activeDocument().Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,00,1,0))
      print('obj == 0')
      print(str(a))
############
# premier Sketch ici on insére le code du dessin
# On place le cercle qui va servir pour le pignon en GT2, GT3, ou GT5
   progress.setValue(20)
   print(str(App.getDocument))
#   FreeCAD.getDocument("PignonGT2").getObject("Sketch002").Placement = App.Placement(App.Vector(0,0,8),App.Rotation(App.Vector(0,0,1),0))
#   App.activeDocument().Sketch001.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(-0.707107,0.000000,0.000000,-0.707107))
#   App.getDocument("PignonGT2").getObject("Sketch002").Placement = App.Placement(App.Vector(0,0,a),App.Rotation(App.Vector(0,0,1),0))

   mySketch.addGeometry(Part.Circle(App.Vector(-0.959298,0.986822,0),App.Vector(0,0,1),rayon_poulie),False)
   mySketch.addConstraint(Sketcher.Constraint('Coincident',-1,1,0,3))
   mySketch.addConstraint(Sketcher.Constraint('Radius',0,rayon_poulie))
#   mySketch.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,0,1,0))
   App.ActiveDocument.recompute()

   mySketch.ViewObject.Visibility = False
############
# On extrude le cercle
   myPad = myBody.newObject("PartDesign::Pad","Pad")
#   print(str(myPad.Length))
   myPad.Profile = mySketch
   myPad.Length = largeur_poulie
   App.ActiveDocument.recompute()
#   myPad.Length = (float(a) + largeur_poulie)
   myPad.Length2 = 100.000000
   myPad.Type = 0
   myPad.UpToFace = None
   myPad.Reversed = 1
   myPad.Midplane = 0
   myPad.Offset = 0.000000
#   myPad.ViewObject.Visibility = False
   App.ActiveDocument.recompute()
   progress.setValue(30)
###
# on dessine une dent
###
   if 'GT2' == Type or 'GT3' == Type:
      mySketch1 = myBody.newObject('Sketcher::SketchObject','Sketch001')
#      App.activeDocument().Sketch001.Support = (App.ActiveDocument.Pad,["Face5"])
      mySketch1.Support =  (App.ActiveDocument.Pad,["Face3"]) # (myDoc,["Face3"]) # myPad  myDoc
      mySketch1.MapMode =  'FlatFace'
#      mySketch1.Placement = App.Placement(App.Vector(0.000000,0.000000,a),App.Rotation(0,0,1,0))
      mySketch1.addGeometry(Part.LineSegment(App.Vector(-0.193479,5.124362,0),App.Vector(0.192029,5.124362,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Symmetric',0,1,0,2,-2)) 
      mySketch1.toggleConstruction(0) 
      mySketch1.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,b2)) # Entraxe rayon R2 
      mySketch1.setDatum(1,App.Units.Quantity(str(b2) + ' mm')) # Entraxe rayon R2
      geoList = []
      geoList.append(Part.LineSegment(App.Vector(-0.733822,4.858931,0),App.Vector(0.675494,4.858931,0)))
      geoList.append(Part.LineSegment(App.Vector(0.675494,4.858931,0),App.Vector(0.675494,4.707256,0)))
      geoList.append(Part.LineSegment(App.Vector(0.675494,4.707256,0),App.Vector(-0.733822,4.707256,0)))
      geoList.append(Part.LineSegment(App.Vector(-0.733822,4.707256,0),App.Vector(-0.733822,4.858931,0)))
      mySketch1.addGeometry(geoList,False)
      conList = []
      conList.append(Sketcher.Constraint('Coincident',1,2,2,1))
      conList.append(Sketcher.Constraint('Coincident',2,2,3,1))
      conList.append(Sketcher.Constraint('Coincident',3,2,4,1))
      conList.append(Sketcher.Constraint('Coincident',4,2,1,1))
      conList.append(Sketcher.Constraint('Horizontal',1))
      conList.append(Sketcher.Constraint('Vertical',2))
      conList.append(Sketcher.Constraint('Vertical',4))
      mySketch1.addConstraint(conList)

      mySketch1.toggleConstruction(4) 
      mySketch1.toggleConstruction(1) 
      mySketch1.toggleConstruction(3) 
      mySketch1.toggleConstruction(2) 
      mySketch1.addConstraint(Sketcher.Constraint('DistanceY',3,2,1,1,R1)) # Arc cercle R1 
      mySketch1.setDatum(9,App.Units.Quantity(str(R1) + ' mm')) # Arc cercle R1
      mySketch1.addConstraint(Sketcher.Constraint('Symmetric',3,2,2,2,-2))  

      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(-0.661711,4.752790,0),App.Vector(0,0,1),0.192858),0.236851,1.887364),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',3,2,5,3)) 
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,1,5,2)) 
      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.450575,5.100380,0),App.Vector(0,0,1),1.036934),-2.747505,-2.448713),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',0,2,6,3)) 
      mySketch1.addConstraint(Sketcher.Constraint('Tangent',5,1,6,1)) 
      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.068227,4.563197,0),App.Vector(0,0,1),0.468263),-2.587285,-1.242243),False)
      mySketch1.addConstraint(Sketcher.Constraint('Tangent',6,2,7,1)) 
      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.668608,4.825469,0),App.Vector(0,0,1),0.204199),1.190289,2.657114),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,3,2,2)) 
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,2,8,1)) 
      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(-0.465797,5.119339,0),App.Vector(0,0,1),1.025216),-0.712926,-0.365625),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',9,3,0,1)) 
      mySketch1.addConstraint(Sketcher.Constraint('Tangent',8,2,9,2)) 
      mySketch1.addConstraint(Sketcher.Constraint('Tangent',7,2,9,1)) 

      mySketch1.addConstraint(Sketcher.Constraint('Radius',6,R2)) # Arc cercle R2 
      mySketch1.setDatum(21,App.Units.Quantity(str(R2) + ' mm')) # Arc cercle R2
      mySketch1.addConstraint(Sketcher.Constraint('Radius',7,R3)) # Arc cercle R3 
      mySketch1.setDatum(22,App.Units.Quantity(str(R3) + ' mm')) # Arc cercle R3

      mySketch1.addGeometry(Part.Point(App.Vector(-0.150355,4.112466,0)))
      mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',10,1,-2)) 
      mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',10,1,7)) 
      mySketch1.addConstraint(Sketcher.Constraint('DistanceY',10,1,8,1,h)) # Hauteur 
      mySketch1.setDatum(25,App.Units.Quantity(str(h) + ' mm'))

      mySketch1.ViewObject.Visibility = True
      App.ActiveDocument.recompute()
      mySketch1.addExternal("Pad","Edge2")
      mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',5,2,-3)) 

      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.298317,3.331532,0),App.Vector(0,0,1),1.930821),1.288327,2.078132),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,11,2))
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,1,11,1))
      mySketch1.movePoint(11,0,App.Vector(-0.107088,4.967296,0),0)
      mySketch1.addConstraint(Sketcher.Constraint('Tangent',-3,11))
      mySketch1.ViewObject.Visibility = False
      progress.setValue(50)
#      Gui.getDocument("Pignon" + Type).getObject("Sketch001").Visibility=False
#      mySketch1.addConstraint(Sketcher.Constraint('Tangent',-3,11)
#      mySketch1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(0.298317,3.331532,0),App.Vector(0,0,1),1.930821),1.288327,2.078132),False)
#      mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,11,2)) 
#      mySketch1.addConstraint(Sketcher.Constraint('Coincident',8,1,11,1))
#      mySketch1.addConstraint(Sketcher.Constraint('Distance',-1,1,8,1,rayon_poulie))
#      mySketch1.ViewObject.Visibility = False
#      App.ActiveDocument.recompute()
   elif 'GT5' == Type:
###
# On dessine une dent GT5
###
      mySketch1 = myBody.newObject('Sketcher::SketchObject','Sketch')
#      mySketch1.Support = (App.ActiveDocument.Pad,["Face2"])
#      mySketch1.MapMode = 'FlatFace'
      mySketch1.addGeometry(Part.LineSegment(App.Vector(-1.135752,12.395073,0),App.Vector(-1.122119,13.022206,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Vertical',0)) 
      mySketch1.addGeometry(Part.LineSegment(App.Vector(-1.135752,13.022206,0),App.Vector(1.427315,13.144907,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) 
      mySketch1.addGeometry(Part.LineSegment(App.Vector(1.427315,13.144907,0),App.Vector(1.427315,12.531406,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1)) 
      mySketch1.addConstraint(Sketcher.Constraint('Vertical',2)) 
      mySketch1.addGeometry(Part.LineSegment(App.Vector(1.427315,12.531406,0),App.Vector(0.759282,11.195339,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',2,2,3,1)) 
      mySketch1.addGeometry(Part.LineSegment(App.Vector(0.759282,11.195339,0),App.Vector(-0.522252,11.099906,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',3,2,4,1)) 
      mySketch1.addGeometry(Part.LineSegment(App.Vector(-0.522252,11.099906,0),App.Vector(-1.122119,12.081507,0)),False)
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',4,2,5,1)) 
      mySketch1.addConstraint(Sketcher.Constraint('Coincident',5,2,0,1))
      myPad.ViewObject.Visibility = True
      App.ActiveDocument.recompute()
      mySketch1.addExternal("Pad","Edge3")
      mySketch1.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-3)) 
      mySketch1.addConstraint(Sketcher.Constraint('Equal',5,3)) 
      mySketch1.addConstraint(Sketcher.Constraint('Symmetric',4,2,3,2,-2)) 
      mySketch1.addConstraint(Sketcher.Constraint('Symmetric',0,2,1,2,-2)) 
      mySketch1.addConstraint(Sketcher.Constraint('DistanceY',2,2,2,1,0.883285))

      mySketch1.setDatum(12,App.Units.Quantity('1.000000 mm'))
      mySketch1.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,2.438514)) 
      mySketch1.setDatum(13,App.Units.Quantity(str(largeurDent) + ' mm'))
      mySketch1.addConstraint(Sketcher.Constraint('Angle',3,2,5,1,1.008739)) 
      mySketch1.setDatum(14,App.Units.Quantity(str(angleDent) + ' deg'))

      mySketch1.ViewObject.Visibility = False
      App.ActiveDocument.recompute()
###
# On fait un Pocket de la dent GT2, GT3 ou GT5
###
   myPocket = myBody.newObject("PartDesign::Pocket","Pocket")
   myPocket.Profile = mySketch1
   myPocket.Length = largeur_poulie
   App.ActiveDocument.recompute()
   myPocket.Length2 = 100.000000
   myPocket.Type = 0
   myPocket.UpToFace = None
   myPocket.Reversed = 0
   myPocket.Midplane = 0
   myPocket.Offset = 0.000000
   myPocket.ViewObject.Visibility = False
   App.ActiveDocument.recompute()
   progress.setValue(70)
###
# On dessine toutes les dents
###
   myPolar = myBody.newObject("PartDesign::PolarPattern","PolarPattern")
   myDoc.recompute()
   myPolar.Originals = [myPocket]
   myPolar.Axis = (mySketch1, ["N_Axis"])
   myPolar.Angle = 360
   myPolar.Occurrences = int(nombre_de_dents)
   myDoc.recompute()

   myBody.Tip = myPolar
   myDoc.recompute()
   myPolar.Originals = [myPocket,]
#   myPolar.Visibility=True
   Gui.getDocument(myDoc).getObject("PolarPattern").Visibility=True
   myDoc.recompute()
   progress.setValue(90)
###
   close()

def fin():
   close()

def close():
      dialog.close()
      print('Terminé')
###
# Gestion de la fenetre de dialogues
dialog = None
s1 = None

dialog = QtGui.QDialog()
dialog.resize(200,400) # Dimentionner la boite de dialogue
dialog.setWindowTitle("Poulie GT2") # Titre de la fenetre
la = QtGui.QVBoxLayout(dialog)

progress = QtGui.QProgressBar()
la.addWidget(progress)
progress.setGeometry(QtCore.QRect(0, 0, 200, 40))

t1 = QtGui.QCheckBox("cocher pour plusieurs Body")
la.addWidget(t1)
t1.setCheckState(QtCore.Qt.Unchecked) # Unchecked Checked

la.addWidget(QtGui.QLabel("Type de poulie")) # Affichage Label

t0 = QtGui.QComboBox() # Affichage ComboBox
la.addWidget(t0)
t0.addItems(["GT2", "GT3", "GT5"])
t0.setFixedWidth(100)

la.addWidget(QtGui.QLabel("Nombre de Dents")) # Affichage Label)

s1 = QtGui.QLineEdit() # Affichage LineEdit
s1.setText("16.0")
s1.setFixedWidth(100)
la.addWidget(s1)

la.addWidget(QtGui.QLabel("Largeur Poulie")) # Affichage Label

s2 = QtGui.QLineEdit() # Affichage LineEdit
s2.setText("8.0")
s2.setFixedWidth(100)
la.addWidget(s2)



# Gestion boutons OK / Cancel
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()"), close)
dialog.exec_()

après il restera à tester vraiment le programme.
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Salut blonblon,

Je ne comprends pas trop le problème. Quand je lance ta macro, ça me crée un seul pignon (effectivement à l'origine).
Il y a un seul Pad dans le Body, donc je ne comprends pas l'histoire des Pad qui s'empilent et tout ça.
Tu peux donner une petite procédure à reproduire pour voir le problème ?

Sinon en commentaires sur la forme :
  • Ce serait mieux si la barre de progression était en bas (juste en dessous où au dessus des boutons. Idéalement même la masquer quand elle ne sert à rien. ;)
  • Je ne comprends pas trop parce que dans le fichier généré il y a un Part container nommé "Pièce" mais il est vide et ne sert donc à rien.
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Si on lance la macro plusieurs fois la case du CheckBox non cochée les poulies devraient se superposer.
La case du CheckBox cochée on crée plusieurs Body qui peuvent contenir une ou plusieurs poulies superposées.

Le problème est quand on lance plusieurs fois la macro la case du CheckBox non cochée.
Le Part contient un ou plusieurs Body qui peuvent contenir une ou plusieurs poulies.

Pour la barre de progression je dois encore faire des recherches je n'ai pas encore trouvé comment positionner les composants sur la fenetre, la je n'ai rien paramétré.

Ce qui devrait etre fait par la macro
vue.jpg
vue.jpg (32.02 KiB) Viewed 1192 times
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

Désolé blonblon mais ça va être plus compliqué pour t'aider que juste revoir du code.
Qu'est ce que tu voudrais que ça fasse fonctionnellement ? (Typiquement qu'est-ce que tu entends par "superposer").
Comment est-ce que tu avais prévu ça dans ton code ? (Ce serait pas mal d'ajouter des commentaires dans la macro) ;)
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Je tente de faire ceci, mais qui n'est pas limité à trois pignons.
TrainPignons.jpg
TrainPignons.jpg (47.96 KiB) Viewed 1114 times
Mais les pignons ne se superposent pas, il y a quelque chose qui m'échappe avec la position sur l'axe Z des pignons
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

blonblon wrote: Sun Jul 21, 2019 6:51 pm Je tente de faire ceci, mais qui n'est pas limité à trois pignons.
Pas simple. Quelques réflexions en vrac :
  • Est-ce que ce ne serait pas mieux de gérer ça avec des extrusions Part, plutôt que des fonctions PartDesign ?
  • Voire le truc ultime, ce serait de créer un nouveau type de pièce Part (du genre Gear) qui aurait comme propriétés le type de poulie, le nombre de dents, ... Ca ce serait la classe 8-)
  • Dans un 1er temps pour faire simple, ce que je ferai c'est une interface graphique à 3 boutons : "Quitter", "Créer" et "Créer et continuer". Les 2 1ers boutons seraient les "Annuler" et "OK" d'aujourd'hui, le 3ème permettrait justement de créer des trains de pignons en ne fermant pas la fenêtre mais en enchainant sur les pignons précédents.
  • Ce serait peut-être mieux si ta fenêtre graphique dérivait de QDockWidget -- quitte à désactiver le docking --. Ca permetttrait de continuer à pouvoir faire tourner la vue 3D pendant qu'on se sert de la macro. ;)
Mais les pignons ne se superposent pas, il y a quelque chose qui m'échappe avec la position sur l'axe Z des pignons
C'était quoi le principe et la(les) variable(s) que tu avais prévu dans le code pour faire ça ?
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

Est-ce que ce ne serait pas mieux de gérer ça avec des extrusions Part, plutôt que des fonctions PartDesign ?
Je travaille essentiellement avec PartDesign, je maitrise mal Part, quels outils utiliser pour créer une poulie.
Voire le truc ultime, ce serait de créer un nouveau type de pièce Part (du genre Gear) qui aurait comme propriétés le type de poulie, le nombre de dents, ... Ca ce serait la classe
Créer un outil, j'ai consulte les sources de FcGear, c'est je pense au dessus de mes compétences.
Dans un 1er temps pour faire simple, ce que je ferai c'est une interface graphique à 3 boutons : "Quitter", "Créer" et "Créer et continuer". Les 2 1ers boutons seraient les "Annuler" et "OK" d'aujourd'hui, le 3ème permettrait justement de créer des trains de pignons en ne fermant pas la fenêtre mais en enchainant sur les pignons précédents.
Ce serait peut-être mieux si ta fenêtre graphique dérivait de QDockWidget -- quitte à désactiver le docking --. Ca permetttrait de continuer à pouvoir faire tourner la vue 3D pendant qu'on se sert de la macro.
Ou trouver de la documentation QDockWidget pour FreeCad.
C'était quoi le principe et la(les) variable(s) que tu avais prévu dans le code pour faire ça ?
J'ai tente de récupérer la position d'un pignon sur l'axe Z, en fait je ne récupére que sa hauteur
openBrain
Veteran
Posts: 9034
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by openBrain »

blonblon wrote: Tue Jul 23, 2019 9:23 am Je travaille essentiellement avec PartDesign, je maitrise mal Part, quels outils utiliser pour créer une poulie.
Tu crées ton sketch de la même façon sauf que tu n'as pas besoin de le mapper sur quelque chose (déjà c'est plus simple). Et tu n'as pas besoin de la mettre dans un Body (encore plus simple). Tu joues éventuellement avec son "Placement" pour le positionner.
Ensuite tu fais juste une extrusion (Part Extrude) de ton sketch (ça fera grosso modo la même chose qu'un pad de PartDesign).
Et voilà c'est fini.
Autre avantage quand tu crées un 2ème, ... objet, pas besoin de s'occuper que ça touche ou pas le solide déjà existant. ;)
Créer un outil, j'ai consulte les sources de FcGear, c'est je pense au dessus de mes compétences.
Je suis d'accord que c'est un sacré boulot. Surtout que du coup tu te retrouves probablement à coder en C++. ;)
Ou trouver de la documentation QDockWidget pour FreeCad.
QDockWidget n'est pas spécifique à FC. C'est simplement un type de fenêtre fourni par Qt.
De manière ultra simplifiée, l'idée c'est juste de remplacer

Code: Select all

dialog = QtGui.QDialog()
par

Code: Select all

dialog = QtGui.QDockWidget()
. ;)
Si tu veux une doc complète des fonctions : https://doc.qt.io/qt-5/qdockwidget-members.html
Si tu veux un exemple, tu peux regarder cette macro (notamment à partir de la ligne pointée) mais c'est un peu différent car j'avais créé une classe dérivée. Ceci dit ça ne change rien au code de mise en place de l'interface. ;)
J'ai tente de récupérer la position d'un pignon sur l'axe Z, en fait je ne récupére que sa hauteur
C'est encore un peu mystérieux. Je regarderai le code. Tu peux me donner le nom de la variable ?
User avatar
blonblon
Posts: 253
Joined: Sat Sep 24, 2016 6:06 pm
Location: Uzes (Gard), France

Re: Gestion d'une fenetre et des variables destinées au dessin

Post by blonblon »

J'ai regardé du coté de l'outil Part, j'extrude un cylindre, j'extrude une dent, je fais une soustraction boléenne, là je crée une dent.

Comment faire une répétition circulaire à partir de l'outil Part.
Post Reply