Last active
January 6, 2025 21:39
-
-
Save mario52a/9f2f2f6144e1307a048f1840ef99300c to your computer and use it in GitHub Desktop.
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
*************************************************************************** | |
* Copyright (c) 2014 2015 2016 2017 2018 2019 2020 2021 2022 <mario52> * | |
* 2025 * | |
* 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 * | |
*************************************************************************** | |
""" | |
# CloneConvert.FCMacro | |
# Cree un clone ou une copie de l'objet ou des objets selectionne(s) et le met e l'echelle de la grandeur choisie | |
# 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 10 (10.0) | |
#Word size of OS: 64-bit | |
#Word size of FreeCAD: 64-bit | |
#Version: 0.19.21280 (Git) | |
#Build type: Release | |
#Branch: master | |
#Hash: 6f3160db3e88733536c7eaf97ad7d6ebd21baccd | |
#Python version: 3.6.8 | |
#Qt version: 5.12.1 | |
#Coin version: 4.0.0a | |
#OCC version: 7.3.0 | |
#Locale: French/Mars (fr_MA) | |
# | |
# 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.9 14/06/2016 ajout du bouton nombre de copies et optimisation des labels | |
# ver 0.10 07/06/2017 modifie Draft... pour copie ne faisait plus de copie a l'echelle ?? remplace par Part...Shape! | |
# ver 0.11 30/03/2018 ajout d'un checkBox choix clone unique avec plusieurs objets ou clones separes | |
# ver 0.12 01/06/2019 adapte pour 0.19 et correction "Copy:legacy=True" et ShapeColor ..... | |
# ver 0.13 15/09/2019 remplace le signe grec micro par "um", remplace tous "_translate("MainWindow", "mm", None)" par "mm" et commente ligne "text.encode('utf-8')" | |
# ver 0.14 2020/05/20 GridLayout PySide2 ajoute ".ActiveDocument.ActiveObject.recompute()" ligne 909 causait une erreur dans FC 0.19 | |
# ver 0.15 2020/06/06 icon | |
# ver 0.16 2025/01/06 remplace PySide2 to PySide augmente mini et maxi efface toutes les reference a PySide, PySide2 et QtWidgets et correction clone | |
# | |
__title__ = "CloneConvert" | |
__author__ = "mario52" | |
__url__ = "http://www.freecadweb.org/index-fr.html" | |
__version__ = "00.16" | |
__date__ = "2025/01/06" #YYYY/MM/DD | |
__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__ = "https://wiki.freecadweb.org/images/0/0a/Macro_CloneConvert.png" | |
__Help__ = "start the macro and follow the instructions" | |
__Status__ = "stable" | |
__Requires__= "0.19" | |
__Communication__ = "http://www.freecadweb.org/wiki/index.php?title=User:Mario52" | |
# icon fromTheme by FreeCAD | |
helpIcon = [ | |
"24 24 4 1", | |
" c None", | |
". c #016AC5", | |
"+ c #F8F8FF", | |
"@ c #FFFFFF", | |
"........................", | |
".++++++++++++++++++++++.", | |
".++++++++++++++++++++++.", | |
".++..................++.", | |
".++..................++.", | |
".++......@@@@@@......++.", | |
".++.....@@@@@@@@.....++.", | |
".++.....@@@..@@@.....++.", | |
".++.....@@....@@.....++.", | |
".++.....@@....@@.....++.", | |
".++...........@@.....++.", | |
".++..........@@@.....++.", | |
".++.........@@@......++.", | |
".++........@@@.......++.", | |
".++........@@........++.", | |
".++........@@........++.", | |
".++..................++.", | |
".++........@@........++.", | |
".++........@@........++.", | |
".++..................++.", | |
".++..................++.", | |
".++++++++++++++++++++++.", | |
".++++++++++++++++++++++.", | |
"........................"] | |
validIcon = [ | |
"24 24 3 1", | |
" c None", | |
". c #4E9A06", | |
"+ c #FFFFFF", | |
" ", | |
" ", | |
" ", | |
" . ", | |
" .+. ", | |
" .+.+. ", | |
" .+...+. ", | |
" .+.....+. ", | |
" . .+.......+.", | |
" .+. .+.......+. ", | |
" .+.+. .+.......+. ", | |
" .+...+. .+.......+. ", | |
" .+.....+.+.......+. ", | |
".+.......+.......+. ", | |
" .+.............+. ", | |
" .+...........+. ", | |
" .+.........+. ", | |
" .+.......+. ", | |
" .+.....+. ", | |
" .+...+. ", | |
" .+.+. ", | |
" .+. ", | |
" . ", | |
" "] | |
quitIcon = [ | |
"24 24 3 1", | |
" c None", | |
". c #FFFFFF", | |
"+ c #CC0000", | |
" .... ", | |
"++++++++++....++++++++++", | |
"+.......++....++.......+", | |
"+.......++....++.......+", | |
"+.......++....++.......+", | |
"+...++++++....++++++...+", | |
"+...++++++....++++++...+", | |
"+...+++++......+++++...+", | |
"+...+++++......+++++...+", | |
"+...+++++......+++++...+", | |
"+...+++++......+++++...+", | |
"+...+++++......+++++...+", | |
"+...+++++......+++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+...++++++++++++++++...+", | |
"+......................+", | |
"+......................+", | |
"+......................+", | |
"++++++++++++++++++++++++"] | |
resetIcon = [ | |
"24 24 3 1", | |
" c None", | |
". c #3465A4", | |
"+ c #888A85", | |
" ", | |
" ........ ", | |
" .++++++++. ", | |
" .++..+....+. ..... ", | |
" .+.. .+....+. .+++. ", | |
" .+. .+....+..+.+. ", | |
" ... .+....+.+.+. ", | |
" .+....+..+. ", | |
" .+......+. ", | |
" .+.....+. ", | |
" .+....+. ", | |
" ...... .+...+. ", | |
" .++++. .++++. ", | |
" .+...+. ...... ", | |
" .+....+. ", | |
" .+.....+. ", | |
" .+......+. ", | |
" .+..+....+. ", | |
" .+.+.+....+. ... ", | |
" .+.+..+....+. .+. ", | |
" .+++. .+....+. ..+. ", | |
" ..... .+....+..++. ", | |
" .++++++++. ", | |
" ........ "] | |
# | |
import PySide | |
try: | |
from PySide import QtWidgets | |
from PySide.QtWidgets import * | |
except Exception: | |
None | |
from PySide import QtGui , QtCore | |
from PySide.QtGui import * | |
from PySide.QtCore import * | |
#import PySide.QtXml | |
Gui = FreeCADGui | |
App = FreeCAD | |
global ui ; ui = "" | |
global sourisPass ; sourisPass = 0 | |
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 | |
import FreeCADGui | |
#### geometry | |
global setMainWindowMoveX; #setMainWindowMoveX= 0 # position X macro window | |
global setMainWindowMoveY; #setMainWindowMoveY= 0 # position Y macro window | |
global setFrameWindowSizeX #setFrameWindowSizeX=0 # dimension X macro window | |
global setFrameWindowSizeY #setFrameWindowSizeY=0 # dimension Y macro window | |
# | |
setMainWindowMoveX = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).GetInt("setMainWindowMoveX") | |
setMainWindowMoveY = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).GetInt("setMainWindowMoveY") | |
setFrameWindowSizeX= FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).GetInt("setFrameWindowSizeX") | |
setFrameWindowSizeY= FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).GetInt("setFrameWindowSizeY") | |
#### geometry | |
try: | |
_fromUtf8 = QtCore.QString.fromUtf8 | |
except AttributeError: | |
def _fromUtf8(s): | |
return s | |
try: | |
_encoding = QApplication.UnicodeUTF8 | |
def _translate(context, text, disambig): | |
return QApplication.translate(context, text, disambig, _encoding) | |
except AttributeError: | |
def _translate(context, text, disambig): | |
return 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 copyUnique ; copyUnique = 0 | |
global switchP ; switchP = 0 | |
global switchA ; switchA = 0 | |
global switchS ; switchS = 0 | |
global sel ; sel = "" | |
global cloneCopy ; cloneCopy = 1 | |
global a ; a = "" | |
global path | |
##path########################################################################### | |
#path = FreeCAD.ConfigGet("AppHomePath") | |
#path = FreeCAD.ConfigGet("UserAppData") | |
#path = "your path" | |
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")# macro path | |
path = param.GetString("MacroPath","") + "/" # macro path | |
path = path.replace("\\","/") | |
#App.Console.PrintMessage(str("Path for the icons : ") + path + "\n" + __title__ + " : " +__version__ + " " + __date__ + "\n") | |
################################################################################# | |
## icon freeCAD Theme | |
class Ui_MainWindow(object): | |
def __init__(self, MainWindow): | |
global path | |
global uniteMs | |
self.path = path | |
self.window = MainWindow | |
MainWindow.setObjectName(_fromUtf8("MainWindow")) | |
# MainWindow.resize(230, 549) | |
# MainWindow.setMinimumSize(QtCore.QSize(230, 549)) | |
# MainWindow.setMaximumSize(QtCore.QSize(230, 549)) | |
#### geometry | |
global setMainWindowMoveX | |
global setMainWindowMoveY | |
global setFrameWindowSizeX | |
global setFrameWindowSizeY | |
# | |
MainWindow.setGeometry(setMainWindowMoveX, setMainWindowMoveY, setFrameWindowSizeX, setFrameWindowSizeY) | |
#### geometry | |
self.centralWidget = QWidget(MainWindow) | |
self.centralWidget.setObjectName(_fromUtf8("centralWidget")) | |
self.label = QLabel() | |
font = QtGui.QFont() | |
font.setPointSize(12) | |
self.label.setFont(font) | |
self.label.setAlignment(QtCore.Qt.AlignCenter) | |
self.groupBox_00 = QGroupBox() | |
self.groupBox = QGroupBox() | |
self.radioButton = QRadioButton() | |
self.radioButton.setChecked(True) | |
self.radioButton.setIcon(QtGui.QIcon.fromTheme("close",QtGui.QIcon(":/icons/Draft_Clone.svg"))) | |
self.radioButton.clicked.connect(self.on_radioButton_clicked) #connection radioButton mode clone | |
self.checkBox_00 = QCheckBox() | |
self.checkBox_00.setChecked(False) | |
self.radioButton_2 = QRadioButton() | |
self.radioButton_2.setIcon(QtGui.QIcon.fromTheme("close",QtGui.QIcon(":/icons/Part_Transformed_Copy.svg"))) | |
self.radioButton_2.clicked.connect(self.on_radioButton_2_clicked) #connection radioButton_2 mode copy | |
self.radioButton_3 = QRadioButton() | |
self.radioButton_3.setIcon(QtGui.QIcon.fromTheme("close",QtGui.QIcon(":/icons/Part_Compound.svg"))) | |
self.radioButton_3.clicked.connect(self.on_radioButton_3_clicked) #connection radioButton_3 mode compount | |
self.checkBox = QCheckBox() | |
self.checkBox.setChecked(True) | |
self.groupBox_Translate = QGroupBox() | |
self.label_2 = QLabel() | |
# self.label_2.setStyleSheet("QLabel {color : #aa0000}") | |
self.doubleSpinBox = QDoubleSpinBox() | |
self.doubleSpinBox.setDecimals(8) | |
self.doubleSpinBox.setMinimum(-10000000.0) | |
self.doubleSpinBox.setMaximum(10000000.0) | |
self.doubleSpinBox.setSingleStep(1.0) | |
self.doubleSpinBox.setProperty("value", 0.0) | |
self.doubleSpinBox.valueChanged.connect(self.on_doubleSpinBox_valueChanged) #connection doubleSpinBox | |
self.label_3 = QLabel() | |
# self.label_3.setStyleSheet("QLabel {color : #00aa00}") | |
self.doubleSpinBox_2 = QDoubleSpinBox() | |
self.doubleSpinBox_2.setDecimals(8) | |
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.valueChanged.connect(self.on_doubleSpinBox_2_valueChanged) #connection doubleSpinBox_2 | |
self.label_4 = QLabel() | |
# self.label_4.setStyleSheet("QLabel {color : #0000aa}") | |
self.doubleSpinBox_3 = QDoubleSpinBox() | |
self.doubleSpinBox_3.setDecimals(8) | |
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.valueChanged.connect(self.on_doubleSpinBox_3_valueChanged) #connection doubleSpinBox_3 | |
self.pushButton_5 = QPushButton() | |
self.pushButton_5.clicked.connect(self.on_pushButton_5_clicked) # connect on def "on_pushButton_5_clicked" | |
self.groupBox_2 = QGroupBox() | |
self.comboBox = QComboBox() | |
self.comboBox.setMinimumContentsLength(0) | |
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("")) | |
QtCore.QObject.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.SIGNAL_comboBox_Changed) | |
self.groupBox_3 = QGroupBox() | |
self.doubleSpinBox_4 = QDoubleSpinBox() | |
self.doubleSpinBox_4.setDecimals(8) | |
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.valueChanged.connect(self.on_doubleSpinBox_4_valueChanged) #connection doubleSpinBox_4 | |
self.doubleSpinBox_5 = QDoubleSpinBox() | |
self.doubleSpinBox_5.setDecimals(8) | |
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.valueChanged.connect(self.on_doubleSpinBox_5_valueChanged) #connection doubleSpinBox_5 | |
self.doubleSpinBox_6 = QDoubleSpinBox() | |
self.doubleSpinBox_6.setDecimals(8) | |
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.valueChanged.connect(self.on_doubleSpinBox_6_valueChanged) #connection doubleSpinBox_6 | |
self.label_5 = QLabel() | |
self.label_6 = QLabel() | |
self.label_7 = QLabel() | |
self.pushButton_6 = QPushButton() | |
self.pushButton_6.clicked.connect(self.on_pushButton_6_clicked) # connect on def "on_pushButton_6_clicked" | |
self.pushButton_3 = QPushButton(self.groupBox_3) | |
self.pushButton_3.clicked.connect(self.on_pushButton03_clicked) #connection pushButton03 "..." align YZ to X | |
self.groupBox_4 = QGroupBox(self.centralWidget) | |
self.doubleSpinBox_7 = QDoubleSpinBox() | |
self.doubleSpinBox_7.setDecimals(8) | |
self.doubleSpinBox_7.setMinimum(-360.0) | |
self.doubleSpinBox_7.setMaximum(360.0) | |
self.doubleSpinBox_7.valueChanged.connect(self.on_doubleSpinBox_7_valueChanged) #connection doubleSpinBox_7 | |
self.doubleSpinBox_8 = QDoubleSpinBox() | |
self.doubleSpinBox_8.setDecimals(8) | |
self.doubleSpinBox_8.setMinimum(-360.0) | |
self.doubleSpinBox_8.setMaximum(360.0) | |
self.doubleSpinBox_8.valueChanged.connect(self.on_doubleSpinBox_8_valueChanged) #connection doubleSpinBox_8 | |
self.doubleSpinBox_9 = QDoubleSpinBox() | |
self.doubleSpinBox_9.setDecimals(8) | |
self.doubleSpinBox_9.setMinimum(-360.0) | |
self.doubleSpinBox_9.setMaximum(360.0) | |
self.doubleSpinBox_9.valueChanged.connect(self.on_doubleSpinBox_9_valueChanged) #connection doubleSpinBox_9 | |
self.groupBox_5 = QGroupBox() | |
self.groupBox_6 = QGroupBox() | |
self.SpinBox = QSpinBox() | |
self.SpinBox.setMaximum(1000000) | |
self.SpinBox.setProperty("value", 1) | |
self.SpinBox.valueChanged.connect(self.on_SpinBox_valueChanged) #connection SpinBox | |
self.label_8 = QLabel() | |
self.label_9 = QLabel() | |
self.label_10 = QLabel() | |
self.pushButton_4 = QPushButton() | |
self.pushButton_4.clicked.connect(self.on_pushButton_4_clicked) # connect on def "on_pushButton_4_clicked" | |
self.lineEdit = QLineEdit() | |
self.lineEdit.setText("Form") | |
self.pushButton_2 = QPushButton() | |
self.pushButton_2.setIcon(QtGui.QIcon(QtGui.QPixmap(quitIcon))) # icone dans une variable | |
self.pushButton_2.clicked.connect(self.on_pushButton02_clicked) #connection pushButton02 "Quitter" | |
self.pushButton = QPushButton() | |
self.pushButton.setIcon(QtGui.QIcon(QtGui.QPixmap(resetIcon))) # icone dans une variable | |
self.pushButton.clicked.connect(self.on_pushButton00_clicked) #connection pushButton00 "Reset" | |
self.pushButton_1 = QPushButton() | |
self.pushButton_1.setStyleSheet("QPushButton {background-color: Base}") | |
self.pushButton_1.setIcon(QtGui.QIcon(QtGui.QPixmap(validIcon)))# icone dans une variable | |
self.pushButton_1.clicked.connect(self.on_pushButton01_clicked) #connection pushButton01 "OK" | |
self.PB_Help = QPushButton() | |
self.PB_Help.setIcon(QtGui.QIcon(QtGui.QPixmap(helpIcon))) # icone dans une variable | |
self.PB_Help.clicked.connect(self.on_PB_Help) # | |
#### gridLayout debut #################### | |
gridLayout_00 = QGridLayout(self.centralWidget) | |
gridLayout_00.addWidget(self.groupBox_00) | |
gridLayout_01 = QGridLayout(self.groupBox_00) | |
#### | |
gridLayout_Tittle = QGridLayout(self.label) | |
gridLayout_Tittle.setContentsMargins(2, 2, 2, 2) | |
gridLayout_01.addWidget(self.label, 0, 0, 1, 2) | |
#### | |
self.gridLayout_Mode = QGridLayout(self.groupBox) | |
self.gridLayout_Mode.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_Mode.addWidget(self.radioButton, 0, 0, 1, 1) | |
self.gridLayout_Mode.addWidget(self.checkBox_00, 0, 1, 1, 1) | |
self.gridLayout_Mode.addWidget(self.radioButton_2, 1, 0, 1, 1) | |
self.gridLayout_Mode.addWidget(self.radioButton_3, 1, 1, 1, 1) | |
self.gridLayout_Mode.addWidget(self.checkBox, 1, 2, 1, 1) | |
gridLayout_01.addWidget(self.groupBox, 1, 0, 1, 2) | |
#### | |
self.gridLayout_Translate = QGridLayout(self.groupBox_Translate) | |
self.gridLayout_Translate.addWidget(self.label_2, 0, 0, 1, 1) | |
self.gridLayout_Translate.addWidget(self.pushButton_5, 0, 1, 1, 1) | |
self.gridLayout_Translate.addWidget(self.doubleSpinBox, 0, 2, 1, 1) | |
self.gridLayout_Translate.addWidget(self.label_3, 1, 0, 1, 1) | |
self.gridLayout_Translate.addWidget(self.doubleSpinBox_2, 1, 2, 1, 1) | |
self.gridLayout_Translate.addWidget(self.label_4, 2, 0, 1, 1) | |
self.gridLayout_Translate.addWidget(self.doubleSpinBox_3, 2, 2, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_Translate, 2, 0, 1, 2) | |
#### | |
self.gridLayout_Rotation = QGridLayout(self.groupBox_4) | |
self.gridLayout_Rotation.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_Rotation.addWidget(self.label_8, 0, 0, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.pushButton_4, 0, 1, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.doubleSpinBox_7, 0, 2, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.label_9, 1, 0, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.doubleSpinBox_8, 1, 2, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.label_10, 2, 0, 1, 1) | |
self.gridLayout_Rotation.addWidget(self.doubleSpinBox_9, 2, 2, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_4, 3, 0, 1, 2) | |
#### | |
self.gridLayout_Scale = QGridLayout(self.groupBox_2) | |
self.gridLayout_Scale.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_Scale.addWidget(self.comboBox, 0, 0, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_2, 4, 0, 1, 1) | |
#### | |
self.gridLayout_NumberCopy = QGridLayout(self.groupBox_5) | |
self.gridLayout_NumberCopy.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_NumberCopy.addWidget(self.SpinBox, 0, 0, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_5, 4, 1, 1, 1) | |
#### | |
self.gridLayout_ScaleFree = QGridLayout(self.groupBox_3) | |
self.gridLayout_ScaleFree.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_ScaleFree.addWidget(self.label_5, 0, 0, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.pushButton_3, 0, 1, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.doubleSpinBox_4, 0, 2, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.label_6, 1, 0, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.doubleSpinBox_5, 1, 2, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.label_7, 2, 0, 1, 1) | |
self.gridLayout_ScaleFree.addWidget(self.doubleSpinBox_6, 2, 2, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_3, 5, 0, 1, 2) | |
#### | |
self.gridLayout_Command = QGridLayout(self.groupBox_6) | |
self.gridLayout_Command.setContentsMargins(10, 10, 10, 10) | |
self.gridLayout_Command.addWidget(self.pushButton_6, 0, 0, 1, 1) | |
self.gridLayout_Command.addWidget(self.lineEdit, 0, 1, 1, 3) | |
self.gridLayout_Command.addWidget(self.pushButton_2, 1, 0, 1, 1) | |
self.gridLayout_Command.addWidget(self.pushButton, 1, 1, 1, 1) | |
self.gridLayout_Command.addWidget(self.pushButton_1, 1, 2, 1, 1) | |
self.gridLayout_Command.addWidget(self.PB_Help, 1, 3, 1, 1) | |
gridLayout_01.addWidget(self.groupBox_6, 6, 0, 1, 2) | |
#### gridLayout fin #################### | |
MainWindow.setCentralWidget(self.centralWidget) | |
self.retranslateUi(MainWindow) | |
QtCore.QMetaObject.connectSlotsByName(MainWindow) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_translate("MainWindow", __title__, None)) | |
MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8(self.path + "Macro_CloneConvert.png"))) # change l'icone de la fenetre principale | |
MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # cette fonction met la fenetre en avant | |
self.groupBox_00.setTitle(_translate("MainWindow", "ver : " + __version__ + " : " + __date__, None)) | |
self.label.setText(_translate("MainWindow", "Clone Convert", None)) | |
self.groupBox.setTitle(_translate("MainWindow", "Mode", None)) | |
#### | |
self.radioButton.setText(_translate("MainWindow", "Clone", None)) | |
self.radioButton.setToolTip(_translate("MainWindow", "Create a clone of the object(s)", None)) | |
self.checkBox_00.setText(_translate("MainWindow", "Unique", None)) | |
self.checkBox_00.setToolTip(_translate("MainWindow", "If checked and multiple object selected" + "\n" | |
"the clone created is one unique object" + "\n" | |
"or the 'Comp'ound object is created without" + "\n" | |
"modification or attach to the original(s) object(s)", None)) | |
self.radioButton_2.setText(_translate("MainWindow", "Copy", None)) | |
self.radioButton_2.setToolTip(_translate("MainWindow", "Create a copy of the object(s)", None)) | |
self.radioButton_3.setText(_translate("MainWindow", "Comp.", None)) | |
self.radioButton_3.setToolTip(_translate("MainWindow", "Create a compount of the object(s)" + "\n" | |
"If the checkBox 'Unique' is checked" + "\n" | |
"the compound is created in 1 object and not touch the original(s) object(s)" + "\n" | |
"if not the compound is one normal system compound", None)) | |
self.checkBox.setText(_translate("MainWindow", "Increm.", None)) | |
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.groupBox_Translate.setTitle(_translate("MainWindow", "Translate", None)) | |
self.label_2.setText("<html> <body> <text=""#000000""> Coordinate <FONT COLOR=""#aa0000""> X </font> </body> </html>" ) | |
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", "Align YZ ...", None)) | |
self.doubleSpinBox.setToolTip(_translate("MainWindow", "Place the new object to the X coordinate ", None)) | |
self.doubleSpinBox.setSuffix(_translate("MainWindow", " mm", None)) | |
self.label_3.setText("<html> <body> <text=""#000000""> Coordinate <FONT COLOR=""#00aa00""> Y </font> </body> </html>" ) | |
self.doubleSpinBox_2.setToolTip(_translate("MainWindow", "Place the new object to the Y coordinate", None)) | |
self.doubleSpinBox_2.setSuffix(_translate("MainWindow", " mm", None)) | |
self.label_4.setText("<html> <body> <text=""#000000""> Coordinate <FONT COLOR=""#0000aa""> Z </font> </body> </html>" ) | |
self.doubleSpinBox_3.setToolTip(_translate("MainWindow", "Place the new object to the Z coordinate", None)) | |
self.doubleSpinBox_3.setSuffix(_translate("MainWindow", " mm", None)) | |
#### | |
self.groupBox_4.setTitle(_translate("MainWindow", "Rotation", None)) | |
# self.label_8.setText(_translate("MainWindow", "Yaw ( Z )", None)) | |
self.label_8.setText("<html> <body> <text=""#000000""> Yaw ( <FONT COLOR=""#0000aa""> Z </font> <text=""#000000""> ) </body> </html>" ) | |
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", "Align YX ...", None)) | |
self.doubleSpinBox_7.setSuffix(_translate("MainWindow", " Deg", None)) | |
self.doubleSpinBox_7.setToolTip(_translate("MainWindow", "Rotation of Yaw ( Axis Z )", None)) | |
# self.label_9.setText(_translate("MainWindow", "Pitch ( Y )", None)) | |
self.label_9.setText("<html> <body> <text=""#000000""> Pitch ( <FONT COLOR=""#00aa00""> Y </font> <text=""#000000""> ) </body> </html>" ) | |
self.doubleSpinBox_8.setSuffix(_translate("MainWindow", " Deg", None)) | |
self.doubleSpinBox_8.setToolTip(_translate("MainWindow", "Rotation of Pitch ( Axis Y )", None)) | |
# self.label_10.setText(_translate("MainWindow", "Roll ( X )", None)) | |
self.label_10.setText("<html> <body> <text=""#000000""> Roll ( <FONT COLOR=""#aa0000""> X </font> <text=""#000000""> ) </body> </html>" ) | |
self.doubleSpinBox_9.setSuffix(_translate("MainWindow", " Deg", None)) | |
self.doubleSpinBox_9.setToolTip(_translate("MainWindow", "Rotation of Roll ( Axis X )", 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, "km") #km # = 1000000 | |
self.comboBox.setItemText(1, "hm") #hm # = 100000 | |
self.comboBox.setItemText(2, "dam") #dam# = 10000 | |
self.comboBox.setItemText(3, "m") #m # = 1000 | |
self.comboBox.setItemText(4, "dm") #dm # = 100 | |
self.comboBox.setItemText(5, "cm") #cm # = 10 | |
self.comboBox.setItemText(6, "mm") #mm # = 1 ##### | |
self.comboBox.setItemText(7, "um") #um # micro = 0.001 | |
self.comboBox.setItemText(8, "nm") #nm # nano = 0.000001 | |
self.comboBox.setItemText(9, "inch") #in # inch pouce = 25.400 | |
self.comboBox.setItemText(10, "link") #lk # link chainon = 201.168 | |
self.comboBox.setItemText(11, "foot") #ft # foot pied = 304.800 | |
self.comboBox.setItemText(12, "yard") #yd # yard verge = 914.400 | |
self.comboBox.setItemText(13, "perch") #rd # rod ou perch perche = 5029.200 | |
self.comboBox.setItemText(14, "chain") #ch # chain chaine = 20116.800 | |
self.comboBox.setItemText(15, "furlong") #fur# furlong = 201168 | |
self.comboBox.setItemText(16, "mile") #mi # mile = 1609344 | |
self.comboBox.setItemText(17, "league") #lea# league lieue = 4828032 | |
self.comboBox.setItemText(18, "nautique") #nmi# mile nautique = 1852000 | |
self.comboBox.setToolTip(_translate("MainWindow",u"Select unit. . .", None)) | |
#### | |
self.groupBox_5.setTitle(_translate("MainWindow", "Number copy", None)) | |
self.SpinBox.setToolTip(_translate("MainWindow", "Number copy of original", None)) | |
#### | |
self.groupBox_3.setTitle(_translate("MainWindow", "Scale free", None)) | |
self.label_5.setText(_translate("MainWindow", "Scale X", 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", "Align YZ ...", None)) | |
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.label_6.setText(_translate("MainWindow", "Scale Y", None)) | |
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.label_7.setText(_translate("MainWindow", "Scale Z", None)) | |
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.groupBox_6.setTitle(_translate("MainWindow", "Command", 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.pushButton_2.setToolTip(_translate("MainWindow", "Quit the macro", None)) | |
self.pushButton_2.setText(_translate("MainWindow", "Quit", 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.PB_Help.setText(_translate("MainWindow", "Help")) | |
def SIGNAL_comboBox_Changed(self,text): | |
global uniteM_X | |
global uniteM_Y | |
global uniteM_Z | |
global uniteM | |
global uniteMs | |
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 == "um": # = 1000 | |
uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0/1000.0 | |
uniteMs= "um" | |
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("Ok for Convert or copy") | |
self.pushButton_1.setStyleSheet("QPushButton {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 | |
global copyUnique | |
sel = FreeCADGui.Selection.getSelection() | |
if len(sel) != 0: | |
FreeCAD.ActiveDocument.openTransaction("FCCConvert") # memorise les actions (avec annuler restore) | |
#FreeCAD.ActiveDocument.commitTransaction() # restore les actions (avec annuler restore) | |
#FreeCAD.ActiveDocument.abortTransaction() # abandonne les actions(avec annuler restore) | |
self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None)) | |
self.pushButton_1.setStyleSheet("QPushButton {background-color: Base}") | |
FreeCADGui.updateGui() # rafraichi l'ecran | |
# 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 = "" | |
import Draft | |
for copies in range(1,copyNumber+1): ##### Boucle copies Debut ########################### | |
if copyNumber > 1: | |
comptName = str(copies) | |
if cloneCopy == 1: # clone ok clone object and stay solidaris | |
if self.checkBox_00.isChecked(): # create clone unique with all object Ok | |
mess = "Clone" | |
obj=Draft.clone(sel) | |
try: | |
obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z) | |
except Exception: | |
try: | |
FreeCAD.ActiveDocument.getObject(obj.Name).Length.Value = (sel[0].Length.Value * uniteM_X) | |
FreeCAD.ActiveDocument.getObject(obj.Name).Thickness.Value = (sel[0].Thickness.Value * uniteM_Y) | |
FreeCAD.ActiveDocument.getObject(obj.Name).Width.Value = (sel[0].Width.Value * uniteM_Z) | |
except Exception: | |
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)) | |
oL = obj.Label[:5] + " " + comptName + " " + obj.Label[6:] | |
obj.Label = oL | |
else: # create clone object separated | |
mess = "Clone" | |
for i in range(len(sel)): | |
obj=Draft.clone(sel[i]) | |
try: | |
obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z) | |
except Exception: | |
try: | |
FreeCAD.ActiveDocument.getObject(obj.Name).Length.Value = (sel[i].Length.Value * uniteM_X) | |
FreeCAD.ActiveDocument.getObject(obj.Name).Thickness.Value = (sel[i].Thickness.Value * uniteM_Y) | |
FreeCAD.ActiveDocument.getObject(obj.Name).Width.Value = (sel[i].Width.Value * uniteM_Z) | |
except Exception: | |
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(sel[i].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 | |
obj.touch() # recompute l'objet | |
if len(sel) > 1: | |
obj = "" | |
if cloneCopy == 0: # copy ok copy object not touch original | |
mess = "Copy " | |
for i in range(len(sel)): | |
obj = Draft.scale(sel[i],App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0),copy=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)) | |
obj2 = Part.show(obj.Shape) | |
FreeCADGui.activeDocument().activeObject().LineColor = sel[i].ViewObject.LineColor | |
FreeCADGui.activeDocument().activeObject().PointColor = sel[i].ViewObject.PointColor | |
FreeCADGui.activeDocument().activeObject().ShapeColor = sel[i].ViewObject.ShapeColor | |
App.ActiveDocument.ActiveObject.Label = "Copy " + comptName + " of " + sel[i].Label | |
App.ActiveDocument.removeObject(obj.Name) | |
obj = App.ActiveDocument.ActiveObject | |
if cloneCopy == 2: # compound ok | |
liste = [] | |
if self.checkBox_00.isChecked(): # create clone unique with all object not touch originalOk | |
mess = "Block " | |
for i in sel: | |
### Begin command Part_SimpleCopy # duplicate the original object | |
__shape = Part.getShape(App.ActiveDocument.getObject(i.Name),'',needSubElement=False,refine=False) | |
App.ActiveDocument.addObject('Part::Feature',i.Label).Shape=__shape | |
duplicate = App.ActiveDocument.ActiveObject | |
#App.ActiveDocument.ActiveObject.recompute() | |
liste.append(App.ActiveDocument.getObject(duplicate.Name)) | |
### End command Part_SimpleCopy | |
objori = Draft.makeBlock(liste) # create Block other method compound | |
objori.Label = mess + "_" + str(len(liste)) | |
App.ActiveDocument.ActiveObject.recompute() | |
for i in liste: | |
App.ActiveDocument.removeObject(i.Name) | |
App.ActiveDocument.recompute() | |
else: | |
mess = "Compount " # ne modifie pas les originaux | |
for i in sel: | |
liste.append(App.ActiveDocument.getObject(i.Name)) | |
objori = App.activeDocument().addObject("Part::Compound","Compound") | |
App.activeDocument().Compound.Links = liste | |
App.ActiveDocument.recompute() | |
obj = App.ActiveDocument.addObject('Part::Scale','Scale') | |
obj.Base = App.ActiveDocument.getObject(objori.Name) | |
obj.Uniform = False | |
obj.UniformScale = 1.0 | |
obj.XScale = uniteM_X | |
obj.YScale = uniteM_Y | |
obj.ZScale = uniteM_Z | |
App.ActiveDocument.getObject(objori.Name).Visibility = False | |
App.ActiveDocument.ActiveObject.recompute() | |
##### | |
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 = mess + " " + comptName + " of " + obj.Label | |
try: | |
obj.Label = mess + "_" + obj.Label # renamme the original object | |
except Exception: | |
None | |
# try: # optional delette the original objects | |
# App.activeDocument().removeObject(objori.Name) | |
# for i in liste: | |
# App.activeDocument().removeObject(i.Name) | |
# except: | |
# None | |
##### Boucle copies Fin ########################### | |
FreeCAD.ActiveDocument.recompute() | |
# 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 Exception: | |
try: | |
for i in range(len(obj)): | |
volume_ += obj[i].Shape.Volume | |
except Exception: | |
volume_ = 0.0 | |
# surface | |
surface = 0.0 | |
try: | |
surface = obj.Shape.Area | |
except: | |
try: | |
for i in range(len(obj)): | |
surface += obj[i].Shape.Area | |
except Exception: | |
surface = 0.0 | |
try: | |
App.Console.PrintMessage(obj.Label+"\r\n") | |
except Exception: | |
App.Console.PrintMessage("\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")# | |
App.Console.PrintMessage("___________________"+"\r\n") | |
self.pushButton_1.setStyleSheet("QPushButton {background-color: green}") | |
except Exception: | |
FreeCAD.Console.PrintError("Error interne"+"\r\n") | |
else: | |
self.pushButton_1.setStyleSheet("QPushButton {background-color: red}")#red | |
self.pushButton_1.setToolTip("Not object selected for Convert or copy") | |
FreeCAD.Console.PrintError("Select an object"+"\r\n") #App.Console.PrintMessage | |
sel = "" | |
def on_pushButton02_clicked(self): # Bouton Quitter | |
#### geometry | |
global setMainWindowMoveX | |
global setMainWindowMoveY | |
global setFrameWindowSizeX | |
global setFrameWindowSizeY | |
# | |
positionWindowXY = MainWindow.geometry() | |
setMainWindowMoveX = positionWindowXY.x() | |
setMainWindowMoveY = positionWindowXY.y() | |
positionWindowXY = MainWindow.size() | |
setFrameWindowSizeX = positionWindowXY.width() | |
setFrameWindowSizeY = positionWindowXY.height() | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetInt("setMainWindowMoveX", setMainWindowMoveX) # setMainWindowMoveX | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetInt("setMainWindowMoveY", setMainWindowMoveY) # setMainWindowMoveY | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetInt("setFrameWindowSizeX", setFrameWindowSizeX) # setFrameWindowSizeX | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetInt("setFrameWindowSizeY", setFrameWindowSizeY) # setFrameWindowSizeY | |
#### geometry | |
App.Console.PrintMessage("End CloneConvert\r\n") | |
self.window.hide() | |
def on_PB_Help(self): # | |
try: | |
import webbrowser | |
webbrowser.open("http://www.freecadweb.org/wiki/index.php?title=Macro_CloneConvert") | |
App.Console.PrintMessage("http://www.freecadweb.org/wiki/index.php?title=Macro_CloneConvert" + "\n") | |
except Exception: | |
None | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetString("Version",__version__ + " (" + __date__ + ")")# | |
sel = FreeCADGui.Selection.getSelection() | |
MainWindow = QMainWindow() | |
ui = Ui_MainWindow(MainWindow) | |
#ui.setupUi(MainWindow) | |
MainWindow.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This macro utility is intended for the use of the program FreeCAD http://www.freecadweb.org/
The icon for your toolbar, it is to place in your macros directory (in the same location of the macro)
rename the image in Macro_CloneConvert.png