Difference between revisions of "Macro CloneConvert"

From FreeCAD Documentation
Jump to navigation Jump to search
(Marked this version for translation)
m (date)
 
(25 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 +
<languages/>
 
<translate>
 
<translate>
 
<!--T:1-->
 
<!--T:1-->
{{Macro|Icon=Macro_CloneConvert |Name=Macro CloneConvert|Description=Creates a clone of the object and the converted in the chosen position and size (inch, mm, m, µm...).|Author=mario52}}
+
{{Macro
 +
|Name=Macro CloneConvert
 +
|Icon=Macro_CloneConvert.png
 +
|Description=Creates a clone or Copy or Compound of the object(s) and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base).<br />If you have problem example:("(unicode error) 'utf-8' codec can't decode byte 0xb0...")<br />Download the macro code directly on the Gists [https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/7838cbdef74a836a34063e3b6309c179e503bf24/Macro_CloneConvert.FCMacro Macro_CloneConvert] open the old Macro_CloneConvert in FC macro editor paste the new code in place of the old code, save it, close FreeCAD, open FreeCAD and run the macro.
 +
|Author=mario52
 +
|Version=0.13
 +
|Date=2019-09-15
 +
|FCVersion=All
 +
|Download=[https://www.freecadweb.org/wiki/images/0/0a/Macro_CloneConvert.png ToolBar Icon]
 +
}}
  
 
==Description== <!--T:2-->
 
==Description== <!--T:2-->
 
Creates a clone or copy of the object and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base)
 
Creates a clone or copy of the object and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base)
 +
 +
</translate>
 +
{{Codeextralink|https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/786ad9caab88a206ba26aad7fd6fb7c00eec2083/Macro_CloneConvert.FCMacro}}
 +
<translate>
  
 
==Uses== <!--T:3-->
 
==Uses== <!--T:3-->
Line 23: Line 37:
  
 
<!--T:11-->
 
<!--T:11-->
'''150%''' = '''1,50''' in the '''"Scale free"''' fields  
+
'''150%''' = '''1,50''' in the '''"Scale free"''' fields <br />
 
 
<!--T:12-->
 
 
'''104%''' = '''1,04''' in the '''"Scale free"''' fields  
 
'''104%''' = '''1,04''' in the '''"Scale free"''' fields  
  
Line 38: Line 50:
  
 
<!--T:16-->
 
<!--T:16-->
'''50%''' = '''0,50''' in the '''"Scale free"''' fields  
+
'''50%''' = '''0,50''' in the '''"Scale free"''' fields<br />
 
 
<!--T:17-->
 
 
''' 4%''' = '''0,04''' in the '''"Scale free"''' fields  
 
''' 4%''' = '''0,04''' in the '''"Scale free"''' fields  
 +
<br />
  
 
<!--T:6-->
 
<!--T:6-->
<br />
 
 
Predefined units are :
 
Predefined units are :
 +
km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.
 +
<br /><br />
  
 
<!--T:7-->
 
<!--T:7-->
km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.
 
<br /><br />
 
 
[[File:Macro CloneConvert_01.png|220px|left|CloneConvert]]
 
[[File:Macro CloneConvert_01.png|220px|left|CloneConvert]]
 
* '''Mode'''
 
* '''Mode'''
* '''Clone  :''' One clone of the objet(s) is create
+
* '''Clone  :''' The object(s) clone are create  
 
* '''Copy    :''' One copy of the objet(s) is create
 
* '''Copy    :''' One copy of the objet(s) is create
 
* '''Comp    :''' One compound of the objet(s) is create
 
* '''Comp    :''' One compound of the objet(s) is create
* '''Increm. :''' incrementing the coordinates data to the original coordinates of the object (Placement, Rotation ...)<br />If this is not checked the Placement begin in coordinates 0,0,0 of FreeCAD<br />In case a compound Placement information is [0,0,0] the Placement begin in the position of object<br />If the real location is away from the base coordinates 0,0,0 use the {{KEY|ValueAt()}} button<br />for the real Placement of the subObject selected Face, Wire, Line ....
+
* '''Increm. :''' incrementing the coordinates data to the original coordinates of the object (Placement, Rotation ...)<br />If this is not checked the Placement begin in coordinates 0,0,0 of FreeCAD<br />In case a compound Placement information is [0,0,0] the Placement begin in the position of object<br />If the real location is away from the base coordinates 0,0,0 use the {{KEY|ValueAt()}} button for the real Placement of the subObject selected Face, Wire, Line ....
*
+
* '''Unique  :''' If this checkBox is checked and multiple object selected, the clone created is one unique object
 +
 
 +
<!--T:28-->
 
* '''Coordinates'''
 
* '''Coordinates'''
* '''{{KEY|...}} :''' This button align the YZ values on the value of X to have the same values ​​XYZ (or manually)<br />Two click reset the coordinates values to 0.0  
+
* '''{{KEY|...}} :''' This button align the YZ values on the value of X to have the same values ​​XYZ (or manually). Two click reset the coordinates values to 0.0  
 
* '''Coordinate X :''' Move the copy to the Coordinate X selected (Base 0,0,0 if Increm. is not checked)
 
* '''Coordinate X :''' Move the copy to the Coordinate X selected (Base 0,0,0 if Increm. is not checked)
 
* '''Coordinate Y :''' Move the copy to the Coordinate Y selected (Base 0,0,0 if Increm. is not checked)
 
* '''Coordinate Y :''' Move the copy to the Coordinate Y selected (Base 0,0,0 if Increm. is not checked)
 
* '''Coordinate Z :''' Move the copy to the Coordinate Z selected (Base 0,0,0 if Increm. is not checked)
 
* '''Coordinate Z :''' Move the copy to the Coordinate Z selected (Base 0,0,0 if Increm. is not checked)
*
+
 
 +
<!--T:29-->
 
* '''Rotation'''
 
* '''Rotation'''
 
* '''{{KEY|...}} :''' This button align the Pitch and Roll values on the value of Yaw to have the same values ​​Rotation (or manually)<br />Two click reset the rotations values to 0.0  
 
* '''{{KEY|...}} :''' This button align the Pitch and Roll values on the value of Yaw to have the same values ​​Rotation (or manually)<br />Two click reset the rotations values to 0.0  
Line 68: Line 81:
 
* '''Pitch ( Y ) :''' Rotate the copy to the axis Y (Pitch) (Begin 0 if Increm. is not checked)
 
* '''Pitch ( Y ) :''' Rotate the copy to the axis Y (Pitch) (Begin 0 if Increm. is not checked)
 
* '''Roll ( X )  :''' Rotate the copy to the axis X (Roll) (Begin 0 if Increm. is not checked)
 
* '''Roll ( X )  :''' Rotate the copy to the axis X (Roll) (Begin 0 if Increm. is not checked)
*
+
 
 +
<!--T:30-->
 
* '''Scale predefined'''
 
* '''Scale predefined'''
* '''Scale predefined :''' predefined scales in units, km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique<br />or choose a free value in the Scale free field.
+
* '''Scale predefined :''' predefined scales in units, km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique or choose a free value in the Scale free field.
*
+
 
 +
<!--T:31-->
 
* '''Number copy '''
 
* '''Number copy '''
 
* '''Number copy :''' number of copies
 
* '''Number copy :''' number of copies
*
+
 
 +
<!--T:32-->
 
* '''Scale free'''
 
* '''Scale free'''
 
* '''{{KEY|...}} :''' This button align the Scales values on the value of Scale X to have the same values ​​XYZ (or manually)<br />Two click reset the scales values to 1.0  
 
* '''{{KEY|...}} :''' This button align the Scales values on the value of Scale X to have the same values ​​XYZ (or manually)<br />Two click reset the scales values to 1.0  
Line 80: Line 96:
 
* '''Scale Y :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Y axis, to reduce the shape give a decimal value '''(0,5)'''
 
* '''Scale Y :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Y axis, to reduce the shape give a decimal value '''(0,5)'''
 
* '''Scale Z :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Z axis, to reduce the shape give a decimal value '''(0,5)'''
 
* '''Scale Z :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Z axis, to reduce the shape give a decimal value '''(0,5)'''
*
+
 
* '''{{KEY|ValueAt()}} :''' Give the valueAt() the subObject selected Face, Wire, Line ...<br />This option is useful in case a compound Placement information [0,0,0] and its real location is away from the base coordinates 0,0,0<br />(gives no provide information about the rotation of the object)
+
<!--T:33-->
 +
