Skip to content

Commit

Permalink
New features
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Titov authored Apr 14, 2020
2 parents b06ad3f + 16b0cf4 commit 07ea3ff
Show file tree
Hide file tree
Showing 14 changed files with 654 additions and 88 deletions.
3 changes: 3 additions & 0 deletions Houdini_TDK.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"path": "C:/Users/MarkWilson/Documents/Houdini_TDK"
}
84 changes: 72 additions & 12 deletions OPmenu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,85 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
<menuDocument>
<menu>

<addScriptItem id="opmenu.tdk_open_hda_location">
<label>Open HDA Location...</label>
<subMenu id="opmenu.tdk_actions_menu">

<label>TDK Actions</label>
<parent>root_menu</parent>
<insertAfter>opmenu.optypemanager</insertAfter>
<context>
<expression>
node = kwargs['node']
return node.type().definition() is not None
</expression>
</context>
<scriptCode>
<insertAfter>opmenu.actions_menu</insertAfter>

<scriptItem id="opmenu.tdk_generate_code">
<label>Generate Code...</label>
<scriptCode>
import houdini_tdk
reload(houdini_tdk)

houdini_tdk.generateCode(**kwargs)
</scriptCode>
</scriptItem>

<scriptItem id="opmenu.tdk_show_node_user_data">
<label>Show Node User Data...</label>
<scriptCode>
import houdini_tdk
reload(houdini_tdk)

houdini_tdk.showNodeUserData(cached=kwargs['shiftclick'], **kwargs)
</scriptCode>
</scriptItem>

<separatorItem/>

<scriptItem id="opmenu.tdk_make_hda_from_template">
<label>Make HDA from Template...</label>
<context>
<expression>
node = kwargs['node']
return node.type().name() == 'tdk::template'
</expression>
</context>
<scriptCode>
import houdini_tdk
reload(houdini_tdk)

houdini_tdk.showMakeHDAFromTemplateDialog(**kwargs)
</scriptCode>
</scriptItem>

<scriptItem id="opmenu.tdk_open_hda_location">
<label>Open HDA Location...</label>
<context>
<expression>
node = kwargs['node']
return node.type().definition() is not None
</expression>
</context>
<scriptCode>
import os
import webbrowser

node = kwargs['node']
path = node.type().definition().libraryFilePath()
webbrowser.open('file:///' + os.path.dirname(path))
</scriptCode>
</addScriptItem>
</scriptCode>
</scriptItem>

<scriptItem id="opmenu.tdk_increment_hda_version">
<label>Increment HDA Version...</label>
<context>
<expression>
node = kwargs['node']
return node.type().definition() is not None
</expression>
</context>
<scriptCode>
import houdini_tdk
reload(houdini_tdk)

houdini_tdk.showNewVersionDialog(**kwargs)
</scriptCode>
</scriptItem>

</subMenu>

</menu>
</menuDocument>
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,59 @@
# Tool Development Kit
# Tool Development Kit for SideFX Houdini

## Tools

#### Templates

Template HDAs that allows you to quickly create your own HDAs based on them.

![Make HDA from Template](/images/make_hda_from_template.png)

#### Find Icon

Allows you to quickly find an icon for your tool.

![Find Icon](/images/find_icon.png)

#### Generate Code

Applies `.asCode()` to selected nodes. Then copies the resulting code to the clipboard or shows in code editor.

![Generate Code](/images/generate_code.png)

#### Increment HDA Version

Increments the HDA version of the selected node. You can select the version type (major, minor, build, etc.).

![Increment HDA Version](/images/increment_hda_version.png)

#### Show Node User Data

Shows user data and cached user data of the selected node.

![Show Node User Data](/images/show_node_user_data.png)

## Installation (todo)

- [16.0+] Package Manager (Recommended)
- [17.5+] Packages (template json file included)
- Environment file

## License

