Draft: Edit, cleanup of new GuiTools.addPoint methods

In new splitted addPoint methods, getObjectsInfo and the consequent checks have been removed and moved to main DraftEdit module in a new get_specific_object_info method.
This method returns the info for the selected object at a given position and the 3d Vector of the point clicked on the object.
This commit is contained in:
carlopav
2021-05-25 01:03:20 +02:00
parent 5841b737e1
commit 267291567f
2 changed files with 62 additions and 82 deletions

View File

@@ -843,6 +843,20 @@ class Edit(gui_base_original.Modifier):
obj_gui_tools.restore_object_style(obj, self.objs_formats[obj.Name])
def get_specific_object_info(self, obj, pos):
"""Return info of a specific object at a given position.
"""
selobjs = Gui.ActiveDocument.ActiveView.getObjectsInfo((pos[0],pos[1]))
if not selobjs:
return
for info in selobjs:
if not info:
continue
if obj.Name == info["Object"] and "x" in info:
# prefer "real" 3D location over working-plane-driven one if possible
pt = App.Vector(info["x"], info["y"], info["z"])
return info, pt
def get_selected_obj_at_position(self, pos):
"""Return object at given position.

View File

@@ -129,40 +129,34 @@ class DraftWireGuiTools(GuiTools):
def add_point(self, edit_command, obj, pos):
"""Add point to obj.
"""
# self.setSelectState(obj, True)
selobjs = Gui.ActiveDocument.ActiveView.getObjectsInfo((pos[0],pos[1]))
if not selobjs:
info, newPoint = edit_command.get_specific_object_info(obj,pos)
if not info:
return
for info in selobjs:
if not info:
return
if obj.Name != info["Object"]:
return
if not 'Edge' in info["Component"]:
return
newPoint = App.Vector(info["x"], info["y"], info["z"])
edgeIndex = int(info["Component"][4:])
if not 'Edge' in info["Component"]:
return
edgeIndex = int(info["Component"][4:])
newPoints = []
if hasattr(obj, "ChamferSize") and hasattr(obj, "FilletRadius"):
# TODO: If Draft_Wire fails to calculate one of the fillets or chamfers
# this algo fails to identify the correct edge
if obj.ChamferSize > 0 and obj.FilletRadius > 0:
edgeIndex = (edgeIndex + 3) / 4
elif obj.ChamferSize > 0 or obj.FilletRadius > 0:
edgeIndex = (edgeIndex + 1) / 2
newPoints = []
if hasattr(obj, "ChamferSize") and hasattr(obj, "FilletRadius"):
# TODO: If Draft_Wire fails to calculate one of the fillets or chamfers
# this algo fails to identify the correct edge
if obj.ChamferSize > 0 and obj.FilletRadius > 0:
edgeIndex = (edgeIndex + 3) / 4
elif obj.ChamferSize > 0 or obj.FilletRadius > 0:
edgeIndex = (edgeIndex + 1) / 2
for index, point in enumerate(obj.Points):
if index == edgeIndex:
newPoints.append(edit_command.localize_vector(obj, newPoint))
newPoints.append(point)
if obj.Closed and edgeIndex == len(obj.Points):
# last segment when object is closed
for index, point in enumerate(obj.Points):
if index == edgeIndex:
newPoints.append(edit_command.localize_vector(obj, newPoint))
obj.Points = newPoints
newPoints.append(point)
if obj.Closed and edgeIndex == len(obj.Points):
# last segment when object is closed
newPoints.append(edit_command.localize_vector(obj, newPoint))
obj.Points = newPoints
obj.recompute()
return
obj.recompute()
return
def delete_point(self, obj, node_idx):
if len(obj.Points) <= 2:
@@ -195,40 +189,29 @@ class DraftBSplineGuiTools(DraftWireGuiTools):
def add_point(self, edit_command, obj, pos):
"""Add point to obj.
"""
# self.setSelectState(obj, True)
selobjs = Gui.ActiveDocument.ActiveView.getObjectsInfo((pos[0],pos[1]))
if not selobjs:
info, pt = edit_command.get_specific_object_info(obj,pos)
if not info or (pt is None):
return
for info in selobjs:
if not info:
return
if obj.Name != info["Object"]:
return
if "x" in info:# prefer "real" 3D location over working-plane-driven one if possible
point = App.Vector(info["x"], info["y"], info["z"])
else:
continue
pts = obj.Points
if (obj.Closed == True):
curve = obj.Shape.Edges[0].Curve
else:
curve = obj.Shape.Curve
uNewPoint = curve.parameter(point)
uPoints = []
for p in obj.Points:
uPoints.append(curve.parameter(p))
for i in range(len(uPoints) - 1):
if ( uNewPoint > uPoints[i] ) and ( uNewPoint < uPoints[i+1] ):
pts.insert(i + 1, edit_command.localize_vector(obj, point))
break
# DNC: fix: add points to last segment if curve is closed
if obj.Closed and (uNewPoint > uPoints[-1]):
pts.append(edit_command.localize_vector(obj, point))
obj.Points = pts
pts = obj.Points
if (obj.Closed == True):
curve = obj.Shape.Edges[0].Curve
else:
curve = obj.Shape.Curve
uNewPoint = curve.parameter(pt)
uPoints = []
for p in obj.Points:
uPoints.append(curve.parameter(p))
for i in range(len(uPoints) - 1):
if ( uNewPoint > uPoints[i] ) and ( uNewPoint < uPoints[i+1] ):
pts.insert(i + 1, edit_command.localize_vector(obj, pt))
break
# DNC: fix: add points to last segment if curve is closed
if obj.Closed and (uNewPoint > uPoints[-1]):
pts.append(edit_command.localize_vector(obj, pt))
obj.Points = pts
obj.recompute()
return
class DraftRectangleGuiTools(GuiTools):
@@ -783,29 +766,10 @@ class DraftBezCurveGuiTools(GuiTools):
def add_point(self, edit_command, obj, pos):
"""Add point to obj and reset trackers.
"""
# self.setSelectState(obj, True)
selobjs = Gui.ActiveDocument.ActiveView.getObjectsInfo((pos[0],pos[1]))
if not selobjs:
info, pt = edit_command.get_specific_object_info(obj,pos)
if not info or (pt is None):
return
for info in selobjs:
if not info:
return
for o in edit_command.edited_objects:
if o.Name != info["Object"]:
continue
obj = o
break
if utils.get_type(obj) == "BezCurve": #to fix double vertex created
# pt = self.point
if "x" in info:# prefer "real" 3D location over working-plane-driven one if possible
pt = App.Vector(info["x"], info["y"], info["z"])
else:
continue
self.addPointToCurve(pt, obj, info)
obj.recompute()
return
def addPointToCurve(self, point, obj, info=None):
import Part
pts = obj.Points
@@ -814,7 +778,7 @@ class DraftBezCurveGuiTools(GuiTools):
edgeindex = int(info['Component'].lstrip('Edge')) - 1
wire = obj.Shape.Wires[0]
bz = wire.Edges[edgeindex].Curve
param = bz.parameter(point)
param = bz.parameter(pt)
seg1 = wire.Edges[edgeindex].copy().Curve
seg2 = wire.Edges[edgeindex].copy().Curve
seg1.segment(seg1.FirstParameter, param)
@@ -839,4 +803,6 @@ class DraftBezCurveGuiTools(GuiTools):
obj.Points = pts
obj.recompute()
## @}