Macro FCCircularText: Difference between revisions
(upgrade) |
(upgrade) |
||
Line 63: | Line 63: | ||
<!--T:34--> |
<!--T:34--> |
||
* TextEdit window that lets you copy the text to display (click on the {{KEY|Reset}} allows to know the number of the input string that is displayed in the window title) |
* TextEdit window that lets you copy the text to display (click on the {{KEY|Reset}} allows to know the number of the input string that is displayed in the window title) |
||
* The {{ |
* The {{Button|Reverse}} to reverse the text |
||
* LineEdit : display the path and name of file font |
* LineEdit : display the path and name of file font |
||
* The {{ |
* The {{Button|Help}} display the wiki page in the FreeCAD browser |
||
* ComboView for choice font |
* ComboView for choice font |
||
** Default ARIAL.TTF |
** Default ARIAL.TTF |
||
Line 153: | Line 153: | ||
<!--T:39--> |
<!--T:39--> |
||
[[File:FCCircularText 24.png|left]] |
[[File:FCCircularText 24.png|left]] |
||
* {{ |
* {{Button|Mode Stand}} or {{Button|Mode Flat}} : The text will be placed standing or flat (same as clock) options '''Outdoor''' and '''Indoor''' are reversed. |
||
{{clear}} |
{{clear}} |
||
Line 178: | Line 178: | ||
<!--T:43--> |
<!--T:43--> |
||
[[File:FCCircularText 10.png| left]] |
[[File:FCCircularText 10.png| left]] |
||
* '''Radius of circle''' : Radius of the circle. (Default 10) |
* {{SpinBox|10.0 mm}} '''Radius of circle''' : Radius of the circle. (Default 10) |
||
* '''Size character''' |
* {{SpinBox|2.0 mm}} '''Size character''' : Character height. (Default 2) |
||
* '''Begin angle''' |
* {{SpinBox|0 deg}} '''Begin angle''' : Starting angle of the first character in the circle. (Default 0 °) |
||
* '''End angle''' |
* {{SpinBox|360 deg}} '''End angle''' : Angle end of the last character of the text. (Default 360) |
||
* '''Correction angle''' : Character correction angle to make it tangent to the circle. (Default 10 °) |
* {{SpinBox|10.0 deg}} '''Correction angle''' : Character correction angle to make it tangent to the circle. (Default 10 °) |
||
* '''Correction radius''': Fixed the radius of the circle characters (optional). (Default 0.15) |
* {{SpinBox|0.15 mm}} '''Correction radius''' : Fixed the radius of the circle characters (optional). (Default 0.15) |
||
* |
* |
||
* ''' |
* {{CheckBox|'''Extrude Char'''}} : Checkbox extrusion characters. (Inactive Default) |
||
* ''' |
* {{CheckBox|'''Placement'''}} : Text placement in the 3D view. (Inactive Default) |
||
* ''' |
* {{CheckBox|'''Sp. inclination'''}} : Inclination of characters in three axes X, Y and Z (example to cover such a cone). (Inactive Default) |
||
* '''Sp. inclination''' : Inclination of characters in three axes X, Y and Z (example to cover such a cone). (Inactive Default) |
|||
{{clear}} |
{{clear}} |
||
Revision as of 19:17, 1 June 2020
Description |
---|
New version GUI modifyed for the HD dpi (QGridLayout) run only FC version 0.18 and more (PySide2 Qt5) For the precedent version see FCCircularText and install it manually. This macro makes use of the Draft ShapeString tool to create a text line placed in different circular orientations, including circumferential and helical in the manner of Trajan Column]. It can also be used to create a clock face with Arabic numerals 1, 2, 3, etc., or Roman numerals I, II, III, etc. Macro version: 0.15 Last modified: 2020/06/01 FreeCAD version: All Download: ToolBar Icon Author: Mario52 |
Author |
Mario52 |
Download |
ToolBar Icon |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
0.15 |
Date last modified |
2020/06/01 |
FreeCAD Version(s) |
All |
Default shortcut |
None |
See also |
None |
Description
This macro makes use of the Draft ShapeString tool to create a text line placed in different circular orientations, including circumferential and helical in the manner of Trajan's Column. It can also be used to create a clock face with Arabic numerals 1, 2, 3, etc., or Roman numerals I, II, III, etc. This latter usage was inspired by the Forum thread Macro to Create Clock Face by 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/ba3b22b13728bc4cdcbb55638663e34d12c1237c/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/ba3b22b13728bc4cdcbb55638663e34d12c1237c/Macro_FCCircularText.FCMacro")
Utilisation
Principle: The options that are not useful for the selected function are dimmed so inaccessible.
A function can gray out options if they are not for him.
Launch the macro folder FcString for created characters and a file FcClock for created clocks.
All the characters are and remain independent. When creating extrusions nothing is deleted. If Compound is created with Run Comp is copied out of the folder.
The options are shaded by default and are active in all functions if they are checked :
- Extrude Char.
- Placement.
- SP. inclination.
Except for one Clock Service Placement box Z is activated and moves the text in the direction Z to place the text on the support surface.
Presentation
Overview
First section
- TextEdit window that lets you copy the text to display (click on the Reset allows to know the number of the input string that is displayed in the window title)
- The Reverse to reverse the text
- LineEdit : display the path and name of file font
- The Help display the wiki page in the FreeCAD browser
- ComboView for choice font
- Default ARIAL.TTF
Options available
User parameter:BaseApp/Preferences/Macros/FCMmacros/
switchModeTextList
- 0 = normal text mode (and black) cuts the switchFontComBox
- 1 = allows switchFontComBox 1
switchFontComBox
- 0 = (and switchModeTextList= 1) text mode (in color) in ComboBox list, faster
- 1 = (and switchModeTextList= 1) fontFamily slower but more beautiful ComboBoxst!
setSystemFonts
- 0 = matplotlib.font_manager.findSystemFonts("C:/", "ttf")
- do all the fonts (in all folders and sub-folders of the DD) time !!
- 1 = fontman.findSystemFonts(self.pathFont)
- do all the fonts in the directory (and in all the sub-folders)
seTtextAlignement
- 0 = AlignLeft (default)
- 1 = AlignCenter
- 2 = AlignRight
setFontByDefault
- Font by Default
switchResetFALSE
- 0 = reset (default)
- 1 = no reset (not recommended) some switches can remain open or close unexpectedly!
Example
- switchModeTextList=
false
- switchFontComBox =
false
- setSystemFonts =
false
- seTtextAlignement = 0
- switchModeTextList=
true
- switchFontComBox =
false
- setSystemFonts =
false
- seTtextAlignement = 0
- switchModeTextList=
true
- switchFontComBox =
false
- setSystemFonts =
false
- seTtextAlignement = 1 (0=Left, 1=Centered, 2=Rigth)
- switchModeTextList=
true
- switchFontComBox =
true
- setSystemFonts =
false
- seTtextAlignement = 1
Second Section
Configuring characters in FCCircularText
First zone
Your choice :
-
Outdoor
-
Indoor
-
Helix
-
Clock
- Mode Stand or Mode Flat : The text will be placed standing or flat (same as clock) options Outdoor and Indoor are reversed.
-
Mode Stand Outdoor The text will be written up.
-
Mode Flat Outdoor The text will be placed flat.
-
Mode Flat Indoor The text will be placed flat.
-
Mode Stand Indoor The text will stand registered (same as clock).
Second area
This section allows you to configure the overall behavior of characters in all the choices available but with some variation. If the command is not used in the option chosen, it will be grayed out.
- 10.0 mm Radius of circle : Radius of the circle. (Default 10)
- 2.0 mm Size character : Character height. (Default 2)
- 0 deg Begin angle : Starting angle of the first character in the circle. (Default 0 °)
- 360 deg End angle : Angle end of the last character of the text. (Default 360)
- 10.0 deg Correction angle : Character correction angle to make it tangent to the circle. (Default 10 °)
- 0.15 mm Correction radius : Fixed the radius of the circle characters (optional). (Default 0.15)
- Extrude Char : Checkbox extrusion characters. (Inactive Default)
- Placement : Text placement in the 3D view. (Inactive Default)
- Sp. inclination : Inclination of characters in three axes X, Y and Z (example to cover such a cone). (Inactive Default)
Outdoor
Default mode. The text is written on the outside of the circumference of the circle.
-
Outdoor
-
-
Indoor
The text is written on the inner side of the circumference of the circle
-
Indoor
-
-
Helix
The text is entered on the outer circumference of a helix.
-
Helix
-
-
- The helix area is hidden by default.
- All characters configuration options are available.
- Step of helix which corresponds to the pitch of the helix turns and displays 2 (character height) by default.
- Char. per turn activates and displays 10 by default, which corresponds to 10 characters per helical turn.
- If Step of helix (helix pitch) is zero, Spinboxes Base Helix and End Helix are activated.
- Base Helix provides the basis for starting the helix (even Placement Z). If 'Placement Z' is different from zero, the starting point is added to Z Placement
- End Helix End of the helix pitch of the helix will be calculated relative to the height and the number of characters per helical turn.
Clock
The figures are part of a circle with Arabic numerals or Romans.
-
Clock
-
Axial
-
Redress
- By default, the section is hidden.
- When the selection is made, the following functions get dark and are usable:
- Begin angle.
- End angle.
- Correction angle.
- Correction radius.
- The buttom Mode Stand or Mode Flat.
- The area Clock is activated.
- Radius of support : If a value is given, support will be created (default 0).
- If Support number face is different from zero a support is created. (If Extrude support = zero then a face is created).
- 1 = A circle is created (circle appears).
- 2 = A rectangle is created (length = (Radius of media * 1.5) width = Radius of support) (Rectangle appears).
- 3 = A triangle is created (circumscribed) (Triangle appears).
- 4 = A square is created (Radius of support) (Square appears).
- 5 = A polygon with the number of faces displayed (circumscribed) (Polygon appears).
- Extrude support is activated and an extrusion dimension can be given.
- If Support number face is equal to zero there is no support.
- Mode Roman : The writing will be in Roman figures I II III IIII V VI VII VIII IX X XI XII
- Axial : The figures will be written axially.
Commands
- Exit : Leaves the macro.
- Reset : Reset all values and displays the number of characters displayed in the window.
- Run Comp : Launches the macro and creates a Compount object of all characters.
- Run : Launches the macro
Launch the macro folder FcString for created characters and a file FcClock for created clocks.
Script
The button icon:
(See Customize_Toolbars for more)
See the Code
Macro_Circular_Text.FCMacro
# -*- 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)# # ################################################################################################## #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__ = "00.15" __Date__ = "2020/06/01" #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" # #### 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 ############################################################################################################ 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 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")# ###################################################################### 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(QIcon(QApplication.style().standardIcon(QStyle.SP_MessageBoxQuestion))) # self.PB_Help.clicked.connect(self.on_PB_Help_clicked) # help #### matplotlib debut 3/5 setupUi ################################################################# self.lineEdit_NameFile = QtWidgets.QLineEdit() 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() #### 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.fromTheme("close",QtGui.QIcon(":/icons/application-exit.svg"))) #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.fromTheme("refresh",QtGui.QIcon(":/icons/view-refresh.svg"))) self.PU_Reset.clicked.connect(self.on_PU_Reset) self.PU_Benchmarks = QtWidgets.QPushButton() self.PU_Benchmarks.setIcon(QtGui.QIcon.fromTheme("execute",QtGui.QIcon(":/icons/button_valid.svg"))) self.PU_Benchmarks.clicked.connect(self.on_PU_Benchmarks) self.PU_Execute = QtWidgets.QPushButton() self.PU_Execute.setIcon(QtGui.QIcon.fromTheme("download",QtGui.QIcon(":/icons/edit_OK.svg"))) 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")) self.lineEdit_NameFile.setText(_fromUtf8("(" + str(self.index + 1) + "/" + str(len(self.tableau)) + ") " + self.tableau[self.index][1])) 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("Size character")) self.S_Begin_Angle.setToolTip(_fromUtf8("Starting text of the circle ")) self.S_Begin_Angle.setSuffix(_fromUtf8(" deg")) self.label_13.setText(_fromUtf8("Begin angle")) self.S_End_Angle.setToolTip(_fromUtf8("End text of the circle ")) self.S_End_Angle.setSuffix(_fromUtf8(" deg")) self.label_14.setText(_fromUtf8("End 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_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" ###### Read Configuration end #### # MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show()
or download the script :
- on github Macro_FCCircularText.FCMacro ver 0.15 2020/06/01
- at the forum Extrude from curved surface of cylinder
Example
-
Text beginning at 180 degrees (Begin angle) end at 360 degrees (End angle) external curve.
-
Text set in an inner curve.
-
Text circular on internal and external curve.
-
Circular text on a flat onbjet.
-
External curve.
-
Internal curve.
-
Internal curve extrusion material designated and subtraction.
-
External curve.
-
Internal curve with subtraction.
-
Extrusion on a cone with Sp. Inclination 45° axis Z.
-
Ring Internal curve with subtraction.
-
Pivot character 0°, 90°, ....
Example onto Ellipse
-
Create your ellipse hers 100x50.
-
Exrtude it 50 mm.
-
Discretize the perimeter and create points with the macro Work Features.
Tab Point > Point 2/3 > Points=Cut (Wire) -
Create the circle to 3 points with the macro Work Features.
Tab Circle Circle=(3 Points)
-
Create point center circle with the macro Work Features.
Tab Point > Point 1/3 > Circle(s) center. -
Create the benchmark lines and configure FCCircularText.
-
Create the text with Run Comp.
-
Delete the circle, points and lines.
-
Ellipses.
Mode relief:
-
Select the rectangle , the ellipse and make compound
Activate the Part module, then Menu Part > Make compound. -
Extrude the compound of Solid.
-
Select Shape (text) , the compound and Cut.
-
The text is cut in the shape of the ellipse.
-
Select the Ellipse extruded , the Cut (text) and fuse.
Little bug
It is possible that two characters overlap, here a small remedy with Macro_Rotate_To_Point
-
Little "bug" and remedy example.
(not fully developed)
Planned :
Writing on a path circular text of position object selected.
(PS : it is possible that an error is made between version 2 Please wait for the next or return to the previous version thank you)
Currently:
- ver 0.15 2020/06/01 : For PySide2 Qt5 adding matplotlib fonts in comboView, config on parameter
- ver 0.14-4 2020/04/25 : corrected for "DisplayMode = u"Flat Lines" :
- ver 0.14-3 2020/04/25 : adapted for :
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
- ver 0.14-2 2019/07/22 replace chr(176) (give error <FC 0.18) and replace with the wmayer code, see Fehler in Version 0.19 pre ??
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 for Python 3.6.6 and 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 add feature Pivot for rotate the character on himself
ver 0.13 09/08/2016 replace the button "New font" to "fontComboBox" cause , with Windows 10 the window Font stay empty the files are hidden
- ver 0.12 03/07/2016 optimize the code for accept the decimal number in determination angle
replace the line
for angleTr in range(debut,rotation,((rotation-debut)/nombre)):
to
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 thank you NormandC for testing
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)
Links
To comment on the Extrude from curved surface of cylinder
- Drafting: Line, Polyline, Fillet, Arc, Arc by 3 points, Circle, Ellipse, Rectangle, Polygon, B-spline, Cubic Bézier curve, Bézier curve, Point, Facebinder, ShapeString, Hatch
- Annotation: Text, Dimension, Label, Annotation styles, Annotation scale
- Modification: Move, Rotate, Scale, Mirror, Offset, Trimex, Stretch, Clone, Array, Polar array, Circular array, Path array, Path link array, Point array, Point link array, Edit, Subelement highlight, Join, Split, Upgrade, Downgrade, Wire to B-spline, Draft to sketch, Set slope, Flip dimension, Shape 2D view
- Draft Tray: Select plane, Set style, Toggle construction mode, AutoGroup
- Snapping: Snap lock, Snap endpoint, Snap midpoint, Snap center, Snap angle, Snap intersection, Snap perpendicular, Snap extension, Snap parallel, Snap special, Snap near, Snap ortho, Snap grid, Snap working plane, Snap dimensions, Toggle grid
- Miscellaneous: Apply current style, Layer, Manage layers, Add a new named group, Move to group, Select group, Add to construction group, Toggle normal/wireframe display, Create working plane proxy, Heal, Show snap toolbar
- Additional: Constraining, Pattern, Preferences, Import Export Preferences, DXF/DWG, SVG, OCA, DAT
- Context menu:
- Layer container: Merge layer duplicates, Add new layer
- Layer: Activate this layer, Select layer contents
- Text: Open hyperlinks
- Wire: Flatten
- Working plane proxy: Write camera position, Write objects state
- Getting started
- Installation: Download, Windows, Linux, Mac, Additional components, Docker, AppImage, Ubuntu Snap
- Basics: About FreeCAD, Interface, Mouse navigation, Selection methods, Object name, Preferences, Workbenches, Document structure, Properties, Help FreeCAD, Donate
- Help: Tutorials, Video tutorials
- Workbenches: Std Base, Arch, Assembly, CAM, Draft, FEM, Inspection, Mesh, OpenSCAD, Part, PartDesign, Points, Reverse Engineering, Robot, Sketcher, Spreadsheet, Start, Surface, TechDraw, Test Framework, Web
- Hubs: User hub, Power users hub, Developer hub