primera subida
This commit is contained in:
379
Utils/polyline.py
Normal file
379
Utils/polyline.py
Normal file
@@ -0,0 +1,379 @@
|
||||
from draftobjects.base import DraftObject
|
||||
from draftutils.utils import get_param
|
||||
|
||||
|
||||
class circle(DraftObject):
|
||||
def __init__(self, obj):
|
||||
''' Creates a circle object '''
|
||||
super(circle, self).__init__(obj, "Circle")
|
||||
self.type = 'circle'
|
||||
self.components = []
|
||||
|
||||
def execute(self, obj):
|
||||
''' Executes the circle '''
|
||||
import FreeCAD as App
|
||||
import DraftGeomUtils
|
||||
import DraftVecUtils
|
||||
|
||||
center = get_param(obj, "center")
|
||||
radius = get_param(obj, "radius")
|
||||
|
||||
if center is None:
|
||||
center = App.Vector(0, 0, 0)
|
||||
if radius is None:
|
||||
radius = 1
|
||||
|
||||
center = DraftVecUtils.to_vector(center)
|
||||
radius = DraftVecUtils.to_vector(radius)
|
||||
|
||||
circle = DraftGeomUtils.make_circle(center, radius)
|
||||
|
||||
self.components.append(circle)
|
||||
|
||||
class line(DraftObject):
|
||||
def __init__(self, obj):
|
||||
''' Creates a line object '''
|
||||
super(line, self).__init__(obj, "Line")
|
||||
self.type = 'line'
|
||||
self.components = []
|
||||
|
||||
def execute(self, obj):
|
||||
''' Executes the line '''
|
||||
import FreeCAD as App
|
||||
import DraftGeomUtils
|
||||
import DraftVecUtils
|
||||
|
||||
start = get_param(obj, "start")
|
||||
end = get_param(obj, "end")
|
||||
|
||||
if start is None:
|
||||
start = App.Vector(0, 0, 0)
|
||||
if end is None:
|
||||
end = App.Vector(1, 1, 1)
|
||||
|
||||
start = DraftVecUtils.to_vector(start)
|
||||
end = DraftVecUtils.to_vector(end)
|
||||
|
||||
line = DraftGeomUtils.make_line(start, end)
|
||||
|
||||
self.components.append(line)
|
||||
|
||||
|
||||
class polyline(DraftObject):
|
||||
def __init__(self, obj):
|
||||
''' Creates a polyline object '''
|
||||
super(Wire, self).__init__(obj, "Wire")
|
||||
self.type = 'polyline'
|
||||
self.components = []
|
||||
|
||||
def execute(self, obj):
|
||||
''' Executes the polyline '''
|
||||
import FreeCAD as App
|
||||
import Part
|
||||
V1 = App.Vector(0, 10, 0)
|
||||
V2 = App.Vector(30, 10, 0)
|
||||
V3 = App.Vector(30, -10, 0)
|
||||
V4 = App.Vector(0, -10, 0)
|
||||
|
||||
VC1 = App.Vector(-10, 0, 0)
|
||||
C1 = Part.Arc(V1, VC1, V4)
|
||||
VC2 = App.Vector(40, 0, 0)
|
||||
C2 = Part.Arc(V2, VC2, V3)
|
||||
|
||||
L1 = Part.LineSegment(V1, V2)
|
||||
L2 = Part.LineSegment(V3, V4)
|
||||
|
||||
S1 = Part.Shape([C1, L1, C2, L2])
|
||||
|
||||
W = Part.Wire(S1.Edges)
|
||||
|
||||
|
||||
|
||||
import FreeCAD as App
|
||||
import Part
|
||||
|
||||
class Polyline:
|
||||
def __init__(self):
|
||||
self.segments = []
|
||||
self.setProperties(obj)
|
||||
|
||||
def setProperties(self, obj):
|
||||
''' do something '''
|
||||
|
||||
def onDocumentRestored(self,obj):
|
||||
self.setProperties(obj)
|
||||
|
||||
def add_line(self, start, end):
|
||||
line_segment = Part.LineSegment(start, end)
|
||||
self.segments.append(line_segment)
|
||||
|
||||
def add_arc(self, start, end, center, tangent=True):
|
||||
if tangent:
|
||||
arc = Part.ArcOfCircle(start, end, center)
|
||||
else:
|
||||
start_point = start - center
|
||||
end_point = end - center
|
||||
arc = Part.ArcOfCircle(start_point, end_point, center)
|
||||
self.segments.append(arc)
|
||||
|
||||
def create_wire(self):
|
||||
wire = Part.Wire(self.segments)
|
||||
return wire
|
||||
|
||||
def create_shape(self):
|
||||
wire = self.create_wire()
|
||||
shape = Part.Shape(wire)
|
||||
return shape
|
||||
|
||||
def create_object(self, name):
|
||||
shape = self.create_shape()
|
||||
obj = App.ActiveDocument.addObject("Part::Feature", name)
|
||||
obj.Shape = shape
|
||||
return obj
|
||||
|
||||
def execute(self,obj):
|
||||
''' '''
|
||||
|
||||
class editPolyline:
|
||||
def __init__(self):
|
||||
import draftguitools.gui_trackers as DraftTrackers
|
||||
|
||||
self.objects = []
|
||||
self.state = 0
|
||||
self.direction = None
|
||||
self.distance = 1500
|
||||
self.point = None
|
||||
self.tracker = DraftTrackers.wireTracker(Part.Wire(Part.makePolygon([FreeCAD.Vector(),FreeCAD.Vector(1,1,1)])))
|
||||
|
||||
# event callbacks
|
||||
self._keyPressedCB = None
|
||||
self._mouseMovedCB = None
|
||||
self._mousePressedCB = None
|
||||
|
||||
self.view = FreeCADGui.activeDocument().activeView()
|
||||
self.render_manager = FreeCADGui.ActiveDocument.ActiveView.getViewer().getSoRenderManager()
|
||||
|
||||
# Callbacks
|
||||
self.unregister_editing_callbacks()
|
||||
self.register_editing_callbacks()
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# SCENE EVENTS CALLBACKS
|
||||
# -------------------------------------------------------------------------
|
||||
def register_editing_callbacks(self):
|
||||
""" Register editing callbacks (former action function) """
|
||||
|
||||
print("Registering callbacks")
|
||||
if self._keyPressedCB is None:
|
||||
self._keyPressedCB = self.view.addEventCallbackPivy(coin.SoKeyboardEvent.getClassTypeId(), self.keyPressed)
|
||||
|
||||
if self._mousePressedCB is None:
|
||||
self._mousePressedCB = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.mousePressed)
|
||||
|
||||
if self._mouseMovedCB is None:
|
||||
self._mouseMovedCB = self.view.addEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(), self.mouseMoved)
|
||||
|
||||
print("end Registering callbacks")
|
||||
|
||||
def unregister_editing_callbacks(self):
|
||||
""" Remove callbacks used during editing if they exist """
|
||||
|
||||
print("Unregistering callbacks")
|
||||
if self._keyPressedCB:
|
||||
self.view.removeEventCallbackPivy(coin.SoKeyboardEvent.getClassTypeId(), self._keyPressedCB)
|
||||
self._keyPressedCB = None
|
||||
|
||||
if self._mousePressedCB:
|
||||
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self._mousePressedCB)
|
||||
self._mousePressedCB = None
|
||||
|
||||
if self._mouseMovedCB:
|
||||
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(), self._mouseMovedCB)
|
||||
self._mouseMovedCB = None
|
||||
print("End unregistering callbacks")
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# SCENE EVENT HANDLERS
|
||||
# -------------------------------------------------------------------------
|
||||
def keyPressed(self, event_callback):
|
||||
event = event_callback.getEvent()
|
||||
print(event.getKey())
|
||||
if event.getState() == event.UP:
|
||||
if event.getKey() == 65307:
|
||||
self.quit()
|
||||
elif event.getKey() == 65293:
|
||||
print("ENTER")
|
||||
self.state += 1
|
||||
if self.state == 2:
|
||||
'''print("----------------------------------------------------------------")
|
||||
print(" -- objects: ")
|
||||
print(self.objects)
|
||||
print(" -- distance:")
|
||||
print(self.distance)
|
||||
print("----------------------------------------------------------------")'''
|
||||
self.calculateTrenches()
|
||||
self.quit()
|
||||
|
||||
'''elif event.getKey() == ord("q"): # or event.getKey() == ord(65307):
|
||||
if self.obj:
|
||||
self.obj.ViewObject.Proxy.doubleClicked(self.obj.ViewObject)
|
||||
else:
|
||||
self.quit()
|
||||
elif event.getKey() == ord("s"):
|
||||
sel = FreeCADGui.Selection.getSelectionEx()
|
||||
tup = None
|
||||
if len(sel) == 1:
|
||||
tup = (sel[0].Object, sel[0].SubElementNames)
|
||||
for i in range(len(self.selected_objects)):
|
||||
if isinstance(self.selected_objects[i], MarkerOnShape):
|
||||
self.selected_objects[i].sublink = tup
|
||||
# FreeCAD.Console.PrintMessage("Snapped to {}\n".format(str(self.selected_objects[i].sublink)))
|
||||
self.selected_objects[i].drag_start()
|
||||
self.selected_objects[i].drag((0, 0, 0.))
|
||||
self.selected_objects[i].drag_release()
|
||||
elif (event.getKey() == 65535) or (event.getKey() == 65288): # Suppr or Backspace
|
||||
# FreeCAD.Console.PrintMessage("Some objects have been deleted\n")
|
||||
pts = list()
|
||||
for o in self.dynamic_objects:
|
||||
if isinstance(o, MarkerOnShape):
|
||||
pts.append(o)
|
||||
self.points = pts
|
||||
self.setupInteractionSeparator()'''
|
||||
|
||||
def mousePressed(self, event_callback):
|
||||
""" Mouse button event handler, calls: startEditing, endEditing, addPoint, delPoint """
|
||||
event = event_callback.getEvent()
|
||||
pos = event.getPosition().getValue()
|
||||
listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]), int(pos[1])))
|
||||
|
||||
if event.getButton() == event.BUTTON1: # left click
|
||||
if event.getState() == coin.SoMouseButtonEvent.DOWN:
|
||||
if self.state == 0:
|
||||
''' Select objects '''
|
||||
obj = FreeCAD.ActiveDocument.getObject(listObjects[0]['Object'])
|
||||
if obj in self.objects:
|
||||
self.objects.remove(obj)
|
||||
else:
|
||||
self.objects.append(obj)
|
||||
numobjs = len(self.objects)
|
||||
if numobjs == 0:
|
||||
self.tracker.finalize()
|
||||
elif numobjs == 1:
|
||||
self.tracker.updateFromPointlist([obj.Placement.Base for obj in self.objects])
|
||||
self.tracker.on()
|
||||
else:
|
||||
self.tracker.updateFromPointlist([obj.Placement.Base for obj in self.objects])
|
||||
|
||||
|
||||
elif self.state == 1:
|
||||
''' Select distance and direction '''
|
||||
self.direction = FreeCAD.Vector(listObjects[0]['x'], listObjects[0]['y'], listObjects[0]['z'])
|
||||
#self.point = None
|
||||
|
||||
elif event.getState() == coin.SoMouseButtonEvent.UP:
|
||||
if listObjects and self.point:
|
||||
if self.state == 0:
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
for obj in listObjects:
|
||||
FreeCADGui.Selection.addSelection(obj)
|
||||
|
||||
"""if (event.getState() == coin.SoMouseButtonEvent.DOWN) and (
|
||||
event.getButton() == event.BUTTON1): # left click
|
||||
print("Mouse button down and mouse button 1")
|
||||
if not event.wasAltDown():
|
||||
if self.editing is None:
|
||||
''' do something'''
|
||||
else:
|
||||
self.endEditing(self.obj, self.editing)
|
||||
|
||||
elif event.wasAltDown(): # left click with ctrl down
|
||||
self.display_tracker_menu(event)
|
||||
|
||||
elif (event.getState() == coin.SoMouseButtonEvent.DOWN) and (
|
||||
event.getButton() == event.BUTTON2): # right click
|
||||
self.display_tracker_menu(event)"""
|
||||
|
||||
def mouseMoved(self, event_callback):
|
||||
""" Execute as callback for mouse movement. Update tracker position and update preview ghost. """
|
||||
if self.state == 1:
|
||||
event = event_callback.getEvent()
|
||||
pos = event.getPosition().getValue()
|
||||
listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]), int(pos[1])))
|
||||
print(listObjects)
|
||||
point = FreeCAD.Vector(listObjects[0]['x'], listObjects[0]['y'], listObjects[0]['z'])
|
||||
pts = [obj.Placement.Base for obj in self.objects]
|
||||
offset = point.sub(pts[0])
|
||||
self.tracker.updateFromPointlist([point.add(offset) for point in pts])
|
||||
|
||||
'''listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]), int(pos[1])))
|
||||
if listObjects:
|
||||
# {'x': 483239.09375, 'y': 783855.8125, 'z': 797695.0, 'Document': 'Salinas_II_GRG___v3',
|
||||
# 'Object': 'Wire023', 'Component': 'Edge30'}]
|
||||
for obj in listObjects:
|
||||
print(listObjects)
|
||||
if obj.Object == self.obj.Name:
|
||||
print(listObjects)
|
||||
'''
|
||||
|
||||
def calculateTrenches(self):
|
||||
if len(self.objects)>1:
|
||||
import Draft
|
||||
pts = [obj.Placement.Base for obj in self.objects]
|
||||
vec = self.direction.sub(pts[0])
|
||||
pts1 = [point.add(vec) for point in pts]
|
||||
for i in range(len(pts1) - 1):
|
||||
makeTrench(Draft.makeLine(pts1[i], pts1[i + 1]))
|
||||
|
||||
return
|
||||
pts = [obj.Placement.Base for obj in FreeCADGui.Selection.getSelection()]
|
||||
from sklearn.cluster import OPTICS, cluster_optics_dbscan
|
||||
import numpy as np
|
||||
clust = OPTICS(min_samples = 5, xi=0.05, min_cluster_size=0.05)
|
||||
X = np.array(pts)
|
||||
|
||||
# Run the fit
|
||||
clust.fit(X)
|
||||
|
||||
labels_050 = cluster_optics_dbscan(
|
||||
reachability=clust.reachability_,
|
||||
core_distances=clust.core_distances_,
|
||||
ordering=clust.ordering_,
|
||||
eps=0.5,
|
||||
)
|
||||
labels_200 = cluster_optics_dbscan(
|
||||
reachability=clust.reachability_,
|
||||
core_distances=clust.core_distances_,
|
||||
ordering=clust.ordering_,
|
||||
eps=2,
|
||||
)
|
||||
|
||||
space = np.arange(len(X))
|
||||
reachability = clust.reachability_[clust.ordering_]
|
||||
labels = clust.labels_[clust.ordering_]
|
||||
print("\n")
|
||||
print(" Space: ", space)
|
||||
print(" Reachability", reachability)
|
||||
print(" Labels", labels)
|
||||
|
||||
return
|
||||
from scipy import stats
|
||||
xx = list()
|
||||
yy = list()
|
||||
zz = list()
|
||||
for point in pts:
|
||||
xx.append(point.x)
|
||||
yy.append(point.y)
|
||||
zz.append(point.z)
|
||||
slope, intercept, r, p, std_err = stats.linregress(xx, yy)
|
||||
def myfunc(val):
|
||||
return slope * val + intercept
|
||||
|
||||
newzz = list(map(myfunc, [xx[0], xx[-1]]))
|
||||
points3D = list()
|
||||
points3D.append(FreeCAD.Vector(xx[0], yy[0], newzz[0]))
|
||||
points3D.append(FreeCAD.Vector(xx[-1], yy[-1], newzz[1]))
|
||||
|
||||
def quit(self):
|
||||
print("Quit")
|
||||
self.tracker.finalize()
|
||||
self.unregister_editing_callbacks()
|
||||
Reference in New Issue
Block a user