* '''{{KEY|ValueAt()}} :''' Give the valueAt() the subObject selected Face, Wire, Line ...<br />This option is useful in case a compound Placement information [0,0,0] and its real location is away from the base coordinates 0,0,0 (gives no provide information about the rotation of the object)
 
* '''{{KEY|Ok}} :''' the OK button validates and launches the command, if no object is selected the {{KEY|Ok}} button will be coloured in red
 
* '''{{KEY|Ok}} :''' the OK button validates and launches the command, if no object is selected the {{KEY|Ok}} button will be coloured in red
 
* '''{{KEY|Reset}} :''' the Reset button puts all the values to zero
 
* '''{{KEY|Reset}} :''' the Reset button puts all the values to zero
Line 88: Line 105:
  
 
==Script== <!--T:8-->
 
==Script== <!--T:8-->
The icone [[Image:Macro_CloneConvert.png]]  
+
The icon [[Image:Macro_CloneConvert.png]]  
  
 
<!--T:18-->
 
<!--T:18-->
Macro_CloneConvert.FCMacro
+
'''Macro_CloneConvert.FCMacro'''
</translate>
 
<syntaxhighlight>
 
# -*- coding: utf-8 -*-
 
  
# CloneConvert.FCMacro
+
<!--T:34-->
# Cree un clone ou une copie de l'objet ou des objets selectionne(s) et le met e l'echelle de la grandeur choisie
+
Download the macro to Gist [https://gist.github.com/mario52a/9f2f2f6144e1307a048f1840ef99300c Macro_CloneConvert.FCMacro]
# utilisation : lancer CloneConvert selectionnez un objet choisissez la grandeur et cliquez sur OK
 
#
 
# Creates a clone of one copy the selected object and updates the selected size range
 
# use: start CloneConvert select an object choose the size and click OK
 
#
 
  
#OS: Windows Vista                                #OS: Windows 8.1
+
==Revision== <!--T:19-->
#Word size: 32-bit                                #Word size of OS: 64-bit
 
#Version: 0.14.3700 (Git)                        #Word size of FreeCAD: 32-bit
 
#Branch: releases/FreeCAD-0-14                    #Version: 0.16.5231 (Git)
 
#Hash: 32f5aae0a64333ec8d5d160dbc46e690510c8fe1  #Build type: Release
 
#Python version: 2.6.2                            #Branch: master
 
#Qt version: 4.5.2                                #Hash: 945638c405766faca0e5f4c1611c00151c88a2ff
 
#Coin version: 3.1.0                              #Python version: 2.7.8
 
#SoQt version: 1.4.1                              #Qt version: 4.8.6
 
#OCC version: 6.5.1                              #Coin version: 4.0.0a
 
#                                                #OCC version: 6.8.0.oce-0.17
 
#
 
 
 
# ver 0.3 31/07/2014 PyQt4 + PySide
 
# ver 0.4 25/07/2015 ajout rotation
 
# ver 0.5 26/07/2015 correction rotation plusieurs objets Copy
 
# ver 0.6 26/01/2016 correction placement avec plusieurs objets Copy
 
# ver 0.7 30/01/2016 reecriture du code avec Placement et ajout Increment et de boutons
 
# ver 0.8 31/01/2016 clique 2 fois pour mettre les valeurs a zero (en cas de modifications reinitialisait )
 
# ver 0.8 14/06/2016 ajout du bouton nombre de copies et optimisation des labels
 
 
 
__title__ = "CloneConvert"
 
__author__ = "mario52"
 
__url__    = "http://www.freecadweb.org/index-fr.html"
 
__version__ = "00.09"
 
__date__    = "14/06/2016"
 
 
 
__Comment__ = "This macro creates Clone or Copy or Compound of object(s)"
 
__Web__ = "http://www.freecadweb.org/"
 
__Wiki__ = "http://www.freecadweb.org/wiki/index.php?title=Macro_CloneConvert"
 
__Icon__  = "/usr/lib/freecad/Mod/plugins/icons/Macro_CloneConvert.png"
 
__IconW__  = "C:/Users/User Name/AppData/Roaming/FreeCAD/Macro_CloneConvert.png"
 
__Help__ = "start the macro and follow the instructions"
 
__Status__ = "stable"
 
__Requires__ = "Alls Freecad"
 
__Communication__ = "http://www.freecadweb.org/wiki/index.php?title=User:Mario52"
 
 
 
 
 
try:
 
    import PyQt4                    # PyQt4
 
    from PyQt4 import QtCore, QtGui  # PyQt4
 
#    print "PyQt4"
 
 
 
except Exception:
 
    import PySide                    # PySide
 
    from PySide import QtCore, QtGui # PySide
 
#    print "PySide"
 
 
 
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui
 
from math import sqrt, pi, sin, cos, asin
 
from FreeCAD import Base
 
from decimal import *
 
from Draft import *
 
from FreeCAD import Vector, Rotation, Placement, Console
 
 
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)
 
 
 
 
global surface    ; surface    = 0.0
 
global volume_    ; volume_    = 0.0
 
global boundBox_  ; boundBox_  = 0.0
 
global boundBoxLX  ; boundBoxLX  = 0.0
 
global boundBoxLY  ; boundBoxLY  = 0.0
 
global boundBoxLZ  ; boundBoxLZ  = 0.0
 
global boundBox_S  ; boundBox_S  = ""
 
global uniteM_X    ; uniteM_X    = 1.0
 
global uniteM_Y    ; uniteM_Y    = 1.0
 
global uniteM_Z    ; uniteM_Z    = 1.0
 
global uniteM      ; uniteM      = 1.0
 
global uniteMs    ; uniteMs    = "mm"  # default mm
 
global placement_X ; placement_X = 0.0
 
global placement_Y ; placement_Y = 0.0
 
global placement_Z ; placement_Z = 0.0
 
global Yaw_Z      ; Yaw_Z      = 0.0
 
global Pitch_Y    ; Pitch_Y    = 0.0
 
global Roll_X      ; Roll_X      = 0.0
 
global copyNumber  ; copyNumber  = 1
 
 
 
global switchP    ; switchP    = 0
 
global switchA    ; switchA    = 0
 
global switchS    ; switchS    = 0
 
 
 
global sel        ; sel        = ""
 
global cloneCopy  ; cloneCopy  = 1
 
 
global a ; a = ""
 
class Ui_MainWindow(object):
 
 
    def __init__(self, MainWindow):
 
