Macro CloneConvert/it: Difference between revisions
Renatorivo (talk | contribs) No edit summary |
No edit summary |
||
(39 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
{{Macro/it|Icon=Macro_CloneConvert |Name=Macro CloneConvert|Name/it=Macro CloneConvert|Description=Crea un clone riposizionato e scalato di un oggetto selezionato.|Author=mario52}} |
|||
{{Macro/it |
|||
|Name=Macro CloneConvert |
|||
|Icon=Macro_CloneConvert.png |
|||
|Description={{ColoredText|#ff0000|#ffffff|Ultimo aggiornamento: GUI modificata per il supporto HiDPI (QGridLayout). Gira su ≥v0.18}}<br/><br/> |
|||
Per le versioni precedenti vedere [https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/0a141260ad8d5f67f0fc18b9b40ef37757c06c65/Macro_CloneConvert.FCMacro Macro_CloneConvert] e installarlo manualmente.<br/><br/>Crea un Clone/Copia/Composto degli oggetti e poi li converte nella posizione e dimensione scelte (''pollici, mm, m, µm''...) o liberamente. L'oggetto base è considerato in ''mm'' (base di FreeCAD).. |
|||
|Author=mario52 |
|||
|Version=0.15 |
|||
|Date=2020-06-06 |
|||
|FCVersion= ≥0.18 |
|||
|Download=[https://www.freecadweb.org/wiki/images/0/0a/Macro_CloneConvert.png ToolBar Icon] |
|||
}} |
|||
== Descrizione == |
== Descrizione == |
||
Crea un clone o una copia dell'oggetto |
Crea un clone o una copia dell'oggetto e poi lo colloca nella posizione scelta e con le dimensioni desiderate (''pollici, mm, m, µm''...) o a piacere. L'oggetto base è misurato in ''mm'' (secondo il sistema base di FreeCAD) |
||
{{Codeextralink|https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/39bc54e90b80053a5af76b0b17694cb53697aebd/Macro_CloneConvert.FCMacro}} |
|||
== Utilizzo == |
|||
Avviare la macro, definire le impostazioni XYZ se è necessario, scegliere "Clone" oppure "Copia", scegliere una unità di conversione, selezionare l'oggetto e poi fare clic su il pulsante {{KEY/it|OK}} per avviare l'operazione. |
|||
== Utilizzo == |
|||
Se non viene inserito alcun valore viene creata una copia o un clone senza modifiche. Se non è selezionato alcun oggetto il pulsante {{KEY|Ok}} è colorato in rosso. |
|||
# Avviare la macro |
|||
# Definire le impostazioni di XYZ |
|||
Il valore di '''BoundingBox''', '''Volume''' e '''Surface''' sono indicate nella vista Report, nel caso di oggetti '''Copy''' multiple, il display visualizza BoundingBox 0.0. |
|||
# Scegliere "Clone" o "Copy" |
|||
# Scegliere un'unità di misura |
|||
# Selezionare l'oggetto |
|||
# Fare click su {{KEY|Ok}} |
|||
==Note== |
|||
* Se non viene inserito alcun valore viene creata una copia o un clone senza modifiche. |
|||
* Se non è selezionato alcun oggetto il pulsante {{KEY|Ok}} è colorato in rosso. |
|||
I valori di '''BoundingBox''', '''Volume''' e '''Surface''' sono indicati nella [[Report_view/it|vista Report]], nel caso di '''Copy''' per oggetti multipli, il display visualizza BoundingBox 0.0. |
|||
L'unità di base e il mm. L'originale viene quindi considerato come un oggetto in cui l'unità di misura è il mm. |
|||
L'unità di base è il mm, esempio con il lato del cubo di '''1 mm''': |
|||
Selezionare nel comboBox l'unità '''inch''', '''1 inch = 25.4 mm''' , notare che il valore nei campi '''"Scale free"''' si adeguano automaticamente a 25.4 che corrisponde appunto a 1 pollice (per impostare scalature differenti secondo gli assi, i valori in '''"Scale-free"''' possono essere modificati individualmente). Cliccare sul pulsante {{KEY|OK}}. Il cubo clone creato in questo modo ha le dimensioni di '''25,4 mm''' |
Selezionare nel comboBox l'unità '''inch''', '''1 inch = 25.4 mm''' , notare che il valore nei campi '''"Scale free"''' si adeguano automaticamente a 25.4 che corrisponde appunto a 1 pollice (per impostare scalature differenti secondo gli assi, i valori in '''"Scale-free"''' possono essere modificati individualmente). Cliccare sul pulsante {{KEY|OK}}. Il cubo clone creato in questo modo ha le dimensioni di '''25,4 mm''' |
||
Line 41: | Line 58: | ||
<br /><br /> |
<br /><br /> |
||
[[File:Macro CloneConvert_01.png| |
[[File:Macro CloneConvert_01.png|350px|left|CloneConvert]] |
||
* '''Mode''' |
* '''Mode''' |
||
* '''Clone :''' Crea un clone |
* '''Clone :''' Crea un clone |
||
Line 47: | Line 64: | ||
* '''Comp :''' Crea un composto di oggetto |
* '''Comp :''' Crea un composto di oggetto |
||
* '''Increm. :''' incrementa i dati delle coordinate alle coordinate originali dell'oggetto (Placement, Rotation ...)<br />Se questo non viene attivato il posizionamento inizia alle coordinate 0,0,0 di FreeCAD<br />Nel caso in cui un composto le coordinate di Placement sono [0,0,0], e il posizionamento inizia nella posizione dell'oggetto<br />Se il posizionamento non inizia nella posizione 0,0,0, utilizzare il pulsante {{KEY|ValueAt()}} per ottenere il posizionamento reale dei subObject selezionati Face, Wire, Line .... |
* '''Increm. :''' incrementa i dati delle coordinate alle coordinate originali dell'oggetto (Placement, Rotation ...)<br />Se questo non viene attivato il posizionamento inizia alle coordinate 0,0,0 di FreeCAD<br />Nel caso in cui un composto le coordinate di Placement sono [0,0,0], e il posizionamento inizia nella posizione dell'oggetto<br />Se il posizionamento non inizia nella posizione 0,0,0, utilizzare il pulsante {{KEY|ValueAt()}} per ottenere il posizionamento reale dei subObject selezionati Face, Wire, Line .... |
||
* '''Unique :''' Se viene selezionata questa casella con diversi oggetti selezionati, il clone viene creato come un oggetto unico |
|||
* '''Coordinate''' |
* '''Coordinate''' |
||
Line 81: | Line 99: | ||
L'icona di Macro_CloneConvert: [[Image:Macro_CloneConvert.png]] |
L'icona di Macro_CloneConvert: [[Image:Macro_CloneConvert.png]] |
||
Macro_CloneConvert.FCMacro |
'''Macro_CloneConvert.FCMacro''' |
||
<syntaxhighlight> |
|||
# -*- coding: utf-8 -*- |
|||
Scaricare la macro da 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 |
|||
# |
|||
<span id="Revision"></span> |
|||
#OS: Windows Vista #OS: Windows 8.1 |
|||
==Revision== |
|||
#Word size: 32-bit #Word size of OS: 64-bit |
|||
14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization |
|||
#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 |
|||
# |
|||
06/06/2020 ver 0.15 = icon |
|||
# 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 |
|||
20/05/2020 ver 0.14 = grid layout PySide2 Qt5 |
|||
__title__ = "CloneConvert" |
|||
__author__ = "mario52" |
|||
__url__ = "http://www.freecadweb.org/index-fr.html" |
|||
__version__ = "00.09" |
|||
__date__ = "14/06/2016" |
|||
15/09/2019 ver 0.13 = replace the grec sign micro to "um", replace all "_translate("MainWindow", "mm", None)" to "mm" and comment line "text.encode('utf-8')" cause not work with FC 0.19 18.213 |
|||
__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" |
|||
01/06/2019 ver 0.12 = adapted for 0.19 et correction "Copy:legacy=True" and ShapeColor ..... |
|||
30/03/2018 ver 0.11 = odd checkBox, if multi selection the clone are object unique or object separate |
|||
try: |
|||
import PyQt4 # PyQt4 |
|||
from PyQt4 import QtCore, QtGui # PyQt4 |
|||
# print "PyQt4" |
|||
07/06/2017 ver 0.10 = replace Draft...Copy to Part..Shape cause section Copy : not draw copy scaled of object but copy not scaled ?? |
|||
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> |
|||
==Revision== |
|||
14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization |
14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization |
||
Line 1,044: | Line 136: | ||
09/05/2014 ver. 0.2 = adding function "Copy" |
09/05/2014 ver. 0.2 = adding function "Copy" |
||
<languages/> |
Latest revision as of 07:56, 16 March 2024
Descrizione |
---|
Ultimo aggiornamento: GUI modificata per il supporto HiDPI (QGridLayout). Gira su ≥v0.18 Per le versioni precedenti vedere Macro_CloneConvert e installarlo manualmente. |
Autore |
mario52 |
Download |
ToolBar Icon |
Link |
Raccolta di macro Come installare le macro Personalizzare la toolbar |
Versione macro |
0.15 |
Data ultima modifica |
2020-06-06 |
Versioni di FreeCAD |
≥0.18 |
Scorciatoia |
Nessuna |
Vedere anche |
Nessuno |
Descrizione
Crea un clone o una copia dell'oggetto e poi lo colloca nella posizione scelta e con le dimensioni desiderate (pollici, mm, m, µm...) o a piacere. L'oggetto base è misurato in mm (secondo il sistema base di FreeCAD)
Temporary code for external macro link. Do not use this code. This code is used exclusively by Addon Manager. Link for optional manual installation: Macro
# This code is copied instead of the original macro code # to guide the user to the online download page. # Use it if the code of the macro is larger than 64 KB and cannot be included in the wiki # or if the RAW code URL is somewhere else in the wiki. from PySide import QtGui, QtCore diag = QtGui.QMessageBox(QtGui.QMessageBox.Information, "Information", "This macro must be downloaded from this link\n" "\n" "https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/39bc54e90b80053a5af76b0b17694cb53697aebd/Macro_CloneConvert.FCMacro" + "\n" "\n" "Quit this window to access the download page") diag.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) diag.setWindowModality(QtCore.Qt.ApplicationModal) diag.exec_() import webbrowser webbrowser.open("https://gist.githubusercontent.com/mario52a/9f2f2f6144e1307a048f1840ef99300c/raw/39bc54e90b80053a5af76b0b17694cb53697aebd/Macro_CloneConvert.FCMacro")
Utilizzo
- Avviare la macro
- Definire le impostazioni di XYZ
- Scegliere "Clone" o "Copy"
- Scegliere un'unità di misura
- Selezionare l'oggetto
- Fare click su Ok
Note
- Se non viene inserito alcun valore viene creata una copia o un clone senza modifiche.
- Se non è selezionato alcun oggetto il pulsante Ok è colorato in rosso.
I valori di BoundingBox, Volume e Surface sono indicati nella vista Report, nel caso di Copy per oggetti multipli, il display visualizza BoundingBox 0.0.
L'unità di base è il mm, esempio con il lato del cubo di 1 mm:
Selezionare nel comboBox l'unità inch, 1 inch = 25.4 mm , notare che il valore nei campi "Scale free" si adeguano automaticamente a 25.4 che corrisponde appunto a 1 pollice (per impostare scalature differenti secondo gli assi, i valori in "Scale-free" possono essere modificati individualmente). Cliccare sul pulsante OK. Il cubo clone creato in questo modo ha le dimensioni di 25,4 mm
Operazione inversa :
Per convertire un oggetto, ad esempio un cubo di 25,4 mm (1 inch) in un cubo di 1mm x 1mm x 1mm, utilizzare la formula 1 / 25,4 = 0,0393700 e inserire il valore 0,0393700 (con la virgola) nel campo Scale X, Y e Z.
Per un cubo di 5mm, fare 5 / 25,4 = 0,1968503e inserire il valore 0,1968503 (con la virgola) nel campo Scale X, Y e Z.
150% = 1,50 nel campo "Scale free"
104% = 1,04 nel campo "Scale free"
Operazione inversa:
Per convertire un oggetto, ad esempio un cubo di 25,4 mm (1 inch) in un cubo di 1mm x 1mm x 1mm, utilizzare la formula 1 / 25,4 = 0,0393700 e inserire il valore 0,0393700 (con la virgola) nel campo Scale X, Y e Z.
Per un cubo di 5mm, fare 5 / 25,4 = 0,1968503e inserire il valore 0,1968503 (con la virgola) nel campo Scale X, Y e Z.
50% = 0,50 nel campo "Scale free"
4% = 0,04 nel campo "Scale free"
Le unita predefinite sono:
km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.
- Mode
- Clone : Crea un clone
- Copy : Crea una copia
- Comp : Crea un composto di oggetto
- Increm. : incrementa i dati delle coordinate alle coordinate originali dell'oggetto (Placement, Rotation ...)
Se questo non viene attivato il posizionamento inizia alle coordinate 0,0,0 di FreeCAD
Nel caso in cui un composto le coordinate di Placement sono [0,0,0], e il posizionamento inizia nella posizione dell'oggetto
Se il posizionamento non inizia nella posizione 0,0,0, utilizzare il pulsante ValueAt() per ottenere il posizionamento reale dei subObject selezionati Face, Wire, Line .... - Unique : Se viene selezionata questa casella con diversi oggetti selezionati, il clone viene creato come un oggetto unico
- Coordinate
- ... : Questo pulsante forza il valore di Y e Z ai valori di X per avere gli stessi valori XYZ (o manualmente). Due click ripristinano i valori delle coordinate a 0.0
- Coordinate X : Sposta la copia alla coordinata X selezionata (Base 0,0,0 se Increm. non è attivo)
- Coordinate Y : Sposta la copia alla coordinata Y selezionata (Base 0,0,0 se Increm. non è attivo)
- Coordinate Z : Sposta la copia alla coordinata Z selezionata (Base 0,0,0 se Increm. non è attivo)
- Rotation
- ... : Questo pulsante forza i valori di beccheggio e rollio sul valore di imbardata per avere lo stesso valore di Rotazione (o manualmente). Due click ripristinano i valori delle rotazioni a 0.0
- Yaw (Z ) : Ruota la copia sull'asse Z (Yaw) (Inizia da 0 se Increm. non è attivo)
- Pitch ( Y ) : Ruota la copia sull'asse Y (Pitch) (Inizia da 0 se Increm. non è attivo)
- Roll ( X ) : Ruota la copia sull'asse X (Roll) (Inizia da 0 se Increm. non è attivo)
- Scale predefined
- Scale predefined : le scale predefinite sono km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique, oppure impostare l'unità desiderata nel campo Scale free.
- Number copy
- Number copy : numero di copie
- Scale free
- ... : Questo pulsante adatta i valori per Y e Z al valore di X per scalare su tutti gli assi con lo stesso valore (o impostare manualmente gli stessi valori). Due click per ripristinare i valori di scale a 1,0
- Scale X : scala a scelta , se il valore è negativo ( -10) , l'oggetto viene ingrandito x 10 e viene invertita la direzione sull'asse X, per ridurre la forma inserire un valore decimale (0,5)
- Scale Y : scala a scelta , se il valore è negativo ( -10) , l'oggetto viene ingrandito x 10 e viene invertita la direzione sull'asse Y, per ridurre la forma inserire un valore decimale (0,5)
- Scale Z : scala a scelta , se il valore è negativo ( -10) , l'oggetto viene ingrandito x 10 e viene invertita la direzione sull'asse Z, per ridurre la forma inserire un valore decimale (0,5)
- ValueAt() : Attribuisce il vettore valueAt() dei subObject selezionati Face, Wire, Line ...
Questa opzione è utile quando i dati indicati di Placement sono [0,0,0] e la posizione effettiva dell'oggetto non corrisponde alle coordinate di base 0,0,0 (non dà informazioni sulla rotazione dell'oggetto) - OK : il pulsante OK convalida e lancia il comando, se non è selezionato alcun oggetto il pulsante Ok ha il colore rosso
- Reset : il pulsante Reset azzera tutti i valori
- Quit : esce dalla macro
Script
L'icona di Macro_CloneConvert:
Macro_CloneConvert.FCMacro
Scaricare la macro da Gist Macro_CloneConvert.FCMacro
Revision
14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization
06/06/2020 ver 0.15 = icon
20/05/2020 ver 0.14 = grid layout PySide2 Qt5
15/09/2019 ver 0.13 = replace the grec sign micro to "um", replace all "_translate("MainWindow", "mm", None)" to "mm" and comment line "text.encode('utf-8')" cause not work with FC 0.19 18.213
01/06/2019 ver 0.12 = adapted for 0.19 et correction "Copy:legacy=True" and ShapeColor .....
30/03/2018 ver 0.11 = odd checkBox, if multi selection the clone are object unique or object separate
07/06/2017 ver 0.10 = replace Draft...Copy to Part..Shape cause section Copy : not draw copy scaled of object but copy not scaled ??
14/06/2016 ver 0.9 = adding the choice of number of copies and labels optimization
31/01/2016 ver 0.8 = modify the buttons reset section for two click for reset (in case modification the value)
30/01/2016 ver 0.7 = rewriting code with Placement and Increment and adding buttons Compound, Increment, ValueAt(),
26/01/2016 ver 0.6 = correction placement with many objets Copy
26/07/2015 ver 0.5 = correction rotate many objects Function Copy
25/07/2015 ver 0.4 = adding rotation
11/08/2014 replace "AttributeError" to "Exception"
02/07/2014 ver. 0.3 = modified to operate PyQt4 and PySide
09/05/2014 ver. 0.2 = adding function "Copy"