Macro FCCircularText/fr: Difference between revisions

From FreeCAD Documentation
mNo edit summary
(Created page with "File:YamahaDrumBadge00.gif|Exemple d'utilisation ([https://forum.freecad.org/viewtopic.php?t=82577 Texte incurvé sur une surface plane ?])")
 
(84 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{Macro/fr
{{Macro/fr
|Name=Macro FCCircularText
|Name=Macro FCCircularText
|Icon=FCCircularTextButtom.png
|Icon=FCCircularTextButtom.png
|Description=Cette macro utilise l'outil [[Draft_ShapeString/fr|Draft Forme à partir d'un texte]] pour créer une ligne de texte placée dans différentes orientations circulaires, y compris circonférentielle et hélicoïdale (à la manière d'une colonne Trajane). Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes ''1, 2, 3'' etc., ou des chiffres romains ''I, II, III'', etc.
|Description={{ColoredText|#ff0000|#ffffff|La dernière version de la macro prend en charge une disposition HiDPI (QGridLayout) et ne fonctionne que sur les versions 0.18 ou supérieures (nécessite PySide2/Qt5)}} <br/> <br/> Pour une version rétrocompatible de la macro, voir
[https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/db47f78f2b20a35137ac213b8d1a62d30f525dcb/Macro_FCCircularText.FCMacro FCCircularText] et installez la manuellement. <br/> <br/> Cette macro utilise l'outil [[Draft ShapeString/fr|Draft Formes à partir texte]] pour créer une ligne de texte placée dans différentes orientations circulaires, y compris circonférentielle et hélicoïdale (à la manière d'une colonne Trajane). Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes ''1, 2, 3'' etc., ou des chiffres romains ''I, II, III'', etc.
|Author=Mario52
|Author=Mario52
|Version=0.16d
|Version=0.22c
|Date=2020/09/15
|Date=2023/11/17
|FCVersion=0.18 ou supérieure
|FCVersion=0.19
|Download=[https://www.freecadweb.org/wiki/images/c/c1/FCCircularTextButtom.png ToolBar Icon]
|Download=[https://www.freecadweb.org/wiki/images/c/c1/FCCircularTextButtom.png Icône de la barre d'outils]
}}
}}


==Description==
==Description==


Cette macro utilise l'outil [[Image:Draft_ShapeString.svg|24px|link=Draft ShapeString]] [[Draft ShapeString/fr|Draft Formes à partir texte]] pour créer une ligne de texte placée dans différentes orientations circulaires, notamment circonférentielle et hélicoïdale comme par ex [https://fr.wikipedia.org/wiki/Colonne_Trajane Colonne Trajane]. Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes ''1, 2, 3...'' ou des chiffres romains '' I, II, III... ''. Cette dernière utilisation a été inspirée par le fil du Forum [http://forum.freecadweb.org/viewtopic.php?f=22&t=5013&hilit=Clock Macro pour créer un cadran d'horloge] par un membre de la communauté FC, cblt2l.
Cette macro utilise l'outil [[Image:Draft_ShapeString.svg|24px|link=Draft ShapeString/fr]] [[Draft ShapeString/fr|Draft Formes à partir texte]] pour créer une ligne de texte placée dans différentes orientations circulaires, notamment circonférentielle et hélicoïdale comme par ex la [https://fr.wikipedia.org/wiki/Colonne_Trajane colonne Trajane]. Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes ''1, 2, 3...'' ou des chiffres romains '' I, II, III... ''. Cette dernière utilisation a été inspirée par le fil du Forum [http://forum.freecadweb.org/viewtopic.php?f=22&t=5013&hilit=Clock Macro pour créer un cadran d'horloge] par un membre de la communauté FreeCAD, cblt2l.


{{Codeextralink|https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/29b8d8cbb1a9e87e759542a1e473ebe1950f3241/Macro_FCCircularText.FCMacro}}
{{Codeextralink|https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/7ab8a1e9dd7f924a62ecef83ec1d2ad8723e37d6/Macro_FCCircularText.FCMacro}}


[[File:FCCircularText 01.png|400px|Orientation à 360 degrés]]
:[[File:FCCircularText 01.png|400px|Orientation à 360 degrés]]
{{Caption|Exemple de la macro affichant le texte avec une orientation à 360 degrés}}
{{Caption|Exemple de la macro affichant le texte avec une orientation à 360 degrés}}


<span id="Usage"></span>
==Utilisation==
==Utilisation==


