diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index 6b01699fc..2c9858cf2 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -170,14 +170,21 @@ class Snapper: self.tracker.off() if self.extLine: self.extLine.off() + if self.trackLine: + self.trackLine.off() point = self.getApparentPoint(screenpos[0],screenpos[1]) + + # setup a track line if we got a last point + if lastpoint: + if not self.trackLine: + self.trackLine = DraftTrackers.lineTracker() + self.trackLine.p1(lastpoint) # check if we snapped to something self.snapInfo = Draft.get3DView().getObjectInfo((screenpos[0],screenpos[1])) # checking if parallel to one of the edges of the last objects or to a polar direction - if active: eline = None point,eline = self.snapToPolar(point,lastpoint) @@ -188,7 +195,11 @@ class Snapper: # nothing has been snapped, check fro grid snap if active: point = self.snapToGrid(point) - return cstr(point) + fp = cstr(point) + if self.trackLine and lastpoint: + self.trackLine.p2(fp) + self.trackLine.on() + return fp else: @@ -308,10 +319,16 @@ class Snapper: self.tracker.setCoords(winner[2]) self.tracker.setMarker(self.mk[winner[1]]) self.tracker.on() + # setting the trackline + fp = cstr(winner[2]) + if self.trackLine and lastpoint: + self.trackLine.p2(fp) + self.trackLine.on() + # set the cursor self.setCursor(winner[1]) - + # return the final point - return cstr(winner[2]) + return fp def getApparentPoint(self,x,y): "returns a 3D point, projected on the current working plane" @@ -439,15 +456,14 @@ class Snapper: if self.isEnabled("grid"): np = self.grid.getClosestNode(point) if np: - if self.radius != 0: - dv = point.sub(np) - if dv.Length <= self.radius: - if self.tracker: - self.tracker.setCoords(np) - self.tracker.setMarker(self.mk['grid']) - self.tracker.on() - self.setCursor('grid') - return np + dv = point.sub(np) + if (self.radius == 0) or (dv.Length <= self.radius): + if self.tracker: + self.tracker.setCoords(np) + self.tracker.setMarker(self.mk['grid']) + self.tracker.on() + self.setCursor('grid') + return np return point def snapToEndpoints(self,shape): @@ -663,6 +679,8 @@ class Snapper: "finishes snapping" if self.tracker: self.tracker.off() + if self.trackLine: + self.trackLine.off() if self.extLine: self.extLine.off() if self.radiusTracker: @@ -777,13 +795,6 @@ class Snapper: self.ui = FreeCADGui.draftToolBar self.view = Draft.get3DView() - # setting a track line if we got an existing point - if last: - if not self.trackLine: - self.trackLine = DraftTrackers.lineTracker() - self.trackLine.p1(last) - self.trackLine.on() - def move(event_cb): event = event_cb.getEvent() mousepos = event.getPosition() @@ -792,8 +803,6 @@ class Snapper: self.pt = FreeCADGui.Snapper.snap(mousepos,lastpoint=last,active=ctrl,constrain=shift) if hasattr(FreeCAD,"DraftWorkingPlane"): self.ui.displayPoint(self.pt,last,plane=FreeCAD.DraftWorkingPlane,mask=FreeCADGui.Snapper.affinity) - if self.trackLine: - self.trackLine.p2(self.pt) if movecallback: movecallback(self.pt) @@ -816,8 +825,6 @@ class Snapper: obj = FreeCADGui.Snapper.lastSnappedObject FreeCADGui.Snapper.off() self.ui.offUi() - if self.trackLine: - self.trackLine.off() if callback: if len(inspect.getargspec(callback).args) > 2: callback(self.pt,obj) @@ -830,8 +837,6 @@ class Snapper: self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove) FreeCADGui.Snapper.off() self.ui.offUi() - if self.trackLine: - self.trackLine.off() if callback: callback(None) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index bfd4a5478..a51d04c6a 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -227,7 +227,8 @@ class DraftTool: self.ui = None self.call = None - self.support = None + self.support = None + self.point = None self.commitList = [] self.doc = FreeCAD.ActiveDocument if not self.doc: @@ -250,21 +251,16 @@ class DraftTool: self.extendedCopy = False self.ui.setTitle(name) self.featureName = name - #self.snap = snapTracker() - #self.extsnap = lineTracker(dotted=True) self.planetrack = None if Draft.getParam("showPlaneTracker"): self.planetrack = PlaneTracker() def finish(self): self.node = [] - #self.snap.finalize() - #self.extsnap.finalize() FreeCAD.activeDraftCommand = None if self.ui: self.ui.offUi() self.ui.sourceCmd = None - #self.ui.cross(False) msg("") if self.planetrack: self.planetrack.finalize() @@ -451,8 +447,6 @@ class Line(Creator): self.ui.wireUi(name) else: self.ui.lineUi(name) - self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) self.obj=self.doc.addObject("Part::Feature",self.featureName) # self.obj.ViewObject.Selectable = False Draft.formatObject(self.obj) @@ -473,9 +467,6 @@ class Line(Creator): ['import Draft', 'points='+pts, 'Draft.makeWire(points,closed='+str(closed)+',face='+fil+',support='+sup+')']) - if self.ui: - self.linetrack.finalize() - self.constraintrack.finalize() Creator.finish(self) if self.ui: if self.ui.continueMode: @@ -490,8 +481,6 @@ class Line(Creator): elif arg["Type"] == "SoLocation2Event": # mouse movement detection point,ctrlPoint,info = getPoint(self,arg) - self.ui.cross(True) - self.linetrack.p2(point) elif arg["Type"] == "SoMouseButtonEvent": # mouse button detection if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): @@ -503,7 +492,6 @@ class Line(Creator): point,ctrlPoint,info = getPoint(self,arg) self.pos = arg["Position"] self.node.append(point) - self.linetrack.p1(point) self.drawSegment(point) if (not self.isWire and len(self.node) == 2): self.finish(False,cont=True) @@ -518,7 +506,6 @@ class Line(Creator): if (len(self.node) > 1): self.node.pop() last = self.node[len(self.node)-1] - self.linetrack.p1(last) if self.obj.Shape.Edges: edges = self.obj.Shape.Edges if len(edges) > 1: @@ -533,7 +520,6 @@ class Line(Creator): def drawSegment(self,point): "draws a new segment" if (len(self.node) == 1): - self.linetrack.on() msg(translate("draft", "Pick next point:\n")) if self.planetrack: self.planetrack.set(self.node[0]) @@ -558,7 +544,6 @@ class Line(Creator): # self.obj.Shape.nullify() - for some reason this fails self.obj.ViewObject.Visibility = False self.node = [self.node[-1]] - self.linetrack.p1(self.node[0]) if self.planetrack: self.planetrack.set(self.node[0]) msg(translate("draft", "Pick next point:\n")) @@ -567,7 +552,6 @@ class Line(Creator): "this function gets called by the toolbar when valid x, y, and z have been entered there" point = Vector(numx,numy,numz) self.node.append(point) - self.linetrack.p1(point) self.drawSegment(point) if (not self.isWire and len(self.node) == 2): self.finish(False,cont=True) @@ -610,14 +594,7 @@ class BSpline(Line): self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection point,ctrlPoint,info = getPoint(self,arg) - self.ui.cross(True) self.bsplinetrack.update(self.node + [point]) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: self.constraintrack.off() elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["Position"] == self.pos): @@ -681,7 +658,6 @@ class BSpline(Line): print "Draft: error delaying commit" if self.ui: self.bsplinetrack.finalize() - self.constraintrack.finalize() Creator.finish(self) if self.ui: if self.ui.continueMode: @@ -808,7 +784,6 @@ class Rectangle(Creator): elif arg["Type"] == "SoLocation2Event": #mouse movement detection point,ctrlPoint,info = getPoint(self,arg,mobile=True) self.rect.update(point) - self.ui.cross(True) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["Position"] == self.pos): @@ -865,7 +840,6 @@ class Arc(Creator): self.altdown = False self.ui.sourceCmd = self self.linetrack = lineTracker(dotted=True) - self.constraintrack = lineTracker(dotted=True) self.arctrack = arcTracker() self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick center point:\n")) @@ -875,7 +849,6 @@ class Arc(Creator): Creator.finish(self) if self.ui: self.linetrack.finalize() - self.constraintrack.finalize() self.arctrack.finalize() self.doc.recompute() if self.ui: @@ -911,7 +884,6 @@ class Arc(Creator): elif arg["Type"] == "SoLocation2Event": point,ctrlPoint,info = getPoint(self,arg) # this is to make sure radius is what you see on screen - self.ui.cross(True) if self.center and DraftVecUtils.dist(point,self.center) > 0: viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) if not DraftVecUtils.isNull(viewdelta): @@ -919,12 +891,10 @@ class Arc(Creator): if (self.step == 0): # choose center if hasMod(arg,MODALT): if not self.altdown: - self.ui.cross(False) self.altdown = True self.ui.switchUi(True) else: if self.altdown: - self.ui.cross(True) self.altdown = False self.ui.switchUi(False) elif (self.step == 1): # choose radius @@ -938,7 +908,6 @@ class Arc(Creator): self.arctrack.setCenter(self.center) if hasMod(arg,MODALT): if not self.altdown: - self.ui.cross(False) self.altdown = True if info: ob = self.doc.getObject(info['Object']) @@ -956,18 +925,10 @@ class Arc(Creator): self.rad = DraftVecUtils.dist(point,self.center) else: if self.altdown: - self.ui.cross(True) self.altdown = False self.rad = DraftVecUtils.dist(point,self.center) self.ui.setRadiusValue(self.rad) self.arctrack.setRadius(self.rad) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() self.linetrack.p1(self.center) self.linetrack.p2(point) self.linetrack.on() @@ -977,13 +938,6 @@ class Arc(Creator): angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) else: angle = 0 self.linetrack.p2(DraftVecUtils.scaleTo(point.sub(self.center),self.rad).add(self.center)) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() self.ui.setRadiusValue(math.degrees(angle)) self.firstangle = angle else: # choose second angle @@ -992,13 +946,6 @@ class Arc(Creator): angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) else: angle = 0 self.linetrack.p2(DraftVecUtils.scaleTo(point.sub(self.center),self.rad).add(self.center)) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() self.ui.setRadiusValue(math.degrees(angle)) self.updateAngle(angle) self.arctrack.setApertureAngle(self.angle) @@ -1045,7 +992,6 @@ class Arc(Creator): self.planetrack.set(point) elif (self.step == 1): # choose radius if self.closedCircle: - self.ui.cross(False) self.drawArc() else: self.ui.labelRadius.setText("Start angle") @@ -1187,8 +1133,6 @@ class Polygon(Creator): self.ui.numFaces.show() self.altdown = False self.ui.sourceCmd = self - self.linetrack = lineTracker(dotted=True) - self.constraintrack = lineTracker(dotted=True) self.arctrack = arcTracker() self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick center point:\n")) @@ -1197,8 +1141,6 @@ class Polygon(Creator): "finishes the arc" Creator.finish(self) if self.ui: - self.linetrack.finalize() - self.constraintrack.finalize() self.arctrack.finalize() self.doc.recompute() if self.ui.continueMode: @@ -1212,7 +1154,6 @@ class Polygon(Creator): elif arg["Type"] == "SoLocation2Event": point,ctrlPoint,info = getPoint(self,arg) # this is to make sure radius is what you see on screen - self.ui.cross(True) if self.center and DraftVecUtils.dist(point,self.center) > 0: viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) if not DraftVecUtils.isNull(viewdelta): @@ -1220,12 +1161,10 @@ class Polygon(Creator): if (self.step == 0): # choose center if hasMod(arg,MODALT): if not self.altdown: - self.ui.cross(False) self.altdown = True self.ui.switchUi(True) else: if self.altdown: - self.ui.cross(True) self.altdown = False self.ui.switchUi(False) else: # choose radius @@ -1239,7 +1178,6 @@ class Polygon(Creator): self.arctrack.setCenter(self.center) if hasMod(arg,MODALT): if not self.altdown: - self.ui.cross(False) self.altdown = True snapped = self.view.getObjectInfo((arg["Position"][0],arg["Position"][1])) if snapped: @@ -1258,20 +1196,10 @@ class Polygon(Creator): self.rad = DraftVecUtils.dist(point,self.center) else: if self.altdown: - self.ui.cross(True) self.altdown = False self.rad = DraftVecUtils.dist(point,self.center) self.ui.setRadiusValue(self.rad) self.arctrack.setRadius(self.rad) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: self.constraintrack.off() - self.linetrack.p1(self.center) - self.linetrack.p2(point) - self.linetrack.on() elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): @@ -1295,7 +1223,6 @@ class Polygon(Creator): self.arctrack.on() self.ui.radiusUi() self.step = 1 - self.linetrack.on() msg(translate("draft", "Pick radius:\n")) else: if len(self.tangents) == 1: @@ -1304,17 +1231,13 @@ class Polygon(Creator): self.center = point self.node = [point] self.arctrack.setCenter(self.center) - self.linetrack.p1(self.center) - self.linetrack.p2(self.view.getPoint(arg["Position"][0],arg["Position"][1])) self.arctrack.on() self.ui.radiusUi() self.step = 1 - self.linetrack.on() msg(translate("draft", "Pick radius:\n")) if self.planetrack: self.planetrack.set(point) elif (self.step == 1): # choose radius - self.ui.cross(False) self.drawPolygon() def drawPolygon(self): @@ -1416,7 +1339,6 @@ class Text(Creator): self.node.append(point) self.ui.textUi() self.ui.textValue.setFocus() - self.ui.cross(False) def numericInput(self,numx,numy,numz): '''this function gets called by the toolbar when valid @@ -1425,9 +1347,8 @@ class Text(Creator): self.node.append(point) self.ui.textUi() self.ui.textValue.setFocus() - self.ui.cross(False) - + class Dimension(Creator): "The Draft_Dimension FreeCAD command definition" @@ -1450,7 +1371,6 @@ class Dimension(Creator): Creator.Activated(self,name) self.dimtrack = dimTracker() self.arctrack = arcTracker() - self.constraintrack = lineTracker(dotted=True) self.createOnMeasures() self.finish() else: @@ -1471,7 +1391,6 @@ class Dimension(Creator): self.arcmode = False self.point2 = None self.force = None - self.constraintrack = lineTracker(dotted=True) msg(translate("draft", "Pick first point:\n")) FreeCADGui.draftToolBar.show() @@ -1493,7 +1412,6 @@ class Dimension(Creator): if self.ui: self.dimtrack.finalize() self.arctrack.finalize() - self.constraintrack.finalize() def createOnMeasures(self): for o in FreeCADGui.Selection.getSelection(): @@ -1546,9 +1464,7 @@ class Dimension(Creator): if self.arcmode or self.point2: setMod(arg,MODCONSTRAIN,False) point,ctrlPoint,info = getPoint(self,arg) - self.ui.cross(True) if hasMod(arg,MODALT) and (len(self.node)<3): - self.ui.cross(False) self.dimtrack.off() if not self.altdown: self.altdown = True @@ -1563,7 +1479,6 @@ class Dimension(Creator): v2 = ed.Vertexes[-1].Point self.dimtrack.update([v1,v2,self.cont]) else: - self.ui.cross(True) if self.node and (len(self.edges) < 2): self.dimtrack.on() if len(self.edges) == 2: @@ -1615,15 +1530,11 @@ class Dimension(Creator): self.node[1] = Vector(self.node[0].x,self.node[1].y,self.node[0].z) elif self.force == 2: self.node[1] = Vector(self.node[1].x,self.node[0].y,self.node[0].z) - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() else: self.force = None if self.point2: self.node[1] = self.point2 self.point2 = None - self.constraintrack.off() # update the dimline if self.node and (not self.arcmode): self.dimtrack.update(self.node+[point]+[self.cont]) @@ -1746,8 +1657,6 @@ class Move(Modifier): if self.ui: if not Draft.getSelection(): self.ghost = None - self.linetrack = None - self.constraintrack = None self.ui.selectUi() msg(translate("draft", "Select an object to move\n")) self.call = self.view.addEventCallback("SoEvent",selectObject) @@ -1762,20 +1671,13 @@ class Move(Modifier): self.ui.modUi() self.ui.xValue.setFocus() self.ui.xValue.selectAll() - self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) self.ghost = ghostTracker(self.sel) self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick start point:\n")) - self.ui.cross(True) def finish(self,closed=False,cont=False): if self.ghost: self.ghost.finalize() - if self.linetrack: - self.linetrack.finalize() - if self.constraintrack: - self.constraintrack.finalize() Modifier.finish(self) if cont and self.ui: if self.ui.continueMode: @@ -1806,53 +1708,41 @@ class Move(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - point,ctrlPoint,info = getPoint(self,arg) - self.linetrack.p2(point) - self.ui.cross(True) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: self.constraintrack.off() + self.point,ctrlPoint,info = getPoint(self,arg) if (len(self.node) > 0): last = self.node[len(self.node)-1] - delta = point.sub(last) + delta = self.point.sub(last) self.ghost.trans.translation.setValue([delta.x,delta.y,delta.z]) if self.extendedCopy: if not hasMod(arg,MODALT): self.finish() elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - if (self.node == []): - self.node.append(point) - self.ui.isRelative.show() - self.linetrack.on() - self.ghost.on() - self.linetrack.p1(point) - msg(translate("draft", "Pick end point:\n")) - if self.planetrack: - self.planetrack.set(point) - else: - last = self.node[0] - if self.ui.isCopy.isChecked() or hasMod(arg,MODALT): - self.move(point.sub(last),True) + if self.point: + if (self.node == []): + self.node.append(self.point) + self.ui.isRelative.show() + self.ghost.on() + msg(translate("draft", "Pick end point:\n")) + if self.planetrack: + self.planetrack.set(self.point) else: - self.move(point.sub(last)) - if hasMod(arg,MODALT): - self.extendedCopy = True - else: - self.finish(cont=True) + last = self.node[0] + if self.ui.isCopy.isChecked() or hasMod(arg,MODALT): + self.move(self.point.sub(last),True) + else: + self.move(self.point.sub(last)) + if hasMod(arg,MODALT): + self.extendedCopy = True + else: + self.finish(cont=True) def numericInput(self,numx,numy,numz): "this function gets called by the toolbar when valid x, y, and z have been entered there" - point = Vector(numx,numy,numz) + self.point = Vector(numx,numy,numz) if not self.node: - self.node.append(point) + self.node.append(self.point) self.ui.isRelative.show() self.ui.isCopy.show() - self.linetrack.p1(point) - self.linetrack.on() self.ghost.on() msg(translate("draft", "Pick end point:\n")) else: @@ -1913,9 +1803,7 @@ class Rotate(Modifier): if self.ui: if not Draft.getSelection(): self.ghost = None - self.linetrack = None self.arctrack = None - self.constraintrack = None self.ui.selectUi() msg(translate("draft", "Select an object to rotate\n")) self.call = self.view.addEventCallback("SoEvent",selectObject) @@ -1931,21 +1819,14 @@ class Rotate(Modifier): self.ui.arcUi() self.ui.isCopy.show() self.ui.setTitle("Rotate") - self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) self.arctrack = arcTracker() self.ghost = ghostTracker(self.sel) self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick rotation center:\n")) - self.ui.cross(True) def finish(self,closed=False,cont=False): "finishes the arc" Modifier.finish(self) - if self.linetrack: - self.linetrack.finalize() - if self.constraintrack: - self.constraintrack.finalize() if self.arctrack: self.arctrack.finalize() if self.ghost: @@ -1981,7 +1862,6 @@ class Rotate(Modifier): self.finish() elif arg["Type"] == "SoLocation2Event": point,ctrlPoint,info = getPoint(self,arg) - self.ui.cross(True) # this is to make sure radius is what you see on screen if self.center and DraftVecUtils.dist(point,self.center): viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) @@ -1998,14 +1878,6 @@ class Rotate(Modifier): if (currentrad != 0): angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) else: angle = 0 - self.linetrack.p2(point) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() self.ui.radiusValue.setText("%.2f" % math.degrees(angle)) self.firstangle = angle self.ui.radiusValue.setFocus() @@ -2021,14 +1893,6 @@ class Rotate(Modifier): sweep = angle - self.firstangle self.arctrack.setApertureAngle(sweep) self.ghost.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(plane.axis)),sweep) - self.linetrack.p2(point) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() self.ui.radiusValue.setText("%.2f" % math.degrees(sweep)) self.ui.radiusValue.setFocus() self.ui.radiusValue.selectAll() @@ -2045,10 +1909,8 @@ class Rotate(Modifier): self.ui.radiusUi() self.ui.hasFill.hide() self.ui.labelRadius.setText("Base angle") - self.linetrack.p1(self.center) self.arctrack.setCenter(self.center) self.ghost.trans.center.setValue(self.center.x,self.center.y,self.center.z) - self.linetrack.on() self.step = 1 msg(translate("draft", "Pick base angle:\n")) if self.planetrack: @@ -2085,9 +1947,6 @@ class Rotate(Modifier): self.node = [self.center] self.arctrack.setCenter(self.center) self.ghost.trans.center.setValue(self.center.x,self.center.y,self.center.z) - self.linetrack.p1(self.center) - # self.arctrack.on() - self.linetrack.on() self.ui.radiusUi() self.ui.hasFill.hide() self.ui.labelRadius.setText("Base angle") @@ -2126,7 +1985,6 @@ class Offset(Modifier): self.ghost = None self.linetrack = None self.arctrack = None - self.constraintrack = None self.ui.selectUi() msg(translate("draft", "Select an object to offset\n")) self.call = self.view.addEventCallback("SoEvent",selectObject) @@ -2148,7 +2006,6 @@ class Offset(Modifier): self.constrainSeg = None self.ui.offsetUi() self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) self.faces = False self.shape = self.sel.Shape self.mode = None @@ -2167,7 +2024,6 @@ class Offset(Modifier): self.mode = "Wire" self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick distance:\n")) - self.ui.cross(True) if self.planetrack: self.planetrack.set(self.shape.Vertexes[0].Point) self.running = True @@ -2178,17 +2034,11 @@ class Offset(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": - self.ui.cross(True) point,ctrlPoint,info = getPoint(self,arg) if hasMod(arg,MODCONSTRAIN) and self.constrainSeg: dist = DraftGeomUtils.findPerpendicular(point,self.shape,self.constrainSeg[1]) - e = self.shape.Edges[self.constrainSeg[1]] - self.constraintrack.p1(e.Vertexes[0].Point) - self.constraintrack.p2(point.add(dist[0])) - self.constraintrack.on() else: dist = DraftGeomUtils.findPerpendicular(point,self.shape.Edges) - self.constraintrack.off() if dist: self.ghost.on() if self.mode == "Wire": @@ -2256,8 +2106,6 @@ class Offset(Modifier): if self.running: if self.linetrack: self.linetrack.finalize() - if self.constraintrack: - self.constraintrack.finalize() if self.ghost: self.ghost.finalize() Modifier.finish(self) @@ -2666,7 +2514,6 @@ class Trimex(Modifier): self.placement = None self.ghost = None self.linetrack = None - self.constraintrack = None if self.ui: if not Draft.getSelection(): self.ui.selectUi() @@ -2680,7 +2527,7 @@ class Trimex(Modifier): self.obj = Draft.getSelection()[0] self.ui.trimUi() self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) + if not "Shape" in self.obj.PropertiesList: return if "Placement" in self.obj.PropertiesList: self.placement = self.obj.Placement @@ -2731,15 +2578,13 @@ class Trimex(Modifier): self.cv = None self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick distance:\n")) - self.ui.cross(True) - + def action(self,arg): "scene event handler" if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - self.ui.cross(True) self.shift = hasMod(arg,MODCONSTRAIN) self.alt = hasMod(arg,MODALT) if self.extrudeMode: @@ -2752,9 +2597,6 @@ class Trimex(Modifier): dist = self.extrude(self.shift) else: dist = self.redraw(self.point,self.snapped,self.shift,self.alt) - self.constraintrack.p1(self.point) - self.constraintrack.p2(self.newpoint) - self.constraintrack.on() self.ui.radiusValue.setText("%.2f" % dist) self.ui.radiusValue.setFocus() self.ui.radiusValue.selectAll() @@ -2934,8 +2776,6 @@ class Trimex(Modifier): if self.ui: if self.linetrack: self.linetrack.finalize() - if self.constraintrack: - self.constraintrack.finalize() if self.ghost: for g in self.ghost: g.finalize() @@ -2965,8 +2805,6 @@ class Scale(Modifier): if self.ui: if not Draft.getSelection(): self.ghost = None - self.linetrack = None - self.constraintrack = None self.ui.selectUi() msg(translate("draft", "Select an object to scale\n")) self.call = self.view.addEventCallback("SoEvent",selectObject) @@ -2981,21 +2819,14 @@ class Scale(Modifier): self.ui.modUi() self.ui.xValue.setFocus() self.ui.xValue.selectAll() - self.linetrack = lineTracker() - self.constraintrack = lineTracker(dotted=True) self.ghost = ghostTracker(self.sel) self.call = self.view.addEventCallback("SoEvent",self.action) msg(translate("draft", "Pick base point:\n")) - self.ui.cross(True) def finish(self,closed=False,cont=False): Modifier.finish(self) if self.ghost: self.ghost.finalize() - if self.linetrack: - self.linetrack.finalize() - if self.constraintrack: - self.constraintrack.finalize() if cont and self.ui: if self.ui.continueMode: FreeCADGui.Selection.clearSelection() @@ -3025,14 +2856,6 @@ class Scale(Modifier): self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection point,ctrlPoint,info = getPoint(self,arg,sym=True) - self.linetrack.p2(point) - self.ui.cross(True) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: self.constraintrack.off() if (len(self.node) > 0): last = self.node[len(self.node)-1] delta = point.sub(last) @@ -3050,9 +2873,7 @@ class Scale(Modifier): self.node.append(point) self.ui.isRelative.show() self.ui.isCopy.show() - self.linetrack.on() self.ghost.on() - self.linetrack.p1(point) msg(translate("draft", "Pick scale factor:\n")) else: last = self.node[0] @@ -3072,8 +2893,6 @@ class Scale(Modifier): self.node.append(point) self.ui.isRelative.show() self.ui.isCopy.show() - self.linetrack.p1(point) - self.linetrack.on() self.ghost.on() msg(translate("draft", "Pick scale factor:\n")) else: @@ -3257,12 +3076,10 @@ class Edit(Modifier): self.editpoints.append(self.obj.Dimline) self.editpoints.append(Vector(p[0],p[1],p[2])) self.trackers = [] - self.constraintrack = None if self.editpoints: for ep in range(len(self.editpoints)): self.trackers.append(editTracker(self.editpoints[ep],self.obj.Name, ep,self.obj.ViewObject.LineColor)) - self.constraintrack = lineTracker(dotted=True) self.call = self.view.addEventCallback("SoEvent",self.action) self.running = True plane.save() @@ -3286,8 +3103,6 @@ class Edit(Modifier): if self.trackers: for t in self.trackers: t.finalize() - if self.constraintrack: - self.constraintrack.finalize() if hasattr(self.obj.ViewObject,"Selectable"): self.obj.ViewObject.Selectable = self.selectstate Modifier.finish(self) @@ -3302,13 +3117,7 @@ class Edit(Modifier): elif arg["Type"] == "SoLocation2Event": #mouse movement detection if self.editing != None: point,ctrlPoint,info = getPoint(self,arg) - # Draw constraint tracker line. - if hasMod(arg,MODCONSTRAIN): - self.constraintrack.p1(point) - self.constraintrack.p2(ctrlPoint) - self.constraintrack.on() - else: - self.constraintrack.off() + self.trackers[self.editing].set(point) self.update(self.trackers[self.editing].get()) elif arg["Type"] == "SoMouseButtonEvent": diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index c655c62bd..5ce092b5d 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -401,32 +401,54 @@ class ghostTracker(Tracker): self.trans = coin.SoTransform() self.trans.translation.setValue([0,0,0]) self.children = [self.trans] - self.ivsep = coin.SoSeparator() - try: - if isinstance(sel,Part.Shape): - ivin = coin.SoInput() - ivin.setBuffer(sel.writeInventor()) - ivob = coin.SoDB.readAll(ivin) - self.ivsep.addChild(ivob.getChildren()[1]) - else: - if not isinstance(sel,list): - sel = [sel] - for obj in sel: - self.ivsep.addChild(obj.ViewObject.RootNode.copy()) - except: - print "draft: Couldn't create ghost" - self.children.append(self.ivsep) + rootsep = coin.SoSeparator() + if not isinstance(sel,list): + sel = [sel] + for obj in sel: + rootsep.addChild(self.getNode(obj)) + self.children.append(rootsep) Tracker.__init__(self,children=self.children) def update(self,obj): obj.ViewObject.show() self.finalize() - self.ivsep = coin.SoSeparator() - self.ivsep.addChild(obj.ViewObject.RootNode.copy()) - Tracker.__init__(self,children=[self.ivsep]) + sep = getNode(obj) + Tracker.__init__(self,children=[self.sep]) self.on() obj.ViewObject.hide() + def getNode(self,obj): + "returns a coin node representing the given object" + if isinstance(obj,Part.Shape): + return self.getNodeLight(obj) + elif obj.isDerivedFrom("Part::Feature"): + return self.getNodeLight(obj.Shape) + else: + return self.getNodeFull(obj) + + def getNodeFull(self,obj): + "gets a coin node which is a full copy of the current representation" + sep = coin.SoSeparator() + try: + sep.addChild(obj.ViewObject.RootNode.copy()) + except: + pass + return sep + + def getNodeLight(self,shape): + "extract a lighter version directly from a shape" + sep = coin.SoSeparator() + try: + inputstr = coin.SoInput() + inputstr.setBuffer(shape.writeInventor()) + coinobj = coin.SoDB.readAll(inputstr) + # only add wireframe or full node? + sep.addChild(coinobj.getChildren()[1]) + # sep.addChild(coinobj) + except: + pass + return sep + class editTracker(Tracker): "A node edit tracker" def __init__(self,pos=Vector(0,0,0),name="None",idx=0,objcol=None):