Macro CloneConvert: Difference between revisions

From FreeCAD Documentation
m (minor)
(Revision)
Line 4: Line 4:


==Description== <!--T:2-->
==Description== <!--T:2-->
Creates a clone of the object and the converted in the chosen position and size (inch, mm, m, µm...). The base object is recognized in mm (FreeCAd base)
Creates a clone or copy of the object and the converted in the chosen position and size (inch, mm, m, µm...) or free. The base object is recognized in mm (FreeCAd base)


==Uses== <!--T:3-->
==Uses== <!--T:3-->
Run the macro, the XYZ settings, choose a unit select your object, and click {{KEY|Ok}} button
Run the macro, the XYZ settings, choose "Clone" or "Copy" a unit or one value of choice select your object, and click {{KEY|Ok}} button.

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

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



<!--T:4-->
<!--T:4-->
Line 14: Line 19:
<!--T:5-->
<!--T:5-->
Select in the comboBox '''inch''', '''1 inch = 25.4 mm''' , the fields '''"Scale free"''' automatically adjusts to 25.4 (the values ​​in '''"Scale-free"''' can be changed separately). Click {{KEY|Ok}} button, the clone created will have '''25,4 mm x 25,4 mm x 25,4 mm'''
Select in the comboBox '''inch''', '''1 inch = 25.4 mm''' , the fields '''"Scale free"''' automatically adjusts to 25.4 (the values ​​in '''"Scale-free"''' can be changed separately). Click {{KEY|Ok}} button, the clone created will have '''25,4 mm x 25,4 mm x 25,4 mm'''

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

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


Inverse operation :
Inverse operation :
Line 20: Line 29:


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

'''50%''' = '''0,50''' in the '''"Scale free"''' fields

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

