Macro CloneConvert/fr: Difference between revisions
(Created page with "* '''{{KEY|ValueAt()}} :''' Donne le vecteur valueAt() du sous objet sélectionné Face, Wire, Line ...<br />Cette option est intéressante lorsque les données de Placement r...") |
(Updating to match new version of source page) |
||
Line 79: | Line 79: | ||
Macro_CloneConvert.FCMacro |
Macro_CloneConvert.FCMacro |
||
<syntaxhighlight> |
|||
# -*- coding: utf-8 -*- |
|||
Download the macro to Gist [https://gist.github.com/mario52a/9f2f2f6144e1307a048f1840ef99300c Macro_CloneConvert.FCMacro] |
|||
# 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 Vista #OS: Windows 8.1 |
|||
#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) |
|||
self.doubleSpinBox_9.setGeometry(QtCore.QRect(100, 80, 101, 22)) |
|||
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) |
|||
self.groupBox_5.setGeometry(QtCore.QRect(120,300,101,51)) |
|||
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) |
|||
self.label_9.setGeometry(QtCore.QRect(10, 50, 81, 16)) |
|||
self.label_9.setObjectName(_fromUtf8("label_9")) |
|||
self.label_10 = QtGui.QLabel(self.groupBox_4) |
|||
self.label_10.setGeometry(QtCore.QRect(10, 80, 81, 16)) |
|||
self.label_10.setObjectName(_fromUtf8("label_10")) |
|||
self.pushButton_4 = QtGui.QPushButton(self.groupBox_4) |
|||
self.pushButton_4.setGeometry(QtCore.QRect(75, 20, 21, 22)) |
|||
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> |
|||
==Révisions== |
==Révisions== |
||
14/06/2016 ver 0.9 = ajout du bouton nombre de copies et optimisation des labels |
14/06/2016 ver 0.9 = ajout du bouton nombre de copies et optimisation des labels |
Revision as of 19:44, 20 September 2016
File:Macro CloneConvert Macro CloneConvert |
Description |
---|
Crée un clone de ou des objets sélectionné(s) et le converti dans la grandeur et position sélectionnée (inch, mm, m, µm...). Version macro : 0.9 (14/06/2016) Auteur: mario52 |
Auteur |
mario52 |
Téléchargement |
None |
Liens |
Page des macros Comment installer une macro Comment créer une barre d'outils |
Version Macro |
0.9 (14/06/2016) |
Dernière modification |
None |
Version(s) FreeCAD |
None |
Raccourci clavier |
None |
Voir aussi |
None |
Description
Crée un clone ou une copie de ou des objets sélectionné(s) et le converti dans la grandeur et position sélectionnée (inch, mm, m, µm...) ou libre. L'original est reconnu comme mm qui est l'unité de base de FreeCAd
Utilisation
lancez la macro, choisissez "Clone" ou "Copy" réglez le placement XYZ (si nécessaire) et choisissez une unité de conversion dans le menu déroulant ou définissez d'autres valeurs ou des valeurs différentes dans les champs Scales, sélectionnez votre objet et lancez la macro en cliquant sur le bouton Ok.
Si aucune valeur n'est entrée une copie ou un clone sera créé sans modification. Si aucun objet n'est sélectionné le bouton Ok change de couleur et devient rouge si l'opération c'est bien déroulée le Ok devient vert.
Les valeurs du BoundingBox, Volume et Surface sont affichés dans la Vue Rapport, dans le cas d'une copie de plusieurs objets, Les valeurs du BoundingBox indiquent 0.0.
L'unité de base est le mm (l'objet sélectionné est considéré comme un objet dont l’unité est le mm).
Exemple avec un cube de 1 mm de côtés :
Sélectionnez dans la liste déroulante (combobox) l'unité inch (pouce), la valeur des champs Scales free s'ajustent automatiquement à 25,4 mm qui correspond à un pouce (ces champs peuvent être modifiés séparément). Cliquez sur le bouton Ok, le clone de l'objet ici le cube de 1 mm de côtés aura comme dimensions 25,4 mm x 25,4 mm x 25,4 mm.
150% = 1,50 dans les champs "Scale free"
104% = 1,04 dans les champs "Scale free"
Opération inverse :
Si vous voulez réduire un objet par exemple le cube de 25,4 mm (1 pouce) en un cube de 1 mm de côtés, utilisez la formule suivante ,
1 / 25,4 = 0,0393700 et entrez la valeur 0,0393700 (avec une virgule) dans les champs Scale free XY et Z.
Dans un cube de 5 mm, faites 5 / 25,4 = 0,1968503 et entrez la valeur 0,1968503 (avec une virgule) dans les champs Scale free XY et Z.
50% = 0,50 dans les champs "Scale free"
4% = 0,04 dans les champs "Scale free"
Les unités prédéfinies sont :
km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.
- Mode
- Clone : Crée un clone de ou des objet(s) sélectionné(s).
- Copy : Crée une copie de ou des objet(s) sélectionné(s).
- Comp : Crée un compound de ou des objet(s) sélectionné(s)
- Increm. : incrémente les coordonnées à la position (Placement, Rotation ... ) actuelle de la sélection
Si la case n'est pas activée le Placement commence aux coordonnées 0,0,0 de FreeCAD
Dans le cas d'un compound, le placement renseigné dans la vue combinée est [0,0,0], le placement commence à la position de l'objet
Dans ce cas le Placement ne commence pas à la position 0,0,0 utilisez le bouton ValueAt()
pour obtenir le Placement réel du sous objet sélectionné Face, Wire, Line ....
- Coordonnées
- ... : Ce bouton aligne les valeurs YZ à la valeur X pour obtenir le mêmes valeurs XYZ (ou manuellement)
Deux clics sur le bouton mettent les coordonnées à 0.0 - Coordinate X : Déplace l'objet aux coordonnées de placement X (facultatif) (Base 0,0,0 si Increm. n'est pas activé)
- Coordinate Y : Déplace l'objet aux coordonnées de placement Y (facultatif) (Base 0,0,0 si Increm. n'est pas activé)
- Coordinate Z : Déplace l'objet aux coordonnées de placement Z (facultatif) (Base 0,0,0 si Increm. n'est pas activé)
- Rotation
- ... : Ce bouton aligne les valeurs Pitch et Roll à la valeur Pitch pour obtenir le mêmes valeurs XYZ (ou manuellement)
Deux clics sur le bouton mettent les coordonnées à 0.0 - Yaw (Z ) : Donne un angle de rotation dans l'axe Z (Yaw) (Début 0 si Increm. n'est pas validé)
- Pitch ( Y ) : Donne un angle de rotation dans l'axe Y (Pitch) (Début 0 si Increm. n'est pas validé)
- Roll ( X ) : Donne un angle de rotation dans l'axe X (Roll) (Début 0 si Increm. n'est pas validé)
- Scale predefined
- Scale predefined :Les unités d'échelle predefinies, km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique ou choisissez une valeur libre dans les champs Scale free.
- Number copy
- Number copy : Nombre de copies désirées
- Scale free
- ... : Ce bouton aligne les valeurs YZ à la valeur X pour obtenir le mêmes valeurs XYZ (ou manuellement)
Deux clics sur le bouton mettent les coordonnées à 1.0 - Scale X : échelle libre, si la valeur entrée est négative ex: ( -10) , l'objet sera mis à l'échelle de 10 fois et sera inversé dans l'axe X, pour réduire l'objet, il faut entrer une valeur décimale exemple (0,5) réduira l'objet de 1/2 dans l'axe X.
- ... : Ce bouton aligne la valeur des axes YZ à la valeur de X si vous voulez que les trois valeurs XYZ soient égales.
- Scale Y : échelle libre, si la valeur entrée est négative ex: ( -10) , l'objet sera mis à l'échelle de 10 fois et sera inversé dans l'axe Y, pour réduire l'objet, il faut entrer une valeur décimale exemple (0,5) réduira l'objet de 1/2 dans l'axe Y.
- Scale Z : échelle libre, si la valeur entrée est négative ex: ( -10) , l'objet sera mis à l'échelle de 10 fois et sera inversé dans l'axe Z, pour réduire l'objet, il faut entrer une valeur décimale exemple (0,5) réduira l'objet de 1/2 dans l'axe Z.
- ValueAt() : Donne le vecteur valueAt() du sous objet sélectionné Face, Wire, Line ...
Cette option est intéressante lorsque les données de Placement renseignées sont [0,0,0] et que l'emplacement réel de l'objet est éloigné des coordonnées de base [0,0,0]
(ne donne pas de renseignement sur la rotation de l'object) - Ok : Le bouton OK valide et lance la commande, si aucun objet n'est sélectionné le bouton Ok se colore en rouge.
- Reset : Le bouton Reset met toutes les variables à zéro
- Quit : Le bouton Quit quitte la macro.
Script
L'icône de la macro qui servira pour votre barre d'outils
Macro_CloneConvert.FCMacro
Download the macro to Gist Macro_CloneConvert.FCMacro
Révisions
14/06/2016 ver 0.9 = ajout du bouton nombre de copies et optimisation des labels
31/01/2016 ver 0.8 = modification des boutons reset des sections il faut cliquer deux fois sur le bouton pour mettre les valeurs à 0(indispensable en cas de modification des valeurs)
30/01/2016 ver 0.7 = réécriture du code avec Placement et Increment et ajout des boutons Compound, Increment, ValueAt(),
26/01/2016 ver 0.6 = correction placement avec plusieurs objets (copy)
26/07/2015 ver 0.5 = correction rotation avec plusieurs objets fonction Copy
25/07/2015 ver 0.4 = ajout rotation
11/08/2014 replace "AttributeError" to "Exception"
02/07/2014 ver. 0.3 = modification fonctionne avec PyQt4 et PySide
09/05/2014 ver. 0.2 = ajout de la fonction "Copy"