<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?action=history&amp;feed=atom&amp;title=Houdini_Python</id>
	<title>Houdini Python - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?action=history&amp;feed=atom&amp;title=Houdini_Python"/>
	<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;action=history"/>
	<updated>2026-05-22T18:20:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=815&amp;oldid=prev</id>
		<title>Bernie: /* get complementary color */</title>
		<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=815&amp;oldid=prev"/>
		<updated>2024-05-29T09:26:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;get complementary color&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:26, 29 May 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l403&quot;&gt;Line 403:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 403:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Selecting other nodes of similar type ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Will select all nodes that correspond to the type of the currently selected nodes, in the same hierachy.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Todo: allow to select items that are visible only in the region of the viewpane we are in. is it useful ?&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;import hou&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;selection = hou.selectedNodes()&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nodetypes = []&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for node in selection:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    nodetype = node.type()&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    if nodetype not in nodetypes:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        nodetypes.append(node.type())&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;selectednodes = []&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for node in hou.selectedNodes()[0].parent().allSubChildren():&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    if node.type() in nodetypes:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        selectednodes.append(node)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;       &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;hou.clearAllSelected()&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for node in selectednodes:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    node.setSelected(1,0)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;selection[-1].setSelected(1,0)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;hou.ui.setStatusMessage(str(len(selectednodes)) + &quot; nodes selected&quot;)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== get complementary color===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== get complementary color===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;MMhh . This seems overly complicated for something so simple in other languages. Will modify it if I find a better solution&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;MMhh . This seems overly complicated for something so simple in other languages. Will modify it if I find a better solution&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bernie</name></author>
	</entry>
	<entry>
		<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=794&amp;oldid=prev</id>
		<title>Bernie: /* Selected node as python code */</title>
		<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=794&amp;oldid=prev"/>
		<updated>2024-04-15T16:22:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Selected node as python code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:22, 15 April 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l503&quot;&gt;Line 503:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 503:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#os.system(&amp;#039;xdg-open \&amp;quot;%s\&amp;quot;&amp;#039; % fp)  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#os.system(&amp;#039;xdg-open \&amp;quot;%s\&amp;quot;&amp;#039; % fp)  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;os.startfile(fp)  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;os.startfile(fp)  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#Hey look at me, I&#039;m a big idiot and I wrote the script from scratch because I had forgotten I had already coded it. How well, here&#039;s another version&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;import hou, tempfile, os&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;new_file, filename = tempfile.mkstemp(suffix=&#039;.txt&#039;)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;text = &#039;&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for node in hou.selectedNodes():&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    text += node.asCode()&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;os.write(new_file, str.encode(text))&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;os.close(new_file)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;os.startfile(filename)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bernie</name></author>
	</entry>
	<entry>
		<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=792&amp;oldid=prev</id>
		<title>Bernie: /* Delete children of a node that have their display flags turned off */</title>
		<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=792&amp;oldid=prev"/>
		<updated>2024-04-12T12:00:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Delete children of a node that have their display flags turned off&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:00, 12 April 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Getting the topmost input of a node ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Let&#039;s say you want to get the first node in a tree (like a file sop) that&#039;s connected to a given SOP. This goes up inputs (the first one) until it won&#039;t find one anymore. Simple but useful.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https://i.imgur.com/L5Nyy2c.png&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;import hou&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;myNode = hou.node(&#039;/obj/geo1/null1&#039;)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;while myNode.input(0):&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    myNode = myNode.input(0)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;print(myNode.path())&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Delete children of a node that have their display flags turned off ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Delete children of a node that have their display flags turned off ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 20:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         curNode.destroy()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         curNode.destroy()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Move all keyframes to the beginning of the timeline===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Move all keyframes to the beginning of the timeline===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Story is I have some tracked camera+plate that are TC&amp;#039;ed at range at frame 24878933 for instance which is a pain in the ass, and no shotgun/grid tool to put that to an artist-friendly frame start like 101 or 1001&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Story is I have some tracked camera+plate that are TC&amp;#039;ed at range at frame 24878933 for instance which is a pain in the ass, and no shotgun/grid tool to put that to an artist-friendly frame start like 101 or 1001&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bernie</name></author>
	</entry>
	<entry>
		<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=775&amp;oldid=prev</id>
		<title>Bernie: /* Move all keyframes to the beginning of the timeline */</title>
		<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=775&amp;oldid=prev"/>
		<updated>2024-03-13T14:27:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Move all keyframes to the beginning of the timeline&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:27, 13 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Delete children of a node that have their display flags turned off ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;import hou&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;obj = hou.selectedNodes()[0]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for curNode in obj.children():&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    if(curNode.type().name() == &#039;geo&#039; and curNode.isDisplayFlagSet() == False):&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        #print(curNode)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        curNode.destroy()&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Move all keyframes to the beginning of the timeline===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Move all keyframes to the beginning of the timeline===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Story is I have some tracked camera+plate that are TC&amp;#039;ed at range at frame 24878933 for instance which is a pain in the ass, and no shotgun/grid tool to put that to an artist-friendly frame start like 101 or 1001&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Story is I have some tracked camera+plate that are TC&amp;#039;ed at range at frame 24878933 for instance which is a pain in the ass, and no shotgun/grid tool to put that to an artist-friendly frame start like 101 or 1001&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bernie</name></author>
	</entry>
	<entry>
		<id>https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=679&amp;oldid=prev</id>
		<title>Bernie: /* Load a folder of objs and merge them */</title>
		<link rel="alternate" type="text/html" href="https://berniebernie.fr/mediawiki-1.37.1/index.php?title=Houdini_Python&amp;diff=679&amp;oldid=prev"/>
		<updated>2023-04-06T15:45:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Load a folder of objs and merge them&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== Move all keyframes to the beginning of the timeline===&lt;br /&gt;
Story is I have some tracked camera+plate that are TC&amp;#039;ed at range at frame 24878933 for instance which is a pain in the ass, and no shotgun/grid tool to put that to an artist-friendly frame start like 101 or 1001&lt;br /&gt;
&lt;br /&gt;
This will take a node selection (or a node as argument), figure out the range of all the keyframes on the node and subnodes (optionally), and offset the range of these keyframes to match the start of your current timeline.&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/PQK79Oa.gif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
&lt;br /&gt;
def offsetParmKeyframes( parmTup, offset ):&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;given a parm, move its keyframes in time by the offset. Deletes an recreates the keyframes&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    keyframes = parmTup.keyframes()&lt;br /&gt;
    if keyframes:&lt;br /&gt;
        parmTup.deleteAllKeyframes()&lt;br /&gt;
        for kf in keyframes:&lt;br /&gt;
            kf.setFrame( kf.frame() + offset )&lt;br /&gt;
            parmTup.setKeyframe( kf )&lt;br /&gt;
&lt;br /&gt;
def keyframesToPlaybar(node=None,recursive=False):&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;given a node or a selection, go through keyframes and move all keys to the timeline&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    #gather all parms and subitem parms&lt;br /&gt;
    nodelist = []&lt;br /&gt;
    if node is None:&lt;br /&gt;
        nodelist = hou.selectedNodes()&lt;br /&gt;
        if not nodelist:&lt;br /&gt;
            hou.ui.displayMessage(&amp;#039;Select a node&amp;#039;)&lt;br /&gt;
            return&lt;br /&gt;
        if recursive:&lt;br /&gt;
            newnodelist = ()&lt;br /&gt;
            for node in nodelist:&lt;br /&gt;
                newnodelist = newnodelist + node.allSubChildren()&lt;br /&gt;
            nodelist = nodelist + newnodelist&lt;br /&gt;
    else:&lt;br /&gt;
        nodelist.append(node)&lt;br /&gt;
&lt;br /&gt;
    #keep only those that have &amp;gt;1 keyframes, find out the min and max framerange of all the keyframes found        &lt;br /&gt;
    parms = []&lt;br /&gt;
    frameRangeMinMax = [999999999,-999999999]&lt;br /&gt;
    for node in nodelist:    &lt;br /&gt;
        for parm in node.parms():&lt;br /&gt;
            #only keep parms that have more than one keyframe, otherwise it&amp;#039;s an expression or single keyframe &amp;gt;= doesn&amp;#039;t need to be moved&lt;br /&gt;
            if len(parm.keyframes())&amp;gt;1:&lt;br /&gt;
                parms.append(parm)&lt;br /&gt;
                frameRangeMinMax[0] = min([parm.keyframes()[0].frame(),frameRangeMinMax[0]])&lt;br /&gt;
                frameRangeMinMax[1] = max([parm.keyframes()[-1].frame(),frameRangeMinMax[1]])&lt;br /&gt;
    &lt;br /&gt;
    #print(frameRangeMinMax)&lt;br /&gt;
    #print(parms)&lt;br /&gt;
        &lt;br /&gt;
    offset = hou.playbar.playbackRange()[0] - frameRangeMinMax[0]&lt;br /&gt;
    &lt;br /&gt;
    for parm in parms:&lt;br /&gt;
        offsetParmKeyframes( parm, offset )&lt;br /&gt;
&lt;br /&gt;
    return offset&lt;br /&gt;
&lt;br /&gt;
keyframesToPlaybar(None,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== After Effects camera to Houdini camera ===&lt;br /&gt;
&lt;br /&gt;
Pretty crappy/hacky code but works enough for me to post here. This assumes it&amp;#039;s a baked, every-frame-is-keyframed camera, should work with linear keyframes too.&lt;br /&gt;
&lt;br /&gt;
Howto:&lt;br /&gt;
&lt;br /&gt;
* Put this code in a shelf&lt;br /&gt;
* in AE select the position and rotation properties (that have keyframes. I need to generalize the code to add more properties)&lt;br /&gt;
* Ctrl-c&lt;br /&gt;
* In Houdini press your newly created shelf button. Should be good!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou, re&lt;br /&gt;
&lt;br /&gt;
def clipboardToCamera():&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039; takes a clipboard containing AE keyframe data and creates and returns camera &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    #todo: generalize to other items, add aperture/zoom &lt;br /&gt;
&lt;br /&gt;
    #baked constants&lt;br /&gt;
    matchFps = False        # match scene fps from comp size&lt;br /&gt;
    matchRez = True         # match camera rez from comp size&lt;br /&gt;
    translateResize = -0.01 # scene scale change, this one worked for me&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    AEclipboard = hou.ui.getTextFromClipboard()&lt;br /&gt;
    &lt;br /&gt;
    #check if we have AE data&lt;br /&gt;
    if &amp;#039;Keyframe Data&amp;#039; not in AEclipboard:&lt;br /&gt;
        hou.ui.displayMessage(&amp;#039;No keyframe data from AE found&amp;#039;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    #match FPS&lt;br /&gt;
    if matchFps:&lt;br /&gt;
        try:&lt;br /&gt;
            AEfps = float(AEclipboard.split(&amp;#039;Units Per Second&amp;#039;)[1].splitlines()[0])&lt;br /&gt;
            hou.setFps(AEfps)&lt;br /&gt;
            hou.ui.displayMessage(&amp;#039;Changing FPS to &amp;#039;+string(AEfps))&lt;br /&gt;
        except:&lt;br /&gt;
            print(&amp;#039;Units Per Second not found in keyframe data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    #check for transform keyword, if so, create camera and add keys&lt;br /&gt;
    if &amp;#039;Transform&amp;#039; in AEclipboard:&lt;br /&gt;
        camera = hou.node(&amp;#039;/obj&amp;#039;).createNode(&amp;#039;cam&amp;#039;)&lt;br /&gt;
        #I found I needed to change rotation order to match AE&amp;lt;&amp;gt;Houdini camera rotation&lt;br /&gt;
        camera.parm(&amp;#039;rOrd&amp;#039;).set(5)&lt;br /&gt;
        camera.parm(&amp;#039;iconscale&amp;#039;).set(50)&lt;br /&gt;
        &lt;br /&gt;
        #match Resolution&lt;br /&gt;
        if matchRez:&lt;br /&gt;
            try:&lt;br /&gt;
                w = float(AEclipboard.split(&amp;#039;Source Width&amp;#039;)[1].splitlines()[0])&lt;br /&gt;
                h = float(AEclipboard.split(&amp;#039;Source Height&amp;#039;)[1].splitlines()[0])&lt;br /&gt;
                camera.parm(&amp;#039;resx&amp;#039;).set(w)&lt;br /&gt;
                camera.parm(&amp;#039;resy&amp;#039;).set(h)&lt;br /&gt;
                &lt;br /&gt;
            except:&lt;br /&gt;
                print(&amp;#039;Source Width and/or Source Height not found in keyframe data&amp;#039;)            &lt;br /&gt;
        &lt;br /&gt;
        #aeNames = [&amp;#039;Camera Options Aperture&amp;#039;,&amp;#039;Transform Position&amp;#039;,&amp;#039;Transform Orientation&amp;#039;]&lt;br /&gt;
        aeNames = [&amp;#039;Transform Position&amp;#039;,&amp;#039;Transform Orientation&amp;#039;]&lt;br /&gt;
        houdiniParms = [&amp;#039;t&amp;#039;,&amp;#039;r&amp;#039;]&lt;br /&gt;
        &lt;br /&gt;
        itemN = -1&lt;br /&gt;
        &lt;br /&gt;
        for index, item in enumerate( aeNames ):&lt;br /&gt;
            aeName = item.replace(&amp;#039; &amp;#039;, &amp;#039;\\t*\\s*&amp;#039;)&lt;br /&gt;
            # print(&amp;#039;split @ &amp;#039;+aeName)&lt;br /&gt;
            &lt;br /&gt;
            # the followin is nasty but should give us tuples [[frame#1,x,y,z][frame#2,x,y,z]]&lt;br /&gt;
            clipboardSplit = re.split(aeName, AEclipboard)&lt;br /&gt;
            clipboarSplitKeyframes = clipboardSplit[1].split(&amp;#039;\n\n&amp;#039;)[0].splitlines()&lt;br /&gt;
            kf = [x.split(&amp;#039;\t&amp;#039;)[1:-1] for x in clipboarSplitKeyframes[2:]]&lt;br /&gt;
            #print(kf)&lt;br /&gt;
            # make a keyframe for each line&lt;br /&gt;
            for line in kf:&lt;br /&gt;
                itemN = itemN + 1&lt;br /&gt;
                #if itemN &amp;lt; 5:&lt;br /&gt;
                #    print(line)&lt;br /&gt;
                for index2, subparm in enumerate([&amp;#039;x&amp;#039;,&amp;#039;y&amp;#039;,&amp;#039;z&amp;#039;]):&lt;br /&gt;
                    curParm = camera.path()+&amp;#039;/&amp;#039;+houdiniParms[index]+subparm&lt;br /&gt;
                    &lt;br /&gt;
                    if houdiniParms[index] == &amp;#039;t&amp;#039;:&lt;br /&gt;
                        scale = translateResize&lt;br /&gt;
                    else:&lt;br /&gt;
                        scale = 1&lt;br /&gt;
                        &lt;br /&gt;
                    frameOffset = 0&lt;br /&gt;
                    #if itemN &amp;lt; 5:&lt;br /&gt;
                    #    print(curParm+&amp;#039; &amp;#039;+str(int(line[0])+frameOffset)+&amp;#039; &amp;#039;+str(float(line[index2+1])*scale))&lt;br /&gt;
                    setKeyFrame(curParm,int(line[0])+frameOffset,float(line[index2+1])*scale)&lt;br /&gt;
&lt;br /&gt;
def setKeyFrame(parm,time,value):&lt;br /&gt;
    hou_keyframe = hou.Keyframe()&lt;br /&gt;
    hou_keyframe.setFrame(time)&lt;br /&gt;
    hou_keyframe.setValue(value)&lt;br /&gt;
    hou_keyframe.setSlope(0)&lt;br /&gt;
    hou_keyframe.setInSlope(0)&lt;br /&gt;
    hou_keyframe.useSlope(False)&lt;br /&gt;
    hou_keyframe.setAccel(0)&lt;br /&gt;
    hou_keyframe.useAccel(False)&lt;br /&gt;
    hou_keyframe.interpretAccelAsRatio(False)&lt;br /&gt;
    hou_keyframe.setExpression(&amp;quot;constant()&amp;quot;, hou.exprLanguage.Hscript)&lt;br /&gt;
    hou.parm(parm).setKeyframe(hou_keyframe)&lt;br /&gt;
            &lt;br /&gt;
clipboardToCamera()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python node cook timer ===&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/61IVEKr.png&lt;br /&gt;
&lt;br /&gt;
Poor man&amp;#039;s Performance Monitor. Probably better versions out there but it worked for my HDA.&lt;br /&gt;
Uses Python3&amp;#039;s &amp;lt;code&amp;gt;timeit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;hou.session&amp;lt;/code&amp;gt; &amp;#039;global&amp;#039; var to to a time delta by calling two python scripts sandwiching your heavy Sops.&lt;br /&gt;
&lt;br /&gt;
First script node&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import timeit;hou.session.t0=timeit.default_timer()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(python sleep 3 seconds in my example: &amp;lt;code&amp;gt;import time;time.sleep(3)&amp;lt;/code&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
And the timer stop. Should be cleaned up as there&amp;#039;s probably node cooking/caching shenanigans going on.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import timeit&lt;br /&gt;
t1=timeit.default_timer()&lt;br /&gt;
tdelta = t1-hou.session.t0&lt;br /&gt;
hou.pwd().setComment(str(f&amp;quot;{tdelta:.03f} secs.&amp;quot;))&lt;br /&gt;
hou.pwd().setGenericFlag(hou.nodeFlag.DisplayComment,True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get start and end file number from sequence ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import re, hou, glob&lt;br /&gt;
f = hou.node(&amp;#039;/obj/geo1/file2&amp;#039;).parm(&amp;#039;file&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
def outputSequenceStartEnd(fileparm):&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;given a file parm return the beginning and end of sequence&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    fileparm = f.rawValue()&lt;br /&gt;
    matchObj = re.match( r&amp;#039;^(.*)\$F(\d*)(.*)&amp;#039;, parmval, re.M|re.I)        #expects $F* in the filename&lt;br /&gt;
    before = matchObj.groups()[0]&lt;br /&gt;
    extension = matchObj.groups()[2]&lt;br /&gt;
    fileGlob =  before + &amp;#039;*&amp;#039; + extension&lt;br /&gt;
    files = glob.glob(fileGlob)&lt;br /&gt;
    &lt;br /&gt;
    files = sorted(files)&lt;br /&gt;
    &lt;br /&gt;
    #eww&lt;br /&gt;
    startframe = files[0].split(before[-6:])[-1].split(extension)[0]    #dirty hack to get the file number because reusing the regex clashes with the glob return&lt;br /&gt;
    endframe = files[-1].split(before[-6:])[-1].split(extension)[0]&lt;br /&gt;
    return [startframe,endframe]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
print(outputSequenceStartEnd(f))&lt;br /&gt;
#returns [&amp;#039;200000&amp;#039;, &amp;#039;204805&amp;#039;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Octane menu to choose current IPR rop ===&lt;br /&gt;
&lt;br /&gt;
Because I&amp;#039;m tired of having to navigate if there is more than one Octane ROP in my file. As a bonus saves last used IPR as default&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/cCgTLpu.png&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
&lt;br /&gt;
def chooseIPRdialog(buttons):&lt;br /&gt;
    try:&lt;br /&gt;
        c = hou.session.choice&lt;br /&gt;
    except:&lt;br /&gt;
        hou.session.choice = 0&lt;br /&gt;
&lt;br /&gt;
    buttons.append(&amp;#039;Cancel&amp;#039;)&lt;br /&gt;
    dialog = hou.ui.displayMessage(&amp;#039;IPR choice&amp;#039;, buttons=buttons,default_choice=hou.session.choice)&lt;br /&gt;
    hou.session.choice = dialog&lt;br /&gt;
    if dialog == len(buttons)-1:&lt;br /&gt;
        dialog = False&lt;br /&gt;
    return dialog&lt;br /&gt;
    &lt;br /&gt;
#grab iprs&lt;br /&gt;
iprs = []&lt;br /&gt;
for node in hou.node(&amp;#039;/&amp;#039;).allSubChildren():&lt;br /&gt;
    if node.type().name() == &amp;#039;Octane_ROP&amp;#039;:&lt;br /&gt;
        iprs.append(node)&lt;br /&gt;
&lt;br /&gt;
#launch dialog, return ipr, launch ipr if not cancelled&lt;br /&gt;
names = [x.name() for x in iprs]&lt;br /&gt;
if len(names) == 1:&lt;br /&gt;
    iprs[0].parm(&amp;#039;HO_IPR&amp;#039;).pressButton()&lt;br /&gt;
else:&lt;br /&gt;
    chosenIPR = chooseIPRdialog(names)&lt;br /&gt;
    if chosenIPR is not False:&lt;br /&gt;
        iprs[chosenIPR].parm(&amp;#039;HO_IPR&amp;#039;).pressButton()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Log for loop progress to console ===&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/A6BAKaj.png&lt;br /&gt;
&lt;br /&gt;
Kinda dirty but you can just use a print argument in a python sop it should log out and be visible in your renderfarm logs.&lt;br /&gt;
Here I showed progress every 500 items.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#i have two spare parameters fetching current iteration and total number of iterations&lt;br /&gt;
#using detail(1,&amp;#039;iteration&amp;#039;,0) expression or -1 if you use a spare&lt;br /&gt;
iterFloat = float(`chs(&amp;quot;iter&amp;quot;)`)&lt;br /&gt;
maxFloat = float(`chs(&amp;quot;numiter&amp;quot;)`)&lt;br /&gt;
&lt;br /&gt;
if(iterFloat%500==0):&lt;br /&gt;
    print(str(round(iterFloat/maxFloat*100,1))+ &amp;quot; %  &amp;quot;+str(int(iterFloat))+&amp;quot;/&amp;quot;+str(int(maxFloat)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Auto-add frame offset parameter ===&lt;br /&gt;
I&amp;#039;ve written &amp;lt;code&amp;gt;padzero(...)&amp;lt;/code&amp;gt; too many times in production so I decided to waste a few hours writing a way to add it to the right-click menu available for parms&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/ZXNrwvC.gif&lt;br /&gt;
&lt;br /&gt;
For this to work I need two things:&lt;br /&gt;
&lt;br /&gt;
An XML file called &amp;lt;code&amp;gt;PARMmenu.xml&amp;lt;/code&amp;gt; [https://www.sidefx.com/docs/houdini/basics/config_menus.html (doc)], in the python path or more generally the base folder of your preferences.&lt;br /&gt;
I loosely based myself on code from qLib and other ressources. But the important thing to note is that there are two &amp;#039;important&amp;#039; sections:&lt;br /&gt;
&lt;br /&gt;
* A &amp;#039;context&amp;#039; tag that is a python code that parses the parameter you right click and returns True or False -- which will tell Houdini if you need to show the menu (it is generated on the fly). In my case it looks for &amp;#039;$F#&amp;#039; in the parameter value&lt;br /&gt;
* A &amp;#039;scriptCode&amp;#039; tag that is the actual code that is run&lt;br /&gt;
&lt;br /&gt;
To make things cleaner I call code from my personal python library (see below) instead of putting the full code here.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/!\ Pain in the Butt Houdini19 update&amp;#039;&amp;#039;&amp;#039;: since it&amp;#039;s Python3+ I can&amp;#039;t use &amp;#039;reload(module)&amp;#039; anymore. Code below work for Python2.7&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;menuDocument&amp;gt;&lt;br /&gt;
	&amp;lt;menu&amp;gt;&lt;br /&gt;
		&amp;lt;subMenu id=&amp;quot;bernie_rclick&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label&amp;gt;Bernie&amp;#039;s&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;modifyItem&amp;gt;&amp;lt;insertAfter&amp;gt;motion_effects_menu&amp;lt;/insertAfter&amp;gt;&amp;lt;/modifyItem&amp;gt;&lt;br /&gt;
			&amp;lt;scriptItem id=&amp;quot;bernie_set_frameoffset_parm&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;label&amp;gt;Add a frame offset parm to $F#&amp;lt;/label&amp;gt;&lt;br /&gt;
				&amp;lt;context&amp;gt;&lt;br /&gt;
					&amp;lt;expression&amp;gt;&lt;br /&gt;
						import bernie_tools&lt;br /&gt;
						return bernie_tools.validate_sequence_parm(kwargs)&lt;br /&gt;
					&amp;lt;/expression&amp;gt;&lt;br /&gt;
				&amp;lt;/context&amp;gt;&lt;br /&gt;
				&amp;lt;scriptCode&amp;gt;&amp;lt;![CDATA[import bernie_tools;reload(bernie_tools);bernie_tools.add_sequence_offset_spareparm(kwargs)]]&amp;gt;&amp;lt;/scriptCode&amp;gt;&lt;br /&gt;
			&amp;lt;/scriptItem&amp;gt;&lt;br /&gt;
		&amp;lt;/subMenu&amp;gt;&lt;br /&gt;
	&amp;lt;/menu&amp;gt;&lt;br /&gt;
&amp;lt;/menuDocument&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the actual code, that I place in a pythonpath (here it is in &amp;lt;code&amp;gt;$HOUDINI_USER_PREF/python2.7libs/bernie_tools.py&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
import traceback&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
def validate_sequence_parm(kwargs):&lt;br /&gt;
	&amp;#039;&amp;#039;&amp;#039;Checks if the first parm contains a value with $F&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	returnvalue = False&lt;br /&gt;
	try:&lt;br /&gt;
		returnvalue = &amp;#039;$F&amp;#039; in kwargs[&amp;#039;parms&amp;#039;][0].rawValue() &lt;br /&gt;
	except:&lt;br /&gt;
		print(&amp;quot;ERROR: %s&amp;quot; % traceback.format_exc())&lt;br /&gt;
	return returnvalue&lt;br /&gt;
&lt;br /&gt;
def add_sequence_offset_spareparm(kwargs):&lt;br /&gt;
	&amp;#039;&amp;#039;&amp;#039;Adds an int spare parm below a parm that has a file sequence expression of type &amp;#039;$F#&amp;#039; using hscript padzero&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	parm = kwargs[&amp;#039;parms&amp;#039;][0]&lt;br /&gt;
	parmval = parm.rawValue()&lt;br /&gt;
	#check if there is a $F(plus digit)&lt;br /&gt;
	matchObj = re.match( r&amp;#039;^(.*)\$F(\d*)(.*)&amp;#039;, parmval, re.M|re.I)&lt;br /&gt;
&lt;br /&gt;
	if matchObj:&lt;br /&gt;
		n = parm.node()&lt;br /&gt;
		parmGrp = n.parmTemplateGroup()&lt;br /&gt;
		existing_parm = parmGrp.find(parm.name())&lt;br /&gt;
		#create an offset parm with a similar name. No error checking!&lt;br /&gt;
		plabel = existing_parm.label() + &amp;quot; Offset&amp;quot;&lt;br /&gt;
		pname = parm.name()+&amp;quot;_offset&amp;quot;&lt;br /&gt;
		offsetParmTemplate = hou.IntParmTemplate( pname, plabel, 1, default_expression=([&amp;quot;$F + 0&amp;quot;]))&lt;br /&gt;
		parmGrp.insertAfter(existing_parm, offsetParmTemplate)&lt;br /&gt;
		n.setParmTemplateGroup(parmGrp)&lt;br /&gt;
		#display the expression as it&amp;#039;s most like we want to mmb through the offset&lt;br /&gt;
		n.parm(pname).showExpression(1)&lt;br /&gt;
&lt;br /&gt;
		#figure out if there is any padding in the original parm using the regex result, otherwise padding at 1 (no padding)&lt;br /&gt;
		padding = 1&lt;br /&gt;
		if matchObj.groups()[1]:&lt;br /&gt;
			padding = matchObj.groups()[1]&lt;br /&gt;
		expression = matchObj.groups()[0]+&amp;quot;`padzero(&amp;quot;+str(padding)+&amp;quot;,ch(&amp;#039;&amp;quot; + pname + &amp;quot;&amp;#039;))`&amp;quot;+matchObj.groups()[2]&lt;br /&gt;
		parm.set(expression)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set path parameter true for all alembic nodes ===&lt;br /&gt;
Don&amp;#039;t know why it&amp;#039;s not on by default, thanks maya ? Will probably add it to a more general right click menu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
sel = hou.selectedNodes()&lt;br /&gt;
for item in sel:&lt;br /&gt;
    for node in item.allSubChildren():&lt;br /&gt;
        if node.type().name() == &amp;#039;alembic&amp;#039;:&lt;br /&gt;
            node.parm(&amp;#039;addpath&amp;#039;).set(1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Houdini set random layercolorid for Octane ===&lt;br /&gt;
Piece of shit integration. Sorry Juanjo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import randint, uniform&lt;br /&gt;
from colorsys import hsv_to_rgb&lt;br /&gt;
s = 1.0&lt;br /&gt;
v = 1.0&lt;br /&gt;
       &lt;br /&gt;
for o in hou.selectedItems():&lt;br /&gt;
    h = uniform(0.0, 1.0)&lt;br /&gt;
    s = uniform(0.5, 1.0)&lt;br /&gt;
    v = uniform(0.5, 1.0)&lt;br /&gt;
    r, g, b = hsv_to_rgb(h, s, v)&lt;br /&gt;
    o.parmTuple(&amp;#039;octane_objprop_color&amp;#039;).set([r,g,b])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get complementary color===&lt;br /&gt;
MMhh . This seems overly complicated for something so simple in other languages. Will modify it if I find a better solution&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = parm(&amp;#039;octane_gradient3_1cr&amp;#039;).eval()&lt;br /&gt;
g = parm(&amp;#039;octane_gradient3_1cg&amp;#039;).eval()&lt;br /&gt;
b = parm(&amp;#039;octane_gradient3_1cb&amp;#039;).eval()&lt;br /&gt;
#create color object&lt;br /&gt;
col = hou.Color((r,g,b))&lt;br /&gt;
#create hsv object from rgb color&lt;br /&gt;
hsv = hou.Color.hsv(col)&lt;br /&gt;
#get complementary color hue (accross the color wheel)&lt;br /&gt;
h = (hsv[0]+180)%360&lt;br /&gt;
#create new color&lt;br /&gt;
c = hou.Color()&lt;br /&gt;
#set color from hsv values&lt;br /&gt;
c.setHSV([h,hsv[1],hsv[2]])&lt;br /&gt;
#return red&lt;br /&gt;
return c.rgb()[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== screenshot to background image ===&lt;br /&gt;
work in progress, interactively take a screenshot and puts it in the network view&lt;br /&gt;
* saves image in a screenshot subfolder next to .hip file&lt;br /&gt;
* is attached to a null that you can move/delete/template&lt;br /&gt;
* uses [https://www.donationcoder.com/software/mouser/popular-apps/minicap Minicap] as my capture software on Windows&lt;br /&gt;
* is probably buggy&lt;br /&gt;
* For future reference for myself, this is where houdini stores (some of?) its UI python functions C:\Program Files\Side Effects Software\Houdini ####\houdini\python2.7libs, maybe it&amp;#039;s overloadable to edit the interface ? Also good nographutils hidden doc from Juraj Tomori :https://jtomori.github.io/houdini_additional_python_docs/nodegraphutils.html&lt;br /&gt;
* Similar code has been embedded to Prism pipeline: https://prism-pipeline.com/&lt;br /&gt;
&lt;br /&gt;
TBD:&lt;br /&gt;
* make it work in all contexts and levels (right now it breaks at / level and haven&amp;#039;t tried in CHOPs/ROPs&lt;br /&gt;
* embed images in HDAs ?&lt;br /&gt;
* make it OS agnostic and no dependencies (screenshot via Python?)&amp;gt;&amp;gt;&amp;gt; linux version on Odforce: https://forums.odforce.net/topic/32581-networkimage/?tab=comments#comment-203986&lt;br /&gt;
https://i.imgur.com/kuc1PnO.gif&lt;br /&gt;
&lt;br /&gt;
Code moved to https://berniebernie.fr/wiki/Houdini_UI_Customization#Screenshot_to_background_image&lt;br /&gt;
&lt;br /&gt;
=== load all objs in list by frame ===&lt;br /&gt;
Generate obj list:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os &lt;br /&gt;
dir_path = os.path.dirname(os.path.realpath(__file__))&lt;br /&gt;
listfilename = &amp;#039;objs_list.txt&amp;#039;&lt;br /&gt;
&lt;br /&gt;
objlist = []&lt;br /&gt;
for root, dirs, files in os.walk(dir_path):&lt;br /&gt;
    for file in files:&lt;br /&gt;
        if file.lower().endswith(&amp;#039;.obj&amp;#039;):&lt;br /&gt;
        	objlist.append(os.path.join(root, file))&lt;br /&gt;
   &lt;br /&gt;
print(&amp;#039;Writing &amp;#039;+str(len(objlist))+&amp;#039;to &amp;#039;+dir_path+&amp;#039;/&amp;#039;+listfilename)&lt;br /&gt;
&lt;br /&gt;
with open(dir_path+&amp;#039;/&amp;#039;+listfilename, &amp;#039;w&amp;#039;) as file_handler:&lt;br /&gt;
    for item in objlist:&lt;br /&gt;
        file_handler.write(&amp;quot;{}\n&amp;quot;.format(item))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In read file expression (with an added &amp;#039;file&amp;#039; parm pointing to the above filelist.txt, called filelist)  :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os, linecache&lt;br /&gt;
fl = hou.parm(&amp;#039;filelist&amp;#039;).eval()&lt;br /&gt;
path = linecache.getline(fl, int(hou.frame())).rstrip()&lt;br /&gt;
return path.replace(os.sep,&amp;#039;/&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ROP output driver to animated gif===&lt;br /&gt;
To place in post render script. Linux for now, imagemagick is finicky. Matt Estela has a great page as usual https://www.tokeru.com/cgwiki/index.php?title=GeneralUtilties#Gifs&lt;br /&gt;
https://i.imgur.com/rdSjyCR.gif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import distutils.spawn, subprocess&lt;br /&gt;
convert = distutils.spawn.find_executable(&amp;#039;convert&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if convert:&lt;br /&gt;
    convertCmd = &amp;#039;convert -loop 0 -delay 4 {}{} -layers OptimizePlus -colorspace sRGB +map {}&amp;#039;&lt;br /&gt;
    splitpath = hou.pwd().parm(&amp;#039;picture&amp;#039;).eval().split(&amp;#039;.&amp;#039;)&lt;br /&gt;
    gifPath = &amp;#039;.&amp;#039;.join(splitpath[:-2])+&amp;#039;.gif&amp;#039;&lt;br /&gt;
    wildcardPath = &amp;#039;.&amp;#039;.join(splitpath[:-2])+&amp;#039;.*.&amp;#039;+splitpath[-1]&lt;br /&gt;
    convertCmd = convertCmd.format(wildcardPath,&amp;#039;[600x600]&amp;#039;,gifPath)&lt;br /&gt;
    convertCmd = convertCmd + &amp;#039;&amp;amp;&amp;amp; xdg-open &amp;#039;+gifPath&lt;br /&gt;
    subprocess.Popen(convertCmd,shell=True)&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;#039;imgmagick convert to gif not found&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selected node as python code ===&lt;br /&gt;
(linux/windows may vary)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
sel = hou.selectedNodes()&lt;br /&gt;
strCode = sel[0].asCode(1,1)&lt;br /&gt;
fp = hou.getenv(&amp;#039;tmp&amp;#039;)+&amp;quot;/houdini_node_output.txt&amp;quot;&lt;br /&gt;
with open(fp, &amp;quot;w&amp;quot;) as text_file:&lt;br /&gt;
    text_file.write(strCode)&lt;br /&gt;
&lt;br /&gt;
#os.system(&amp;#039;xdg-open \&amp;quot;%s\&amp;quot;&amp;#039; % fp) &lt;br /&gt;
os.startfile(fp) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gives:&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/dcwjJXK.png&lt;br /&gt;
&lt;br /&gt;
=== Paste clipboard nodes to object merges ===&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/M7N0Stq.gif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# this snippet will paste nodes in clipboard to object merges&lt;br /&gt;
# use it with a shortcut (I overrode &amp;#039;alt-v&amp;#039; in network pane context)&lt;br /&gt;
&lt;br /&gt;
import hou&lt;br /&gt;
&lt;br /&gt;
network = hou.ui.curDesktop().paneTabUnderCursor()&lt;br /&gt;
networkpath = network.pwd().path()&lt;br /&gt;
pos = network.cursorPosition()&lt;br /&gt;
&lt;br /&gt;
clipboard = hou.ui.getTextFromClipboard()&lt;br /&gt;
&lt;br /&gt;
n = 0&lt;br /&gt;
&lt;br /&gt;
if clipboard:&lt;br /&gt;
    list = clipboard.split()&lt;br /&gt;
    for item in list:&lt;br /&gt;
        if hou.node(item) != None:&lt;br /&gt;
            merge = hou.node(networkpath).createNode(&amp;#039;object_merge&amp;#039;,&amp;#039;merge_&amp;#039;+item.split(&amp;#039;/&amp;#039;)[-1])&lt;br /&gt;
            merge.parm(&amp;#039;objpath1&amp;#039;).set(str(item))&lt;br /&gt;
            merge.setPosition(pos)&lt;br /&gt;
            merge.move([n*2,0])&lt;br /&gt;
            if n == 0:&lt;br /&gt;
                merge.setSelected(True,True)&lt;br /&gt;
            else:&lt;br /&gt;
                merge.setSelected(True,False)&lt;br /&gt;
            n = n + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Toggle off/on separate AOVs Arnold ROPs===&lt;br /&gt;
Just saving it in case I need it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for child in hou.node(&amp;#039;/out&amp;#039;).children():&lt;br /&gt;
    #print child.type().name()&lt;br /&gt;
    if &amp;#039;ppArnold&amp;#039; in child.type().name():&lt;br /&gt;
        #if child.name() == &amp;#039;osacks_electric_brain_january_visual_cortex&amp;#039;:&lt;br /&gt;
        for p in child.parms():&lt;br /&gt;
            if &amp;#039;ar_aov_separate&amp;#039; in str(p) and &amp;#039;file&amp;#039; not in str(p):&lt;br /&gt;
                p.set(0)&lt;br /&gt;
                print(child.name()+&amp;quot;.&amp;quot;+str(p)+&amp;quot;   &amp;quot;+str(p.eval()))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set expresions linking light visible parameter to display flag===&lt;br /&gt;
idk why the candidate light didn&amp;#039;t work on my machine so i used this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for child in hou.node(&amp;#039;/obj&amp;#039;).children():&lt;br /&gt;
    if &amp;#039;light&amp;#039; in child.type().name():&lt;br /&gt;
        child.parm(&amp;#039;light_enable&amp;#039;).setExpression(&amp;#039;hou.pwd().isDisplayFlagSet()&amp;#039;, language=hou.exprLanguage.Python)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Skip if frame is in list===&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/gbBP0Yj.png&lt;br /&gt;
&lt;br /&gt;
Works if there&amp;#039;s a parm called skip on the same (switch) node&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#true only on frames specified. Dirty but works&lt;br /&gt;
if str(int(hou.frame())) in hou.pwd().parm(&amp;#039;skip&amp;#039;).eval().split(&amp;#039; &amp;#039;):&lt;br /&gt;
    return 1&lt;br /&gt;
else:&lt;br /&gt;
    return 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and on a button if you want to easily add current frame to the list, make sure it&amp;#039;s set to python&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hou.pwd().parm(&amp;#039;skip&amp;#039;).set(hou.pwd().parm(&amp;#039;skip&amp;#039;).eval()+&amp;#039; &amp;#039;+str(int(hou.frame())))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Import neuron swc data===&lt;br /&gt;
wip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reads SWC and creates geo from it&lt;br /&gt;
# http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html&lt;br /&gt;
#&lt;br /&gt;
#       0           ¦             1             ¦    2   3   4  ¦    5   ¦            6&lt;br /&gt;
# sample number     ¦    structure identifier   ¦    x   y   z  ¦ radius ¦  parent sample (connectivity)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
from itertools import *&lt;br /&gt;
&lt;br /&gt;
node = hou.pwd()&lt;br /&gt;
geo = node.geometry()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# procedures&lt;br /&gt;
&lt;br /&gt;
def isBadLine(line):&lt;br /&gt;
    return line[0]==&amp;#039;#&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
#def createPoint(geo,data):&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
curDir = hou.node(&amp;#039;/obj/swc_to_poly/directory_to_read&amp;#039;).parm(&amp;#039;readin&amp;#039;).eval()&lt;br /&gt;
print(&amp;quot;processing: &amp;quot;+curDir)&lt;br /&gt;
&lt;br /&gt;
#read swc files in dir&lt;br /&gt;
files = []&lt;br /&gt;
for name in os.listdir(curDir):&lt;br /&gt;
    if name.endswith(&amp;#039;.swc&amp;#039;):&lt;br /&gt;
        files.append(os.path.join(curDir, name))&lt;br /&gt;
    files.sort()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
files = files[-1:]&lt;br /&gt;
for file in files:&lt;br /&gt;
    print(&amp;quot;  --- processing file: &amp;quot;+file)&lt;br /&gt;
    with open(file) as f:&lt;br /&gt;
        for line in dropwhile(isBadLine, f):                    # only read lines that don&amp;#039;t have hashtag&lt;br /&gt;
            data = line.lstrip().rstrip().split(&amp;quot; &amp;quot;)&lt;br /&gt;
            data = map(float,data)&lt;br /&gt;
            point = geo.createPoint()                           # create one point per line and fill attributes&lt;br /&gt;
            point.setPosition(hou.Vector3(*data[2:5]))&lt;br /&gt;
            point.setAttribValue(&amp;#039;id&amp;#039;, int(data[0]))&lt;br /&gt;
            point.setAttribValue(&amp;#039;structid&amp;#039;, int(data[1]))&lt;br /&gt;
            point.setAttribValue(&amp;#039;radius&amp;#039;, data[5])&lt;br /&gt;
            point.setAttribValue(&amp;#039;parent_id&amp;#039;, int(data[6]))&lt;br /&gt;
&lt;br /&gt;
    #print file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create nodes according to primitive groups ===&lt;br /&gt;
https://i.imgur.com/dbRXRdK.png&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node = hou.pwd()&lt;br /&gt;
&lt;br /&gt;
#custom undo stack &lt;br /&gt;
with hou.undos.group(&amp;quot;Poly Reduce Groups&amp;quot;):&lt;br /&gt;
    #uses parent, otherwise recursion happens with python sop node&lt;br /&gt;
    node = node.inputs()[0]&lt;br /&gt;
    geo = node.geometry()&lt;br /&gt;
    groups = geo.primGroups()&lt;br /&gt;
    count = 0&lt;br /&gt;
    mainReduce = &amp;#039;&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    merge = node.parent().createNode(&amp;#039;merge&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    for o in groups:&lt;br /&gt;
    &lt;br /&gt;
        #keep a single prim group&lt;br /&gt;
        blast = node.parent().createNode(&amp;#039;blast&amp;#039;)&lt;br /&gt;
        blast.setInput(0,node)&lt;br /&gt;
        blast.moveToGoodPosition()&lt;br /&gt;
        blast.parm(&amp;#039;negate&amp;#039;).set(True)&lt;br /&gt;
        blast.parm(&amp;#039;group&amp;#039;).set(o.name())&lt;br /&gt;
        &lt;br /&gt;
        #use polyreduce with keep points on with an expression&lt;br /&gt;
        reduce = node.parent().createNode(&amp;#039;polyreduce&amp;#039;)&lt;br /&gt;
        reduce.setInput(0,blast)&lt;br /&gt;
        reduce.moveToGoodPosition()&lt;br /&gt;
    &lt;br /&gt;
        reduce.parm(&amp;#039;originalpoints&amp;#039;).set(True)&lt;br /&gt;
        reduce.parm(&amp;#039;referframe&amp;#039;).set(True)&lt;br /&gt;
        reduce.parm(&amp;#039;framereference&amp;#039;).setExpression(&amp;#039;round((\$F+&amp;#039;+str(count)+&amp;#039;)/ch(&amp;quot;step&amp;quot;))*ch(&amp;quot;step&amp;quot;)&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
        #create the &amp;#039;step by&amp;#039; channel on this node&lt;br /&gt;
        parmTemplateGrp = reduce.parmTemplateGroup()&lt;br /&gt;
        stepByParm = hou.FloatParmTemplate(&amp;#039;step&amp;#039;, &amp;#039;StepBy&amp;#039;, 1,default_value=([10]))&lt;br /&gt;
        parmTemplateGrp.append(stepByParm)&lt;br /&gt;
        reduce.setParmTemplateGroup(parmTemplateGrp)&lt;br /&gt;
    &lt;br /&gt;
        if count == 0:&lt;br /&gt;
            reduce.setColor(hou.Color([0.6,1,0.6]))&lt;br /&gt;
            mainReduce = reduce&lt;br /&gt;
            reduce.parm(&amp;#039;percentage&amp;#039;).set(10)&lt;br /&gt;
            &lt;br /&gt;
        else:&lt;br /&gt;
            params = [&amp;#039;percentage&amp;#039;,&amp;#039;optimizationbias&amp;#039;,&amp;#039;borderweight&amp;#039;,&amp;#039;attribweight&amp;#039;,&amp;#039;topologicalweight&amp;#039;,&amp;#039;step&amp;#039;]&lt;br /&gt;
            for element in params:&lt;br /&gt;
                reduce.parm(element).set(mainReduce.parm(element))&lt;br /&gt;
    &lt;br /&gt;
        merge.setInput(count,reduce,0)&lt;br /&gt;
        count = count + 1&lt;br /&gt;
        &lt;br /&gt;
    merge.moveToGoodPosition()&lt;br /&gt;
    merge.setDisplayFlag(True)&lt;br /&gt;
    mainReduce.setSelected(True, clear_all_selected=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load a folder of objs and merge them ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import hou&lt;br /&gt;
import glob&lt;br /&gt;
obj = hou.node(&amp;quot;/obj&amp;quot;)&lt;br /&gt;
s = obj.createNode(&amp;#039;geo&amp;#039;, &amp;#039;loader&amp;#039;, run_init_scripts=False) &lt;br /&gt;
m = s.createNode(&amp;#039;merge&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
path = &amp;#039;/users/me/Downloads/body/*.obj&amp;#039;&lt;br /&gt;
i = -1&lt;br /&gt;
for file in glob.glob(path):&lt;br /&gt;
    i += 1&lt;br /&gt;
    f = s.createNode(&amp;#039;file&amp;#039;)&lt;br /&gt;
    f.parm(&amp;#039;file&amp;#039;).set(file)&lt;br /&gt;
    f.moveToGoodPosition()&lt;br /&gt;
    m.setInput(i,f,0)&lt;br /&gt;
m.moveToGoodPosition()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best fitting bbox from eigenvectors ===&lt;br /&gt;
&lt;br /&gt;
thanks to petz @ https://forums.odforce.net/topic/14879-bounding-box/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This code is called when instances of this SOP cook.&lt;br /&gt;
geo = hou.pwd().geometry()&lt;br /&gt;
prims = geo.prims()&lt;br /&gt;
points = geo.points()&lt;br /&gt;
&lt;br /&gt;
# parms&lt;br /&gt;
output = 0&lt;br /&gt;
maxIter = 10&lt;br /&gt;
threshold = 0.001&lt;br /&gt;
&lt;br /&gt;
centroid = sum([point.position() for point in points], hou.Vector3()) * (1.0 / len(points))&lt;br /&gt;
&lt;br /&gt;
# build covariance matrix&lt;br /&gt;
val11 = 0;  val12 = 0;  val13 = 0&lt;br /&gt;
val21 = 0;  val22 = 0;  val23 = 0&lt;br /&gt;
val31 = 0;  val32 = 0;  val33 = 0&lt;br /&gt;
&lt;br /&gt;
for point in points:&lt;br /&gt;
    pos = point.position()&lt;br /&gt;
    val11 += (pos[0] - centroid[0]) * (pos[0] - centroid[0])&lt;br /&gt;
    val12 += (pos[0] - centroid[0]) * (pos[1] - centroid[1])&lt;br /&gt;
    val13 += (pos[0] - centroid[0]) * (pos[2] - centroid[2])&lt;br /&gt;
    val21 += (pos[1] - centroid[1]) * (pos[0] - centroid[0])&lt;br /&gt;
    val22 += (pos[1] - centroid[1]) * (pos[1] - centroid[1])&lt;br /&gt;
    val23 += (pos[1] - centroid[1]) * (pos[2] - centroid[2])&lt;br /&gt;
    val31 += (pos[2] - centroid[2]) * (pos[0] - centroid[0])&lt;br /&gt;
    val32 += (pos[2] - centroid[2]) * (pos[1] - centroid[1])&lt;br /&gt;
    val33 += (pos[2] - centroid[2]) * (pos[2] - centroid[2])&lt;br /&gt;
&lt;br /&gt;
mat = hou.Matrix3(((val11, val12, val13), (val21, val22, val23), (val31, val32, val33)))&lt;br /&gt;
mat = hou.Matrix4(mat.inverted())&lt;br /&gt;
&lt;br /&gt;
# search for eigenvector with lowest eigenvalue&lt;br /&gt;
vec1 = hou.Vector3(1.0, 1.0, 1.0)&lt;br /&gt;
vecTemp = vec1 * mat&lt;br /&gt;
vec2 = vecTemp * (1.0 / vecTemp.length())&lt;br /&gt;
i = 0&lt;br /&gt;
while not vec1.isAlmostEqual(vec2) and i &amp;lt; 100:&lt;br /&gt;
    vec1 = vec2&lt;br /&gt;
    vecTemp = vec1 * mat&lt;br /&gt;
    vec2 = vecTemp * (1.0 / vecTemp.length())&lt;br /&gt;
    i += 1&lt;br /&gt;
minAxis = vec2.normalized()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# build matrix to transform geometry to initial position and orientation&lt;br /&gt;
up = hou.Vector3(0.0, 1.0, 0.0)&lt;br /&gt;
matUp = hou.hmath.buildTranslate(-centroid)&lt;br /&gt;
matUp *= minAxis.matrixToRotateTo(up)&lt;br /&gt;
geo.transform(matUp)&lt;br /&gt;
&lt;br /&gt;
# initialize attributes&lt;br /&gt;
initRot = 9&lt;br /&gt;
angleSum = 0&lt;br /&gt;
ratio = 1&lt;br /&gt;
i = 0&lt;br /&gt;
&lt;br /&gt;
# adaptively rotate geometry until best orientation for smallest bounding box is found&lt;br /&gt;
while i &amp;lt; maxIter and ratio &amp;gt; threshold:&lt;br /&gt;
    angle = 0&lt;br /&gt;
    angleHold = 0&lt;br /&gt;
    angleRotBest = 0&lt;br /&gt;
    bboxSize = geo.boundingBox().sizevec()&lt;br /&gt;
    vol = bboxSize[0] * bboxSize[1] * bboxSize[2]&lt;br /&gt;
    volMin = vol&lt;br /&gt;
    volMinHold = vol&lt;br /&gt;
&lt;br /&gt;
    for n in range(10):&lt;br /&gt;
        angle += initRot&lt;br /&gt;
        matRot = hou.hmath.buildRotateAboutAxis(up, initRot)&lt;br /&gt;
        geo.transform(matRot)&lt;br /&gt;
        &lt;br /&gt;
        bboxSize = geo.boundingBox().sizevec()&lt;br /&gt;
        vol = bboxSize[0] * bboxSize[1] * bboxSize[2]&lt;br /&gt;
        if vol &amp;lt; volMin:&lt;br /&gt;
            volMin = vol&lt;br /&gt;
            angleRotBest = angle&lt;br /&gt;
    &lt;br /&gt;
    # check ratio of vol and vol of previous bounding box&lt;br /&gt;
    ratio = abs(volMinHold - volMin)&lt;br /&gt;
    volMinHold = volMin&lt;br /&gt;
    if ratio == 0.0 and i == 0:&lt;br /&gt;
        ratio = 1.0&lt;br /&gt;
    &lt;br /&gt;
    angleRot = angle - angleRotBest + initRot&lt;br /&gt;
    angleSum += angleRotBest - initRot&lt;br /&gt;
    matRot = hou.hmath.buildRotateAboutAxis(up, -angleRot)&lt;br /&gt;
    geo.transform(matRot) &lt;br /&gt;
    initRot *= 0.2&lt;br /&gt;
    i += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# bounding box &lt;br /&gt;
bbox = geo.boundingBox()&lt;br /&gt;
size = bbox.sizevec()&lt;br /&gt;
vol = size[0] * size[1] * size[2]&lt;br /&gt;
&lt;br /&gt;
# build matrix to transform geometry back to oiginal position and orientation&lt;br /&gt;
mat = hou.hmath.buildRotateAboutAxis(up, -angleSum) * matUp.inverted()&lt;br /&gt;
matAttrib = geo.findGlobalAttrib(&amp;quot;mat&amp;quot;)&lt;br /&gt;
if not matAttrib:&lt;br /&gt;
    matAttrib = geo.addAttrib(hou.attribType.Global, &amp;quot;mat&amp;quot;, (   0.0, 0.0, 0.0, 0.0,&lt;br /&gt;
                                                                0.0, 0.0, 0.0, 0.0,&lt;br /&gt;
                                                                0.0, 0.0, 0.0, 0.0,&lt;br /&gt;
                                                                0.0, 0.0, 0.0, 0.0))&lt;br /&gt;
geo.setGlobalAttribValue(matAttrib, mat.asTuple())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#create objects from voronoi&lt;br /&gt;
from math import cos, sin, pi&lt;br /&gt;
&lt;br /&gt;
obj = hou.selectedNodes()[0]&lt;br /&gt;
node = obj.displayNode()&lt;br /&gt;
prims = node.geometry().prims()&lt;br /&gt;
&lt;br /&gt;
lastprim = prims[ len(prims)-1 ]&lt;br /&gt;
lastprimName = lastprim.attribValue(&amp;quot;name&amp;quot;)&lt;br /&gt;
lastprimName = lastprimName.partition(&amp;quot;piece&amp;quot;)&lt;br /&gt;
lastprimName = int( lastprimName[ len(lastprimName)-1 ] )&lt;br /&gt;
&lt;br /&gt;
print lastprimName&lt;br /&gt;
&lt;br /&gt;
subnet = hou.node(&amp;quot;obj&amp;quot;).createNode(&amp;quot;subnet&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for i in range(0,lastprimName+1):&lt;br /&gt;
    geo = subnet.createNode(&amp;quot;geo&amp;quot;)&lt;br /&gt;
    geo.setPosition([cos( (1.0*i/lastprimName+1 ) * 2.0 * pi )*4.0, sin( (1.0*i/lastprimName+1 ) * 2.0 * pi )*4.0 ]) # lol&lt;br /&gt;
    objectMerge = geo.createNode(&amp;quot;object_merge&amp;quot;)&lt;br /&gt;
    delete = objectMerge.createOutputNode(&amp;quot;delete&amp;quot;)&lt;br /&gt;
    objectMerge.parm(&amp;quot;objpath1&amp;quot;).set(node.path())&lt;br /&gt;
    delete.parm(&amp;quot;negate&amp;quot;).set(1)&lt;br /&gt;
    delete.parm(&amp;quot;group&amp;quot;).set(&amp;quot;@name=piece&amp;quot;+str(i))&lt;br /&gt;
    delete.setDisplayFlag(1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get functions in an OTL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#in button callback&lt;br /&gt;
hou.pwd().hdaModule().hello()&lt;br /&gt;
&lt;br /&gt;
#in script window&lt;br /&gt;
def hello:&lt;br /&gt;
    ....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preroll output to stdout (good for HQUEUE), put in a python node that gets fetched each step (source?). Also add f1 f2 parms to the python node with $RFSTART and $RFEND&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
start = hou.node(&amp;quot;.&amp;quot;).parm(&amp;quot;f1&amp;quot;).eval()&lt;br /&gt;
end = hou.node(&amp;quot;.&amp;quot;).parm(&amp;quot;f2&amp;quot;).eval()&lt;br /&gt;
current = hou.frame()&lt;br /&gt;
&lt;br /&gt;
progress = str(int(hou.hmath.fit(current, start, end, 0.0, 100.0))).zfill(3)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\rFrame {0} done&amp;quot;.format(current))&lt;br /&gt;
print(&amp;quot;\rALF_PROGRESS {0}%&amp;quot;.format(progress))&lt;br /&gt;
sys.stdout.flush()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bernie</name></author>
	</entry>
</feed>