Skip to content

Commit 3c62963

Browse files
committed
remote debuggin. bug fixes. 3ds max bootstrapper
1 parent 9c5547d commit 3c62963

File tree

12 files changed

+94
-31
lines changed

12 files changed

+94
-31
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"console": "integratedTerminal"
1010
},
1111
{
12-
"name": "Python: Attach Maya",
12+
"name": "Python: PyFlow Debug attach",
1313
"type": "python",
1414
"request": "attach",
1515
"port": 3000,

PyFlow/App.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class PyFlow(QMainWindow):
9191

9292
def __init__(self, parent=None):
9393
super(PyFlow, self).__init__(parent=parent)
94+
self.setFocusPolicy(QtCore.Qt.StrongFocus)
9495
self.currentSoftware = ""
9596
self.edHistory = EditorHistory(self)
9697
self.setWindowTitle("PyFlow v{0}".format(currentVersion().__str__()))

PyFlow/Packages/PyFlowBase/Nodes/getVar.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ def onVarValueChanged(self, *args, **kwargs):
106106

107107
def serialize(self):
108108
default = NodeBase.serialize(self)
109-
default['varUid'] = str(self.var.uid)
109+
if self.var is not None:
110+
default['varUid'] = str(self.var.uid)
110111
return default
111112

112113
@staticmethod

PyFlow/Packages/PyFlowBase/UI/UIGetVarNode.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ def onVarSelected(self, varName):
7070
if self.var.name == varName:
7171
return
7272
else:
73-
self._rawNode.inp.disconnectAll()
7473
self._rawNode.out.disconnectAll()
7574

7675
var = self.canvasRef().graphManager.findVariableByName(varName)

PyFlow/UI/Canvas/Canvas.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ class Canvas(QGraphicsView):
325325

326326
def __init__(self, graphManager, pyFlowInstance=None):
327327
super(Canvas, self).__init__()
328+
self.setFocusPolicy(QtCore.Qt.StrongFocus)
328329
self.menu = QMenu()
329330
self.populateMenu()
330331
self.state = CanvasState.DEFAULT
@@ -1688,8 +1689,8 @@ def wheelEvent(self, event):
16881689

16891690
self.zoom(zoomFactor)
16901691

1691-
def stepToCompound(self, compoundNode):
1692-
self.graphManager.selectGraph(compoundNode)
1692+
def stepToCompound(self, compoundNodeName):
1693+
self.graphManager.selectGraphByName(compoundNodeName)
16931694

16941695
def drawBackground(self, painter, rect):
16951696
super(Canvas, self).drawBackground(painter, rect)

PyFlow/UI/Widgets/QtSliders.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,10 @@ def eventFilter(self, object, event):
9999

100100
return False
101101

102+
102103
class draggers(QtWidgets.QWidget):
103104
"""PopUp Draggers Houdini Style
104-
105+
105106
Custom Widget that holds a bunch of :obj:`inputDrager` to drag values when midClick over field type input widget, Right Drag increments value, Left Drag decreases Value
106107
"""
107108
def __init__(self, parent=None, isFloat=True, startValue=0.0):
@@ -169,27 +170,30 @@ def eventFilter(self, object, event):
169170
del(self)
170171
return False
171172

173+
172174
class slider(QtWidgets.QSlider):
173175
"""Customized Int QSlider
174-
176+
175177
Reimplements QSlider adding a few enhacements
176178
177179
Modifiers:
178180
:Left/Mid: Click to move handle
179181
:Ctrl: and drag to move handle half velocity
180182
:Shift: and drag to move handle quarter velocity
181183
:Ctrl+Shift: and drag to move handle eighth velocity
182-
184+
183185
Extends:
184186
QtWidgets.QSlider
185187
"""
186188
def __init__(self, *args, **kargs):
187189
super(slider, self).__init__(*args, **kargs)
190+
self.setFocusPolicy(QtCore.Qt.StrongFocus)
188191
self.setOrientation(QtCore.Qt.Horizontal)
189192
self.deltaValue = 0
193+
self._min_value = 0
194+
self._max_value = 0
190195
self.startDragpos = QtCore.QPointF()
191196
self.realStartDragpos = QtCore.QPointF()
192-
self.setFocusPolicy(QtCore.Qt.StrongFocus)
193197

194198
def mousePressEvent(self, event):
195199
self.prevValue = self.value()
@@ -205,10 +209,9 @@ def mousePressEvent(self, event):
205209
st_slider = QtWidgets.QStyleOptionSlider()
206210
st_slider.initFrom(self)
207211
st_slider.orientation = self.orientation()
208-
available = self.style().pixelMetric(
209-
QtWidgets.QStyle.PM_SliderSpaceAvailable, st_slider, self)
210-
xloc = QtWidgets.QStyle.sliderPositionFromValue(self._min_value,
211-
self._max_value, super(slider, self).value(), available)
212+
available = self.style().pixelMetric(QtWidgets.QStyle.PM_SliderSpaceAvailable, st_slider, self)
213+
# FIXME: self._min_value and self._max_value undefined
214+
xloc = QtWidgets.QStyle.sliderPositionFromValue(self._min_value, self._max_value, super(slider, self).value(), available)
212215
butts = QtCore.Qt.MouseButtons(QtCore.Qt.MidButton)
213216
newPos = QtCore.QPointF()
214217
newPos.setX(xloc)
@@ -259,27 +262,26 @@ def keyPressEvent(self, event):
259262
self.deltaValue = 0
260263
super(slider, self).keyPressEvent(event)
261264

265+
262266
class doubleSlider(slider):
263267
"""Customized Float QSlider
264-
268+
265269
Float Qslider implementation
266-
270+
267271
Signals:
268272
:doubleValueChanged: Emited when value has change (float)
269273
Extends:
270-
:obj:`slider`
274+
:obj:`slider`
271275
"""
272276
doubleValueChanged = QtCore.Signal(float)
273277

274278
def __init__(self, decimals=4, *args, **kargs):
275-
"""
279+
"""
276280
:param decimals: Number of decimal zeros, defaults to 4
277281
:type decimals: int, optional
278282
"""
279283
super(doubleSlider, self).__init__(*args, **kargs)
280284
self._multi = 10 ** decimals
281-
self._min_value = 0
282-
self._max_value = 0
283285
self.valueChanged.connect(self.emitDoubleValueChanged)
284286

285287
def setDecimals(self, decimals):
@@ -315,16 +317,17 @@ def singleStep(self):
315317
def setValue(self, value):
316318
super(doubleSlider, self).setValue(int(value * self._multi))
317319

320+
318321
class valueBox(QtWidgets.QDoubleSpinBox):
319322
"""Custom QDoubleSpinBox
320-
323+
321324
Custom SpinBox with Houdini Style draggers, :obj:`draggers`. Middle Click to dislplay a bunch of draggers to change value by adding different delta values
322325
323326
Extends:
324-
QtWidgets.QDoubleSpinBox
327+
QtWidgets.QDoubleSpinBox
325328
"""
326329
def __init__(self, type="float", buttons=False, decimals=4, *args, **kargs):
327-
"""
330+
"""
328331
:param type: Choose if create a float or int spinBox, defaults to "float"
329332
:type type: str, optional
330333
:param buttons: Show or hidde right up/Down Buttons, defaults to False
@@ -334,7 +337,7 @@ def __init__(self, type="float", buttons=False, decimals=4, *args, **kargs):
334337
:param *args: [description]
335338
:type *args: [type]
336339
:param **kargs: [description]
337-
:type **kargs: [type]
340+
:type **kargs: [type]
338341
"""
339342
super(valueBox, self).__init__(*args, **kargs)
340343
self.isFloat = type == "float"
@@ -374,6 +377,7 @@ def update(self):
374377
).getSliderStyleSheet("sliderStyleSheetA"))
375378
super(valueBox, self).update()
376379