La création d'un texte crée un dossier "'''FcString'''" si vous créez une horloge, un dossier FcClock est créé.
La création d'un texte génère un dossier '''FcString''', la création d'une horloge génère un dossier '''FcClock'''.


Tous les caractères restent indépendants. Si vous créez une extrusion, rien n'est effacé. Si vous créez un Compound avec le bouton {{Button|Run Comp}}, il sera créé dans l'arbre principal de votre projet.
Tous les caractères restent indépendants. Si vous créez une extrusion, rien n'est effacé. Si vous créez un Compound avec le bouton {{Button|Run Comp}}, il sera créé dans l'arbre principal de votre projet.
Line 32: Line 33:
* {{CheckBox|SP. inclination.}}
* {{CheckBox|SP. inclination.}}


Seul la fonction Clock active la fonction Placement dans la direction '''Z''' pour déplacer manuellement le texte sur la surface du support (pour construire un relief ou une cavité).
A l'exception d'une boîte de placement Clock '''Z''' est activée et déplace le texte dans la direction '''Z''' pour placer le texte sur la surface de support.


<span id="Notes"></span>
==Remarques==
==Remarques==


* Cette macro met en grisé (désactivation) les options qui ne sont pas pertinentes pour une fonction sélectionnée.
* Cette macro met en grisé (désactivation) les options qui ne sont pas pertinentes pour une fonction sélectionnée.


== Interface ==
<span id="Interface"></span>
==Interface==
Vue d'ensemble

Présentation générale


[[File:FCCircularText 06.png|GUI]]
[[File:FCCircularText 06.png|GUI]]
{{clear}}
{{clear}}


<span id="First_section"></span>
===Première section===
===Première section===


Line 51: Line 56:
* La fenêtre de TextEdit vous permet de copier le texte a créer (cliquez sur le bouton {{Button|Reset}} vous permet de connaître la longueur de la chaîne entrée qui est affichée dans le titre de la fenêtre)
* La fenêtre de TextEdit vous permet de copier le texte a créer (cliquez sur le bouton {{Button|Reset}} vous permet de connaître la longueur de la chaîne entrée qui est affichée dans le titre de la fenêtre)
* Le bouton {{Button|Reverse}} inverse le texte
* Le bouton {{Button|Reverse}} inverse le texte
* {{CheckBox|Word}} coché, cette option considère le texte comme un mot, le texte est coupé dans l'espace et écrit le texte mot par mot (à la place caractère par caractère en usage normal)
* LineEdit: affiche le chemin et le nom de la police du fichier
* Le bouton {{Button|Help}} affiche la page wiki dans le navigateur FreeCAD
* Le bouton {{Button|Help}} affiche la page wiki dans le navigateur FreeCAD
* LineEdit: affiche le chemin et le nom de la police du fichier
* {{Button|Other}} bouton pour rechercher des polices de characteres dans des répertoires non découverts
* ComboView pour choisir la police
* ComboView pour choisir la police
* {{Button|Origin}} retourne à l'origine system ex: "C:/Windows/Fonts/"
** Par défaut la police ARIAL.TTF est imposée
** Par défaut la police ARIAL.TTF est imposée


<span id="Options_available"></span>
====Options disponibles=====
====Options disponibles====


Après la première utilisation, vous devez modifier les paramètres suivants:
Après la première utilisation, vous devez modifier les paramètres suivants:
Line 118: Line 127:
{{clear}}
{{clear}}


<span id="Second_Section"></span>
=== Seconde section ===
=== Seconde section ===

Configuration des caractères dans FCCircularText
Configurer des caractères dans FCCircularText


[[File:FCCircularText 08.png|center]]
[[File:FCCircularText 08.png|center]]
{{clear}}
{{clear}}


<span id="First_zone"></span>
====Première zone====
====Première zone====

Votre choix :
Votre choix :


Line 156: Line 169:
</center>
</center>


<span id="Second_area"></span>
=== Seconde section ====
==== Deuxième zone ====
Cette section vous permet de configurer le comportement global des caractères dans tous les choix disponibles, mais avec quelques variations.

Si une fonction n'est pas utilisée de façon standard dans l'option choisie, cette fonction sera grisée.
Cette section vous permet de configurer le comportement global des caractères dans tous les choix disponibles, mais avec quelques variations. Si une fonction n'est pas utilisée de façon standard dans l'option choisie, cette fonction sera grisée.


[[File:FCCircularText 10.png| left]]
[[File:FCCircularText 10.png| left]]
Line 173: Line 187:


=====Outdoor=====
=====Outdoor=====

Mode par défaut. Le texte est écrit sur la surface extérieur du cylindre.
Mode par défaut. Le texte est écrit sur la surface extérieur du cylindre.


Line 184: Line 199:


=====Indoor=====
=====Indoor=====

Le texte est écrit sur la surface interne d'un tube ou courbe.
Le texte est écrit sur la surface interne d'un tube ou courbe.


Line 195: Line 211:


=====Helix=====
=====Helix=====

Le texte écrit suit le tracé d'une hélice.
Le texte écrit suit le tracé d'une hélice.


Line 217: Line 234:
* '''Base Helix''' détermine le début (base) de placement des caractère dans l'élice (direction Placement Z). Si '''Placement Z''' est différent de zero, le départ est ajouté au Placement Z déjà déterminé plud haut.
* '''Base Helix''' détermine le début (base) de placement des caractère dans l'élice (direction Placement Z). Si '''Placement Z''' est différent de zero, le départ est ajouté au Placement Z déjà déterminé plud haut.
* '''End Helix''' Fin de l'hélice, le pas de l'hélice calculé est proportionnel à la hauteur et au nombre de caractères par tour d'hélice.
* '''End Helix''' Fin de l'hélice, le pas de l'hélice calculé est proportionnel à la hauteur et au nombre de caractères par tour d'hélice.



=====Clock=====
=====Clock=====

Les chiffres font partie d'un cercle avec des chiffres arabes ou romains.
Les chiffres font partie d'un cercle avec des chiffres arabes ou romains.


Line 262: Line 279:
* {{KEY|Axial}} : Les chiffres sont écrits axialement.
* {{KEY|Axial}} : Les chiffres sont écrits axialement.


<span id="Path_section"></span>
===Section de la trajectoire===

[[File:FCCircularText_06_Path.png]]
{{clear}}

La section de titre change et affiche la longueur du fil sélectionné.

Si vous sélectionnez un fil, un arc, un cercle, une ligne et une arête, le chemin de la section est coloré en {{ColoredText|#E0F8E0|vert}} et la commande inutilisée est colorée en {{ColoredText|#F8E0E0|rouge}}

#{{RadioButton|Orthogonal}} le caractère est orthogonal à la vue
#{{RadioButton|Tangent}} le caractère est tangent au chemin du point sur le fil

#{{RadioButton|BB Base}} la base de point du caractère est de pointer le chemin sur le fil
#{{RadioButton|BB Center}} le centre bounBox du caractère est de pointer le chemin sur le fil
#{{RadioButton|BB Top}} le haut boundBox du caractère est de pointer le chemin sur le fil

le dernier bouton radio utilisé est enregistré dans le paramètre de FreeCAD

<span id="Command_section"></span>
===Section des commandes===
===Section des commandes===


Line 271: Line 308:
* {{Button|Run Comp}} : Lance la macro et crée un compount de tous les caractères et le place sur la racine de l'arbre dans la Vue combinéé.
* {{Button|Run Comp}} : Lance la macro et crée un compount de tous les caractères et le place sur la racine de l'arbre dans la Vue combinéé.
* {{Button|Run}} : Lance la macro.
* {{Button|Run}} : Lance la macro.

<span id="Parameters_available"></span>
===Paramètres disponibles===

Certains paramètres sont disponibles dans les paramètres de FreeCAD voir: {{MenuCommand|Menu → Outils → Modifier les paramètres...}}

* Paramètre utilisateur: BaseApp/Preferences/Macros/FCMmacros/FCCircularText

**{{incode|switchModeTextList}} :
***{{FALSE}} le mode texte normal (et noir) désactive switchFontComBox
***{{TRUE}} autorise switchFontComBox 1 (par défaut)
**{{incode|switchFontComBox}} :
***{{FALSE}} (et switchModeTextList = 1) mode texte (en couleur) dans la liste Faster ComboBox (par défaut)
***{{TRUE}} (et switchModeTextList = 1) famille de polices dans la liste ComboBox plus lente mais plus belle!
**{{incode|setSystemFonts}} :
***{{FALSE}} matplotlib.font_manager.findSystemFonts ("C: /", "ttf") font toutes les polices (dans tous les dossiers et sous-dossiers du HD) temps!!
***{{TRUE}} fontman.findSystemFonts (self.pathFont)</br>crée toutes les polices dans le répertoire (et dans tous les sous-dossiers) (par défaut)
**{{incode|seTtextAlignement}} : 0 = AlignLeft (par défaut) 1 = AlignCenter 2 = AlignRight
**{{incode|setFontByDefault}} : Police par défaut (la dernière utilisée)
**{{incode|switchResetFALSE}} : {{FALSE}} reset (par défaut), {{TRUE}} pas de réinitialisation (non recommandé) certains commutateurs peuvent rester ouverts ou se fermer de manière inattendue!
**{{incode|setPathOrthogonal}} : {{TRUE}} {{FALSE}}
**{{incode|setPathTangent}} : {{TRUE}} {{FALSE}}
**{{incode|setPositionBase}} : {{TRUE}} {{FALSE}}
**{{incode|setPositionCenter}} : {{TRUE}} {{FALSE}}
**{{incode|setPositionTop}} : {{TRUE}} {{FALSE}}
**{{incode|switchVersionSearch}} : {{TRUE}} {{FALSE}}
**{{incode|Version}} : version de FCCircularText


En lançant la macro un un dossier '''FcString''' est créé pour les caractères et un dossier '''FcClock''' est créé pour l'horloge. Dans le cas d'un compount, il sera créé en plus sur la racine de l'arbre.
En lançant la macro un un dossier '''FcString''' est créé pour les caractères et un dossier '''FcClock''' est créé pour l'horloge. Dans le cas d'un compount, il sera créé en plus sur la racine de l'arbre.
Line 284: Line 348:
(Voir comment [[Customize_Toolbars/fr|Créer une barre d'outils]])
(Voir comment [[Customize_Toolbars/fr|Créer une barre d'outils]])


===Script===
<div class="toccolours mw-collapsible mw-collapsed">

===Voir le code===

<div class="mw-collapsible-content">


'''Macro_Circular_Text.FCMacro'''
'''Macro_Circular_Text.FCMacro'''


{{MacroCode|code=
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
"""
***************************************************************************
* Copyright (c) 2014 2015 2016 2017 2018 2019 2020 <mario52> *
* *
* This file is a supplement to the FreeCAD CAx development system. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License (LGPL) *
* as published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* for detail see the LICENCE text file. *
** **
* Use at your own risk. The author assumes no liability for data loss. *
* It is advised to backup your data frequently. *
* If you do not trust the software do not use it. *
** **
* This software is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this macro; if not, write to the Free Software *
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
* USA *
***************************************************************************
* http://www.freecadweb.org/wiki/index.php?title=Macro_FCCircularText *
* WARNING! All changes in this file will be lost and *
* may cause malfunction of the program *
***************************************************************************
"""
# FCCircularText.FCMacro # Icon fromTheme FreeCAD
# ver 0.14-2 # 00.14-4 # 00.15 (rmu)# 00.16 # 0.16b # # 0.16c #
#
##################################################################################################
#OS: Windows 10 (10.0) #OS: Ubuntu 19.04
#Word size of OS: 64-bit #Word size of OS: 64-bit
#Word size of FreeCAD: 64-bit #Word size of FreeCAD: 64-bit
#Version: 0.19.21280 (Git) #Version: 0.18.16131 (Git) AppImage
#Build type: Release #Build type: Release
#Branch: master #Branch: (HEAD detached at 0.18.3)
#Hash: 6f3160db3e88733536c7eaf97ad7d6ebd21baccd #Hash: 3129ae4296e40ed20e7b3d460b86e6969acbe1c3
#Python version: 3.6.8 #Python version: 3.6.7
#Qt version: 5.12.1 #Qt version: 5.6.2
#Coin version: 4.0.0a #Coin version: 4.0.0a
#OCC version: 7.3.0 #OCC version: 7.3.0
#Locale: French/Mars (fr_MA) #Locale: French/Mars (fr_MA)
##################################################################################################
#
__Title__ = "FCCircularText"
__Author__ = "Mario52"
__Version__ = "0.16d"
__Date__ = "2020/09/20" #YYYY/MMM/DD

__Comment__ = "This macro creates a text around a cylinder"
__Web__ = "https://forum.freecadweb.org/viewtopic.php?f=3&t=7384%22"
__Wiki__ = "https://wiki.freecadweb.org/Macro_FCCircularText"
__Icon__ = "/usr/lib/freecad/Mod/plugins/icons/FCCircularTextButtom.png"
__IconW__ = "C:/Users/YourUserName/AppData/Roaming/FreeCAD/Macro"
__Help__ = "start the macro and follow the instructions"
__Status__ = "stable"
__Requires__ = "freecad 0.19 and higher"
__Communication__ = "https://wiki.freecadweb.org/index.php?title=User:Mario52"
#

import PySide2
from PySide2 import (QtWidgets, QtCore, QtGui)
from PySide2.QtWidgets import (QWidget, QApplication, QSlider, QGraphicsView, QGraphicsScene, QVBoxLayout, QStyle)
from PySide2.QtGui import (QPainter, QColor, QIcon)
from PySide2.QtSvg import *

import Draft, Part, FreeCAD, math, PartGui, FreeCADGui
from math import sqrt, pi, sin, cos, asin, degrees, radians, tan
from FreeCAD import Base
import os, time, sys

App=FreeCAD
Gui=FreeCADGui
import WebGui

#### Detect version macro ###########################################
def vesionSearch():
import requests
contentPage = requests.get("https://wiki.freecadweb.org/Macro_" + __Title__).text
for i in contentPage.split("\n"): # list page to line
if "ctEven macro-version" in i:
versionDetect = (i.split(">")[1])
if "ctEven macro-date" in i:
dateDetect = (i.split(">")[1])
break
try:
if (versionDetect == __Version__) and (dateDetect == __Date__):
None
else:
msg = ("New version availlable : " + "\n" +
str(versionDetect) + ":" + str(dateDetect) + "\n" +
"You can install with AddonManager")
FreeCAD.Console.PrintMessage("your actual version : " + str(__Version__) + " : " + str(__Date__) + "\n")
FreeCAD.Console.PrintMessage("new version availlable : " + str(versionDetect) + " : " + str(dateDetect) + "\n")
diag = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Information, 'New Version', msg)
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()
except Exception:
None
# return versionDetect, dateDetect
#
#vesionSearch()
#### Detect version macro ###########################################

import sys,traceback
def sayexc(mess=''):
exc_type, exc_value, exc_traceback = sys.exc_info()
ttt=repr(traceback.format_exception(exc_type, exc_value,exc_traceback))
lls=eval(ttt)
l=len(lls)
l2=lls[(l-3):]
FreeCAD.Console.PrintError(mess + "\n" +"--> ".join(l2))

import platform
global verPython ; verPython = sys.version_info

class ConfigManager():

def __init__(self,name):
self.name="Plugins/"+name

def get(self,param,default,defaultWindows=None,defaultMac=None):
global verPython
os=platform.system()
#os='Linux'
#os='Windows'
#os='Darwin'
v=False
if not defaultWindows:
defaultWindows=default
if not defaultMac:
defaultMac=default
if os =='Windows' :
default= defaultWindows
if os =='Darwin' :
default= defaultMac

if verPython.major < 3:
if default.__class__ == unicode:
default=str(default)
# return unicode(encoder).encode('iso-8859-1')
else:
# encoder = str(encoder)
# return encoder
None

if default.__class__ == int:
v=FreeCAD.ParamGet('User parameter:'+self.name).GetInt(param)
if not v:
FreeCAD.ParamGet('User parameter:'+self.name).SetInt(param,default)
if default.__class__ == float:
v=FreeCAD.ParamGet('User parameter:'+self.name).GetFloat(param)
if not v:
FreeCAD.ParamGet('User parameter:'+self.name).SetFloat(param,default)
if default.__class__ == str:
v=FreeCAD.ParamGet('User parameter:'+self.name).GetString(param)
if not v:
FreeCAD.ParamGet('User parameter:'+self.name).SetString(param,default)
if default.__class__ == bool:
v=FreeCAD.ParamGet('User parameter:'+self.name).GetBool(param)
if not v:
FreeCAD.ParamGet('User parameter:'+self.name).SetBool(param,default)
if not v:
v=default
return v

global ui ;ui = ""
global points ;points = 0.0
global coor_X ;coor_X = 0.0
global coor_Y ;coor_Y = 0.0
global coor_Z ;coor_Z = 0.0
global vec ;vec = 0

global PolicePath

cm=ConfigManager("circular text")
PolicePath=cm.get("PolicePath","/usr/share/fonts/","C:/Windows/Fonts/ARIAL.TTF","/Library/Fonts/Arial.ttf")

import FreeCADGui
Gui=FreeCADGui
global rayon ;rayon = 10.0 # radius
global texte ;texte = "FreeCAD the best" #FreeCad The Best your text
global debut ;debut = 0 # begin text
global rotation ;rotation = 360 # must exceed the number of characters of text
global SizeCaractere ;SizeCaractere = 2.0 # size font

global precision ;precision = 0.0
global correctionAngle ;correctionAngle = 10.0
global correctionRayon ;correctionRayon = 0.15
global debout ;debout = 1 # 1=stand 0=flat
global exterieur ;exterieur = 1 # 1=exteral 0=internal
global baseHelix ;baseHelix = 0.0 # base of helix
global endHelix ;endHelix = 0.0 # end of helix (heigth)
global pasHelix ;pasHelix = 2.0 # Pas of helix
global nombreCarParTour ;nombreCarParTour= 10 # number char by Pas
global PivotCharachter ;PivotCharachter = 0.0 # pivot character sur lui meme

global PlacementX ;PlacementX = 0.0 # Placement character axis X
global PlacementY ;PlacementY = 0.0 # Placement characher axis Y
global PlacementZ ;PlacementZ = 0.0 # Placement characher axis Z

global inclinaisonX ;inclinaisonX = 0 # inclination character axis X
global inclinaisonY ;inclinaisonY = 0 # inclination character axis Y
global inclinaisonZ ;inclinaisonZ = 0 # inclination character axis Z + correctionAngle

global cercleClock ;cercleClock = rayon # diameter support clock
global nombreFaces ;nombreFaces = 0 # number Faces of support 0=none 1=circle 2=rectangle 3=triangle 4,5 ... polygon
global romain ;romain = 0 # number roman or arabic
global redressement ;redressement = 0 # character V or circular

global comP ;comP = "" # contener
global nameL ;nameL = "" # contener
global epaisseur ;epaisseur = 0.0 # epaisseur extrusion character
global epaisSupp ;epaisSupp = 0.0 # epaisseur extrusion support

global compount1 ;compount1 = 0 # cree un compose des caracteres

# pointColor
global red ;red = 1.0 # 1 = 255 [ color num x = (1/255)*x ]
global green ;green = 0.0 #
global blue ;blue = 0.0 #

#path#################################################################
global path #
#path = FreeCAD.ConfigGet("AppHomePath") # path FreeCAD installation
#path = FreeCAD.ConfigGet("UserAppData") # path FreeCAD User data
#path = "your path" # your directory path
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") # macro path
path = param.GetString("MacroPath","") + "/" # macro path
path = path.replace("\\","/") # convert the "\" to "/"
#FreeCAD.Console.PrintMessage( "Path for the icons : " + path + "\n")#
######################################################################

indoorIcon = [
"60 46 9 1",
" c None",
". c #6F2322",
"+ c #343433",
"@ c #CE1416",
"# c #3E3E6E",
"$ c #5C5A58",
"% c #5D5C85",
"& c #7A7B99",
"* c #8E8DA5",
"************************************************************",
"************************************************************",
"************************************************************",
"************************************************************",
"************************************************************",
"********************************++++++++++++****************",
"***************************+++++$$$$$$$$$$$$++**************",
"************************+++$$$$$$$$$$$$$$$$$$$++************",
"**********************++$$$$$$$$$$$$$$$$$$$$$$$$++**********",
"*******************+++$$$$$$$$$$$$$$$$$$$$$$$$$$$$+*********",
"******************++$$$$$$$$$$$$$++++$$$$$$$$$$$$$$+********",
"****************++$$$$$$$$$$+++++$$$$+++++$$$$$$$$$+********",
"***************+$$$$$$$$++++$$$$$$$@@@$$$$++$$$$$+++********",
"*************++$$$$$$$$+$$$$$@@@$$$@$$$$$$$$+$$$+$$+********",
"************+$$$$$$$$++$$$$$$@$$$$$@$$$$$$@@$+++$$$$+*******",
"***********+$$$$$$$$+$$@@@$$$@@@$$$@$$$$$@@@$+$$$$$$+*******",
"**********+$$$$$$$$+$$$@$$$$$@$$$$$@@@$$$@$@$+$$$$$$+*******",
"*********+$$$$$$$$+$$$$@@@$$$@@@$$$$+++++@@@$++$$$$$+*******",
"********+$$$$$$$$+$$$$$@$$$$$$$$$+++****@@*@+@@@$$$+********",
"*******+$$$$$$$$+$@@@$$@@@$$$++++************@*@@++*********",
"******+$$$$$$$$+$$@$@.$$$$$++****************@**@***********",
"******+$$$$$$$$+$$@@@$$$$++******************@@*@***********",
"*****+$$$$$$$$++$$@$@.$++********************@@@@***********",
"*****+$$$$$$$$++$$@$$@+*************************************",
"*****+$$$$$$++$$$$$$+***************************************",
"****+$$$$$$$+$$$$$++****************************************",
"****+$$$$$$$+$@@@.+*****************************************",
"****+$$$$$$$+$@$$+******************************************",
"****+$$$$$$$+$@@@+******************************************",
"****+$$$$$$$$.@$+*******************************************",
"****+$$$$$$$$.@$+*******************************************",
"****+$$$$$$$++$$+*******************************************",
"****+$$$$$$+++$$+*******************************************",
"*****+$$$++$$$+$+*******************************************",
"*****+$++$$$$$+$+*******************************************",
"******+$$$$$$$+++*******************************************",
"*******+$$$$$$$++*******************************************",
"*******+$$$$$$$+********************************************",
"********+$$$$$$+********************************************",
"********+$$$$++*********************************************",
"********++$++***********************************************",
"*********++*************************************************",
"************************************************************",
"************************************************************",
"************************************************************",
"************************************************************"]

helpIcon = [
"24 24 4 1",
" c None",
". c #016AC5",
"+ c #F8F8FF",
"@ c #FFFFFF",
"........................",
".++++++++++++++++++++++.",
".++++++++++++++++++++++.",
".++..................++.",
".++..................++.",
".++......@@@@@@......++.",
".++.....@@@@@@@@.....++.",
".++.....@@@..@@@.....++.",
".++.....@@....@@.....++.",
".++.....@@....@@.....++.",
".++...........@@.....++.",
".++..........@@@.....++.",
".++.........@@@......++.",
".++........@@@.......++.",
".++........@@........++.",
".++........@@........++.",
".++..................++.",
".++........@@........++.",
".++........@@........++.",
".++..................++.",
".++..................++.",
".++++++++++++++++++++++.",
".++++++++++++++++++++++.",
"........................"]

executeIcon = [
"24 24 3 1",
" c None",
". c #4E9A06",
"+ c #FFFFFF",
" ",
" ",
" ",
" . ",
" .+. ",
" .+.+. ",
" .+...+. ",
" .+.....+. ",
" . .+.......+.",
" .+. .+.......+. ",
" .+.+. .+.......+. ",
" .+...+. .+.......+. ",
" .+.....+.+.......+. ",
".+.......+.......+. ",
" .+.............+. ",
" .+...........+. ",
" .+.........+. ",
" .+.......+. ",
" .+.....+. ",
" .+...+. ",
" .+.+. ",
" .+. ",
" . ",
" "]

quitIcon = [
"24 24 3 1",
" c None",
". c #FFFFFF",
"+ c #CC0000",
" .... ",
"++++++++++....++++++++++",
"+.......++....++.......+",
"+.......++....++.......+",
"+.......++....++.......+",
"+...++++++....++++++...+",
"+...++++++....++++++...+",
"+...+++++......+++++...+",
"+...+++++......+++++...+",
"+...+++++......+++++...+",
"+...+++++......+++++...+",
"+...+++++......+++++...+",
"+...+++++......+++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+...++++++++++++++++...+",
"+......................+",
"+......................+",
"+......................+",
"++++++++++++++++++++++++"]

resetIcon = [
"24 24 3 1",
" c None",
". c #3465A4",
"+ c #888A85",
" ",
" ........ ",
" .++++++++. ",
" .++..+....+. ..... ",
" .+.. .+....+. .+++. ",
" .+. .+....+..+.+. ",
" ... .+....+.+.+. ",
" .+....+..+. ",
" .+......+. ",
" .+.....+. ",
" .+....+. ",
" ...... .+...+. ",
" .++++. .++++. ",
" .+...+. ...... ",
" .+....+. ",
" .+.....+. ",
" .+......+. ",
" .+..+....+. ",
" .+.+.+....+. ... ",
" .+.+..+....+. .+. ",
" .+++. .+....+. ..+. ",
" ..... .+....+..++. ",
" .++++++++. ",
" ........ "]

standIcon = [
"16 16 9 1",
" c None",
". c #010400",
"+ c #28090D",
"@ c #4C0000",
"# c #770000",
"$ c #AE0000",
"% c #262826",
"& c #CB0000",
"* c #FD0705",
"*********** ",
"*********** ",
"** *** ** ",
"** *...........",
" *...........",
" *.. ... ..",
" *** ... ",
" *** ... ",
" *** ... ",
" *** ... ",
" *** ... ",
" ***** ... ",
" ... ",
" ... ",
" ..... ",
" "]

flatIcon = [
"16 16 9 1",
" c None",
". c #020400",
"+ c #2B0500",
"@ c #620502",
"# c #770301",
"$ c #970300",
"% c #B40100",
"& c #E60002",
"* c #FE0004",
" ",
" ",
" ",
" ",
" ** . ",
" *** ... ",
" ** ... ",
" *** .. ",
" *** .. ",
" ****&#... ",
" *****$+.....% ",
" ** &.+%@...@. ",
" ** ..#*&%@....",
"**** ... *&$...",
" *** .. ** ..",
" ."]

romanIcon = [
"16 16 5 1",
" c None",
". c #FD9806",
"+ c #FD9904",
"@ c #FD9905",
"# c #FD9906",
" ",
" ",
" @@ ",
" @@@@@ ",
" @@@@@ @@ ",
" @@@@ @@ @@ ",
"@@ @@ @@ @@ ",
"@@@ @@ @@ @@ ",
" @@@@ @@ @@ ",
" +@@ @@ @@ ",
" #@@@ @ @@@",
" @@ .@@ @@@@ ",
" @# @@@@@ ",
" +@@@@@ ",
" @@ ",
" "]

arabicIcon = [
"16 16 5 1",
" c None",
". c #F6972B",
"+ c #F6982B",
"@ c #F5972B",
"# c #F7982B",
" ",
" ",
" ",
" .. ",
" .. ..... ",
" ... .. ",
" . .. ",
" .+ .. ",
" .+ @. ",
" .+ #.... ",
" ... ... ",
" .... ",
" ... ",
" ....... ",
" ... ",
" "]

redressIcon = [
"16 16 4 1",
" c None",
". c #010400",
"+ c #000000",
"@ c #FD9905",
" ",
" ",
".. ..+ ",
" . . ",
" . ++ .. ",
" . + . ",
"... ... . ",
" . ",
" @ ... ",
" @ ",
" @ @ ..+ ",
" @ @ . ",
" @@@ .+ ",
" @@ . ",
" ..+ ",
" "]

axialIcon = [
"16 16 4 1",
" c None",
". c #000000",
"+ c #010400",
"@ c #FD9905",
" ",
" ",
"++ ++. ",
" + + ",
" + .. +. ",
" + . +. ",
"+++ +++ + ",
" ++ ",
" @ + ",
" @ ",
" @ @ ",
" @ @ + +",
" @@@ + + +",
" @@ .+.+.",
" ",
" "]

#### matplotlib debut 1/5 #################################################################
#import PySide2
#from PySide2 import (QtWidgets, QtCore, QtGui)
#from PySide2.QtWidgets import (QWidget, QApplication, QSlider, QGraphicsView, QGraphicsScene, QVBoxLayout, QStyle)

import re
import operator
from operator import itemgetter #, attrgetter, methodcaller # pour sort

setIconTTF = [
"16 16 6 1",
" c None",
". c #204A87",
"+ c None",
"@ c #729FCF",
"# c #CC0000",
"$ c #EDD400",
".+++++++++++@@@@",
".++++++++@+@++@@",
".++#####++++@@+@",
".+++$#$$$++@+@+@",
".++++#$+++++++@+",
".++++#$#####++++",
".++++#$+$#$$$+++",
".++++#$++#$+++++",
".@++++$++#$+###+",
".@@++++++#$+#$$$",
"..@@+++++#$+#$++",
"...@@+++++$+###+",
"....@@++++++#$$$",
".....@@+++++#$++",
"......@@+++++$++",
"................"]

setIconFON = [
"16 16 6 1",
" c None",
". c #204A87",
"+ c None",
"@ c #F57900",
"# c #CC0000",
"$ c #EDD400",
".+++++++++++@@@@",
".++++++++@+@++@@",
".++###++++++@@+@",
".++#$$$++++@+@+@",
".++#$+++++++++@+",
".++###+###++++++",
".++#$$$#$#$+++++",
".++#$++#$#$+++++",
".@++$++#$#$##+#+",
".@@++++#$#$##$#$",
"..@@+++###$#$##$",
"...@@+++$$$#$##$",
"....@@+++++#$+#$",
".....@@++++#$+#$",
"......@@++++$++$",
"................"]

setIconOTF = [
"16 16 6 1",
" c None",
". c #204A87",
"+ c None",
"@ c #4E9A06",
"# c #CC0000",
"$ c #EDD400",
".+++++++++++@@@@",
".++++++++@+@++@@",
".++###++++++@@+@",
".++#$#$++++@+@+@",
".++#$#$+++++++@+",
".++#$#$###++++++",
".++#$#$+#$$+++++",
".++###$+#$++++++",
".@++$$$+#$+###++",
".@@+++++#$+#$$$+",
"..@@++++#$+#$+++",
"...@@++++$+###++",
"....@@+++++#$$$+",
".....@@++++#$+++",
"......@@++++$+++",
"................"]

setIconPOL = [
"16 16 12 1",
" c None",
". c #204A87",
"+ c None",
"@ c #06989A",
"# c #73D216",
"$ c #000000",
"% c #75507B",
"& c #729FCF",
"* c #CC0000",
"= c #F57900",
"- c #EDD400",
"; c #4E9A06",
".+++++++++++@#$%",
".++++++++$+#++&$",
".++***++++++=@+%",
".++*-*-++++*+&+$",
".++*-*-+++++++*+",
".++***-***++++++",
".++*---*-*-+++++",
".++*-++*-*-+++++",
".$++-++*-*-*++++",
".*@++++*-*-*-+++",
"..#*+++***-*-+++",
"...;#+++---*-+++",
"....%=+++++*-+++",
".....;$++++****+",
"......@%++++----",
"................"]

#import glob
#files_TTF = glob.glob(self.pathFont + "/*.TTF")
##################################
import matplotlib
import matplotlib.font_manager
import matplotlib.font_manager as fontman
import matplotlib.font_manager as fontconfig
from matplotlib.font_manager import FontProperties
#from matplotlib.ft2font import FT2Font
##################################

#### Config Begin matplotlib font #######################
# # https://en.wikipedia.org/wiki/Web_colors
global setColorTTF ; setColorTTF = "blue" # .TTF color by "extension name" or hexa "#0000FF"
global setColorFON ; setColorFON = "orange" # .FON color by "extension name" or hexa "#FFA500"
global setColorOTF ; setColorOTF = "green" # .OTF color by "extension name" or hexa "#008000"
global setColorPOL ; setColorPOL = "black" # .OTHER color by "extension name" or hexa "#000000"
#####
global switchModeTextList; switchModeTextList= 1 # 0 = mode text normal (et noir) coupe le switchFontComBox
# 1 = permet le switchFontComBox 1 (default)
#####
global switchFontComBox ; switchFontComBox = 0 # 0 = (et switchModeTextList= 1) mode texte (en couleur) dans liste ComboBox plus rapide (default)
# 1 = (et switchModeTextList= 1) fontFamily dans liste ComboBox plus lent mais plus beau!
#####
global setSystemFonts ; setSystemFonts = 1 # 0 = matplotlib.font_manager.findSystemFonts("C:/", "ttf")
# fait toutes les fontes (dans tous les dossiers et sous dossiers du DD) time !!
# 1 = fontman.findSystemFonts(self.pathFont)
# fait toutes les fontes du repertoire (et dans tous les sous dossiers) (default)
#####
global seTtextAlignement ; seTtextAlignement = 0 # 0 = AlignLeft (default)
# 1 = AlignCenter
# 2 = AlignRight
#####
global setFontByDefault ; setFontByDefault = "ARIAL" # Font by Default
#####
global switchResetFALSE ; switchResetFALSE = 0 # 0 = reset (default)
# 1 = pas de reset (non conseille) certains switch peuvent rester ouvert ou fermer inopinement !
#####
#### Config End matplotlib font #########################

def createSpace(texte): # detecte majuscule et ajoute un espace devant la lettre
# return createSpace(TexTe) = Tex Te , if createSpace(TEXTE) = TEXTE
if texte.isupper():
stringSpace = texte
else:
try:
stringSpace = texte[0]
for i in texte[1:]:
if re.search(r"[A-Z]", i): i = " " + i
stringSpace += i
except Exception:
stringSpace = texte
return stringSpace

def family(chaine):
# return family(chaine)[1] = Family , family(chaine)[2] = typeCar (form [a, b, c ...]
famille = typeCar = ""
try:
if chaine.find('-') != -1:
famille = chaine[:chaine.find('-')]
typeCar = chaine[chaine.find('-')+1:]
else:
famille = chaine
typeCar = ""
except Exception:
famille = chaine
typeCar = ""
typeCar = str(createSpace(typeCar)).split()
return [createSpace(famille), typeCar]

class MyLabelPatience(): # fenetre image d'attente de chargement
global path
label = QtWidgets.QLabel()
label.setText("<img src=" + path + "FCCircularTextButtom.png><b><center>Wait please</center> \n\n<center>i search the fonts !\n\n</right></b>")
ecran = FreeCADGui.getMainWindow().frameGeometry()
xF = 250; yF = 250
xW = (ecran.width()/2) - (xF/2)
yW = (ecran.height()/2)- (yF/2)
label.setGeometry(xW, yW, xF, yF)
label.setStyleSheet("QLabel {background-color : #F0C300;font: 12pt; }");
label.setWindowFlags(PySide2.QtCore.Qt.WindowFlags(PySide2.QtCore.Qt.FramelessWindowHint)) # pas de bords
label.setWindowFlags(PySide2.QtCore.Qt.WindowStaysOnTopHint) # PySide cette fonction met la fenetre en avant
#### matplotlib fin 1/5 #################################################################

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s

try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):

def __init__(self):
global path
self.path = path

#### matplotlib debut 2/5 apres __init__ #################################################################
#### matplotlib font textEdit
self.FontTextSize = 20
self.fonteComp = ""
self.font = QtGui.QFont()
self.tableau = [] #Index (), [chemin plus nom fichier (nomPathPolice), nom sans extension (nomSimple), nomSimpleExt (nomSimple + Ext)]
self.index = 0 #Index ()
#### matplotlib font textEdit
def searchFont(self,pathSearch):
global PolicePath
global setSystemFonts
global seTtextAlignement
global switchFontComBox
global switchModeTextList
global setFontByDefault

MyLabelPatience.label.show()
FreeCADGui.updateGui() # rafraichi l'ecran

files_All_Fonts = ""
##https://matplotlib.org/_modules/matplotlib/font_manager.html

if setSystemFonts == 0:
files_All_Fonts = matplotlib.font_manager.findSystemFonts(pathSearch, "ttf") # fait toutes les fontes ? ()
else:
files_All_Fonts = fontman.findSystemFonts(pathSearch) # fait toutes les fontes (et dans tous les sous dossiers)

if len(files_All_Fonts) > 0:
self.tableau = []
self.index = 0

for fonte in files_All_Fonts:
####
nomPathPolice = nomFichier = nomSimpleExt = nomSimple = nomExtension = nameName = ""

nomPathPolice = fonte.replace("\\","/") # convert the "\" to "/"
nomFichier = nomPathPolice.split("/") # complet split
nomSimpleExt = nomFichier[-1] # nom avec extension
nomSimple = nomFichier[-1][:-4] # nom sans extension
nomExtension = nomSimpleExt[nomSimpleExt.rfind('.')+1:].upper() # extension

####
try:
# nameFamily = matplotlib.font_manager.FontProperties(fname=fonte).get_family() ##['sans-serif']
# nameStyle = matplotlib.font_manager.FontProperties(fname=fonte).get_style() #normal
# nameVariant = matplotlib.font_manager.FontProperties(fname=fonte).get_variant() #normal
# nameWeight = matplotlib.font_manager.FontProperties(fname=fonte).get_weight() #normal
# nameStretch = matplotlib.font_manager.FontProperties(fname=fonte).get_stretch() #normal
# nameFileComp = matplotlib.font_manager.FontProperties(fname=fonte).get_file() ##c:\windows\fonts\NotoNaskhArabicUI-Regular.ttf
# nameSize = matplotlib.font_manager.FontProperties(fname=fonte).get_size() #10.0
nameName = matplotlib.font_manager.FontProperties(fname=fonte).get_name() ##Noto Naskh Arabic UI
# nameSizePoint = matplotlib.font_manager.FontProperties(fname=fonte).get_size_in_points() #10.0
# nameSlant = matplotlib.font_manager.FontProperties(fname=fonte).get_slant() #normal
# namePattern = matplotlib.font_manager.FontProperties(fname=fonte).get_fontconfig_pattern() #:family=sans-serif:style=normal:variant=normal:weight=normal:stretch=normal:file=c:\windows\fonts\NotoNaskhArabicUI-Regular.ttf:size=10.0
except Exception:
nameFamily = nameStyle = nameVariant = nameWeight = nameStretch = nameFileComp = nameSize = nameName = nameSizePoint = nameSlant = namePattern = ""
####
if nameName == "" :
nameName = nomSimple
self.tableau.append([0, nomPathPolice, nomSimple, nomSimpleExt.upper(), nomExtension.upper(), nameName])
self.tableau = sorted(self.tableau, key=itemgetter(3)) # sorted by nomSimple.upper()

try:
for line in range(len(self.tableau)): # enleve les doubles (bon)
if self.tableau[line][2] == self.tableau[line + 1][2]: # enleve les doubles (bon)
del(self.tableau[line + 1]) # enleve les doubles (bon)
except Exception:
None

self.comboBoxPy.clear()
for line in range(len(self.tableau)):
try:
self.tableau[line][0] = line # ajoute le numero de ligne
if self.tableau[line][2].upper() == setFontByDefault.upper(): # detecte la fonte de base
self.index = line
PolicePath = self.tableau[line][1]
####Section common color and font begin ######################
model = self.comboBoxPy.model()

if switchModeTextList == 1:
if self.tableau[line][4] == "TTF":
item = QtGui.QStandardItem(QtGui.QPixmap(setIconTTF), str(line))
item.setForeground(QtGui.QColor(setColorTTF))
elif self.tableau[line][4] == "FON":
item = QtGui.QStandardItem(QtGui.QPixmap(setIconFON), str(line))
item.setForeground(QtGui.QColor(setColorFON))
elif self.tableau[line][4] == "OTF":
item = QtGui.QStandardItem(QtGui.QPixmap(setIconOTF), str(line))
item.setForeground(QtGui.QColor(setColorOTF))
else:
item = QtGui.QStandardItem(QtGui.QPixmap(setIconPOL), str(line))
item.setForeground(QtGui.QColor(setColorPOL))

if seTtextAlignement == 0:
item.setTextAlignment(QtCore.Qt.AlignLeft)
elif seTtextAlignement == 1:
item.setTextAlignment(QtCore.Qt.AlignCenter)
elif seTtextAlignement == 2:
item.setTextAlignment(QtCore.Qt.AlignRight)
else:
self.comboBoxPy.addItem(self.tableau[line][2])
model.appendRow(item)
else:
self.comboBoxPy.addItem("")
self.comboBoxPy.setItemText(line, self.tableau[line][2])
####Section item color and font end ##########################
####Section setfont Family switchFontComBox begin#############
if (switchFontComBox == 1) and (switchModeTextList == 1):
typeCar = font = ""
font = QtGui.QFont()
#font = item.font()
typeCar = family(self.tableau[line][2])[1]
font.setBold(False)
font.setItalic(False)
if len(typeCar) > 0:
for option in typeCar:
if option == "Bold":
font.setBold(True)
if (option == "Italic") or (option == "It") or (option == "Slanted"):
font.setItalic(True)
if option == "Oblique":
font.setItalic(True)
#'Bold''Regular''Slanted''Italic''Medium''Extra''Light''Condensed''Black''It''Semibold'
font.setFamily(self.tableau[line][5])
font.setPixelSize(15)
if switchModeTextList == 1:
item.setFont(font)
else:
self.comboBoxPy.addItem("")
####Section setfont Family switchFontComBox end###############

except Exception:
FreeCAD.Console.PrintMessage("searchFont()" + "\n")
None

self.lineEdit_NameFile.setText("(" + str(self.index + 1) + "/" + str(len(self.tableau)) + ") " + self.tableau[self.index][1])
self.comboBoxPy.setCurrentIndex(self.index)
self.fonteComp = self.tableau[self.index][1]
MyLabelPatience.label.close()
#### matplotlib fin 2/5 apres __init__ #################################################################

def setupUi(self, MainWindow):
self.window = MainWindow

global ui
global PolicePath
global rayon
global texte
global rotation
global SizeCaractere
global debout
global exterieur

global precision
global correctionAngle
global correctionRayon
global baseHelix
global endHelix
global nombreCarParTour

global epaisseur
global epaisSupp
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(360, 400)
# MainWindow.setMaximumSize(QtCore.QSize(370, 638))
# MainWindow.setMinimumSize(QtCore.QSize(400, 640))

self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
self.groupBox_00 = QtWidgets.QGroupBox()

self.groupBox_01 = QtWidgets.QGroupBox()
# self.groupBox_01.setMaximumHeight(180)

self.textEdit = QtWidgets.QTextEdit()
# self.textEdit.setMaximumHeight(100)
self.PB_Reverse = QtWidgets.QPushButton()
self.PB_Reverse.clicked.connect(self.on_PB_Reverse)

self.PB_Help = QtWidgets.QPushButton(MainWindow)
self.PB_Help.setIcon(QtGui.QIcon(QtGui.QPixmap(helpIcon))) # help icone dans une variable
self.PB_Help.clicked.connect(self.on_PB_Help_clicked) # help

#### matplotlib debut 3/5 setupUi #################################################################
self.lineEdit_NameFile = QtWidgets.QLineEdit()
#self.lineEdit_NameFile.returnPressed.connect(self.on_lineEdit_NameFile)
self.comboBoxPy = QtWidgets.QComboBox()
####
self.pathFont = PolicePath[:len(PolicePath)-(PolicePath[::-1].index("/"))-1]
####
ui.searchFont(self.pathFont)
QtCore.QObject.connect(self.comboBoxPy, QtCore.SIGNAL("currentIndexChanged(int)"), self.on_fontComboBoxPython)
#### matplotlib fin 3/5 setupUi #################################################################
####
self.groupBox_02 = QtWidgets.QGroupBox()

self.DS_Radius_Circle = QtWidgets.QDoubleSpinBox()
self.DS_Radius_Circle.setMinimum(-99999999.0)
self.DS_Radius_Circle.setMaximum(99999999.0)
self.DS_Radius_Circle.setValue(rayon)
self.DS_Radius_Circle.valueChanged.connect(self.on_DS_Radius_Circle) #connection doubleSpinBox
self.label_10 = QtWidgets.QLabel()

self.DS_Size_Character = QtWidgets.QDoubleSpinBox()
self.DS_Size_Character.setMinimum(0.0)
self.DS_Size_Character.setMaximum(99999999.0)
self.DS_Size_Character.setSingleStep(1.0)
self.DS_Size_Character.setValue(SizeCaractere)
self.DS_Size_Character.valueChanged.connect(self.on_DS_Size_Character) #connection doubleSpinBox
self.label_4 = QtWidgets.QLabel()

self.S_Begin_Angle = QtWidgets.QSpinBox()
self.S_Begin_Angle.setMaximum(360.0)
self.S_Begin_Angle.setValue(debut)
self.S_Begin_Angle.valueChanged.connect(self.on_S_Begin_Angle) #connection SpinBox
self.label_13 = QtWidgets.QLabel()

self.S_End_Angle = QtWidgets.QSpinBox()
self.S_End_Angle.setMaximum(360)
self.S_End_Angle.setValue(rotation)
self.S_End_Angle.valueChanged.connect(self.on_S_End_Angle) #connection SpinBox
self.label_14 = QtWidgets.QLabel()

self.DS_Correction_Angle = QtWidgets.QDoubleSpinBox()
self.DS_Correction_Angle.setMinimum(-359.00)
self.DS_Correction_Angle.setMaximum(359.00)
self.DS_Correction_Angle.setValue(correctionAngle)
self.DS_Correction_Angle.valueChanged.connect(self.on_DS_Correction_Angle) #connection doubleSpinBox
self.label_7 = QtWidgets.QLabel()

self.DS_Correction_Radius = QtWidgets.QDoubleSpinBox()
self.DS_Correction_Radius.setMinimum(-99999999.0)
self.DS_Correction_Radius.setMaximum(99999999.0)
self.DS_Correction_Radius.setValue(correctionRayon)
self.DS_Correction_Radius.valueChanged.connect(self.on_DS_Correction_Radius) #connection doubleSpinBox
self.label_8 = QtWidgets.QLabel()

self.DS_Extrude = QtWidgets.QDoubleSpinBox()
self.DS_Extrude.setEnabled(False)
self.DS_Extrude.setMinimum(-99999999.0)
self.DS_Extrude.setMaximum(99999999.0)
self.DS_Extrude.setValue(epaisseur)
self.DS_Extrude.valueChanged.connect(self.on_DS_Extrude) #connection doubleSpinBox

self.CH_Extrude = QtWidgets.QCheckBox()
self.CH_Extrude.clicked.connect(self.on_CH_Extrude) #connection checkBox

self.DS_PlacementX = QtWidgets.QDoubleSpinBox()
self.DS_PlacementX.setEnabled(False)
self.DS_PlacementX.setSpecialValueText(_fromUtf8(""))
self.DS_PlacementX.setMinimum(-9999999.0)
self.DS_PlacementX.setMaximum(9999999.99)
self.DS_PlacementX.valueChanged.connect(self.on_DS_PlacementX) #connection doubleSpinBox

self.DS_PlacementY = QtWidgets.QDoubleSpinBox()
self.DS_PlacementY.setEnabled(False)
self.DS_PlacementY.setSpecialValueText(_fromUtf8(""))
self.DS_PlacementY.setMinimum(-9999999.0)
self.DS_PlacementY.setMaximum(9999999.99)
self.DS_PlacementY.valueChanged.connect(self.on_DS_PlacementY) #connection doubleSpinBox

self.DS_PlacementZ = QtWidgets.QDoubleSpinBox()
self.DS_PlacementZ.setEnabled(False)
self.DS_PlacementZ.setSpecialValueText(_fromUtf8(""))
self.DS_PlacementZ.setMinimum(-9999999.0)
self.DS_PlacementZ.setMaximum(9999999.99)
self.DS_PlacementZ.valueChanged.connect(self.on_DS_PlacementZ) #connection doubleSpinBox

self.CH_Sp_Placement = QtWidgets.QCheckBox()
self.CH_Sp_Placement.clicked.connect(self.on_CH_Sp_Placement) #connection checkBox

self.DS_InclinaisonX = QtWidgets.QSpinBox()
self.DS_InclinaisonX.setEnabled(False)
self.DS_InclinaisonX.setMinimum(-360.0)
self.DS_InclinaisonX.setMaximum(360.0)
self.DS_InclinaisonX.setValue(inclinaisonX)
self.DS_InclinaisonX.valueChanged.connect(self.on_DS_InclinaisonX) #connection doubleSpinBox

self.DS_InclinaisonY = QtWidgets.QSpinBox()
self.DS_InclinaisonY.setEnabled(False)
self.DS_InclinaisonY.setMinimum(-360)
self.DS_InclinaisonY.setMaximum(360)
self.DS_InclinaisonY.setValue(inclinaisonY)
self.DS_InclinaisonY.valueChanged.connect(self.on_DS_InclinaisonY) #connection doubleSpinBox

self.DS_InclinaisonZ = QtWidgets.QSpinBox()
self.DS_InclinaisonZ.setEnabled(False)
self.DS_InclinaisonZ.setMinimum(-360.0)
self.DS_InclinaisonZ.setMaximum(360.0)
self.DS_InclinaisonZ.setValue(inclinaisonZ)
self.DS_InclinaisonZ.valueChanged.connect(self.on_DS_InclinaisonZ) #connection doubleSpinBox

self.CH_Sp_Inclination = QtWidgets.QCheckBox()
self.CH_Sp_Inclination.clicked.connect(self.on_CH_Sp_Inclination) #connection checkBox
####
self.groupBox_03 = QtWidgets.QGroupBox()

self.RA_Choice_Outdoor = QtWidgets.QRadioButton()
self.RA_Choice_Outdoor.setChecked(True)
self.RA_Choice_Outdoor.clicked.connect(self.on_RA_Choice_Outdoor) #connection radioButton

self.RA_Choice_Indoor = QtWidgets.QRadioButton()
self.RA_Choice_Indoor.clicked.connect(self.on_RA_Choice_Indoor) #connection radioButton

self.RA_Choice_Helix = QtWidgets.QRadioButton()
self.RA_Choice_Helix.clicked.connect(self.on_RA_Choice_Helix) #connection radioButton

self.RA_Choice_Clock = QtWidgets.QRadioButton()
self.RA_Choice_Clock.clicked.connect(self.on_RA_Choice_Clock) #connection radioButton

self.PU_Flat = QtWidgets.QPushButton()
self.PU_Flat.setEnabled(True)
self.PU_Flat.setIcon(QtGui.QIcon(QtGui.QPixmap(standIcon))) # icone dans une variable
self.PU_Flat.clicked.connect(self.on_PU_Flat)

self.graphicsView = QtWidgets.QGraphicsView()
####Screen Graphic BitMap
##https://doc.qt.io/qtforpython/PySide2/QtCore/Qt.html
self.graphicsView = QtWidgets.QGraphicsView()
self.graphicsView.setObjectName("graphicsView")
self.graphicsView.setFixedSize(215,60)
# pic = QtGui.QPixmap(indoorIcon) # png
# self.scene = QtWidgets.QGraphicsScene()
# self.scene.addPixmap(QtGui.QPixmap(pic)) # png (bmp)
# self.graphicsView.setScene(self.scene)
####Screen Graphic BitMap
####
self.groupBox_04 = QtWidgets.QGroupBox()
self.groupBox_04.setEnabled(False)
self.groupBox_04.setCheckable(False)
self.groupBox_04.setVisible(False)

self.DS_Step_Of_The_Helix = QtWidgets.QDoubleSpinBox()
self.DS_Step_Of_The_Helix.setMaximum(99999999.99)
self.DS_Step_Of_The_Helix.setValue(pasHelix)
self.DS_Step_Of_The_Helix.valueChanged.connect(self.on_DS_Step_Of_The_Helix) #connection doubleSpinBox
self.label_12 = QtWidgets.QLabel()

self.DS_Number_Char_Per_Turn = QtWidgets.QSpinBox()
self.DS_Number_Char_Per_Turn.setMaximum(99999999)
self.DS_Number_Char_Per_Turn.setValue(nombreCarParTour)
self.DS_Number_Char_Per_Turn.valueChanged.connect(self.on_DS_Number_Char_Per_Turn) #connection doubleSpinBox
self.label = QtWidgets.QLabel()

self.DS_Base_Helix = QtWidgets.QDoubleSpinBox()
self.DS_Base_Helix.setEnabled(False)
self.DS_Base_Helix.setMinimum(-99999999.0)
self.DS_Base_Helix.setMaximum(99999999.0)
self.DS_Base_Helix.setValue(baseHelix)
self.DS_Base_Helix.valueChanged.connect(self.on_DS_Base_Helix) #connection doubleSpinBox
self.label_2 = QtWidgets.QLabel()
self.DS_End_Helix = QtWidgets.QDoubleSpinBox()
self.DS_End_Helix.setEnabled(False)
self.DS_End_Helix.setMinimum(-99999999.0)
self.DS_End_Helix.setMaximum(99999999.0)
self.DS_End_Helix.setValue(endHelix)
self.DS_End_Helix.valueChanged.connect(self.on_DS_End_Helix) #connection doubleSpinBox
self.label_3 = QtWidgets.QLabel()
####
self.groupBox_05 = QtWidgets.QGroupBox()
self.groupBox_05.setEnabled(False)
self.groupBox_05.setVisible(False)

self.DS_Radius_Support = QtWidgets.QDoubleSpinBox()
self.DS_Radius_Support.setMaximum(99999999.99)
self.DS_Radius_Support.setValue(cercleClock)
self.DS_Radius_Support.valueChanged.connect(self.on_DS_Radius_Support) #connection doubleSpinBox
self.label_11 = QtWidgets.QLabel()

self.PU_Roman = QtWidgets.QPushButton()
self.PU_Roman.setIcon(QtGui.QIcon(QtGui.QPixmap(arabicIcon))) # icone dans une variable
self.PU_Roman.clicked.connect(self.on_PU_Roman)

self.S_Number_Faces_Support = QtWidgets.QSpinBox()
self.S_Number_Faces_Support.setMaximum(999)
self.S_Number_Faces_Support.setValue(nombreFaces)
self.S_Number_Faces_Support.valueChanged.connect(self.on_S_Number_Faces_Support) #connection SpinBox
self.label_5 = QtWidgets.QLabel()

self.PU_Redress = QtWidgets.QPushButton()
self.PU_Redress.setIcon(QtGui.QIcon(QtGui.QPixmap(axialIcon))) # icone dans une variable
self.PU_Redress.clicked.connect(self.on_PU_Redress)

self.DS_Extrude_Support = QtWidgets.QDoubleSpinBox()
self.DS_Extrude_Support.setMaximum(99999999.0)
self.DS_Extrude_Support.setEnabled(False)
self.DS_Extrude_Support.setValue(epaisSupp)
self.DS_Extrude_Support.valueChanged.connect(self.on_DS_Extrude_Support) #connection doubleSpinBox
self.label_6 = QtWidgets.QLabel()
####
self.groupBox_06 = QtWidgets.QGroupBox()

self.PU_Exit = QtWidgets.QPushButton()
self.PU_Exit.setIcon(QtGui.QIcon(QtGui.QPixmap(quitIcon))) # quit icone dans une variable
#self.PU_Exit.setIconSize(QtCore.QSize(26, 26))
self.PU_Exit.clicked.connect(self.on_PU_Exit)

self.PU_Reset = QtWidgets.QPushButton()
self.PU_Reset.setEnabled(True)
self.PU_Reset.setIcon(QtGui.QIcon(QtGui.QPixmap(resetIcon))) # reset icone dans une variable
self.PU_Reset.clicked.connect(self.on_PU_Reset)

self.PU_Benchmarks = QtWidgets.QPushButton()
self.PU_Benchmarks.setIcon(QtGui.QIcon(QtGui.QPixmap(executeIcon)))# execute icone dans une variable
self.PU_Benchmarks.clicked.connect(self.on_PU_Benchmarks)

self.PU_Execute = QtWidgets.QPushButton()
self.PU_Execute.setIcon(QtGui.QIcon(QtGui.QPixmap(executeIcon)))# execute icone dans une variable
self.PU_Execute.clicked.connect(self.on_PU_Execute)
####
self.DS_Pivot_Char = QtWidgets.QDoubleSpinBox()
self.DS_Pivot_Char.setEnabled(False)
self.DS_Pivot_Char.setMinimum(-360.0)
self.DS_Pivot_Char.setMaximum(360.0)
self.DS_Pivot_Char.setValue(0.0)
self.DS_Pivot_Char.valueChanged.connect(self.on_DS_Pivot_Char) #connection doubleSpinBox

self.CH_Pivot_Character = QtWidgets.QCheckBox()
self.CH_Pivot_Character.clicked.connect(self.on_CH_Pivot_Character) #connection checkBox
####
#### gridLayout begin #######################
self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)
self.gridLayout.setContentsMargins(10, 10, 10, 10)
##
self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_00)
self.groupBox_00.setMaximumHeight(650)
self.gridLayout_2.setContentsMargins(10, 10, 10, 10)
# self.gridLayout_2.setSpacing(6)
##
self.gridLayout_Texte = QtWidgets.QGridLayout(self.groupBox_01) # groupes .....
self.groupBox_01.setMaximumHeight(130)
# self.gridLayout_Texte.setSpacing(6)
self.gridLayout_Texte.setContentsMargins(10, 10, 10, 10)
self.gridLayout_Texte.addWidget(self.textEdit, 0, 0, 1, 1)
self.gridLayout_Texte.addWidget(self.PB_Reverse, 0, 1, 1, 1)
self.gridLayout_Texte.addWidget(self.lineEdit_NameFile,1, 0, 1, 1)#_Font
self.gridLayout_Texte.addWidget(self.PB_Help,1, 1, 1, 1)
self.gridLayout_Texte.addWidget(self.comboBoxPy,2, 0, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_01, 0, 0, 1, 1)
####
self.gridLayout_Config = QtWidgets.QGridLayout(self.groupBox_02)
self.gridLayout_Config.setContentsMargins(10, 10, 10, 10)
self.groupBox_02.setMaximumHeight(450)
self.groupBox_02.setMinimumHeight(250)
# self.gridLayout_Config.setSpacing(6)
self.gridLayout_Config.addWidget(self.groupBox_03, 0, 0, 7, 2)
# self.groupBox_03.setMaximumHeight(300)
self.gridLayout_Choice = QtWidgets.QGridLayout(self.groupBox_03)
self.gridLayout_Choice.addWidget(self.RA_Choice_Outdoor, 0, 0, 1, 1)
self.gridLayout_Choice.addWidget(self.RA_Choice_Indoor, 1, 0, 1, 1)
self.gridLayout_Choice.addWidget(self.RA_Choice_Helix, 0, 1, 1, 1)
self.gridLayout_Choice.addWidget(self.RA_Choice_Clock, 1, 1, 1, 1)
self.gridLayout_Choice.addWidget(self.PU_Flat, 2, 0, 1, 2)
self.gridLayout_Choice.addWidget(self.graphicsView, 3, 0, 1, 2)
##
self.gridLayout_Config.addWidget(self.DS_Radius_Circle, 0, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_10, 0, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_Size_Character, 1, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_4, 1, 3, 1, 1)
self.gridLayout_Config.addWidget(self.S_Begin_Angle, 2, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_13, 2, 3, 1, 1)
self.gridLayout_Config.addWidget(self.S_End_Angle, 3, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_14, 3, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_Correction_Angle, 4, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_7, 4, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_Correction_Radius, 5, 2, 1, 1)
self.gridLayout_Config.addWidget(self.label_8, 5, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_Extrude, 6, 2, 1, 1)
self.gridLayout_Config.addWidget(self.CH_Extrude, 6, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_PlacementX, 7, 0, 1, 1)
self.gridLayout_Config.addWidget(self.DS_PlacementY, 7, 1, 1, 1)
self.gridLayout_Config.addWidget(self.DS_PlacementZ, 7, 2, 1, 1)
self.gridLayout_Config.addWidget(self.CH_Sp_Placement, 7, 3, 1, 1)
self.gridLayout_Config.addWidget(self.DS_InclinaisonX, 8, 0, 1, 1)
self.gridLayout_Config.addWidget(self.DS_InclinaisonY, 8, 1, 1, 1)
self.gridLayout_Config.addWidget(self.DS_InclinaisonZ, 8, 2, 1, 1)
self.gridLayout_Config.addWidget(self.CH_Sp_Inclination, 8, 3, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_02, 1, 0, 1, 1)
####
self.gridLayout_Helix = QtWidgets.QGridLayout(self.groupBox_04)
self.gridLayout_Helix.setContentsMargins(10, 10, 10, 10)
self.groupBox_04.setMaximumHeight(100)
# self.gridLayout_Helix.setSpacing(6)
self.gridLayout_Helix.addWidget(self.DS_Step_Of_The_Helix, 0, 0, 1, 1)
self.gridLayout_Helix.addWidget(self.label_12, 0, 1, 1, 1)
self.gridLayout_Helix.addWidget(self.DS_Number_Char_Per_Turn, 0, 2, 1, 1)
self.gridLayout_Helix.addWidget(self.label, 0, 3, 1, 1)
self.gridLayout_Helix.addWidget(self.DS_Base_Helix, 1, 0, 1, 1)
self.gridLayout_Helix.addWidget(self.label_2, 1, 1, 1, 1)
self.gridLayout_Helix.addWidget(self.DS_End_Helix, 1, 2, 1, 1)
self.gridLayout_Helix.addWidget(self.label_3, 1, 3, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_04, 3, 0, 1, 1)
####
self.gridLayout_Clock = QtWidgets.QGridLayout(self.groupBox_05)
self.gridLayout_Clock.setContentsMargins(10, 10, 10, 10)
self.groupBox_05.setMaximumHeight(140)
# self.gridLayout_Clock.setSpacing(6)
self.gridLayout_Clock.addWidget(self.DS_Radius_Support, 0, 0, 1, 1)
self.gridLayout_Clock.addWidget(self.label_11, 0, 1, 1, 1)
self.gridLayout_Clock.addWidget(self.PU_Roman, 0, 2, 1, 1)
self.gridLayout_Clock.addWidget(self.S_Number_Faces_Support, 1, 0, 1, 1)
self.gridLayout_Clock.addWidget(self.label_5, 1, 1, 1, 1)
self.gridLayout_Clock.addWidget(self.PU_Redress, 1, 2, 1, 1)
self.gridLayout_Clock.addWidget(self.DS_Extrude_Support, 2, 0, 1, 1)
self.gridLayout_Clock.addWidget(self.label_6, 2, 1, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_05, 4, 0, 1, 1)
####
self.gridLayout_Command = QtWidgets.QGridLayout(self.groupBox_06)
self.gridLayout_Command.setContentsMargins(10, 10, 10, 10)
self.groupBox_06.setMaximumHeight(70)
# self.gridLayout_Command.setSpacing(6)
self.gridLayout_Command.addWidget(self.PU_Exit, 0, 0, 1, 1)
self.gridLayout_Command.addWidget(self.PU_Reset, 0, 1, 1, 1)
self.gridLayout_Command.addWidget(self.PU_Benchmarks, 0, 2, 1, 1)
self.gridLayout_Command.addWidget(self.PU_Execute, 0, 3, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_06, 5, 0, 1, 1)
####
self.gridLayout.addWidget(self.groupBox_00, 0, 0, 1, 1)
#### gridLayout end #######################

MainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowFlags(PySide2.QtCore.Qt.WindowStaysOnTopHint) # PySide cette fonction met la fenetre en avant
MainWindow.setWindowTitle(_fromUtf8("FCCircularText"))
MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8(self.path + "FCCircularTextButtom.png"))) # change l'icone de la fenetre principale
self.groupBox_00.setTitle(_fromUtf8("Ver : " + __Version__ + " : " + __Date__) + " (rmu)")

self.groupBox_01.setTitle(_fromUtf8("Text to be displayed ( "+str(len(texte))+" characters )"))
self.textEdit.setHtml(_fromUtf8(texte))
self.textEdit.setToolTip(_fromUtf8("Your text to be displayed\n"
"Click the button Reset for calculate the number of characters"))
self.PB_Reverse.setText(_fromUtf8("Reverse"))
self.PB_Reverse.setToolTip(_fromUtf8("Reverse the text edited"))
try:
self.lineEdit_NameFile.setText(_fromUtf8("(" + str(self.index + 1) + "/" + str(len(self.tableau)) + ") " + self.tableau[self.index][1]))
except Exception:
None
self.lineEdit_NameFile.setToolTip(_fromUtf8("(Number index / Number Fonts) Complete path and name of Font file"))
self.PB_Help.setText(_fromUtf8("Help"))
self.PB_Help.setToolTip(_fromUtf8("Help Wiki page"))
# self.PB_Decompose.setText(_fromUtf8("Decompose"))

#### matplotlib debut 4/5 retranslateUi #################################################################
self.comboBoxPy.setToolTip("Choice your Font" + "\n" +
"\n" +
"You must modify the configuration of display" + "\n" +
"Menu Edit parameter: User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__ + ":" + "\n" +
"####" + "\n" +
"switchModeTextList= 1\t# 0 = mode text normal (the switchFontComBox is enabled)" + "\n"
"\t\t\t# 1 = switchFontComBox authorized (default)" + "\n"
"\t\t\t#####" + "\n"
"switchFontComBox = 1\t# 0 = mode text in color .. faster" + "\n"
"\t\t\t# 1 = fontFamily listed ComboBox slower but beautiful (default)" + "\n"
"\t\t\t#####" + "\n"
"setSystemFonts = 1\t# 0 = matplotlib.font_manager.findSystemFonts" + "\n"
"\t\t\t# all fonts in System font" + "\n"
"\t\t\t# 1 = fontman.findSystemFonts(self.pathFont) (default)" + "\n"
"\t\t\t# all fonts in all directory and sub directory" + "\n"
"\t\t\t#####" + "\n"
"seTtextAlignement = 0\t# 0 = AlignLeft (default)" + "\n"
"\t\t\t# 1 = AlignCenter" + "\n"
"\t\t\t# 2 = AlignRight" + "\n"
"\t\t\t#####" + "\n"
"setFontByDefault = ""ARIAL""\t # ARIAL" + "\n"
"\t\t\t#####" + "\n"
"switchResetFALSE = 0\t # 0 by default." + "\n"
"If you use this option [ switchResetFALSE = 1 ] some switch can be opened when it should not be" + "\n"
"then it is advisable to do a reset after a change one option" + "\n"
"####" + "\n"
"Actual configuration : " + str(switchModeTextList) + ", " + str(switchFontComBox) + ", " + str(setSystemFonts) + ", "
+ str(seTtextAlignement) + ", " + setFontByDefault + ", " + str(switchResetFALSE) + "\n"
"####" + "\n" +
"Read the info")
#### matplotlib fin 4/5 retranslateUi #################################################################

self.groupBox_02.setTitle(_fromUtf8("Configuration"))
self.DS_Radius_Circle.setToolTip(_fromUtf8("Give the radius of circle"))
self.DS_Radius_Circle.setSuffix(_fromUtf8(" mm"))
self.label_10.setText(_fromUtf8("Radius of circle"))
self.DS_Size_Character.setToolTip(_fromUtf8("Size of the font"))
self.DS_Size_Character.setSuffix(_fromUtf8(" mm"))
self.label_4.setText(_fromUtf8("Character size"))
self.S_Begin_Angle.setToolTip(_fromUtf8("Starting text of the circle "))
self.S_Begin_Angle.setSuffix(_fromUtf8(" deg"))
self.label_13.setText(_fromUtf8("Starting angle"))
self.S_End_Angle.setToolTip(_fromUtf8("End text of the circle "))
self.S_End_Angle.setSuffix(_fromUtf8(" deg"))
self.label_14.setText(_fromUtf8("Ending angle"))
self.DS_Correction_Angle.setToolTip(_fromUtf8("Correct angle for tangent the text of thr circle or give a tilt angle "))
self.DS_Correction_Angle.setSuffix(_fromUtf8(" deg"))
self.label_7.setText(_fromUtf8("Correction Angle"))
self.DS_Correction_Radius.setToolTip(_fromUtf8("Correct of the radius (depend of correction angle)"))
self.DS_Correction_Radius.setSuffix(_fromUtf8(" mm"))
self.label_8.setText(_fromUtf8("Correction Radius"))
self.DS_Extrude.setSuffix(_fromUtf8(" mm"))
self.DS_Extrude.setToolTip(_fromUtf8("Thickness of the extrude of character. If thickness = 0 then not extrude"))
self.CH_Extrude.setText(_fromUtf8("Extrude Char."))
self.CH_Extrude.setToolTip(_fromUtf8("Choice extrude character or not"))
####
self.DS_PlacementX.setSuffix(_fromUtf8(" X mm"))
self.DS_PlacementX.setToolTip(_fromUtf8("Placement direction X" + "\n"
"Not used with the Clock option"))
self.DS_PlacementY.setSuffix(_fromUtf8(" Y mm"))
self.DS_PlacementY.setToolTip(_fromUtf8("Placement direction Y" + "\n"
"Not used with the Clock option"))
self.DS_PlacementZ.setSuffix(_fromUtf8(" Z mm"))
self.DS_PlacementZ.setToolTip(_fromUtf8("Placement direction Z"+ "\n"
"For Clock option only this Z axis is available"))
self.CH_Sp_Placement.setText(_fromUtf8("Placement"))
self.CH_Sp_Placement.setToolTip(_fromUtf8("Placement of character in the choice"))
#carDegrees = b' \xc2\xb0'.decode("utf-8") #thanks wmayer https://forum.freecadweb.org/viewtopic.php?f=13&t=36380&p=308476#p308357
self.DS_InclinaisonX.setSuffix(_fromUtf8(" deg"))
self.DS_InclinaisonX.setToolTip(_fromUtf8("Inclination character in axis X"))
self.DS_InclinaisonY.setSuffix(_fromUtf8(" deg"))
self.DS_InclinaisonY.setToolTip(_fromUtf8("Inclination character axis Y"))
self.DS_InclinaisonZ.setSuffix(_fromUtf8(" deg"))
self.DS_InclinaisonZ.setToolTip(_fromUtf8("Inclination character axis Z"))
self.CH_Sp_Inclination.setText(_fromUtf8("Sp. inclination"))
self.CH_Sp_Inclination.setToolTip(_fromUtf8("Inclination of character in the choice or alls plane "))
####
self.groupBox_03.setTitle(_fromUtf8("Choice"))
self.RA_Choice_Outdoor.setText(_fromUtf8("Outdoor"))
self.RA_Choice_Outdoor.setToolTip(_fromUtf8("Create the text on the outer face of the cylinder"))
self.RA_Choice_Indoor.setText(_fromUtf8("Indoor"))
self.RA_Choice_Indoor.setToolTip(_fromUtf8("Create the text on the inside of the cylinder"))
self.RA_Choice_Helix.setText(_fromUtf8("Helix"))
self.RA_Choice_Helix.setToolTip(_fromUtf8("Create the text in a helix"))
self.RA_Choice_Clock.setText(_fromUtf8("Clock"))
self.RA_Choice_Clock.setToolTip(_fromUtf8("Create the text to form a clock"))
self.PU_Flat.setText(_fromUtf8("Mode Stand"))
self.PU_Flat.setToolTip(_fromUtf8("Click for create the text Flat"))
####
self.groupBox_04.setTitle(_fromUtf8("Helix"))
self.DS_Step_Of_The_Helix.setSuffix(_fromUtf8(" mm"))
self.DS_Step_Of_The_Helix.setToolTip(_fromUtf8("Step of the text along the helix (min Size Caractere)"))
self.label_12.setText(_fromUtf8("Step of Helix"))
self.DS_Number_Char_Per_Turn.setToolTip(_fromUtf8("Number of characters for one turn of helix"))
self.label.setText(_fromUtf8("Char. per turn"))
self.DS_Base_Helix.setToolTip(_fromUtf8("Base (begin) of helix (to activate Step of Helix must be zero)"))
self.DS_Base_Helix.setSuffix(_fromUtf8(" mm"))
self.label_2.setText(_fromUtf8("Base Helix"))
self.DS_End_Helix.setToolTip(_fromUtf8("Final height of the helix (to activate Step of Helix must be zero)"))
self.DS_End_Helix.setSuffix(_fromUtf8(" mm"))
self.label_3.setText(_fromUtf8("End Helix"))
####
self.groupBox_05.setTitle(_fromUtf8("Clock"))
self.DS_Radius_Support.setSuffix(_fromUtf8(" mm"))
self.DS_Radius_Support.setToolTip(_fromUtf8("Radius of the support the clock (By defaut : Radius of circle)"))
self.label_11.setText(_fromUtf8("Radius of support"))
self.PU_Roman.setText(_fromUtf8("Mode Arabic"))
self.PU_Roman.setToolTip(_fromUtf8("The characters is in Roman or Arabic (default)"))
self.S_Number_Faces_Support.setToolTip(_fromUtf8("Number of side of the support 0=none, 1=circle, 2=rectangle, 3=triangle, 4=square, 5=pentagon . . . . (Thickness egal extrude)"))
self.label_5.setText(_fromUtf8("Support number face"))
self.PU_Redress.setText(_fromUtf8("Axial"))
self.PU_Redress.setToolTip(_fromUtf8("Click for activate the mode Redress"))
self.DS_Extrude_Support.setToolTip(_fromUtf8("Thickness of the extrude the support." + "\n"
"If thickness = 0 then not extrude" + "\n"
"If thickness of support is bigger than character" + "\n"
"the SpinBox is colored in red" + "\n"
"if the CheckBox [Extrude Char.] is not checked" + "\n"
"the SpinBox is colored in orange for warn that the character is at the base of the support"))
self.DS_Extrude_Support.setSuffix(_fromUtf8(" mm"))
self.label_6.setText(_fromUtf8("Extrude support"))
####
self.groupBox_06.setTitle(_fromUtf8("Command"))
self.PU_Exit.setText(_fromUtf8("Exit"))
self.PU_Exit.setToolTip(_fromUtf8("Exit FCCircularText"))
self.PU_Reset.setText(_fromUtf8("Reset"))
self.PU_Reset.setToolTip(_fromUtf8("Reset the macro and give the number of the characters of windows Textedit"))
self.PU_Execute.setText(_fromUtf8("Run"))
self.PU_Execute.setToolTip("Execute the process") # without Compount
self.PU_Benchmarks.setText(_fromUtf8("Run Comp"))
self.PU_Benchmarks.setToolTip(_fromUtf8("Execute the process and one Compount of the characters is create"))
####
self.DS_Pivot_Char.setSuffix(_fromUtf8(" deg"))
self.DS_Pivot_Char.setToolTip(_fromUtf8("Pivot the character"))
self.CH_Pivot_Character.setText(_fromUtf8("Pivot Character"))
self.CH_Pivot_Character.setToolTip(_fromUtf8("Pivot the character"))

#### matplotlib debut 5/5 #################################################################
def on_fontComboBoxPython(self,indeX): # 0: for fontComboBoxPython
global PolicePath
global setFontByDefault

self.index = indeX
self.lineEdit_NameFile.setText("(" + str(self.index + 1) + "/" + str(len(self.tableau)) + ") " + self.tableau[self.index][1])
PolicePath = self.tableau[self.index][1]

famille = typeCar = self.font = ""
self.font = QtGui.QFont()
typeCar = family(self.tableau[self.index][2])[1]
self.font.setBold(False)
self.font.setItalic(False)

if len(typeCar) > 0:
for option in typeCar:
if option == "Bold":
self.font.setBold(True)
if (option == "Italic") or (option == "It") or (option == "Slanted"):
self.font.setItalic(True)
if option == "Oblique":
self.font.setItalic(True)
#'Bold''Regular''Slanted''Italic''Medium''Extra''Light''Condensed''Black''It''Semibold'#+
self.font.setFamily(self.tableau[self.index][5])
self.font.setPointSize(self.FontTextSize)
####
self.fonteComp = self.tableau[self.index][1]
setFontByDefault = self.tableau[self.index][2]
# FreeCAD.Console.PrintMessage(str(self.index) + " , " + self.tableau[self.index][1] + " , " + self.tableau[self.index][2] + " , ' " + famille + "' , ' " + typeCar + " ' \n")
#### matplotlib fin 5/5 #################################################################

def on_lineEdit_NameFile(self):

self.pathFont = self.lineEdit_NameFile.text()
print(self.pathFont)
try:
self.pathFont = self.pathFont.split(")") [1]
except Exception:
self.pathFont = self.pathFont
print(self.pathFont)

ui.searchFont(self.pathFont)
QtCore.QObject.connect(self.comboBoxPy, QtCore.SIGNAL("currentIndexChanged(int)"), self.on_fontComboBoxPython)

def on_PB_Reverse(self): #connection Reverse
global texte

texte = self.textEdit.toPlainText()
texte = texte[::-1]
self.textEdit.setText(_fromUtf8(texte))

def on_CH_Pivot_Character(self): #connection checkBox
global PivotCharachter

if self.CH_Pivot_Character.isChecked():
self.DS_Pivot_Char.setEnabled(True)
else:
PivotCharachter = 0.0
self.DS_Pivot_Char.setEnabled(False)
self.DS_Pivot_Char.setValue(PivotCharachter)
# App.Console.PrintMessage("PivotCharachter check" + "\n")

def on_DS_Pivot_Char(self, value): #connection doubleSpinBox
global PivotCharachter

PivotCharachter = value
App.Console.PrintMessage("PivotCharachter " + str(PivotCharachter)+"\n")

def on_PU_Reset_Placement(self): # Reset_Placement
global PlacementX
global PlacementY
global PlacementZ
global coor_X
global coor_Y
global coor_Z

coor_X = coor_Y = coor_Z = 0.0
PlacementX = PlacementY = PlacementZ = 0.0
self.CH_Sp_Placement.setChecked(False)
self.DS_PlacementX.setValue(PlacementX)
self.DS_PlacementX.setEnabled(False)
self.DS_PlacementY.setValue(PlacementY)
self.DS_PlacementY.setEnabled(False)
self.DS_PlacementZ.setValue(PlacementZ)
self.DS_PlacementZ.setEnabled(False)
# App.Console.PrintMessage(str("on_PU_Reset_Placement ")+"\n")
def on_PU_Reset_Inclination(self): # Reset_Inclination
global inclinaisonX
global inclinaisonY
global inclinaisonZ

inclinaisonX = inclinaisonY = inclinaisonZ = 0.0
self.CH_Sp_Inclination.setChecked(False)
self.DS_InclinaisonX.setValue(inclinaisonX)
self.DS_InclinaisonX.setEnabled(False)
self.DS_InclinaisonY.setValue(inclinaisonY)
self.DS_InclinaisonY.setEnabled(False)
self.DS_InclinaisonZ.setValue(inclinaisonZ)
self.DS_InclinaisonZ.setEnabled(False)
# App.Console.PrintMessage(str("on_PU_Reset_Inclination ")+"\n")

def on_RA_Choice_Outdoor(self): #
global ui
global exterieur
global epaisseur

self.groupBox_04.setVisible(False)
self.groupBox_05.setVisible(False)
epaisseur = 0.0
self.DS_Extrude.setValue(epaisseur)
self.CH_Extrude.setChecked(False)
self.DS_Extrude.setEnabled(False)
exterieur = 1
self.S_Begin_Angle.setEnabled(True)
self.S_End_Angle.setEnabled(True)
self.DS_Correction_Radius.setEnabled(True)
self.DS_Correction_Angle.setEnabled(True)
self.PU_Flat.setEnabled(True)
self.groupBox_04.setEnabled(False)
self.groupBox_05.setEnabled(False)
ui.on_PU_Reset_Placement()
ui.on_PU_Reset_Inclination()
# App.Console.PrintMessage(str("on_RA_Choice_Outdoor ")+" "+str(exterieur)+"\n")

def on_RA_Choice_Indoor(self): #
global ui
global exterieur
global epaisseur

self.groupBox_04.setVisible(False)
self.groupBox_05.setVisible(False)
epaisseur = 0.0
self.DS_Extrude.setValue(epaisseur)
self.CH_Extrude.setChecked(False)
self.DS_Extrude.setEnabled(False)
exterieur = 0
self.S_Begin_Angle.setEnabled(True)
self.S_End_Angle.setEnabled(True)
self.DS_Correction_Radius.setEnabled(True)
self.DS_Correction_Angle.setEnabled(True)
self.PU_Flat.setEnabled(True)
self.groupBox_04.setEnabled(False)
self.groupBox_05.setEnabled(False)
ui.on_PU_Reset_Placement()
ui.on_PU_Reset_Inclination()
# App.Console.PrintMessage(str("on_RA_Choice_Indoor ")+" "+str(exterieur)+"\n")

def on_RA_Choice_Helix(self): #
global ui
global exterieur
global cercleClock
global nombreFaces
global debout
global epaisseur

self.groupBox_04.setVisible(True)
self.groupBox_05.setVisible(False)
epaisseur = 0.0
self.DS_Extrude.setValue(epaisseur)
self.CH_Extrude.setChecked(False)
self.DS_Extrude.setEnabled(False)
exterieur = 2
cercleClock = 0
nombreFaces = 0
debout = 1

self.RA_Choice_Outdoor.setText(_fromUtf8("Outdoor"))
self.RA_Choice_Indoor.setText(_fromUtf8("Indoor"))
self.PU_Flat.setText(_fromUtf8("Mode Stand"))

self.S_Begin_Angle.setEnabled(True)
self.S_End_Angle.setEnabled(True)
self.DS_Correction_Radius.setEnabled(True)
self.DS_Correction_Angle.setEnabled(True)
self.PU_Flat.setEnabled(False)##
self.groupBox_04.setEnabled(True)
self.groupBox_05.setEnabled(False)

ui.on_PU_Reset_Placement()
ui.on_PU_Reset_Inclination()

def on_RA_Choice_Clock(self):
global ui
global exterieur
global debout
global correctionRayon
global correctionAngle
global epaisseur
global PivotCharachter

self.groupBox_04.setVisible(False)
self.groupBox_05.setVisible(True)
epaisseur = 0.0
self.DS_Extrude.setValue(epaisseur)
self.CH_Extrude.setChecked(False)
self.DS_Extrude.setEnabled(False)
exterieur = 3
debout = 0
self.PU_Flat.setEnabled(False)
self.S_Begin_Angle.setEnabled(False)
self.S_End_Angle.setEnabled(False)
# correctionRayon = 0
self.DS_Correction_Radius.setEnabled(False)
self.DS_Correction_Radius.setValue(0.0)
# correctionAngle = 10.0
self.DS_Correction_Angle.setEnabled(False)
self.DS_Correction_Angle.setValue(0.0)
PivotCharachter = 0.0
self.DS_Pivot_Char.setEnabled(False)
self.DS_Pivot_Char.setValue(PivotCharachter)
self.CH_Pivot_Character.setChecked(False)
self.groupBox_04.setEnabled(False)
self.groupBox_05.setEnabled(True)
ui.on_PU_Reset_Placement()
ui.on_PU_Reset_Inclination()
# App.Console.PrintMessage(str("on_RA_Choice_Clock ")+str(exterieur)+"\n")

def on_PU_Flat(self): # Flat or Stand
global debout

if debout == 1:
debout = 0
self.RA_Choice_Outdoor.setText(_fromUtf8("Indoor"))
self.RA_Choice_Indoor.setText(_fromUtf8("Outdoor"))
self.PU_Flat.setText(_fromUtf8("Mode Flat"))
self.PU_Flat.setToolTip(_fromUtf8("Click for create the text Stand"))
self.PU_Flat.setIcon(QtGui.QIcon(QtGui.QPixmap(flatIcon))) # icone dans une variable
else:
debout = 1
self.RA_Choice_Outdoor.setText(_fromUtf8("Outdoor"))
self.RA_Choice_Indoor.setText(_fromUtf8("Indoor"))
self.PU_Flat.setText(_fromUtf8("Mode Stand"))
self.PU_Flat.setToolTip(_fromUtf8("Click for create the text Flat"))
self.PU_Flat.setIcon(QtGui.QIcon(QtGui.QPixmap(standIcon))) # icone dans une variable
# App.Console.PrintMessage(str("on_PU_Flat ")+str(debout)+"\n")

def on_DS_Radius_Circle(self,value):
global rayon
global cercleClock

rayon = value
cercleClock = rayon
# App.Console.PrintMessage("on_DS_Radius_Circle Radius"+str(rayon)+"\n")

def on_DS_Size_Character(self,value):
global SizeCaractere

SizeCaractere = value
# App.Console.PrintMessage("on_DS_Size_Character Size"+str(SizeCaractere)+"\n")

def on_S_Begin_Angle(self,value): #
global debut

debut = value
# App.Console.PrintMessage(str("on_S_Begin_Angle ")+str(debut)+"\n")

def on_S_End_Angle(self,value): #
global rotation

rotation = value
# App.Console.PrintMessage(str("on_S_End_Angle ")+str(rotation)+"\n")

def on_DS_PlacementX(self,value): #
global PlacementX

PlacementX = value
# App.Console.PrintMessage(str("on_DS_PlacementX ")+str(PlacementX)+"\n")

def on_DS_PlacementY(self,value): #
global PlacementY

PlacementY = value
# App.Console.PrintMessage(str("on_DS_PlacementY ")+str(PlacementY)+"\n")

def on_DS_PlacementZ(self,value): #
global PlacementZ

PlacementZ = value
# App.Console.PrintMessage(str("on_DS_PlacementZ ")+str(PlacementZ)+"\n")

def on_CH_Sp_Placement(self): # Placement or not Placement
global ui

if self.CH_Sp_Placement.isChecked():
self.DS_PlacementX.setEnabled(True)
self.DS_PlacementY.setEnabled(True)
self.DS_PlacementZ.setEnabled(True)
# App.Console.PrintMessage(str("on_CH_Sp_Placement ")+str("True")+"\n")
else:
ui.on_PU_Reset_Placement()
if self.RA_Choice_Clock.isChecked():
self.DS_PlacementX.setEnabled(False)
self.DS_PlacementY.setEnabled(False)
# App.Console.PrintMessage(str("on_CH_Sp_Placement ")+str("False")+"\n")

def on_DS_Correction_Angle(self,value): #
global correctionAngle

correctionAngle = value
# App.Console.PrintMessage(str("on_DS_Correction_Angle ")+str(correctionAngle)+"\n")

def on_DS_Correction_Radius(self,value): #
global correctionRayon

correctionRayon = value
# App.Console.PrintMessage(str("on_DS_Correction_Radius ")+str(correctionRayon)+"\n")

def on_DS_Extrude(self,value): #
global epaisseur
global epaisSupp

epaisseur = value
if epaisseur > epaisSupp:
self.DS_Extrude_Support.setStyleSheet("background-color: QPalette.Base") # origin system
self.DS_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
else:
if epaisSupp >= epaisseur:
self.DS_Extrude.setStyleSheet("background-color: rgb(224, 0, 0)")
self.DS_Extrude_Support.setStyleSheet("background-color: rgb(224, 0, 0)")
# App.Console.PrintMessage("on_DS_Extrude "+str(epaisseur)+"\n")

def on_CH_Extrude(self): #
global epaisseur
global epaisSupp

if self.CH_Extrude.isChecked():
self.DS_Extrude.setEnabled(True)
epaisseur = 1.0
else:
self.DS_Extrude.setEnabled(False)
epaisseur = 0.0
if (epaisSupp != 0) and (epaisSupp >= epaisseur):
self.DS_Extrude.setStyleSheet("background-color: rgb(255, 165, 0)")
self.DS_Extrude_Support.setStyleSheet("background-color: rgb(255, 165, 0)")
self.CH_Extrude.setStyleSheet("background-color: rgb(255, 165, 0)")
else:
self.DS_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.DS_Extrude.setValue(epaisseur)
# App.Console.PrintMessage(str("on_CH_Extrude ")+" "+str(epaisseur)+"\n")

def on_DS_InclinaisonX(self,value): #
global inclinaisonX

inclinaisonX = value
# App.Console.PrintMessage(str("on_DS_InclinaisonX ")+str(inclinaisonX)+"\n")

def on_DS_InclinaisonY(self,value): #
global inclinaisonY

inclinaisonY = value
# App.Console.PrintMessage(str("on_DS_InclinaisonY ")+str(inclinaisonY)+"\n")

def on_DS_InclinaisonZ(self,value): #
global inclinaisonZ

inclinaisonZ = value
# App.Console.PrintMessage(str("on_DS_InclinaisonZ ")+str(inclinaisonZ)+"\n")

def on_CH_Sp_Inclination(self): #
global ui

if self.CH_Sp_Inclination.isChecked():
self.DS_InclinaisonX.setEnabled(True)
self.DS_InclinaisonY.setEnabled(True)
self.DS_InclinaisonZ.setEnabled(True)
else:
ui.on_PU_Reset_Inclination()
# App.Console.PrintMessage(str("on_CH_Sp_Inclination ")+str(self.CH_Sp_Inclination.isChecked())+"\n")

def on_DS_Step_Of_The_Helix(self,value): #
global pasHelix
global baseHelix
global endHelix

pasHelix = value
if pasHelix == 0:
baseHelix = endHelix = 0.0
self.DS_Base_Helix.setValue(baseHelix)
self.DS_Base_Helix.setEnabled(True)
self.DS_End_Helix.setValue(endHelix)
self.DS_End_Helix.setEnabled(True)
else:
baseHelix = endHelix = 0.0
self.DS_Base_Helix.setValue(baseHelix)
self.DS_Base_Helix.setEnabled(False)
self.DS_End_Helix.setValue(endHelix)
self.DS_End_Helix.setEnabled(False)
# App.Console.PrintMessage(str("on_DS_Step_Of_The_Helix ")+str(SizeCaractere)+"\n")

def on_DS_Number_Char_Per_Turn(self,value):#
global nombreCarParTour

nombreCarParTour = value
# App.Console.PrintMessage(str("on_DS_Number_Char_Per_Turn ")+str(nombreCarParTour)+"\n")

def on_DS_Base_Helix(self,value): #
global baseHelix

baseHelix = value
# App.Console.PrintMessage(str("on_DS_Base_Helix ")+str(baseHelix)+"\n")

def on_DS_End_Helix(self,value): #
global endHelix

endHelix = value
# App.Console.PrintMessage(str("on_DS_End_Helix ")+str(endHelix)+"\n")

def on_DS_Radius_Support(self,value): #
global cercleClock

cercleClock = value
# App.Console.PrintMessage(str("on_DS_Radius_Support ")+str(cercleClock)+"\n")

def on_S_Number_Faces_Support(self,value): # number Faces of support 0=none 1=circle 2=rectangle 3=triangle 4,5 ... polygon
global nombreFaces

nombreFaces = value
self.DS_Extrude_Support.setEnabled(True)
if nombreFaces == 0:
self.label_5.setText(_fromUtf8("Support number face"))
self.DS_Extrude_Support.setEnabled(False)
elif nombreFaces == 1:
self.label_5.setText(_fromUtf8("Support Circle"))
elif nombreFaces == 2:
self.label_5.setText(_fromUtf8("Support Rectangle"))
elif nombreFaces == 3:
self.label_5.setText(_fromUtf8("Support Triangle"))
elif nombreFaces == 4:
self.label_5.setText(_fromUtf8("Support Square"))
else :
self.label_5.setText(_fromUtf8("Support Polygone"))
# App.Console.PrintMessage(str("on_S_Number_Faces_Support ")+str(nombreFaces)+"\n")

def on_DS_Extrude_Support(self,value): #
global epaisSupp
global epaisseur

epaisSupp = value
if epaisSupp >= epaisseur:
if self.CH_Extrude.isChecked():
self.DS_Extrude.setStyleSheet("background-color: rgb(224, 0, 0)")
self.DS_Extrude_Support.setStyleSheet("background-color: rgb(224, 0, 0)")
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
else:
self.DS_Extrude.setStyleSheet("background-color: rgb(255, 165, 0)")
self.DS_Extrude_Support.setStyleSheet("background-color: rgb(255, 165, 0)")
self.CH_Extrude.setStyleSheet("background-color: rgb(255, 165, 0)")
else:
self.DS_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.DS_Extrude_Support.setStyleSheet("background-color: QPalette.Base") # origin system
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
if epaisSupp == 0:
self.DS_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.DS_Extrude_Support.setStyleSheet("background-color: QPalette.Base") # origin system
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system

self.DS_PlacementZ.setEnabled(True)
# App.Console.PrintMessage(str("on_DS_Extrude_Support ")+str(epaisSupp)+"\n")

def on_PU_Roman(self): # Roman or Arabic Clock
global romain

if romain == 1:
romain = 0
self.PU_Roman.setText(_fromUtf8("Mode Arabic"))
self.PU_Roman.setToolTip(_fromUtf8("Click for activate the mode Roman"))
self.PU_Roman.setIcon(QtGui.QIcon(QtGui.QPixmap(arabicIcon))) # icone dans une variable
else:
romain = 1
self.PU_Roman.setText(_fromUtf8("Mode Roman"))
self.PU_Roman.setToolTip(_fromUtf8("Click for activate the mode Arabic"))
self.PU_Roman.setIcon(QtGui.QIcon(QtGui.QPixmap(romanIcon))) # icone dans une variable
# App.Console.PrintMessage(str("romain ")+str(romain)+"\n")

def on_PU_Redress(self): # Redress or circumferencial Clock
global redressement

if redressement == 1:
redressement = 0
self.PU_Redress.setText(_fromUtf8("Axial"))
self.PU_Redress.setIcon(QtGui.QIcon(QtGui.QPixmap(axialIcon))) # icone dans une variable
self.PU_Redress.setToolTip(_fromUtf8("Click for activate the mode Redress"))
else:
redressement = 1
self.PU_Redress.setText(_fromUtf8("Redress"))
self.PU_Redress.setIcon(QtGui.QIcon(QtGui.QPixmap(redressIcon))) # icone dans une variable
self.PU_Redress.setToolTip(_fromUtf8("Click for activate the mode Axial"))
# App.Console.PrintMessage(str("redressement ")+str(redressement)+"\n")

def on_PU_Reset(self): #
global ui
global points
global coor_X
global coor_Y
global coor_Z
global vec

global PolicePath

global rayon
global texte
global debut
global rotation
global SizeCaractere

global precision
global correctionAngle
global correctionRayon
global debout
global exterieur
global baseHelix
global endHelix
global pasHelix
global nombreCarParTour
global PivotCharachter

global PlacementX
global PlacementY
global PlacementZ

global inclinaisonX
global inclinaisonY
global inclinaisonZ

global cercleClock
global nombreFaces
global romain
global redressement

global comP
global nameL
global epaisseur
global epaisSupp
global compount1

texte = ""

exterieur = 1
self.RA_Choice_Outdoor.setText(_fromUtf8("Outdoor"))
self.RA_Choice_Indoor.setText(_fromUtf8("Indoor"))
self.RA_Choice_Outdoor.setChecked(True)

debout = 1
self.PU_Flat.setText(_fromUtf8("Mode Stand"))
self.PU_Flat.setToolTip(_fromUtf8("Click for create the text Flat"))
self.PU_Flat.setIcon(QtGui.QIcon(QtGui.QPixmap(standIcon))) # icone dans une variable

SizeCaractere = 2.0
self.DS_Size_Character.setValue(SizeCaractere)
rayon = 10.0
self.DS_Radius_Circle.setValue(rayon)

debut = 0
self.S_Begin_Angle.setValue(debut)
self.S_Begin_Angle.setEnabled(True)
rotation = 360
self.S_End_Angle.setValue(rotation)
self.S_End_Angle.setEnabled(True)

correctionAngle = 10.0
self.DS_Correction_Angle.setValue(correctionAngle)
self.DS_Correction_Radius.setEnabled(True)
correctionRayon = 0.15
self.DS_Correction_Radius.setValue(correctionRayon)
self.DS_Correction_Angle.setEnabled(True)

PivotCharachter = 0.0
self.DS_Pivot_Char.setEnabled(False)
self.DS_Pivot_Char.setValue(PivotCharachter)
self.CH_Pivot_Character.setChecked(False)

epaisseur = 0.0
self.DS_Extrude.setValue(epaisseur)
self.DS_Extrude.setEnabled(False)
self.DS_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system
self.CH_Extrude.setChecked(False)
self.CH_Extrude.setStyleSheet("background-color: QPalette.Base") # origin system

ui.on_PU_Reset_Placement()
ui.on_PU_Reset_Inclination()

self.groupBox_04.setEnabled(False)
baseHelix = 0.0
self.DS_Base_Helix.setValue(baseHelix)
self.DS_Base_Helix.setEnabled(False)
endHelix = 0.0
self.DS_End_Helix.setValue(endHelix)
self.DS_Base_Helix.setEnabled(False)
pasHelix = 2.0
self.DS_Step_Of_The_Helix.setValue(pasHelix)
nombreCarParTour = 10
self.DS_Number_Char_Per_Turn.setValue(nombreCarParTour)

self.groupBox_05.setEnabled(False)
cercleClock = rayon
self.DS_Radius_Support.setValue(cercleClock)
nombreFaces = 0
self.S_Number_Faces_Support.setValue(nombreFaces)
self.label_5.setText(_fromUtf8("Support number face"))
epaisSupp = 0.0
self.DS_Extrude_Support.setEnabled(False)
self.DS_Extrude_Support.setValue(epaisSupp)
self.DS_Extrude_Support.setStyleSheet("background-color: QPalette.Base") # origin system

romain = 0
self.PU_Roman.setText(_fromUtf8("Mode Arabic"))
self.PU_Roman.setIcon(QtGui.QIcon(QtGui.QPixmap(arabicIcon))) # icone dans une variable
self.PU_Roman.setToolTip(_fromUtf8("Click for activate the mode Roman"))

redressement = 0
self.PU_Redress.setText(_fromUtf8("Axial"))
self.PU_Redress.setIcon(QtGui.QIcon(QtGui.QPixmap(axialIcon))) # icone dans une variable
self.PU_Redress.setToolTip(_fromUtf8("Click for activate the mode Redress"))

compount1 = 0

texte = self.textEdit.toPlainText()
self.groupBox_01.setTitle("Text to be displayed ( "+str(len(texte))+" characters )")
# App.Console.PrintMessage(str("on_PU_Reset ")+str()+"\n")

def on_PU_Benchmarks(self): # Benchmarks
try:
global compount1
global ui

compount1 = 1
ui.on_PU_Execute()
except:
sayexc("Error")
# App.Console.PrintMessage(str("Benchmarks")+"\n")
def on_PU_Execute(self): # Execute
global ui
global PolicePath
global switchResetFALSE

global points
global coor_X
global coor_Y
global coor_Z
global PlacementX
global PlacementY
global PlacementZ

global inclinaisonX
global inclinaisonY
global inclinaisonZ

global vec
global rayon
global texte
global debut
global rotation
global SizeCaractere
global PivotCharachter

global ii
global precision
global correctionAngle
global correctionRayon
global debout
global exterieur
global baseHelix
global endHelix
global pasHelix
global nombreCarParTour

global cercleClock
global nombreFaces
global romain
global redressement

global comP
global nameL

global epaisseur
global epaisSupp
global compount1

points = []
comP = []
nameL = []

del points[:]
del comP[:]
del nameL[:]

doc = FreeCAD.ActiveDocument
if doc == None:
doc = FreeCAD.newDocument()

texte = self.textEdit.toPlainText()

self.groupBox_01.setTitle("Text to be displayed ( "+str(len(texte))+" characters )")

if ((exterieur == 0) and (debout == 0)):
vecligne=[FreeCAD.Vector(PlacementX,PlacementY,PlacementZ),FreeCAD.Vector(rayon + correctionRayon,0.0,0.0)] #
else:
if exterieur == 3:
vecligne=[FreeCAD.Vector(PlacementX,PlacementY,PlacementZ),FreeCAD.Vector(rayon - (SizeCaractere/2),0.0,0.0)] #
elif debout == 0:
vecligne=[FreeCAD.Vector(PlacementX,PlacementY,PlacementZ),FreeCAD.Vector(rayon + correctionRayon - SizeCaractere,0.0,0.0)] #
else:
vecligne=[FreeCAD.Vector(PlacementX,PlacementY,PlacementZ),FreeCAD.Vector(rayon + correctionRayon,0.0,0.0)] #

ligne = Draft.makeWire(vecligne,closed=False,face=False,support=None) # creation de la ligne de base
lineName = ligne.Name

ii = -1
ii2 = -1

nombre = len(texte)
coor_Z = PlacementZ
if (exterieur == 0) or (debout == 0):
texte = texte[::-1]
if (exterieur == 0) and (debout == 0):
texte = texte[::-1]

if exterieur == 2: # helix
if nombreCarParTour == 0:
nombreCarParTour = 1
App.Console.PrintError("Insufficient number"+"\n")
pas = 0.0
nombre = nombreCarParTour
if pasHelix != 0:
pas = pasHelix / (nombreCarParTour)
else:
pas = ((((endHelix - SizeCaractere)-baseHelix)/(len(texte) / nombreCarParTour))/(nombreCarParTour)) # pas of helix
coor_Z += baseHelix
else:
nombreCarParTour = 1

if exterieur == 3: # Clock
FcString = doc.addObject("App::DocumentObjectGroup","FcClock")
nombre = 12
if romain == 0:
texte = ["1","2","3","4","5","6","7","8","9","10","11","12"]
else:
texte = ["I","II","III","IIII","V","VI","VII","VIII","IX","X","XI","XII"]
texte = texte[::-1]
else:
FcString = doc.addObject("App::DocumentObjectGroup","FcString")

####Boucle principale############################################################################
boucler = int(len(texte) / nombreCarParTour)

# if (len(texte) % nombreCarParTour) != 0: # calcul number spires Helix
# boucler += 1

for hel in range(boucler):
ii = -1
####Boucle de travail#################################################
#for angleTr in range(debut,rotation,((rotation-debut)/nombre)): # old
for angleTrFloat in range((debut*10000),(rotation*10000),int((round(((float(rotation)-float(debut))/float(nombre)),4)*10000)) ): # pour 4 decimales
angleTr = (float(angleTrFloat)/10000)
ii += 1
ii2 += 1
ligne.Placement = App.Placement(App.Vector(PlacementX,PlacementY,PlacementZ), App.Rotation(App.Vector(0,0,1),angleTr), App.Vector(0,0,0))

a = ligne.End # fin de ligne
coor_X = (a[0])
coor_Y = (a[1])

if (ii < nombre) and (ii2 < len(texte)):
if exterieur == 3: # clock
ligne.Placement = App.Placement(App.Vector(PlacementX,PlacementY,PlacementZ), App.Rotation(App.Vector(0,0,1),angleTr+90), App.Vector(0,0,0))

try:
a = ligne.Shape.Edges[0].Vertexes[1] # fin de ligne
except Exception:
a = ligne.End # 0.19 fin de ligne

try:
coor_X = (a.Point.x)
coor_Y = (a.Point.y)
except Exception:
coor_X = (a.x) # 0.19 fin de ligne
coor_Y = (a.y)

ss=Draft.makeShapeString(String=texte[ii2],FontFile=PolicePath,Size=SizeCaractere,Tracking=0)

ss.Label = texte[ii2]
FcString.addObject(ss) # contener character

centreX = (ss.Shape.BoundBox.Center[0])
centreY = (ss.Shape.BoundBox.Center[1])
centreZ = (ss.Shape.BoundBox.Center[2])
lengthX = (ss.Shape.BoundBox.XLength)
lengthY = (ss.Shape.BoundBox.YLength)
lengthZ = (ss.Shape.BoundBox.ZLength)

coor_X = coor_X + PlacementX
coor_Y = coor_Y + PlacementY

plm=""
plm=FreeCAD.Placement()
plm.Base=FreeCAD.Vector(coor_X,coor_Y,coor_Z)

if debout == 1: # debout
if exterieur == 0: # circumferential internal
plm = App.Placement(App.Vector(coor_X,coor_Y,coor_Z), App.Rotation(angleTr-90-correctionAngle+inclinaisonX,inclinaisonY+PivotCharachter,90+inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1
elif exterieur == 1: # circumferential external
plm = App.Placement(App.Vector(coor_X,coor_Y,coor_Z), App.Rotation(angleTr+90+correctionAngle+inclinaisonX,inclinaisonY+PivotCharachter,90+inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1
elif exterieur == 2: # circumferential helix
plm = App.Placement(App.Vector(coor_X,coor_Y,coor_Z), App.Rotation(angleTr+90+correctionAngle+inclinaisonX,inclinaisonY+PivotCharachter,90+inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1
coor_Z = coor_Z + pas
else: # a plat
if exterieur == 1: # exterieur (superieur)
plm = App.Placement(App.Vector(coor_X,coor_Y,coor_Z), App.Rotation(angleTr-90-correctionAngle+inclinaisonX+PivotCharachter,inclinaisonY,inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1
elif exterieur == 3: # circumferential plat (clock)
if redressement == 1:
plm = App.Placement(App.Vector(coor_X-centreX,coor_Y-centreY,coor_Z), App.Rotation(inclinaisonX+PivotCharachter,inclinaisonY,inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1
else:
plm = App.Placement(App.Vector(coor_X-centreX,coor_Y-centreY,coor_Z), App.Rotation(angleTr+inclinaisonX+PivotCharachter,inclinaisonY,inclinaisonZ), App.Vector(centreX,centreY,centreZ)) # pitch,roll...1
else: # interieur (inferieur)
plm = App.Placement(App.Vector(-coor_X,-coor_Y,-coor_Z), App.Rotation(angleTr+90+correctionAngle+inclinaisonX+PivotCharachter,180+inclinaisonY,180+inclinaisonZ), App.Vector(0,0,0)) # pitch,roll...1

if epaisseur > 0: # extrusion characrters
CharExtrude = Draft.extrude(ss,Base.Vector(0,0,epaisseur))
CharExtrude.Placement=plm
try:
CharExtrude.ViewObject.DisplayMode = u"Flat Lines"
except Exception:
None
comP.append(CharExtrude.Shape)
# nameL.append(CharExtrude.Name)
FcString.addObject(CharExtrude) # contener extrude
else: #
ss.Placement=plm
ss.Support=None
try:
ss.ViewObject.DisplayMode = u"Flat Lines"
except Exception:
None
comP.append(ss.Shape)
# nameL.append(ss.Name)

# points += [FreeCAD.Vector(coor_X,coor_Y,coor_Z)] # coordinates makeBSpline
# BSpline = Draft.makeBSpline(points,closed=False) # makeBSpline repere
App.ActiveDocument.removeObject(lineName) # remove ligne de base directrice
if compount1 == 1: # create compount
comp = Part.makeCompound(comP)
Part.show(comp)
####Boucle de travail fin########################################################################

####Extrude support clock#############################################
if nombreFaces > 0: # support clock
pl = FreeCAD.Placement()
if nombreFaces == 1: # circle
pl.Base = FreeCAD.Vector(0.0,0.0,0.0)
supp = Draft.makeCircle(cercleClock,placement=pl,face=True,support=None)
if nombreFaces == 2: # rectangle
cercleClock = cercleClock * 2
pl.Base = FreeCAD.Vector(-cercleClock, (-cercleClock / 2), 0.0)
supp = Draft.makeRectangle((cercleClock * 2), cercleClock, placement=pl, face = True)
if nombreFaces > 2: # polygone with number faces
if nombreFaces == 4:
rotateSupport = 45
else:
rotateSupport = 90
pl = App.Placement(App.Vector(0.0,0.0,0.0), App.Rotation(rotateSupport,0,0), App.Vector(0,0,0))
supp = Draft.makePolygon(nombreFaces,cercleClock,inscribed = False,placement = pl,face = True,support=None)

supp.MakeFace = True
App.activeDocument().recompute()
FcString.addObject(supp) # contener support

if epaisSupp != 0: # extrude support clock
suppExtrude = Draft.extrude(supp,Base.Vector(0,0,epaisSupp))
try:
suppExtrude.ViewObject.DisplayMode = u"Flat Lines"
except Exception:
None
FcString.addObject(suppExtrude) # contener support extrude

App.activeDocument().recompute()

####Info################################################
App.Console.PrintMessage("______________" +"\n")
App.Console.PrintMessage( PolicePath + "\n")
App.Console.PrintMessage("Texte : " + str(texte)+"\n")
App.Console.PrintMessage("Rayon : " + str(rayon)+"\n")
App.Console.PrintMessage("SizeCaractere : " + str(SizeCaractere)+"\n")
App.Console.PrintMessage("Rotation : " + str(debut) + "/" + str(rotation)+"\n")
App.Console.PrintMessage("Debout : " + str(debout)+"\n")
App.Console.PrintMessage("_______________" +"\n")

####Reset################################################
if switchResetFALSE == 0: # zero (False) by default = reset
ui.on_PU_Reset()

def on_PB_Help_clicked(self):
WebGui.openBrowser("https://wiki.freecadweb.org/Macro_FCCircularText")
App.Console.PrintMessage("https://wiki.freecadweb.org/Macro_FCCircularText" + "\n")
# print("Help ")

def on_PU_Exit(self): # Exit
global switchModeTextList
global switchFontComBox
global setSystemFonts
global seTtextAlignement
global setFontByDefault

###### Write Configuration begin ####
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetBool("switchResetFALSE", switchResetFALSE) # True or False
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetString("setFontByDefault", setFontByDefault) # "Arial"
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetBool("switchModeTextList", switchModeTextList) # True or False
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetBool("switchFontComBox", switchFontComBox) # True or False
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetBool("setSystemFonts", setSystemFonts) # True or False
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetInt("seTtextAlignement", seTtextAlignement) # 0, 1, 2
###### Write Configuration end ####
App.Console.PrintMessage("Fin FCCircularText"+"\n")
self.window.hide()
####
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).SetString("Version",__Version__ + " (" + __Date__ + ")")#

###### Read Configuration begin ####
seTtextAlignement = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetInt("seTtextAlignement")
setSystemFonts = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetBool("setSystemFonts")
switchFontComBox = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetBool("switchFontComBox")
switchModeTextList = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetBool("switchModeTextList")
setFontByDefault = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetString("setFontByDefault")
switchResetFALSE = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __Title__).GetBool("switchResetFALSE")

if setFontByDefault == "":
if platform.system() == "Windows" :
PolicePath = "C:/Windows/Fonts/"
setFontByDefault = "ARIAL"
elif platform.system() == "Linux" :
PolicePath = "/usr/share/fonts/"
setFontByDefault = "UBUNTU-M"
elif platform.system() == "Darwin":
PolicePath = "/Library/Fonts/"
setFontByDefault = "Arial"
if platform.system() == "Linux" :
PolicePath = "/usr/share/fonts/"

###### Read Configuration end ####
#

MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()



}}

</div>
</div>


ou téléchargez le script:
ou téléchargez le script:


Téléchargez le script sur github [https://gist.github.com/mario52a/a25e802498bae6959335 Macro_FCCircularText.FCMacro] ver 0.16b 2020/07/24
Téléchargez le script sur github [https://gist.github.com/mario52a/a25e802498bae6959335 Macro_FCCircularText.FCMacro] ver 0.21 2022/05/31


ou sur le forum [http://forum.freecadweb.org/viewtopic.php?f=3&t=7384&p=87642#p87642 Extrude from curved surface of cylinder]
ou sur le forum [http://forum.freecadweb.org/viewtopic.php?f=3&t=7384&p=87642#p87642 Extrude from curved surface of cylinder]


<span id="Example"></span>
==Exemple==
==Exemple==


Line 2,795: Line 418:
</center>
</center>
<br />
<br />
<center>
<gallery widths="300" heights="200">
Image:FCCircularText_Path_00_002_000.png| {{CheckBox|TRUE|Word}} Le texte est coupé à chaque caractère '''espace'''.
</gallery>
</center>
<br />
<span id="Example_onto_Ellipse"></span>
==Exemple sur une ellipse==
==Exemple sur une ellipse==
<center>
<center>
Line 2,856: Line 486:
<gallery widths="300" heights="200">
<gallery widths="300" heights="200">
Image:FCCircularText 59.png|Sélectionnez Ellipse extruded , Cut (text) fusionnez [[Image:Part_Fuse.png|24px]].
Image:FCCircularText 59.png|Sélectionnez Ellipse extruded , Cut (text) fusionnez [[Image:Part_Fuse.png|24px]].
</gallery>
</center>
<br />

==Example section path==

<center>
<gallery widths="300" heights="200">
Image:FCCircularText_Path_00_Orth_Base_000.png|Texte placé BoundBox Base (normal)
Image:FCCircularText_Path_00_Orth_Center_000.png|Texte placé BoundBox Centre du caractere
</gallery>
</center>
<br />

<center>
<gallery widths="300" heights="200">
Image:FCCircularText_Path_00_Orth_Top_000.png|Texte en haut de la boîte de délimitation
Image:FCCircularText_Path_00_001_000_000.png|Texte sur la ligne sélectionnée :<br />1 : orthogonal<br />2 : tangent
</gallery>
</center>
<br />
<center>
<gallery widths="797" heights="624">
File:YamahaDrumBadge00.gif|Exemple d'utilisation ([https://forum.freecad.org/viewtopic.php?t=82577 Texte incurvé sur une surface plane ?])
</gallery>
</gallery>
</center>
</center>
Line 2,881: Line 535:
Écriture sur un chemin.
Écriture sur un chemin.


<span id="Change_log"></span>
==Changelog==
==Journal des modifications==


*ver 0.22c 2023/11/17 : adding restore selection after delete the last object , by TheMarkster , thanks
ver 16d 2020/09/15 : see the [https://gist.github.com/mario52a/a25e802498bae6959335 MasterCATZ commented Sep 14, 2020 message]
see [https://forum.freecad.org/viewtopic.php?p=719353#p719353 Curved text on a flat surface?]
{{Code|code=
sel = Gui.Selection.getCompleteSelection()
#delete objects
#restore previous selection
Gui.Selection.clearSelection()
for s in sel:
Gui.Selection.addSelection(s.Object,s.SubElementNames)
}}
*ver 0.22b 2023/11/15 : upgrade correction '''stylesheet''' and '''FreeCAD.activeDocument().recompute(None,True,True)'''

*ver 0.22 2022/06/06 : ajout QScrollArea cause : [https://forum.freecadweb.org/viewtopic.php?f=3&t=69206 Unable to run FCCircularText [Problem with screen size<nowiki>]</nowiki>]

*ver 0.21 2022/05/31 : ajout bouton recherche dans les répertoires, et bouton retour à l'origine système

*ver 0.2021/04/05 : ajout d'un icone dans la macro, Tab pour diminuer la hauteur de la macro, suppression de toutes les dimensions des widgets maintenant entièrement compatibles avec la feuille de style, révision de la version de recherche pour compatibilité et autres petits changements.

*ver 1.19 2021/03/15 : ajout du bouton {{Button|Delette}} du dernier objet créé et du code {{incode|FreeCAD.ActiveDocument.openTransaction("FCCTc")}} pour le système Undo/Redo.

**Ajout d'une boîte à cocher {{CheckBox|FALSE|Reset}} pour commuter/activer (''demandé par les utilisateurs'') la réinitialisation automatique après avoir poussé le bouton {{Button|Run}} et {{Button|Run comp}}. Cette utilisation de la boîte à cocher est {{ColoredText|not advised}}, si vous constatez un dysfonctionnement appuyez sur le bouton {{Button|Reset}} ou quittez FCCircularText et recommencez.

*ver 0.18 2021/01/19 : correction de bugs, voir [https://forum.freecadweb.org/viewtopic.php?f=22&t=54524&p=468687#p468687 FCCircularText Macro issues]

*ver 0.17b 2020/09/28: correction d'un petit bug (pl ai lieu de plm dans la section trajectoire) et arrangement de la fenêtre (dimension) Clock, Helix, Path

*ver 0.17 2020/09/26: ajout de créer un texte circulaire sur le fil (courbe, arc, spline, ligne...) sélectionné, mode mot

ver 16d 2020/09/15 : voir le message de [https://gist.github.com/mario52a/a25e802498bae6959335 MasterCATZ commented Sep 14, 2020 message]


delette the FC 0.18 test section:
effacé la partie de test de la version 0.18:


{{Code|code=
{{Code|code=
Line 3,022: Line 705:
(2537)
(2537)


<span id="Links"></span>
=== Liens ===
=== Liens ===


La page dédiée sur le forum pour tout commentaires et signalisation d'éventuelles erreurs [http://forum.freecadweb.org/viewtopic.php?f=3&t=7384 Extrude from curved surface of cylinder]
La page dédiée sur le forum pour tout commentaires et signalisation d'éventuelles erreurs [http://forum.freecadweb.org/viewtopic.php?f=3&t=7384 Extrude from curved surface of cylinder]


{{clear}}
{{Draft Tools navi{{#translation:}}}}
{{Draft Tools navi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}

Latest revision as of 09:19, 19 November 2023

Other languages:

Macro FCCircularText

Description
Cette macro utilise l'outil Draft Forme à partir d'un texte pour créer une ligne de texte placée dans différentes orientations circulaires, y compris circonférentielle et hélicoïdale (à la manière d'une colonne Trajane). Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes 1, 2, 3 etc., ou des chiffres romains I, II, III, etc.

Version macro : 0.22c
Date dernière modification : 2023/11/17
Version FreeCAD : 0.19
Téléchargement : Icône de la barre d'outils
Auteur: Mario52
Auteur
Mario52
Téléchargement
Icône de la barre d'outils
Liens
Version Macro
0.22c
Dernière modification
2023/11/17
Version(s) FreeCAD
0.19
Raccourci clavier
None
Voir aussi
None

Description

Cette macro utilise l'outil Draft Formes à partir texte pour créer une ligne de texte placée dans différentes orientations circulaires, notamment circonférentielle et hélicoïdale comme par ex la colonne Trajane. Elle peut également être utilisée pour créer un cadran d'horloge avec des chiffres arabes 1, 2, 3... ou des chiffres romains I, II, III... . Cette dernière utilisation a été inspirée par le fil du Forum Macro pour créer un cadran d'horloge par un membre de la communauté FreeCAD, cblt2l.

Temporary code for external macro link. Do not use this code. This code is used exclusively by Addon Manager. Link for optional manual installation: Macro


# This code is copied instead of the original macro code
# to guide the user to the online download page.
# Use it if the code of the macro is larger than 64 KB and cannot be included in the wiki
# or if the RAW code URL is somewhere else in the wiki.

from PySide import QtGui, QtCore

diag = QtGui.QMessageBox(QtGui.QMessageBox.Information,
    "Information",
    "This macro must be downloaded from this link\n"
    "\n"
    "https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/7ab8a1e9dd7f924a62ecef83ec1d2ad8723e37d6/Macro_FCCircularText.FCMacro" + "\n"
    "\n"
    "Quit this window to access the download page")

diag.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()

import webbrowser 
webbrowser.open("https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/7ab8a1e9dd7f924a62ecef83ec1d2ad8723e37d6/Macro_FCCircularText.FCMacro")


Orientation à 360 degrés

Exemple de la macro affichant le texte avec une orientation à 360 degrés

Utilisation

La création d'un texte génère un dossier FcString, la création d'une horloge génère un dossier FcClock.

Tous les caractères restent indépendants. Si vous créez une extrusion, rien n'est effacé. Si vous créez un Compound avec le bouton Run Comp, il sera créé dans l'arbre principal de votre projet.

Ces options sont grisées par défaut et activées en cochant le bouton :

  • Extrude Char.
  • Placement.
  • SP. inclination.

A l'exception d'une boîte de placement Clock Z est activée et déplace le texte dans la direction Z pour placer le texte sur la surface de support.

Remarques

  • Cette macro met en grisé (désactivation) les options qui ne sont pas pertinentes pour une fonction sélectionnée.

Interface

Présentation générale

GUI

Première section

  • La fenêtre de TextEdit vous permet de copier le texte a créer (cliquez sur le bouton Reset vous permet de connaître la longueur de la chaîne entrée qui est affichée dans le titre de la fenêtre)
  • Le bouton Reverse inverse le texte
  • Word coché, cette option considère le texte comme un mot, le texte est coupé dans l'espace et écrit le texte mot par mot (à la place caractère par caractère en usage normal)
  • Le bouton Help affiche la page wiki dans le navigateur FreeCAD
  • LineEdit: affiche le chemin et le nom de la police du fichier
  • Other bouton pour rechercher des polices de characteres dans des répertoires non découverts
  • ComboView pour choisir la police
  • Origin retourne à l'origine system ex: "C:/Windows/Fonts/"
    • Par défaut la police ARIAL.TTF est imposée

Options disponibles

Après la première utilisation, vous devez modifier les paramètres suivants:

User parameter:BaseApp/Preferences/Macros/FCMmacros/FCCircularText

switchModeTextList

  • 0 = mode texte normal (et noir) coupe la switchFontComBox
  • 1 = permet de passer à la SwitchFontComBox 1

switchFontComBox

  • 0 = (et switchModeTextList= 1) mode texte (en couleur) dans la liste ComboBox, plus rapide
  • 1 = (et switchModeTextList= 1) fontFamily plus lent mais ComboBoxst plus beau!

setSystemFonts

  • 0 = matplotlib.font_manager.findSystemFonts("C:/", "ttf")
  • faire toutes les polices (dans tous les dossiers et sous-dossiers du DD) à temps !
  • 1 = fontman.findSystemFonts(self.pathFont)
  • faire toutes les polices du répertoire (et de tous les sous-dossiers)

seTtextAlignement

  • 0 = AlignLeft (défaut)
  • 1 = AlignCenter
  • 2 = AlignRight

setFontByDefault

  • Police par défaut

switchResetFALSE

  • 0 = réinitialisation (par défaut)
  • 1 = pas de réinitialisation (non recommandé) certains switches peuvent rester ouverts ou se fermer de manière inattendue!

Exemple

  1. switchModeTextList= false
  2. switchFontComBox = false
  3. setSystemFonts = false
  4. seTtextAlignement = 0

  1. switchModeTextList= true
  2. switchFontComBox = false
  3. setSystemFonts = false
  4. seTtextAlignement = 0

  1. switchModeTextList= true
  2. switchFontComBox = false
  3. setSystemFonts = false
  4. seTtextAlignement = 1 (0=Gauche, 1=Centré, 2=Droite)

  1. switchModeTextList= true
  2. switchFontComBox = true
  3. setSystemFonts = false
  4. seTtextAlignement = 1

Seconde section

Configurer des caractères dans FCCircularText

Première zone

Votre choix :

  • Mode Stand or Mode Flat : Le texte peut être créé debout ou à plat (comme l'horloge) options Outdoor et Indoor le texte des boutons est inversé.

Deuxième zone

Cette section vous permet de configurer le comportement global des caractères dans tous les choix disponibles, mais avec quelques variations. Si une fonction n'est pas utilisée de façon standard dans l'option choisie, cette fonction sera grisée.

  • 10.0 mm Radius of circle: rayon du cercle. (Défaut 10)
  • 2.0 mm Size character: hauteur des caractères. (Défaut 2)
  • 0 deg Begin angle: angle de départ du premier caractère du sur le cercle. (Default 0°)
  • 360 deg End angle: angle de fin du dernier caractère du texte. (Défaut 360)
  • 10.0 deg Correction angle: angle de correction du texte pour le faire correspondre à la tangente du cercle. (Défaut 10 °)
  • 0.15 mm Correction radius: correction du rayon (optionnel en rapport avec "Correction angle"). (Défaut 0.15)
  • Extrude Char: caractères d'extrusion de la case à cocher. (Par défaut inactif)
  • Placement: placement du texte dans la vue 3D. (Par défaut inactif)
  • Sp. inclination: inclinaison des caractères sur trois axes X, Y et Z (exemple pour couvrir un tel cône). (Par défaut inactif)
Outdoor

Mode par défaut. Le texte est écrit sur la surface extérieur du cylindre.

Indoor

Le texte est écrit sur la surface interne d'un tube ou courbe.

Helix

Le texte écrit suit le tracé d'une hélice.

  • La section helix est cachée par défaut. La fenêtre est visible si le bouton radio Helix est coché.
  • Toute les options de configurations des caractères sont actives.
  • Step of helix Step correspond au pas de la spire de l'hélice : 2 (correspond à la hauteur du caractère) par défaut.
  • Char. per turn Nombre de caractères par tour ici 10 par défaut, qui correspond à 10 caractères par tour d'hélice.
  • Si Step of helix (pas de l'hélice) est égal à zero, les Spinboxes Base Helix et End Helix sont activés.
  • Base Helix détermine le début (base) de placement des caractère dans l'élice (direction Placement Z). Si Placement Z est différent de zero, le départ est ajouté au Placement Z déjà déterminé plud haut.
  • End Helix Fin de l'hélice, le pas de l'hélice calculé est proportionnel à la hauteur et au nombre de caractères par tour d'hélice.
Clock

Les chiffres font partie d'un cercle avec des chiffres arabes ou romains.

  • Par défaut la section est cachée. La fenêtre est visible si le bouton radio Clock est coché
  • Quand la section est activée, les fonctions suivantes sont dégrisées et disponibles:
    1. Begin angle.
    2. End angle.
    3. Correction angle.
    4. Correction radius.
    5. Les boutons Mode Stand ou Mode Flat.
  • La section Clock est active.
  • Radius of support : Si une valeur est entrée, un support sera créé (defaut 0).
  • Si Support number face est différent de zéro un support est créé. (Si Extrude support = zéro une face est créée).
    • 1 = Un cercle est créé (le cercle apparaît).
    • 2 = Un rectangle est créé (longueur = (Radius * 2) hauteur = Radius (rayon) du support) (le rectangle apparaît).
    • 3 = Un triangle (circonscrit) est créé (Le triangle apparaît).
    • 4 = Un carré est créé (Radius du support) (Le carré apparaît).
    • 5 = Un polygone avec le nombre de faces affiché est créé (circonscrit) (le polygone apparaît).
  • Si Extrude support est différent de zéro la fonction est activée et une dimension d'extrusion est demandée. La fonction Placement direction Z se dégrise pour permettre de déplacer ou non les caractères sur la surface du support (dans la cas ou l'on désire créer un relief plutôt qu'une cavité) .

  • Si Support number face est égal à zéro aucun support n'est créé.
  • Mode Roman : Crée une horloge avec chiffres Romains I II III IIII V VI VII VIII IX X XI XII
  • Axial  : Les chiffres sont écrits axialement.

Section de la trajectoire

La section de titre change et affiche la longueur du fil sélectionné.

Si vous sélectionnez un fil, un arc, un cercle, une ligne et une arête, le chemin de la section est coloré en vert et la commande inutilisée est colorée en rouge

  1. Orthogonal le caractère est orthogonal à la vue
  2. Tangent le caractère est tangent au chemin du point sur le fil
  1. BB Base la base de point du caractère est de pointer le chemin sur le fil
  2. BB Center le centre bounBox du caractère est de pointer le chemin sur le fil
  3. BB Top le haut boundBox du caractère est de pointer le chemin sur le fil

le dernier bouton radio utilisé est enregistré dans le paramètre de FreeCAD

Section des commandes

  • Exit  : Quitte la macro.
  • Reset  : Reset toutes les valeurs, et affiche le nombre de caractères du texte entré dans la fenêtre de texte est affiché à côté du titre.
  • Run Comp : Lance la macro et crée un compount de tous les caractères et le place sur la racine de l'arbre dans la Vue combinéé.
  • Run  : Lance la macro.

Paramètres disponibles

Certains paramètres sont disponibles dans les paramètres de FreeCAD voir: Menu → Outils → Modifier les paramètres...

  • Paramètre utilisateur: BaseApp/Preferences/Macros/FCMmacros/FCCircularText
    • switchModeTextList :
      • false le mode texte normal (et noir) désactive switchFontComBox
      • true autorise switchFontComBox 1 (par défaut)
    • switchFontComBox :
      • false (et switchModeTextList = 1) mode texte (en couleur) dans la liste Faster ComboBox (par défaut)
      • true (et switchModeTextList = 1) famille de polices dans la liste ComboBox plus lente mais plus belle!
    • setSystemFonts :
      • false matplotlib.font_manager.findSystemFonts ("C: /", "ttf") font toutes les polices (dans tous les dossiers et sous-dossiers du HD) temps!!
      • true fontman.findSystemFonts (self.pathFont)
        crée toutes les polices dans le répertoire (et dans tous les sous-dossiers) (par défaut)
    • seTtextAlignement : 0 = AlignLeft (par défaut) 1 = AlignCenter 2 = AlignRight
    • setFontByDefault : Police par défaut (la dernière utilisée)
    • switchResetFALSE : false reset (par défaut), true pas de réinitialisation (non recommandé) certains commutateurs peuvent rester ouverts ou se fermer de manière inattendue!
    • setPathOrthogonal : true false
    • setPathTangent : true false
    • setPositionBase : true false
    • setPositionCenter : true false
    • setPositionTop : true false
    • switchVersionSearch : true false
    • Version : version de FCCircularText

En lançant la macro un un dossier FcString est créé pour les caractères et un dossier FcClock est créé pour l'horloge. Dans le cas d'un compount, il sera créé en plus sur la racine de l'arbre.

Script

L'icône pour votre barre à outils:

- in .PNG

- in .SVG

(Voir comment Créer une barre d'outils)

Script

Macro_Circular_Text.FCMacro

ou téléchargez le script:

Téléchargez le script sur github Macro_FCCircularText.FCMacro ver 0.21 2022/05/31

ou sur le forum Extrude from curved surface of cylinder

Exemple













Exemple sur une ellipse






Mode relief:





Example section path




Limitations

Remarque il est possible qu'une erreur se produise entre les versions. Veuillez publier le problème sur le forum et attendre le correctif mis à jour ou revenir à une version précédente de la macro. Je vous remercie.

Il est possible que deux caractères se chevauchent. Si cela se produit, voici une solution de contournement disponible à l'aide de la Rotate-To-Point Macro.


(pas totalement développé)

En projet:

Écriture du texte sur l'objet sélectionné

Écriture sur un chemin.

Journal des modifications

  • ver 0.22c 2023/11/17 : adding restore selection after delete the last object , by TheMarkster , thanks

see Curved text on a flat surface?

sel = Gui.Selection.getCompleteSelection()
#delete objects
#restore previous selection
Gui.Selection.clearSelection()
for s in sel:
    Gui.Selection.addSelection(s.Object,s.SubElementNames)
  • ver 0.22b 2023/11/15 : upgrade correction stylesheet and FreeCAD.activeDocument().recompute(None,True,True)
  • ver 0.21 2022/05/31 : ajout bouton recherche dans les répertoires, et bouton retour à l'origine système
  • ver 0.2021/04/05 : ajout d'un icone dans la macro, Tab pour diminuer la hauteur de la macro, suppression de toutes les dimensions des widgets maintenant entièrement compatibles avec la feuille de style, révision de la version de recherche pour compatibilité et autres petits changements.
  • ver 1.19 2021/03/15 : ajout du bouton Delette du dernier objet créé et du code FreeCAD.ActiveDocument.openTransaction("FCCTc") pour le système Undo/Redo.
    • Ajout d'une boîte à cocher Reset pour commuter/activer (demandé par les utilisateurs) la réinitialisation automatique après avoir poussé le bouton Run et Run comp. Cette utilisation de la boîte à cocher est not advised, si vous constatez un dysfonctionnement appuyez sur le bouton Reset ou quittez FCCircularText et recommencez.
  • ver 0.17b 2020/09/28: correction d'un petit bug (pl ai lieu de plm dans la section trajectoire) et arrangement de la fenêtre (dimension) Clock, Helix, Path
  • ver 0.17 2020/09/26: ajout de créer un texte circulaire sur le fil (courbe, arc, spline, ligne...) sélectionné, mode mot

ver 16d 2020/09/15 : voir le message de MasterCATZ commented Sep 14, 2020 message

effacé la partie de test de la version 0.18:

#### Test FreeCAD.Version simple ############################################################################################################
if int(FreeCAD.Version()[1]) < 18:      # Version de FreeCAD
    FreeCAD.Console.PrintMessage("This version " + __Title__ + " rmu  work with the FreeCAD 0.18 or higher." + "\n\n")
    FreeCAD.Console.PrintMessage("For the precedent version see the page " + "\n\n")
    FreeCAD.Console.PrintMessage("https://gist.githubusercontent.com/mario52a/a25e802498bae6959335/raw/db47f78f2b20a35137ac213b8d1a62d30f525dcb/Macro_FCCircularText.FCMacro" + "\n\n")
#### Test FreeCAD.Version simple ############################################################################################################
  • ver 0.16 2020/06/07 : petit bug dans Linux (cause plusieurs sous répertoires dans fonts) avec le chemin sauvé dans les options la recherche restait uniquement dans le dernier répertoire et n'affichait rien (), imposé PolicePath = "/usr/share/fonts/" (stay on path /xx/xx/xx/xx/xx/xx/ on entry) à chaque démarrage et la recherche se fait dans tous les sous répertoires.
  • ver 0.15 2020/06/01 : Pour PySide2 Qt5 ajoutant des polices matplotlib dans comboView, configuration des paramètres.
  • ver 0.14-4 2020/04/25 : correction avec "DisplayMode = u"Flat Lines" :
  • ver 0.14-3 2020/04/25 : adapté pour :
OS: Windows 10 (10.0)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.20655 (Git)
Build type: Release
Branch: master
Hash: e8e67e8c5ebbc9f9ed9ea67aba5b891969595ece
Python version: 3.6.8
Qt version: 5.12.1
Coin version: 4.0.0a
OCC version: 7.3.0
       carDegrees = b' \xc2\xb0'.decode("utf-8")    #thanks wmayer	https://forum.freecadweb.org/viewtopic.php?f=13&t=36380&p=308476#p308357
       self.DS_InclinaisonX.setSuffix(carDegrees)
       self.DS_InclinaisonY.setSuffix(carDegrees)
       self.DS_InclinaisonZ.setSuffix(carDegrees)
  • ver 0.14-1 2019/06/11 replace "°" to chr(176)
  • ver 0.14 2019/04/27 compatible avec Python 3.6.6 et Qt 5.6.2 (cause: unicode() )
latest testing:

#OS: Windows 10
#Word size of OS: 64-bit
#Word size of FreeCAD: 64-bit
#Version: 0.19.16523 (Git)
#Build type: Release
#Branch: master
#Hash: 9b3ec233c8b21e0df66fada487cd10f471d60cac
#Python version: 3.6.6
#Qt version: 5.6.2
#Coin version: 4.0.0a
#OCC version: 7.3.0
  • ver 0.13 30/01/2018 ajout d'une fonction de rotation du caractère sur lui même
  • ver 0.13 09/08/2016 remplacé le bouton "New font" par la fonction "fontComboBox" cause , avec Windows 10 la fenêtre "Font" reste vide les fichiers sont cachés
  • ver 0.12 03/07/2016 optimisation du code de la boucle pour accepter les décimales pour plus de précision de la répartition des angles.

remplacer la ligne:

for angleTr in range(debut,rotation,((rotation-debut)/nombre)):

par

for angleTrFloat in range((debut*10000),(rotation*10000),int((round(((float(rotation)-float(debut))/float(nombre)),4)*10000)) ):    # pour 4 decimales
                angleTr = (float(angleTrFloat)/10000)
  • ver 0.10 17/05/2015 adding lines 1365, 1366 only created more clock face ?? ()
supp.MakeFace = True
            App.activeDocument().recompute()
  • ver 0.9 11/05/2015 merci à NormandC pour les tests.

replace

self.DS_InclinaisonX.setSuffix(" X°")
        self.DS_InclinaisonY.setSuffix(" Y°")
        self.DS_InclinaisonZ.setSuffix(" Z°")

to

self.DS_InclinaisonX.setSuffix(unicode(" X°"))
        self.DS_InclinaisonY.setSuffix(unicode(" Y°"))
        self.DS_InclinaisonZ.setSuffix(unicode(" Z°"))
  • ver 0.8 10/05/2015 replace "String=texte[ii2]" to "String=unicode(texte[ii2])" line 1290. cause "TypeError: Property 'FontFile': type must be str or unicode, not QString"
# ver 0.8 10/05/2015 /_ # testing with OS :
##################################################################################################
# OS: Ubuntu 14.04.1 LTS                          # OS: Ubuntu 14.04.2 LTS
# Platform: 32-bit                                # Word size of OS: 32-bit
# Version: 0.14.2935 (Git)                        # Word size of FreeCAD: 32-bit
# Branch: master                                  # Version: 0.16.4928 (Git)
# Hash: eab159b6ee675012bf79de838c206a311e911d85  # Branch: master
# Python version: 2.7.6                           # Hash: d8f63bcfd10301f3d1e141cced4370f0782238d0
# Qt version: 4.8.6                               # Python version: 2.7.6
# Coin version: 4.0.0a                            # Qt version: 4.8.6
# SoQt version: 1.6.0a                            # Coin version: 4.0.0a
# OCC version: 6.7.0                              # OCC version: 6.8.0.oce-0.17
##################################################################################################
# OS: Windows Vista                               # OS: Windows Vista
# Word size of OS: 32-bit                         # Word size of OS: 32-bit
# Word size of FreeCAD: 32-bit                    # Word size of FreeCAD: 32-bit
# Version: 0.15.4527 (Git)                        # Version: 0.15.4671 (Git)
# Branch: master                                  # Branch: releases/FreeCAD-0-15
# Hash: 0da2e4c45a9a259c26abd54c2a35393e1c15696f  # Hash: 244b3aef360841646cbfe80a1b225c8b39c8380c
# Python version: 2.7.8                           # Python version: 2.7.8
# Qt version: 4.8.6                               # Qt version: 4.8.6
# Coin version: 4.0.0a                            # Coin version: 4.0.0a
# OCC version: 6.7.1                              # OCC version: 6.8.0.oce-0.17
##################################################################################################
  • ver 0.7 02/02/2015 suppression 2 str App.Console.PrintMessage(str(PolicePath)+"\n") to App.Console.PrintMessage((PolicePath)+"\n") that caused an error with the characters above 128 in the police path.
  • ver 0.6 23/11/2014 corrected "texte = unicode(self.textEdit.toPlainText())" now accept "'éèà@..."
  • ver 0.5 19/11/2014 Gui
  • ver 0.4 10/10/2014 add variable "rotation" in the loop (for i in range(0,rotation,(rotation/nombre)): # 360 a parametrer)
  • ver 0.4 27/08/2014 correction error of de radius (exterieur=0, debout=1)
  • ver 0.3 26/08/2014 add creation text of flat curve
  • ver 0.2 26/08/2014 add creation text of internal curve
  • ver 0.1

(2537)

Liens

La page dédiée sur le forum pour tout commentaires et signalisation d'éventuelles erreurs Extrude from curved surface of cylinder