[Draft] Snapper cleanup

Cleanup after @vocx-fc review
This commit is contained in:
carlopav
2020-04-18 22:54:40 +02:00
committed by Yorik van Havre
parent 64db721998
commit 81df9b76ae

View File

@@ -32,9 +32,6 @@ defined by `gui_trackers.gridTracker`.
# This module provides tools to handle point snapping and
# everything that goes with it (toolbar buttons, cursor icons, etc.).
import FreeCAD as App
import FreeCADGui as Gui
from pivy import coin
from PySide import QtCore, QtGui
@@ -47,6 +44,9 @@ import Draft
import DraftVecUtils
import DraftGeomUtils
import FreeCAD as App
import FreeCADGui as Gui
import Part
import draftguitools.gui_trackers as trackers
@@ -82,7 +82,6 @@ class Snapper:
"""
def __init__(self):
self.activeview = None
self.lastObj = [None, None]
self.maxEdges = 0
@@ -236,6 +235,9 @@ class Snapper:
self.running = True
global Part, DraftGeomUtils
import Part, DraftGeomUtils
self.spoint = None
if not hasattr(self, "toolbar"):
@@ -602,69 +604,73 @@ class Snapper:
self.setCursor(tsnap[1])
return tsnap[2], eline
for o in [self.lastObj[1], self.lastObj[0]]:
for o in (self.lastObj[1], self.lastObj[0]):
if o and (self.isEnabled('Extension')
or self.isEnabled('Parallel')):
or self.isEnabled('Parallel')):
ob = App.ActiveDocument.getObject(o)
if ob:
if ob.isDerivedFrom("Part::Feature"):
edges = ob.Shape.Edges
if Draft.getType(ob) == "Wall":
for so in [ob]+ob.Additions:
if Draft.getType(so) == "Wall":
if so.Base:
edges.extend(so.Base.Shape.Edges)
edges.reverse()
if (not self.maxEdges) or (len(edges) <= self.maxEdges):
for e in edges:
if DraftGeomUtils.geomType(e) == "Line":
np = self.getPerpendicular(e,point)
if not DraftGeomUtils.isPtOnEdge(np,e):
if (np.sub(point)).Length < self.radius:
if self.isEnabled('Extension'):
if np != e.Vertexes[0].Point:
p0 = e.Vertexes[0].Point
if self.tracker and not self.selectMode:
self.tracker.setCoords(np)
self.tracker.setMarker(self.mk['extension'])
self.tracker.on()
if self.extLine:
if self.snapStyle:
dv = np.sub(p0)
self.extLine.p1(p0.add(dv.multiply(0.5)))
else:
self.extLine.p1(p0)
self.extLine.p2(np)
self.extLine.on()
self.setCursor('extension')
ne = Part.LineSegment(p0,np).toShape()
# storing extension line for intersection calculations later
if len(self.lastExtensions) == 0:
self.lastExtensions.append(ne)
elif len(self.lastExtensions) == 1:
if not DraftGeomUtils.areColinear(ne,self.lastExtensions[0]):
self.lastExtensions.append(self.lastExtensions[0])
self.lastExtensions[0] = ne
else:
if (not DraftGeomUtils.areColinear(ne,self.lastExtensions[0])) and \
(not DraftGeomUtils.areColinear(ne,self.lastExtensions[1])):
self.lastExtensions[1] = self.lastExtensions[0]
self.lastExtensions[0] = ne
return np,ne
if not ob:
continue
if not ob.isDerivedFrom("Part::Feature"):
continue
edges = ob.Shape.Edges
if Draft.getType(ob) == "Wall":
for so in [ob]+ob.Additions:
if Draft.getType(so) == "Wall":
if so.Base:
edges.extend(so.Base.Shape.Edges)
edges.reverse()
if (not self.maxEdges) or (len(edges) <= self.maxEdges):
for e in edges:
if DraftGeomUtils.geomType(e) != "Line":
continue
np = self.getPerpendicular(e,point)
if DraftGeomUtils.isPtOnEdge(np,e):
continue
if (np.sub(point)).Length < self.radius:
if self.isEnabled('Extension'):
if np != e.Vertexes[0].Point:
p0 = e.Vertexes[0].Point
if self.tracker and not self.selectMode:
self.tracker.setCoords(np)
self.tracker.setMarker(self.mk['extension'])
self.tracker.on()
if self.extLine:
if self.snapStyle:
dv = np.sub(p0)
self.extLine.p1(p0.add(dv.multiply(0.5)))
else:
if self.isEnabled('Parallel'):
if last:
ve = DraftGeomUtils.vec(e)
if not DraftVecUtils.isNull(ve):
de = Part.LineSegment(last,last.add(ve)).toShape()
np = self.getPerpendicular(de,point)
if (np.sub(point)).Length < self.radius:
if self.tracker and not self.selectMode:
self.tracker.setCoords(np)
self.tracker.setMarker(self.mk['parallel'])
self.tracker.on()
self.setCursor('parallel')
return np,de
self.extLine.p1(p0)
self.extLine.p2(np)
self.extLine.on()
self.setCursor('extension')
ne = Part.LineSegment(p0,np).toShape()
# storing extension line for intersection calculations later
if len(self.lastExtensions) == 0:
self.lastExtensions.append(ne)
elif len(self.lastExtensions) == 1:
if not DraftGeomUtils.areColinear(ne,self.lastExtensions[0]):
self.lastExtensions.append(self.lastExtensions[0])
self.lastExtensions[0] = ne
else:
if (not DraftGeomUtils.areColinear(ne,self.lastExtensions[0])) and \
(not DraftGeomUtils.areColinear(ne,self.lastExtensions[1])):
self.lastExtensions[1] = self.lastExtensions[0]
self.lastExtensions[0] = ne
return np,ne
else:
if self.isEnabled('Parallel'):
if last:
ve = DraftGeomUtils.vec(e)
if not DraftVecUtils.isNull(ve):
de = Part.LineSegment(last,last.add(ve)).toShape()
np = self.getPerpendicular(de,point)
if (np.sub(point)).Length < self.radius:
if self.tracker and not self.selectMode:
self.tracker.setCoords(np)
self.tracker.setMarker(self.mk['parallel'])
self.tracker.on()
self.setCursor('parallel')
return np,de
return point,eline
@@ -1024,15 +1030,15 @@ class Snapper:
return snaps
def snapToVertex(self,info,active=False):
p = App.Vector(info['x'],info['y'],info['z'])
def snapToVertex(self, info, active=False):
p = App.Vector(info['x'], info['y'], info['z'])
if active:
if self.isEnabled("Near"):
return [p,'endpoint',self.toWP(p)]
return [p, 'endpoint', self.toWP(p)]
else:
return []
elif self.isEnabled("Near"):
return [p,'passive',p]
return [p, 'passive', p]
else:
return []
@@ -1046,6 +1052,7 @@ class Snapper:
# special snapping for wall: snap to its base shape if it is linear
if obj.Base:
if not obj.Base.Shape.Solids:
for v in obj.Base.Shape.Vertexes:
snaps.append([v.Point, 'special', self.toWP(v.Point)])
elif (Draft.getType(obj) == "Structure"):
@@ -1339,12 +1346,11 @@ class Snapper:
active=ctrl, constrain=shift)
if hasattr(App, "DraftWorkingPlane"):
self.ui.displayPoint(self.pt, last,
plane = App.DraftWorkingPlane,
mask = App.Snapper.affinity)
plane=App.DraftWorkingPlane,
mask=App.Snapper.affinity)
if movecallback:
movecallback(self.pt, self.snapInfo)
def getcoords(point, relative=False):
"""Get the global coordinates from a point."""
self.pt = point
@@ -1353,14 +1359,12 @@ class Snapper:
self.pt = last.add(v)
accept()
def click(event_cb):
event = event_cb.getEvent()
if event.getButton() == 1:
if event.getState() == coin.SoMouseButtonEvent.DOWN:
accept()
def accept():
if self.callbackClick:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callbackClick)
@@ -1378,7 +1382,6 @@ class Snapper:
callback(self.pt)
self.pt = None
def cancel():
if self.callbackClick:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callbackClick)
@@ -1447,7 +1450,7 @@ class Snapper:
b.setText(QtCore.QCoreApplication.translate("Draft_Snap", "Snap " + gc[11:]))
b.setToolTip(QtCore.QCoreApplication.translate("Draft_Snap", "Snap " + gc[11:]))
b.setObjectName(gc + button_suffix)
b.setWhatsThis("Draft_"+gc[11:].capitalize())
b.setWhatsThis("Draft_" + gc[11:].capitalize())
b.setCheckable(True)
b.setChecked(True)
context.addAction(b)
@@ -1470,36 +1473,36 @@ class Snapper:
param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft")
snap_modes = param.GetString("snapModes")
for b in toolbar.actions():
if len(b.statusTip()) == 0:
b.setStatusTip(b.toolTip())
for button in toolbar.actions():
if len(button.statusTip()) == 0:
button.setStatusTip(button.toolTip())
# restore toolbar buttons state
if snap_modes:
for a in toolbar.findChildren(QtGui.QAction):
snap = a.objectName()[11:].replace(button_suffix,"")
for action in toolbar.findChildren(QtGui.QAction):
snap = action.objectName()[11:].replace(button_suffix, "")
if snap in Gui.Snapper.snaps:
i = Gui.Snapper.snaps.index(snap)
state = bool(int(snap_modes[i]))
a.setChecked(state)
action.setChecked(state)
if state:
a.setToolTip(a.toolTip()+" (ON)")
action.setToolTip(action.toolTip() + " (ON)")
else:
a.setToolTip(a.toolTip()+" (OFF)")
action.setToolTip(action.toolTip() + " (OFF)")
def get_snap_toolbar(self):
"""retuns snap toolbar object"""
"""Retuns snap toolbar object."""
mw = Gui.getMainWindow()
if mw:
toolbar = mw.findChild(QtGui.QToolBar,"Draft Snap")
toolbar = mw.findChild(QtGui.QToolBar, "Draft Snap")
if toolbar:
return toolbar
return None
def toggleGrid(self):
"toggle FreeCAD Draft Grid"
"""Toggle FreeCAD Draft Grid."""
Gui.runCommand("Draft_ToggleGrid")
@@ -1513,7 +1516,7 @@ class Snapper:
def isEnabled(self, snap):
"Returns true if the given snap is on"
"""Returns true if the given snap is on"""
if "Lock" in self.active_snaps and snap in self.active_snaps:
return True
else:
@@ -1521,7 +1524,7 @@ class Snapper:
def toggle_snap(self, snap, set_to = None):
"Sets the given snap on/off according to the given parameter"
"""Sets the given snap on/off according to the given parameter"""
if set_to: # set mode
if set_to is True:
if not snap in self.active_snaps:
@@ -1544,7 +1547,7 @@ class Snapper:
def save_snap_state(self):
"""
save snap state to user preferences to be restored in next session
Save snap state to user preferences to be restored in next session.
"""
param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft")
snap_modes = ""