Macro Scala immagine

From FreeCAD Documentation
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This page is a translated version of the page Macro Image Scaling and the translation is 100% complete.
Other languages:

Scala immagine

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

ToolBar Icon

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