コード例 #1
0
 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)
コード例 #2
0
ファイル: BimBox.py プロジェクト: yorikvanhavre/BIM_Workbench
    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()
コード例 #3
0
    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)
コード例 #4
0
    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)
コード例 #5
0
    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)