From ea1773c7d6fb6118efb04c17b32633f0de1114d3 Mon Sep 17 00:00:00 2001 From: vocx-fc Date: Tue, 3 Mar 2020 18:22:58 -0600 Subject: [PATCH] Draft: gui_trackers clean up docstrings and spaces (2) Many small spacing fixes in the code, to improve the Pythonic style according to PEP8. Also add many docstrings in triple quotes. --- src/Mod/Draft/draftguitools/gui_trackers.py | 303 +++++++++++--------- 1 file changed, 171 insertions(+), 132 deletions(-) diff --git a/src/Mod/Draft/draftguitools/gui_trackers.py b/src/Mod/Draft/draftguitools/gui_trackers.py index 1dfbdd7f0e..50d628b589 100644 --- a/src/Mod/Draft/draftguitools/gui_trackers.py +++ b/src/Mod/Draft/draftguitools/gui_trackers.py @@ -42,6 +42,7 @@ import Draft import DraftVecUtils from FreeCAD import Vector from draftutils.todo import ToDo +from draftutils.messages import _msg __title__ = "FreeCAD Draft Trackers" __author__ = "Yorik van Havre" @@ -518,16 +519,17 @@ class bezcurveTracker(Tracker): FreeCAD.Console.PrintWarning("bezcurveTracker.recompute() failed to read-in Inventor string\n") self.bezcurve.append(bezcurveseg) - -####################################### + class arcTracker(Tracker): - """An arc tracker""" - def __init__(self,dotted=False,scolor=None,swidth=None,start=0,end=math.pi*2,normal=None): + """An arc tracker.""" + + def __init__(self, dotted=False, scolor=None, swidth=None, + start=0, end=math.pi*2, normal=None): self.circle = None self.startangle = math.degrees(start) self.endangle = math.degrees(end) self.trans = coin.SoTransform() - self.trans.translation.setValue([0,0,0]) + self.trans.translation.setValue([0, 0, 0]) self.sep = coin.SoSeparator() self.autoinvert = True if normal: @@ -536,72 +538,74 @@ class arcTracker(Tracker): self.normal = FreeCAD.DraftWorkingPlane.axis self.basevector = self.getDeviation() self.recompute() - Tracker.__init__(self,dotted,scolor,swidth,[self.trans, self.sep],name="arcTracker") - + Tracker.__init__(self, dotted, scolor, swidth, + [self.trans, self.sep], name="arcTracker") + def getDeviation(self): - """returns a deviation vector that represents the base of the circle""" + """Return a deviation vector that represents the base of the circle.""" import Part - c = Part.makeCircle(1,Vector(0,0,0),self.normal) + c = Part.makeCircle(1, Vector(0, 0, 0), self.normal) return c.Vertexes[0].Point - def setCenter(self,cen): - """sets the center point""" - self.trans.translation.setValue([cen.x,cen.y,cen.z]) + def setCenter(self, cen): + """Set the center point.""" + self.trans.translation.setValue([cen.x, cen.y, cen.z]) - def setRadius(self,rad): - """sets the radius""" - self.trans.scaleFactor.setValue([rad,rad,rad]) + def setRadius(self, rad): + """Set the radius.""" + self.trans.scaleFactor.setValue([rad, rad, rad]) def getRadius(self): - """returns the current radius""" + """Return the current radius.""" return self.trans.scaleFactor.getValue()[0] - def setStartAngle(self,ang): - """sets the start angle""" + def setStartAngle(self, ang): + """Set the start angle.""" self.startangle = math.degrees(ang) self.recompute() - def setEndAngle(self,ang): - """sets the end angle""" + def setEndAngle(self, ang): + """Set the end angle.""" self.endangle = math.degrees(ang) self.recompute() - def getAngle(self,pt): - """returns the angle of a given vector in radians""" + def getAngle(self, pt): + """Return the angle of a given vector in radians.""" c = self.trans.translation.getValue() - center = Vector(c[0],c[1],c[2]) + center = Vector(c[0], c[1], c[2]) rad = pt.sub(center) - a = DraftVecUtils.angle(rad,self.basevector,self.normal) - #print(a) - return(a) + a = DraftVecUtils.angle(rad, self.basevector, self.normal) + # print(a) + return a def getAngles(self): - """returns the start and end angles in degrees""" - return(self.startangle,self.endangle) - - def setStartPoint(self,pt): - """sets the start angle from a point""" + """Return the start and end angles in degrees.""" + return(self.startangle, self.endangle) + + def setStartPoint(self, pt): + """Set the start angle from a point.""" self.setStartAngle(-self.getAngle(pt)) - def setEndPoint(self,pt): - """sets the end angle from a point""" + def setEndPoint(self, pt): + """Set the end angle from a point.""" self.setEndAngle(-self.getAngle(pt)) - - def setApertureAngle(self,ang): - """sets the end angle by giving the aperture angle""" + + def setApertureAngle(self, ang): + """Set the end angle by giving the aperture angle.""" ap = math.degrees(ang) self.endangle = self.startangle + ap self.recompute() - def setBy3Points(self,p1,p2,p3): - """sets the arc by three points""" + def setBy3Points(self, p1, p2, p3): + """Set the arc by three points.""" import Part try: - arc=Part.ArcOfCircle(p1,p2,p3) - except: return - e=arc.toShape() + arc = Part.ArcOfCircle(p1, p2, p3) + except Exception: + return + e = arc.toShape() self.autoinvert = False - self.normal = e.Curve.Axis.negative() # axis is always in wrong direction + self.normal = e.Curve.Axis.negative() # axis is always in wrong direction self.basevector = self.getDeviation() self.setCenter(e.Curve.Center) self.setRadius(e.Curve.Radius) @@ -609,30 +613,33 @@ class arcTracker(Tracker): self.setEndPoint(p3) def recompute(self): - import Part,re - if self.circle: + """Recompute the tracker.""" + import Part + if self.circle: self.sep.removeChild(self.circle) self.circle = None if (self.endangle < self.startangle) or not self.autoinvert: - c = Part.makeCircle(1,Vector(0,0,0),self.normal,self.endangle,self.startangle) + c = Part.makeCircle(1, Vector(0, 0, 0), + self.normal, self.endangle, self.startangle) else: - c = Part.makeCircle(1,Vector(0,0,0),self.normal,self.startangle,self.endangle) - buf=c.writeInventor(2,0.01) + c = Part.makeCircle(1, Vector(0, 0, 0), + self.normal, self.startangle, self.endangle) + buf = c.writeInventor(2, 0.01) try: ivin = coin.SoInput() ivin.setBuffer(buf) ivob = coin.SoDB.readAll(ivin) - except: + except Exception: # workaround for pivy SoInput.setBuffer() bug - buf = buf.replace("\n","") - pts = re.findall("point \[(.*?)\]",buf)[0] + buf = buf.replace("\n", "") + pts = re.findall("point \[(.*?)\]", buf)[0] pts = pts.split(",") pc = [] for p in pts: v = p.strip().split() - pc.append([float(v[0]),float(v[1]),float(v[2])]) + pc.append([float(v[0]), float(v[1]), float(v[2])]) coords = coin.SoCoordinate3() - coords.point.setValues(0,len(pc),pc) + coords.point.setValues(0, len(pc), pc) line = coin.SoLineSet() line.numVertices.setValue(-1) self.circle = coin.SoSeparator() @@ -650,14 +657,17 @@ class arcTracker(Tracker): class ghostTracker(Tracker): - '''A Ghost tracker, that allows to copy whole object representations. - You can pass it an object or a list of objects, or a shape.''' - def __init__(self,sel,dotted=False,scolor=None,swidth=None): + """A Ghost tracker, that allows to copy whole object representations. + + You can pass it an object or a list of objects, or a shape. + """ + + def __init__(self, sel, dotted=False, scolor=None, swidth=None): self.trans = coin.SoTransform() - self.trans.translation.setValue([0,0,0]) + self.trans.translation.setValue([0, 0, 0]) self.children = [self.trans] rootsep = coin.SoSeparator() - if not isinstance(sel,list): + if not isinstance(sel, list): sel = [sel] for obj in sel: import Part @@ -665,10 +675,10 @@ class ghostTracker(Tracker): rootsep.addChild(self.getNode(obj)) else: self.coords = coin.SoCoordinate3() - self.coords.point.setValue((obj.X,obj.Y,obj.Z)) + self.coords.point.setValue((obj.X, obj.Y, obj.Z)) color = coin.SoBaseColor() color.rgb = FreeCADGui.draftToolBar.getDefaultColor("snap") - self.marker = coin.SoMarkerSet() # this is the marker symbol + self.marker = coin.SoMarkerSet() # this is the marker symbol self.marker.markerIndex = FreeCADGui.getMarkerIndex("quad", 9) node = coin.SoAnnotation() selnode = coin.SoSeparator() @@ -677,63 +687,67 @@ class ghostTracker(Tracker): selnode.addChild(self.marker) node.addChild(selnode) rootsep.addChild(node) - self.children.append(rootsep) - Tracker.__init__(self,dotted,scolor,swidth,children=self.children,name="ghostTracker") + self.children.append(rootsep) + Tracker.__init__(self, dotted, scolor, swidth, + children=self.children, name="ghostTracker") - def update(self,obj): - """recreates the ghost from a new object""" + def update(self, obj): + """Recreate the ghost from a new object.""" obj.ViewObject.show() self.finalize() sep = self.getNode(obj) - Tracker.__init__(self,children=[self.sep]) + Tracker.__init__(self, children=[self.sep]) self.on() obj.ViewObject.hide() - def move(self,delta): - """moves the ghost to a given position, relative from its start position""" - self.trans.translation.setValue([delta.x,delta.y,delta.z]) + def move(self, delta): + """Move the ghost to a given position. - def rotate(self,axis,angle): - """rotates the ghost of a given angle""" - self.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(axis)),angle) + Relative from its start position. + """ + self.trans.translation.setValue([delta.x, delta.y, delta.z]) - def center(self,point): - """sets the rotation/scale center of the ghost""" - self.trans.center.setValue(point.x,point.y,point.z) + def rotate(self, axis, angle): + """Rotate the ghost of a given angle.""" + self.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(axis)), angle) - def scale(self,delta): - """scales the ghost by the given factor""" - self.trans.scaleFactor.setValue([delta.x,delta.y,delta.z]) + def center(self, point): + """Set the rotation/scale center of the ghost.""" + self.trans.center.setValue(point.x, point.y, point.z) - def getNode(self,obj): - """returns a coin node representing the given object""" + def scale(self, delta): + """Scale the ghost by the given factor.""" + self.trans.scaleFactor.setValue([delta.x, delta.y, delta.z]) + + def getNode(self, obj): + """Return a coin node representing the given object.""" import Part - if isinstance(obj,Part.Shape): + if isinstance(obj, Part.Shape): return self.getNodeLight(obj) elif obj.isDerivedFrom("Part::Feature"): return self.getNodeFull(obj) else: return self.getNodeFull(obj) - def getNodeFull(self,obj): - """gets a coin node which is a full copy of the current representation""" + def getNodeFull(self, obj): + """Get a coin node which is a copy of the current representation.""" sep = coin.SoSeparator() try: sep.addChild(obj.ViewObject.RootNode.copy()) # add Part container offset - if hasattr(obj,"getGlobalPlacement"): + if hasattr(obj, "getGlobalPlacement"): if obj.Placement != obj.getGlobalPlacement(): if sep.getChild(0).getNumChildren() > 0: if isinstance(sep.getChild(0).getChild(0),coin.SoTransform): gpl = obj.getGlobalPlacement() sep.getChild(0).getChild(0).translation.setValue(tuple(gpl.Base)) sep.getChild(0).getChild(0).rotation.setValue(gpl.Rotation.Q) - except: - print("ghostTracker: Error retrieving coin node (full)") + except Exception: + _msg("ghostTracker: Error retrieving coin node (full)") return sep - def getNodeLight(self,shape): - """extract a lighter version directly from a shape""" + def getNodeLight(self, shape): + """Extract a lighter version directly from a shape.""" # error-prone sep = coin.SoSeparator() try: @@ -743,43 +757,48 @@ class ghostTracker(Tracker): # only add wireframe or full node? sep.addChild(coinobj.getChildren()[1]) # sep.addChild(coinobj) - except: - print("ghostTracker: Error retrieving coin node (light)") + except Exception: + _msg("ghostTracker: Error retrieving coin node (light)") return sep - + def getMatrix(self): + """Get matrix of the active view.""" r = FreeCADGui.ActiveDocument.ActiveView.getViewer().getSoRenderManager().getViewportRegion() v = coin.SoGetMatrixAction(r) m = self.trans.getMatrix(v) if m: m = m.getValue() - return FreeCAD.Matrix(m[0][0],m[0][1],m[0][2],m[0][3], - m[1][0],m[1][1],m[1][2],m[1][3], - m[2][0],m[2][1],m[2][2],m[2][3], - m[3][0],m[3][1],m[3][2],m[3][3]) + return FreeCAD.Matrix(m[0][0], m[0][1], m[0][2], m[0][3], + m[1][0], m[1][1], m[1][2], m[1][3], + m[2][0], m[2][1], m[2][2], m[2][3], + m[3][0], m[3][1], m[3][2], m[3][3]) else: return FreeCAD.Matrix() - - def setMatrix(self,matrix): - m = coin.SbMatrix(matrix.A11,matrix.A12,matrix.A13,matrix.A14, - matrix.A21,matrix.A22,matrix.A23,matrix.A24, - matrix.A31,matrix.A32,matrix.A33,matrix.A34, - matrix.A41,matrix.A42,matrix.A43,matrix.A44) + + def setMatrix(self, matrix): + """Set the transformation matrix.""" + m = coin.SbMatrix(matrix.A11, matrix.A12, matrix.A13, matrix.A14, + matrix.A21, matrix.A22, matrix.A23, matrix.A24, + matrix.A31, matrix.A32, matrix.A33, matrix.A34, + matrix.A41, matrix.A42, matrix.A43, matrix.A44) self.trans.setMatrix(m) + class editTracker(Tracker): - """A node edit tracker""" - def __init__(self,pos=Vector(0,0,0),name=None,idx=0,objcol=None,\ - marker=FreeCADGui.getMarkerIndex("quad", 9),inactive=False): + """A node edit tracker.""" + + def __init__(self, pos=Vector(0, 0, 0), name=None, idx=0, objcol=None, + marker=FreeCADGui.getMarkerIndex("quad", 9), + inactive=False): self.color = coin.SoBaseColor() if objcol: self.color.rgb = objcol[:3] else: self.color.rgb = FreeCADGui.draftToolBar.getDefaultColor("snap") - self.marker = coin.SoMarkerSet() # this is the marker symbol + self.marker = coin.SoMarkerSet() # this is the marker symbol self.marker.markerIndex = marker - self.coords = coin.SoCoordinate3() # this is the coordinate - self.coords.point.setValue((pos.x,pos.y,pos.z)) + self.coords = coin.SoCoordinate3() # this is the coordinate + self.coords.point.setValue((pos.x, pos.y, pos.z)) if inactive: self.selnode = coin.SoSeparator() else: @@ -788,72 +807,89 @@ class editTracker(Tracker): self.selnode.useNewSelection = False self.selnode.documentName.setValue(FreeCAD.ActiveDocument.Name) self.selnode.objectName.setValue(name) - self.selnode.subElementName.setValue("EditNode"+str(idx)) + self.selnode.subElementName.setValue("EditNode" + str(idx)) node = coin.SoAnnotation() self.selnode.addChild(self.coords) self.selnode.addChild(self.color) self.selnode.addChild(self.marker) node.addChild(self.selnode) ontop = not inactive - Tracker.__init__(self,children=[node],ontop=ontop,name="editTracker") + Tracker.__init__(self, children=[node], + ontop=ontop, name="editTracker") self.on() - def set(self,pos): - self.coords.point.setValue((pos.x,pos.y,pos.z)) + def set(self, pos): + """Set the point to the position.""" + self.coords.point.setValue((pos.x, pos.y, pos.z)) def get(self): + """Get a vector from the point.""" p = self.coords.point.getValues()[0] - return Vector(p[0],p[1],p[2]) + return Vector(p[0], p[1], p[2]) def get_doc_name(self): + """Get the document name.""" return str(self.selnode.documentName.getValue()) def get_obj_name(self): + """Get the object name.""" return str(self.selnode.objectName.getValue()) def get_subelement_name(self): + """Get the subelement name.""" return str(self.selnode.subElementName.getValue()) def get_subelement_index(self): + """Get the subelement index.""" subElement = self.get_subelement_name() idx = int(subElement[8:]) return idx - def move(self,delta): + def move(self, delta): + """Get the point and add a delta, and set the new point.""" self.set(self.get().add(delta)) - def setColor(self,color): + def setColor(self, color): + """Set the color.""" if color: self.color.rgb = color else: self.color.rgb = FreeCADGui.draftToolBar.getDefaultColor("snap") + class PlaneTracker(Tracker): - """A working plane tracker""" + """A working plane tracker.""" + def __init__(self): # getting screen distance - p1 = Draft.get3DView().getPoint((100,100)) - p2 = Draft.get3DView().getPoint((110,100)) - bl = (p2.sub(p1)).Length * (Draft.getParam("snapRange", 8)/2) + p1 = Draft.get3DView().getPoint((100, 100)) + p2 = Draft.get3DView().getPoint((110, 100)) + bl = (p2.sub(p1)).Length * (Draft.getParam("snapRange", 8)/2.0) pick = coin.SoPickStyle() pick.style.setValue(coin.SoPickStyle.UNPICKABLE) self.trans = coin.SoTransform() - self.trans.translation.setValue([0,0,0]) + self.trans.translation.setValue([0, 0, 0]) m1 = coin.SoMaterial() m1.transparency.setValue(0.8) - m1.diffuseColor.setValue([0.4,0.4,0.6]) + m1.diffuseColor.setValue([0.4, 0.4, 0.6]) c1 = coin.SoCoordinate3() - c1.point.setValues([[-bl,-bl,0],[bl,-bl,0],[bl,bl,0],[-bl,bl,0]]) + c1.point.setValues([[-bl, -bl, 0], + [bl, -bl, 0], + [bl, bl, 0], + [-bl, bl, 0]]) f = coin.SoIndexedFaceSet() - f.coordIndex.setValues([0,1,2,3]) + f.coordIndex.setValues([0, 1, 2, 3]) m2 = coin.SoMaterial() m2.transparency.setValue(0.7) - m2.diffuseColor.setValue([0.2,0.2,0.3]) + m2.diffuseColor.setValue([0.2, 0.2, 0.3]) c2 = coin.SoCoordinate3() - c2.point.setValues([[0,bl,0],[0,0,0],[bl,0,0],[-.05*bl,.95*bl,0],[0,bl,0], - [.05*bl,.95*bl,0],[.95*bl,.05*bl,0],[bl,0,0],[.95*bl,-.05*bl,0]]) + c2.point.setValues([[0, bl, 0], [0, 0, 0], + [bl, 0, 0], [-0.05*bl, 0.95*bl, 0], + [0, bl, 0], [0.05*bl, 0.95*bl, 0], + [0.95*bl, 0.05*bl, 0], [bl, 0, 0], + [0.95*bl, -0.05*bl, 0]]) l = coin.SoLineSet() - l.numVertices.setValues([3,3,3]) + l.numVertices.setValues([3, 3, 3]) s = coin.SoSeparator() s.addChild(pick) s.addChild(self.trans) @@ -863,21 +899,24 @@ class PlaneTracker(Tracker): s.addChild(m2) s.addChild(c2) s.addChild(l) - Tracker.__init__(self,children=[s],name="planeTracker") + Tracker.__init__(self, children=[s], name="planeTracker") - def set(self,pos=None): - if pos: + def set(self, pos=None): + """Set the translation to the position.""" + if pos: Q = FreeCAD.DraftWorkingPlane.getRotation().Rotation.Q else: plm = FreeCAD.DraftWorkingPlane.getPlacement() Q = plm.Rotation.Q pos = plm.Base - self.trans.translation.setValue([pos.x,pos.y,pos.z]) - self.trans.rotation.setValue([Q[0],Q[1],Q[2],Q[3]]) + self.trans.translation.setValue([pos.x, pos.y, pos.z]) + self.trans.rotation.setValue([Q[0], Q[1], Q[2], Q[3]]) self.on() - -class wireTracker(Tracker): - """A wire tracker""" + + +class wireTracker(Tracker): + """A wire tracker.""" + def __init__(self,wire): self.line = coin.SoLineSet() self.closed = DraftGeomUtils.isReallyClosed(wire)