|
Description |
---|
Met une image à une échelle voulue |
Auteur |
JAndersM |
Liens |
Recettes macros Comment installer une macro Comment ajouter une barre d'outils |
Version |
1.0 |
Date dernière modification |
2016-01-19 |
Macro pour mettre facilement un dessin à bonne échelle graphiques, diagramme, blueprint, plan et des images 2D en vue de s'en servir comme patron pour pouvoir calquer le dessin avec les outils de FreeCAD. Il fonctionne avec les images importées dans l'espace 3D.
Remarque: Pour les photos, objets ou images il faut garder à l'esprit l'effet de Parallaxe (distorsion due à la "différence entre la position apparente d'un objet vu le long de deux lignes différentes à la vue"). Dans le schéma ci-dessous les 2 objets bleus sont coplanaires perpendiculairement au plan du point de vue de l'utilisateur et la mise à l'échelle peut être utilisée:
Dans le second schéma, les objets rouges et verts ne sont pas coplanaires avec les 2 objets bleus et la mise à l'échelle ne peut pas être utilisée. En outre, le fait que l'objet rouge soit co-planaire avec 1 objet bleu il ne peut être déterminé à partir du diagramme uniquement basé au point de vue de l'utilisateur:
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: self.label1.setText(_translate("Dialog", "<font color='red'>Enter distance</font>", None)) return except IndexError, AttributeError: 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)