def setCurrentPrimParms(self, isHandle, prim_num, prim_u): currentGlobalFrame = -1 if isHandle: self._currentHandle = prim_num self._currentPrimU = -1 self._currentPrim = -1 point = self._geometryTimeHandles.point(prim_num) if point is not None: if self._geometryTimeHandles.findPointAttrib( 'primid') is not None: self._currentPrim = point.attribValue("primid") else: self._currentPrim = prim_num self._currentHandle = -1 self._currentPrimU = prim_u if prim_num > -1: self._currentPrimDist = self.readPointPrimDistAttrib( self._geometryPosPaths, self._currentPoint) currentGlobalFrame = self.readGlobalFrameAttribAtInsertPoint() pu.setNodeParm(self._node, "activePoint", self._currentHandle) pu.setNodeParm(self._node, "activePrim", self._currentPrim) pu.setNodeParm(self._node, "activePrimU", self._currentPrimU) pu.setNodeParm(self._node, "currentPrimDist", self._currentPrimDist) pu.setNodeParm(self._node, "currentGlobalFrame", currentGlobalFrame)
def updateCurrentPrimParmsFromGeometry(self): activeTipPoint = self.readGeoDetailAttrib(self._geometry, "_lastActiveTipPoint") #if self._curre self.setActiveTipPoint(activeTipPoint, False, False) pu.setNodeParm(self._node, "activePoint", self._currentHandle) self.setCurrentPrimParms(False, -1, -1)
def opRemoveHandle(self): #self.setBrushOp('remove') self.setBrushMode('addremove') self.setAddRemoveOp('remove') self.setIsSelectionEvent(True) pu.setNodeParm(self._node, 'selectedPointsGroup', str(self._currentHandle)) self.stampBrushOp('remove')
def stashEditedPoints(self): stashPoints = self._stasherTimingPoints.geometry().freeze(True, True) pu.setNodeParm(self._node, 'stash_timing_points', stashPoints, True) #self.log(self._currentBrushOp) if self._isSelectionEvent: self.setIsSelectionEvent(False) pu.setNodeParm(self._node, 'selectedPointsGroup', "")
def stashEditedPoints(self): if pu.evalNodeParm(self._node, 'autoslideDist') == True: self._parent.timingStashEditedPoints() stashPoints = self._stasherAllPoints.geometry().freeze(True, True) pu.setNodeParm(self._node, 'stash_all_points', stashPoints, True) #self.log(self._currentBrushOp) if self._isSelectionEvent: self.setIsSelectionEvent(False) pu.setNodeParm(self._node, 'selectedPointsGroup', "")
def updateSustainedAction(self): #self.setBrushPosition(self._brushPosition) #self.setCursorScreenPos(self._lastMouseX, self._lastMouseY) #isAgentAnchor, isHandle, prim_num, prim_u, snap_pos = self.intersectExistingPrims(self._rayOrigin, self._rayDir) prim_num, snap_pos = ci.getNearestHandleToCursor( self._geometryAgentAnchors, self._rayOrigin, self._rayDir) if prim_num > -1: pu.setNodeParm(self._node, "snapPoint", prim_num) self._brushPosition = snap_pos else: pu.setNodeParm(self._node, "snapPoint", -1) self.setBrushPositionEnd(self._brushPosition) self.setCursorScreenPosEnd(self._lastMouseX, self._lastMouseY)
def onSelection(self, kwargs): selection = kwargs["selection"] self.setIsSelectionEvent(True) ### Convert all selection types to Points Or set string to -1 for no selection if len(selection.selections()) > 0: selection.setGeometryType(hou.geometryType.Points) selectionString = selection.mergedSelectionString( empty_string_selects_all=False) else: selectionString = str(-1) pu.setNodeParm(self._node, 'selectedPointsGroup', selectionString, True, 'brush: Change Selection') # Must return True to accept the selection? return False
def setActiveTipPoint(self, pointnum, ishandle, readfromprim): activeTip = pointnum if readfromprim: firstPoint = self.readGeoPrimAttrib(self._geometry, "_firstPoint", self._currentPrim) lastPoint = self.readGeoPrimAttrib(self._geometry, "_lastPoint", self._currentPrim) if ishandle and pointnum == firstPoint: activeTip = firstPoint else: activeTip = lastPoint pu.setNodeParm(self._node, "activeTipPoint", activeTip, True, "brush: Set Tip Point")
def setCurrentPrimParms(self, isHandle, prim_num, pt_num): currentGlobalFrame = -1 if isHandle: self._currentHandle = prim_num self._currentPrim = -1 point = self._geometryTrajHandles.point(prim_num) if point is not None: if self._geometryTrajHandles.findPointAttrib( 'primid') is not None: self._currentPrim = point.attribValue("primid") else: self._currentPrim = prim_num self._currentHandle = pt_num pu.setNodeParm(self._node, "activePoint", self._currentHandle) pu.setNodeParm(self._node, "activePrim", self._currentPrim)
def setPathMode(self, modename): #self.log(typename) value = self.PATHMODES.index(modename) self._pathMode = modename pu.setNodeParm(self._node, 'path_mode', modename, onlyifchanged=True) if self._pathMode == 'position': self._classTiming.onInterrupt(kwargs={}) self._classPosition.onResume(kwargs={}) self._classTiming.showAgentGuides(False) elif self._pathMode == 'timing': self._classPosition.onInterrupt(kwargs={}) self._classTiming.onResume(kwargs={}) self._classTiming.showAgentGuides(True) else: self.log("pathMode not set")
def setCurrentPrimParms(self, isHandle, prim_num, prim_u): if isHandle: self._currentHandle = prim_num self._currentPrimU = -1 #self.log(isHandle) #self.log(prim_num) self._currentPrim = -1 point = self._geometry.point(prim_num) if point is not None: pointprim = point.prims() if len(pointprim) > 0: self._currentPrim = pointprim[0].number() else: self._currentPrim = prim_num self._currentHandle = -1 self._currentPrimU = prim_u pu.setNodeParm(self._node, "activePoint", self._currentHandle, onlyifchanged=True) pu.setNodeParm(self._node, "activePrim", self._currentPrim, onlyifchanged=True) pu.setNodeParm(self._node, "activePrimU", self._currentPrimU, onlyifchanged=True)
def onMenuAction(self, kwargs): ### Define what to do when an item in the menu is pressed. menu_item = kwargs['menu_item'] node = kwargs['node'] ### Getting the dict entry of a radiogroup returns its string value #self.log(kwargs['radio_xformOp']) self.log(menu_item) if kwargs["menu_item"] == "radio_brushMode": self.setBrushMode(kwargs['radio_brushMode']) elif kwargs["menu_item"] == "radio_xformOp": self.setXformOp(kwargs['radio_xformOp']) self.setBrushMode('xform') elif kwargs["menu_item"] == "radio_brushType": self.setBrushType(kwargs['radio_brushType']) elif kwargs["menu_item"] == "action_lockPoints": self.opLockPoints() elif kwargs["menu_item"] == "action_unlockPoints": self.opUnlockPoints() elif kwargs["menu_item"] == "toggle_selectAllPrimPoints": pu.setNodeParm(self._node, 'selectAllPrimPoints', kwargs['toggle_selectAllPrimPoints'], True, 'Invert Selection Mask') elif kwargs["menu_item"] == "toggle_affectAhead": pu.setNodeParm(self._node, 'affectAhead', kwargs['toggle_affectAhead'], True, 'Toggle Affect Ahead') elif kwargs["menu_item"] == "toggle_affectBehind": pu.setNodeParm(self._node, 'affectBehind', kwargs['toggle_affectBehind'], True, 'Toggle Affect Behind')
def setTimeOp(self, opname): value = self.TIMEOPS.index(opname) pu.setNodeParm(self._node, 'time_op', value)
def onMouseEvent(self, kwargs): ui_event = kwargs["ui_event"] device = ui_event.device() vp = ui_event.curViewport() #self.log(ui_event.reason()) MOUSEUP = ui_event.reason() == hou.uiEventReason.Changed MOUSEDOWN = ui_event.reason() == hou.uiEventReason.Start PICKED = ui_event.reason() == hou.uiEventReason.Picked MOUSEDRAG = ui_event.reason() == hou.uiEventReason.Active MOVED = ui_event.reason() == hou.uiEventReason.Located SINGLECLICK = MOUSEDOWN or PICKED SHIFT = device.isShiftKey() CTRL = device.isCtrlKey() LEFT_BUTTON = device.isLeftButton() MIDDLE_BUTTON = device.isMiddleButton() RIGHT_BUTTON = device.isRightButton() #self.log("LEFT_BUTTON", LEFT_BUTTON) #self.log("MIDDLE_BUTTON", MIDDLE_BUTTON) MOUSEX = device.mouseX() MOUSEY = device.mouseY() BRUSHACTIVE = self._currentBrushMode == 'xform' and self._currentBrushType == 'circlebrush' (rayOrigin, rayDir) = ui_event.ray() self._rayOrigin = rayOrigin self._rayDir = rayDir self._brushPosition = ci.intersectOriginPlane(rayOrigin, rayDir) if RIGHT_BUTTON: return if not self._sustainedAction and SHIFT and BRUSHACTIVE: if LEFT_BUTTON: self.scaleBrushSize(MOUSEX) elif MIDDLE_BUTTON: self.incMouseBrushFalloff(MOUSEX) self._lastMouseX, self._lastMouseY = MOUSEX, MOUSEY return self._lastMouseX, self._lastMouseY = MOUSEX, MOUSEY if not self._sustainedAction: self.setBrushPosition(self._brushPosition) self.updateGuideTransform(vp) ### Don't do any snapping if we are in xform mode with circlebrush active isAgentAnchor = 0 if BRUSHACTIVE: isPrimInterior, isHandle, prim_num, prim_u, snap_pos = False, False, -1, -1, ( 0, 0, 0) else: isAgentAnchor, isHandle, prim_num, prim_u, snap_pos = self.intersectExistingPrims( rayOrigin, rayDir) isPrimInterior = prim_num >= 0 and not isHandle ### Update NodeParm to drive sops self.setIsMouseDown((MOUSEDOWN or PICKED)) pu.setNodeParm(self._node, "isShift", SHIFT, onlyifchanged=True) pu.setNodeParm(self._node, "isCtrl", CTRL, onlyifchanged=True) if isHandle or isAgentAnchor: self._brushPosition = snap_pos self.setBrushPosition(self._brushPosition) #if isHandle or isPrimInterior: self.setCurrentPrimParms(isHandle, prim_num, prim_u) self.setIsReadOnlyOp(False) if SINGLECLICK: if LEFT_BUTTON: if self._currentBrushMode == 'addremove': if CTRL: if self._currentBrushMode == 'addremove': if isHandle: self.opRemoveHandle() else: self.opRemovePoints() else: if isPrimInterior: self.opInsertPoint() elif isHandle: self.opMoveHandle() else: self.opAddPoint() elif self._currentBrushMode == 'xform': if self._currentXformOp == 'move': if isHandle: self.opMoveHandle() else: self.opMovePoints() elif self._currentXformOp == 'rotate': self.opRotatePoints() elif self._currentXformOp == 'scale': self.opScalePoints() elif self._currentBrushMode == 'reverse': self.opReversePrims() elif self._currentBrushMode == 'clone': self.opClonePrims() elif self._currentBrushMode == 'join': self.opJoinPrims() elif MIDDLE_BUTTON: self.setIsReadOnlyOp(True) if self._currentBrushMode == 'addremove': if isHandle or isPrimInterior: self.setActiveTipPoint(prim_num, isHandle, True) else: self.setActiveTipPoint(-1, False, False) ### Else not pressing, just holding keys else: if SHIFT: pass if self._sustainedAction: self.updateSustainedAction() if MOUSEUP or PICKED: self.endSustainedAction() return False
def setIsReadOnlyOp(self, state): pu.setNodeParm(self._node, 'isReadOnlyOp', state)
def setBrushMode(self, modename): #self.log(modename) old = self._currentBrushMode self._currentBrushMode = modename pu.setNodeParm(self._node, 'brush_mode', self._currentBrushMode) self.updatePromptMessage()
def setBrushType(self, typename): #self.log(typename) value = self.BRUSHTYPES.index(typename) self._currentBrushType = typename pu.setNodeParm(self._node, 'brush_type', value) self.updateGuideTransform(self._scene_viewer)
def setAddRemoveOp(self, opname): value = self.ADDREMOVEOPS.index(opname) self._currentAddRemoveOp = opname pu.setNodeParm(self._node, 'addremove_op', value)
def setXformOp(self, opname): #self.log(opname) value = self.XFORMOPS.index(opname) self._currentXformOp = opname pu.setNodeParm(self._node, 'xform_op', value)
def opLockPoints(self): pu.setNodeParm(self._node, "isLockMode", True) pu.setNodeParm(self._node, "lock_op", 0) self.stampBrushOp('lock') pu.setNodeParm(self._node, "isLockMode", False)
def setBrushOp(self, opname): value = self.BRUSHOPS.index(opname) pu.setNodeParm(self._node, 'brush_op', value)
def stashEditedPoints(self): stashPoints = self._stasherTrajPoints.geometry().freeze(True, True) pu.setNodeParm(self._node, 'stash_traj_points', stashPoints, True)
def onMouseEvent(self, kwargs): """ Computes the cursor text position and drawable geometry """ #print 'timing on onMouseEvent' ui_event = kwargs["ui_event"] device = ui_event.device() vp = ui_event.curViewport() MOUSEUP = ui_event.reason() == hou.uiEventReason.Changed MOUSEDOWN = ui_event.reason() == hou.uiEventReason.Start PICKED = ui_event.reason() == hou.uiEventReason.Picked SINGLECLICK = MOUSEDOWN or PICKED SHIFT = device.isShiftKey() CTRL = device.isCtrlKey() LEFT_BUTTON = device.isLeftButton() MIDDLE_BUTTON = device.isMiddleButton() RIGHT_BUTTON = device.isRightButton() MOUSEX = device.mouseX() MOUSEY = device.mouseY() self._isShift = SHIFT if RIGHT_BUTTON: return (rayOrigin, rayDir) = ui_event.ray() self._brushPosition = ci.intersectOriginPlane(rayOrigin, rayDir) self._lastMouseX, self._lastMouseY = MOUSEX, MOUSEY if not self._sustainedAction: self.setBrushPosition(self._brushPosition) self.updateGuideTransform(vp) isHandle, prim_num, prim_u, snap_pos, pt_num = self.intersectExistingPrims( rayOrigin, rayDir) ### Update NodeParm to drive sops self.setIsMouseDown((MOUSEDOWN or PICKED)) pu.setNodeParm(self._node, "isShift", SHIFT) pu.setNodeParm(self._node, "isCtrl", CTRL) self.setCurrentPrimParms(isHandle, prim_num, pt_num) if SINGLECLICK: if LEFT_BUTTON: if CTRL and SHIFT: self.opResetOffsetFrame() elif CTRL: self.opResetFrame() elif SHIFT and not isHandle: self.opEndFrame() else: self.opSlideFrame() elif MIDDLE_BUTTON: if SHIFT and not isHandle: self.opStartFrame() elif CTRL: self.opOffsetFrame() ### If active action update position offsets or end action on mouseup if self._sustainedAction: self.updateSustainedAction() self._drawTextGlobalFrame.updateTextPoints( self._geometryTrajHandles, "global_frame") self._drawTextGlobalFrame.show(True) if MOUSEUP or PICKED: self.endSustainedAction() return False
def opUnlockPoints(self): pu.setNodeParm(self._node, "isLockMode", True) pu.setNodeParm(self._node, "lock_op", 1) self.stampBrushOp('unlock') self.log('unlock') pu.setNodeParm(self._node, "isLockMode", False)
def setBrushSize(self, size): size = hou.hmath.clamp(size, 0.05, 10000000) self._brushSize = size pu.setNodeParm(self._node, 'brush_size', size)
def incMouseBrushFalloff(self, mouseX): value = pu.evalNodeParm(self._node, 'brush_falloff') value += self.getMouseDeltaX(mouseX) * -0.01 value = hou.hmath.clamp(value, 0, 1) pu.setNodeParm(self._node, 'brush_falloff', value)
def setIsMouseUp(self, state): pu.setNodeParm(self._node, 'isMouseUp', state, onlyifchanged=True)
def setCursorInViewport(self, state): pu.setNodeParm(self._node, 'isCursorInViewport', state)
def setIsSelectionEvent(self, state): self._isSelectionEvent = state pu.setNodeParm(self._node, 'isSelectionEvent', state)
def onMouseEvent(self, kwargs): """ Computes the cursor text position and drawable geometry """ #print 'timing on onMouseEvent' ui_event = kwargs["ui_event"] device = ui_event.device() vp = ui_event.curViewport() MOUSEUP = ui_event.reason() == hou.uiEventReason.Changed MOUSEDOWN = ui_event.reason() == hou.uiEventReason.Start PICKED = ui_event.reason() == hou.uiEventReason.Picked MOUSEDRAG = ui_event.reason() == hou.uiEventReason.Active MOVED = ui_event.reason() == hou.uiEventReason.Located SINGLECLICK = MOUSEDOWN or PICKED SHIFT = device.isShiftKey() CTRL = device.isCtrlKey() LEFT_BUTTON = device.isLeftButton() MIDDLE_BUTTON = device.isMiddleButton() RIGHT_BUTTON = device.isRightButton() MOUSEX = device.mouseX() MOUSEY = device.mouseY() if RIGHT_BUTTON: return (rayOrigin, rayDir) = ui_event.ray() self._brushPosition = ci.intersectOriginPlane(rayOrigin, rayDir) self._lastMouseX, self._lastMouseY = MOUSEX, MOUSEY if not self._sustainedAction: self.setBrushPosition(self._brushPosition) self.updateGuideTransform(vp) isHandle, prim_num, prim_u, snap_pos = self.intersectExistingPrims( rayOrigin, rayDir) isPrimInterior = prim_num >= 0 and not isHandle ### Update NodeParm to drive sops self.setIsMouseDown((MOUSEDOWN or PICKED)) pu.setNodeParm(self._node, "isShift", SHIFT) pu.setNodeParm(self._node, "isCtrl", CTRL) self.setCurrentPrimParms(isHandle, prim_num, prim_u) if SINGLECLICK: if LEFT_BUTTON: if CTRL: self.opRemovePoints() elif SHIFT: self.opSlideDist() else: if prim_num > -1 and not isHandle: self.opAddPoint() else: self.opSlideFrame() elif MIDDLE_BUTTON: self.opSlideDist() '''if isHandle: self.opSlideDist() else: self.setIsReadOnlyOp(True)''' ### If active action update position offsets or end action on mouseup if self._sustainedAction: self.updateSustainedAction() if MOUSEUP or PICKED: self.endSustainedAction() return False