#        path = FreeCAD.ConfigGet("AppHomePath")
 
 
        global uniteMs
 
 
        self.window = MainWindow
 
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
 
        MainWindow.resize(230, 549)
 
        MainWindow.setMinimumSize(QtCore.QSize(230, 549))
 
        MainWindow.setMaximumSize(QtCore.QSize(230, 549))
 
        self.centralWidget = QtGui.QWidget(MainWindow)
 
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
 
        self.label = QtGui.QLabel(self.centralWidget)
 
        self.label.setGeometry(QtCore.QRect(10, 10, 191, 16))
 
        self.label.setAlignment(QtCore.Qt.AlignCenter)
 
        self.label.setObjectName(_fromUtf8("label"))
 
 
        self.groupBox = QtGui.QGroupBox(self.centralWidget)
 
        self.groupBox.setGeometry(QtCore.QRect(10, 30, 211, 141))
 
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
 
 
        self.doubleSpinBox = QtGui.QDoubleSpinBox(self.groupBox)
 
        self.doubleSpinBox.setGeometry(QtCore.QRect(100, 50, 101, 22))
 
        self.doubleSpinBox.setDecimals(7)
 
        self.doubleSpinBox.setMinimum(-10000000.0)
 
        self.doubleSpinBox.setMaximum(10000000.0)
 
        self.doubleSpinBox.setSingleStep(1.0)
 
        self.doubleSpinBox.setProperty("value", 0.0)
 
        self.doubleSpinBox.setObjectName(_fromUtf8("doubleSpinBox"))
 
        self.doubleSpinBox.valueChanged.connect(self.on_doubleSpinBox_valueChanged) #connection doubleSpinBox
 
 
        self.label_2 = QtGui.QLabel(self.groupBox)
 
        self.label_2.setGeometry(QtCore.QRect(10, 50, 91, 16))
 
        self.label_2.setObjectName(_fromUtf8("label_2"))
 
 
        self.label_3 = QtGui.QLabel(self.groupBox)
 
        self.label_3.setGeometry(QtCore.QRect(10, 80, 91, 16))
 
        self.label_3.setObjectName(_fromUtf8("label_3"))
 
 
        self.label_4 = QtGui.QLabel(self.groupBox)
 
        self.label_4.setGeometry(QtCore.QRect(10, 110, 91, 16))
 
        self.label_4.setObjectName(_fromUtf8("label_4"))
 
 
        self.doubleSpinBox_2 = QtGui.QDoubleSpinBox(self.groupBox)
 
        self.doubleSpinBox_2.setGeometry(QtCore.QRect(100, 80, 101, 22))
 
        self.doubleSpinBox_2.setDecimals(7)
 
        self.doubleSpinBox_2.setMinimum(-10000000.0)
 
        self.doubleSpinBox_2.setMaximum(10000000.0)
 
        self.doubleSpinBox_2.setSingleStep(1.0)
 
        self.doubleSpinBox_2.setProperty("value", 0.0)
 
        self.doubleSpinBox_2.setObjectName(_fromUtf8("doubleSpinBox_2"))
 
        self.doubleSpinBox_2.valueChanged.connect(self.on_doubleSpinBox_2_valueChanged) #connection doubleSpinBox_2
 
 
        self.doubleSpinBox_3 = QtGui.QDoubleSpinBox(self.groupBox)
 
        self.doubleSpinBox_3.setGeometry(QtCore.QRect(100, 110, 101, 22))
 
        self.doubleSpinBox_3.setDecimals(7)
 
        self.doubleSpinBox_3.setMinimum(-10000000.0)
 
        self.doubleSpinBox_3.setMaximum(10000000.0)
 
        self.doubleSpinBox_3.setSingleStep(1.0)
 
        self.doubleSpinBox_3.setProperty("value", 0.0)
 
        self.doubleSpinBox_3.setObjectName(_fromUtf8("doubleSpinBox_3"))
 
        self.doubleSpinBox_3.valueChanged.connect(self.on_doubleSpinBox_3_valueChanged) #connection doubleSpinBox_3
 
 
        self.radioButton = QtGui.QRadioButton(self.groupBox)
 
        self.radioButton.setGeometry(QtCore.QRect(10, 20, 51, 20))
 
        self.radioButton.setChecked(True)
 
        self.radioButton.setObjectName(_fromUtf8("radioButton"))
 
        self.radioButton.setToolTip(_translate("MainWindow", "Create a clone of the object(s)", None))
 
        self.radioButton.clicked.connect(self.on_radioButton_clicked)    #connection radioButton mode clone
 
 
        self.radioButton_2 = QtGui.QRadioButton(self.groupBox)
 
        self.radioButton_2.setGeometry(QtCore.QRect(58, 20, 51, 20))
 
        self.radioButton_2.setObjectName(_fromUtf8("radioButton_2"))
 
        self.radioButton_2.setToolTip(_translate("MainWindow", "Create a copy of the object(s)", None))
 
        self.radioButton_2.clicked.connect(self.on_radioButton_2_clicked) #connection radioButton_2 mode copy
 
 
        self.radioButton_3 = QtGui.QRadioButton(self.groupBox)
 
        self.radioButton_3.setGeometry(QtCore.QRect(105, 20, 51, 20))
 
        self.radioButton_3.setObjectName(_fromUtf8("radioButton_3"))
 
        self.radioButton_3.setToolTip(_translate("MainWindow", "Create a compount of the object(s)", None))
 
        self.radioButton_3.clicked.connect(self.on_radioButton_3_clicked) #connection radioButton_3 mode compount
 
 
        self.checkBox = QtGui.QCheckBox(self.groupBox)
 
        self.checkBox.setGeometry(QtCore.QRect(155, 20, 61, 20))
 
        self.checkBox.setChecked(True)
 
        self.checkBox.setToolTip(_translate("MainWindow", "Apply incremental changes to object Placement (Defaut)\n"+
 
                                                          "If this is not checked the Placement begin in coordinates 0,0,0 of FreeCAD\n"+
 
                                                          "In case a compound Placement information is [0,0,0] the Placement begin in the position of object\n"+
 
                                                          "If the real location is away from the base coordinates 0,0,0 use the ValueAt() button\n"
 
                                                          "for the real Placement of the subObject selected Face, Wire, Line ....", None))
 
        self.checkBox.setObjectName(_fromUtf8("checkBox"))
 
 
 
        self.pushButton_5 = QtGui.QPushButton(self.groupBox)
 
        self.pushButton_5.setGeometry(QtCore.QRect(75, 50, 21, 22))
 
        self.pushButton_5.setObjectName(_fromUtf8("pushButton_5"))
 
        self.pushButton_5.clicked.connect(self.on_pushButton_5_clicked)                    # connect on def "on_pushButton_5_clicked"
 
 
 
        self.groupBox_2 = QtGui.QGroupBox(self.centralWidget)
 
        self.groupBox_2.setGeometry(QtCore.QRect(10,300,101,51))
 
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
 
 
        self.comboBox = QtGui.QComboBox(self.groupBox_2)
 
        self.comboBox.setGeometry(QtCore.QRect(10, 20, 81, 22))
 
        self.comboBox.setMinimumContentsLength(0)
 
        self.comboBox.setObjectName(_fromUtf8("comboBox"))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.addItem(_fromUtf8(""))
 
        self.comboBox.setToolTip(_translate("MainWindow",u"Select unit. . .", None))
 
        QtCore.QObject.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.SIGNAL_comboBox_Changed)
 
 
        self.groupBox_3 = QtGui.QGroupBox(self.centralWidget)
 
        self.groupBox_3.setGeometry(QtCore.QRect(10, 360, 211, 111))
 
        self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
 
 
        self.doubleSpinBox_4 = QtGui.QDoubleSpinBox(self.groupBox_3)
 
        self.doubleSpinBox_4.setGeometry(QtCore.QRect(100, 20, 101, 22))
 
        self.doubleSpinBox_4.setDecimals(7)
 
        self.doubleSpinBox_4.setMinimum(-1000000)
 
        self.doubleSpinBox_4.setMaximum(1000000.0)
 
        self.doubleSpinBox_4.setSingleStep(1.0)
 
        self.doubleSpinBox_4.setProperty("value", 1.0)
 
        self.doubleSpinBox_4.setObjectName(_fromUtf8("doubleSpinBox_4"))
 
        self.doubleSpinBox_4.setToolTip(_translate("MainWindow", "Scale free X multiplied by ...\nIf the value is negative the object result is reverted in X axis", None))
 
        self.doubleSpinBox_4.valueChanged.connect(self.on_doubleSpinBox_4_valueChanged) #connection doubleSpinBox_4
 
 
        self.doubleSpinBox_5 = QtGui.QDoubleSpinBox(self.groupBox_3)
 
        self.doubleSpinBox_5.setGeometry(QtCore.QRect(100, 50, 101, 22))
 
        self.doubleSpinBox_5.setDecimals(7)
 
        self.doubleSpinBox_5.setMinimum(-1000000)
 
        self.doubleSpinBox_5.setMaximum(1000000.0)
 
        self.doubleSpinBox_5.setSingleStep(1.0)
 
        self.doubleSpinBox_5.setProperty("value", 1.0)
 
        self.doubleSpinBox_5.setObjectName(_fromUtf8("doubleSpinBox_5"))
 
        self.doubleSpinBox_5.setToolTip(_translate("MainWindow", "Scale free Y multiplied by ...\n"+
 
                                                                "If the value is negative the object result is reverted in Y axis", None))
 
        self.doubleSpinBox_5.valueChanged.connect(self.on_doubleSpinBox_5_valueChanged) #connection doubleSpinBox_5
 
 
        self.doubleSpinBox_6 = QtGui.QDoubleSpinBox(self.groupBox_3)
 
        self.doubleSpinBox_6.setGeometry(QtCore.QRect(100, 80, 101, 22))
 
        self.doubleSpinBox_6.setDecimals(7)
 
        self.doubleSpinBox_6.setMinimum(-1000000)
 
        self.doubleSpinBox_6.setMaximum(1000000.0)
 
        self.doubleSpinBox_6.setSingleStep(1.0)
 
        self.doubleSpinBox_6.setProperty("value", 1.0)
 
        self.doubleSpinBox_6.setObjectName(_fromUtf8("doubleSpinBox_6"))
 
        self.doubleSpinBox_6.setToolTip(_translate("MainWindow", "Scale free Z multiplied by ...\n"+
 
                                                                "If the value is negative the object result is reverted in Z axis", None))
 
        self.doubleSpinBox_6.valueChanged.connect(self.on_doubleSpinBox_6_valueChanged) #connection doubleSpinBox_6
 
 
        self.label_5 = QtGui.QLabel(self.groupBox_3)
 
        self.label_5.setGeometry(QtCore.QRect(10, 20, 53, 16))
 
        self.label_5.setObjectName(_fromUtf8("label_5"))
 
 
        self.label_6 = QtGui.QLabel(self.groupBox_3)
 
        self.label_6.setGeometry(QtCore.QRect(10, 50, 53, 16))
 
        self.label_6.setObjectName(_fromUtf8("label_6"))
 
 
        self.label_7 = QtGui.QLabel(self.groupBox_3)
 
        self.label_7.setGeometry(QtCore.QRect(10, 80, 53, 16))
 
        self.label_7.setObjectName(_fromUtf8("label_7"))
 
 
        self.pushButton_6 = QtGui.QPushButton(self.centralWidget)
 
        self.pushButton_6.setGeometry(QtCore.QRect(10, 479, 65, 25))
 
        self.pushButton_6.setObjectName(_fromUtf8("pushButton_6"))
 
        self.pushButton_6.clicked.connect(self.on_pushButton_6_clicked) # connect on def "on_pushButton_6_clicked"
 
 
 
        self.pushButton = QtGui.QPushButton(self.centralWidget)
 
        self.pushButton.setGeometry(QtCore.QRect(82, 510, 65, 28))
 
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
 
 
 
        self.pushButton_1 = QtGui.QPushButton(self.centralWidget)
 
        self.pushButton_1.setGeometry(QtCore.QRect(10, 510, 65, 28))
 
        self.pushButton_1.setObjectName(_fromUtf8("pushButton_1"))
 
        self.pushButton_1.setStyleSheet("background-color: Base")
 
        self.pushButton_1.clicked.connect(self.on_pushButton01_clicked) #connection pushButton01 "OK"
 
 
        self.pushButton_2 = QtGui.QPushButton(self.centralWidget)
 
        self.pushButton_2.setGeometry(QtCore.QRect(155, 510, 65, 28))
 
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
 
        self.pushButton_2.clicked.connect(self.on_pushButton02_clicked) #connection pushButton02 "Quitter"
 
 
        self.pushButton_3 = QtGui.QPushButton(self.groupBox_3)
 
        self.pushButton_3.setGeometry(QtCore.QRect(75, 20, 21, 21))
 
        self.pushButton_3.setToolTip(_fromUtf8("Align the Scale YZ to X"))
 
        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
 
        self.pushButton_3.clicked.connect(self.on_pushButton03_clicked) #connection pushButton03 "..." align YZ to X
 
 
        self.groupBox_4 = QtGui.QGroupBox(self.centralWidget)
 
        self.groupBox_4.setGeometry(QtCore.QRect(10, 180, 211, 111))
 
        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
 
 
 
        self.doubleSpinBox_7 = QtGui.QDoubleSpinBox(self.groupBox_4)
 
        self.doubleSpinBox_7.setGeometry(QtCore.QRect(100, 20, 101, 22))
 
        self.doubleSpinBox_7.setDecimals(7)
 
        self.doubleSpinBox_7.setMinimum(-360.0)
 
        self.doubleSpinBox_7.setMaximum(360.0)
 
        self.doubleSpinBox_7.setObjectName(_fromUtf8("doubleSpinBox_7"))
 
        self.doubleSpinBox_7.setToolTip(_translate("MainWindow", "Rotation of Yaw ( Axis Z )", None))
 
        self.doubleSpinBox_7.valueChanged.connect(self.on_doubleSpinBox_7_valueChanged) #connection doubleSpinBox_7
 
 
 
        self.doubleSpinBox_8 = QtGui.QDoubleSpinBox(self.groupBox_4)
 
        self.doubleSpinBox_8.setGeometry(QtCore.QRect(100, 50, 101, 22))
 
        self.doubleSpinBox_8.setDecimals(7)
 
        self.doubleSpinBox_8.setMinimum(-360.0)
 
        self.doubleSpinBox_8.setMaximum(360.0)
 
        self.doubleSpinBox_8.setObjectName(_fromUtf8("doubleSpinBox_8"))
 
        self.doubleSpinBox_8.setToolTip(_translate("MainWindow", "Rotation of Pitch ( Axis Y )", None))
 
        self.doubleSpinBox_8.valueChanged.connect(self.on_doubleSpinBox_8_valueChanged) #connection doubleSpinBox_8
 
  
        self.doubleSpinBox_9 = QtGui.QDoubleSpinBox(self.groupBox_4)
