# -*- coding: utf-8 -*- #------------------------------------------------- #-- animation workbench tracker #-- #-- microelly 2015 #-- #-- GNU Lesser General Public License (LGPL) #------------------------------------------------- import FreeCAD,PySide,os,FreeCADGui from PySide import QtCore, QtGui, QtSvg from PySide.QtGui import * import Part #---------- import math,os import FreeCAD, Animation, PySide from Animation import say,sayErr,sayexc from EditWidget import EditNoDialWidget __vers__='0.3 30.11.2015' __dir__ = os.path.dirname(__file__) def createTracker(name="MyTracker",src=None,filename="/tmp/tracker"): obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name) obj.addProperty("App::PropertyString","filename","Base","").filename=filename obj.addProperty("App::PropertyLink","src","Base","").src=src obj.addProperty("App::PropertyFloat","time","Base","").time=0 _Tracker(obj) _ViewProviderTracker(obj.ViewObject) return obj class _Tracker(Animation._Actor): ''' track the time/placement of src to filename ''' def update(self): try: self.path except: self.path=[] if (self.obj2.src.time==0): f = open(self.obj2.filename + "_out.txt",'w') else: f = open(self.obj2.filename + "_out.txt",'a') f.write("# " + str(self.obj2.src.time) +" " +str(self.obj2.src.Placement)+'\n') # python will convert \n to os.linesep b=self.obj2.src.Placement.Base r=self.obj2.src.Placement.Rotation.Axis a=self.obj2.src.Placement.Rotation.Angle l=' '.join(str(k) for k in [self.obj2.src.time,b.x,b.y,b.z,r.x,r.y,r.z,a]) f.write(l +"\n") f.close() self.path.append(self.obj2.src.Placement.Base) class _ViewProviderTracker(Animation._ViewProviderActor): def getIcon(self): return __dir__ +'/icons/icon2.svg' def attach(self,vobj): self.emenu=[["Show Path",self.showpath]] self.cmenu=[] say("attach " + str(vobj.Object.Label)) self.Object = vobj.Object self.obj2=self.Object self.Object.Proxy.Lock=False self.Object.Proxy.Changed=False return def edit(self): self.dialog=EditNoDialWidget(self,self.emenu) self.dialog.show() def showVersion(self): cl=self.Object.Proxy.__class__.__name__ PySide.QtGui.QMessageBox.information(None, "About ", "Animation" + cl +" Node\nVersion " + __vers__ ) def showpath(self): ''' path as Part.polygon ''' FreeCAD.s=self points=self.Object.Proxy.path for p in self.Object.Proxy.path: say(str(p)) pp=Part.makePolygon(points) Part.show(pp) FreeCAD.ActiveDocument.recompute() return FreeCAD.activeDocument().ActiveObject