def resetTrackersBezier(self, obj): # in future move tracker definition to DraftTrackers knotmarkers = ( coin.SoMarkerSet.DIAMOND_FILLED_9_9, #sharp coin.SoMarkerSet.SQUARE_FILLED_9_9, #tangent coin.SoMarkerSet.HOURGLASS_FILLED_9_9) #symmetric polemarker = coin.SoMarkerSet.CIRCLE_FILLED_9_9 #pole self.trackers[obj.Name] = [] cont = obj.Continuity firstknotcont = cont[-1] if (obj.Closed and cont) else 0 pointswithmarkers = [(obj.Shape.Edges[0].Curve.getPole(1), knotmarkers[firstknotcont])] for edgeindex, edge in enumerate(obj.Shape.Edges): poles = edge.Curve.getPoles() pointswithmarkers.extend([(point, polemarker) for point in poles[1:-1]]) if not obj.Closed or len(obj.Shape.Edges) > edgeindex + 1: knotmarkeri = cont[edgeindex] if len(cont) > edgeindex else 0 pointswithmarkers.append((poles[-1], knotmarkers[knotmarkeri])) for index, pwm in enumerate(pointswithmarkers): p, marker = pwm p = obj.Placement.inverse().multVec(p) p = obj.getGlobalPlacement().multVec(p) self.trackers[obj.Name].append( trackers.editTracker(p, obj.Name, index, obj.ViewObject.LineColor, marker=marker))
def setTrackers(self, obj, points=None): """Set Edit Trackers for editpoints collected from self.obj.""" if utils.get_type(obj) == "BezCurve": return self.resetTrackersBezier(obj) if points is None or len(points) == 0: _wrn = translate("draft", "No edit point found for selected object") App.Console.PrintWarning(_wrn + "\n") # do not finish if some trackers are still present if self.trackers == {'object': []}: self.finish() return self.trackers[obj.Name] = [] if obj.Name in self.trackers: self.removeTrackers(obj) for ep in range(len(points)): self.trackers[obj.Name].append(trackers.editTracker(pos=points[ep], name=obj.Name, idx=ep))
def addPoint(self, point): """Add point to defined selection rectangle.""" if self.step == 1: # first rctangle point _msg( translate("draft", "Pick opposite point " "of selection rectangle")) self.ui.setRelative() self.rectracker.setorigin(point) self.rectracker.on() if self.planetrack: self.planetrack.set(point) self.step = 2 elif self.step == 2: # second rectangle point _msg(translate("draft", "Pick start point of displacement")) self.rectracker.off() nodes = [] self.ops = [] for sel in self.sel: o = sel[0] vispla = sel[1] tp = utils.getType(o) if tp in ["Wire", "BSpline", "BezCurve"]: np = [] iso = False for p in o.Points: p = o.Placement.multVec(p) p = vispla.multVec(p) isi = self.rectracker.isInside(p) np.append(isi) if isi: iso = True nodes.append(p) if iso: self.ops.append([o, np]) elif tp in ["Rectangle"]: p1 = App.Vector(0, 0, 0) p2 = App.Vector(o.Length.Value, 0, 0) p3 = App.Vector(o.Length.Value, o.Height.Value, 0) p4 = App.Vector(0, o.Height.Value, 0) np = [] iso = False for p in [p1, p2, p3, p4]: p = o.Placement.multVec(p) p = vispla.multVec(p) isi = self.rectracker.isInside(p) np.append(isi) if isi: iso = True nodes.append(p) if iso: self.ops.append([o, np]) elif tp in ["Sketch"]: np = [] iso = False for p in o.Shape.Vertexes: p = vispla.multVec(p.Point) isi = self.rectracker.isInside(p) np.append(isi) if isi: iso = True nodes.append(p) if iso: self.ops.append([o, np]) else: p = o.Placement.Base p = vispla.multVec(p) if self.rectracker.isInside(p): self.ops.append([o]) nodes.append(p) for n in nodes: nt = trackers.editTracker(n, inactive=True) nt.on() self.nodetracker.append(nt) self.step = 3 elif self.step == 3: # first point of displacement line _msg(translate("draft", "Pick end point of displacement")) self.displacement = point # print("first point:", point) self.node = [point] self.step = 4 elif self.step == 4: # print("second point:", point) self.displacement = point.sub(self.displacement) self.doStretch() if self.point: self.ui.redraw()