+
<!--T:39-->
        self.doubleSpinBox_9.setGeometry(QtCore.QRect(100, 80, 101, 22))
+
15/09/2019 ver 0.13 replace the grec sign micro to "um", replace all "_translate("MainWindow", "mm", None)" to "mm" and comment line "text.encode('utf-8')" cause not work with FC 0.19 18.213
        self.doubleSpinBox_9.setDecimals(7)
 
        self.doubleSpinBox_9.setMinimum(-360.0)
 
        self.doubleSpinBox_9.setMaximum(360.0)
 
        self.doubleSpinBox_9.setObjectName(_fromUtf8("doubleSpinBox_9"))
 
        self.doubleSpinBox_9.setToolTip(_translate("MainWindow", "Rotation of Roll ( Axis X )", None))
 
        self.doubleSpinBox_9.valueChanged.connect(self.on_doubleSpinBox_9_valueChanged) #connection doubleSpinBox_9
 
  
        self.groupBox_5 = QtGui.QGroupBox(self.centralWidget)
+
<!--T:38-->
        self.groupBox_5.setGeometry(QtCore.QRect(120,300,101,51))
+
01/06/2019 ver 0.12 = adapted for 0.19 et correction "Copy:legacy=True" and ShapeColor .....
        self.groupBox_5.setObjectName(_fromUtf8("groupBox_5"))
 
 
        self.SpinBox = QtGui.QSpinBox(self.groupBox_5)
 
        self.SpinBox.setGeometry(QtCore.QRect(10, 20, 81, 22))
 
        self.SpinBox.setMaximum(1000000)
 
        self.SpinBox.setProperty("value", 1)
 
        self.SpinBox.setObjectName(_fromUtf8("SpinBox"))
 
        self.SpinBox.setToolTip(_translate("MainWindow", "Number copy of original", None))
 
        self.SpinBox.valueChanged.connect(self.on_SpinBox_valueChanged) #connection SpinBox
 
 
        self.label_8 = QtGui.QLabel(self.groupBox_4)
 
        self.label_8.setGeometry(QtCore.QRect(10, 20, 81, 16))
 
        self.label_8.setObjectName(_fromUtf8("label_8"))
 
  
        self.label_9 = QtGui.QLabel(self.groupBox_4)
+
<!--T:37-->
        self.label_9.setGeometry(QtCore.QRect(10, 50, 81, 16))
+
30/03/2018 ver 0.11 = odd checkBox, if multi selection the clone are object unique or object separate
        self.label_9.setObjectName(_fromUtf8("label_9"))
 
  
        self.label_10 = QtGui.QLabel(self.groupBox_4)
+
<!--T:35-->
        self.label_10.setGeometry(QtCore.QRect(10, 80, 81, 16))
+
07/06/2017 ver 0.10 = replace Draft...Copy to Part..Shape cause section Copy : not draw copy scaled of object but copy not scaled ??
        self.label_10.setObjectName(_fromUtf8("label_10"))
 
  
        self.pushButton_4 = QtGui.QPushButton(self.groupBox_4)
+
<!--T:36-->
        self.pushButton_4.setGeometry(QtCore.QRect(75, 20, 21, 22))