```
Tool Development Kit for SideFX Houdini
Copyright (C) 2020 Ivan Titov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
```
Binary file modified images/increment_hda_version.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/make_hda_from_template.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added otls/tdk__template.hda
Binary file not shown.
7 changes: 7 additions & 0 deletions package.setup
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "Tool Development Kit",
"author": "Ivan Titov",
"version": "1.4",
"source": "anvdev/Houdini_TDK",
"source_type": "github"
}
6 changes: 6 additions & 0 deletions python2.7libs/houdini_tdk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,9 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""

from .find_icon import FindIconDialog, findIcon
from .new_hda_version import NewVersionDialog, showNewVersionDialog
from .show_node_user_data import UserDataWindow, showNodeUserData
from .make_hda_from_template import MakeHDAFromTemplateDialog, showMakeHDAFromTemplateDialog
from .generate_code import generateCode
42 changes: 33 additions & 9 deletions python2.7libs/houdini_tdk/find_icon.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,21 +175,22 @@ def keyPressEvent(self, event):
super(IconListView, self).keyPressEvent(event)


class FindIconWindow(QWidget):
class FindIconDialog(QDialog):
def __init__(self, parent=None):
super(FindIconWindow, self).__init__(parent, Qt.Window)
super(FindIconDialog, self).__init__(parent, Qt.Window)

self.setWindowTitle('TDK: Find Icon')
self.setWindowIcon(hou.qt.Icon('MISC_m', 16, 16))
self.resize(820, 500)

# Layout
layout = QVBoxLayout(self)
layout.setContentsMargins(4, 4, 4, 4)
layout.setSpacing(4)
main_layout = QVBoxLayout(self)
main_layout.setContentsMargins(4, 4, 4, 4)
main_layout.setSpacing(4)

# Filter
self.filter_field = FilterField()
layout.addWidget(self.filter_field)
main_layout.addWidget(self.filter_field)

# Icon List
self.icon_list_model = IconListModel(self)
Expand All @@ -200,16 +201,39 @@ def __init__(self, parent=None):

self.icon_list_view = IconListView()
self.icon_list_view.setModel(self.filter_proxy_model)
layout.addWidget(self.icon_list_view)
main_layout.addWidget(self.icon_list_view)

# Buttons
buttons_layout = QHBoxLayout()
main_layout.addLayout(buttons_layout)

spacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Ignored)
buttons_layout.addSpacerItem(spacer)

ok_button = QPushButton('OK')
ok_button.clicked.connect(self.accept)
buttons_layout.addWidget(ok_button)

cancel_button = QPushButton('Cancel')
cancel_button.clicked.connect(self.reject)
buttons_layout.addWidget(cancel_button)

def keyPressEvent(self, event):
if event.matches(QKeySequence.Find) or event.key() == Qt.Key_F3:
self.filter_field.setFocus()
self.filter_field.selectAll()
else:
super(FindIconWindow, self).keyPressEvent(event)
super(FindIconDialog, self).keyPressEvent(event)

@classmethod
def getIconName(cls, parent=hou.qt.mainWindow(), title='Find Icon'):
window = FindIconDialog(parent)
window.setWindowTitle('TDK: ' + title)
window.icon_list_view.setSelectionMode(QAbstractItemView.SingleSelection)
if window.exec_() and window.icon_list_view.currentIndex().isValid():
return window.icon_list_view.currentIndex().data(Qt.UserRole)


def findIcon(**kwargs):
window = FindIconWindow(hou.qt.mainWindow())
window = FindIconDialog(hou.qt.mainWindow())
window.show()
5 changes: 4 additions & 1 deletion python2.7libs/houdini_tdk/generate_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@


def generateCode(**kwargs):
nodes = hou.selectedNodes()
if 'node' in kwargs:
nodes = kwargs['node'],
else:
nodes = hou.selectedNodes()
if not nodes:
raise hou.Error('No node selected')
code = ''.join(node.asCode(brief=True) for node in nodes)
Expand Down
Loading

0 comments on commit 07ea3ff

Please sign in to comment.