Esempio n. 1
0
    def updateGhost(self,obj,idx,pt):
        if Draft.getType(obj) in ["Wire"]:
            self.ghost.on()
            pointList = self.applyPlacement(obj.Points)
            pointList[idx] = pt
            if obj.Closed: pointList.append(pointList[0])
            self.ghost.updateFromPointlist(pointList)
        elif Draft.getType(obj) == "BSpline":
            self.ghost.on()
            pointList = self.applyPlacement(obj.Points)
            pointList[idx] = pt
            if obj.Closed: pointList.append(pointList[0])
            self.ghost.update(pointList)
        elif Draft.getType(obj) == "BezCurve":
            self.ghost.on()
            plist = self.applyPlacement(obj.Points)
            pointList = self.recomputePointsBezier(plist,idx,pt,obj.Degree,moveTrackers=True)
            self.ghost.update(pointList,obj.Degree)
        elif Draft.getType(obj) == "Circle":
            self.ghost.on()
            if self.arc3Pt == False:
                self.ghost.setCenter(obj.Placement.Base)
                self.ghost.setRadius(obj.Radius)
                self.ghost.setStartAngle(math.radians(obj.FirstAngle))
                self.ghost.setEndAngle(math.radians(obj.LastAngle))
                if self.editing == 0:
                    self.ghost.setCenter(pt)
                elif self.editing == 1:
                    self.ghost.setStartPoint(pt)
                elif self.editing == 2:
                    self.ghost.setEndPoint(pt)
                elif self.editing == 3:
                    self.ghost.setRadius(self.invpl.multVec(pt).Length)
            elif self.arc3Pt == True:
                if self.editing == 0:#center point
                    import DraftVecUtils
                    p1 = self.invpl.multVec(self.obj.Shape.Vertexes[0].Point)
                    p2 = self.invpl.multVec(self.obj.Shape.Vertexes[1].Point)
                    p0 = DraftVecUtils.project(self.invpl.multVec(pt),self.invpl.multVec(self.getArcMid()))
                    self.ghost.autoinvert=False
                    self.ghost.setRadius(p1.sub(p0).Length)
                    self.ghost.setStartPoint(self.obj.Shape.Vertexes[1].Point)
                    self.ghost.setEndPoint(self.obj.Shape.Vertexes[0].Point)
                    self.ghost.setCenter(self.pl.multVec(p0))
                    return
                else:
                    p1=self.obj.Shape.Vertexes[0].Point
                    p2=self.getArcMid()
                    p3=self.obj.Shape.Vertexes[1].Point
                    if self.editing == 1: p1=pt
                    elif self.editing == 3: p2=pt
                    elif self.editing == 2: p3=pt
                    self.ghost.setBy3Points(p1,p2,p3)

        DraftTools.redraw3DView()
Esempio n. 2
0
    def action(self, arg):
        """Scene event handler. CURRENTLY NOT USED.

        Here the displaying of the trackers (previews)
        should be implemented by considering the current value of the
        `ui.radiusValue`.
        """
        if arg["Type"] == "SoKeyboardEvent":
            if arg["Key"] == "ESCAPE":
                self.finish()
        elif arg["Type"] == "SoLocation2Event":
            self.point, ctrlPoint, info = DraftTools.getPoint(self, arg)
            DraftTools.redraw3DView()
Esempio n. 3
0
    def button_action(self, arg):
        """
        Button click trapping
        """

        _p = self.view.getCursorPos()
        self.mouse.update(arg, _p)

        #manage selection
        if self.mouse.button1.pressed:
            self.on_selection(arg, _p)

        DraftTools.redraw3DView()
    def __init__(self, doc):

        self.ui_path = resources.__path__[0] + '/ui/'
        self.ui = self.ui_path + 'sprite_splitter_task_panel.ui'

        self.form = None
        self.subtask = None

        self.panel = None
        self.doc = doc

        self.plane = None
        self.names = ['FreeCAD', self.doc.Name, 'Sprite Splitter']

        self.image = QtGui.QImage()

        self.cursor_trackers = [
            WireTracker(self.names),
            WireTracker(self.names[:2] + ['CURSOR'])
        ]

        self.rubberband_tracker = BoxTracker(self.names[:2] + ['RUBBERBAND'])
        self.rubberband_tracker.set_selectability(False)

        self.node = BaseTracker(self.names)

        self.node.insert_node(self.cursor_trackers[0].switch)
        self.node.insert_node(self.cursor_trackers[1].switch)
        self.node.insert_node(self.rubberband_tracker.switch)

        #deselect existing selections
        Gui.Selection.clearSelection()

        self.callbacks = {
            'SoLocation2Event':
            ViewState().view.addEventCallback('SoLocation2Event',
                                              self.mouse_event),
            'SoMouseButtonEvent':
            ViewState().view.addEventCallback('SoMouseButtonEvent',
                                              self.button_event)
        }

        self.grid_tracker = GridTracker(self.names)

        DraftTools.redraw3DView()
