# Lena blue A-line skirt -- WORKING recipe (verified 2026-07-30, result: # tools/tailor/lena_skirt_v1.zprj + lena_skirt_v1_garment.fbx/.obj). # Run inside a bridge session (fresh scene; imports the avatar itself): # python tools/md_bridge.py --file tools/tailor/md_skirt_v1.py --timeout 500 # # BOTTOMS LESSONS (tee lessons in md_tee_v1.py still apply): # - Elastic waist during the drape KILLS it (cinches before the panels wrap # the body; garment slides off a hip). Hold bottoms up by TENSION instead: # garment waist (2x500=1000mm) < hip circ (1095mm) -- fabric stretch lets # it sit snug. Enable elastic only after full settle, if at all. # - Strengthen through the WHOLE settle (250 frames), relax only ~50 at the # end -- soft fabric rolls into a bunch at the waist otherwise. # - Drape each garment ALONE in a fresh scene: a second garment (even # frozen) grabs and inverts the new one. Game exports are per-garment # anyway; outfit photos are the only reason to co-drape, do those last. # - New-fabric creation: fabric_api.AddFabric(r".zfab") -- a NAME # string silently fails and index 0 is the DEFAULT fabric shared by every # pattern (coloring it dyes everything). Assign via # pattern_api.SetPatternPieceFabricIndex(pattern, fabric) -- # AssignFabricToPattern returns False for every arg order tried. # - SHORTS (crotch bifurcation) are NOT solved: 2-panel notch construction # twists (fabric can't thread between the touching thighs; every seam # direction parity tried). Next approach: 4 panels arranged on the # per-LEG arrangement points (Leg_Front_L/R, Leg_Back_L/R) so fabric # starts wrapped around each thigh. import os import tempfile report = {} AVATAR_FBX = r"C:\Users\Jeremy\tinqs\animation\tools\tailor\avatar\Lena_QuatSkin_Avatar.fbx" ZFAB = r"C:\Users\Public\Documents\MarvelousDesigner\New Assets\Fabric\(Default for Simulation).zfab" BLUE = (0.13, 0.3, 0.75, 1.0) utility_api.NewProject() op = ApiTypes.ImportExportOption() op.scale = 10.0 op.bAddArrangementPoints = True op.bAutoTranslate = True report["avatar"] = import_api.ImportFBX(AVATAR_FBX, op) def skirt_panel(dx): # y+ is UP: waist edge (500) at top, flared hem (700) at bottom. pts = [(100.0, 350.0), (600.0, 350.0), (700.0, 0.0), (0.0, 0.0)] return pattern_api.CreatePatternWithPoints([(x + dx, y, 0) for (x, y) in pts]) sf = skirt_panel(0.0) sb = skirt_panel(900.0) pattern_api.AddSeamlinePairGroup(sf, 1, sb, 1, False, False) # side seams pattern_api.AddSeamlinePairGroup(sf, 3, sb, 3, False, False) fab = fabric_api.AddFabric(ZFAB) fabric_api.SetFabricPBRMaterialBaseColor(fab, 0, *BLUE) for p in (sf, sb): pattern_api.SetPatternPieceFabricIndex(p, fab) arr = {a["ArrangementName"]: int(a["ArrangementIndex"]) for a in pattern_api.GetArrangementList()} pattern_api.SetArrangement(sf, arr["Body_Front_Waist"]) pattern_api.SetArrangement(sb, arr["Body_Back_Waist"]) pattern_api.SetArrangementPosition(sf, 50, 40, 50) pattern_api.SetArrangementPosition(sb, 0, 40, 50) pattern_api.SetPatternStrengthen(sf, True) pattern_api.SetPatternStrengthen(sb, True) utility_api.ResetClothArrangement() report["sim1"] = utility_api.Simulate(250) pattern_api.SetPatternStrengthen(sf, False) pattern_api.SetPatternStrengthen(sb, False) report["sim2"] = utility_api.Simulate(50) utility_api.Refresh3DWindow() snap = os.path.join(tempfile.gettempdir(), "tinqs_md_skirt_final.png") export_api.ExportSnapshot3D(snap) report["snap"] = snap result = report