Skip to content

Instantly share code, notes, and snippets.

View rondreas's full-sized avatar

Andreas Rånman rondreas

View GitHub Profile
@rondreas
rondreas / selop_random.py
Last active September 23, 2022 09:20
Modo Selection Operation that takes a percent and selects random components,
import random
import lx
import lxu
import lxu.attributes
import lxifc
class SelOp(lxifc.SelectionOperation, lxu.attributes.DynamicAttributes):
def __init__(self):
@rondreas
rondreas / get_ifc.py
Created September 22, 2022 08:57
Often you end up getting a lx.object.Unknown from Modo's API, this will test the object against all "interfaces" and return list of potentially supported types.
import lx
def get_ifc(obj):
""" From a given object in lx sdk, find supported interfaces"""
supported_interfaces = []
for name, ifc in lx.object.__dict__.items():
try:
if isinstance(ifc, type):
o = ifc(obj)
supported_interfaces.append(ifc)
@rondreas
rondreas / get_server_counts.py
Last active September 22, 2022 08:28
Get count for all "servers"
import lx
host_svc = lx.service.Host()
# look over all lx.symbol.a_* constants,
for k, v in lx.symbol.__dict__.items():
if k.startswith("a_"):
print(f"{k}: {host_svc.NumServers(v)}")
@rondreas
rondreas / hlsl.ctag
Created August 4, 2022 09:00
quick ctag option file for unreal shaders
# definitions for hlsl to be used for unreal shaders, usf, ush etc...
--langdef=hlsl
--map-hlsl=+.ush
--map-hlsl=+.usf
# for now just catch all functions,
# [a-zA-Z2-4]+ should match any type identifier,
# [a-zA-Z_]+ should match the function names,
# \((([a-zA-Z2-4]+[[:space:]]+[a-zA-Z]+)([[:space:]]*[,]*[[:space:]]*))*\) should match any inputs to functions,
# \2 means the second group is the name,
import lx
import lxu
# get the current active scene and a channel read object,
scene = lx.object.Scene(lxu.select.SceneSelection().current())
channel_read = lx.object.ChannelRead(scene.Channels(None, 0))
# using the channel read get the workplane position and rotation
workplane_position = scene.WorkPlanePosition(channel_read)
workplane_rotation = scene.WorkPlaneRotation(channel_read)
@rondreas
rondreas / list_notifiers.py
Created February 2, 2022 12:55
Iterate over all notifiers and get their arguments
import lx
notify_system = lx.service.NotifySys()
for i in range(notify_system.Count()):
notifier = notify_system.ByIndex(i) # get the lx.object.Notifier
name = notify_system.NameByIndex(i) # get the str name for the Nofifier
# attempt getting arguments for the notifier,
try:
@rondreas
rondreas / build.bat
Created December 14, 2021 12:45
Thank you handmade hero for making it easier to compile stuff
@echo off
REM adds cl.exe to path
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat" x64
REM Set current dir to folder of this script
pushd %~dp0
REM Then create and cd into build folder
mkdir build
@rondreas
rondreas / check_ubx.py
Created June 17, 2021 15:16
Check if mesh is a cube that would be accepted as a unreal collision volume
import lx
import lxu
import modo
from math import isclose
mesh, = modo.Scene().selectedByType('mesh')
result = set()
with mesh.geometry as geo:
normals = set()
@rondreas
rondreas / sheet_conflict.py
Created May 24, 2021 14:30
Had issue where some artists had copied configs from another machine and ui elements would just be gone or they'd suffer constant crashes. Figured it could be conflicts in their configs so threw this one together and seems to have solved our issues.
import xml.etree.ElementTree as ET
import os
platform = lx.service.Platform()
configs = set() # all unique paths to config files
for i in range(platform.ImportPathCount()):
directory = platform.ImportPathByIndex(i)
for filename in os.listdir(directory):
@rondreas
rondreas / Hello.cpp
Created May 4, 2021 14:18
Hello world for Modo
#include <lx_log.hpp>
#include <lxu_log.hpp>
#include <lxu_command.hpp>
#define SRVNAME_COMMAND "hello.world"
class CHelloCommand : public CLxCommand
{
public:
CLxUser_LogService log_service;