Esempio n. 5
0
    def __init__(self):

        super().__init__('PivyTrackerTask', Gui.ActiveDocument.ActiveView)

        #self.panel = None

        _camera = self.view_state.view.getCameraNode()

        self.camera_state = self.CameraState(position=(0.0, 0.0, 0.0),
                                             height=0.0,
                                             box_corners=(-120.0, -120.0,
                                                          120.0, 120.0))

        self.pivy_tracker = PivyTracker()
        self.pivy_tracker.insert_into_scenegraph(True)

        DraftTools.redraw3DView()

        self._zoom_camera()
Esempio n. 6
0
 def updateGhost(self,obj,idx,pt):
     if Draft.getType(obj) in ["Wire"]:
         self.ghost.on()
         pointList = self.applyPlacement(obj.Points)
         pointList[idx] = pt
         if obj.Closed: pointList.append(pointList[0])
         self.ghost.updateFromPointlist(pointList)
     elif Draft.getType(obj) == "BSpline":
         self.ghost.on()
         pointList = self.applyPlacement(obj.Points)
         pointList[idx] = pt
         if obj.Closed: pointList.append(pointList[0])
         self.ghost.update(pointList)            
     elif Draft.getType(obj) == "BezCurve":
         self.ghost.on()
         plist = self.applyPlacement(obj.Points)
         pointList = self.recomputePointsBezier(plist,idx,pt,obj.Degree,moveTrackers=True)
         self.ghost.update(pointList,obj.Degree)
     DraftTools.redraw3DView()
Esempio n. 7
0
 def action(self, arg):
     "scene event handler"
     if arg["Type"] == "SoKeyboardEvent":
         if arg["Key"] == "ESCAPE":
             self.finish()
     elif arg["Type"] == "SoLocation2Event":  #mouse movement detection
         self.point, ctrlPoint, info = DraftTools.getPoint(self,
                                                           arg,
                                                           mobile=True,
                                                           noTracker=True)
         self.rect.update(self.point)
         DraftTools.redraw3DView()
     elif arg["Type"] == "SoMouseButtonEvent":
         if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
             if (arg["Position"] == self.pos):
                 self.finish()
             else:
                 if (not self.node) and (not self.support):
                     DraftTools.getSupport(arg)
                     self.point, ctrlPoint, info = DraftTools.getPoint(
                         self, arg, mobile=True, noTracker=True)
                 if self.point:
                     self.ui.redraw()
                     self.appendPoint(self.point)