<br />
<br />
<!--T:6-->
<!--T:6-->
Line 29: Line 43:
[[File:Macro CloneConvert_01.png|220px|left|CloneConvert]]
[[File:Macro CloneConvert_01.png|220px|left|CloneConvert]]
* '''Mode'''
* '''Mode'''
* '''Clone :''' One clone of the objet(s) is create
* '''Coordinate X :''' Coordinate placement X
* '''Coordinate Y :''' Coordinate placement Y
* '''Copy :''' One copy of the objet(s) is create
*
* '''Coordinate Z :''' Coordinate placement Z
* '''Coordinate X :''' Move the copy to the Coordinate X selected
* '''Coordinate Y :''' Move the copy to the Coordinate Y selected
* '''Coordinate Z :''' Move the copy to the Coordinate Z selected
*
*
* '''Scale predefined'''
* '''Scale predefined'''
* '''Scale predefined :''' predefined scales in units, km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique.
* '''Scale predefined :''' predefined scales in units, km, hm, dam, m, dm, cm, '''mm''', µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique<br />or choose a free value in the Scale free field.
*
*
* '''Scale free'''
* '''Scale free'''
* '''Scale X :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the X axis, to reduce the shape give a decimal value '''(0,5)'''
* '''Scale X :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the X axis, to reduce the shape give a decimal value '''(0,5)'''
* '''{{KEY|...}} :''' This button align the YZ values on the value of X if the three values are identical
* '''{{KEY|...}} :''' This button align the YZ values on the value of X to have the same values ​​XYZ (or manually)
* '''Scale Y :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Y axis, to reduce the shape give a decimal value '''(0,5)'''
* '''Scale Y :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Y axis, to reduce the shape give a decimal value '''(0,5)'''
* '''Scale Z :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Z axis, to reduce the shape give a decimal value '''(0,5)'''
* '''Scale Z :''' free scale , if the value is negative '''( -10)''' , the object is scaled '''x 10''' and will be reversed in the Z axis, to reduce the shape give a decimal value '''(0,5)'''
*
*
* '''{{KEY|Ok}} :''' the OK button validates and launches the command
* '''{{KEY|Ok}} :''' the OK button validates and launches the command, if no object is selected the {{KEY|Ok}} button will be colored in red
* '''{{KEY|Reset}} :''' the Reset button puts all the values to zero
* '''{{KEY|Reset}} :''' the Reset button puts all the values to zero
* '''{{KEY|Quit}} :''' the Quit button exit the macro
* '''{{KEY|Quit}} :''' the Quit button exit the macro
Line 53: Line 70:
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# CloneConvert.py
# CloneConvert.py
# Crée un clone de l'objet ou des objets sélectionné(s) et le met à l'échelle de la grandeur choisie
# Crée un clone ou une copie de l'objet ou des objets sélectionné(s) et le met à l'échelle de la grandeur choisie
# utilisation : lancer CloneConvert sélectionnez un objet choisissez la grandeur et cliquez sur OK
# utilisation : lancer CloneConvert sélectionnez un objet choisissez la grandeur et cliquez sur OK
#
#
# Creates a clone of the selected object and updates the selected size range
# 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
# use: start CloneConvert select an object choose the size and click OK
#
#
# OS: Windows Vista
#OS: Windows Vista
# Platform: 32-bit
#Platform: 32-bit
# Version: 0.14.3343 (Git)
#Version: 0.14.3389
#Python version: 2.6.2
# Branch: libpack
#Qt version: 4.5.2
# Hash: 8dcb8f68cf17ef152d34d226d7699c98c5bb59fb
# Python version: 2.7.6
#Coin version: 3.1.0
# Qt version: 4.8.5
#SoQt version: 1.4.1
# Coin version: 3.1.3
#OCC version: 6.5.1
# SoQt version: 1.5.0
# OCC version: 6.7.0
#
#
# ver 0.1 13/04/2014
# ver 0.2 09/05/2014


__title__="CloneConvert"
__title__ = "CloneConvert"
__author__ = "mario52"
__author__ = "mario52"


Line 80: Line 95:
from PyQt4 import QtCore, QtGui
from PyQt4 import QtCore, QtGui
from decimal import *
from decimal import *
from Draft import *
from FreeCAD import Vector, Rotation, Placement, Console
from FreeCAD import Vector, Rotation, Placement, Console


Line 116: Line 132:
global oripl_Z ; oripl_Z = 0.0
global oripl_Z ; oripl_Z = 0.0
global sel ; sel = ""
global sel ; sel = ""
global cloneCopy ; cloneCopy = 1


class Ui_MainWindow(object):
class Ui_MainWindow(object):
Line 180: Line 197:
self.label_4.setObjectName(_fromUtf8("label_4"))
self.label_4.setObjectName(_fromUtf8("label_4"))


# self.radioButton = QtGui.QRadioButton(self.groupBox)
self.radioButton = QtGui.QRadioButton(self.groupBox)
# self.radioButton.setGeometry(QtCore.QRect(10, 20, 71, 20))
self.radioButton.setGeometry(QtCore.QRect(10, 20, 71, 20))
# self.radioButton.setChecked(True)
self.radioButton.setChecked(True)
# self.radioButton.setObjectName(_fromUtf8("radioButton"))
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(100, 20, 71, 20))
# self.radioButton_2.setObjectName(_fromUtf8("radioButton_2"))
self.radioButton_2 = QtGui.QRadioButton(self.groupBox)
self.radioButton_2.setGeometry(QtCore.QRect(100, 20, 71, 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.groupBox_2 = QtGui.QGroupBox(self.centralWidget)
self.groupBox_2 = QtGui.QGroupBox(self.centralWidget)
Line 231: Line 252:
self.doubleSpinBox_4.setProperty("value", 1.0)
self.doubleSpinBox_4.setProperty("value", 1.0)
self.doubleSpinBox_4.setObjectName(_fromUtf8("doubleSpinBox_4"))
self.doubleSpinBox_4.setObjectName(_fromUtf8("doubleSpinBox_4"))
self.doubleSpinBox_4.setToolTip(_translate("MainWindow", "Scale free X", None))
self.doubleSpinBox_4.setToolTip(_translate("MainWindow", "Scale free X multiplied by ...", None))
self.doubleSpinBox_4.valueChanged.connect(self.on_doubleSpinBox_4_valueChanged) #connection doubleSpinBox_4
self.doubleSpinBox_4.valueChanged.connect(self.on_doubleSpinBox_4_valueChanged) #connection doubleSpinBox_4


Line 242: Line 263:
self.doubleSpinBox_5.setProperty("value", 1.0)
self.doubleSpinBox_5.setProperty("value", 1.0)
self.doubleSpinBox_5.setObjectName(_fromUtf8("doubleSpinBox_5"))
self.doubleSpinBox_5.setObjectName(_fromUtf8("doubleSpinBox_5"))
self.doubleSpinBox_5.setToolTip(_translate("MainWindow", "Scale free Y", None))
self.doubleSpinBox_5.setToolTip(_translate("MainWindow", "Scale free Y multiplied by ...", None))
self.doubleSpinBox_5.valueChanged.connect(self.on_doubleSpinBox_5_valueChanged) #connection doubleSpinBox_5
self.doubleSpinBox_5.valueChanged.connect(self.on_doubleSpinBox_5_valueChanged) #connection doubleSpinBox_5


Line 253: Line 274:
self.doubleSpinBox_6.setProperty("value", 1.0)
self.doubleSpinBox_6.setProperty("value", 1.0)
self.doubleSpinBox_6.setObjectName(_fromUtf8("doubleSpinBox_6"))
self.doubleSpinBox_6.setObjectName(_fromUtf8("doubleSpinBox_6"))
self.doubleSpinBox_6.setToolTip(_translate("MainWindow", "Scale free Z", None))
self.doubleSpinBox_6.setToolTip(_translate("MainWindow", "Scale free Z multiplied by ...", None))
self.doubleSpinBox_6.valueChanged.connect(self.on_doubleSpinBox_6_valueChanged) #connection doubleSpinBox_6
self.doubleSpinBox_6.valueChanged.connect(self.on_doubleSpinBox_6_valueChanged) #connection doubleSpinBox_6


Line 270: Line 291:
self.pushButton_3 = QtGui.QPushButton(self.groupBox_3)
self.pushButton_3 = QtGui.QPushButton(self.groupBox_3)
self.pushButton_3.setGeometry(QtCore.QRect(70, 20, 21, 21))
self.pushButton_3.setGeometry(QtCore.QRect(70, 20, 21, 21))
self.pushButton_3.setToolTip(_fromUtf8(""))
self.pushButton_3.setToolTip(_fromUtf8("Align the Scale YZ to X"))
self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
self.pushButton_3.clicked.connect(self.on_pushButton03_clicked) #connection pushButton03 "..." align YZ to X
self.pushButton_3.clicked.connect(self.on_pushButton03_clicked) #connection pushButton03 "..." align YZ to X
Line 282: Line 303:
self.pushButton_1.setGeometry(QtCore.QRect(10, 340, 71, 28))
self.pushButton_1.setGeometry(QtCore.QRect(10, 340, 71, 28))
self.pushButton_1.setObjectName(_fromUtf8("pushButton_1"))
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_1.clicked.connect(self.on_pushButton01_clicked) #connection pushButton01 "OK"


Line 299: Line 321:
self.label.setText(_translate("MainWindow", "Object converter", None))
self.label.setText(_translate("MainWindow", "Object converter", None))
self.groupBox.setTitle(_translate("MainWindow", "Mode", None))
self.groupBox.setTitle(_translate("MainWindow", "Mode", None))
# self.radioButton.setText(_translate("MainWindow", "Clone", None))
self.radioButton.setText(_translate("MainWindow", "Clone", None))
# self.radioButton_2.setText(_translate("MainWindow", "Copy", None))
self.radioButton_2.setText(_translate("MainWindow", "Copy", None))
self.doubleSpinBox.setToolTip(_translate("MainWindow", "Placement coordinate X", None))
self.doubleSpinBox.setToolTip(_translate("MainWindow", "Place the new object to the X coordinate ", None))
self.label_2.setText(_translate("MainWindow", "Coordinate X", None))
self.label_2.setText(_translate("MainWindow", "Coordinate X", None))
self.label_3.setText(_translate("MainWindow", "Coordinate Y", None))
self.label_3.setText(_translate("MainWindow", "Coordinate Y", None))
self.doubleSpinBox_2.setToolTip(_translate("MainWindow", "Placement coordinate Y", None))
self.doubleSpinBox_2.setToolTip(_translate("MainWindow", "Place the new object to the Y coordinate", None))
self.doubleSpinBox_3.setToolTip(_translate("MainWindow", "Placement coordinate Z", None))
self.doubleSpinBox_3.setToolTip(_translate("MainWindow", "Place the new object to the Z coordinate", None))
self.label_4.setText(_translate("MainWindow", "Coordinate Z", None))
self.label_4.setText(_translate("MainWindow", "Coordinate Z", None))
self.groupBox_2.setTitle(_translate("MainWindow", "Scale predefined", None))
self.groupBox_2.setTitle(_translate("MainWindow", "Scale predefined", None))
self.comboBox.setToolTip(_translate("MainWindow", "Convert to . . .", None))
self.comboBox.setToolTip(_translate("MainWindow", "Convert your object to . . .", None))
self.comboBox.setCurrentIndex(6)
self.comboBox.setCurrentIndex(6)
self.comboBox.setItemText(0, _translate("MainWindow", "km", None)) #km # = 1000000
self.comboBox.setItemText(0, _translate("MainWindow", "km", None)) #km # = 1000000
Line 337: Line 359:
self.pushButton_2.setToolTip(_translate("MainWindow", "Quit the macro", None))
self.pushButton_2.setToolTip(_translate("MainWindow", "Quit the macro", None))
self.pushButton_2.setText(_translate("MainWindow", "Quit", None))
self.pushButton_2.setText(_translate("MainWindow", "Quit", None))
self.pushButton_1.setToolTip(_translate("MainWindow", "Ok Convert and copy", None))
self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None))
self.pushButton_1.setText(_translate("MainWindow", "Ok", None))
self.pushButton_1.setText(_translate("MainWindow", "Ok", None))
self.pushButton.setToolTip(_translate("MainWindow", "Reset", None))
self.pushButton.setToolTip(_translate("MainWindow", "Reset", None))
Line 414: Line 436:
self.doubleSpinBox_5.setProperty("value", uniteM_Y)
self.doubleSpinBox_5.setProperty("value", uniteM_Y)
self.doubleSpinBox_6.setProperty("value", uniteM_Z)
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_doubleSpinBox_valueChanged(self,value): # doubleSpinbox X
def on_doubleSpinBox_valueChanged(self,value): # doubleSpinbox X
Line 467: Line 497:
global oripl_Y
global oripl_Y
global oripl_Z
global oripl_Z
global cloneCopy


oripl_X = oripl_Y = oripl_Z = 0.0
oripl_X = oripl_Y = oripl_Z = 0.0

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.comboBox.setCurrentIndex(6)
Line 509: Line 546:


if len(sel) != 0:
if len(sel) != 0:

# surface
self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None))
try:
self.pushButton_1.setStyleSheet("background-color: Base")
surface = sel[0].Shape.Area
except:
surface = 0.0
# volume
try:
volume_ = sel[0].Shape.Volume
except:
volume_ = 0.0


# boundinbox (dimensions hors tout)
# boundinbox (dimensions hors tout)
try:
try:
boundBox_ = sel[0].Shape.BoundBox
boundBox_ = sel[0].Shape.BoundBox # pour 1 seul objet, (le premier)
boundBoxLX = boundBox_.XLength
boundBoxLX = boundBox_.XLength
boundBoxLY = boundBox_.YLength
boundBoxLY = boundBox_.YLength
Line 532: Line 562:
boundBoxLZ = 0.0
boundBoxLZ = 0.0
boundBox_S = ""
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]"
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 boundBox : "+boundBox_S+"\r\n")
App.Console.PrintMessage("Original volume_ : "+str(volume_)+" mm3"+"\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"+"\r\n")
App.Console.PrintMessage("Original surface : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")
App.Console.PrintMessage("- - - - - - - - - -"+"\r\n")
App.Console.PrintMessage("- - - - - - - - - -"+"\r\n")


Line 543: Line 589:
oripl_Z = sel[0].Placement.Base[2]
oripl_Z = sel[0].Placement.Base[2]


obj = ""
#### ici avec tous les objets sélectionné plus placement et rotation si un seul objet
obj=Draft.clone(sel)
if cloneCopy == 1: # clone ok
if len(sel) > 1:
obj=Draft.clone(sel)
mess = "Clone"
obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
else:
###
if len(sel) > 1: # one object
obj.Placement=App.Placement(App.Vector(oripl_X + placement_X,oripl_Y + placement_Y,oripl_Z + placement_Z), App.Rotation(sel[0].Placement.Rotation), App.Vector(0,0,0))
obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z)
else: # many objects
obj.Placement=App.Placement(App.Vector(oripl_X + placement_X,oripl_Y + placement_Y,oripl_Z + placement_Z), App.Rotation(sel[0].Placement.Rotation), App.Vector(0,0,0))
obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z)
###
else: # copy ok
mess = "Copy "
obj = Draft.scale(sel,delta=App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0),copy=True,legacy=True)
mydistance = FreeCAD.Vector(oripl_X + placement_X,oripl_Y + placement_Y,oripl_Z + placement_Z)
move(obj,mydistance)

FreeCAD.ActiveDocument.recompute()
FreeCAD.ActiveDocument.recompute()
####
####


# surface
try:
surface = obj.Shape.Area
except:
surface = 0.0
# volume
try:
volume_ = obj.Shape.Volume
except:
volume_ = 0.0
# boundinbox (dimensions hors tout)
# boundinbox (dimensions hors tout)
try:
try:
Line 574: Line 620:
boundBoxLY = 0.0
boundBoxLY = 0.0
boundBoxLZ = 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("Convert mm in ' "+uniteMs+" ' (1 "+uniteMs+" = "+str(uniteM)+" mm)"+"\r\n")
App.Console.PrintMessage("Convert mm in ' "+uniteMs+" ' (1 "+uniteMs+" = "+str(uniteM)+" mm)"+"\r\n")
App.Console.PrintMessage("Clone boundBox_X : "+str(boundBoxLX)+" mm"+"\r\n")
App.Console.PrintMessage(mess + " boundBox_X : "+str(boundBoxLX)+" mm"+"\r\n")
App.Console.PrintMessage("Clone boundBox_Y : "+str(boundBoxLY)+" mm"+"\r\n")
App.Console.PrintMessage(mess + " boundBox_Y : "+str(boundBoxLY)+" mm"+"\r\n")
App.Console.PrintMessage("Clone boundBox_Z : "+str(boundBoxLZ)+" mm"+"\r\n")
App.Console.PrintMessage(mess + " boundBox_Z : "+str(boundBoxLZ)+" mm"+"\r\n")
App.Console.PrintMessage("Clone volume : "+str(volume_)+" mm3 ("+str(len(sel))+" element(s))"+"\r\n")#
App.Console.PrintMessage(mess + " volume : "+str(volume_)+" mm3 ("+str(len(sel))+" element(s))"+"\r\n")#
App.Console.PrintMessage("Clone surface : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")#
App.Console.PrintMessage(mess + " surface : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")#
App.Console.PrintMessage("___________________"+"\r\n")
App.Console.PrintMessage("___________________"+"\r\n")

else:
else:
self.pushButton_1.setStyleSheet("background-color: red")#red
FreeCAD.Console.PrintError("Select an object"+"\r\n") #App.Console.PrintMessage
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 = ""
sel = ""


Line 597: Line 662:


</syntaxhighlight>
</syntaxhighlight>

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

<languages/>
<languages/>

Revision as of 13:46, 9 May 2014

File:Text-x-python Macro CloneConvert

Description
Creates a clone of the object and the converted in the chosen position and size (inch, mm, m, µm...).

Author: mario52
Author
mario52
Download
None
Links
Macro Version
1.0
Date last modified
None
FreeCAD Version(s)
None
Default shortcut
None
See also
None

Description

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

Uses

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

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

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


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

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

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

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

Inverse operation :

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

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

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

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


Predefined units are :

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

CloneConvert
CloneConvert
  • Mode
  • Clone : One clone of the objet(s) is create
  • Copy  : One copy of the objet(s) is create
  • Coordinate X : Move the copy to the Coordinate X selected
  • Coordinate Y : Move the copy to the Coordinate Y selected
  • Coordinate Z : Move the copy to the Coordinate Z selected
  • Scale predefined
  • Scale predefined : predefined scales in units, km, hm, dam, m, dm, cm, mm, µm, nm, inch, link, foot, yard, perch, chain, furlong, mile, league, nautique
    or choose a free value in the Scale free field.
  • Scale free
  • Scale X : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the X axis, to reduce the shape give a decimal value (0,5)
  • ... : This button align the YZ values on the value of X to have the same values ​​XYZ (or manually)
  • Scale Y : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the Y axis, to reduce the shape give a decimal value (0,5)
  • Scale Z : free scale , if the value is negative ( -10) , the object is scaled x 10 and will be reversed in the Z axis, to reduce the shape give a decimal value (0,5)
  • Ok : the OK button validates and launches the command, if no object is selected the Ok button will be colored in red
  • Reset : the Reset button puts all the values to zero
  • Quit : the Quit button exit the macro

Script

Macro_CloneConvert.FCMacro

# -*- coding: utf-8 -*-
# CloneConvert.py
# Crée un clone ou une copie de l'objet ou des objets sélectionné(s) et le met à l'échelle de la grandeur choisie
# utilisation : lancer CloneConvert sélectionnez 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
#Platform: 32-bit
#Version: 0.14.3389
#Python version: 2.6.2
#Qt version: 4.5.2
#Coin version: 3.1.0
#SoQt version: 1.4.1
#OCC version: 6.5.1
#
# ver 0.2 09/05/2014

__title__ = "CloneConvert"
__author__ = "mario52"

import Draft, Part, FreeCAD, math, PartGui, FreeCADGui, PyQt4
from math import sqrt, pi, sin, cos, asin
from FreeCAD import Base
from PyQt4 import QtCore, QtGui
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 oripl_X     ; oripl_X     = 0.0
global oripl_Y     ; oripl_Y     = 0.0
global oripl_Z     ; oripl_Z     = 0.0
global sel         ; sel         = ""
global cloneCopy   ; cloneCopy   = 1

class Ui_MainWindow(object):

    def __init__(self, MainWindow):
#        path = FreeCAD.ConfigGet("AppHomePath")

        global uniteMs

        self.window = MainWindow
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(230, 379)
        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.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.label_4 = QtGui.QLabel(self.groupBox)
        self.label_4.setGeometry(QtCore.QRect(10, 110, 91, 16))
        self.label_4.setObjectName(_fromUtf8("label_4"))

        self.radioButton = QtGui.QRadioButton(self.groupBox)
        self.radioButton.setGeometry(QtCore.QRect(10, 20, 71, 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(100, 20, 71, 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.groupBox_2 = QtGui.QGroupBox(self.centralWidget)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 170, 211, 51))
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))

        self.comboBox = QtGui.QComboBox(self.groupBox_2)
        self.comboBox.setGeometry(QtCore.QRect(10, 20, 191, 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, 220, 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 ...", 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 ...", 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 ...", 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_3 = QtGui.QPushButton(self.groupBox_3)
        self.pushButton_3.setGeometry(QtCore.QRect(70, 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.pushButton_2 = QtGui.QPushButton(self.centralWidget)
        self.pushButton_2.setGeometry(QtCore.QRect(152, 340, 71, 28))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_2.clicked.connect(self.on_pushButton02_clicked) #connection pushButton02 "Quitter"

        self.pushButton_1 = QtGui.QPushButton(self.centralWidget)
        self.pushButton_1.setGeometry(QtCore.QRect(10, 340, 71, 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 = QtGui.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 340, 51, 28))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton.clicked.connect(self.on_pushButton00_clicked)   #connection pushButton00 "Reset"

        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "CloneConvert", None))
        MainWindow.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint)  # cette fonction met la fenêtre 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.doubleSpinBox.setToolTip(_translate("MainWindow", "Place the new object to the X coordinate ", None))
        self.label_2.setText(_translate("MainWindow", "Coordinate X", None))
        self.label_3.setText(_translate("MainWindow", "Coordinate Y", None))
        self.doubleSpinBox_2.setToolTip(_translate("MainWindow", "Place the new object to the Y coordinate", None))
        self.doubleSpinBox_3.setToolTip(_translate("MainWindow", "Place the new object to the Z coordinate", 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  chaînon  = 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 chaîne   = 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_3.setToolTip(_translate("MainWindow", "Align the YZ scale values ​​to X scale value ", None))
        self.pushButton_3.setText(_translate("MainWindow", "...", None))
        self.pushButton_2.setToolTip(_translate("MainWindow", "Quit the macro", None))
        self.pushButton_2.setText(_translate("MainWindow", "Quit", None))
        self.pushButton_1.setToolTip(_translate("MainWindow", "Ok for Convert or copy", None))
        self.pushButton_1.setText(_translate("MainWindow", "Ok", None))
        self.pushButton.setToolTip(_translate("MainWindow", "Reset", None))
        self.pushButton.setText(_translate("MainWindow", "Reset", None))

    def SIGNAL_comboBox_Changed(self,text):
        global uniteM_X
        global uniteM_Y
        global uniteM_Z
        global uniteM
        global uniteMs

        text = unicode(text, 'ISO-8859-1').encode('UTF-8')
        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_doubleSpinBox_valueChanged(self,value):       # doubleSpinbox X
        global placement_X
        placement_X = value

    def on_doubleSpinBox_2_valueChanged(self,value):     # doubleSpinbox Y 
        global placement_Y
        placement_Y = value

    def on_doubleSpinBox_3_valueChanged(self,value):     #  doubleSpinbox Z
        global placement_Z
        placement_Z = value

    def on_doubleSpinBox_4_valueChanged(self,value):     # doubleSpinbox free X
        global uniteM_X
        uniteM_X = value
        if uniteM_X == 0:
            uniteM_X = 1

    def on_doubleSpinBox_5_valueChanged(self,value):     # doubleSpinbox free Y 
        global uniteM_Y
        uniteM_Y = value
        if uniteM_Y == 0:
            uniteM_Y = 1

    def on_doubleSpinBox_6_valueChanged(self,value):     #  doubleSpinbox free Z
        global uniteM_Z
        uniteM_Z = value
        if uniteM_Z == 0:
            uniteM_Z = 1

    def on_pushButton03_clicked(self):                   # Bouton ... (align)
        global uniteM_X
        global uniteM_Y
        global uniteM_Z
        global uniteM
        global uniteMs
        uniteM_Y = uniteM_Z = uniteM_X
        self.doubleSpinBox_5.setProperty("value", uniteM_X)
        self.doubleSpinBox_6.setProperty("value", uniteM_X)

    def on_pushButton00_clicked(self):                   # Bouton Reset
        global uniteM_X
        global uniteM_Y
        global uniteM_Z
        global uniteM
        global uniteMs
        global placement_X
        global placement_Y
        global placement_Z
        global oripl_X
        global oripl_Y
        global oripl_Z
        global cloneCopy

        oripl_X = oripl_Y = oripl_Z = 0.0

        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)
        self.doubleSpinBox_2.setProperty("value", 0.0)
        self.doubleSpinBox_3.setProperty("value", 0.0)

        placement_X = placement_Y = placement_Z = 0.0

        self.doubleSpinBox_4.setProperty("value", 1.0)
        self.doubleSpinBox_5.setProperty("value", 1.0)
        self.doubleSpinBox_6.setProperty("value", 1.0)

        uniteM = uniteM_X = uniteM_Y = uniteM_Z = 1.0
        uniteMs= "mm"
        uniteM = 1

    def on_pushButton01_clicked(self):                   # Bouton OK
        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 oripl_X
        global oripl_Y
        global oripl_Z
        global sel

        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")

            oripl_X = sel[0].Placement.Base[0]
            oripl_Y = sel[0].Placement.Base[1]
            oripl_Z = sel[0].Placement.Base[2]

            obj = ""
            if cloneCopy == 1:       # clone ok
                obj=Draft.clone(sel)
                mess = "Clone"
                ###
                if len(sel) > 1:     # one object
                    obj.Placement=App.Placement(App.Vector(placement_X,placement_Y,placement_Z), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
                else:                # many objects
                    obj.Placement=App.Placement(App.Vector(oripl_X + placement_X,oripl_Y + placement_Y,oripl_Z + placement_Z), App.Rotation(sel[0].Placement.Rotation), App.Vector(0,0,0))
                obj.Scale = (uniteM_X, uniteM_Y, uniteM_Z)
                ###
            else:                     # copy ok
                mess = "Copy "
                obj = Draft.scale(sel,delta=App.Vector(uniteM_X, uniteM_Y, uniteM_Z),center=App.Vector(0,0,0),copy=True,legacy=True)
                mydistance = FreeCAD.Vector(oripl_X + placement_X,oripl_Y + placement_Y,oripl_Z + placement_Z)
                move(obj,mydistance)

            FreeCAD.ActiveDocument.recompute()
            ####

             # boundinbox (dimensions hors tout)
            try:
                boundBox_ = obj.Shape.BoundBox
                boundBoxLX = boundBox_.XLength
                boundBoxLY = boundBox_.YLength
                boundBoxLZ = boundBox_.ZLength
            except:
                boundBox_  = 0.0
                boundBoxLX = 0.0
                boundBoxLY = 0.0
                boundBoxLZ = 0.0

             # volume
            volume_ = 0.0
            try:
                volume_ = obj.Shape.Volume
            except:
                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("Convert mm in ' "+uniteMs+" ' (1 "+uniteMs+" = "+str(uniteM)+" mm)"+"\r\n")
            App.Console.PrintMessage(mess + " boundBox_X  : "+str(boundBoxLX)+" mm"+"\r\n")
            App.Console.PrintMessage(mess + " boundBox_Y  : "+str(boundBoxLY)+" mm"+"\r\n")
            App.Console.PrintMessage(mess + " boundBox_Z  : "+str(boundBoxLZ)+" mm"+"\r\n")
            App.Console.PrintMessage(mess + " volume      : "+str(volume_)+" mm3 ("+str(len(sel))+" element(s))"+"\r\n")#
            App.Console.PrintMessage(mess + " surface     : "+str(surface)+" mm2 ("+str(len(sel))+" element(s))"+"\r\n")#
            App.Console.PrintMessage("___________________"+"\r\n")

        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()

Revision

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

Other languages: