def action(self, arg): """Handle the 3D scene events. This is installed as an EventCallback in the Inventor view. Parameters ---------- arg: dict Dictionary with strings that indicates the type of event received from the 3D view. """ import DraftGeomUtils plane = App.DraftWorkingPlane if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() elif arg["Type"] == "SoLocation2Event": self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg) if (gui_tool_utils.hasMod(arg, gui_tool_utils.MODCONSTRAIN) and self.constrainSeg): dist = DraftGeomUtils.findPerpendicular(self.point, self.shape, self.constrainSeg[1]) else: dist = DraftGeomUtils.findPerpendicular(self.point, self.shape.Edges) if dist: self.ghost.on() if self.mode == "Wire": d = dist[0].negative() v1 = DraftGeomUtils.getTangent(self.shape.Edges[0], self.point) v2 = DraftGeomUtils.getTangent(self.shape.Edges[dist[1]], self.point) a = -DraftVecUtils.angle(v1, v2, plane.axis) self.dvec = DraftVecUtils.rotate(d, a, plane.axis) occmode = self.ui.occOffset.isChecked() utils.param.SetBool("Offset_OCC", occmode) _wire = DraftGeomUtils.offsetWire(self.shape, self.dvec, occ=occmode) self.ghost.update(_wire, forceclosed=occmode) elif self.mode == "BSpline": d = dist[0].negative() e = self.shape.Edges[0] basetan = DraftGeomUtils.getTangent(e, self.point) self.npts = [] for p in self.sel.Points: currtan = DraftGeomUtils.getTangent(e, p) a = -DraftVecUtils.angle(currtan, basetan, plane.axis) self.dvec = DraftVecUtils.rotate(d, a, plane.axis) self.npts.append(p.add(self.dvec)) self.ghost.update(self.npts) elif self.mode == "Circle": self.dvec = self.point.sub(self.center).Length self.ghost.setRadius(self.dvec) self.constrainSeg = dist self.linetrack.on() self.linetrack.p1(self.point) self.linetrack.p2(self.point.add(dist[0])) self.ui.setRadiusValue(dist[0].Length, unit="Length") else: self.dvec = None self.ghost.off() self.constrainSeg = None self.linetrack.off() self.ui.radiusValue.setText("off") self.ui.radiusValue.setFocus() self.ui.radiusValue.selectAll() if self.extendedCopy: if not gui_tool_utils.hasMod(arg, gui_tool_utils.MODALT): self.finish() gui_tool_utils.redraw3DView() elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): copymode = False occmode = self.ui.occOffset.isChecked() utils.param.SetBool("Offset_OCC", occmode) if (gui_tool_utils.hasMod(arg, gui_tool_utils.MODALT) or self.ui.isCopy.isChecked()): copymode = True Gui.addModule("Draft") if self.npts: # _msg("offset:npts= " + str(self.npts)) _cmd = 'Draft.offset' _cmd += '(' _cmd += 'FreeCAD.ActiveDocument.' _cmd += self.sel.Name + ', ' _cmd += DraftVecUtils.toString(self.npts) + ', ' _cmd += 'copy=' + str(copymode) _cmd += ')' _cmd_list = ['offst = ' + _cmd, 'FreeCAD.ActiveDocument.recompute()'] self.commit(translate("draft", "Offset"), _cmd_list) elif self.dvec: if isinstance(self.dvec, float): delta = str(self.dvec) else: delta = DraftVecUtils.toString(self.dvec) _cmd = 'Draft.offset' _cmd += '(' _cmd += 'FreeCAD.ActiveDocument.' _cmd += self.sel.Name + ', ' _cmd += delta + ', ' _cmd += 'copy=' + str(copymode) + ', ' _cmd += 'occ=' + str(occmode) _cmd += ')' _cmd_list = ['offst = ' + _cmd, 'FreeCAD.ActiveDocument.recompute()'] self.commit(translate("draft", "Offset"), _cmd_list) if gui_tool_utils.hasMod(arg, gui_tool_utils.MODALT): self.extendedCopy = True else: self.finish()