Esempio n. 8
0
    def action(self, arg):
        """
        Coin SoEvent callback for mouse / keyboard handling
        """

        #trap mouse movement
        if arg['Type'] == 'SoLocation2Event':

            _p = self.view.getCursorPos()
            _pt = self.view.getPoint(_p)
            info = self.view.getObjectInfo(_p)

            if info:
                print(info)

            return

            if not self.button_states['BUTTON1']:
                self.handle_mouseover_tracker(info)
            else:
                self.handle_drag_tracker(self.view.getPoint(_p))

        #trap button clicks
        elif arg['Type'] == 'SoMouseButtonEvent':

            self.get_button_states(arg)

            _p = self.view.getCursorPos()
            info = self.view.getObjectInfo(_p)

            multi_select = arg['AltDown']

            _key, _it = self.get_current_tracker(info)

            #empty the arry and reset the trackers
            if self.selected_trackers:

                for _tracker in self.selected_trackers:
                    _tracker.set_style(self.STYLES.ENABLED)

                self.selected_trackers = []

            #current defined?  add it to the selection.
            if _it:

                #Clear the button states so dragging won't work unles
                for _v in self.button_states.values():
                    _v = False

                while True:

                    _current = self.trackers[_key]
                    _current.set_style(self.STYLES.SELECTED)

                    self.active_tracker = _current
                    self.selected_trackers.append(_current)

                    if not multi_select:
                        break

                    try:
                        _key = next(_it)

                    except StopIteration:
                        break

        self.doc.recompute()
        DraftTools.redraw3DView()
    def __init__(self, doc, alignment_data, obj, is_linked):

        super().__init__()
        #    '.'.join([doc.Name, 'BASE_TRACKER_TEST_TASK', 'TASK']))

        self.view_state = ViewState(Gui.ActiveDocument.ActiveView)
        self.panel = None
        self.doc = doc
        self.Object = obj
        self.alignment = alignment.create(alignment_data, 'TEMP', True, False)
        self.pi_tracker = None
        self.drag_tracker = None
        self.alignment_tracker = None
        #self.callbacks = {}

        self.camera_state = {
            'position': None,
            'height': None,
            'bound box': None
        }

        self.view_state.view_objects = {
            'selectables': [],
            'line_colors': [],
        }

        #disable selection entirely
        self.view_state.sg_root.getField("selectionRole").setValue(0)

        #get all objects with LineColor and set them all to gray
        self.view_state.view_objects['line_colors'] = [
            (_v.ViewObject, _v.ViewObject.LineColor)
            for _v in self.doc.findObjects() if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'LineColor')
        ]

        for _v in self.view_state.view_objects['line_colors']:
            self.set_vobj_style(_v[0], self.STYLES.DISABLED)

        #get all objects in the scene that are selectable.
        self.view_state.view_objects['selectable'] = [
            (_v.ViewObject, _v.ViewObject.Selectable)
            for _v in self.doc.findObjects() if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'Selectable')
        ]

        for _v in self.view_state.view_objects['selectable']:
            _v[0].Selectable = False

        #deselect existing selections
        Gui.Selection.clearSelection()

        self.task_tracker = TaskTracker()
        self.alignment_tracker = TrackerTester(self.doc, self.Object.Name,
                                               self.alignment, is_linked,
                                               self.task_tracker.base)

        #self.task_tracker.insert_group(self.alignment_tracker.base)

        #save camera state
        _camera = self.view_state.view.getCameraNode()

        self.camera_state['position'] = _camera.position.getValue().getValue()
        self.camera_state['height'] = _camera.height.getValue()
        self.camera_state['bound box'] = self.Object.Shape.BoundBox

        #add mouse callbacks for updating mouse state
        #ViewState().add_mouse_event(self.mouse_event)
        #ViewState().add_button_event(self.button_event)

        self._zoom_camera()

        self.task_tracker.insert_into_scenegraph(True)
        DraftTools.redraw3DView()
Esempio n. 10
0
    def __init__(self, doc, view, alignment_data, obj):

        self.panel = None
        self.view = view
        self.doc = doc
        self.obj = obj
        self.alignment = alignment_model.AlignmentModel()
        self.alignment.data = alignment_data
        self.pi_tracker = None
        self.drag_tracker = None
        self.callbacks = {}
        self.mouse = MouseState()

        self.view_objects = {
            'selectables': [],
            'line_colors': [],
        }

        #disable selection entirely
        self.view.getSceneGraph().getField("selectionRole").setValue(0)

        #get all objects with LineColor and set them all to gray
        self.view_objects['line_colors'] = [
            (_v.ViewObject, _v.ViewObject.LineColor)
            for _v in self.doc.findObjects()
            if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'LineColor')
        ]

        for _v in self.view_objects['line_colors']:
            self.set_vobj_style(_v[0], self.STYLES.DISABLED)

        #get all objects in the scene that are selecctable.
        self.view_objects['selectable'] = [
            (_v.ViewObject, _v.ViewObject.Selectable)
            for _v in self.doc.findObjects()
            if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'Selectable')
        ]

        for _v in self.view_objects['selectable']:
            _v[0].Selectable = False

        #deselect existing selections
        Gui.Selection.clearSelection()

        _points = self.alignment.get_pi_coords()

        self.pi_tracker = PiTracker(
            self.doc, self.view, self.obj.Name, 'PI_TRACKER', _points
        )

        self.callbacks = {
            'SoKeyboardEvent': self.key_action,
            'SoMouseButtonEvent': self.button_action,
            'SoLocation2Event': self.mouse_action
        }

        for _k, _v in self.callbacks.items():
            self.view.addEventCallback(_k, _v)

        panel = DraftAlignmentTask(self.clean_up)

        Gui.Control.showDialog(panel)
        #panel.setup()

        self.doc.recompute()
        DraftTools.redraw3DView()