380+
377381
class pyf_Slider(QtWidgets.QWidget):
378382
"""Custom Slider that encapsulates a :obj:`slider` or a :obj:`doubleSlider` and a :obj:`valueBox` linked together
379383
@@ -926,8 +930,7 @@ def drawWidget(self, qp):
926930
metrics = qp.fontMetrics()
927931
fh = metrics.height()
928932
for e, i in enumerate(range(0, pxNb, step)):
929-
pos = self.style().sliderPositionFromValue(
930-
self.minimum(), self.maximum(), r[e], self.width())
933+
pos = self.style().sliderPositionFromValue(self.minimum(), self.maximum(), r[e], self.width())
931934
half = h / 2
932935
if r[e] in self.cachedFrmaes:
933936
qp.setPen(QtGui.QColor(0, 255, 0))
@@ -949,8 +952,7 @@ def drawWidget(self, qp):
949952
else:
950953
s = 1.5
951954
qp.drawLine(pos, half + s, pos, half - s)
952-
pos = self.style().sliderPositionFromValue(
953-
self.minimum(), self.maximum(), self.value(), self.width())
955+
pos = self.style().sliderPositionFromValue(self.minimum(), self.maximum(), self.value(), self.width())
954956
fw = metrics.width("0")
955957
qp.setPen(editableStyleSheet().MainColor)
956958
if self.value() > self.maximum() - (self.maximum() / 2):
@@ -961,8 +963,7 @@ def drawWidget(self, qp):
961963
val = self.style().sliderValueFromPosition(
962964
self.minimum(), self.maximum(), self.hoverPos.x(), self.width())
963965
if val != self.value():
964-
pos = self.style().sliderPositionFromValue(
965-
self.minimum(), self.maximum(), val, self.width())
966+
pos = self.style().sliderPositionFromValue(self.minimum(), self.maximum(), val, self.width())
966967
fw = metrics.width("0")
967968
if val > self.maximum() - (self.maximum() / 2):
968969
fw += metrics.width(str(val))

integrations/3dsmax/3ds_launcher.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import ptvsd
2+
import pymxs
3+
from PyFlow.App import PyFlow
4+
from PySide2 import QtWidgets
5+
from PySide2 import QtCore
6+
7+
ptvsd.enable_attach(address=('0.0.0.0', 3000), redirect_output=True)
8+
9+
mainWindow = QtWidgets.QWidget.find(pymxs.runtime.windows.getMAXHWND())
10+
11+
if PyFlow.appInstance is None:
12+
instance = PyFlow.instance(mainWindow, "3dsmax")
13+
instance.show()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
@echo off
2+
3+
rem CHANGE MAX_ROOT variable to your 3ds max installation
4+
set MAX_ROOT=c:\Program Files\Autodesk\3ds Max 2020
5+
set MAXPY=%MAX_ROOT%\3dsmaxpy.exe
6+
7+
rem remove pip installer if it exists
8+
del get-pip.py
9+
10+
rem download get-pip.py
11+
powershell -Command "Invoke-WebRequest https://bootstrap.pypa.io/get-pip.py -OutFile get-pip.py"
12+
13+
rem install pip to maya interpreter
14+
"%MAXPY%" get-pip.py --user
15+
16+
rem install requirements
17+
cd ..\..\
18+
"%MAXPY%" -m pip install -r "%cd%\requirements\requirements-3dsmax.txt" --user
19+
20+
rem cleanup
21+
del integrations\3dsmax\get-pip.py
22+
23+
echo ""
24+
echo "=============================================================="
25+
echo "Requirements successfully installed"
26+
echo "Add PyFlow parent folder to sys.path, and everything is ready!"
27+
echo "=============================================================="
28+
pause

integrations/maya/maya_bootstrap.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ cd ..\..\
2222
rem cleanup
2323
del integrations\maya\get-pip.py
2424

25+
echo ""
26+
echo "=============================================================="
2527
echo "Requirements successfully installed"
2628
echo "Add PyFlow parent folder to sys.path, and everything is ready!"
29+
echo "=============================================================="
2730
pause

integrations/maya/maya_launcher.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
1+
import ptvsd
2+
from maya import OpenMayaUI as omui
3+
from shiboken2 import wrapInstance
14
from PyFlow.App import PyFlow
5+
from PySide2.QtWidgets import QWidget
6+
7+
ptvsd.enable_attach(address=('0.0.0.0', 3000), redirect_output=True)
8+
9+
mayaMainWindowPtr = omui.MQtUtil.mainWindow()
10+
mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget)
211

312
if PyFlow.appInstance is None:
4-
instance = PyFlow.instance()
13+
instance = PyFlow.instance(mayaMainWindow, "maya")
514
instance.show()

requirements/requirements-3dsmax.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
aenum; python_version < '3.4'
2+
Qt.py
3+
blinker
4+
nine
5+
docutils
6+
ptvsd

requirements/requirements-maya.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ aenum; python_version < '3.4'
22
Qt.py
33
blinker
44
nine
5-
docutils
5+
docutils
6+
ptvsd

0 commit comments

Comments
 (0)