Macro Image Scaling/fr

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



Utilisation

 * activez la macro
 * cliquez deux points sur l'image jusqu’à obtenir la bonne distance recherchée
 * Sélectionnez le plan dans la vue3D (XY, XZ, YZ)
 * Dans la boîte de dialogue, entrez la bonne distance en mm entre les points et validez en cliquant sur le bouton OK
 * L'image est mise à l'échelle et la boîte de dialogue se ferme.

Script
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", "Enter distance ", None)) return except IndexError, AttributeError: self.label1.setText(_translate("Dialog", "Select ImagePlane ", 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)) d = QtGui.QWidget ui = Ui_Dialog ui.setupUi(d)
 * 1) Init

Liens

 * [Forum discussion]
 * [téléchargez le zip]
 * [Movie created by microelly2]