def update(self, line=None, normal=None): import WorkingPlane, DraftGeomUtils if not normal: normal = FreeCAD.DraftWorkingPlane.axis if line: if isinstance(line, list): bp = line[0] lvec = line[1].sub(line[0]) else: lvec = DraftGeomUtils.vec(line.Shape.Edges[0]) bp = line.Shape.Edges[0].Vertexes[0].Point elif self.baseline: lvec = DraftGeomUtils.vec(self.baseline.Shape.Edges[0]) bp = self.baseline.Shape.Edges[0].Vertexes[0].Point else: return right = lvec.cross(normal) self.cube.width.setValue(lvec.Length) p = WorkingPlane.getPlacementFromPoints( [bp, bp.add(lvec), bp.add(right)]) if p: self.trans.rotation.setValue(p.Rotation.Q) bp = bp.add(lvec.multiply(0.5)) bp = bp.add( DraftVecUtils.scaleTo(normal, self.cube.depth.getValue() / 2)) self.pos(bp)
def setHeightUI(self): import FreeCADGui if (len(self.points) == 3) and self.HeightValue: cube = FreeCAD.ActiveDocument.addObject("Part::Box", "Cube") cube.Length = self.LengthValue cube.Width = self.WidthValue cube.Height = self.HeightValue # we get 3 points that define our cube orientation p1 = self.cubetracker[0].p1() p2 = self.cubetracker[0].p2() p3 = self.cubetracker[0].p4() FreeCADGui.Snapper.off() import WorkingPlane cube.Placement = WorkingPlane.getPlacementFromPoints([p1, p2, p3]) if hasattr(FreeCAD, "DraftWorkingPlane"): FreeCAD.DraftWorkingPlane.restore() FreeCADGui.Snapper.setGrid() for c in self.cubetracker: c.off() FreeCADGui.Snapper.getPoint() FreeCADGui.Snapper.off() if hasattr(FreeCADGui, "draftToolBar"): FreeCADGui.draftToolBar.offUi() FreeCAD.ActiveDocument.recompute()
def update(self, line=None, normal=None): import WorkingPlane, DraftGeomUtils if not normal: normal = FreeCAD.DraftWorkingPlane.axis if line: if isinstance(line, list): bp = line[0] lvec = line[1].sub(line[0]) else: lvec = DraftGeomUtils.vec(line.Shape.Edges[0]) bp = line.Shape.Edges[0].Vertexes[0].Point elif self.baseline: lvec = DraftGeomUtils.vec(self.baseline.Shape.Edges[0]) bp = self.baseline.Shape.Edges[0].Vertexes[0].Point else: return right = lvec.cross(normal) self.cube.width.setValue(lvec.Length) p = WorkingPlane.getPlacementFromPoints([bp, bp.add(lvec), bp.add(right)]) if p: self.trans.rotation.setValue(p.Rotation.Q) bp = bp.add(lvec.multiply(0.5)) bp = bp.add(DraftVecUtils.scaleTo(normal, self.cube.depth.getValue() / 2)) self.pos(bp)
def action(self, arg): # 3D scene handler. This function will be called by the 3D view on # special events such as keypress or mouse movements. We must take # care of treating what we want. All the hard work will be here! point, ctrlPoint = draftTools.getPoint(self, arg) if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": # important! if ESC is pressed, we cancel everything self.finish() elif arg["Type"] == "SoLocation2Event": # this will be executed in case of mouse movement if len(self.points) == 1: # this will be executed after we got our first point self.linetracker.p2(point) self.length = self.linetracker.getLength() self.ui.setRadiusValue(self.length) elif len(self.points) == 2: # now we already have our base line, we update the 1st rectangle self.cubetracker[0].p3(point) self.width = self.cubetracker[0].getSize()[1] self.ui.setRadiusValue(self.width) elif len(self.points) == 3: # we must first find our height point by projecting on the normal w = fcvec.project(point, self.normal) # then we update all rectangles self.cubetracker[1].p3((self.cubetracker[0].p2()).add(w)) self.cubetracker[2].p3((self.cubetracker[0].p4()).add(w)) self.cubetracker[3].p1((self.cubetracker[0].p1()).add(w)) self.cubetracker[3].p3((self.cubetracker[0].p3()).add(w)) self.height = w.Length self.ui.setRadiusValue(self.height) elif arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): # this will be executed in case of mouse button 1 pressed print "Got point: ", point if len(self.points) == 0: # this is our first clicked point self.linetracker.p1(point) self.linetracker.on() # we set the radius UI, which has only a length input field # but we change the "radius" name self.ui.radiusUi() self.ui.labelRadius.setText("Width") elif len(self.points) == 1: # this is our second point # first we turn off our line tracker self.linetracker.off() # then we turn on only one of the rectangles baseline = point.sub(self.points[0]) self.cubetracker[0].setPlane(baseline) self.cubetracker[0].p1(self.linetracker.p1()) self.cubetracker[0].on() self.ui.labelRadius.setText("Length") elif len(self.points) == 2: # this is our third point # we can get the cubes Z axis from our first rectangle self.normal = self.cubetracker[0].getNormal() # we can therefore define the (u,v) planes of all rectangles u = self.cubetracker[0].u v = self.cubetracker[0].v self.cubetracker[1].setPlane(u, self.normal) self.cubetracker[2].setPlane(u, self.normal) self.cubetracker[3].setPlane(u, v) # and the origin points of the vertical rectangles self.cubetracker[1].p1(self.cubetracker[0].p1()) self.cubetracker[2].p1(self.cubetracker[0].p3()) # finally we turn all rectangles on for r in self.cubetracker: r.on() self.ui.labelRadius.setText("Heigth") elif len(self.points) == 3: # finally we have all our points! Let's create the actual cube. cube = self.doc.addObject("Part::Box", "Cube") cube.Length = self.length cube.Width = self.width cube.Height = self.height # we get 3 points that define our cube orientation p1 = self.cubetracker[0].p1() p2 = self.cubetracker[0].p2() p3 = self.cubetracker[0].p4() cube.Placement = WorkingPlane.getPlacementFromPoints( [p1, p2, p3]) self.finish() self.points.append(point)
def PointCallback(self, point, snapinfo): if not point: # cancelled if hasattr(FreeCAD, "DraftWorkingPlane"): FreeCAD.DraftWorkingPlane.restore() FreeCADGui.Snapper.setGrid() for c in self.cubetracker: c.off() return if len(self.points) == 0: # this is our first clicked point, nothing to do just yet FreeCADGui.Snapper.getPoint(last=point, callback=self.PointCallback, movecallback=self.MoveCallback, extradlg=self.taskbox()) elif len(self.points) == 1: # this is our second point # we turn on only one of the rectangles baseline = point.sub(self.points[0]) self.cubetracker[0].setPlane(baseline) self.cubetracker[0].p1(self.points[0]) self.cubetracker[0].on() FreeCADGui.Snapper.getPoint(last=point, callback=self.PointCallback, movecallback=self.MoveCallback, extradlg=self.taskbox()) elif len(self.points) == 2: # this is our third point # we can get the cubes Z axis from our first rectangle self.normal = self.cubetracker[0].getNormal() # we can therefore define the (u,v) planes of all rectangles u = self.cubetracker[0].u v = self.cubetracker[0].v self.cubetracker[1].setPlane(u, self.normal) self.cubetracker[2].setPlane(u, self.normal) self.cubetracker[3].setPlane(u, v) # and the origin points of the vertical rectangles self.cubetracker[1].p1(self.cubetracker[0].p1()) self.cubetracker[2].p1(self.cubetracker[0].p3()) # finally we turn all rectangles on for r in self.cubetracker: r.on() if hasattr(FreeCAD, "DraftWorkingPlane"): FreeCAD.DraftWorkingPlane.save() FreeCAD.DraftWorkingPlane.position = self.cubetracker[0].p3() FreeCAD.DraftWorkingPlane.u = (self.cubetracker[0].p4().sub( self.cubetracker[0].p3())).normalize() FreeCAD.DraftWorkingPlane.v = FreeCAD.Vector( self.normal).normalize() FreeCAD.DraftWorkingPlane.axis = (self.cubetracker[0].p2().sub( self.cubetracker[0].p3())).normalize() FreeCADGui.Snapper.setGrid() FreeCADGui.Snapper.getPoint(last=self.cubetracker[0].p3(), callback=self.PointCallback, movecallback=self.MoveCallback, extradlg=self.taskbox()) elif len(self.points) == 3: # finally we have all our points. Let's create the actual cube cube = FreeCAD.ActiveDocument.addObject("Part::Box", "Cube") cube.Length = self.LengthValue cube.Width = self.WidthValue cube.Height = self.HeightValue # we get 3 points that define our cube orientation p1 = self.cubetracker[0].p1() p2 = self.cubetracker[0].p2() p3 = self.cubetracker[0].p4() import WorkingPlane cube.Placement = WorkingPlane.getPlacementFromPoints([p1, p2, p3]) if hasattr(FreeCAD, "DraftWorkingPlane"): FreeCAD.DraftWorkingPlane.restore() FreeCADGui.Snapper.setGrid() for c in self.cubetracker: c.off() FreeCAD.ActiveDocument.recompute() self.points.append(point)