Assembly: Remove JointObject camera callbacks. And fix lock highlight.
This commit is contained in:
committed by
Chris Hennes
parent
d71fcf7593
commit
eab65cc42c
@@ -145,31 +145,6 @@ def solveIfAllowed(assembly, storePrev=False):
|
||||
assembly.solve(storePrev)
|
||||
|
||||
|
||||
def get_camera_height(gui_doc):
|
||||
activeView = get_active_view(gui_doc)
|
||||
if activeView is None:
|
||||
return 200
|
||||
|
||||
camera = activeView.getCameraNode()
|
||||
|
||||
# Check if the camera is a perspective camera
|
||||
if isinstance(camera, coin.SoPerspectiveCamera):
|
||||
return camera.focalDistance.getValue()
|
||||
elif isinstance(camera, coin.SoOrthographicCamera):
|
||||
return camera.height.getValue()
|
||||
else:
|
||||
# Default value if camera type is unknown
|
||||
return 200
|
||||
|
||||
|
||||
def get_active_view(gui_doc):
|
||||
activeView = gui_doc.ActiveView
|
||||
if activeView is None:
|
||||
# Fall back on current active document.
|
||||
activeView = Gui.ActiveDocument.ActiveView
|
||||
return activeView
|
||||
|
||||
|
||||
# The joint object consists of 2 JCS (joint coordinate systems) and a Joint Type.
|
||||
# A JCS is a placement that is computed (unless it is detached) from references (PropertyXLinkSubHidden) that links to :
|
||||
# - An object: this can be any Part::Feature solid. Or a PartDesign Body. Or a App::Link to those.
|
||||
@@ -816,6 +791,7 @@ class ViewProviderJoint:
|
||||
def attach(self, vobj):
|
||||
"""Setup the scene sub-graph of the view provider, this method is mandatory"""
|
||||
self.axis_thickness = 3
|
||||
self.scaleFactor = 20
|
||||
|
||||
view_params = App.ParamGet("User parameter:BaseApp/Preferences/View")
|
||||
param_x_axis_color = view_params.GetUnsigned("AxisXColor", 0xCC333300)
|
||||
@@ -832,23 +808,11 @@ class ViewProviderJoint:
|
||||
self.app_obj = vobj.Object
|
||||
app_doc = self.app_obj.Document
|
||||
self.gui_doc = Gui.getDocument(app_doc)
|
||||
activeView = get_active_view(self.gui_doc)
|
||||
if activeView is not None:
|
||||
camera = activeView.getCameraNode()
|
||||
self.cameraSensor = coin.SoFieldSensor(self.camera_callback, camera)
|
||||
if isinstance(camera, coin.SoPerspectiveCamera):
|
||||
self.cameraSensor.attach(camera.focalDistance)
|
||||
elif isinstance(camera, coin.SoOrthographicCamera):
|
||||
self.cameraSensor.attach(camera.height)
|
||||
|
||||
self.transform1 = coin.SoTransform()
|
||||
self.transform2 = coin.SoTransform()
|
||||
self.transform3 = coin.SoTransform()
|
||||
|
||||
scaleF = self.get_JCS_size()
|
||||
self.axisScale = coin.SoScale()
|
||||
self.axisScale.scaleFactor.setValue(scaleF, scaleF, scaleF)
|
||||
|
||||
self.draw_style = coin.SoDrawStyle()
|
||||
self.draw_style.style = coin.SoDrawStyle.LINES
|
||||
self.draw_style.lineWidth = self.axis_thickness
|
||||
@@ -867,10 +831,6 @@ class ViewProviderJoint:
|
||||
self.display_mode.addChild(self.switch_JCS_preview)
|
||||
vobj.addDisplayMode(self.display_mode, "Wireframe")
|
||||
|
||||
def camera_callback(self, *args):
|
||||
scaleF = self.get_JCS_size()
|
||||
self.axisScale.scaleFactor.setValue(scaleF, scaleF, scaleF)
|
||||
|
||||
def JCS_sep(self, soTransform):
|
||||
JCS = coin.SoAnnotation()
|
||||
JCS.addChild(soTransform)
|
||||
@@ -888,6 +848,7 @@ class ViewProviderJoint:
|
||||
switch_JCS = coin.SoSwitch()
|
||||
switch_JCS.addChild(JCS)
|
||||
switch_JCS.whichChild = coin.SO_SWITCH_NONE
|
||||
|
||||
return switch_JCS
|
||||
|
||||
def line_sep(self, startPoint, endPoint, soColor):
|
||||
@@ -897,12 +858,16 @@ class ViewProviderJoint:
|
||||
coords.point.setValues(0, [startPoint, endPoint])
|
||||
|
||||
axis_sep = coin.SoAnnotation()
|
||||
axis_sep.addChild(self.axisScale)
|
||||
axis_sep.addChild(self.draw_style)
|
||||
axis_sep.addChild(soColor)
|
||||
axis_sep.addChild(coords)
|
||||
axis_sep.addChild(line)
|
||||
return axis_sep
|
||||
|
||||
scale = coin.SoType.fromName("SoShapeScale").createInstance()
|
||||
scale.setPart("shape", axis_sep)
|
||||
scale.scaleFactor = self.scaleFactor
|
||||
|
||||
return scale
|
||||
|
||||
def plane_sep(self, size, num_vertices):
|
||||
coords = coin.SoCoordinate3()
|
||||
@@ -930,16 +895,17 @@ class ViewProviderJoint:
|
||||
material.transparency.setValue(0.3)
|
||||
|
||||
face_sep = coin.SoAnnotation()
|
||||
face_sep.addChild(self.axisScale)
|
||||
face_sep.addChild(transform)
|
||||
face_sep.addChild(draw_style)
|
||||
face_sep.addChild(material)
|
||||
face_sep.addChild(coords)
|
||||
face_sep.addChild(face)
|
||||
return face_sep
|
||||
|
||||
def get_JCS_size(self):
|
||||
return get_camera_height(self.gui_doc) / 20
|
||||
scale = coin.SoType.fromName("SoShapeScale").createInstance()
|
||||
scale.setPart("shape", face_sep)
|
||||
scale.scaleFactor = self.scaleFactor
|
||||
|
||||
return scale
|
||||
|
||||
def set_JCS_placement(self, soTransform, placement, ref):
|
||||
# change plc to be relative to the origin of the document.
|
||||
@@ -1133,6 +1099,8 @@ class ViewProviderGroundedJoint:
|
||||
if groundedObj is None:
|
||||
return
|
||||
|
||||
self.scaleFactor = 1.5
|
||||
|
||||
lockpadColorInt = Preferences.preferences().GetUnsigned("AssemblyConstraints", 0xCC333300)
|
||||
self.lockpadColor = coin.SoBaseColor()
|
||||
self.lockpadColor.rgb.setValue(UtilsAssembly.color_from_unsigned(lockpadColorInt))
|
||||
@@ -1141,101 +1109,93 @@ class ViewProviderGroundedJoint:
|
||||
app_doc = self.app_obj.Document
|
||||
self.gui_doc = Gui.getDocument(app_doc)
|
||||
|
||||
activeView = get_active_view(self.gui_doc)
|
||||
if activeView is not None:
|
||||
camera = activeView.getCameraNode()
|
||||
|
||||
self.cameraSensor = coin.SoFieldSensor(self.camera_callback, camera)
|
||||
if isinstance(camera, coin.SoPerspectiveCamera):
|
||||
self.cameraSensor.attach(camera.focalDistance)
|
||||
elif isinstance(camera, coin.SoOrthographicCamera):
|
||||
self.cameraSensor.attach(camera.height)
|
||||
|
||||
self.cameraSensorRot = coin.SoFieldSensor(self.camera_callback_rotation, camera)
|
||||
self.cameraSensorRot.attach(camera.orientation)
|
||||
|
||||
factor = self.get_lock_factor()
|
||||
self.scale = coin.SoScale()
|
||||
self.scale.scaleFactor.setValue(factor, factor, factor)
|
||||
|
||||
self.draw_style = coin.SoDrawStyle()
|
||||
self.draw_style.lineWidth = 5
|
||||
|
||||
# Create transformation (position and orientation)
|
||||
self.transform = coin.SoTransform()
|
||||
self.set_lock_position(groundedObj)
|
||||
self.set_lock_rotation()
|
||||
|
||||
# Create the 2D components of the lockpad: a square and two arcs
|
||||
# Creating a square
|
||||
squareCoords = [
|
||||
(-5, -4, 0),
|
||||
(5, -4, 0),
|
||||
(5, 4, 0),
|
||||
(-5, 4, 0),
|
||||
] # Simple square, adjust size as needed
|
||||
self.square = coin.SoAnnotation()
|
||||
squareVertices = coin.SoCoordinate3()
|
||||
squareVertices.point.setValues(0, 4, squareCoords)
|
||||
squareFace = coin.SoFaceSet()
|
||||
squareFace.numVertices.setValue(4)
|
||||
self.square.addChild(squareVertices)
|
||||
self.square.addChild(squareFace)
|
||||
self.square = self.create_square()
|
||||
|
||||
# Creating the arcs (approximated with line segments)
|
||||
self.arc = self.create_arc(0, 4, 3.5, 0, 180)
|
||||
self.arc = self.create_arc(0, 4, 4, 0, 180)
|
||||
|
||||
self.pick = coin.SoPickStyle()
|
||||
self.pick.style.setValue(coin.SoPickStyle.SHAPE_ON_TOP)
|
||||
|
||||
# Assemble the parts into a scenegraph
|
||||
self.lockpadSeparator = coin.SoAnnotation()
|
||||
self.lockpadSeparator.addChild(self.pick)
|
||||
self.lockpadSeparator.addChild(self.transform)
|
||||
self.lockpadSeparator.addChild(self.scale)
|
||||
self.lockpadSeparator = coin.SoSeparator()
|
||||
self.lockpadSeparator.addChild(self.lockpadColor)
|
||||
self.lockpadSeparator.addChild(self.square)
|
||||
self.lockpadSeparator.addChild(self.arc)
|
||||
|
||||
# Use SoVRMLBillboard to make sure the lockpad always faces the camera
|
||||
self.billboard = coin.SoVRMLBillboard()
|
||||
self.billboard.addChild(self.lockpadSeparator)
|
||||
|
||||
self.scale = coin.SoType.fromName("SoShapeScale").createInstance()
|
||||
self.scale.setPart("shape", self.billboard)
|
||||
self.scale.scaleFactor = self.scaleFactor
|
||||
|
||||
self.transformSeparator = coin.SoSeparator()
|
||||
self.transformSeparator.addChild(self.transform)
|
||||
self.transformSeparator.addChild(self.pick)
|
||||
self.transformSeparator.addChild(self.scale)
|
||||
|
||||
# Attach the scenegraph to the view provider
|
||||
vobj.addDisplayMode(self.lockpadSeparator, "Wireframe")
|
||||
vobj.addDisplayMode(self.transformSeparator, "Wireframe")
|
||||
|
||||
def create_square(self):
|
||||
coords = [
|
||||
(-5, -4, 0),
|
||||
(5, -4, 0),
|
||||
(5, 4, 0),
|
||||
(-5, 4, 0),
|
||||
]
|
||||
vertices = coin.SoCoordinate3()
|
||||
vertices.point.setValues(0, 4, coords)
|
||||
|
||||
squareFace = coin.SoFaceSet()
|
||||
squareFace.numVertices.setValue(4)
|
||||
|
||||
square = coin.SoAnnotation()
|
||||
square.addChild(vertices)
|
||||
square.addChild(squareFace)
|
||||
|
||||
return square
|
||||
|
||||
def create_arc(self, centerX, centerY, radius, startAngle, endAngle):
|
||||
arc = coin.SoAnnotation()
|
||||
coords = coin.SoCoordinate3()
|
||||
points = []
|
||||
for angle in range(startAngle, endAngle + 1): # Increment can be adjusted for smoother arcs
|
||||
coords = []
|
||||
for angle in range(
|
||||
startAngle, endAngle + 1, 5
|
||||
): # Increment can be adjusted for smoother arcs
|
||||
rad = math.radians(angle)
|
||||
x = centerX + math.cos(rad) * radius
|
||||
y = centerY + math.sin(rad) * radius
|
||||
points.append((x, y, 0))
|
||||
coords.point.setValues(0, len(points), points)
|
||||
line = coin.SoLineSet()
|
||||
line.numVertices.setValue(len(points))
|
||||
arc.addChild(coords)
|
||||
arc.addChild(self.draw_style)
|
||||
coords.append((x, y, 0))
|
||||
|
||||
radius = radius * 0.7
|
||||
for angle in range(endAngle + 1, startAngle - 1, -5): # Step backward
|
||||
rad = math.radians(angle)
|
||||
x = centerX + math.cos(rad) * radius
|
||||
y = centerY + math.sin(rad) * radius
|
||||
coords.append((x, y, 0))
|
||||
|
||||
vertices = coin.SoCoordinate3()
|
||||
vertices.point.setValues(0, len(coords), coords)
|
||||
|
||||
shapeHints = coin.SoShapeHints()
|
||||
shapeHints.faceType = coin.SoShapeHints.UNKNOWN_FACE_TYPE
|
||||
|
||||
line = coin.SoFaceSet()
|
||||
line.numVertices.setValue(len(coords))
|
||||
|
||||
arc = coin.SoAnnotation()
|
||||
arc.addChild(shapeHints)
|
||||
arc.addChild(vertices)
|
||||
arc.addChild(line)
|
||||
|
||||
return arc
|
||||
|
||||
def camera_callback(self, *args):
|
||||
factor = self.get_lock_factor()
|
||||
self.scale.scaleFactor.setValue(factor, factor, factor)
|
||||
|
||||
def camera_callback_rotation(self, *args):
|
||||
self.set_lock_rotation()
|
||||
|
||||
def set_lock_rotation(self):
|
||||
activeView = get_active_view(self.gui_doc)
|
||||
if activeView is not None:
|
||||
camera = activeView.getCameraNode()
|
||||
rotation = camera.orientation.getValue()
|
||||
|
||||
q = rotation.getValue()
|
||||
self.transform.rotation.setValue(q[0], q[1], q[2], q[3])
|
||||
|
||||
def get_lock_factor(self):
|
||||
return get_camera_height(self.gui_doc) / 300
|
||||
|
||||
def set_lock_position(self, groundedObj):
|
||||
bBox = groundedObj.ViewObject.getBoundingBox()
|
||||
if bBox.isValid():
|
||||
|
||||
Reference in New Issue
Block a user