def pickPositionMulti(message="Pick position", logWarning=True, minimum=1, maximum=-1): pickedPositions = [] while True: rtn = xsi.PickPosition(message, message) if not rtn.Value("ButtonPressed"): break v = XSIMath.CreateVector3(rtn("PosX"), rtn("PosY"), rtn("PosZ")) pickedPositions.append(v) if addHelpers: null = pri.addNullFromPos(xsi.ActiveSceneRoot, "temp_0", v) pri.setNullDisplay(null, 1, .5, 2, 0, 0, 0, .5, .5, .5, [0, 1, 0]) helpers.Add(null) if maximum > 0 and len(pickedPositions) >= maximum: break if len(pickedPositions) < minimum: if logWarning: xsi.LogMessage("Pick Session Aborded", c.siWarning) return False return pickedPositions
def popWindow(prop, width=100, height=100, posX=None, posY=None): if not prop: xsi.LogMessage("Can't find property", c.siError) return False resolution = scr.getResolution() if not posX: posX = int((resolution[0] / 2.0) - (width / 2.0)) elif posX < 0: posX = int(resolution[0] + posX) if not posY: posY = int((resolution[1] / 2.0) - (height / 2.0)) elif posY < 0: posX = int(resolution[1] + posY) view = xsi.Desktop.ActiveLayout.CreateView("Property Panel", "MyProperty") view.BeginEdit() view.Move(posX, posY) view.Resize(width, height) view.SetAttributeValue("targetcontent", prop.FullName) view.EndEdit()
def XSIUnloadPlugin(in_reg): strPluginName = in_reg.Name xsi.LogMessage( str(strPluginName) + str(" has been unloaded."), c.siVerbose) return True
def addExpression(param, definition): if not param.Animatable: xsi.LogMessage(param.FullName + " is not animatable", c.siWarning) return False definition = str(definition) exp = param.AddExpression(definition) if not param.IsAnimated(c.siExpressionSource): xsi.LogMessage("Invalid Expression on " + param.FullName + ": \r\n" + definition, c.siWarning) return False else: param.SetLock(c.siLockLevelAll) return exp
def gear_selectionSets_selectMembers_OnClicked(): oList = PPG.pSetsList.Value.split(";")[0] for x in PPG.pSetsList.Value.split(";")[1:]: oList = oList + "," + x if len(oList) <= 1: xsi.LogMessage("Select a Set before selet items", 4) else: xsi.SelectMembers(oList, "", "")
def setRotOrder(obj, s="XYZ"): a = ["XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"] if s not in a: xsi.LogMessage("Invalid Rotorder : " + s, c.siError) return False obj.Kinematics.Local.Parameters("rotorder").Value = a.index(s)
def pickPosition(message="Pick position", logWarning=True): rtn = xsi.PickPosition(message, message) if rtn("ButtonPressed") == 0: if logWarning: xsi.LogMessage("Pick Session Aborded", c.siWarning) return False position = XSIMath.CreateVector3(rtn("PosX"), rtn("PosY"), rtn("PosZ")) return position
def pickSession(objectFilter=c.siGenericObjectFilter, message="Pick Object", logWarning=True): rtn = xsi.PickElement(objectFilter, message, message) if not rtn.Value("ButtonPressed"): if logWarning: xsi.LogMessage("Pick Session Aborded", c.siWarning) return False return rtn.Value("PickedElement")
def getSymmetryMap(obj, logWarning=True): allSymmetryMaps = xsi.FindObjects( None, "{2EBA6DE4-B7EA-4877-80FE-FC768F32729F}") for map in allSymmetryMaps: if map.Parent3DObject.IsEqualTo(obj): return map if logWarning: xsi.LogMessage("No Symmetry Map for " + obj.FullName, c.siWarning) return False
def popItem(self, itemToPop): index = None for i, item in enumerate(self.items): if item == itemToPop: index = i break if index is None: xsi.LogMessage("item doesn't belong to LayouCompound", c.siWarning) return self.items.pop[index]
def log(self, caption=None, statusText=None, increment=False): self.bar.Visible = self.showBar if caption: self.bar.Caption = caption if statusText: self.bar.StatusText = statusText if self.showLog: s = " - ".join([s for s in [caption, statusText] if s is not None]) xsi.LogMessage(s, c.siComment) if increment: self.increment()
def gear_selectionSets_deleteSet_OnClicked(): from win32com.client import constants as c oList = PPG.pSetsList.Value.split(";")[0] for x in PPG.pSetsList.Value.split(";")[1:]: oList = oList + "," + x if len(oList) <= 1: xsi.LogMessage("Select a Set before Delete it", 4) else: oReturn = XSIUIToolkit.MsgBox( "Are you sure? Want to delete selected sets?", c.siMsgYesNo) if oReturn: xsi.DeleteObj(oList) gear_selectionSets_OnInit() else: lm("You cancel the delete operation.")
def gear_selectionSets_createSet_OnClicked(): oSel = xsi.Selection oRoot = xsi.ActiveSceneRoot oModel = oSel[0].Model oDescription = xsi.XSIInputBox("Group Description", "Description", "NoDescription") if oDescription.isalnum(): if oModel.ModelKind: oRoot.AddGroup(oSel, "selSet_" + oDescription + "_grp_" + oModel.Name) else: oModel.AddGroup(oSel, "selSet_" + oDescription + "_grp") gear_selectionSets_OnInit() else: xsi.LogMessage("Description not valid. Creation aborted!!!!", 4)
def gear_selectionSets_outObject_OnClicked(): from win32com.client import constants as c oList = PPG.pSetsList.Value.split(";")[0] if len(oList) <= 1: xsi.LogMessage( "Select one Set before remove objects to it, and Only one set at the time", 4) else: oReturn = XSIUIToolkit.MsgBox( "REMOVE Selected objects to first selected Set?, Remember if you have more than one set, only the first one will be used. ", c.siMsgYesNo) if oReturn: xsi.RemoveFromGroup(oList) else: lm("You cancel the adding operation.", 4)
def gear_ExportGuide_Execute(): if not xsi.Selection.Count: xsi.LogMessage("Select an object from the guide to export", c.siError) return if xsi.Selection(0).Type == "#model": model = xsi.Selection(0) else: model = xsi.Selection(0).Model options = model.Properties("options") if not options: gear.log("Invalid selection", gear.sev_error) return path = uit.fileBrowser("Export Guide", xsi.ActiveProject2.OriginPath, model.Name, ["xml"], True) if not path: return rg = RigGuide() rg.exportToXml(xsi.Selection(0), path)
def pickSessionMulti(objectFilter=c.siGenericObjectFilter, message="Pick Object", logWarning=True, minimum=1, maximum=-1): pickedObjects = [] while True: rtn = xsi.PickElement(objectFilter, message, message) if not rtn.Value("ButtonPressed"): break pickedObjects.append(rtn.Value("PickedElement")) if maximum > 0 and len(pickedObjects) >= maximum: break if len(pickedObjects) < minimum: if logWarning: xsi.LogMessage("Pick Session Aborded", c.siWarning) return False return pickedObjects
def gear_GuideToolsUI_export_OnClicked(): if not xsi.Selection.Count: xsi.LogMessage("Select an object from the guide to export", c.siError) return if xsi.Selection(0).Type == "#model": model = xsi.Selection(0) else: model = xsi.Selection(0).Model options = model.Properties("options") if not options: gear.log("Invalid selection", gear.sev_error) return path = uit.fileBrowser("Export Guide", TEMPLATE_PATH, model.Name, ["xml"], True) if not path: return rg = RigGuide() rg.exportToXml(xsi.Selection(0), path) gear_GuideToolsUI_OnInit()
def addObjects(self): self.normal = self.getNormalFromPos(self.guide.apos) self.length0 = vec.getDistance(self.guide.apos[0], self.guide.apos[1]) self.length1 = vec.getDistance(self.guide.apos[1], self.guide.apos[2]) self.length2 = vec.getDistance(self.guide.apos[2], self.guide.apos[3]) # FK Controlers ------------------------------------ t = tra.getTransformLookingAt(self.guide.apos[0], self.guide.apos[1], self.normal, "xz", self.negate) self.fk0_ctl = self.addCtl(self.root, "fk0_ctl", t, self.color_fk, "cube", h=self.size * .1, w=1, d=self.size * .1, po=XSIMath.CreateVector3( .5 * self.n_factor, 0, 0)) self.fk0_ctl.Parameters("SclX").Value = self.length0 xsi.SetNeutralPose(self.fk0_ctl) par.setKeyableParameters(self.fk0_ctl) par.addLocalParamToCollection(self.inv_params, self.fk0_ctl, ["posx", "posy", "posz"]) t = tra.getTransformLookingAt(self.guide.apos[1], self.guide.apos[2], self.normal, "xz", self.negate) self.fk1_ctl = self.addCtl(self.fk0_ctl, "fk1_ctl", t, self.color_fk, "cube", h=self.size * .1, w=1, d=self.size * .1, po=XSIMath.CreateVector3( .5 * self.n_factor, 0, 0)) self.fk1_ctl.Parameters("SclX").Value = self.length1 / self.length0 xsi.SetNeutralPose(self.fk1_ctl, c.siST) par.setKeyableParameters(self.fk1_ctl) par.addLocalParamToCollection(self.inv_params, self.fk1_ctl, ["posx", "posy", "posz"]) t = tra.getTransformLookingAt(self.guide.apos[2], self.guide.apos[3], self.normal, "xz", self.negate) self.fk2_ctl = self.addCtl(self.fk1_ctl, "fk2_ctl", t, self.color_fk, "cube", h=self.size * .1, w=self.length2, d=self.size * .1, po=XSIMath.CreateVector3( self.length2 * .5 * self.n_factor, 0, 0)) xsi.SetNeutralPose(self.fk2_ctl, c.siST) par.setKeyableParameters(self.fk2_ctl) par.addLocalParamToCollection(self.inv_params, self.fk2_ctl, ["posx", "posy", "posz"]) # IK Controlers ------------------------------------ self.ik_cns = pri.addNullFromPos(self.root, self.getName("ik_cns"), self.guide.apos[2], self.size * .02) self.addToGroup(self.ik_cns, "hidden") self.ikcns_ctl = self.addCtl(self.ik_cns, "ikcns_ctl", self.ik_cns.Kinematics.Global.Transform, self.color_ik, "null", h=self.size * .2) par.setKeyableParameters(self.ikcns_ctl) par.addLocalParamToCollection(self.inv_params, self.ikcns_ctl, ["posx", "rotx", "rotz"]) t = tra.getTransformLookingAt(self.guide.apos[2], self.guide.apos[3], self.x_axis, "zx", False) self.ik_ctl = self.addCtl(self.ikcns_ctl, "ik_ctl", t, self.color_ik, "cube", h=self.size * .12, w=self.length2, d=self.size * .12, po=XSIMath.CreateVector3( 0, 0, self.length2 * .5)) self.addToCtlGroup(self.ik_ctl) par.setKeyableParameters(self.ik_ctl) par.addLocalParamToCollection(self.inv_params, self.ik_ctl, ["posx"]) # IK and FK references self.ik_ref = pri.addNull(self.ik_ctl, self.getName("ik_ref"), self.ik_ctl.Kinematics.Global.Transform, self.size * .1) self.addToGroup(self.ik_ref, "hidden") self.fk_ref = pri.addNull(self.fk2_ctl, self.getName("fk_ref"), self.ik_ref.Kinematics.Global.Transform, self.size * .1) self.addToGroup(self.fk_ref, "hidden") v = XSIMath.CreateVector3() v.Sub(self.guide.apos[2], self.guide.apos[0]) v.Cross(self.normal, v) v.NormalizeInPlace() v.ScaleInPlace(self.size * .5) v.AddInPlace(self.guide.apos[1]) self.upv_cns = pri.addNullFromPos(self.root, self.getName("upv_cns"), v, self.size * .02) self.addToGroup(self.upv_cns, "hidden") self.upv_ctl = self.addCtl(self.upv_cns, "upv_ctl", self.upv_cns.Kinematics.Global.Transform, self.color_ik, "leash", h=self.size * .05, ap=self.guide.apos[1]) par.setKeyableParameters(self.upv_ctl, self.t_params) par.addLocalParamToCollection(self.inv_params, self.upv_ctl, ["posx"]) # Chain -------------------------------------------- self.bone0 = pri.addNull(self.root, self.getName("0_jnt"), self.fk0_ctl.Kinematics.Global.Transform) pri.setNullDisplay(self.bone0, 0, 1, 4, self.n_factor * .5, 0, 0, 1, self.size * .01, self.size * .01) self.bone0.Kinematics.Global.Parameters("sclx").Value = self.length0 self.bone1 = pri.addNull(self.bone0, self.getName("1_jnt"), self.fk1_ctl.Kinematics.Global.Transform) pri.setNullDisplay(self.bone1, 0, 1, 4, self.n_factor * .5, 0, 0, 1, self.size * .01, self.size * .01) self.bone1.Kinematics.Global.Parameters("sclx").Value = self.length1 self.ctrn_loc = pri.addNullFromPos(self.bone0, self.getName("ctrn_loc"), self.guide.apos[1], self.size * .05) self.eff_loc = pri.addNullFromPos(self.root, self.getName("eff_loc"), self.guide.apos[2], self.size * .05) x = XSIMath.CreateVector3(0, -1, 0) x.MulByRotationInPlace( self.eff_loc.Kinematics.Global.Transform.Rotation) import gear.xsi.log as log xsi.LogMessage("HEEEEYYYYYY") log.logVector(self.normal) z = XSIMath.CreateVector3(self.normal.X, self.normal.Y, self.normal.Z) z.MulByRotationInPlace( self.eff_loc.Kinematics.Global.Transform.Rotation) xsi.LogMessage("POUET") xsi.LogMessage("POUET2") r = tra.getRotationFromAxis(x, z, "xz", self.negate) t = self.ik_ctl.Kinematics.Global.Transform t.SetRotation(r) self.tws_ref = pri.addNull(self.eff_loc, self.getName("tws_ref"), t, self.size * .1) self.addToGroup([ self.bone0, self.bone1, self.ctrn_loc, self.eff_loc, self.tws_ref ], "hidden") # Mid Controler ------------------------------------ self.mid_ctl = self.addCtl(self.ctrn_loc, "mid_ctl", self.ctrn_loc.Kinematics.Global.Transform, self.color_ik, "sphere", h=self.size * .2) par.addLocalParamToCollection(self.inv_params, self.mid_ctl, ["posx", "posy", "posz"]) # Twist references --------------------------------- t = tra.getFilteredTransform(self.fk0_ctl.Kinematics.Global.Transform, True, True, False) self.tws0_loc = pri.addNull(self.root, self.getName("tws0_loc"), t, self.size * .05) self.tws0_rot = pri.addNull(self.tws0_loc, self.getName("tws0_rot"), t) pri.setNullDisplay(self.tws0_rot, 0, self.size * .05, 2, 0, 0, 0, self.size * .01) self.tws1_loc = pri.addNull(self.ctrn_loc, self.getName("tws1_loc"), self.ctrn_loc.Kinematics.Global.Transform, self.size * .05) self.tws1_rot = pri.addNull(self.tws1_loc, self.getName("tws1_rot"), self.ctrn_loc.Kinematics.Global.Transform) pri.setNullDisplay(self.tws1_rot, 0, self.size * .05, 2, 0, 0, 0, self.size * .01) t = tra.getFilteredTransform(self.bone1.Kinematics.Global.Transform, True, True, False) t.SetTranslation(self.guide.apos[2]) self.tws2_loc = pri.addNull(self.bone1, self.getName("tws2_loc"), t, self.size * .05) self.tws2_rot = pri.addNull(self.tws2_loc, self.getName("tws2_rot"), t) self.tws2_rot.Kinematics.Global.Parameters("SclX").Value = .001 pri.setNullDisplay(self.tws2_rot, 0, self.size * .05, 2, 0, 0, 0, self.size * .01) self.addToGroup([ self.tws0_loc, self.tws0_rot, self.tws1_loc, self.tws1_rot, self.tws2_loc, self.tws2_rot ], "hidden") # End reference ------------------------------------ t = tra.getFilteredTransform(self.tws2_rot.Kinematics.Global.Transform, True, True, False) self.end_ref = pri.addNull(self.tws2_rot, self.getName("end_ref"), t, self.size * .2) self.addToGroup(self.end_ref, "hidden") self.addShadow(self.end_ref, "end") # Divisions ---------------------------------------- # We have at least one division at the start, the end and one for the elbow. self.divisions = self.settings["div0"] + self.settings["div1"] + 3 self.div_cns = [] for i in range(self.divisions): div_cns = pri.addNull(self.tws0_loc, self.getName("div%s_loc" % i), XSIMath.CreateTransform()) pri.setNullDisplay(div_cns, 1, self.size * .02, 10, 0, 0, 0, 1, 1, 2) self.addToGroup(div_cns, "hidden") self.div_cns.append(div_cns) self.addShadow(div_cns, i)
def logTime(self, message=""): xsi.LogMessage(message + " : " + self.getTime(), c.siComment)