+
14/06/2016 ver 0.9  = adding the choice of number of copies and labels optimization
        self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))
 
        self.pushButton_4.clicked.connect(self.on_pushButton_4_clicked) # connect on def "on_pushButton_4_clicked"
 
 
 
        self.pushButton.clicked.connect(self.on_pushButton00_clicked)  #connection pushButton00 "Reset"
 
 
        self.lineEdit = QtGui.QLineEdit(self.centralWidget)
 
        self.lineEdit.setGeometry(QtCore.QRect(83, 481, 136, 20))
 
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
 
        self.lineEdit.setText(QtGui.QApplication.translate("Form", " ", None, QtGui.QApplication.UnicodeUTF8))
 
 
 
        MainWindow.setCentralWidget(self.centralWidget)
 
        self.retranslateUi(MainWindow)
 
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
 
    def retranslateUi(self, MainWindow):
 
        MainWindow.setWindowTitle(_translate("MainWindow", "CloneConvert", None))
 
        try:
 
            MainWindow.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint)  # cette fonction met la fenetre en avant
 
        except Exception:
 
            MainWindow.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint)  # cette fonction met la fenetre en avant
 
        self.label.setText(_translate("MainWindow", "Object converter", None))
 
        self.groupBox.setTitle(_translate("MainWindow", "Mode", None))
 
 
 
        self.radioButton.setText(_translate("MainWindow", "Clone", None))
 
        self.radioButton_2.setText(_translate("MainWindow", "Copy", None))
 
        self.radioButton_3.setText(_translate("MainWindow", "Comp.", None))
 
 
 
        self.checkBox.setText(_translate("MainWindow", "Increm.", None))
 
 
 
        self.pushButton_4.setToolTip(_translate("MainWindow", "Align the YX degrees values to Z value \n Two click reset the rotations values to 0.0", None))
 
        self.pushButton_4.setText(_translate("MainWindow", "...", None))
 
        self.pushButton_5.setToolTip(_translate("MainWindow", "Align the YZ coordinates values to X value  \n Two click reset the coordinates values to 0.0", None))
 
        self.pushButton_5.setText(_translate("MainWindow", "...", None))
 
        self.pushButton_3.setToolTip(_translate("MainWindow", "Align the YZ scale values to X scale value  \n Two click reset the scales values to 1.0", None))
 
        self.pushButton_3.setText(_translate("MainWindow", "...", None))
 
 
 
        self.doubleSpinBox.setToolTip(_translate("MainWindow", "Place the new object to the X coordinate ", None))
 
        self.doubleSpinBox.setSuffix(_translate("MainWindow", " mm", None))
 
        self.doubleSpinBox_2.setToolTip(_translate("MainWindow", "Place the new object to the Y coordinate", None))
 
        self.doubleSpinBox_2.setSuffix(_translate("MainWindow", " mm", None))
 
        self.doubleSpinBox_3.setToolTip(_translate("MainWindow", "Place the new object to the Z coordinate", None))
 
        self.doubleSpinBox_3.setSuffix(_translate("MainWindow", " mm", None))
 
 
 
        self.label_2.setText(_translate("MainWindow", "Coordinate X", None))
 
        self.label_3.setText(_translate("MainWindow", "Coordinate Y", None))
 
        self.label_4.setText(_translate("MainWindow", "Coordinate Z", None))
 
 
 
        self.groupBox_2.setTitle(_translate("MainWindow", "Scale predefined", None))
 
        self.comboBox.setToolTip(_translate("MainWindow", "Convert your object to . . .", None))
 
        self.comboBox.setCurrentIndex(6)
 
        self.comboBox.setItemText(0, _translate("MainWindow", "km", None))        #km #        = 1000000
 
        self.comboBox.setItemText(1, _translate("MainWindow", "hm", None))        #hm #        = 100000
 
        self.comboBox.setItemText(2, _translate("MainWindow", "dam", None))        #dam#        = 10000
 
        self.comboBox.setItemText(3, _translate("MainWindow", "m", None))          #m  #        = 1000
 
        self.comboBox.setItemText(4, _translate("MainWindow", "dm", None))        #dm #        = 100
 
        self.comboBox.setItemText(5, _translate("MainWindow", "cm", None))        #cm #        = 10
 
        self.comboBox.setItemText(6, _translate("MainWindow", "mm", None))        #mm #        = 1        #####
 
        self.comboBox.setItemText(7, _translate("MainWindow", "µm", None))        #µm # micro  = 0.001
 
        self.comboBox.setItemText(8, _translate("MainWindow", "nm", None))        #nm # nano  = 0.000001
 
        self.comboBox.setItemText(9, _translate("MainWindow", "inch", None))      #in # inch  pouce    = 25.400
 
        self.comboBox.setItemText(10, _translate("MainWindow", "link", None))      #lk # link  chainon  = 201.168
 
        self.comboBox.setItemText(11, _translate("MainWindow", "foot", None))      #ft # foot  pied    = 304.800
 
        self.comboBox.setItemText(12, _translate("MainWindow", "yard", None))      #yd # yard  verge    = 914.400
 
        self.comboBox.setItemText(13, _translate("MainWindow", "perch", None))    #rd # rod ou perch  perche  = 5029.200
 
        self.comboBox.setItemText(14, _translate("MainWindow", "chain", None))    #ch # chain chaine  = 20116.800
 
        self.comboBox.setItemText(15, _translate("MainWindow", "furlong", None))  #fur# furlong        = 201168
 
        self.comboBox.setItemText(16, _translate("MainWindow", "mile", None))      #mi # mile          = 1609344
 
        self.comboBox.setItemText(17, _translate("MainWindow", "league", None))    #lea# league lieue  = 4828032
 
        self.comboBox.setItemText(18, _translate("MainWindow", "nautique", None))  #nmi# mile nautique  = 1852000
 
 
 
        self.groupBox_3.setTitle(_translate("MainWindow", "Scale free", None))
 
        self.label_5.setText(_translate("MainWindow", "Scale X", None))
 
        self.label_6.setText(_translate("MainWindow", "Scale Y", None))
 
        self.label_7.setText(_translate("MainWindow", "Scale Z", None))
 
 
 
        self.pushButton.setToolTip(_translate("MainWindow", "Reset the values", None))
 
        self.pushButton.setText(_translate("MainWindow", "Reset", None))
 
        self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert Copy or Compount", None))
 
        self.pushButton_1.setText(_translate("MainWindow", "Ok", None))
 
        self.pushButton_2.setToolTip(_translate("MainWindow", "Quit the macro", None))
 
        self.pushButton_2.setText(_translate("MainWindow", "Quit", None))
 
 
 
        self.pushButton_6.setToolTip(_translate("MainWindow", "Give the valueAt() the subObject selected Face, Wire, Line ...\n"+
 
                                                "This option is useful in case a compound Placement information [0,0,0]\n"+
 
                                                "and its real location is away from the base coordinates 0,0,0\n"+
 
                                                "(gives no provide information about the tilt of the object)", None))
 
        self.pushButton_6.setText(_translate("MainWindow", "ValueAt()", None))
 
 
 
        self.groupBox_4.setTitle(_translate("MainWindow", "Rotation", None))
 
        self.groupBox_5.setTitle(_translate("MainWindow", "Number copy", None))
 
        self.label_8.setText(_translate("MainWindow", "Yaw ( Z )", None))
 
        self.label_9.setText(_translate("MainWindow", "Pitch ( Y )", None))
 
        self.label_10.setText(_translate("MainWindow", "Roll ( X )", None))
 
        self.doubleSpinBox_7.setSuffix(_translate("MainWindow", " Deg", None))
 
        self.doubleSpinBox_8.setSuffix(_translate("MainWindow", " Deg", None))
 
        self.doubleSpinBox_9.setSuffix(_translate("MainWindow", " Deg", None))
 
 
 
    def SIGNAL_comboBox_Changed(self,text):
 
        global uniteM_X
 
        global uniteM_Y
 
        global uniteM_Z
 
        global uniteM
 
        global uniteMs
 
 
        try:
 
            text = unicode(text, 'ISO-8859-1').encode('UTF-8')  # PyQt4
 
        except Exception:
 
            text = text.encode('utf-8')                        # PySide
 
 
        if text == "km":        #        = 1000000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1000000.0
 
            uniteMs= "km"
 
        elif text == "hm":      #        = 100000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 100000.0
 
            uniteMs= "hm"
 
        elif text == "dam":    #        = 10000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 10000.0
 
            uniteMs= "dam"
 
        elif text == "m":      #        = 1000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1000.0
 
            uniteMs= "m"
 
        elif text == "dm":      #        = 100
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 100.0
 
            uniteMs= "dm"
 
        elif text == "cm":      #        = 10
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 10.0
 
            uniteMs= "cm"
 
        elif text == "mm":      #        = 1  ###############################
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0
 
            uniteMs= "mm"
 
        elif text == "µm":      #        = 1000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0/1000.0
 
            uniteMs= u"µm"
 
        elif text == "nm":      #        = 1000000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0/1000000.0
 
            uniteMs= u"nm"
 
        elif text == "inch":    # inch  = 25.400
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 25.400
 
            uniteMs= "in"
 
        elif text == "link":    # link  = 201.168
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 201.168
 
            uniteMs= "lk"
 
        elif text == "foot":    # foot  = 304.800
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 304.800
 
            uniteMs= "ft"
 
        elif text == "yard":    # yard  = 914.400
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 914.400
 
            uniteMs= "yd"
 
        elif text == "perch":  #rd # rod  perche    = 5029.200
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 5029.200
 
            uniteMs= "rd"
 
        elif text == "chain":  # chain  = 20116.800
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 20116.800
 
            uniteMs= "ch"
 
        elif text == "furlong": # furlong= 201168
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 201168
 
            uniteMs= "fur"
 
        elif text == "mile":    # mile  = 1609344
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1609344
 
            uniteMs= "mi"
 
        elif text == "league":  # league = 4828032
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 4828032
 
            uniteMs= "lea"
 
        elif text == "nautique": # nautique = 1852000
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1852000
 
            uniteMs= "nmi"
 
        else:                    # mm = 1
 
            uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0
 
            uniteMs= "mm"
 
 
        self.doubleSpinBox_4.setProperty("value", uniteM_X)
 
        self.doubleSpinBox_5.setProperty("value", uniteM_Y)
 
        self.doubleSpinBox_6.setProperty("value", uniteM_Z)
 
 
    def on_radioButton_clicked(self):                    # if checked then mode clone
 
        global cloneCopy
 
        cloneCopy = 1
 
 
 
    def on_radioButton_2_clicked(self):                  # if checked then mode copy
 
        global cloneCopy
 
        cloneCopy = 0
 
 
 
    def on_radioButton_3_clicked(self):                  # if checked then mode compount
 
        global cloneCopy
 
        cloneCopy = 2
 
 
    def on_doubleSpinBox_valueChanged(self,value):      # doubleSpinbox X
 
        global placement_X
 
        global switchP
 
        switchP    = 0
 
        placement_X = value
 
    def on_doubleSpinBox_2_valueChanged(self,value):    # doubleSpinbox Y
 
        global placement_Y
 
        global switchP
 
        switchP    = 0
 
        placement_Y = value
 
 
    def on_doubleSpinBox_3_valueChanged(self,value):    #  doubleSpinbox Z
 
        global placement_Z
 
        global switchP
 
        switchP    = 0
 
        placement_Z = value
 
 
    def on_doubleSpinBox_4_valueChanged(self,value):    # doubleSpinbox free X
 
        global uniteM_X
 
        global switchS
 
        switchS  = 0
 
        uniteM_X = value
 
        if uniteM_X == 0:
 
            uniteM_X = 1
 
 
    def on_doubleSpinBox_5_valueChanged(self,value):    # doubleSpinbox free Y
 
        global uniteM_Y
 
        global switchS
 
        switchS  = 0
 
        uniteM_Y = value
 
        if uniteM_Y == 0:
 
            uniteM_Y = 1
 
 
    def on_doubleSpinBox_6_valueChanged(self,value):    #  doubleSpinbox free Z
 
        global uniteM_Z
 
        global switchS
 
        switchS  = 0
 
        uniteM_Z = value
 
        if uniteM_Z == 0:
 
            uniteM_Z = 1
 
 
    def on_doubleSpinBox_7_valueChanged(self,value):    # doubleSpinBox_7  Yaw ( Z )
 
        global Yaw_Z
 
        global switchA
 
        switchA  = 0
 
        Yaw_Z = value
 
 
 
    def on_doubleSpinBox_8_valueChanged(self,value):    # doubleSpinBox_8 Pitch ( Y )
 
        global Pitch_Y
 
        global switchA
 
        switchA  = 0
 
        Pitch_Y = value
 
 
 
    def on_doubleSpinBox_9_valueChanged(self,value):    # doubleSpinBox_9 Roll ( X )
 
        global Roll_X
 
        global switchA
 
        switchA  = 0
 
        Roll_X = value
 
 
 
    def on_SpinBox_valueChanged(self,value):            # SpinBox Number copy
 
        global copyNumber
 
        copyNumber = value
 
 
 
    def on_pushButton_5_clicked(self):                  # Bouton ... (align) placement
 
        global placement_X
 
        global placement_Y
 
        global placement_Z
 
        global switchP
 
 
 
        if switchP == 0:
 
            placement_Y = placement_Z = placement_X
 
            switchP = 1
 
        else:
 
            placement_Y = placement_Z = placement_X = 0.0
 
            switchP = 0
 
 
 
        self.doubleSpinBox.setProperty("value", placement_X)
 
        self.doubleSpinBox_2.setProperty("value", placement_Y)
 
        self.doubleSpinBox_3.setProperty("value", placement_Z)
 
 
 
    def on_pushButton_6_clicked(self):                    # valueAt() placement detected
 
        try:
 
            sel = FreeCADGui.Selection.getSelection()
 
            App.Console.PrintMessage(str(sel[0].Placement) +"\r\n")
 
            selectionObjects = FreeCADGui.Selection.getSelectionEx()  # Select an object or sub object getSelectionEx
 
            edge = selectionObjects[0].SubObjects[0]
 
            try:
 
                self.lineEdit.setText(str(edge.valueAt(0,0))) # face
 
                self.pushButton_6.setText(_translate("MainWindow", "ValueAt(0,0)", None))
 
                App.Console.PrintMessage(str(edge.valueAt(0,0)) +"\r\n")
 
            except Exception:
 
                self.lineEdit.setText(str(edge.valueAt(0)))  # fil
 
                self.pushButton_6.setText(_translate("MainWindow", "ValueAt(0)", None))
 
                App.Console.PrintMessage(str(edge.valueAt(0)) +"\r\n")
 
        except Exception:
 
            self.pushButton_6.setText(_translate("MainWindow", "ValueAt()", None))
 
            App.Console.PrintError("Select one subObject, Face, Wire, Line ..."+"\r\n")
 
        App.Console.PrintMessage("____________________________________"+"\r\n")
 
       
 
    def on_pushButton_4_clicked(self):                  # Bouton ... (align) rotation
 
        global Yaw_Z
 
        global Pitch_Y
 
        global Roll_X
 
        global switchA
 
 
 
        if switchA == 0:
 
            Pitch_Y = Roll_X = Yaw_Z
 
            switchA = 1
 
        else:
 
            Pitch_Y = Roll_X = Yaw_Z = 0.0
 
            switchA = 0
 
 
 
        self.doubleSpinBox_7.setProperty("value", Yaw_Z)
 
        self.doubleSpinBox_8.setProperty("value", Pitch_Y)
 
        self.doubleSpinBox_9.setProperty("value", Roll_X)
 
 
 
    def on_pushButton03_clicked(self):                  # Bouton ... (align) uniteM
 
        global uniteM_X
 
        global uniteM_Y
 
        global uniteM_Z
 
        global switchS
 
        global uniteM
 
        global uniteMs
 
 
 
        if switchS == 0:
 
            uniteM_Y = uniteM_Z = uniteM_X
 
            switchS = 1
 
        else:
 
            uniteM_Y = uniteM_Z = uniteM_X = 1.0
 
            switchS = 0
 
 
 
        self.doubleSpinBox_4.setProperty("value", uniteM_X)
 
        self.doubleSpinBox_5.setProperty("value", uniteM_Y)
 
        self.doubleSpinBox_6.setProperty("value", uniteM_Z)
 
 
    def on_pushButton00_clicked(self):                  # Bouton Reset
 
        global sel
 
        global uniteM_X
 
        global uniteM_Y
 
        global uniteM_Z
 
        global uniteM
 
        global uniteMs
 
        global placement_X
 
        global placement_Y
 
        global placement_Z
 
        global cloneCopy
 
        global Yaw_Z
 
        global Pitch_Y
 
        global Roll_X
 
        global copyNumber
 
 
        sel        = ""
 
 
        self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None))
 
        self.pushButton_1.setStyleSheet("background-color: Base")
 
 
        self.radioButton.setChecked(True)
 
        cloneCopy = 1
 
 
        self.comboBox.setCurrentIndex(6)
 
        self.doubleSpinBox.setProperty("value",  0.0) # coordinates
 
        self.doubleSpinBox_2.setProperty("value", 0.0)
 
        self.doubleSpinBox_3.setProperty("value", 0.0)
 
        self.checkBox.setChecked(True)
 
 
 
        placement_X = placement_Y = placement_Z = 0.0
 
 
        self.doubleSpinBox_4.setProperty("value", 1.0) # scale
 
        self.doubleSpinBox_5.setProperty("value", 1.0)
 
        self.doubleSpinBox_6.setProperty("value", 1.0)
 
 
        self.doubleSpinBox_7.setProperty("value", 0.0) # angles
 
        self.doubleSpinBox_8.setProperty("value", 0.0)
 
        self.doubleSpinBox_9.setProperty("value", 0.0)
 
 
 
        self.SpinBox.setProperty("value", 1)          # number copy
 
        copyNumber  = 1
 
 
 
        uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0
 
        uniteMs= "mm"
 
        uniteM = 1
 
        self.lineEdit.setText("")
 
 
    def on_pushButton01_clicked(self):                  # Bouton OK
 
        global sel
 
        global surface
 
        global volume_
 
        global boundBox
 
        global boundBoxLX
 
        global boundBoxLY
 
        global boundBoxLZ
 
        global boundBox_S
 
        global uniteM_X
 
        global uniteM_Y
 
        global uniteM_Z
 
        global uniteM
 
        global uniteMs
 
        global placement_X
 
        global placement_Y
 
        global placement_Z
 
        global sel
 
        global Yaw_Z
 
        global Pitch_Y
 
        global Roll_X
 
        global copyNumber
 
        #### Chrono begin ######################################################################### chrono begin
 
        import time                                                                            #### chrono begin
 
        depart = time.clock()                                                                  #### chrono begin
 
        #### Chrono begin ######################################################################### chrono begin
 
 
 
        sel = FreeCADGui.Selection.getSelection() 
 
 
        if len(sel) != 0:
 
 
            self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None))
 
            self.pushButton_1.setStyleSheet("background-color: Base")
 
 
            # boundinbox (dimensions hors tout)
 
            try:
 
                boundBox_ = sel[0].Shape.BoundBox # pour 1 seul objet, (le premier)
 
                boundBoxLX = boundBox_.XLength
 
                boundBoxLY = boundBox_.YLength
 
                boundBoxLZ = boundBox_.ZLength
 
            except:
 
                boundBox_  = 0.0
 
                boundBoxLX = 0.0
 
                boundBoxLY = 0.0
 
                boundBoxLZ = 0.0
 
                boundBox_S = ""
 
 
            # volume de tous les objets
 
            volume_ = 0.0
 
            try:
 
                for i in range(len(sel)):
 
                    volume_ += sel[i].Shape.Volume
 
            except:
 
                volume_ = 0.0
 
 
            # surface de tous les objets
 
            surface = 0.0
 
            try:
 
                for i in range(len(sel)):
 
                    surface += sel[i].Shape.Area
 
            except:
 
                surface = 0.0
 
 
            boundBox_S = "[X: "+str(boundBoxLX)+" mm] x [Y: "+str(boundBoxLY)+" mm] x [Z:"+str(boundBoxLZ)+" mm]"
 
            App.Console.PrintMessage("Original boundBox : "+boundBox_S+"\r\n")
 
            App.Console.PrintMessage("Original volume_  : "+str(volume_)+" mm3 ("+str(len(sel))+" element(s))"+"\r\n")
 
            App.Console.PrintMessage("Original surface  : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")
 
            App.Console.PrintMessage("- - - - - - - - - -"+"\r\n")
 
 
            try:
 
                obj = comptName = ""
 
 
 
                for copies in range(1,copyNumber+1): ##### Boucle copies Debut ###########################
 
                   
 
                    if copyNumber > 1:
 
                        comptName = str(copies)
 
 
 
                    if cloneCopy == 1:      # clone ok
 
                        import Draft
 
                        mess = "Clone"
 
                        obj=Draft.clone(sel)
 
                        obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z)
 
                        if self.checkBox.isChecked(): # if checkbox is checked then .... increment
 
                            obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0)).multiply(App.activeDocument().getObject(obj.Name).Placement) # increment
 
                        else:
 
                            obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0))
 
                        oL = obj.Label[:5] + " " + comptName + " " +  obj.Label[6:]
 
                        obj.Label = oL
 
                   
 
                    if cloneCopy == 0:    # copy ok
 
                        import Draft
 
                        mess = "Copy "
 
                        for i in range(len(sel)):
 
                            obj = Draft.scale(sel[i],delta=App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0),copy=True,legacy=True)
 
                            if self.checkBox.isChecked(): # if checkbox is checked then .... increment
 
                                obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0)).multiply(App.activeDocument().getObject(obj.Name).Placement) # increment
 
                            else:
 
                                obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0))
 
                        obj.Label = "Copy " + comptName + " of " + obj.Label
 
       
 
                    if cloneCopy == 2:    # compound ok
 
                        import Draft
 
                        mess = "Compount "
 
                        liste = []
 
                        ########################################################################################################################
 
    #                    objori = Draft.makeBlock(Gui.Selection.getSelection())                            # create Block other method compound
 
    #                    obj = Draft.scale([objori],delta=App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0))
 
    #                    App.activeDocument().removeObject(objori.Name)
 
                        ########################################################################################################################
 
   
 
                        #######################################################################################################################
 
                        objori = App.activeDocument().addObject("Part::Compound","Compound")                # create method compound
 
                        for i in range(len(sel)):
 
                            objori.Links += App.activeDocument().getObject(sel[i].Name),
 
                            liste.append(sel[i].Name)
 
                        obj = Draft.scale([objori],delta=App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0))
 
                        #######################################################################################################################
 
   
 
    #                    try:                                                    # optional delette the original objects
 
    #                        App.activeDocument().removeObject(objori.Name)
 
    #                        for i in liste:
 
    #                            App.activeDocument().removeObject(i)
 
    #                    except:
 
    #                        None
 
   
 
                        if self.checkBox.isChecked():                          # if checkbox is checked then .... increment
 
                            obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0)).multiply(App.activeDocument().getObject(obj.Name).Placement) # increment
 
                        else:
 
                            obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(Yaw_Z,Pitch_Y,Roll_X), App.Vector(0,0,0))
 
                        obj.Label = "Compount " + comptName + " of " + obj.Label
 
                        try:
 
                            objori.Label = "Ori " + obj.Label                    # renamme the original object
 
                        except Exception:
 
                            None
 
                    ##### Boucle copies Fin ###########################
 
 
 
                FreeCAD.ActiveDocument.recompute()
 
   
 
