def execute(self): fx.beginUndo("Paint Hard Alpha setup") basenode = fx.selection() pos = basenode[0].state["graph.pos"] creatednodes = [] if len(basenode) == 1: base = basenode[0] n1 = Node("com.digitalfilmtools.ofx.silhouette.sfx_copy") creatednodes.append(n1) activeSession().addNode(n1) try: n1.port("source").connect(base.port("output")) n1.port("target").connect(base.port("output")) except Exception: pass n1.property("red").setValue("Alpha") n1.property("blue").setValue("Alpha") n1.property("green").setValue("Alpha") """ setting the state (pos) for fresh nodes should be done inside a fx.beginUndo, otherwise the node Tree won't update correctly. """ n1.setState('graph.pos', fx.Point3D(pos.x+150, pos.y)) nn1 = n1 for n in range(0, 4): n2 = Node("com.digitalfilmtools.ofx.silhouette.colorCorrect") activeSession().addNode(n2) n2.port("input").connect(nn1.port("Output")) n2.property("gamma").setValue(100) creatednodes.append(n2) n2.setState('graph.pos', fx.Point3D( pos.x+150, pos.y+(50*(n+1)))) nn1 = n2 n3 = Node("com.digitalfilmtools.ofx.silhouette.sfx_copy") activeSession().addNode(n3) n3.port("source").connect(n2.port("Output")) n3.port("target").connect(base.port("output")) n3.property("alpha").setValue("Red") n3.setState('graph.pos', fx.Point3D(pos.x+150, pos.y+(50*5))) creatednodes.append(n3) fx.endUndo()
def SnapToGrid(): import fx tool = 'Snap to Grid' PrintStatus(tool) fx.beginUndo(tool) # Get the Project project = fx.activeProject() # Get the node selection sel = fx.selection() # Padding width for node count padding = len(str(len(sel))) i = 0 for node in sel: i = i + 1 # The node.state dict holds {'viewMode': 0, 'graph.pos': Point3D(394.641,22.4925)} if node.state is not None: # The Point3D(0,0) datatype has .x and .y attributes pos = node.state.items()[1][1] if pos is not None: # Snap the nodes to a 10 unit grid #snapX = round(pos.x, -1) #snapY = round(pos.y, -1) # Snap to 50 grid units snapX = round(float(pos.x) * 2, -2) * 0.5 snapY = round(float(pos.y) * 2, -2) * 0.5 # Snap to 100 grid units on X and 50 gird units on Y snapX = round(pos.x, -2) snapY = round(float(pos.y) * 2, -2) * 0.5 # Snap the nodes to a 100 unit grid #snapX = round(pos.x, -2) #snapY = round(pos.y, -2) # Update the grid snapped node position node.setState('graph.pos', fx.Point3D(snapX, snapY)) posUpdate = node.state.items()[1][1] if posUpdate is not None: print('[' + str(i).zfill(padding) + '] ' + str(node.label) + ' [Original] [X]' + str(pos.x) + ' [Y] ' + str(pos.y) + ' [Updated] [X]' + str(posUpdate.x) + ' [Y] ' + str(posUpdate.y)) fx.endUndo() # SaveProject() # hide the window snapWindow.hide()
def StackVertical(): import fx tool = 'Stack Vertical' PrintStatus(tool) fx.beginUndo(tool) # Get the Project project = fx.activeProject() # Get the node selection sel = fx.selection() # Padding width for node count padding = len(str(len(sel))) # Spacing distance between stacked nodes nodeSpacing = 100 # Use the first selected object as a reference for the Node Y position referenceY = 0 if len(sel) > 0: referenceY = sel[0].state.items()[1][1].y print('[Reference Y] ' + str(referenceY)) # Scan all of the selected nodes i = 0 for node in sel: # The node.state dict holds {'viewMode': 0, 'graph.pos': Point3D(394.641,22.4925)} if (node.state is not None) and (node != sel[0]): i = i + 1 # The Point3D(0,0) datatype has .x and .y attributes pos = node.state.items()[1][1] if pos is not None: # Stack the nodes side by side node.setState( 'graph.pos', fx.Point3D(pos.x, (referenceY + (i * nodeSpacing)))) # Read back the results posUpdate = node.state.items()[1][1] if posUpdate is not None: print('[' + str(i).zfill(padding) + '] ' + str(node.label) + ' [Original] [X]' + str(pos.x) + ' [Y] ' + str(pos.y) + ' [Updated] [X]' + str(posUpdate.x) + ' [Y] ' + str(posUpdate.y)) else: print('[Error] Please select 2 or more nodes.') fx.endUndo() # SaveProject() # hide the window snapWindow.hide()
def AlignHorizontal(): import fx tool = 'Align Horizontal' PrintStatus(tool) fx.beginUndo(tool) # Get the Project project = fx.activeProject() # Get the node selection sel = fx.selection() # Padding width for node count padding = len(str(len(sel))) # Use the first selected object as a reference for the Node X position referenceX = 0 if len(sel) > 0: referenceX = sel[0].state.items()[1][1].x print('[Reference X] ' + str(referenceX)) # Scan all of the selected nodes i = 0 for node in sel: i = i + 1 # The node.state dict holds {'viewMode': 0, 'graph.pos': Point3D(394.641,22.4925)} if node.state is not None: # The Point3D(0,0) datatype has .x and .y attributes pos = node.state.items()[1][1] if pos is not None: # Snap all the nodes to the same X height node.setState('graph.pos', fx.Point3D(referenceX, pos.y)) # Read back the results posUpdate = node.state.items()[1][1] if posUpdate is not None: print('[' + str(i).zfill(padding) + '] ' + str(node.label) + ' [Original] [X]' + str(pos.x) + ' [Y] ' + str(pos.y) + ' [Updated] [X]' + str(posUpdate.x) + ' [Y] ' + str(posUpdate.y)) else: print('[Error] Please select 2 or more nodes.') fx.endUndo() # SaveProject() # hide the window snapWindow.hide()
def AlignByCSV(): import fx import csv path = '/Applications/SilhouetteFX/Silhouette v7.5/Silhouette.app/Contents/Resources/scripts/node_shape.csv' tool = 'Align By CSV' PrintStatus(tool) fx.beginUndo(tool) # Get the Project project = fx.activeProject() # Get the node selection sel = fx.selection() # Padding width for node count padding = 4 # How many nodes are selected count = len(sel) # Prepare CSV reading with open(path, 'rb') as fp: reader = csv.reader(fp, delimiter=',') i = 0 # Scan all of the selected nodes for row in reader: # Move onto the next node # The node.state dict holds {'viewMode': 0, 'graph.pos': Point3D(394.641,22.4925)} if i < count: node = sel[i] if (node.state is not None): # The Point3D(0,0) datatype has .x and .y attributes node.setState('graph.pos', fx.Point3D(float(row[0]), float(row[1]))) #posUpdate = node.state.items()[1][1] #if posUpdate is not None: # Read back the results # print('{0},{1:.03f},{2:.03f}'.format(str(i).zfill(padding), posUpdate.x, posUpdate.y)) i = i + 1 fx.endUndo() # SaveProject() # hide the window snapWindow.hide()
def DistributeSpacesHorizontal(): import fx tool = 'Distribute Spaces Horizontal' PrintStatus(tool) fx.beginUndo(tool) # Get the Project project = fx.activeProject() # Get the node selection sel = fx.selection() # Padding width for node count padding = len(str(len(sel))) # How many does were selected nodeCount = len(sel) # Use the first selected object as a reference for the Node position referenceStartX = 0 referenceEndX = 0 if nodeCount > 0: print('[Selected Nodes] ' + str(nodeCount)) referenceStartX = sel[0].state.items()[1][1].x print('[Reference Start X] ' + str(referenceStartX)) referenceEndX = sel[nodeCount - 1].state.items()[1][1].x print('[Reference End X] ' + str(referenceEndX)) # Start/End Node Distance nodeDistance = abs(referenceStartX - referenceEndX) print('[Node Distance X] ' + str(nodeDistance)) # Spacing distance between stacked nodes nodeSpacing = (nodeDistance) / (nodeCount - 1) print('[Node Spacing X] ' + str(nodeSpacing)) # Scan all of the selected nodes i = 0 for node in sel: # The node.state dict holds {'viewMode': 0, 'graph.pos': Point3D(394.641,22.4925)} if (node.state is not None) and (node != sel[0]) and ( node != sel[nodeCount - 1]): # if (node.state is not None): i = i + 1 # The Point3D(0,0) datatype has .x and .y attributes pos = node.state.items()[1][1] if pos is not None: # Stack the nodes side by side node.setState( 'graph.pos', fx.Point3D((referenceStartX + (i * nodeSpacing)), pos.y)) # Read back the results posUpdate = node.state.items()[1][1] if posUpdate is not None: print('[' + str(i).zfill(padding) + '] ' + str(node.label) + ' [Original] [X]' + str(pos.x) + ' [Y] ' + str(pos.y) + ' [Updated] [X]' + str(posUpdate.x) + ' [Y] ' + str(posUpdate.y)) else: print('[Error] Please select 2 or more nodes.') fx.endUndo() # SaveProject() # hide the window snapWindow.hide()