Esempio n. 11
0
    def action(self, arg):
        """
        Event handling for alignment drawing
        """

        #trap the escape key to quit
        if arg['Type'] == 'SoKeyboardEvent':
            if arg['Key'] == 'ESCAPE':
                self.finish()
                return

        #trap mouse movement
        if arg['Type'] == 'SoLocation2Event':

            _p = Gui.ActiveDocument.ActiveView.getCursorPos()
            info = Gui.ActiveDocument.ActiveView.getObjectInfo(_p)

            curve_hash = None

            #test to see which curve is under the cursor
            if info:
                if info['Object'] == self.alignment_draft.Name:
                    curve_hash = self.select_curve_edges(info['Component'])

            #matching hashes?  nothing to do for mouseover
            if self.curve_hash == curve_hash:
                return

            #hashes do not match.  Deselect last selected curve
            if Gui.Selection.getSelection():
                Gui.Selection.clearSelection()

            if self.active_curve != self.curve_hash:
                self.hide_control_geometry()

            #if self.active_curve != curve_hash:
            if curve_hash:
                self.show_control_geometry(curve_hash)

            self.curve_hash = curve_hash
            #if this is a new curve, hide the prev geometry if not active


#            if self.curve_hash:

#trap button clicks
        elif arg['Type'] == 'SoMouseButtonEvent':

            _p = Gui.ActiveDocument.ActiveView.getCursorPos()
            info = Gui.ActiveDocument.ActiveView.getObjectInfo(_p)

            curve_hash = None

            if self.active_curve:
                self.hide_control_geometry(self.active_curve)
                self.hide_curve(self.active_curve)

            if info:
                if info['Object'] == self.alignment_draft.Name:
                    curve_hash = info['Component']
                    self.show_curve(self.curve_hash)
                    self.active_curve = self.curve_hash

            else:

                self.active_curve = None

                if Gui.Selection.getSelection():
                    Gui.Selection.clearSelection()

                if self.curve_hash:
                    self.hide_control_geometry()
                    self.curve_hash = None

        #    self.alignment_tracker.update(self.node + [self.point])

        else:
            return

        App.ActiveDocument.recompute()
        DraftTools.redraw3DView()
