# -*- coding: utf-8 -*- #------------------------------------------------- #-- animation workbench vertex 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 Draft #---------- import math,os import FreeCAD, Animation, PySide from Animation import say,sayErr,sayexc from EditWidget import EditNoDialWidget import Toucher reload(Toucher) __vers__='0.1 06.12.2015' __dir__ = os.path.dirname(__file__) def createVertexTracker(name,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 _VertexTracker(obj) _ViewProviderVertexTracker(obj.ViewObject) return obj class _VertexTracker(Animation._Actor): ''' track the time/placement of src to filename ''' def update(self): print("update VERTEX Tracker ") self.run(self.obj2.src) def step(self,now): say("step "+str(now) + str(self)) self.obj2.time=float(now)/100 #----------------------------------------- def addpoint(self,point): try: self.threads except: self.threads={} fcount=len(self.threads) dist=1.5 for f in self.threads: print(f, self.threads[f]) t=self.threads[f] if point.distanceToPoint(t[-1]) < dist: print( "found") self.threads[f].append(point) return self.threads[f] print("not found") self.threads[fcount]=[point] return self.threads[fcount] def run(self,s): say(s.Label) print(s.Shape) say(s.Shape.Vertexes) i=0 for v in s.Shape.Vertexes: i += 1 if i > 5: break say(["Point: ", v.Point]) FreeCADGui.updateGui() self.addpoint(v.Point) def show(self): for f in self.threads: print(f) for p in self.threads[f]: print(" ",p) def gen(self): for f in self.threads: print(f) if self.isOnePoint(self.threads[f]): p=FreeCAD.ActiveDocument.addObject("Part::Vertex","Vertex") p.Placement.Base=self.threads[f][0] else: Draft.makeWire(self.threads[f]) def isOnePoint(self,f): if len(f)==0: return False sp=f[0] for p in f: if p != sp: return False return True #---------------------------------------- class _ViewProviderVertexTracker(Animation._ViewProviderActor): def __init__(self,vobj): say(self) Animation._ViewProviderActor.__init__(self,vobj) self.attach(vobj) def getIcon(self): return '/usr/lib/freecad/Mod/Animation/' +'/icons/icon2.svg' return __dir__ +'/icons/icon2.svg' def attach(self,vobj): self.emenu=[["Show Path Data",self.Object.Proxy.show],["Generate Path",self.Object.Proxy.gen]] self.cmenu=self.emenu 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