Macro Image Scaling/it: Difference between revisions
mNo edit summary |
No edit summary |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 2: | Line 2: | ||
{{Macro/it |
{{Macro/it |
||
|Name=Image Scaling |
|Name=Image Scaling |
||
|Icon=Image_Scaling.svg |
|||
|Translate=Scala immagine |
|Translate=Scala immagine |
||
|Description=Scala i disegni |
|Description=Scala i disegni |
||
Line 7: | Line 8: | ||
|Version=1.0 |
|Version=1.0 |
||
|Date=2016-01-19 |
|Date=2016-01-19 |
||
|FCVersion=0.17 and below |
|||
|Download=[https://www.freecadweb.org/wiki/images/0/05/Image_Scaling.svg ToolBar Icon] |
|||
}} |
}} |
||
Line 20: | Line 23: | ||
[[File:Parallax.jpg]] |
[[File:Parallax.jpg]] |
||
== |
==Utilizzo== |
||
* avviare la Macro - appare un dialogo |
* avviare la Macro - appare un dialogo |
||
* cliccare nell'immagine sui due punti di cui si conosce la vera distanza |
* cliccare nell'immagine sui due punti di cui si conosce la vera distanza |
||
Line 28: | Line 31: | ||
==Script== |
==Script== |
||
ToolBar Icon [[Image:Image_Scaling.svg]] |
|||
'''Macro_Image_Scaling.FCMacro''' |
'''Macro_Image_Scaling.FCMacro''' |
||
{{ |
{{MacroCode|code= |
||
import FreeCADGui, FreeCAD, Part |
import FreeCADGui, FreeCAD, Part |
||
Line 119: | Line 124: | ||
self.tracker.finalize() |
self.tracker.finalize() |
||
self.dialog.hide() |
self.dialog.hide() |
||
except ValueError, ZeroDivisionError: |
except (ValueError, ZeroDivisionError) as e: |
||
self.label1.setText(_translate("Dialog", "<font color='red'>Enter distance</font>", None)) |
self.label1.setText(_translate("Dialog", "<font color='red'>Enter distance</font>", None)) |
||
return |
return |
||
except IndexError, AttributeError: |
except (IndexError, AttributeError) as e: |
||
self.label1.setText(_translate("Dialog", "<font color='red'>Select ImagePlane</font>", None)) |
self.label1.setText(_translate("Dialog", "<font color='red'>Select ImagePlane</font>", None)) |
||
return |
return |
||
Line 167: | Line 172: | ||
==Link== |
==Link== |
||
* |
* [http://forum.freecadweb.org/viewtopic.php?f=22&t=13877 La discussione nel forum] |
||
* |
* [http://forum.freecadweb.org/download/file.php?id=19542 Download zip] |
||
* |
* [https://youtu.be/2iFE40uHrA8 Movie created by microelly2] |
||
Latest revision as of 18:23, 16 September 2022
Descrizione |
---|
Scala i disegni Versione macro: 1.0 Ultima modifica: 2016-01-19 Versione FreeCAD: 0.17 and below Download: ToolBar Icon Autore: JAndersM |
Autore |
JAndersM |
Download |
ToolBar Icon |
Link |
Raccolta di macro Come installare le macro Personalizzare la toolbar |
Versione macro |
1.0 |
Data ultima modifica |
2016-01-19 |
Versioni di FreeCAD |
0.17 and below |
Scorciatoia |
Nessuna |
Vedere anche |
Nessuno |
Descrizione
Macro per scalare disegni, grafici, schemi, modelli e immagini 2D simili nell'ambiente Immagine. Funziona per figure importate come immagini planari nello spazio 3D.
Notare: Per le foto di oggetti o immagini coinvolgenti oggetti giacenti a distanze diverse dal punto di vista,, si deve tenere presente l'effetto di Parallasse (distorsione dovuta a "differenza nella posizione apparente di un oggetto osservato lungo due diverse linee di vista"). Nello schema seguente i 2 oggetti blu sono complanari con il piano perpendicolare al punto di vista dell'utente e possono essere scalati:
Nella seconda figura, gli oggetti rossi e verdi non sono complanari con i 2 oggetti blu e quindi non possono essere scalati. Inoltre, con un solo punto di vista dell'utente non si può stabilire con certezza che l'oggetto rosso è complanare con 1 oggetto blu:
Utilizzo
- avviare la Macro - appare un dialogo
- cliccare nell'immagine sui due punti di cui si conosce la vera distanza
- Selezionare il piano dell'immagine nella vista ad albero
- Inserire in mm la vera distanza tra i punti nel campo di testo del dialogo e fare clic su OK
- L'immagine viene ridimensionata e il dialogo si chiude.
Script
Macro_Image_Scaling.FCMacro
import FreeCADGui, FreeCAD, Part import math import pivy.coin as pvy from PySide import QtCore, QtGui import DraftTrackers, Draft __title__ = "Macro Image Scaling" __author__ = "JAndersM" __url__ = "http://www.freecadweb.org/index-fr.html" __version__ = "00.01" __date__ = "19/01/2016" 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) def distance(p1,p2): dx=p2[0]-p1[0] dy=p2[1]-p1[1] dz=p2[2]-p1[2] return math.sqrt(dx*dx+dy*dy+dz*dz) class Ui_Dialog(object): def setupUi(self, Dialog): self.view = FreeCADGui.ActiveDocument.ActiveView self.stack = [] self.callback = self.view.addEventCallbackPivy(pvy.SoMouseButtonEvent.getClassTypeId(),self.getpoint) self.callmouse=self.view.addEventCallbackPivy(pvy.SoLocation2Event.getClassTypeId(),self.getmousepoint) self.distance=0 self.dialog=Dialog Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) Dialog.resize(300, 102) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QtCore.QRect(50, 70, 191, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel.__or__(QtGui.QDialogButtonBox.Ok)) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False) self.label = QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(30, 10, 66, 17)) self.label.setObjectName(_fromUtf8("label")) self.lineEdit = QtGui.QLineEdit(Dialog) self.lineEdit.setGeometry(QtCore.QRect(100, 10, 113, 29)) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.label1 = QtGui.QLabel(Dialog) self.label1.setGeometry(QtCore.QRect(20, 45, 260, 17)) self.label1.setObjectName(_fromUtf8("label1")) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), self.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), self.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) self.tracker = DraftTrackers.lineTracker(scolor=(1,0,0)) self.tracker.raiseTracker() self.tracker.on() self.dialog.show() def retranslateUi(self, Dialog): Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) self.label.setText(_translate("Dialog", "Distance", None)) self.label1.setText(_translate("Dialog", "Select first point", None)) def accept(self): sel = FreeCADGui.Selection.getSelection() try: locale=QtCore.QLocale.system() d, ok = locale.toFloat(self.lineEdit.text()) if not ok: raise ValueError s=d/self.distance sel[0].XSize.Value=sel[0].XSize.Value*s sel[0].YSize.Value=sel[0].YSize.Value*s FreeCAD.Console.PrintMessage("Scale="+str(s)) self.tracker.off() self.tracker.finalize() self.dialog.hide() except (ValueError, ZeroDivisionError) as e: self.label1.setText(_translate("Dialog", "<font color='red'>Enter distance</font>", None)) return except (IndexError, AttributeError) as e: self.label1.setText(_translate("Dialog", "<font color='red'>Select ImagePlane</font>", None)) return def reject(self): self.stack=[] self.view.removeEventCallbackPivy(pvy.SoMouseButtonEvent.getClassTypeId(),self.callback) self.view.removeEventCallbackPivy(pvy.SoLocation2Event.getClassTypeId(),self.callmouse) self.tracker.off() self.tracker.finalize() self.dialog.hide() def getmousepoint(self, event_cb): event = event_cb.getEvent() if len(self.stack)==1: pos = event.getPosition() point = self.view.getPoint(pos[0],pos[1]) self.tracker.p2(point) def getpoint(self,event_cb): event = event_cb.getEvent() if event.getState() == pvy.SoMouseButtonEvent.DOWN: pos = event.getPosition() point = self.view.getPoint(pos[0],pos[1]) self.stack.append(point) self.label1.setText(_translate("Dialog", "Select second point", None)) if len(self.stack)==1: self.tracker.p1(point) elif len(self.stack) == 2: self.distance=distance(self.stack[0], self.stack[1]) self.tracker.p2(point) self.view.removeEventCallbackPivy(pvy.SoMouseButtonEvent.getClassTypeId(),self.callback) self.view.removeEventCallbackPivy(pvy.SoLocation2Event.getClassTypeId(),self.callmouse) self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True) self.label1.setText(_translate("Dialog", "Select Image Plane and type distance", None)) #Init d = QtGui.QWidget() ui = Ui_Dialog() ui.setupUi(d)
Link