Esempio n. 12
0
    def action(self,arg):
        "scene event handler"

        if arg["Type"] == "SoKeyboardEvent" and arg["State"] == "DOWN":
            if arg["Key"] == "ESCAPE":
                self.finish()
            elif arg["Key"] == "a":
                self.finish()
            elif arg["Key"] == "o":
                self.finish(closed=True)
            elif arg["Key"] == "i":
                if Draft.getType(self.obj) == "Circle": self.arcInvert()

        elif arg["Type"] == "SoLocation2Event": #mouse movement detection
            self.point,ctrlPoint,info = DraftTools.getPoint(self,arg)# causes problems when mouseover bezcurves
            if self.editing != None:
                self.trackers[self.editing].set(self.point)
                #FreeCAD.Console.PrintMessage(self.ghost)
                self.updateGhost(obj=self.obj,idx=self.editing,pt=self.point)

            if hasattr(self.obj.ViewObject,"Selectable"):
                if self.ui.addButton.isChecked():
                    self.obj.ViewObject.Selectable = True
                else:
                    self.obj.ViewObject.Selectable = False
            DraftTools.redraw3DView()

        elif arg["Type"] == "SoMouseButtonEvent" and arg["State"] == "DOWN":

            if arg["Button"] == "BUTTON1":
                self.ui.redraw()

                if self.editing == None:
                    # USECASE: User click on one of the editpoints or another object
                    ep = None
                    selobjs = self.getSelection()
                    if selobjs == None: return

                    if self.ui.addButton.isChecked():# still quite raw
                        # USECASE: User add a new point to the object
                        for info in selobjs:
                            if Draft.getType(self.obj) == "Wire" and 'Edge' in info["Component"]:
                                pt = FreeCAD.Vector(info["x"],info["y"],info["z"])
                                self.addPointToWire(pt, int(info["Component"][4:]))
                            elif self.point:
                                pt = self.point
                                if "x" in info:# prefer "real" 3D location over working-plane-driven one if possible
                                    pt = FreeCAD.Vector(info["x"],info["y"],info["z"])
                                self.addPointToCurve(pt,info)
                        self.removeTrackers()
                        self.editpoints = []
                        self.setEditPoints(self.obj)
                        self.resetTrackers()
                        return

                    ep = self.lookForClickedNode(selobjs,tolerance=20)
                    if ep == None: return

                    if self.ui.delButton.isChecked(): # still quite raw
                        # USECASE: User delete a point of the object
                        self.delPoint(ep)
                        # don't do tan/sym on DWire/BSpline!
                        self.removeTrackers()
                        self.editpoints = []
                        self.setEditPoints(self.obj)
                        self.resetTrackers()
                        return

                    if Draft.getType(self.obj) == "BezCurve":
                        # USECASE: User change the continuity of a Bezcurve point
                        if self.ui.sharpButton.isChecked():
                            return self.smoothBezPoint(ep, 'Sharp')
                        elif self.ui.tangentButton.isChecked():
                            return self.smoothBezPoint(ep, 'Tangent')
                        elif self.ui.symmetricButton.isChecked():
                            return self.smoothBezPoint(ep, 'Symmetric')

                    if self.ui.arc3PtButton.isChecked():
                        self.arc3Pt = False
                    else:
                        self.arc3Pt = True
                    self.ui.pointUi()
                    self.ui.isRelative.show()
                    self.editing = ep
                    self.trackers[self.editing].off()
                    self.finalizeGhost()
                    self.ghost = self.initGhost(self.obj)
                    '''if hasattr(self.obj.ViewObject,"Selectable"):
                        self.obj.ViewObject.Selectable = False'''
                    self.node.append(self.trackers[self.editing].get())
                    FreeCADGui.Snapper.setSelectMode(False)

                else: #if self.editing != None:
                    # USECASE: Destination point of editing is clicked
                    self.finalizeGhost()
                    self.trackers[self.editing].on()
                    #if hasattr(self.obj.ViewObject,"Selectable"):
                    #    self.obj.ViewObject.Selectable = True
                    FreeCADGui.Snapper.setSelectMode(True)
                    self.numericInput(self.trackers[self.editing].get())
    def __init__(self, doc, alignment_data, obj):

        self.name = 'Edit Alignment Task'
        self.panel = None
        self.doc = doc
        self.Object = obj
        self.alignment = alignment.create(alignment_data, 'TEMP', True, False)
        self.alignment_tracker = None
        self.terminator_tracker = None
        self.callbacks = {}
        self.mouse = MouseState()
        self.form = None
        self.ui_path = resources.__path__[0] + '/ui/'
        self.ui = self.ui_path + 'edit_alignment_task.ui'
        self.unit_scale = units.scale_factor()

        self.masks = {
            'float': '#90000.99',
            'degree_float': '900.99\u00b0',
            'station_imp_float': '00009+99.99',
            'station_eng_float': '00009+999.99',
        }

        self.camera_state = {
            'position': None,
            'height': None,
            'bound box': None
        }

        ViewState().view_objects = {
            'selectables': [],
            'line_colors': [],
        }

        super().__init__("Edit Alignment Task")

        #disable selection entirely
        ViewState().sg_root.getField("selectionRole").setValue(0)

        #get all objects with LineColor and set them all to gray
        ViewState().view_objects['line_colors'] = [
            (_v.ViewObject, _v.ViewObject.LineColor)
            for _v in self.doc.findObjects() if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'LineColor')
        ]

        for _v in ViewState().view_objects['line_colors']:
            self.set_vobj_style(_v[0], self.STYLES.DISABLED)

        #get all objects in the scene that are selectable.
        ViewState().view_objects['selectable'] = [
            (_v.ViewObject, _v.ViewObject.Selectable)
            for _v in self.doc.findObjects() if hasattr(_v, 'ViewObject')
            if hasattr(_v.ViewObject, 'Selectable')
        ]

        for _v in ViewState().view_objects['selectable']:
            _v[0].Selectable = False

        #deselect existing selections
        Gui.Selection.clearSelection()

        self.callbacks = {
            'SoLocation2Event':
            ViewState().view.addEventCallback('SoLocation2Event',
                                              self.mouse_event),
            'SoMouseButtonEvent':
            ViewState().view.addEventCallback('SoMouseButtonEvent',
                                              self.button_event)
        }

        self.alignment_tracker = AlignmentTracker(self.doc, self.Object.Name,
                                                  self.alignment)

        self.terminator_tracker = TerminatorTracker()

        #subscribe the alignment tracker to all events from the task
        #and subscribe the task to task events from the tracker
        self.alignment_tracker.register(self, Events.ALIGNMENT.UPDATED)
        self.register(self.alignment_tracker, Events.ALIGNMENT.UPDATE)
        self.terminator_tracker.register(self, Events.TASK.EVENTS)

        #save camera state
        _camera = ViewState().view.getCameraNode()

        self.camera_state['position'] = _camera.position.getValue().getValue()
        self.camera_state['height'] = _camera.height.getValue()
        self.camera_state['bound box'] = self.Object.Shape.BoundBox

        self._zoom_camera, self

        DraftTools.redraw3DView()