#                print "[ ",placement_X," ",placement_Y," ",placement_Z," ]  [ ",Yaw_Z," ",Pitch_Y," ",Roll_X," ]"
 
                # boundinbox (dimensions hors tout)
 
                try:
 
                    boundBox_ = obj.Shape.BoundBox
 
                    boundBoxLX = boundBox_.XLength
 
                    boundBoxLY = boundBox_.YLength
 
                    boundBoxLZ = boundBox_.ZLength
 
                except:
 
                    boundBox_  = 0.0
 
                    boundBoxLX = 0.0
 
                    boundBoxLY = 0.0
 
                    boundBoxLZ = 0.0
 
   
 
                # volume
 
                volume_ = 0.0
 
                try:
 
                    volume_ = obj.Shape.Volume
 
                except:
 
                    for i in range(len(obj)):
 
                        volume_ += obj[i].Shape.Volume
 
   
 
                # surface
 
                surface = 0.0
 
                try:
 
                    surface = obj.Shape.Area
 
                except:
 
                    for i in range(len(obj)):
 
                        surface += obj[i].Shape.Area
 
   
 
                App.Console.PrintMessage(obj.Label+"\r\n")
 
                App.Console.PrintMessage("Convert mm in ' "+uniteMs+" ' (1 "+uniteMs+" = "+str(uniteM)+" mm)"+"\r\n")
 
                App.Console.PrintMessage(mess + " boundBox_X  : "+str(boundBoxLX)+" mm"+"\r\n")
 
                App.Console.PrintMessage(mess + " boundBox_Y  : "+str(boundBoxLY)+" mm"+"\r\n")
 
                App.Console.PrintMessage(mess + " boundBox_Z  : "+str(boundBoxLZ)+" mm"+"\r\n")
 
                App.Console.PrintMessage(mess + " volume      : "+str(volume_)+" mm3 ("+str(len(sel))+" element(s))"+"\r\n")#
 
                App.Console.PrintMessage(mess + " surface    : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")#
 
                #### Chrono end ########################################################################### chrono end
 
                arrivee = time.clock()                                                                #### chrono end
 
                App.Console.PrintMessage("Time : "+str("%.2f" % ((arrivee - depart)/60))+" min"+"\r\n")#### chrono end
 
                #### Chrono end ########################################################################### chrono end
 
                App.Console.PrintMessage("___________________"+"\r\n")
 
                self.pushButton_1.setStyleSheet("background-color: green")
 
 
 
            except Exception:
 
                FreeCAD.Console.PrintError("Error interne"+"\r\n")
 
        else:
 
            self.pushButton_1.setStyleSheet("background-color: red")#red
 
            self.pushButton_1.setToolTip(_translate("MainWindow", "Not object selected for Convert or copy", None))
 
 
 
            FreeCAD.Console.PrintError("Select an object"+"\r\n")  #App.Console.PrintMessage
 
            sel = ""
 
 
 
    def on_pushButton02_clicked(self):                  # Bouton Quitter
 
        App.Console.PrintMessage("End CloneConvert\r\n")
 
        self.window.hide()
 
 
sel = FreeCADGui.Selection.getSelection() 
 
 
MainWindow = QtGui.QMainWindow()
 
ui = Ui_MainWindow(MainWindow)
 
 
 
MainWindow.show()
 
 
 
 
 
</syntaxhighlight>
 
<translate>
 
==Revision== <!--T:19-->
 
14/06/2016 ver 0.9  = ver 0.8 06/14/2016 adding the choice of number of copies and labels optimization
 
  
 
<!--T:27-->
 
<!--T:27-->
Line 1,065: Line 154:
 
09/05/2014 ver. 0.2 = adding function "Copy"
 
09/05/2014 ver. 0.2 = adding function "Copy"
 
</translate>
 
</translate>
<languages/>
 

Latest revision as of 16:33, 15 September 2019

Other languages:
Deutsch • ‎English • ‎français • ‎italiano

Macro CloneConvert.png Macro CloneConvert

Description
Creates a clone or Copy or Compound of the object(s) and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base).
If you have problem example:("(unicode error) 'utf-8' codec can't decode byte 0xb0...")
Download the macro code directly on the Gists Macro_CloneConvert open the old Macro_CloneConvert in FC macro editor paste the new code in place of the old code, save it, close FreeCAD, open FreeCAD and run the macro.

Macro version: 0.13
Last modified: 2019-09-15
FreeCAD version: All
Download: ToolBar Icon
Author
mario52
Download
ToolBar Icon
Links
Macro Version
0.13
Date last modified
2019-09-15
FreeCAD Version(s)
All
Default shortcut
None
See also
None


Description

Creates a clone or copy of the object and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base)

Temporary code for external macro link. Do not use this code. This code is used exclusively by Addon_Installer.


##This code is copied instead of the original macro code

##to guide the user to the offline 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 extra wiki location

import PySide

from PySide import QtGui ,QtCore

diag = QtGui.QMessageBox(QtGui.QMessageBox.Information,u"Information",
    "This macro must by downloaded with this link" + "\n"
    " " + "\n"
    "https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/786ad9caab88a206ba26aad7fd6fb7c00eec2083/Macro_CloneConvert.FCMacro" + "\n"
    " " + "\n"
    "Quit this window for access in the download page" )

diag.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint)

diag.setWindowModality(QtCore.Qt.ApplicationModal)

diag.exec_()

import webbrowser 

webbrowser.open("https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/786ad9caab88a206ba26aad7fd6fb7c00eec2083/Macro_CloneConvert.FCMacro")
<class="rawcodeurl"><a href="https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/786ad9caab88a206ba26aad7fd6fb7c00eec2083/Macro_CloneConvert.FCMacro">raw code</a>


Uses

Run the macro, the XYZ settings, choose "Clone" or "Copy" a unit or one value of choice select your object, and click Ok button.

If no value is entered a copy or clone will be created without modification. If no object is selected the Ok button will be colored in red.

The value of the BoundingBox, Volume and Surface is diplayed in the Report view, in the case of Copy multiple object, the display will show BoundingBox 0.0.


The base is the mm example with a 1 mm cube of side :

Select in the comboBox inch, 1 inch = 25.4 mm , the fields "Scale free" automatically adjusts to 25.4 (the values ​​in "Scale-free" can be changed separately). Click Ok button, the clone created will have 25,4 mm x 25,4 mm x 25,4 mm

150% = 1,50 in the "Scale free" fields
104% = 1,04 in the "Scale free" fields

Inverse operation :

If you want to reduce an object ex: a cube 25.4 mm (1 inch) in cube 1 mm sides, use the following formula, 1 / 25.4 = 0.0393700 and enter the value 0,0393700 (with comma) in the Scale field XY and Z.

In a cube of 5 mm, made​​ 5 / 25.4 = 0.1968503 and enter the value 0,1968503 (with comma) in the Scale field XY and Z.

50% = 0,50 in the "Scale free" fields
4% = 0,04 in the "Scale free" fields

Predefined units are : km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.

CloneConvert
  • Mode
  • Clone : The object(s) clone are create
  • Copy : One copy of the objet(s) is create
  • Comp : One compound of the objet(s) is create
  • Increm. : incrementing the coordinates data to the original coordinates of the object (Placement, Rotation ...)
    If this is not checked the Placement begin in coordinates 0,0,0 of FreeCAD
    In case a compound Placement information is [0,0,0] the Placement begin in the position of object
    If the real location is away from the base coordinates 0,0,0 use the ValueAt() button for the real Placement of the subObject selected Face, Wire, Line ....
  • Unique : If this checkBox is checked and multiple object selected, the clone created is one unique object
  • Coordinates
  • ... : This button align the YZ values on the value of X to have the same values ​​XYZ (or manually). Two click reset the coordinates values to 0.0
  • Coordinate X : Move the copy to the Coordinate X selected (Base 0,0,0 if Increm. is not checked)
  • Coordinate Y : Move the copy to the Coordinate Y selected (Base 0,0,0 if Increm. is not checked)
  • Coordinate Z : Move the copy to the Coordinate Z selected (Base 0,0,0 if Increm. is not checked)
  • Rotation
  • ... : This button align the Pitch and Roll values on the value of Yaw to have the same values ​​Rotation (or manually)
    Two click reset the rotations values to 0.0
  • Yaw (Z ) : Rotate the copy to the axis Z (Yaw) (Begin 0 if Increm. is not checked)
  • Pitch ( Y ) : Rotate the copy to the axis Y (Pitch) (Begin 0 if Increm. is not checked)
  • Roll ( X ) : Rotate the copy to the axis X (Roll) (Begin 0 if Increm. is not checked)
  • Scale predefined
  • Scale predefined : predefined scales in units, km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique or choose a free value in the Scale free field.
  • Number copy
  • Number copy : number of copies
  • Scale free
  • ... : This button align the Scales values on the value of Scale X to have the same values ​​XYZ (or manually)
    Two click reset the scales values to 1.0
  • Scale X : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the X axis, to reduce the shape give a decimal value (0,5)
  • Scale Y : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the Y axis, to reduce the shape give a decimal value (0,5)
  • Scale Z : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the Z axis, to reduce the shape give a decimal value (0,5)
  • ValueAt() : Give the valueAt() the subObject selected Face, Wire, Line ...
    This option is useful in case a compound Placement information [0,0,0] and its real location is away from the base coordinates 0,0,0 (gives no provide information about the rotation of the object)
  • Ok : the OK button validates and launches the command, if no object is selected the Ok button will be coloured in red
  • Reset : the Reset button puts all the values to zero
  • Quit : the Quit button exit the macro


Script

The icon Macro CloneConvert.png

Macro_CloneConvert.FCMacro

Download the macro to Gist Macro_CloneConvert.FCMacro

Revision

15/09/2019 ver 0.13 replace the grec sign micro to "um", replace all "_translate("MainWindow", "mm", None)" to "mm" and comment line "text.encode('utf-8')" cause not work with FC 0.19 18.213

01/06/2019 ver 0.12 = adapted for 0.19 et correction "Copy:legacy=True" and ShapeColor .....

30/03/2018 ver 0.11 = odd checkBox, if multi selection the clone are object unique or object separate

07/06/2017 ver 0.10 = replace Draft...Copy to Part..Shape cause section Copy : not draw copy scaled of object but copy not scaled ??

14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization

31/01/2016 ver 0.8 = modify the buttons reset section for two click for reset (in case modification the value)

30/01/2016 ver 0.7 = rewriting code with Placement and Increment and adding buttons Compound, Increment, ValueAt(),

26/01/2016 ver 0.6 = correction placement with many objets Copy

26/07/2015 ver 0.5 = correction rotate many objects Function Copy

25/07/2015 ver 0.4 = adding rotation

11/08/2014 replace "AttributeError" to "Exception"

02/07/2014 ver. 0.3 = modified to operate PyQt4 and PySide

09/05/2014 ver. 0.2 = adding function "Copy"