diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index a51d04c6a..0866139b2 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -480,7 +480,7 @@ class Line(Creator): self.finish() elif arg["Type"] == "SoLocation2Event": # mouse movement detection - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) elif arg["Type"] == "SoMouseButtonEvent": # mouse button detection if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): @@ -489,17 +489,17 @@ class Line(Creator): else: if (not self.node) and (not self.support): self.support = getSupport(arg) - point,ctrlPoint,info = getPoint(self,arg) - self.pos = arg["Position"] - self.node.append(point) - self.drawSegment(point) - if (not self.isWire and len(self.node) == 2): - self.finish(False,cont=True) - if (len(self.node) > 2): - if ((point-self.node[0]).Length < Draft.tolerance()): - self.undolast() - self.finish(True,cont=True) - msg(translate("draft", "DWire has been closed\n")) + if self.point: + self.pos = arg["Position"] + self.node.append(self.point) + self.drawSegment(self.point) + if (not self.isWire and len(self.node) == 2): + self.finish(False,cont=True) + if (len(self.node) > 2): + if ((self.point-self.node[0]).Length < Draft.tolerance()): + self.undolast() + self.finish(True,cont=True) + msg(translate("draft", "DWire has been closed\n")) def undolast(self): "undoes last line segment" @@ -550,9 +550,9 @@ class Line(Creator): 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.node.append(point) - self.drawSegment(point) + self.point = Vector(numx,numy,numz) + self.node.append(self.point) + self.drawSegment(self.point) if (not self.isWire and len(self.node) == 2): self.finish(False,cont=True) self.ui.setNextFocus() @@ -593,8 +593,8 @@ class BSpline(Line): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - point,ctrlPoint,info = getPoint(self,arg) - self.bsplinetrack.update(self.node + [point]) + self.point,ctrlPoint,info = getPoint(self,arg) + self.bsplinetrack.update(self.node + [self.point]) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["Position"] == self.pos): @@ -602,21 +602,21 @@ class BSpline(Line): else: if (not self.node) and (not self.support): self.support = getSupport(arg) - point,ctrlPoint,info = getPoint(self,arg) - self.pos = arg["Position"] - self.node.append(point) - self.drawUpdate(point) - if (not self.isWire and len(self.node) == 2): - self.finish(False,cont=True) - if (len(self.node) > 2): - # DNC: allows to close the curve - # by placing ends close to each other - # with tol = Draft tolerance - # old code has been to insensitive - if ((point-self.node[0]).Length < Draft.tolerance()): - self.undolast() - self.finish(True,cont=True) - msg(translate("draft", "Spline has been closed\n")) + if self.point: + self.pos = arg["Position"] + self.node.append(self.point) + self.drawUpdate(self.point) + if (not self.isWire and len(self.node) == 2): + self.finish(False,cont=True) + if (len(self.node) > 2): + # DNC: allows to close the curve + # by placing ends close to each other + # with tol = Draft tolerance + # old code has been to insensitive + if ((self.point-self.node[0]).Length < Draft.tolerance()): + self.undolast() + self.finish(True,cont=True) + msg(translate("draft", "Spline has been closed\n")) def undolast(self): "undoes last line segment" @@ -782,8 +782,8 @@ class Rectangle(Creator): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - point,ctrlPoint,info = getPoint(self,arg,mobile=True) - self.rect.update(point) + self.point,ctrlPoint,info = getPoint(self,arg,mobile=True) + self.rect.update(self.point) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["Position"] == self.pos): @@ -791,13 +791,13 @@ class Rectangle(Creator): else: if (not self.node) and (not self.support): self.support = getSupport(arg) - point,ctrlPoint,info = getPoint(self,arg) - self.appendPoint(point) + if self.point: + self.appendPoint(self.point) 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.appendPoint(point) + self.point = Vector(numx,numy,numz) + self.appendPoint(self.point) def appendPoint(self,point): self.node.append(point) @@ -882,12 +882,12 @@ class Arc(Creator): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) # this is to make sure radius is what you see on screen - if self.center and DraftVecUtils.dist(point,self.center) > 0: - viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) + if self.center and DraftVecUtils.dist(self.point,self.center) > 0: + viewdelta = DraftVecUtils.project(self.point.sub(self.center), plane.axis) if not DraftVecUtils.isNull(viewdelta): - point = point.add(DraftVecUtils.neg(viewdelta)) + self.point = self.point.add(DraftVecUtils.neg(viewdelta)) if (self.step == 0): # choose center if hasMod(arg,MODALT): if not self.altdown: @@ -899,12 +899,12 @@ class Arc(Creator): self.ui.switchUi(False) elif (self.step == 1): # choose radius if len(self.tangents) == 2: - cir = DraftGeomUtils.circleFrom2tan1pt(self.tangents[0], self.tangents[1], point) - self.center = DraftGeomUtils.findClosestCircle(point,cir).Center + cir = DraftGeomUtils.circleFrom2tan1pt(self.tangents[0], self.tangents[1], self.point) + self.center = DraftGeomUtils.findClosestCircle(self.point,cir).Center self.arctrack.setCenter(self.center) elif self.tangents and self.tanpoints: - cir = DraftGeomUtils.circleFrom1tan2pt(self.tangents[0], self.tanpoints[0], point) - self.center = DraftGeomUtils.findClosestCircle(point,cir).Center + cir = DraftGeomUtils.circleFrom1tan2pt(self.tangents[0], self.tanpoints[0], self.point) + self.center = DraftGeomUtils.findClosestCircle(self.point,cir).Center self.arctrack.setCenter(self.center) if hasMod(arg,MODALT): if not self.altdown: @@ -915,100 +915,95 @@ class Arc(Creator): ed = ob.Shape.Edges[num] if len(self.tangents) == 2: cir = DraftGeomUtils.circleFrom3tan(self.tangents[0], self.tangents[1], ed) - cl = DraftGeomUtils.findClosestCircle(point,cir) + cl = DraftGeomUtils.findClosestCircle(self.point,cir) self.center = cl.Center self.rad = cl.Radius self.arctrack.setCenter(self.center) else: self.rad = self.center.add(DraftGeomUtils.findDistance(self.center,ed).sub(self.center)).Length else: - self.rad = DraftVecUtils.dist(point,self.center) + self.rad = DraftVecUtils.dist(self.point,self.center) else: if self.altdown: self.altdown = False - self.rad = DraftVecUtils.dist(point,self.center) + self.rad = DraftVecUtils.dist(self.point,self.center) self.ui.setRadiusValue(self.rad) self.arctrack.setRadius(self.rad) self.linetrack.p1(self.center) - self.linetrack.p2(point) + self.linetrack.p2(self.point) self.linetrack.on() elif (self.step == 2): # choose first angle - currentrad = DraftVecUtils.dist(point,self.center) + currentrad = DraftVecUtils.dist(self.point,self.center) if currentrad != 0: - angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) + angle = DraftVecUtils.angle(plane.u, self.point.sub(self.center), plane.axis) else: angle = 0 - self.linetrack.p2(DraftVecUtils.scaleTo(point.sub(self.center),self.rad).add(self.center)) + self.linetrack.p2(DraftVecUtils.scaleTo(self.point.sub(self.center),self.rad).add(self.center)) self.ui.setRadiusValue(math.degrees(angle)) self.firstangle = angle else: # choose second angle - currentrad = DraftVecUtils.dist(point,self.center) + currentrad = DraftVecUtils.dist(self.point,self.center) if currentrad != 0: - angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) + angle = DraftVecUtils.angle(plane.u, self.point.sub(self.center), plane.axis) else: angle = 0 - self.linetrack.p2(DraftVecUtils.scaleTo(point.sub(self.center),self.rad).add(self.center)) + self.linetrack.p2(DraftVecUtils.scaleTo(self.point.sub(self.center),self.rad).add(self.center)) self.ui.setRadiusValue(math.degrees(angle)) self.updateAngle(angle) self.arctrack.setApertureAngle(self.angle) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - # this is to make sure radius is what you see on screen - if self.center and DraftVecUtils.dist(point,self.center) > 0: - viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) - if not DraftVecUtils.isNull(viewdelta): - point = point.add(DraftVecUtils.neg(viewdelta)) - if (self.step == 0): # choose center - if not self.support: - self.support = getSupport(arg) - if hasMod(arg,MODALT): - snapped=self.view.getObjectInfo((arg["Position"][0],arg["Position"][1])) - if snapped: - ob = self.doc.getObject(snapped['Object']) - num = int(snapped['Component'].lstrip('Edge'))-1 - ed = ob.Shape.Edges[num] - self.tangents.append(ed) - if len(self.tangents) == 2: - self.arctrack.on() - self.ui.radiusUi() - self.step = 1 - self.linetrack.on() - msg(translate("draft", "Pick radius:\n")) - else: - if len(self.tangents) == 1: - self.tanpoints.append(point) + if self.point: + if (self.step == 0): # choose center + if not self.support: + self.support = getSupport(arg) + if hasMod(arg,MODALT): + snapped=self.view.getObjectInfo((arg["Position"][0],arg["Position"][1])) + if snapped: + ob = self.doc.getObject(snapped['Object']) + num = int(snapped['Component'].lstrip('Edge'))-1 + ed = ob.Shape.Edges[num] + self.tangents.append(ed) + if len(self.tangents) == 2: + self.arctrack.on() + self.ui.radiusUi() + self.step = 1 + self.linetrack.on() + msg(translate("draft", "Pick radius:\n")) else: - self.center = point - self.node = [point] - self.arctrack.setCenter(self.center) + if len(self.tangents) == 1: + self.tanpoints.append(self.point) + else: + self.center = self.point + self.node = [self.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(self.point) + elif (self.step == 1): # choose radius + if self.closedCircle: + self.drawArc() + else: + self.ui.labelRadius.setText("Start angle") 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 - if self.closedCircle: + self.linetrack.on() + self.step = 2 + msg(translate("draft", "Pick start angle:\n")) + elif (self.step == 2): # choose first angle + self.ui.labelRadius.setText("Aperture") + self.step = 3 + # scale center->point vector for proper display + # u = DraftVecUtils.scaleTo(self.point.sub(self.center), self.rad) obsolete? + self.arctrack.setStartAngle(self.firstangle) + msg(translate("draft", "Pick aperture:\n")) + else: # choose second angle + self.step = 4 self.drawArc() - else: - self.ui.labelRadius.setText("Start angle") - self.linetrack.p1(self.center) - self.linetrack.on() - self.step = 2 - msg(translate("draft", "Pick start angle:\n")) - elif (self.step == 2): # choose first angle - self.ui.labelRadius.setText("Aperture") - self.step = 3 - # scale center->point vector for proper display - u = DraftVecUtils.scaleTo(point.sub(self.center), self.rad) - self.arctrack.setStartAngle(self.firstangle) - msg(translate("draft", "Pick aperture:\n")) - else: # choose second angle - self.step = 4 - self.drawArc() def drawArc(self): "actually draws the FreeCAD object" @@ -1152,12 +1147,12 @@ class Polygon(Creator): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) # this is to make sure radius is what you see on screen - if self.center and DraftVecUtils.dist(point,self.center) > 0: - viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) + if self.center and DraftVecUtils.dist(self.point,self.center) > 0: + viewdelta = DraftVecUtils.project(self.point.sub(self.center), plane.axis) if not DraftVecUtils.isNull(viewdelta): - point = point.add(DraftVecUtils.neg(viewdelta)) + self.point = self.point.add(DraftVecUtils.neg(viewdelta)) if (self.step == 0): # choose center if hasMod(arg,MODALT): if not self.altdown: @@ -1169,12 +1164,12 @@ class Polygon(Creator): self.ui.switchUi(False) else: # choose radius if len(self.tangents) == 2: - cir = DraftGeomUtils.circleFrom2tan1pt(self.tangents[0], self.tangents[1], point) - self.center = DraftGeomUtils.findClosestCircle(point,cir).Center + cir = DraftGeomUtils.circleFrom2tan1pt(self.tangents[0], self.tangents[1], self.point) + self.center = DraftGeomUtils.findClosestCircle(self.point,cir).Center self.arctrack.setCenter(self.center) elif self.tangents and self.tanpoints: - cir = DraftGeomUtils.circleFrom1tan2pt(self.tangents[0], self.tanpoints[0], point) - self.center = DraftGeomUtils.findClosestCircle(point,cir).Center + cir = DraftGeomUtils.circleFrom1tan2pt(self.tangents[0], self.tanpoints[0], self.point) + self.center = DraftGeomUtils.findClosestCircle(self.point,cir).Center self.arctrack.setCenter(self.center) if hasMod(arg,MODALT): if not self.altdown: @@ -1186,59 +1181,54 @@ class Polygon(Creator): ed = ob.Shape.Edges[num] if len(self.tangents) == 2: cir = DraftGeomUtils.circleFrom3tan(self.tangents[0], self.tangents[1], ed) - cl = DraftGeomUtils.findClosestCircle(point,cir) + cl = DraftGeomUtils.findClosestCircle(self.point,cir) self.center = cl.Center self.rad = cl.Radius self.arctrack.setCenter(self.center) else: self.rad = self.center.add(DraftGeomUtils.findDistance(self.center,ed).sub(self.center)).Length else: - self.rad = DraftVecUtils.dist(point,self.center) + self.rad = DraftVecUtils.dist(self.point,self.center) else: if self.altdown: self.altdown = False - self.rad = DraftVecUtils.dist(point,self.center) + self.rad = DraftVecUtils.dist(self.point,self.center) self.ui.setRadiusValue(self.rad) self.arctrack.setRadius(self.rad) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - # this is to make sure radius is what you see on screen - if self.center and DraftVecUtils.dist(point,self.center) > 0: - viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) - if not DraftVecUtils.isNull(viewdelta): - point = point.add(DraftVecUtils.neg(viewdelta)) - if (self.step == 0): # choose center - if (not self.node) and (not self.support): - self.support = getSupport(arg) - if hasMod(arg,MODALT): - snapped=self.view.getObjectInfo((arg["Position"][0],arg["Position"][1])) - if snapped: - ob = self.doc.getObject(snapped['Object']) - num = int(snapped['Component'].lstrip('Edge'))-1 - ed = ob.Shape.Edges[num] - self.tangents.append(ed) - if len(self.tangents) == 2: - self.arctrack.on() - self.ui.radiusUi() - self.step = 1 - msg(translate("draft", "Pick radius:\n")) - else: - if len(self.tangents) == 1: - self.tanpoints.append(point) + if self.point: + if (self.step == 0): # choose center + if (not self.node) and (not self.support): + self.support = getSupport(arg) + if hasMod(arg,MODALT): + snapped=self.view.getObjectInfo((arg["Position"][0],arg["Position"][1])) + if snapped: + ob = self.doc.getObject(snapped['Object']) + num = int(snapped['Component'].lstrip('Edge'))-1 + ed = ob.Shape.Edges[num] + self.tangents.append(ed) + if len(self.tangents) == 2: + self.arctrack.on() + self.ui.radiusUi() + self.step = 1 + msg(translate("draft", "Pick radius:\n")) else: - self.center = point - self.node = [point] - self.arctrack.setCenter(self.center) - self.arctrack.on() - self.ui.radiusUi() - self.step = 1 - msg(translate("draft", "Pick radius:\n")) - if self.planetrack: - self.planetrack.set(point) - elif (self.step == 1): # choose radius - self.drawPolygon() + if len(self.tangents) == 1: + self.tanpoints.append(self.point) + else: + self.center = self.point + self.node = [self.point] + self.arctrack.setCenter(self.center) + self.arctrack.on() + self.ui.radiusUi() + self.step = 1 + msg(translate("draft", "Pick radius:\n")) + if self.planetrack: + self.planetrack.set(self.point) + elif (self.step == 1): # choose radius + self.drawPolygon() def drawPolygon(self): "actually draws the FreeCAD object" @@ -1332,19 +1322,19 @@ class Text(Creator): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - self.node.append(point) - self.ui.textUi() - self.ui.textValue.setFocus() + if self.point: + self.node.append(self.point) + self.ui.textUi() + self.ui.textValue.setFocus() 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.node.append(point) + self.point = Vector(numx,numy,numz) + self.node.append(self.point) self.ui.textUi() self.ui.textValue.setFocus() @@ -1463,7 +1453,7 @@ class Dimension(Creator): shift = hasMod(arg,MODCONSTRAIN) if self.arcmode or self.point2: setMod(arg,MODCONSTRAIN,False) - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) if hasMod(arg,MODALT) and (len(self.node)<3): self.dimtrack.off() if not self.altdown: @@ -1484,9 +1474,9 @@ class Dimension(Creator): if len(self.edges) == 2: # angular dimension self.dimtrack.off() - r = point.sub(self.center) + r = self.point.sub(self.center) self.arctrack.setRadius(r.Length) - a = self.arctrack.getAngle(point) + a = self.arctrack.getAngle(self.point) pair = DraftGeomUtils.getBoundaryAngles(a,self.pts) if not (pair[0] < a < pair[1]): self.angledata = [4*math.pi-pair[0],2*math.pi-pair[1]] @@ -1498,12 +1488,12 @@ class Dimension(Creator): self.altdown = False self.ui.switchUi(False) if self.dir: - point = self.node[0].add(DraftVecUtils.project(point.sub(self.node[0]),self.dir)) + self.point = self.node[0].add(DraftVecUtils.project(self.point.sub(self.node[0]),self.dir)) if len(self.node) == 2: if self.arcmode and self.edges: cen = self.edges[0].Curve.Center rad = self.edges[0].Curve.Radius - baseray = point.sub(cen) + baseray = self.point.sub(cen) v2 = DraftVecUtils.scaleTo(baseray,rad) v1 = DraftVecUtils.neg(v2) if shift: @@ -1521,7 +1511,7 @@ class Dimension(Creator): else: self.node[1] = self.point2 if not self.force: - a=abs(point.sub(self.node[0]).getAngle(plane.u)) + a=abs(self.point.sub(self.node[0]).getAngle(plane.u)) if (a > math.pi/4) and (a <= 0.75*math.pi): self.force = 1 else: @@ -1537,93 +1527,91 @@ class Dimension(Creator): self.point2 = None # update the dimline if self.node and (not self.arcmode): - self.dimtrack.update(self.node+[point]+[self.cont]) + self.dimtrack.update(self.node+[self.point]+[self.cont]) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - if (not self.node) and (not self.support): - self.support = getSupport(arg) - if hasMod(arg,MODALT) and (len(self.node)<3): - print "snapped: ",info - if info: - ob = self.doc.getObject(info['Object']) - if 'Edge' in info['Component']: - num = int(info['Component'].lstrip('Edge'))-1 - ed = ob.Shape.Edges[num] - v1 = ed.Vertexes[0].Point - v2 = ed.Vertexes[-1].Point - i1 = i2 = None - for i in range(len(ob.Shape.Vertexes)): - if v1 == ob.Shape.Vertexes[i].Point: - i1 = i - if v2 == ob.Shape.Vertexes[i].Point: - i2 = i - if (i1 != None) and (i2 != None): - self.indices.append(num) - if not self.edges: - # nothing snapped yet, we treat it as normal edge-snapped dimension - self.node = [v1,v2] - self.link = [ob,i1,i2] - self.edges.append(ed) - if isinstance(ed.Curve,Part.Circle): - # snapped edge is an arc - self.arcmode = "diameter" - self.link = [ob,num] - else: - # there is already a snapped edge, so we start angular dimension - self.edges.append(ed) - self.node.extend([v1,v2]) # self.node now has the 4 endpoints - c = DraftGeomUtils.findIntersection(self.node[0], - self.node[1], - self.node[2], - self.node[3], - True,True) - if c: - self.center = c[0] - self.arctrack.setCenter(self.center) - self.arctrack.on() - for e in self.edges: - for v in e.Vertexes: - self.pts.append(self.arctrack.getAngle(v.Point)) - self.link = [self.link[0],ob] + if self.point: + if (not self.node) and (not self.support): + self.support = getSupport(arg) + if hasMod(arg,MODALT) and (len(self.node)<3): + print "snapped: ",info + if info: + ob = self.doc.getObject(info['Object']) + if 'Edge' in info['Component']: + num = int(info['Component'].lstrip('Edge'))-1 + ed = ob.Shape.Edges[num] + v1 = ed.Vertexes[0].Point + v2 = ed.Vertexes[-1].Point + i1 = i2 = None + for i in range(len(ob.Shape.Vertexes)): + if v1 == ob.Shape.Vertexes[i].Point: + i1 = i + if v2 == ob.Shape.Vertexes[i].Point: + i2 = i + if (i1 != None) and (i2 != None): + self.indices.append(num) + if not self.edges: + # nothing snapped yet, we treat it as normal edge-snapped dimension + self.node = [v1,v2] + self.link = [ob,i1,i2] + self.edges.append(ed) + if isinstance(ed.Curve,Part.Circle): + # snapped edge is an arc + self.arcmode = "diameter" + self.link = [ob,num] else: - msg(translate("draft", "Edges don't intersect!\n")) - self.finish() - self.dimtrack.on() - else: - if self.dir: - point = self.node[0].add(DraftVecUtils.project(point.sub(self.node[0]),self.dir)) - self.node.append(point) - #print "node",self.node - self.dimtrack.update(self.node) - if (len(self.node) == 2): - self.point2 = self.node[1] - if (len(self.node) == 1): - self.dimtrack.on() - if self.planetrack: - self.planetrack.set(self.node[0]) - elif (len(self.node) == 2) and self.cont: - self.node.append(self.cont) - self.createObject() - if not self.cont: self.finish() - elif (len(self.node) == 3): - # for unlinked arc mode: - # if self.arcmode: - # v = self.node[1].sub(self.node[0]) - # v = DraftVecUtils.scale(v,0.5) - # cen = self.node[0].add(v) - # self.node = [self.node[0],self.node[1],cen] - self.createObject() - if not self.cont: self.finish() - elif self.angledata: - self.node.append(point) - self.createObject() - self.finish() + # there is already a snapped edge, so we start angular dimension + self.edges.append(ed) + self.node.extend([v1,v2]) # self.node now has the 4 endpoints + c = DraftGeomUtils.findIntersection(self.node[0], + self.node[1], + self.node[2], + self.node[3], + True,True) + if c: + self.center = c[0] + self.arctrack.setCenter(self.center) + self.arctrack.on() + for e in self.edges: + for v in e.Vertexes: + self.pts.append(self.arctrack.getAngle(v.Point)) + self.link = [self.link[0],ob] + else: + msg(translate("draft", "Edges don't intersect!\n")) + self.finish() + self.dimtrack.on() + else: + self.node.append(self.point) + #print "node",self.node + self.dimtrack.update(self.node) + if (len(self.node) == 2): + self.point2 = self.node[1] + if (len(self.node) == 1): + self.dimtrack.on() + if self.planetrack: + self.planetrack.set(self.node[0]) + elif (len(self.node) == 2) and self.cont: + self.node.append(self.cont) + self.createObject() + if not self.cont: self.finish() + elif (len(self.node) == 3): + # for unlinked arc mode: + # if self.arcmode: + # v = self.node[1].sub(self.node[0]) + # v = DraftVecUtils.scale(v,0.5) + # cen = self.node[0].add(v) + # self.node = [self.node[0],self.node[1],cen] + self.createObject() + if not self.cont: self.finish() + elif self.angledata: + self.node.append(self.point) + self.createObject() + self.finish() 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.node.append(point) + self.point = Vector(numx,numy,numz) + self.node.append(self.point) self.dimtrack.update(self.node) if (len(self.node) == 1): self.dimtrack.on() @@ -1708,11 +1696,15 @@ class Move(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection + if self.ghost: + self.ghost.off() self.point,ctrlPoint,info = getPoint(self,arg) if (len(self.node) > 0): last = self.node[len(self.node)-1] delta = self.point.sub(last) - self.ghost.trans.translation.setValue([delta.x,delta.y,delta.z]) + if self.ghost: + self.ghost.move(delta) + self.ghost.on() if self.extendedCopy: if not hasMod(arg,MODALT): self.finish() elif arg["Type"] == "SoMouseButtonEvent": @@ -1721,7 +1713,8 @@ class Move(Modifier): if (self.node == []): self.node.append(self.point) self.ui.isRelative.show() - self.ghost.on() + if self.ghost: + self.ghost.on() msg(translate("draft", "Pick end point:\n")) if self.planetrack: self.planetrack.set(self.point) @@ -1861,12 +1854,14 @@ class Rotate(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": - point,ctrlPoint,info = getPoint(self,arg) + if self.ghost: + self.ghost.off() + self.point,ctrlPoint,info = getPoint(self,arg) # 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) + if self.center and DraftVecUtils.dist(self.point,self.center): + viewdelta = DraftVecUtils.project(self.point.sub(self.center), plane.axis) if not DraftVecUtils.isNull(viewdelta): - point = point.add(DraftVecUtils.neg(viewdelta)) + self.point = self.point.add(DraftVecUtils.neg(viewdelta)) if self.extendedCopy: if not hasMod(arg,MODALT): self.step = 3 @@ -1874,79 +1869,81 @@ class Rotate(Modifier): if (self.step == 0): pass elif (self.step == 1): - currentrad = DraftVecUtils.dist(point,self.center) + currentrad = DraftVecUtils.dist(self.point,self.center) if (currentrad != 0): - angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) + angle = DraftVecUtils.angle(plane.u, self.point.sub(self.center), plane.axis) else: angle = 0 self.ui.radiusValue.setText("%.2f" % math.degrees(angle)) self.firstangle = angle self.ui.radiusValue.setFocus() self.ui.radiusValue.selectAll() elif (self.step == 2): - currentrad = DraftVecUtils.dist(point,self.center) + currentrad = DraftVecUtils.dist(self.point,self.center) if (currentrad != 0): - angle = DraftVecUtils.angle(plane.u, point.sub(self.center), plane.axis) + angle = DraftVecUtils.angle(plane.u, self.point.sub(self.center), plane.axis) else: angle = 0 if (angle < self.firstangle): sweep = (2*math.pi-self.firstangle)+angle else: sweep = angle - self.firstangle self.arctrack.setApertureAngle(sweep) - self.ghost.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(plane.axis)),sweep) + if self.ghost: + self.ghost.rotate(plane.axis,sweep) + self.ghost.on() self.ui.radiusValue.setText("%.2f" % math.degrees(sweep)) self.ui.radiusValue.setFocus() self.ui.radiusValue.selectAll() elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - point,ctrlPoint,info = getPoint(self,arg) - if self.center and DraftVecUtils.dist(point,self.center): - viewdelta = DraftVecUtils.project(point.sub(self.center), plane.axis) - if not DraftVecUtils.isNull(viewdelta): point = point.add(DraftVecUtils.neg(viewdelta)) - if (self.step == 0): - self.center = point - self.node = [point] - self.ui.radiusUi() - self.ui.hasFill.hide() - self.ui.labelRadius.setText("Base angle") - self.arctrack.setCenter(self.center) - self.ghost.trans.center.setValue(self.center.x,self.center.y,self.center.z) - self.step = 1 - msg(translate("draft", "Pick base angle:\n")) - if self.planetrack: - self.planetrack.set(point) - elif (self.step == 1): - self.ui.labelRadius.setText("Rotation") - self.rad = DraftVecUtils.dist(point,self.center) - self.arctrack.on() - self.arctrack.setStartPoint(point) - self.ghost.on() - self.step = 2 - msg(translate("draft", "Pick rotation angle:\n")) - else: - currentrad = DraftVecUtils.dist(point,self.center) - angle = point.sub(self.center).getAngle(plane.u) - if DraftVecUtils.project(point.sub(self.center), plane.v).getAngle(plane.v) > 1: - angle = -angle - if (angle < self.firstangle): - sweep = (2*math.pi-self.firstangle)+angle + if self.point: + if (self.step == 0): + self.center = self.point + self.node = [self.point] + self.ui.radiusUi() + self.ui.hasFill.hide() + self.ui.labelRadius.setText("Base angle") + self.arctrack.setCenter(self.center) + if self.ghost: + self.ghost.center(self.center) + self.step = 1 + msg(translate("draft", "Pick base angle:\n")) + if self.planetrack: + self.planetrack.set(self.point) + elif (self.step == 1): + self.ui.labelRadius.setText("Rotation") + self.rad = DraftVecUtils.dist(self.point,self.center) + self.arctrack.on() + self.arctrack.setStartPoint(self.point) + if self.ghost: + self.ghost.on() + self.step = 2 + msg(translate("draft", "Pick rotation angle:\n")) else: - sweep = angle - self.firstangle - if self.ui.isCopy.isChecked() or hasMod(arg,MODALT): - self.rot(sweep,True) - else: - self.rot(sweep) - if hasMod(arg,MODALT): - self.extendedCopy = True - else: - self.finish(cont=True) + currentrad = DraftVecUtils.dist(self.point,self.center) + angle = self.point.sub(self.center).getAngle(plane.u) + if DraftVecUtils.project(self.point.sub(self.center), plane.v).getAngle(plane.v) > 1: + angle = -angle + if (angle < self.firstangle): + sweep = (2*math.pi-self.firstangle)+angle + else: + sweep = angle - self.firstangle + if self.ui.isCopy.isChecked() or hasMod(arg,MODALT): + self.rot(sweep,True) + else: + self.rot(sweep) + 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" self.center = Vector(numx,numy,numz) self.node = [self.center] self.arctrack.setCenter(self.center) - self.ghost.trans.center.setValue(self.center.x,self.center.y,self.center.z) + if self.ghost: + self.ghost.center(self.center) self.ui.radiusUi() self.ui.hasFill.hide() self.ui.labelRadius.setText("Base angle") @@ -1960,7 +1957,8 @@ class Rotate(Modifier): self.firstangle = math.radians(rad) self.arctrack.setStartAngle(self.firstangle) self.arctrack.on() - self.ghost.on() + if self.ghost: + self.ghost.on() self.step = 2 msg(translate("draft", "Pick rotation angle:\n")) else: @@ -2034,17 +2032,17 @@ class Offset(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": - point,ctrlPoint,info = getPoint(self,arg) + self.point,ctrlPoint,info = getPoint(self,arg) if hasMod(arg,MODCONSTRAIN) and self.constrainSeg: - dist = DraftGeomUtils.findPerpendicular(point,self.shape,self.constrainSeg[1]) + dist = DraftGeomUtils.findPerpendicular(self.point,self.shape,self.constrainSeg[1]) else: - dist = DraftGeomUtils.findPerpendicular(point,self.shape.Edges) + dist = DraftGeomUtils.findPerpendicular(self.point,self.shape.Edges) if dist: self.ghost.on() if self.mode == "Wire": d = DraftVecUtils.neg(dist[0]) - v1 = DraftGeomUtils.getTangent(self.shape.Edges[0],point) - v2 = DraftGeomUtils.getTangent(self.shape.Edges[dist[1]],point) + v1 = DraftGeomUtils.getTangent(self.shape.Edges[0],self.point) + v2 = DraftGeomUtils.getTangent(self.shape.Edges[dist[1]],self.point) a = -DraftVecUtils.angle(v1,v2) self.dvec = DraftVecUtils.rotate(d,a,plane.axis) occmode = self.ui.occOffset.isChecked() @@ -2052,7 +2050,7 @@ class Offset(Modifier): elif self.mode == "BSpline": d = DraftVecUtils.neg(dist[0]) e = self.shape.Edges[0] - basetan = DraftGeomUtils.getTangent(e,point) + basetan = DraftGeomUtils.getTangent(e,self.point) self.npts = [] for p in self.sel.Points: currtan = DraftGeomUtils.getTangent(e,p) @@ -2061,12 +2059,12 @@ class Offset(Modifier): self.npts.append(p.add(self.dvec)) self.ghost.update(self.npts) elif self.mode == "Circle": - self.dvec = point.sub(self.center).Length + self.dvec = self.point.sub(self.center).Length self.ghost.setRadius(self.dvec) self.constrainSeg = dist self.linetrack.on() - self.linetrack.p1(point) - self.linetrack.p2(point.add(dist[0])) + self.linetrack.p1(self.point) + self.linetrack.p2(self.point.add(dist[0])) self.ui.radiusValue.setText("%.2f" % dist[0].Length) else: self.dvec = None @@ -2855,52 +2853,59 @@ class Scale(Modifier): if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection - point,ctrlPoint,info = getPoint(self,arg,sym=True) + if self.ghost: + self.ghost.off() + self.point,ctrlPoint,info = getPoint(self,arg,sym=True) if (len(self.node) > 0): last = self.node[len(self.node)-1] - delta = point.sub(last) - self.ghost.trans.scaleFactor.setValue([delta.x,delta.y,delta.z]) - corr = Vector(self.node[0].x,self.node[0].y,self.node[0].z) - corr.scale(delta.x,delta.y,delta.z) - corr = DraftVecUtils.neg(corr.sub(self.node[0])) - self.ghost.trans.translation.setValue([corr.x,corr.y,corr.z]) + delta = self.point.sub(last) + if self.ghost: + self.ghost.scale(delta) + # calculate a correction factor depending on the scaling center + corr = Vector(self.node[0].x,self.node[0].y,self.node[0].z) + corr.scale(delta.x,delta.y,delta.z) + corr = DraftVecUtils.neg(corr.sub(self.node[0])) + self.ghost.move(corr) + self.ghost.on() 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,sym=True) - if (self.node == []): - self.node.append(point) - self.ui.isRelative.show() - self.ui.isCopy.show() - self.ghost.on() - msg(translate("draft", "Pick scale factor:\n")) - else: - last = self.node[0] - if self.ui.isCopy.isChecked() or hasMod(arg,MODALT): - self.scale(point.sub(last),True) + if self.point: + if (self.node == []): + self.node.append(self.point) + self.ui.isRelative.show() + self.ui.isCopy.show() + if self.ghost: + self.ghost.on() + msg(translate("draft", "Pick scale factor:\n")) else: - self.scale(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.scale(self.point.sub(last),True) + else: + self.scale(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.ghost.on() + if self.ghost: + self.ghost.on() msg(translate("draft", "Pick scale factor:\n")) else: last = self.node[-1] if self.ui.isCopy.isChecked(): - self.scale(point.sub(last),True) + self.scale(self.point.sub(last),True) else: - self.scale(point.sub(last)) + self.scale(self.point.sub(last)) self.finish(cont=True) @@ -3116,9 +3121,8 @@ class Edit(Modifier): self.finish() elif arg["Type"] == "SoLocation2Event": #mouse movement detection if self.editing != None: - point,ctrlPoint,info = getPoint(self,arg) - - self.trackers[self.editing].set(point) + self.point,ctrlPoint,info = getPoint(self,arg) + self.trackers[self.editing].set(self.point) self.update(self.trackers[self.editing].get()) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): @@ -3128,9 +3132,9 @@ class Edit(Modifier): sel = sel[0] if sel.ObjectName == self.obj.Name: if self.ui.addButton.isChecked(): - point,ctrlPoint,info = getPoint(self,arg) - self.pos = arg["Position"] - self.addPoint(point) + if self.point: + self.pos = arg["Position"] + self.addPoint(self.point) elif self.ui.delButton.isChecked(): if 'EditNode' in sel.SubElementNames[0]: self.delPoint(int(sel.SubElementNames[0][8:])) diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index 5ce092b5d..be15757b6 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -410,6 +410,7 @@ class ghostTracker(Tracker): Tracker.__init__(self,children=self.children) def update(self,obj): + "recreates the ghost from a new object" obj.ViewObject.show() self.finalize() sep = getNode(obj) @@ -417,16 +418,32 @@ class ghostTracker(Tracker): 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 rotate(self,axis,angle): + "rotates the ghost of a given angle" + self.trans.rotation.setValue(coin.SbVec3f(DraftVecUtils.tup(axis)),angle) + + def center(self,point): + "sets the rotation/scale center of the ghost" + self.trans.center.setValue(point.x,point.y,point.z) + + def scale(self,delta): + "scales the ghost by the given factor" + self.trans.scaleFactor.setValue([delta.x,delta.y,delta.z]) + 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) + return self.getNodeFull(obj) else: return self.getNodeFull(obj) - def getNodeFull(self,obj): + def getNode(self,obj): "gets a coin node which is a full copy of the current representation" sep = coin.SoSeparator() try: @@ -437,6 +454,7 @@ class ghostTracker(Tracker): def getNodeLight(self,shape): "extract a lighter version directly from a shape" + # very error-prone, will be obsoleted ASAP sep = coin.SoSeparator() try: inputstr = coin.SoInput()