├── .gitignore ├── Eve ├── docs │ └── images │ │ └── facade.jpg ├── lib │ ├── hips │ │ ├── procedural_city │ │ │ └── procedural_city_011.zip │ │ ├── shape_grammar.hiplc │ │ ├── shape_grammar │ │ │ ├── HKG.json │ │ │ ├── shape_grammar.py │ │ │ └── shape_grammar_018.hiplc │ │ ├── shpere_cube │ │ │ ├── data │ │ │ │ ├── sphere_cube_model.sav │ │ │ │ ├── train_data_cube.csv │ │ │ │ └── train_data_sphere.csv │ │ │ ├── shpere_cube.ipynb │ │ │ └── sphere_cube_001.hiplc │ │ ├── uiGeoCreator.ui │ │ ├── vex_snippets.hiplc │ │ └── vex_snippets.hipnc │ ├── icons │ │ ├── iconDNA_A.ico │ │ ├── iconDNA_B.ico │ │ ├── iconDNA_C.ico │ │ └── iconDNA_D.ico │ ├── python │ │ ├── rem │ │ │ └── 01 │ │ │ │ ├── BDF.json │ │ │ │ ├── floor_rule_deepResearch.py │ │ │ │ ├── floor_rule_o3.py │ │ │ │ ├── grammar_parser.py │ │ │ │ ├── parse_rule.py │ │ │ │ └── shape_grammar_008.hiplc │ │ ├── shape_grammar │ │ │ ├── __init__.py │ │ │ └── shape_grammar.py │ │ └── snippets.py │ └── vex │ │ ├── handle.h │ │ └── sphere.h ├── project_manager.bat └── tools │ ├── core │ ├── __init__.py │ ├── database │ │ ├── __init__.py │ │ ├── asset_data.py │ │ ├── entities.py │ │ ├── eve_data.py │ │ └── material_data.py │ ├── file_path.py │ ├── models.py │ └── settings.py │ ├── houdini │ ├── __init__.py │ ├── asset_manager.py │ ├── create_asset.py │ ├── save_next_version.py │ ├── settings │ │ ├── MainMenuCommon.xml │ │ ├── jump.pref │ │ ├── scripts │ │ │ └── 123.py │ │ └── toolbar │ │ │ ├── ShelfDefinitions.shelf │ │ │ └── eve.shelf │ ├── shot_manager.py │ ├── ui │ │ ├── __init__.py │ │ ├── ui_asset_manager.py │ │ ├── ui_asset_manager.ui │ │ ├── ui_shot_manager.py │ │ └── ui_shot_manager.ui │ ├── vex │ │ └── library.h │ └── vray_to_redshift.py │ ├── pm │ ├── __init__.py │ ├── houdini_launcher.py │ ├── icons │ │ ├── icon_PM_A.ico │ │ ├── icon_PM_B.ico │ │ ├── icon_PM_C.ico │ │ └── icon_PM_D.ico │ ├── project_manager.py │ └── ui │ │ ├── __init__.py │ │ ├── _compile_ui.bat │ │ ├── ui_asset.py │ │ ├── ui_asset.ui │ │ ├── ui_asset_properties.py │ │ ├── ui_asset_properties.ui │ │ ├── ui_link_assets.py │ │ ├── ui_link_assets.ui │ │ ├── ui_pm_add_asset.py │ │ ├── ui_pm_add_asset.ui │ │ ├── ui_pm_add_project.py │ │ ├── ui_pm_add_project.ui │ │ ├── ui_pm_add_sequence.py │ │ ├── ui_pm_add_sequence.ui │ │ ├── ui_pm_add_shot.py │ │ ├── ui_pm_add_shot.ui │ │ ├── ui_pm_main.py │ │ ├── ui_pm_main.ui │ │ ├── ui_pm_warning.py │ │ ├── ui_pm_warning.ui │ │ ├── ui_project.py │ │ ├── ui_project.ui │ │ ├── ui_project_properties.py │ │ ├── ui_project_properties.ui │ │ ├── ui_sequence.py │ │ ├── ui_sequence.ui │ │ ├── ui_sequence_properties.py │ │ ├── ui_sequence_properties.ui │ │ ├── ui_shot.py │ │ ├── ui_shot.ui │ │ ├── ui_shot_properties.py │ │ └── ui_shot_properties.ui │ └── usd │ ├── USD.py │ ├── geo.py │ ├── houdini_export_geometry.py │ └── maya_export_geometry.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # PyCharm IDE 2 | .idea 3 | 4 | # PYC 5 | *.pyc 6 | 7 | # Database 8 | Eve/data 9 | Eve/tools/houdini/vex/rmannotes.h 10 | -------------------------------------------------------------------------------- /Eve/docs/images/facade.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/docs/images/facade.jpg -------------------------------------------------------------------------------- /Eve/lib/hips/procedural_city/procedural_city_011.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/procedural_city/procedural_city_011.zip -------------------------------------------------------------------------------- /Eve/lib/hips/shape_grammar.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/shape_grammar.hiplc -------------------------------------------------------------------------------- /Eve/lib/hips/shape_grammar/HKG.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": { 3 | "0": { 4 | "level_index": 0, 5 | "floor_height": 5.0, 6 | "floor_repeat": 1, 7 | "floor_rule": { 8 | "B0": [ 9 | "(W3)*" 10 | ], 11 | "F0": [ 12 | "(E1)*" 13 | ], 14 | "S0": [ 15 | "(W1)*" 16 | ], 17 | "F1": [ 18 | "(E1)*" 19 | ], 20 | "S1": [ 21 | "(E1)*" 22 | ], 23 | "R1": [ 24 | "R1" 25 | ] 26 | } 27 | }, 28 | "1": { 29 | "level_index": 1, 30 | "floor_height": 3.0, 31 | "floor_repeat": "*", 32 | "floor_rule": { 33 | "B0": [ 34 | "(W3)*" 35 | ], 36 | "F0": [ 37 | "(W2)*" 38 | ], 39 | "S0": [ 40 | "(W1)*" 41 | ], 42 | "F1": [ 43 | "(W2)*" 44 | ], 45 | "S1": [ 46 | "(W2)*" 47 | ], 48 | "R1": [ 49 | "R1" 50 | ] 51 | } 52 | }, 53 | "2": { 54 | "level_index": 2, 55 | "floor_height": 5.0, 56 | "floor_repeat": 1, 57 | "floor_rule": { 58 | "B0": [ 59 | "(W3)*" 60 | ], 61 | "F0": [ 62 | "(T1)*" 63 | ], 64 | "S0": [ 65 | "(W1)*" 66 | ], 67 | "F1": [ 68 | "(E1)*" 69 | ], 70 | "S1": [ 71 | "(W2)*" 72 | ], 73 | "R1": [ 74 | "R1" 75 | ] 76 | } 77 | } 78 | }, 79 | "modules": { 80 | "E1": { 81 | "width": 4.0 82 | }, 83 | "W1": { 84 | "width": 2.0 85 | }, 86 | "W2": { 87 | "width": 4.0 88 | }, 89 | "W3": { 90 | "width": 0.5 91 | }, 92 | "T1": { 93 | "width": 4.0 94 | }, 95 | "R1": { 96 | "width": 2.0 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /Eve/lib/hips/shape_grammar/shape_grammar_018.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/shape_grammar/shape_grammar_018.hiplc -------------------------------------------------------------------------------- /Eve/lib/hips/shpere_cube/data/sphere_cube_model.sav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/shpere_cube/data/sphere_cube_model.sav -------------------------------------------------------------------------------- /Eve/lib/hips/shpere_cube/data/train_data_cube.csv: -------------------------------------------------------------------------------- 1 | ,points,faces,object_type 2 | 0,882,880,cube 3 | 1,612,610,cube 4 | 2,920,918,cube 5 | 3,3368,3366,cube 6 | 4,7428,7426,cube 7 | 5,6594,6592,cube 8 | 6,3594,3592,cube 9 | 7,3062,3060,cube 10 | 8,4566,4564,cube 11 | 9,6498,6496,cube 12 | 10,6634,6632,cube 13 | 11,4154,4152,cube 14 | 12,1954,1952,cube 15 | 13,1070,1068,cube 16 | 14,1392,1390,cube 17 | 15,3552,3550,cube 18 | 16,3312,3310,cube 19 | 17,5232,5230,cube 20 | 18,6740,6738,cube 21 | 19,6554,6552,cube 22 | 20,2354,2352,cube 23 | 21,2486,2484,cube 24 | 22,6756,6754,cube 25 | 23,5366,5364,cube 26 | 24,9600,9598,cube 27 | 25,9000,8998,cube 28 | 26,5872,5870,cube 29 | 27,4624,4622,cube 30 | 28,3980,3978,cube 31 | 29,2958,2956,cube 32 | 30,602,600,cube 33 | 31,634,632,cube 34 | 32,3538,3536,cube 35 | 33,8064,8062,cube 36 | 34,5904,5902,cube 37 | 35,7104,7102,cube 38 | 36,7784,7782,cube 39 | 37,6392,6390,cube 40 | 38,4796,4794,cube 41 | 39,3324,3322,cube 42 | 40,6402,6400,cube 43 | 41,2730,2728,cube 44 | 42,2914,2912,cube 45 | 43,1442,1440,cube 46 | 44,1630,1628,cube 47 | 45,1430,1428,cube 48 | 46,2510,2508,cube 49 | 47,2510,2508,cube 50 | 48,3284,3282,cube 51 | 49,1724,1722,cube 52 | 50,3024,3022,cube 53 | 51,3600,3598,cube 54 | 52,2760,2758,cube 55 | 53,1536,1534,cube 56 | 54,1400,1398,cube 57 | 55,872,870,cube 58 | 56,3496,3494,cube 59 | 57,1690,1688,cube 60 | 58,3560,3558,cube 61 | 59,3116,3114,cube 62 | 60,5492,5490,cube 63 | 61,6770,6768,cube 64 | 62,6634,6632,cube 65 | 63,5394,5392,cube 66 | 64,2514,2512,cube 67 | 65,746,744,cube 68 | 66,1250,1248,cube 69 | 67,5540,5538,cube 70 | 68,6104,6102,cube 71 | 69,3188,3186,cube 72 | 70,770,768,cube 73 | 71,1330,1328,cube 74 | 72,2280,2278,cube 75 | 73,5160,5158,cube 76 | 74,6012,6010,cube 77 | 75,3482,3480,cube 78 | 76,2106,2104,cube 79 | 77,1210,1208,cube 80 | 78,1260,1258,cube 81 | 79,2460,2458,cube 82 | 80,2460,2458,cube 83 | 81,3720,3718,cube 84 | 82,4952,4950,cube 85 | 83,5438,5436,cube 86 | 84,7794,7792,cube 87 | 85,2860,2858,cube 88 | 86,824,822,cube 89 | 87,1128,1126,cube 90 | 88,1400,1398,cube 91 | 89,520,518,cube 92 | 90,1444,1442,cube 93 | 91,2704,2702,cube 94 | 92,6242,6240,cube 95 | 93,9278,9276,cube 96 | 94,7902,7900,cube 97 | 95,4602,4600,cube 98 | 96,2574,2572,cube 99 | 97,2726,2724,cube 100 | 98,2420,2418,cube 101 | 99,3560,3558,cube 102 | 100,1960,1958,cube 103 | 101,5560,5558,cube 104 | 102,1384,1382,cube 105 | 103,4184,4182,cube 106 | 104,4184,4182,cube 107 | 105,6592,6590,cube 108 | 106,2880,2878,cube 109 | 107,1368,1366,cube 110 | 108,1890,1888,cube 111 | 109,2340,2338,cube 112 | 110,3406,3404,cube 113 | 111,1244,1242,cube 114 | 112,1384,1382,cube 115 | 113,904,902,cube 116 | 114,4308,4306,cube 117 | 115,4308,4306,cube 118 | 116,7872,7870,cube 119 | 117,4160,4158,cube 120 | 118,6438,6436,cube 121 | 119,2118,2116,cube 122 | 120,3266,3264,cube 123 | 121,888,886,cube 124 | 122,1824,1822,cube 125 | 123,1008,1006,cube 126 | 124,3384,3382,cube 127 | 125,1734,1732,cube 128 | 126,1734,1732,cube 129 | 127,1776,1774,cube 130 | 128,5248,5246,cube 131 | 129,5988,5986,cube 132 | 130,4734,4732,cube 133 | 131,4534,4532,cube 134 | 132,5754,5752,cube 135 | 133,7834,7832,cube 136 | 134,8594,8592,cube 137 | 135,4330,4328,cube 138 | 136,1690,1688,cube 139 | 137,250,248,cube 140 | 138,1690,1688,cube 141 | 139,3916,3914,cube 142 | 140,3916,3914,cube 143 | 141,4656,4654,cube 144 | 142,4136,4134,cube 145 | 143,5082,5080,cube 146 | 144,4602,4600,cube 147 | 145,5802,5800,cube 148 | 146,3502,3500,cube 149 | 147,2966,2964,cube 150 | 148,1778,1776,cube 151 | 149,2898,2896,cube 152 | 150,8970,8968,cube 153 | 151,11104,11102,cube 154 | 152,5792,5790,cube 155 | 153,4736,4734,cube 156 | 154,4736,4734,cube 157 | 155,8480,8478,cube 158 | 156,9368,9366,cube 159 | 157,8336,8334,cube 160 | 158,3728,3726,cube 161 | 159,3008,3006,cube 162 | 160,1072,1070,cube 163 | 161,3232,3230,cube 164 | 162,1018,1016,cube 165 | 163,842,840,cube 166 | 164,336,334,cube 167 | 165,592,590,cube 168 | 166,3260,3258,cube 169 | 167,3910,3908,cube 170 | 168,8734,8732,cube 171 | 169,5234,5232,cube 172 | 170,4706,4704,cube 173 | 171,4462,4460,cube 174 | 172,1242,1240,cube 175 | 173,1530,1528,cube 176 | 174,314,312,cube 177 | 175,1172,1170,cube 178 | 176,416,414,cube 179 | 177,944,942,cube 180 | 178,760,758,cube 181 | 179,2260,2258,cube 182 | 180,3860,3858,cube 183 | 181,3446,3444,cube 184 | 182,1926,1924,cube 185 | 183,792,790,cube 186 | 184,1632,1630,cube 187 | 185,1952,1950,cube 188 | 186,5994,5992,cube 189 | 187,6802,6800,cube 190 | 188,3958,3956,cube 191 | 189,4186,4184,cube 192 | 190,3402,3400,cube 193 | 191,8052,8050,cube 194 | 192,6812,6810,cube 195 | 193,9122,9120,cube 196 | 194,10082,10080,cube 197 | 195,9418,9416,cube 198 | 196,3888,3886,cube 199 | 197,2330,2328,cube 200 | 198,474,472,cube 201 | 199,530,528,cube 202 | 200,1050,1048,cube 203 | 201,1386,1384,cube 204 | 202,3780,3778,cube 205 | 203,2352,2350,cube 206 | 204,1792,1790,cube 207 | 205,2226,2224,cube 208 | 206,1506,1504,cube 209 | 207,5216,5214,cube 210 | 208,4320,4318,cube 211 | 209,6714,6712,cube 212 | 210,5434,5432,cube 213 | 211,3484,3482,cube 214 | 212,3256,3254,cube 215 | 213,1140,1138,cube 216 | 214,1452,1450,cube 217 | 215,882,880,cube 218 | 216,2072,2070,cube 219 | 217,4614,4612,cube 220 | 218,8500,8498,cube 221 | 219,7740,7738,cube 222 | 220,8400,8398,cube 223 | 221,4864,4862,cube 224 | 222,742,740,cube 225 | 223,2946,2944,cube 226 | 224,3882,3880,cube 227 | 225,7158,7156,cube 228 | 226,7630,7628,cube 229 | 227,8092,8090,cube 230 | 228,11492,11490,cube 231 | 229,3784,3782,cube 232 | 230,2184,2182,cube 233 | 231,2096,2094,cube 234 | 232,4656,4654,cube 235 | 233,5336,5334,cube 236 | 234,5336,5334,cube 237 | 235,7820,7818,cube 238 | 236,12636,12634,cube 239 | 237,3240,3238,cube 240 | 238,3240,3238,cube 241 | 239,5340,5338,cube 242 | 240,7776,7774,cube 243 | 241,6948,6946,cube 244 | 242,7412,7410,cube 245 | 243,5202,5200,cube 246 | 244,1602,1600,cube 247 | 245,1032,1030,cube 248 | 246,2328,2326,cube 249 | 247,3980,3978,cube 250 | 248,3510,3508,cube 251 | 249,3690,3688,cube 252 | -------------------------------------------------------------------------------- /Eve/lib/hips/shpere_cube/data/train_data_sphere.csv: -------------------------------------------------------------------------------- 1 | ,points,faces,object_type 2 | 0,10357,10450,sphere 3 | 1,8286,8393,sphere 4 | 2,3285,3332,sphere 5 | 3,576,588,sphere 6 | 4,2175,2214,sphere 7 | 5,2882,2925,sphere 8 | 6,2358,2394,sphere 9 | 7,6624,6699,sphere 10 | 8,7476,7575,sphere 11 | 9,992,1089,sphere 12 | 10,1352,1404,sphere 13 | 11,127,250,sphere 14 | 12,3071,3100,sphere 15 | 13,1476,1496,sphere 16 | 14,5777,5852,sphere 17 | 15,704,708,sphere 18 | 16,1278,1298,sphere 19 | 17,5042,5085,sphere 20 | 18,1694,1786,sphere 21 | 19,6866,6952,sphere 22 | 20,4526,4611,sphere 23 | 21,262,286,sphere 24 | 22,11662,11770,sphere 25 | 23,5098,5152,sphere 26 | 24,11642,11760,sphere 27 | 25,6302,6400,sphere 28 | 26,839,868,sphere 29 | 27,902,912,sphere 30 | 28,6743,6848,sphere 31 | 29,5690,5760,sphere 32 | 30,1938,1958,sphere 33 | 31,4745,4836,sphere 34 | 32,1330,1411,sphere 35 | 33,1342,1360,sphere 36 | 34,912,1040,sphere 37 | 35,4552,4615,sphere 38 | 36,925,994,sphere 39 | 37,176,232,sphere 40 | 38,876,912,sphere 41 | 39,782,806,sphere 42 | 40,482,485,sphere 43 | 41,431,442,sphere 44 | 42,5355,5406,sphere 45 | 43,6062,6120,sphere 46 | 44,3728,3807,sphere 47 | 45,5420,5547,sphere 48 | 46,4843,4888,sphere 49 | 47,6614,6728,sphere 50 | 48,498,620,sphere 51 | 49,3054,3161,sphere 52 | 50,317,336,sphere 53 | 51,2554,2574,sphere 54 | 52,2320,2440,sphere 55 | 53,902,912,sphere 56 | 54,1916,1947,sphere 57 | 55,1192,1275,sphere 58 | 56,758,777,sphere 59 | 57,8586,8658,sphere 60 | 58,1410,1440,sphere 61 | 59,5312,5428,sphere 62 | 60,9896,9991,sphere 63 | 61,4156,4221,sphere 64 | 62,512,561,sphere 65 | 63,3922,3960,sphere 66 | 64,3458,3528,sphere 67 | 65,8570,8687,sphere 68 | 66,4202,4240,sphere 69 | 67,10012,10140,sphere 70 | 68,6302,6375,sphere 71 | 69,3782,3834,sphere 72 | 70,72,80,sphere 73 | 71,1802,1840,sphere 74 | 72,626,728,sphere 75 | 73,209,230,sphere 76 | 74,5392,5445,sphere 77 | 75,290,312,sphere 78 | 76,5612,5720,sphere 79 | 77,7226,7353,sphere 80 | 78,100,147,sphere 81 | 79,2277,2310,sphere 82 | 80,3494,3589,sphere 83 | 81,3746,3796,sphere 84 | 82,4702,4794,sphere 85 | 83,7740,7844,sphere 86 | 84,2042,2080,sphere 87 | 85,1042,1092,sphere 88 | 86,2682,2720,sphere 89 | 87,716,833,sphere 90 | 88,882,888,sphere 91 | 89,3406,3496,sphere 92 | 90,4877,5000,sphere 93 | 91,5942,6006,sphere 94 | 92,3458,3492,sphere 95 | 93,2370,2442,sphere 96 | 94,10202,10302,sphere 97 | 95,2453,2508,sphere 98 | 96,1136,1260,sphere 99 | 97,902,910,sphere 100 | 98,3970,4032,sphere 101 | 99,3902,3975,sphere 102 | 100,9324,9401,sphere 103 | 101,4354,4416,sphere 104 | 102,4461,4508,sphere 105 | 103,8362,8436,sphere 106 | 104,2378,2442,sphere 107 | 105,2202,2225,sphere 108 | 106,2510,2565,sphere 109 | 107,722,736,sphere 110 | 108,6440,6512,sphere 111 | 109,5202,5265,sphere 112 | 110,1838,1854,sphere 113 | 111,226,238,sphere 114 | 112,6995,7056,sphere 115 | 113,6410,6480,sphere 116 | 114,4775,4884,sphere 117 | 115,9547,9628,sphere 118 | 116,10478,10584,sphere 119 | 117,2195,2322,sphere 120 | 118,1010,1134,sphere 121 | 119,5784,5880,sphere 122 | 120,12098,12208,sphere 123 | 121,737,756,sphere 124 | 122,2602,2652,sphere 125 | 123,173,174,sphere 126 | 124,2702,2727,sphere 127 | 125,692,700,sphere 128 | 126,6098,6223,sphere 129 | 127,402,450,sphere 130 | 128,7373,7488,sphere 131 | 129,4553,4662,sphere 132 | 130,3110,3145,sphere 133 | 131,248,287,sphere 134 | 132,2864,2968,sphere 135 | 133,1178,1197,sphere 136 | 134,3528,3612,sphere 137 | 135,10167,10272,sphere 138 | 136,8242,8343,sphere 139 | 137,13314,13440,sphere 140 | 138,497,550,sphere 141 | 139,1978,2052,sphere 142 | 140,12321,12446,sphere 143 | 141,770,896,sphere 144 | 142,6433,6490,sphere 145 | 143,6388,6489,sphere 146 | 144,2110,2142,sphere 147 | 145,1377,1430,sphere 148 | 146,306,320,sphere 149 | 147,11762,11880,sphere 150 | 148,1298,1323,sphere 151 | 149,814,819,sphere 152 | 150,5618,5664,sphere 153 | 151,3235,3294,sphere 154 | 152,1282,1312,sphere 155 | 153,206,272,sphere 156 | 154,7828,7917,sphere 157 | 155,9488,9588,sphere 158 | 156,467,558,sphere 159 | 157,6377,6460,sphere 160 | 158,254,256,sphere 161 | 159,8354,8468,sphere 162 | 160,1102,1110,sphere 163 | 161,6324,6380,sphere 164 | 162,2172,2201,sphere 165 | 163,4507,4558,sphere 166 | 164,3863,3900,sphere 167 | 165,1800,1827,sphere 168 | 166,2716,2832,sphere 169 | 167,3332,3360,sphere 170 | 168,732,803,sphere 171 | 169,2110,2139,sphere 172 | 170,2432,2520,sphere 173 | 171,4326,4416,sphere 174 | 172,4545,4602,sphere 175 | 173,6554,6678,sphere 176 | 174,1586,1606,sphere 177 | 175,202,240,sphere 178 | 176,1766,1862,sphere 179 | 177,2906,3025,sphere 180 | 178,1122,1140,sphere 181 | 179,8530,8632,sphere 182 | 180,242,250,sphere 183 | 181,56,60,sphere 184 | 182,1138,1152,sphere 185 | 183,9648,9737,sphere 186 | 184,1178,1190,sphere 187 | 185,1462,1480,sphere 188 | 186,2628,2727,sphere 189 | 187,1380,1404,sphere 190 | 188,418,520,sphere 191 | 189,6842,6954,sphere 192 | 190,452,455,sphere 193 | 191,1359,1416,sphere 194 | 192,4294,4366,sphere 195 | 193,290,296,sphere 196 | 194,11314,11413,sphere 197 | 195,8838,8930,sphere 198 | 196,7906,8008,sphere 199 | 197,2913,2952,sphere 200 | 198,1304,1395,sphere 201 | 199,1556,1568,sphere 202 | 200,4650,4704,sphere 203 | 201,8134,8208,sphere 204 | 202,6322,6399,sphere 205 | 203,9632,9720,sphere 206 | 204,1986,2046,sphere 207 | 205,4682,4745,sphere 208 | 206,962,990,sphere 209 | 207,1674,1760,sphere 210 | 208,21,38,sphere 211 | 209,1666,1728,sphere 212 | 210,1892,2016,sphere 213 | 211,1997,2100,sphere 214 | 212,3070,3127,sphere 215 | 213,2852,2888,sphere 216 | 214,706,748,sphere 217 | 215,202,208,sphere 218 | 216,3628,3700,sphere 219 | 217,4655,4700,sphere 220 | 218,6482,6570,sphere 221 | 219,4097,4186,sphere 222 | 220,10866,10961,sphere 223 | 221,6839,6966,sphere 224 | 222,11174,11270,sphere 225 | 223,3632,3663,sphere 226 | 224,2054,2070,sphere 227 | 225,379,406,sphere 228 | 226,2466,2552,sphere 229 | 227,1745,1826,sphere 230 | 228,8990,9095,sphere 231 | 229,842,875,sphere 232 | 230,1766,1782,sphere 233 | 231,1442,1560,sphere 234 | 232,12864,12971,sphere 235 | 233,8426,8496,sphere 236 | 234,10100,10200,sphere 237 | 235,11602,11716,sphere 238 | 236,709,714,sphere 239 | 237,8702,8800,sphere 240 | 238,884,980,sphere 241 | 239,87,102,sphere 242 | 240,14466,14592,sphere 243 | 241,8318,8400,sphere 244 | 242,338,357,sphere 245 | 243,522,533,sphere 246 | 244,898,952,sphere 247 | 245,567,678,sphere 248 | 246,3571,3652,sphere 249 | 247,3362,3472,sphere 250 | 248,6701,6776,sphere 251 | 249,3195,3296,sphere 252 | -------------------------------------------------------------------------------- /Eve/lib/hips/shpere_cube/shpere_cube.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "metadata": { 21 | "id": "a4FvqFB6kSSc" 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "import pickle\n", 26 | "import pandas as pd\n", 27 | "from sklearn.linear_model import LogisticRegression\n", 28 | "from sklearn.model_selection import train_test_split\n", 29 | "from sklearn.metrics import classification_report" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "source": [ 35 | "print(train_test_split)" 36 | ], 37 | "metadata": { 38 | "colab": { 39 | "base_uri": "https://localhost:8080/" 40 | }, 41 | "id": "BYb8xLrvfbDS", 42 | "outputId": "32c68b99-aa3e-46e5-945a-7c6ab6f608d5" 43 | }, 44 | "execution_count": 14, 45 | "outputs": [ 46 | { 47 | "output_type": "stream", 48 | "name": "stdout", 49 | "text": [ 50 | "\n" 51 | ] 52 | } 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "source": [ 58 | "# Read sphere cube data\n", 59 | "df_sphere = pd.read_csv('/content/drive/MyDrive/PROJECTS/sphere_cube/train_data_sphere.csv')\n", 60 | "df_cube = pd.read_csv('/content/drive/MyDrive/PROJECTS/sphere_cube/train_data_cube.csv')" 61 | ], 62 | "metadata": { 63 | "id": "qs8Fd2-8qm1v" 64 | }, 65 | "execution_count": null, 66 | "outputs": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "source": [ 71 | "# Combine data and delete redundant column\n", 72 | "df = pd.concat([df_sphere, df_cube], ignore_index=True)\n", 73 | "df.drop(['Unnamed: 0'], axis=1, inplace=True)" 74 | ], 75 | "metadata": { 76 | "id": "DIyO2wJ1uZ_2" 77 | }, 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "source": [ 84 | "# Transform \"object_type\" column from string to boolean (1=torus, 0=sphere)\n", 85 | "df['cube'] = df['object_type'].apply(lambda x: True if x == 'cube' else False)\n", 86 | "df.drop(['object_type'], axis=1, inplace=True)" 87 | ], 88 | "metadata": { 89 | "id": "ibUdXZqVXYzg" 90 | }, 91 | "execution_count": 12, 92 | "outputs": [] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "source": [ 97 | "# Define features and split data into train/test sets\n", 98 | "x = df.drop('cube', axis=1) # Features without target variable (predictors)\n", 99 | "y = df['cube'] # Target variable\n", 100 | "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)" 101 | ], 102 | "metadata": { 103 | "id": "mAfkjMUPdLkA" 104 | }, 105 | "execution_count": 15, 106 | "outputs": [] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "source": [ 111 | "# Train model\n", 112 | "logmodel = LogisticRegression(max_iter=600000)\n", 113 | "logmodel.fit(x_train, y_train)" 114 | ], 115 | "metadata": { 116 | "colab": { 117 | "base_uri": "https://localhost:8080/", 118 | "height": 75 119 | }, 120 | "id": "9X7vDDqgneKo", 121 | "outputId": "ce3a5cad-fc0d-4929-fd07-0fc13dae2077" 122 | }, 123 | "execution_count": 16, 124 | "outputs": [ 125 | { 126 | "output_type": "execute_result", 127 | "data": { 128 | "text/plain": [ 129 | "LogisticRegression(max_iter=600000)" 130 | ], 131 | "text/html": [ 132 | "
LogisticRegression(max_iter=600000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" 133 | ] 134 | }, 135 | "metadata": {}, 136 | "execution_count": 16 137 | } 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "source": [ 143 | "# Evaluate model\n", 144 | "y_pred = logmodel.predict(x_test)\n", 145 | "print(classification_report(y_test, y_pred))" 146 | ], 147 | "metadata": { 148 | "id": "TII-T30BoOPZ" 149 | }, 150 | "execution_count": null, 151 | "outputs": [] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "source": [ 156 | "# Save model\n", 157 | "model_path = '/content/drive/MyDrive/PROJECTS/sphere_cube/sphere_cube_model.sav'\n", 158 | "pickle.dump(logmodel, open(model_path, 'wb'))" 159 | ], 160 | "metadata": { 161 | "id": "NMgKJizOsD5E" 162 | }, 163 | "execution_count": 18, 164 | "outputs": [] 165 | } 166 | ] 167 | } -------------------------------------------------------------------------------- /Eve/lib/hips/shpere_cube/sphere_cube_001.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/shpere_cube/sphere_cube_001.hiplc -------------------------------------------------------------------------------- /Eve/lib/hips/uiGeoCreator.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | GeoCreator 4 | 5 | 6 | 7 | 0 8 | 0 9 | 298 10 | 79 11 | 12 | 13 | 14 | Create Geometry 15 | 16 | 17 | 18 | 19 | 20 | MY_GEO 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 0 32 | 35 33 | 34 | 35 | 36 | Create Geometry 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Eve/lib/hips/vex_snippets.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/vex_snippets.hiplc -------------------------------------------------------------------------------- /Eve/lib/hips/vex_snippets.hipnc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/hips/vex_snippets.hipnc -------------------------------------------------------------------------------- /Eve/lib/icons/iconDNA_A.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/icons/iconDNA_A.ico -------------------------------------------------------------------------------- /Eve/lib/icons/iconDNA_B.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/icons/iconDNA_B.ico -------------------------------------------------------------------------------- /Eve/lib/icons/iconDNA_C.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/icons/iconDNA_C.ico -------------------------------------------------------------------------------- /Eve/lib/icons/iconDNA_D.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/icons/iconDNA_D.ico -------------------------------------------------------------------------------- /Eve/lib/python/rem/01/BDF.json: -------------------------------------------------------------------------------- 1 | { 2 | "levels": { 3 | "0": { 4 | "level_index": 0, 5 | "floor_height": 2.5, 6 | "floor_repeat": 2, 7 | "floor_rule": { 8 | "F0": [ 9 | "CORNER|(WINDOW)*|CORNER" 10 | ] 11 | } 12 | }, 13 | "1": { 14 | "level_index": 1, 15 | "floor_height": 2.5, 16 | "floor_repeat": 4, 17 | "floor_rule": { 18 | "F0": [ 19 | "WINDOW|(WALL)*|WINDOW" 20 | ] 21 | } 22 | }, 23 | "2": { 24 | "level_index": 2, 25 | "floor_height": 0.5, 26 | "floor_repeat": 1, 27 | "floor_rule": { 28 | "F0": [ 29 | "CORNER|(ROOF)*|CORNER" 30 | ] 31 | } 32 | } 33 | }, 34 | "modules": { 35 | "WINDOW": { 36 | "width": 0.6 37 | }, 38 | "ROOF": { 39 | "width": 1.0 40 | }, 41 | "CORNER": { 42 | "width": 2.0 43 | }, 44 | "WALL": { 45 | "width": 3.5 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Eve/lib/python/rem/01/floor_rule_deepResearch.py: -------------------------------------------------------------------------------- 1 | """ 2 | The 1 working solution from Deep Research GPT conversation 3 | """ 4 | 5 | 6 | # Rule Parsing: shape grammar magic 7 | def evaluate_bucket(bucket, evaluated_buckets): 8 | """ 9 | Build an abstract syntax tree (AST) from a bucket (inside | |). 10 | 11 | if we find a "matches", then token is a macro (e.g. "(A)"), otherwise it is a module (e.g. "A") 12 | 13 | ast_macro =[{'type': 'macro', 'parts': ['A'], 'star': False, 'max_rep': None}] 14 | ast_module =[{'type': 'module', 'parts': ['A'], 'star': False, 'max_rep': 1}] 15 | """ 16 | 17 | bucket_is_macro = re.match(r"^\(([^)]+)\)(?:\*|(?:\[(\d+)\]))?$", bucket) 18 | print(f'>> bucket_is_macro: {bucket_is_macro}') 19 | 20 | if bucket_is_macro: 21 | inner = bucket_is_macro.group(1) # e.g. 'A' or 'W-A' 22 | star = bucket.endswith("*") 23 | cap = bucket_is_macro.group(2) 24 | max_rep = int(cap) if cap else None 25 | parts = inner.split("-") 26 | evaluated_buckets.append({"type":"macro", "parts":parts, "star":star, "max_rep":max_rep}) 27 | else: # Bucket is a module_code (e.g. "C") 28 | key = bucket.strip() 29 | if key: 30 | evaluated_buckets.append({ "type":"module", "parts":[key], "star": False, "max_rep":1}) 31 | 32 | 33 | def evaluate_shape_grammar(building_style, level_index, facade_rule_token, P0, P1): 34 | """ 35 | Parse a single floor shape grammar rule string ("C|(W)|C") and 36 | return a list of world space split positions (Vector3). 37 | 38 | level_index: number of current level (0, 1, 2, ...) 39 | facade_rule_token: facade orientation + facade sacale factor (F0, S0, F1, etc) - comes from mass model 40 | P0: Facade start point 41 | P1: Facade end point 42 | 43 | # Data examples 44 | floor_rule = "(A)" 45 | modules_data = {"A": {"width": 2.0}} 46 | module_placements = {'0': {'module_code': 'A', 'cursor': 0.0, 'module_width': 1.8}, 47 | '1': {'module_code': 'A', 'cursor': 2.0, 'module_width': 1.8}, ...} 48 | 49 | 50 | 51 | evaluated_buckets for "C|(W)|C" ([]): 52 | {"type":"module", "parts":["C"], "star":False, "max_rep":1}, 53 | {"type":"macro", "parts":["W"], "star":False, "max_rep":None}, 54 | {"type":"module", "parts":["C"], "star":False, "max_rep":1} 55 | """ 56 | 57 | levels_data = read_bdf_data(building_style)['levels'] 58 | modules_data = read_bdf_data(building_style)['modules'] 59 | 60 | rule_varialtion = 0 61 | floor_rule = levels_data[str(level_index)]['floor_rule'][facade_rule_token][rule_varialtion] 62 | print(f'>> floor_rule: {floor_rule}') 63 | 64 | facade_length = (P1 - P0).length() 65 | split_axis = (P1 - P0).normalized() # Facade local X axis 66 | # print(f'split_axis: {split_axis})) # facade_length: {facade_length}' 67 | 68 | # Tokenize buckets (tokens) 69 | buckets = floor_rule.split("|") 70 | 71 | # For each bucket, build a minimal Abstract Syntax Tree 72 | evaluated_buckets = [] 73 | for bucket in buckets: 74 | evaluate_bucket(bucket, evaluated_buckets) 75 | 76 | print(f'evaluated_buckets: {evaluated_buckets}') 77 | 78 | # First pass: place mandatory copies and collect loop-macros 79 | module_placements = {} # (module_code, cursor, module_width) data. To set prim attributes later in Houdini 80 | loopers = [] # macros that can repeat indefinitely 81 | cursor = 0.0 # cursor: module X position on facade in local facade coordinates 82 | module_index = 0 # Iteration of module placement 83 | 84 | for bucket in evaluated_buckets: 85 | for module_code in bucket["parts"]: 86 | module_width = modules_data[module_code]['width'] 87 | placement = {"module_code": module_code, "cursor": cursor, "module_width": module_width} 88 | module_placements[str(module_index)] = placement 89 | 90 | cursor += module_width 91 | module_index += 1 92 | 93 | if bucket["type"]=="macro" and bucket["max_rep"] is None: 94 | loopers.append(bucket) 95 | 96 | # print(f'module_placements 1: {module_placements}') 97 | # print(f'loopers: {loopers}') 98 | 99 | # Loop-append phase 100 | remaining = facade_length - cursor 101 | # print(f'remaining: {remaining}') 102 | for bucket in loopers: 103 | macro_width = sum(modules_data[module_code]['width'] for module_code in bucket["parts"]) 104 | full_copies = int( remaining // macro_width ) # how many full copies fit? 105 | 106 | if bucket["max_rep"] is not None: # cap if fixed max_rep 107 | full_copies = min(full_copies, bucket["max_rep"]) 108 | 109 | for i in range(full_copies + 1): 110 | for module_code in bucket["parts"]: 111 | module_width = modules_data[module_code]['width'] 112 | placement = {"module_code": module_code, "cursor": cursor, "module_width": module_width} 113 | module_placements[str(module_index)] = placement 114 | 115 | cursor += module_width 116 | module_index += 1 117 | 118 | remaining -= macro_width 119 | 120 | # # tar-scale last macro to absorb final slack 121 | # if evaluated_buckets and evaluated_buckets[-1]["star"]: 122 | # slack = facade_length - cursor # positive gap still empty 123 | # if slack > 1e-6: 124 | # parts = evaluated_buckets[-1]["parts"] 125 | # total_nom = sum(modules_data[p]['width'] for p in parts) 126 | # ratio = (slack + total_nom) / total_nom 127 | 128 | # # find the last |parts| placements we just wrote 129 | # for i, part in enumerate(parts[::-1], 1): 130 | # idx = str(module_index - i) # last entries in dict 131 | # new_w = modules_data[part]['width'] * ratio 132 | # module_placements[idx]["module_width"] = new_w 133 | 134 | # 7) STAR-BUCKET SCALING: if the last bucket was marked star, 135 | # stretch ALL of its placements to fill exactly facade_length. 136 | if evaluated_buckets and evaluated_buckets[-1]["star"]: 137 | total_used = cursor # current total span 138 | if total_used > 1e-6: 139 | # print(f'total_used: {total_used}') 140 | scale_ratio = facade_length / total_used # how much to stretch 141 | # Stretch every placement of THAT bucket 142 | last_parts = set(evaluated_buckets[-1]["parts"]) # e.g. {'A'} 143 | for key, placement in module_placements.items(): 144 | if placement["module_code"] in last_parts: 145 | # resize each A by the same ratio: 146 | placement["module_width"] *= scale_ratio 147 | 148 | # (Optional) Recompute cursor = facade_length if you need it later 149 | cursor = facade_length 150 | 151 | # # Build world-space points from local cursor positions 152 | # placement_positions = [] 153 | # for module_placement in module_placements.values(): 154 | # cursor = module_placement['cursor'] 155 | # world_position = P0 + split_axis * cursor 156 | # placement_positions.append(world_position) 157 | 158 | # print(f'module_placements: {module_placements}') 159 | 160 | return module_placements 161 | 162 | -------------------------------------------------------------------------------- /Eve/lib/python/rem/01/floor_rule_o3.py: -------------------------------------------------------------------------------- 1 | # facade_grammar.py 2 | """ 3 | Minimal Houdini-side evaluator for the first three bucket-grammar patterns: 4 | "(A)" – repeat whole modules 5 | "(A)*" – repeat, scale to fill 6 | "C|(W)|C" – fixed modules + repeating bucket 7 | "[A]n" – repeat module A exactly n times (treated as a macro) 8 | "A-B-C" - place modules A, B, C in sequence 9 | The code is written for Houdini's Python environment (imports hou) but has 10 | no other external dependencies. 11 | """ 12 | 13 | from typing import Dict, List, Tuple 14 | import math 15 | import re 16 | import hou 17 | 18 | 19 | def _tokenize(rule): 20 | """ 21 | Split and clean from empty stringsa bucket grammar rule (separated by '|') into tokens 22 | """ 23 | 24 | return [t for t in rule.split("|") if t] 25 | 26 | 27 | def _preprocess_tokens(tokens): 28 | """ 29 | Preprocess tokens to handle [A]n syntax by converting them to macro form 30 | 31 | Converts [A]2 to (AA) for processing by the existing macro logic. 32 | """ 33 | 34 | result = [] 35 | for token in tokens: 36 | # Check if the token matches [X]n pattern 37 | match = re.match(r'\[(.+)\](\d+)$', token) 38 | if match: 39 | module = match.group(1) 40 | count = int(match.group(2)) 41 | # Convert to a standard macro with repeated modules 42 | result.append('(' + module * count + ')') 43 | else: 44 | result.append(token) 45 | return result 46 | 47 | 48 | def _classify(token): 49 | """ 50 | Return one of: 'module', 'macro', 'macro_star' 51 | """ 52 | 53 | if token.startswith("(") and token.endswith(")*"): 54 | return "macro_star" 55 | if token.startswith("(") and token.endswith(")"): 56 | return "macro" 57 | 58 | return "module" 59 | 60 | 61 | def _pattern_width(pattern, modules): 62 | """ 63 | Width of the pattern inside a (…) bucket 64 | """ 65 | inner = pattern.strip("()*") 66 | return sum(modules[m]["width"] for m in inner) 67 | 68 | 69 | def _expand_hyphenated_modules(module_token, modules): 70 | """ 71 | Expand hyphenated module names like "A-B-C" into individual modules ["A", "B", "C"] 72 | Returns a list of individual module names 73 | """ 74 | if "-" in module_token: 75 | return module_token.split("-") 76 | return [module_token] 77 | 78 | 79 | def _get_module_width(module_token, modules): 80 | """ 81 | Get the width of a module token, handling both simple and hyphenated names 82 | """ 83 | if "-" in module_token: 84 | module_names = module_token.split("-") 85 | return sum(modules[name]["width"] for name in module_names) 86 | return modules[module_token]["width"] 87 | 88 | 89 | def local_x_to_world(p0, p1, x_values): 90 | """ 91 | Convert local-X offsets to world positions along the P0-P1 vector 92 | """ 93 | 94 | axis = (p1 - p0).normalized() 95 | return [p0 + axis * v for v in x_values] 96 | 97 | 98 | def evaluate_floor_rule(rule, facade_length, modules): 99 | """ 100 | Return a dictionary with module placements information: 101 | {module_index: {'module_name', 'position', 'module_width', 'module_scale'}} 102 | 103 | Supports several patterns: 104 | - "(A)" - repeat whole modules 105 | - "(A)*" - repeat, scale to fill 106 | - "C|(W)|C" - fixed modules + repeating bucket 107 | - "[A]n" - repeat module A exactly n times (converted to macro) 108 | - "A-B-C" - place modules A, B, C in sequence 109 | """ 110 | 111 | tokens = _tokenize(rule) 112 | # Preprocess [A]n syntax into macro form 113 | tokens = _preprocess_tokens(tokens) 114 | token_types = [_classify(t) for t in tokens] 115 | 116 | # Find the index of the first macro token (repeating bucket) 117 | repeating_bucket_index = next((i for i, typ in enumerate(token_types) if typ.startswith("macro")), None) 118 | 119 | # Sum all fixed widths (regular modules) 120 | fixed_width = 0.0 121 | for t, typ in zip(tokens, token_types): 122 | if typ == "module": 123 | fixed_width += _get_module_width(t, modules) 124 | 125 | # Pattern data for the repeating bucket (if any) 126 | if repeating_bucket_index is not None: 127 | pattern = tokens[repeating_bucket_index] 128 | pattern_width = _pattern_width(pattern, modules) 129 | leftover = facade_length - fixed_width 130 | if token_types[repeating_bucket_index] == "macro": 131 | count = int(leftover // pattern_width) 132 | scale = 1.0 133 | else: # macro_star 134 | count = max(1, int(leftover // pattern_width)) 135 | scale = leftover / (count * pattern_width) 136 | else: 137 | count = scale = 0.0 # not used 138 | 139 | # Emit positions 140 | x = 0.0 141 | module_placements = {} 142 | idx = 0 143 | 144 | for i, (tok, typ) in enumerate(zip(tokens, token_types)): 145 | if typ == "module": 146 | # Handle hyphenated modules (A-B-C) 147 | module_names = _expand_hyphenated_modules(tok, modules) 148 | for module_name in module_names: 149 | w = modules[module_name]["width"] 150 | module_placements[idx] = { 151 | "module_name": module_name, 152 | "position": x, 153 | "module_width": w, 154 | "module_scale": 1.0, 155 | } 156 | x += w 157 | idx += 1 158 | 159 | elif typ.startswith("macro"): 160 | inner = tok.strip("()*") 161 | inner_w = _pattern_width(tok, modules) * scale 162 | for _ in range(count): 163 | for m in inner: 164 | w = modules[m]["width"] * scale 165 | module_placements[idx] = { 166 | "module_name": m, 167 | "position": x, 168 | "module_width": w, 169 | "module_scale": scale, 170 | } 171 | x += w 172 | idx += 1 173 | 174 | return module_placements 175 | 176 | 177 | if __name__ == "__main__": 178 | 179 | # -- example BDF subset 180 | MODULES = { 181 | "C": {"width": 1.0}, 182 | "A": {"width": 3.0}, 183 | "B": {"width": 2.0}, 184 | "W": {"width": 4.0}, 185 | "R": {"width": 0.5}, 186 | } 187 | 188 | P0 = hou.Vector3(0, 0, 0) 189 | P1 = hou.Vector3(11, 0, 0) 190 | façade_len = (P1 - P0).length() 191 | 192 | for rule in ["A", "A|B", "[A]2", "(C)", "(C)*", "C|(W)|C", "C|A-B|(A)*|A-B|C"]: 193 | # building_style, level_index, facade_rule_token, P0, P1 194 | module_placements = evaluate_floor_rule(rule, façade_len, MODULES) 195 | 196 | # Extract positions from the module placements dictionary for world conversion 197 | positions = [data["position"] for data in module_placements.values()] 198 | w_points = local_x_to_world(P0, P1, positions) 199 | 200 | print(f"\nRule: {rule}") 201 | print("module_placements:", module_placements) 202 | print("world points:", [tuple(p) for p in w_points]) 203 | -------------------------------------------------------------------------------- /Eve/lib/python/rem/01/parse_rule.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import re 3 | import json 4 | 5 | # TEMP 6 | def read_bdf_data(): 7 | """ 8 | Read BDF data 9 | """ 10 | 11 | bdf_file_path = "C:/Users/kko8/OneDrive/projects/procedural_city/PROD/3D/lib/grammar/BDF.json" 12 | with open(bdf_file_path, 'r') as f: 13 | bdf_data = json.load(f) 14 | 15 | return bdf_data 16 | 17 | 18 | def evaluate_bucket(bucket, evaluated_buckets): 19 | """ 20 | Build an abstract syntax tree (AST) from a bucket (inside | |). 21 | 22 | if we find a "matches", then token is a macro (e.g. "(A)"), otherwise it is a module (e.g. "A") 23 | 24 | ast_macro =[{'type': 'macro', 'parts': ['A'], 'star': False, 'max_rep': None}] 25 | ast_module =[{'type': 'module', 'parts': ['A'], 'star': False, 'max_rep': 1}] 26 | """ 27 | 28 | bucket_is_macro = re.match(r"^\(([^)]+)\)(?:\*|(?:\[(\d+)\]))?$", bucket) 29 | 30 | if bucket_is_macro: 31 | inner = bucket_is_macro.group(1) # e.g. 'A' or 'W-A' 32 | star = bucket.endswith("*") 33 | cap = bucket_is_macro.group(2) 34 | max_rep = int(cap) if cap else None 35 | parts = inner.split("-") 36 | evaluated_buckets.append({"type":"macro", "parts":parts, "star":star, "max_rep":max_rep}) 37 | else: # Bucket is a module_code (e.g. "C") 38 | key = bucket.strip() 39 | if key: 40 | evaluated_buckets.append({ "type":"module", "parts":[key], "star": False, "max_rep":1}) 41 | 42 | 43 | def evaluate_shape_grammar(level_index, facade_rule_token, P0, P1): 44 | """ 45 | Parse a single floor shape grammar rule string ("C|(W)|C") and 46 | return a list of world space split positions (Vector3). 47 | 48 | level_index: number of current level (0, 1, 2, ...) 49 | facade_rule_token: facade orientation + facade sacale factor (F0, S0, F1, etc) - comes from mass model 50 | P0: Facade start point 51 | P1: Facade end point 52 | 53 | # Data examples 54 | floor_rule = "(A)" 55 | modules_data = {"A": {"width": 1.0}} 56 | module_placements = {'1': {'0': {'module_code': 'A', 'cursor': 0.0, 'module_width': 2.0}}} 57 | 58 | 59 | evaluated_buckets for "C|(W)|C" ([]): 60 | {"type":"module", "parts":["C"], "star":False, "max_rep":1}, 61 | {"type":"macro", "parts":["W"], "star":False, "max_rep":None}, 62 | {"type":"module", "parts":["C"], "star":False, "max_rep":1} 63 | """ 64 | 65 | levels_data = read_bdf_data()['levels'] 66 | modules_data = read_bdf_data()['modules'] 67 | 68 | rule_varialtion = 0 69 | floor_rule = levels_data[str(level_index)]['floor_rule'][facade_rule_token][rule_varialtion] 70 | 71 | facade_length = (P1 - P0).length() 72 | split_axis = (P1 - P0).normalized() # Facade local X axis 73 | # print(f'split_axis: {split_axis})) # facade_length: {facade_length}' 74 | 75 | # Tokenize buckets (tokens) 76 | buckets = floor_rule.split("|") 77 | 78 | # For each bucket, build a minimal Abstract Syntax Tree 79 | evaluated_buckets = [] 80 | for bucket in buckets: 81 | evaluate_bucket(bucket, evaluated_buckets) 82 | 83 | # print(f'evaluated_buckets: {evaluated_buckets}') 84 | 85 | # First pass: place mandatory copies and collect loop-macros 86 | module_placements = {} # (module_code, cursor, module_width) data. To set prim attributes later in Houdini 87 | loopers = [] # macros that can repeat indefinitely 88 | cursor = 0.0 # cursor: module X position on facade in local facade coordinates 89 | module_index = 0 # Iteration of module placement 90 | 91 | for bucket in evaluated_buckets: 92 | for module_code in bucket["parts"]: 93 | module_width = modules_data[module_code]['width'] 94 | placement = {"module_code": module_code, "cursor": cursor, "module_width": module_width} 95 | module_placements[str(module_index)] = placement 96 | 97 | cursor += module_width 98 | module_index += 1 99 | 100 | if bucket["type"]=="macro" and bucket["max_rep"] is None: 101 | loopers.append(bucket) 102 | 103 | # print(f'module_placements 1: {module_placements}') 104 | # print(f'loopers: {loopers}') 105 | 106 | # Loop-append phase 107 | remaining = facade_length - cursor 108 | # print(f'remaining: {remaining}') 109 | for bucket in loopers: 110 | macro_width = sum(modules_data[module_code]['width'] for module_code in bucket["parts"]) 111 | full_copies = int( remaining // macro_width ) # how many full copies fit? 112 | 113 | if bucket["max_rep"] is not None: # cap if fixed max_rep 114 | full_copies = min(full_copies, bucket["max_rep"]) 115 | 116 | for i in range(full_copies + 1): 117 | for module_code in bucket["parts"]: 118 | module_width = modules_data[module_code]['width'] 119 | placement = {"module_code": module_code, "cursor": cursor, "module_width": module_width} 120 | module_placements[str(module_index)] = placement 121 | 122 | cursor += module_width 123 | module_index += 1 124 | 125 | remaining -= macro_width 126 | 127 | print(f'module_placements: {module_placements}') 128 | 129 | # (optional) star-scale last macro to absorb final slack 130 | # if ast and ast[-1]["star"]: 131 | # slack = facade_length - cursor 132 | # if slack>1e-4: 133 | # # scale every part proportionally 134 | # total_nom = sum(modules_data[module_code]['width'] for module_code in ast[-1]["parts"]) 135 | # ratio = (slack + total_nom)/total_nom 136 | # for module_code in ast[-1]["parts"]: 137 | # w0 = modules_data[module_code]['width']*ratio 138 | # placements.append((module_code, cursor, w0)) 139 | # cursor += w0 140 | 141 | # Build world-space points from local cursor positions 142 | placement_positions = [] 143 | for module_placement in module_placements.values(): 144 | cursor = module_placement['cursor'] 145 | world_position = P0 + split_axis * cursor 146 | placement_positions.append(world_position) 147 | 148 | return module_placements, placement_positions 149 | -------------------------------------------------------------------------------- /Eve/lib/python/rem/01/shape_grammar_008.hiplc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/python/rem/01/shape_grammar_008.hiplc -------------------------------------------------------------------------------- /Eve/lib/python/shape_grammar/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/lib/python/shape_grammar/__init__.py -------------------------------------------------------------------------------- /Eve/lib/python/snippets.py: -------------------------------------------------------------------------------- 1 | data ={ 2 | "0":{ 3 | "floor_coordinate":12, 4 | "floor_height":1, 5 | "floor_index":0, 6 | "floor_scale":1, 7 | "level_index":"0" 8 | }, 9 | "1":{ 10 | "floor_coordinate":13, 11 | "floor_height":3, 12 | "floor_index":1, 13 | "floor_scale":1, 14 | "level_index":"1" 15 | }, 16 | "2":{ 17 | "floor_coordinate":16, 18 | "floor_height":3, 19 | "floor_index":2, 20 | "floor_scale":1, 21 | "level_index":"1" 22 | }, 23 | "3":{ 24 | "floor_coordinate":19, 25 | "floor_height":1, 26 | "floor_index":3, 27 | "floor_scale":1, 28 | "level_index":"2" 29 | } 30 | } 31 | 32 | 33 | # sort dictionary by keys 34 | data = dict(sorted(data.items(), key=lambda item: item[0])) # sort by floor number 35 | floor_coordinates = [data[key]["floor_coordinate"] for key in data] 36 | 37 | print(floor_coordinates) 38 | 39 | -------------------------------------------------------------------------------- /Eve/lib/vex/handle.h: -------------------------------------------------------------------------------- 1 | /* 2 | Create a handle shape poly line 3 | */ 4 | 5 | float height = chf("height"); 6 | float width = chf("width"); 7 | float radius = chf("radius"); 8 | int steps = chi("steps"); 9 | 10 | // Clamp so the corners can still fit 11 | radius = clamp(radius, 0.001, min(height, width*0.5)); 12 | 13 | // Inside straight lengths adjusted 14 | float depth = height - radius; 15 | float length = width - 2*radius; 16 | depth = max(depth, 0); 17 | length = max(length, 0); 18 | 19 | // Build points (same logic as before) 20 | function int addPos(vector P){ 21 | return addpoint(0, P); 22 | } 23 | 24 | int pts[]; 25 | append(pts, addPos(set(0, 0, 0))); 26 | append(pts, addPos(set(0, depth, 0))); 27 | 28 | for(int i=1;i> Houdini file is not saved yet. Save scene first!') 23 | -------------------------------------------------------------------------------- /Eve/tools/houdini/settings/MainMenuCommon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Eve/tools/houdini/settings/jump.pref: -------------------------------------------------------------------------------- 1 | $HOME/ 2 | -------------------------------------------------------------------------------- /Eve/tools/houdini/settings/scripts/123.py: -------------------------------------------------------------------------------- 1 | pass -------------------------------------------------------------------------------- /Eve/tools/houdini/settings/toolbar/ShelfDefinitions.shelf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Eve/tools/houdini/settings/toolbar/eve.shelf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Eve/tools/houdini/shot_manager.py: -------------------------------------------------------------------------------- 1 | import hou 2 | import os 3 | from PySide2 import QtCore, QtWidgets 4 | from houdini.ui import ui_shot_manager 5 | 6 | from core import settings 7 | from core.database import entities 8 | from core.database import eve_data 9 | from core import models 10 | from core import file_path 11 | 12 | 13 | class ShotManager(QtWidgets.QDialog, ui_shot_manager.Ui_ShotManager): 14 | def __init__(self): 15 | super(ShotManager, self).__init__() 16 | self.setupUi(self) 17 | self.setParent(hou.ui.mainQtWindow(), QtCore.Qt.Window) 18 | 19 | # Setup environment 20 | self.eve_root = os.environ['EVE_ROOT'] 21 | self.project_name = os.environ['EVE_PROJECT_NAME'] 22 | self.SQL_FILE_PATH = settings.SQL_FILE_PATH.format(self.eve_root) 23 | 24 | # Get Project Manager data 25 | self.eve_data = None 26 | self.project = None 27 | self.model_sequences = None 28 | self.model_shots = None 29 | # UI selection 30 | self.selected_shot = None 31 | self.selected_sequence = None 32 | 33 | self.init_shot_manager() 34 | 35 | # Sequence-shot UI relation 36 | self.boxSequence.currentIndexChanged.connect(self.init_shots) 37 | self.boxShot.currentIndexChanged.connect(self.init_shot) 38 | 39 | # Setup UI functionality 40 | self.btnCreateRenderScene.clicked.connect(self.run_create_render_scene) 41 | self.btnOpenRenderScene.clicked.connect(self.run_open_render_scene) 42 | 43 | def init_shot_manager(self): 44 | """ 45 | Load data for Shot Manager 46 | :return: 47 | """ 48 | 49 | self.eve_data = eve_data.EveData(self.SQL_FILE_PATH) 50 | self.project = self.eve_data.get_project_by_name(self.project_name) 51 | 52 | self.eve_data.get_project_sequences(self.project) 53 | self.model_sequences = models.ListModel(self.eve_data.project_sequences) 54 | 55 | self.boxSequence.setModel(self.model_sequences) 56 | 57 | self.init_shots() 58 | 59 | def init_shots(self): 60 | """ 61 | When sequence selected in Shot Manager Ui 62 | :return: 63 | """ 64 | 65 | model_index = self.boxSequence.model().index(self.boxSequence.currentIndex(), 0) 66 | sequence_id = model_index.data(QtCore.Qt.UserRole + 1) 67 | 68 | self.eve_data.get_sequence_shots(sequence_id) 69 | self.model_shots = models.ListModel(self.eve_data.sequence_shots) 70 | 71 | self.selected_sequence = self.eve_data.get_sequence(sequence_id) 72 | 73 | self.boxShot.setModel(self.model_shots) 74 | 75 | self.init_shot() 76 | 77 | def init_shot(self): 78 | 79 | model_index = self.boxShot.model().index(self.boxShot.currentIndex(), 0) 80 | shot_id = model_index.data(QtCore.Qt.UserRole + 1) 81 | shot = self.eve_data.get_shot(shot_id) 82 | 83 | if shot: 84 | self.selected_shot = self.eve_data.get_shot(shot.id) 85 | 86 | def run_create_render_scene(self): 87 | 88 | # Build string PATH to file 89 | file_type = entities.EveFile.file_types['shot_render'] 90 | shot_file_path = file_path.EveFilePath() 91 | shot_file_path.build_path_shot_render(file_type, self.selected_sequence.name, self.selected_shot.name, '001') 92 | 93 | scene_path = shot_file_path.version_control() 94 | if not scene_path: 95 | return 96 | 97 | # Create new scene 98 | hou.hipFile.clear() 99 | 100 | # Save file 101 | if scene_path: 102 | hou.hipFile.save(scene_path) 103 | 104 | def run_open_render_scene(self): 105 | """ 106 | Open LAST existing scene version. 107 | 108 | WIP. Need to implement publishing and open user-defined or last published version. 109 | :return: 110 | """ 111 | 112 | # Build string PATH to file 113 | file_type = entities.EveFile.file_types['shot_render'] 114 | shot_file_path = file_path.EveFilePath() 115 | shot_file_path.build_path_shot_render(file_type, self.selected_sequence.name, self.selected_shot.name, '001') 116 | shot_file_path.build_last_file_version() 117 | 118 | hou.hipFile.load(shot_file_path.path) 119 | 120 | 121 | def run_shot_manager(): 122 | shot_manager = ShotManager() 123 | shot_manager.show() 124 | 125 | -------------------------------------------------------------------------------- /Eve/tools/houdini/ui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/houdini/ui/__init__.py -------------------------------------------------------------------------------- /Eve/tools/houdini/ui/ui_asset_manager.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\houdini\ui\ui_asset_manager.ui', 4 | # licensing of 'E:\Eve\Eve\tools\houdini\ui\ui_asset_manager.ui' applies. 5 | # 6 | # Created: Fri Jun 26 00:02:14 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AssetManager(object): 14 | def setupUi(self, AssetManager): 15 | AssetManager.setObjectName("AssetManager") 16 | AssetManager.resize(351, 105) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AssetManager) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.splitter_2 = QtWidgets.QSplitter(AssetManager) 20 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 21 | self.splitter_2.setObjectName("splitter_2") 22 | self.label_3 = QtWidgets.QLabel(self.splitter_2) 23 | self.label_3.setMaximumSize(QtCore.QSize(100, 16777215)) 24 | self.label_3.setObjectName("label_3") 25 | self.comAssetType = QtWidgets.QComboBox(self.splitter_2) 26 | self.comAssetType.setObjectName("comAssetType") 27 | self.verticalLayout.addWidget(self.splitter_2) 28 | self.splitter = QtWidgets.QSplitter(AssetManager) 29 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 30 | self.splitter.setObjectName("splitter") 31 | self.label_2 = QtWidgets.QLabel(self.splitter) 32 | self.label_2.setMaximumSize(QtCore.QSize(100, 16777215)) 33 | self.label_2.setObjectName("label_2") 34 | self.comAssetName = QtWidgets.QComboBox(self.splitter) 35 | self.comAssetName.setObjectName("comAssetName") 36 | self.verticalLayout.addWidget(self.splitter) 37 | self.splitter_3 = QtWidgets.QSplitter(AssetManager) 38 | self.splitter_3.setOrientation(QtCore.Qt.Horizontal) 39 | self.splitter_3.setObjectName("splitter_3") 40 | self.btnAssetCrete = QtWidgets.QPushButton(self.splitter_3) 41 | self.btnAssetCrete.setMinimumSize(QtCore.QSize(0, 35)) 42 | self.btnAssetCrete.setObjectName("btnAssetCrete") 43 | self.btnAssetOpen = QtWidgets.QPushButton(self.splitter_3) 44 | self.btnAssetOpen.setMinimumSize(QtCore.QSize(0, 35)) 45 | self.btnAssetOpen.setObjectName("btnAssetOpen") 46 | self.verticalLayout.addWidget(self.splitter_3) 47 | 48 | self.retranslateUi(AssetManager) 49 | QtCore.QMetaObject.connectSlotsByName(AssetManager) 50 | 51 | def retranslateUi(self, AssetManager): 52 | AssetManager.setWindowTitle(QtWidgets.QApplication.translate("AssetManager", "Asset Managet", None, -1)) 53 | self.label_3.setText(QtWidgets.QApplication.translate("AssetManager", "Filter Asset Type:", None, -1)) 54 | self.label_2.setText(QtWidgets.QApplication.translate("AssetManager", "Asset Name:", None, -1)) 55 | self.btnAssetCrete.setText(QtWidgets.QApplication.translate("AssetManager", "Create Asset Scene", None, -1)) 56 | self.btnAssetOpen.setText(QtWidgets.QApplication.translate("AssetManager", "Open Asset Scene", None, -1)) 57 | 58 | -------------------------------------------------------------------------------- /Eve/tools/houdini/ui/ui_asset_manager.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AssetManager 4 | 5 | 6 | 7 | 0 8 | 0 9 | 351 10 | 105 11 | 12 | 13 | 14 | Asset Managet 15 | 16 | 17 | 18 | 19 | 20 | Qt::Horizontal 21 | 22 | 23 | 24 | 25 | 100 26 | 16777215 27 | 28 | 29 | 30 | Filter Asset Type: 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | Qt::Horizontal 40 | 41 | 42 | 43 | 44 | 100 45 | 16777215 46 | 47 | 48 | 49 | Asset Name: 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Qt::Horizontal 59 | 60 | 61 | 62 | 63 | 0 64 | 35 65 | 66 | 67 | 68 | Create Asset Scene 69 | 70 | 71 | 72 | 73 | 74 | 0 75 | 35 76 | 77 | 78 | 79 | Open Asset Scene 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Eve/tools/houdini/ui/ui_shot_manager.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\houdini\ui\ui_shot_manager.ui', 4 | # licensing of 'E:\Eve\Eve\tools\houdini\ui\ui_shot_manager.ui' applies. 5 | # 6 | # Created: Mon Jun 15 16:18:03 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_ShotManager(object): 14 | def setupUi(self, ShotManager): 15 | ShotManager.setObjectName("ShotManager") 16 | ShotManager.resize(360, 187) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(ShotManager) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.splitter = QtWidgets.QSplitter(ShotManager) 20 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 21 | self.splitter.setObjectName("splitter") 22 | self.label = QtWidgets.QLabel(self.splitter) 23 | self.label.setMaximumSize(QtCore.QSize(100, 16777215)) 24 | self.label.setObjectName("label") 25 | self.boxSequence = QtWidgets.QComboBox(self.splitter) 26 | self.boxSequence.setObjectName("boxSequence") 27 | self.boxShot = QtWidgets.QComboBox(self.splitter) 28 | self.boxShot.setObjectName("boxShot") 29 | self.verticalLayout.addWidget(self.splitter) 30 | self.splitter_3 = QtWidgets.QSplitter(ShotManager) 31 | self.splitter_3.setOrientation(QtCore.Qt.Horizontal) 32 | self.splitter_3.setObjectName("splitter_3") 33 | self.btnCreateRenderScene = QtWidgets.QPushButton(self.splitter_3) 34 | self.btnCreateRenderScene.setMinimumSize(QtCore.QSize(0, 35)) 35 | self.btnCreateRenderScene.setObjectName("btnCreateRenderScene") 36 | self.btnOpenRenderScene = QtWidgets.QPushButton(self.splitter_3) 37 | self.btnOpenRenderScene.setMinimumSize(QtCore.QSize(0, 35)) 38 | self.btnOpenRenderScene.setObjectName("btnOpenRenderScene") 39 | self.verticalLayout.addWidget(self.splitter_3) 40 | self.splitter_2 = QtWidgets.QSplitter(ShotManager) 41 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 42 | self.splitter_2.setObjectName("splitter_2") 43 | self.btnCreateAnimationScene = QtWidgets.QPushButton(self.splitter_2) 44 | self.btnCreateAnimationScene.setMinimumSize(QtCore.QSize(0, 35)) 45 | self.btnCreateAnimationScene.setObjectName("btnCreateAnimationScene") 46 | self.btnOpenAnimationScene = QtWidgets.QPushButton(self.splitter_2) 47 | self.btnOpenAnimationScene.setMinimumSize(QtCore.QSize(0, 35)) 48 | self.btnOpenAnimationScene.setObjectName("btnOpenAnimationScene") 49 | self.verticalLayout.addWidget(self.splitter_2) 50 | self.pushButton = QtWidgets.QPushButton(ShotManager) 51 | self.pushButton.setMinimumSize(QtCore.QSize(0, 45)) 52 | self.pushButton.setObjectName("pushButton") 53 | self.verticalLayout.addWidget(self.pushButton) 54 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 55 | self.verticalLayout.addItem(spacerItem) 56 | 57 | self.retranslateUi(ShotManager) 58 | QtCore.QMetaObject.connectSlotsByName(ShotManager) 59 | 60 | def retranslateUi(self, ShotManager): 61 | ShotManager.setWindowTitle(QtWidgets.QApplication.translate("ShotManager", "Shot Manager", None, -1)) 62 | self.label.setText(QtWidgets.QApplication.translate("ShotManager", "Sequence : Shot", None, -1)) 63 | self.btnCreateRenderScene.setText(QtWidgets.QApplication.translate("ShotManager", "Create Render Scene", None, -1)) 64 | self.btnOpenRenderScene.setText(QtWidgets.QApplication.translate("ShotManager", "Open Render Scene", None, -1)) 65 | self.btnCreateAnimationScene.setText(QtWidgets.QApplication.translate("ShotManager", "Create Animation Scene", None, -1)) 66 | self.btnOpenAnimationScene.setText(QtWidgets.QApplication.translate("ShotManager", "Open Animation Scene", None, -1)) 67 | self.pushButton.setText(QtWidgets.QApplication.translate("ShotManager", "Publish Current Scene", None, -1)) 68 | 69 | -------------------------------------------------------------------------------- /Eve/tools/houdini/ui/ui_shot_manager.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ShotManager 4 | 5 | 6 | 7 | 0 8 | 0 9 | 363 10 | 208 11 | 12 | 13 | 14 | Shot Manager 15 | 16 | 17 | 18 | 19 | 20 | Qt::Horizontal 21 | 22 | 23 | 24 | 25 | 100 26 | 16777215 27 | 28 | 29 | 30 | Sequence : Shot 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Qt::Horizontal 41 | 42 | 43 | 44 | 45 | 46 | 47 | Qt::Horizontal 48 | 49 | 50 | 51 | 52 | 0 53 | 35 54 | 55 | 56 | 57 | Create Render Scene 58 | 59 | 60 | 61 | 62 | 63 | 0 64 | 35 65 | 66 | 67 | 68 | Open Render Scene 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | Qt::Horizontal 77 | 78 | 79 | 80 | 81 | 82 | 83 | Qt::Horizontal 84 | 85 | 86 | 87 | 88 | 0 89 | 35 90 | 91 | 92 | 93 | Create Animation Scene 94 | 95 | 96 | 97 | 98 | 99 | 0 100 | 35 101 | 102 | 103 | 104 | Open Animation Scene 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | Qt::Horizontal 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 0 121 | 45 122 | 123 | 124 | 125 | Publish Current Scene 126 | 127 | 128 | 129 | 130 | 131 | 132 | Qt::Vertical 133 | 134 | 135 | 136 | 20 137 | 40 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /Eve/tools/houdini/vex/library.h: -------------------------------------------------------------------------------- 1 | void hello(){ 2 | printf('Hello, Eve!\n'); 3 | } 4 | 5 | // Create array from point positions (Detail mode) 6 | function vector[] get_point_positions(){ 7 | vector points[]; 8 | for(int i=0; i build_index(key); 54 | this.data[index] = value; 55 | } 56 | 57 | float get_item(string key){ 58 | // Get item from array by position 59 | int index = this -> build_index(key); 60 | float value = this.data[index]; 61 | 62 | return value; 63 | } 64 | } 65 | 66 | -------------------------------------------------------------------------------- /Eve/tools/pm/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/__init__.py -------------------------------------------------------------------------------- /Eve/tools/pm/houdini_launcher.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | 4 | 5 | def combine_paths(list_paths): 6 | """ 7 | Combine paths string from list of paths 8 | :param list_paths: list of sub folders in processed folder 9 | """ 10 | 11 | filter_folders = ['backup'] 12 | path_HDA = '' 13 | 14 | for folder in list_paths: 15 | path = folder[0].replace('\\', '/') 16 | # Filter unnecessary folders 17 | if not path.split('/')[-1] in filter_folders: 18 | path_HDA += '{};'.format(folder[0].replace('\\', '/')) 19 | 20 | return path_HDA 21 | 22 | 23 | def get_hda_path(root_3d): 24 | """ 25 | Build HOUDINI_OTLSCAN_PATH env variable value: 26 | Get all subfolders of HDA location dirs (hda and lib/materials) and combine to one string 27 | Used by Houdini to search for HDA (Houdini Digital Assets) 28 | """ 29 | 30 | # Get list of sub folders 31 | list_paths_HDA = os.walk('{0}/hda'.format(root_3d)) # HDA 32 | # list_paths_MTL = os.walk('{0}/lib/MATERIALS'.format(root3D)) # Material library 33 | # list_paths_LIT = os.walk('{0}/lib/LIGHTS'.format(root3D)) # Light library 34 | 35 | # Global HDA library path (WIP! TBD!) 36 | list_paths_LIB = os.walk('') # Global HDA (between projects) 37 | 38 | # Combine paths to a string 39 | path_HDA = combine_paths(list_paths_HDA) 40 | # combine_paths(list_paths_MTL) 41 | # combine_paths(list_paths_LIT) 42 | # combine_paths(list_paths_LIB) 43 | 44 | # Add Houdini standard OTLs 45 | path_HDA = path_HDA + '&' 46 | 47 | return path_HDA 48 | 49 | 50 | def run_houdini(eve_root, projects_root, HOUDINI, project_name, script=None, id=None): 51 | """ 52 | Launch Houdini within project environment 53 | 54 | :param eve_root: {E:/Eve/Eve} 55 | :param projects_root: (E:/256/PROJECTS) 56 | :param HOUDINI: (C:/Program Files/Side Effects Software/Houdini 18.0.460/bin/houdinifx.exe) 57 | :param project_name: (Inception) 58 | 59 | Rem 60 | # ACES (Download from imageworks github OpenColorIO-Confih repo) 61 | # os.environ['OCIO'] = '{}/OCIO/Aces1.0.3/config.ocio'.format(eve_root) 62 | # os.environ['OCIO'] = "D:/256/OpenColorIO/aces_1.0.3/config.ocio" 63 | 64 | # Rebelway ML course 65 | py3_libs = 'C:/Users/kko8/AppData/Local/Programs/Python/Python310/Lib/site-packages' 66 | ubuntu_libs = "//wsl.localhost/Ubuntu/home/kiryha/miniconda3/envs/houdini/lib/python3.10/site-packages" 67 | os.environ['PYTHONPATH'] = os.pathsep.join([os.environ['PYTHONPATH'], py3_libs]) 68 | 69 | # Icons 70 | # os.environ['HOUDINI_UI_ICON_PATH'] = '{}/EVE/icons'.format(rootPipeline) 71 | # Houdini current user pref folder in MyDocuments (win) 72 | # os.environ['home'] = '{}/Documents/houdiniUserPrefs'.format(os.path.expanduser("~")) 73 | 74 | # Setup Redshift 75 | # os.environ['HOUDINI_DSO_ERROR'] = '2' 76 | # os.environ['PATH'] += ';' + 'C:/ProgramData/Redshift/bin;$PATH' 77 | path = 'C:/ProgramData/Redshift/Plugins/Houdini/{0};{1}'.format(build, os.environ['HOUDINI_PATH'] 78 | # os.environ['HOUDINI_PATH'] = path) 79 | """ 80 | 81 | # SETUP PROJECT ENVIRONMENT 82 | root_3d = '{0}/{1}/PROD/3D'.format(projects_root, project_name) 83 | project_root = '{0}/{1}'.format(projects_root, project_name) 84 | 85 | # Eve location ('E:/Eve') 86 | os.environ['EVE_ROOT'] = '{0}'.format(eve_root) 87 | # Project Root folder ('E:/projects/') 88 | os.environ['EVE_PROJECT'] = project_root 89 | # Project Name 90 | os.environ['EVE_PROJECT_NAME'] = '{0}'.format(project_name) 91 | # Root of houdini project 92 | os.environ['JOB'] = root_3d 93 | # Houdini digital assets folder including sub folders 94 | os.environ['HOUDINI_OTLSCAN_PATH'] = get_hda_path(root_3d) 95 | # Houdini path 96 | os.environ['HOUDINI_PATH'] = '{0}/tools/houdini/settings;&'.format(eve_root) 97 | # Custom vex modules 98 | os.environ['HOUDINI_VEX_PATH'] = '{0}/tools/houdini/vex;&'.format(eve_root) 99 | # Path to custom python tools 100 | os.environ['PYTHONPATH'] = '{0}/tools'.format(eve_root) # from houdini import create_asset 101 | shape_grammar_module = f'{eve_root}/lib/python/shape_grammar/' 102 | # shape_grammar_module = f'{project_root}/prod/3d/lib/python/' 103 | os.environ['PYTHONPATH'] = os.pathsep.join([os.environ['PYTHONPATH'], shape_grammar_module]) 104 | # ACES 105 | os.environ['OCIO'] = "C:/Users/kko8/OneDrive/projects/aces_1.0.3/config.ocio" 106 | 107 | if script: 108 | # command = ['C:/temp/asset.hipnc'], ['C:/temp/script.py'], 'AAA', 'BBB' 109 | # command = ['C:/temp/script.py'], 'AAA', 'BBB' 110 | subprocess.Popen([HOUDINI, [script], str(id)]) 111 | else: 112 | subprocess.Popen(HOUDINI) 113 | 114 | # Prevent closing CMD window 115 | # raw_input() 116 | -------------------------------------------------------------------------------- /Eve/tools/pm/icons/icon_PM_A.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/icons/icon_PM_A.ico -------------------------------------------------------------------------------- /Eve/tools/pm/icons/icon_PM_B.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/icons/icon_PM_B.ico -------------------------------------------------------------------------------- /Eve/tools/pm/icons/icon_PM_C.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/icons/icon_PM_C.ico -------------------------------------------------------------------------------- /Eve/tools/pm/icons/icon_PM_D.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/icons/icon_PM_D.ico -------------------------------------------------------------------------------- /Eve/tools/pm/ui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiryha/Houdini/302a72925a87bb062e242aebe72ba947a14b697f/Eve/tools/pm/ui/__init__.py -------------------------------------------------------------------------------- /Eve/tools/pm/ui/_compile_ui.bat: -------------------------------------------------------------------------------- 1 | set UIFILE=%1 2 | set UIDIR=%~dp$PATH:1 3 | set FILENAME=%~n1 4 | set SNAME=%UIDIR%%FILENAME%.py 5 | 6 | CALL E:\Projects\Python27\Scripts\pyside2-uic.exe %UIFILE% -o %SNAME% 7 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_asset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_asset.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_asset.ui' applies. 5 | # 6 | # Created: Fri Jun 12 14:44:19 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Asset(object): 14 | def setupUi(self, Asset): 15 | Asset.setObjectName("Asset") 16 | Asset.resize(367, 274) 17 | self.shotLayout = QtWidgets.QVBoxLayout(Asset) 18 | self.shotLayout.setContentsMargins(0, 0, 0, 0) 19 | self.shotLayout.setObjectName("shotLayout") 20 | self.splitter_4 = QtWidgets.QSplitter(Asset) 21 | self.splitter_4.setOrientation(QtCore.Qt.Horizontal) 22 | self.splitter_4.setObjectName("splitter_4") 23 | self.label_5 = QtWidgets.QLabel(self.splitter_4) 24 | self.label_5.setMinimumSize(QtCore.QSize(120, 0)) 25 | self.label_5.setMaximumSize(QtCore.QSize(120, 16777215)) 26 | self.label_5.setObjectName("label_5") 27 | self.linProjectName = QtWidgets.QLineEdit(self.splitter_4) 28 | self.linProjectName.setEnabled(False) 29 | self.linProjectName.setAlignment(QtCore.Qt.AlignCenter) 30 | self.linProjectName.setObjectName("linProjectName") 31 | self.shotLayout.addWidget(self.splitter_4) 32 | self.splitter = QtWidgets.QSplitter(Asset) 33 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 34 | self.splitter.setObjectName("splitter") 35 | self.label = QtWidgets.QLabel(self.splitter) 36 | self.label.setMinimumSize(QtCore.QSize(120, 0)) 37 | self.label.setMaximumSize(QtCore.QSize(120, 16777215)) 38 | self.label.setObjectName("label") 39 | self.linAssetName = QtWidgets.QLineEdit(self.splitter) 40 | self.linAssetName.setAlignment(QtCore.Qt.AlignCenter) 41 | self.linAssetName.setObjectName("linAssetName") 42 | self.shotLayout.addWidget(self.splitter) 43 | self.splitter_2 = QtWidgets.QSplitter(Asset) 44 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 45 | self.splitter_2.setObjectName("splitter_2") 46 | self.label_4 = QtWidgets.QLabel(self.splitter_2) 47 | self.label_4.setMinimumSize(QtCore.QSize(120, 0)) 48 | self.label_4.setMaximumSize(QtCore.QSize(120, 16777215)) 49 | self.label_4.setObjectName("label_4") 50 | self.comAssetType = QtWidgets.QComboBox(self.splitter_2) 51 | self.comAssetType.setObjectName("comAssetType") 52 | self.shotLayout.addWidget(self.splitter_2) 53 | self.splitter_5 = QtWidgets.QSplitter(Asset) 54 | self.splitter_5.setOrientation(QtCore.Qt.Horizontal) 55 | self.splitter_5.setObjectName("splitter_5") 56 | self.label_6 = QtWidgets.QLabel(self.splitter_5) 57 | self.label_6.setMinimumSize(QtCore.QSize(120, 0)) 58 | self.label_6.setMaximumSize(QtCore.QSize(120, 16777215)) 59 | self.label_6.setObjectName("label_6") 60 | self.linAssetPublish = QtWidgets.QLineEdit(self.splitter_5) 61 | self.linAssetPublish.setEnabled(False) 62 | self.linAssetPublish.setAlignment(QtCore.Qt.AlignCenter) 63 | self.linAssetPublish.setObjectName("linAssetPublish") 64 | self.shotLayout.addWidget(self.splitter_5) 65 | self.pushButton = QtWidgets.QPushButton(Asset) 66 | self.pushButton.setObjectName("pushButton") 67 | self.shotLayout.addWidget(self.pushButton) 68 | self.label_2 = QtWidgets.QLabel(Asset) 69 | self.label_2.setObjectName("label_2") 70 | self.shotLayout.addWidget(self.label_2) 71 | self.txtDescription = QtWidgets.QTextEdit(Asset) 72 | self.txtDescription.setMaximumSize(QtCore.QSize(16777215, 100)) 73 | self.txtDescription.setObjectName("txtDescription") 74 | self.shotLayout.addWidget(self.txtDescription) 75 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 76 | self.shotLayout.addItem(spacerItem) 77 | 78 | self.retranslateUi(Asset) 79 | QtCore.QMetaObject.connectSlotsByName(Asset) 80 | 81 | def retranslateUi(self, Asset): 82 | Asset.setWindowTitle(QtWidgets.QApplication.translate("Asset", "Asset", None, -1)) 83 | self.label_5.setText(QtWidgets.QApplication.translate("Asset", "Project Name", None, -1)) 84 | self.label.setText(QtWidgets.QApplication.translate("Asset", "Asset Name", None, -1)) 85 | self.label_4.setText(QtWidgets.QApplication.translate("Asset", "Asset Type", None, -1)) 86 | self.label_6.setText(QtWidgets.QApplication.translate("Asset", "Published Version", None, -1)) 87 | self.pushButton.setText(QtWidgets.QApplication.translate("Asset", "Asset Configuration Manager", None, -1)) 88 | self.label_2.setText(QtWidgets.QApplication.translate("Asset", "Asset Description:", None, -1)) 89 | 90 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_asset.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Asset 4 | 5 | 6 | 7 | 0 8 | 0 9 | 367 10 | 274 11 | 12 | 13 | 14 | Asset 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | Qt::Horizontal 24 | 25 | 26 | 27 | 28 | 120 29 | 0 30 | 31 | 32 | 33 | 34 | 120 35 | 16777215 36 | 37 | 38 | 39 | Project Name 40 | 41 | 42 | 43 | 44 | false 45 | 46 | 47 | Qt::AlignCenter 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | Qt::Horizontal 56 | 57 | 58 | 59 | 60 | 120 61 | 0 62 | 63 | 64 | 65 | 66 | 120 67 | 16777215 68 | 69 | 70 | 71 | Asset Name 72 | 73 | 74 | 75 | 76 | Qt::AlignCenter 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Qt::Horizontal 85 | 86 | 87 | 88 | 89 | 120 90 | 0 91 | 92 | 93 | 94 | 95 | 120 96 | 16777215 97 | 98 | 99 | 100 | Asset Type 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | Qt::Horizontal 110 | 111 | 112 | 113 | 114 | 120 115 | 0 116 | 117 | 118 | 119 | 120 | 120 121 | 16777215 122 | 123 | 124 | 125 | Published Version 126 | 127 | 128 | 129 | 130 | false 131 | 132 | 133 | Qt::AlignCenter 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 0 143 | 35 144 | 145 | 146 | 147 | Asset Configuration Manager 148 | 149 | 150 | 151 | 152 | 153 | 154 | Asset Description: 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 16777215 163 | 100 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | Qt::Vertical 172 | 173 | 174 | 175 | 20 176 | 40 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_asset_properties.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_asset_properties.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_asset_properties.ui' applies. 5 | # 6 | # Created: Thu Feb 06 13:35:38 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AssetProperties(object): 14 | def setupUi(self, AssetProperties): 15 | AssetProperties.setObjectName("AssetProperties") 16 | AssetProperties.resize(369, 101) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AssetProperties) 18 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 19 | self.verticalLayout.setObjectName("verticalLayout") 20 | self.layoutAsset = QtWidgets.QVBoxLayout() 21 | self.layoutAsset.setObjectName("layoutAsset") 22 | self.verticalLayout.addLayout(self.layoutAsset) 23 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 24 | self.verticalLayout.addItem(spacerItem) 25 | self.btnUpdateAsset = QtWidgets.QPushButton(AssetProperties) 26 | self.btnUpdateAsset.setMinimumSize(QtCore.QSize(0, 45)) 27 | self.btnUpdateAsset.setObjectName("btnUpdateAsset") 28 | self.verticalLayout.addWidget(self.btnUpdateAsset) 29 | self.splitter_5 = QtWidgets.QSplitter(AssetProperties) 30 | self.splitter_5.setOrientation(QtCore.Qt.Horizontal) 31 | self.splitter_5.setObjectName("splitter_5") 32 | self.btnCreateHoudiniFile = QtWidgets.QPushButton(self.splitter_5) 33 | self.btnCreateHoudiniFile.setObjectName("btnCreateHoudiniFile") 34 | self.btnOpenHoudiniFile = QtWidgets.QPushButton(self.splitter_5) 35 | self.btnOpenHoudiniFile.setObjectName("btnOpenHoudiniFile") 36 | self.verticalLayout.addWidget(self.splitter_5) 37 | 38 | self.retranslateUi(AssetProperties) 39 | QtCore.QMetaObject.connectSlotsByName(AssetProperties) 40 | 41 | def retranslateUi(self, AssetProperties): 42 | AssetProperties.setWindowTitle(QtWidgets.QApplication.translate("AssetProperties", "Form", None, -1)) 43 | self.btnUpdateAsset.setText(QtWidgets.QApplication.translate("AssetProperties", "Update Asset Data", None, -1)) 44 | self.btnCreateHoudiniFile.setText(QtWidgets.QApplication.translate("AssetProperties", "Create Houdini Scene", None, -1)) 45 | self.btnOpenHoudiniFile.setText(QtWidgets.QApplication.translate("AssetProperties", "Open Houdini Scene", None, -1)) 46 | 47 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_asset_properties.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AssetProperties 4 | 5 | 6 | 7 | 0 8 | 0 9 | 369 10 | 101 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Qt::Vertical 27 | 28 | 29 | 30 | 20 31 | 40 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 45 42 | 43 | 44 | 45 | Update Asset Data 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::Horizontal 53 | 54 | 55 | 56 | Create Houdini Scene 57 | 58 | 59 | 60 | 61 | Open Houdini Scene 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_link_assets.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_link_assets.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_link_assets.ui' applies. 5 | # 6 | # Created: Thu Feb 06 09:09:33 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_LinkAssets(object): 14 | def setupUi(self, LinkAssets): 15 | LinkAssets.setObjectName("LinkAssets") 16 | LinkAssets.resize(241, 358) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(LinkAssets) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.splitter = QtWidgets.QSplitter(LinkAssets) 20 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 21 | self.splitter.setObjectName("splitter") 22 | self.label = QtWidgets.QLabel(self.splitter) 23 | self.label.setMinimumSize(QtCore.QSize(60, 0)) 24 | self.label.setMaximumSize(QtCore.QSize(85, 16777215)) 25 | self.label.setObjectName("label") 26 | self.linShotName = QtWidgets.QLineEdit(self.splitter) 27 | self.linShotName.setEnabled(False) 28 | self.linShotName.setAlignment(QtCore.Qt.AlignCenter) 29 | self.linShotName.setObjectName("linShotName") 30 | self.verticalLayout.addWidget(self.splitter) 31 | self.listAssets = QtWidgets.QListView(LinkAssets) 32 | self.listAssets.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) 33 | self.listAssets.setObjectName("listAssets") 34 | self.verticalLayout.addWidget(self.listAssets) 35 | self.btnLinkAssets = QtWidgets.QPushButton(LinkAssets) 36 | self.btnLinkAssets.setMinimumSize(QtCore.QSize(0, 40)) 37 | self.btnLinkAssets.setObjectName("btnLinkAssets") 38 | self.verticalLayout.addWidget(self.btnLinkAssets) 39 | 40 | self.retranslateUi(LinkAssets) 41 | QtCore.QMetaObject.connectSlotsByName(LinkAssets) 42 | 43 | def retranslateUi(self, LinkAssets): 44 | LinkAssets.setWindowTitle(QtWidgets.QApplication.translate("LinkAssets", "Link Assets", None, -1)) 45 | self.label.setText(QtWidgets.QApplication.translate("LinkAssets", "Shot Name", None, -1)) 46 | self.btnLinkAssets.setText(QtWidgets.QApplication.translate("LinkAssets", "Link Selected Assets to the Shot", None, -1)) 47 | 48 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_link_assets.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | LinkAssets 4 | 5 | 6 | 7 | 0 8 | 0 9 | 241 10 | 358 11 | 12 | 13 | 14 | Link Assets 15 | 16 | 17 | 18 | 19 | 20 | Qt::Horizontal 21 | 22 | 23 | 24 | 25 | 60 26 | 0 27 | 28 | 29 | 30 | 31 | 85 32 | 16777215 33 | 34 | 35 | 36 | Shot Name 37 | 38 | 39 | 40 | 41 | false 42 | 43 | 44 | Qt::AlignCenter 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | QAbstractItemView::ExtendedSelection 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 0 61 | 40 62 | 63 | 64 | 65 | Link Selected Assets to the Shot 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_asset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_asset.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_asset.ui' applies. 5 | # 6 | # Created: Tue Dec 24 10:19:35 2019 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AddAsset(object): 14 | def setupUi(self, AddAsset): 15 | AddAsset.setObjectName("AddAsset") 16 | AddAsset.resize(370, 89) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AddAsset) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.layoutAsset = QtWidgets.QVBoxLayout() 20 | self.layoutAsset.setObjectName("layoutAsset") 21 | self.verticalLayout.addLayout(self.layoutAsset) 22 | self.btnAddAsset = QtWidgets.QPushButton(AddAsset) 23 | self.btnAddAsset.setMinimumSize(QtCore.QSize(0, 40)) 24 | self.btnAddAsset.setObjectName("btnAddAsset") 25 | self.verticalLayout.addWidget(self.btnAddAsset) 26 | 27 | self.retranslateUi(AddAsset) 28 | QtCore.QMetaObject.connectSlotsByName(AddAsset) 29 | 30 | def retranslateUi(self, AddAsset): 31 | AddAsset.setWindowTitle(QtWidgets.QApplication.translate("AddAsset", "Add Asset", None, -1)) 32 | self.btnAddAsset.setText(QtWidgets.QApplication.translate("AddAsset", "Add Asset", None, -1)) 33 | 34 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_asset.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AddAsset 4 | 5 | 6 | 7 | 0 8 | 0 9 | 370 10 | 89 11 | 12 | 13 | 14 | Add Asset 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 0 25 | 40 26 | 27 | 28 | 29 | Add Asset 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_project.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_project.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_project.ui' applies. 5 | # 6 | # Created: Mon Dec 23 15:24:49 2019 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AddProject(object): 14 | def setupUi(self, AddProject): 15 | AddProject.setObjectName("AddProject") 16 | AddProject.resize(369, 92) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AddProject) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.layoutProject = QtWidgets.QVBoxLayout() 20 | self.layoutProject.setObjectName("layoutProject") 21 | self.verticalLayout.addLayout(self.layoutProject) 22 | self.btnAddProject = QtWidgets.QPushButton(AddProject) 23 | self.btnAddProject.setMinimumSize(QtCore.QSize(0, 40)) 24 | self.btnAddProject.setObjectName("btnAddProject") 25 | self.verticalLayout.addWidget(self.btnAddProject) 26 | 27 | self.retranslateUi(AddProject) 28 | QtCore.QMetaObject.connectSlotsByName(AddProject) 29 | 30 | def retranslateUi(self, AddProject): 31 | AddProject.setWindowTitle(QtWidgets.QApplication.translate("AddProject", "Add Project", None, -1)) 32 | self.btnAddProject.setText(QtWidgets.QApplication.translate("AddProject", "Add Project", None, -1)) 33 | 34 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_project.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AddProject 4 | 5 | 6 | 7 | 0 8 | 0 9 | 369 10 | 92 11 | 12 | 13 | 14 | Add Project 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 0 25 | 40 26 | 27 | 28 | 29 | Add Project 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_sequence.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_sequence.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_sequence.ui' applies. 5 | # 6 | # Created: Wed Feb 05 11:57:12 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AddSequence(object): 14 | def setupUi(self, AddSequence): 15 | AddSequence.setObjectName("AddSequence") 16 | AddSequence.resize(370, 89) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AddSequence) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.layoutSequence = QtWidgets.QVBoxLayout() 20 | self.layoutSequence.setObjectName("layoutSequence") 21 | self.verticalLayout.addLayout(self.layoutSequence) 22 | self.btnAddSequence = QtWidgets.QPushButton(AddSequence) 23 | self.btnAddSequence.setMinimumSize(QtCore.QSize(0, 40)) 24 | self.btnAddSequence.setObjectName("btnAddSequence") 25 | self.verticalLayout.addWidget(self.btnAddSequence) 26 | 27 | self.retranslateUi(AddSequence) 28 | QtCore.QMetaObject.connectSlotsByName(AddSequence) 29 | 30 | def retranslateUi(self, AddSequence): 31 | AddSequence.setWindowTitle(QtWidgets.QApplication.translate("AddSequence", "Add Sequence", None, -1)) 32 | self.btnAddSequence.setText(QtWidgets.QApplication.translate("AddSequence", "Add Sequence", None, -1)) 33 | 34 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_sequence.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AddSequence 4 | 5 | 6 | 7 | 0 8 | 0 9 | 370 10 | 89 11 | 12 | 13 | 14 | Add Sequence 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 0 25 | 40 26 | 27 | 28 | 29 | Add Sequence 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_shot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_shot.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_pm_add_shot.ui' applies. 5 | # 6 | # Created: Tue Dec 24 10:46:21 2019 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_AddShot(object): 14 | def setupUi(self, AddShot): 15 | AddShot.setObjectName("AddShot") 16 | AddShot.resize(370, 89) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(AddShot) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.layoutShot = QtWidgets.QVBoxLayout() 20 | self.layoutShot.setObjectName("layoutShot") 21 | self.verticalLayout.addLayout(self.layoutShot) 22 | self.btnAddShot = QtWidgets.QPushButton(AddShot) 23 | self.btnAddShot.setMinimumSize(QtCore.QSize(0, 40)) 24 | self.btnAddShot.setObjectName("btnAddShot") 25 | self.verticalLayout.addWidget(self.btnAddShot) 26 | 27 | self.retranslateUi(AddShot) 28 | QtCore.QMetaObject.connectSlotsByName(AddShot) 29 | 30 | def retranslateUi(self, AddShot): 31 | AddShot.setWindowTitle(QtWidgets.QApplication.translate("AddShot", "Add Shot", None, -1)) 32 | self.btnAddShot.setText(QtWidgets.QApplication.translate("AddShot", "Add Shot", None, -1)) 33 | 34 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_add_shot.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AddShot 4 | 5 | 6 | 7 | 0 8 | 0 9 | 370 10 | 89 11 | 12 | 13 | 14 | Add Shot 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 0 25 | 40 26 | 27 | 28 | 29 | Add Shot 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'H:\@transfer_vdi_pc\_EVE\ui_pm_main.ui', 4 | # licensing of 'H:\@transfer_vdi_pc\_EVE\ui_pm_main.ui' applies. 5 | # 6 | # Created: Tue Nov 22 18:33:14 2022 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_ProjectManager(object): 14 | def setupUi(self, ProjectManager): 15 | ProjectManager.setObjectName("ProjectManager") 16 | ProjectManager.resize(1107, 890) 17 | self.centralwidget = QtWidgets.QWidget(ProjectManager) 18 | self.centralwidget.setObjectName("centralwidget") 19 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) 20 | self.horizontalLayout.setObjectName("horizontalLayout") 21 | self.boxProjects = QtWidgets.QGroupBox(self.centralwidget) 22 | self.boxProjects.setMaximumSize(QtCore.QSize(150, 16777215)) 23 | self.boxProjects.setObjectName("boxProjects") 24 | self.verticalLayout = QtWidgets.QVBoxLayout(self.boxProjects) 25 | self.verticalLayout.setObjectName("verticalLayout") 26 | self.listProjects = QtWidgets.QListView(self.boxProjects) 27 | self.listProjects.setObjectName("listProjects") 28 | self.verticalLayout.addWidget(self.listProjects) 29 | self.splitter = QtWidgets.QSplitter(self.boxProjects) 30 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 31 | self.splitter.setObjectName("splitter") 32 | self.btnAddProject = QtWidgets.QPushButton(self.splitter) 33 | self.btnAddProject.setObjectName("btnAddProject") 34 | self.btnDelProject = QtWidgets.QPushButton(self.splitter) 35 | self.btnDelProject.setObjectName("btnDelProject") 36 | self.verticalLayout.addWidget(self.splitter) 37 | self.horizontalLayout.addWidget(self.boxProjects) 38 | self.groupBox = QtWidgets.QGroupBox(self.centralwidget) 39 | self.groupBox.setMaximumSize(QtCore.QSize(150, 16777215)) 40 | self.groupBox.setObjectName("groupBox") 41 | self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox) 42 | self.verticalLayout_4.setObjectName("verticalLayout_4") 43 | self.listAssets = QtWidgets.QListView(self.groupBox) 44 | self.listAssets.setObjectName("listAssets") 45 | self.verticalLayout_4.addWidget(self.listAssets) 46 | self.splitter_2 = QtWidgets.QSplitter(self.groupBox) 47 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 48 | self.splitter_2.setObjectName("splitter_2") 49 | self.btnAddAsset = QtWidgets.QPushButton(self.splitter_2) 50 | self.btnAddAsset.setObjectName("btnAddAsset") 51 | self.btnDelAsset = QtWidgets.QPushButton(self.splitter_2) 52 | self.btnDelAsset.setObjectName("btnDelAsset") 53 | self.verticalLayout_4.addWidget(self.splitter_2) 54 | self.horizontalLayout.addWidget(self.groupBox) 55 | self.boxASS = QtWidgets.QGroupBox(self.centralwidget) 56 | self.boxASS.setMaximumSize(QtCore.QSize(150, 16777215)) 57 | self.boxASS.setObjectName("boxASS") 58 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.boxASS) 59 | self.verticalLayout_2.setObjectName("verticalLayout_2") 60 | self.listSequences = QtWidgets.QListView(self.boxASS) 61 | self.listSequences.setObjectName("listSequences") 62 | self.verticalLayout_2.addWidget(self.listSequences) 63 | self.splitter_3 = QtWidgets.QSplitter(self.boxASS) 64 | self.splitter_3.setOrientation(QtCore.Qt.Horizontal) 65 | self.splitter_3.setObjectName("splitter_3") 66 | self.btnAddSequence = QtWidgets.QPushButton(self.splitter_3) 67 | self.btnAddSequence.setObjectName("btnAddSequence") 68 | self.btnDelSequence = QtWidgets.QPushButton(self.splitter_3) 69 | self.btnDelSequence.setObjectName("btnDelSequence") 70 | self.verticalLayout_2.addWidget(self.splitter_3) 71 | self.listShots = QtWidgets.QListView(self.boxASS) 72 | self.listShots.setObjectName("listShots") 73 | self.verticalLayout_2.addWidget(self.listShots) 74 | self.splitter_4 = QtWidgets.QSplitter(self.boxASS) 75 | self.splitter_4.setOrientation(QtCore.Qt.Horizontal) 76 | self.splitter_4.setObjectName("splitter_4") 77 | self.btnAddShot = QtWidgets.QPushButton(self.splitter_4) 78 | self.btnAddShot.setObjectName("btnAddShot") 79 | self.btnDelShot = QtWidgets.QPushButton(self.splitter_4) 80 | self.btnDelShot.setObjectName("btnDelShot") 81 | self.verticalLayout_2.addWidget(self.splitter_4) 82 | self.horizontalLayout.addWidget(self.boxASS) 83 | self.boxProperties = QtWidgets.QGroupBox(self.centralwidget) 84 | self.boxProperties.setMinimumSize(QtCore.QSize(500, 0)) 85 | self.boxProperties.setMaximumSize(QtCore.QSize(500, 16777215)) 86 | self.boxProperties.setObjectName("boxProperties") 87 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.boxProperties) 88 | self.verticalLayout_3.setObjectName("verticalLayout_3") 89 | self.layoutProperties = QtWidgets.QVBoxLayout() 90 | self.layoutProperties.setObjectName("layoutProperties") 91 | self.verticalLayout_3.addLayout(self.layoutProperties) 92 | self.horizontalLayout.addWidget(self.boxProperties) 93 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 94 | self.horizontalLayout.addItem(spacerItem) 95 | ProjectManager.setCentralWidget(self.centralwidget) 96 | self.menubar = QtWidgets.QMenuBar(ProjectManager) 97 | self.menubar.setGeometry(QtCore.QRect(0, 0, 1107, 21)) 98 | self.menubar.setObjectName("menubar") 99 | self.menuHelp = QtWidgets.QMenu(self.menubar) 100 | self.menuHelp.setObjectName("menuHelp") 101 | self.menuEve = QtWidgets.QMenu(self.menubar) 102 | self.menuEve.setObjectName("menuEve") 103 | ProjectManager.setMenuBar(self.menubar) 104 | self.statusbar = QtWidgets.QStatusBar(ProjectManager) 105 | self.statusbar.setObjectName("statusbar") 106 | ProjectManager.setStatusBar(self.statusbar) 107 | self.actionEveDocs = QtWidgets.QAction(ProjectManager) 108 | self.actionEveDocs.setObjectName("actionEveDocs") 109 | self.actionSettings = QtWidgets.QAction(ProjectManager) 110 | self.actionSettings.setObjectName("actionSettings") 111 | self.actionCreateDatabase = QtWidgets.QAction(ProjectManager) 112 | self.actionCreateDatabase.setObjectName("actionCreateDatabase") 113 | self.menuHelp.addAction(self.actionEveDocs) 114 | self.menuEve.addAction(self.actionSettings) 115 | self.menubar.addAction(self.menuEve.menuAction()) 116 | self.menubar.addAction(self.menuHelp.menuAction()) 117 | 118 | self.retranslateUi(ProjectManager) 119 | QtCore.QMetaObject.connectSlotsByName(ProjectManager) 120 | 121 | def retranslateUi(self, ProjectManager): 122 | ProjectManager.setWindowTitle(QtWidgets.QApplication.translate("ProjectManager", "Eve Project Manager", None, -1)) 123 | self.boxProjects.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Projects", None, -1)) 124 | self.btnAddProject.setText(QtWidgets.QApplication.translate("ProjectManager", "+", None, -1)) 125 | self.btnDelProject.setText(QtWidgets.QApplication.translate("ProjectManager", "-", None, -1)) 126 | self.groupBox.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Assets", None, -1)) 127 | self.btnAddAsset.setText(QtWidgets.QApplication.translate("ProjectManager", "+", None, -1)) 128 | self.btnDelAsset.setText(QtWidgets.QApplication.translate("ProjectManager", "-", None, -1)) 129 | self.boxASS.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Sequences | Shots", None, -1)) 130 | self.btnAddSequence.setText(QtWidgets.QApplication.translate("ProjectManager", "+", None, -1)) 131 | self.btnDelSequence.setText(QtWidgets.QApplication.translate("ProjectManager", "-", None, -1)) 132 | self.btnAddShot.setText(QtWidgets.QApplication.translate("ProjectManager", "+", None, -1)) 133 | self.btnDelShot.setText(QtWidgets.QApplication.translate("ProjectManager", "-", None, -1)) 134 | self.boxProperties.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Properties", None, -1)) 135 | self.menuHelp.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Help", None, -1)) 136 | self.menuEve.setTitle(QtWidgets.QApplication.translate("ProjectManager", "Eve", None, -1)) 137 | self.actionEveDocs.setText(QtWidgets.QApplication.translate("ProjectManager", "Eve Documentation", None, -1)) 138 | self.actionSettings.setText(QtWidgets.QApplication.translate("ProjectManager", "Settings", None, -1)) 139 | self.actionCreateDatabase.setText(QtWidgets.QApplication.translate("ProjectManager", "Create Database", None, -1)) 140 | 141 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_main.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ProjectManager 4 | 5 | 6 | 7 | 0 8 | 0 9 | 1107 10 | 890 11 | 12 | 13 | 14 | Eve Project Manager 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 150 23 | 16777215 24 | 25 | 26 | 27 | Projects 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Qt::Horizontal 37 | 38 | 39 | 40 | + 41 | 42 | 43 | 44 | 45 | - 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 150 58 | 16777215 59 | 60 | 61 | 62 | Assets 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | Qt::Horizontal 72 | 73 | 74 | 75 | + 76 | 77 | 78 | 79 | 80 | - 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 150 93 | 16777215 94 | 95 | 96 | 97 | Sequences | Shots 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | Qt::Horizontal 107 | 108 | 109 | 110 | + 111 | 112 | 113 | 114 | 115 | - 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | Qt::Horizontal 127 | 128 | 129 | 130 | + 131 | 132 | 133 | 134 | 135 | - 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 500 148 | 0 149 | 150 | 151 | 152 | 153 | 500 154 | 16777215 155 | 156 | 157 | 158 | Properties 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | Qt::Horizontal 171 | 172 | 173 | 174 | 40 175 | 20 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 0 186 | 0 187 | 1107 188 | 21 189 | 190 | 191 | 192 | 193 | Help 194 | 195 | 196 | 197 | 198 | 199 | Eve 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | Eve Documentation 210 | 211 | 212 | 213 | 214 | Settings 215 | 216 | 217 | 218 | 219 | Create Database 220 | 221 | 222 | 223 | 224 | 225 | 226 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_warning.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_pm_warning.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_pm_warning.ui' applies. 5 | # 6 | # Created: Tue Feb 04 14:38:59 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Warning(object): 14 | def setupUi(self, Warning): 15 | Warning.setObjectName("Warning") 16 | Warning.resize(347, 60) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(Warning) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.labWarning = QtWidgets.QLabel(Warning) 20 | self.labWarning.setAlignment(QtCore.Qt.AlignCenter) 21 | self.labWarning.setObjectName("labWarning") 22 | self.verticalLayout.addWidget(self.labWarning) 23 | self.buttonBox = QtWidgets.QDialogButtonBox(Warning) 24 | self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 25 | self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Yes) 26 | self.buttonBox.setCenterButtons(True) 27 | self.buttonBox.setObjectName("buttonBox") 28 | self.verticalLayout.addWidget(self.buttonBox) 29 | 30 | self.retranslateUi(Warning) 31 | QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Warning.accept) 32 | QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Warning.reject) 33 | QtCore.QMetaObject.connectSlotsByName(Warning) 34 | 35 | def retranslateUi(self, Warning): 36 | Warning.setWindowTitle(QtWidgets.QApplication.translate("Warning", "Warning", None, -1)) 37 | self.labWarning.setText(QtWidgets.QApplication.translate("Warning", "TextLabel", None, -1)) 38 | 39 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_pm_warning.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Warning 4 | 5 | 6 | 7 | 0 8 | 0 9 | 347 10 | 60 11 | 12 | 13 | 14 | Warning 15 | 16 | 17 | 18 | 19 | 20 | TextLabel 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | Qt::Horizontal 31 | 32 | 33 | QDialogButtonBox::Cancel|QDialogButtonBox::Yes 34 | 35 | 36 | true 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | buttonBox 46 | accepted() 47 | Warning 48 | accept() 49 | 50 | 51 | 248 52 | 254 53 | 54 | 55 | 157 56 | 274 57 | 58 | 59 | 60 | 61 | buttonBox 62 | rejected() 63 | Warning 64 | reject() 65 | 66 | 67 | 316 68 | 260 69 | 70 | 71 | 286 72 | 274 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_project.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_project.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_project.ui' applies. 5 | # 6 | # Created: Tue Dec 24 12:56:45 2019 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Project(object): 14 | def setupUi(self, Project): 15 | Project.setObjectName("Project") 16 | Project.resize(367, 262) 17 | self.shotLayout = QtWidgets.QVBoxLayout(Project) 18 | self.shotLayout.setContentsMargins(0, 0, 0, 0) 19 | self.shotLayout.setObjectName("shotLayout") 20 | self.splitter = QtWidgets.QSplitter(Project) 21 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 22 | self.splitter.setObjectName("splitter") 23 | self.label = QtWidgets.QLabel(self.splitter) 24 | self.label.setMinimumSize(QtCore.QSize(120, 0)) 25 | self.label.setMaximumSize(QtCore.QSize(120, 16777215)) 26 | self.label.setObjectName("label") 27 | self.linProjectName = QtWidgets.QLineEdit(self.splitter) 28 | self.linProjectName.setAlignment(QtCore.Qt.AlignCenter) 29 | self.linProjectName.setObjectName("linProjectName") 30 | self.shotLayout.addWidget(self.splitter) 31 | self.splitter_2 = QtWidgets.QSplitter(Project) 32 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 33 | self.splitter_2.setObjectName("splitter_2") 34 | self.label_4 = QtWidgets.QLabel(self.splitter_2) 35 | self.label_4.setMinimumSize(QtCore.QSize(120, 0)) 36 | self.label_4.setMaximumSize(QtCore.QSize(120, 16777215)) 37 | self.label_4.setObjectName("label_4") 38 | self.linProjectLocation = QtWidgets.QLineEdit(self.splitter_2) 39 | self.linProjectLocation.setAlignment(QtCore.Qt.AlignCenter) 40 | self.linProjectLocation.setObjectName("linProjectLocation") 41 | self.shotLayout.addWidget(self.splitter_2) 42 | self.splitter_5 = QtWidgets.QSplitter(Project) 43 | self.splitter_5.setOrientation(QtCore.Qt.Horizontal) 44 | self.splitter_5.setObjectName("splitter_5") 45 | self.label_3 = QtWidgets.QLabel(self.splitter_5) 46 | self.label_3.setMinimumSize(QtCore.QSize(120, 0)) 47 | self.label_3.setMaximumSize(QtCore.QSize(120, 16777215)) 48 | self.label_3.setObjectName("label_3") 49 | self.linHoudini = QtWidgets.QLineEdit(self.splitter_5) 50 | self.linHoudini.setAlignment(QtCore.Qt.AlignCenter) 51 | self.linHoudini.setObjectName("linHoudini") 52 | self.shotLayout.addWidget(self.splitter_5) 53 | self.splitter_3 = QtWidgets.QSplitter(Project) 54 | self.splitter_3.setOrientation(QtCore.Qt.Horizontal) 55 | self.splitter_3.setObjectName("splitter_3") 56 | self.label_5 = QtWidgets.QLabel(self.splitter_3) 57 | self.label_5.setMinimumSize(QtCore.QSize(120, 0)) 58 | self.label_5.setMaximumSize(QtCore.QSize(120, 16777215)) 59 | self.label_5.setObjectName("label_5") 60 | self.linProjectWidth = QtWidgets.QLineEdit(self.splitter_3) 61 | self.linProjectWidth.setAlignment(QtCore.Qt.AlignCenter) 62 | self.linProjectWidth.setObjectName("linProjectWidth") 63 | self.linProjectHeight = QtWidgets.QLineEdit(self.splitter_3) 64 | self.linProjectHeight.setAlignment(QtCore.Qt.AlignCenter) 65 | self.linProjectHeight.setObjectName("linProjectHeight") 66 | self.shotLayout.addWidget(self.splitter_3) 67 | self.label_2 = QtWidgets.QLabel(Project) 68 | self.label_2.setObjectName("label_2") 69 | self.shotLayout.addWidget(self.label_2) 70 | self.txtDescription = QtWidgets.QTextEdit(Project) 71 | self.txtDescription.setMaximumSize(QtCore.QSize(16777215, 100)) 72 | self.txtDescription.setObjectName("txtDescription") 73 | self.shotLayout.addWidget(self.txtDescription) 74 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 75 | self.shotLayout.addItem(spacerItem) 76 | 77 | self.retranslateUi(Project) 78 | QtCore.QMetaObject.connectSlotsByName(Project) 79 | 80 | def retranslateUi(self, Project): 81 | Project.setWindowTitle(QtWidgets.QApplication.translate("Project", "Form", None, -1)) 82 | self.label.setText(QtWidgets.QApplication.translate("Project", "Project Name", None, -1)) 83 | self.label_4.setText(QtWidgets.QApplication.translate("Project", "Project Location: ", None, -1)) 84 | self.label_3.setText(QtWidgets.QApplication.translate("Project", "Houdini Build", None, -1)) 85 | self.label_5.setText(QtWidgets.QApplication.translate("Project", "Project Resolution", None, -1)) 86 | self.label_2.setText(QtWidgets.QApplication.translate("Project", "Project Description:", None, -1)) 87 | 88 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_project.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Project 4 | 5 | 6 | 7 | 0 8 | 0 9 | 367 10 | 262 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | Qt::Horizontal 24 | 25 | 26 | 27 | 28 | 120 29 | 0 30 | 31 | 32 | 33 | 34 | 120 35 | 16777215 36 | 37 | 38 | 39 | Project Name 40 | 41 | 42 | 43 | 44 | Qt::AlignCenter 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::Horizontal 53 | 54 | 55 | 56 | 57 | 120 58 | 0 59 | 60 | 61 | 62 | 63 | 120 64 | 16777215 65 | 66 | 67 | 68 | Project Location: 69 | 70 | 71 | 72 | 73 | Qt::AlignCenter 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Qt::Horizontal 82 | 83 | 84 | 85 | 86 | 120 87 | 0 88 | 89 | 90 | 91 | 92 | 120 93 | 16777215 94 | 95 | 96 | 97 | Houdini Build 98 | 99 | 100 | 101 | 102 | Qt::AlignCenter 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | Qt::Horizontal 111 | 112 | 113 | 114 | 115 | 120 116 | 0 117 | 118 | 119 | 120 | 121 | 120 122 | 16777215 123 | 124 | 125 | 126 | Project Resolution 127 | 128 | 129 | 130 | 131 | Qt::AlignCenter 132 | 133 | 134 | 135 | 136 | Qt::AlignCenter 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | Project Description: 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 16777215 153 | 100 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | Qt::Vertical 162 | 163 | 164 | 165 | 20 166 | 40 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_project_properties.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_project_properties.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_project_properties.ui' applies. 5 | # 6 | # Created: Tue Dec 24 13:05:54 2019 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_ProjectProperties(object): 14 | def setupUi(self, ProjectProperties): 15 | ProjectProperties.setObjectName("ProjectProperties") 16 | ProjectProperties.resize(368, 138) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(ProjectProperties) 18 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 19 | self.verticalLayout.setObjectName("verticalLayout") 20 | self.layoutProject = QtWidgets.QVBoxLayout() 21 | self.layoutProject.setObjectName("layoutProject") 22 | self.verticalLayout.addLayout(self.layoutProject) 23 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 24 | self.verticalLayout.addItem(spacerItem) 25 | self.btnCreateProject = QtWidgets.QPushButton(ProjectProperties) 26 | self.btnCreateProject.setMinimumSize(QtCore.QSize(0, 40)) 27 | self.btnCreateProject.setObjectName("btnCreateProject") 28 | self.verticalLayout.addWidget(self.btnCreateProject) 29 | self.splitter_7 = QtWidgets.QSplitter(ProjectProperties) 30 | self.splitter_7.setOrientation(QtCore.Qt.Horizontal) 31 | self.splitter_7.setObjectName("splitter_7") 32 | self.btnLaunchHoudini = QtWidgets.QPushButton(self.splitter_7) 33 | self.btnLaunchHoudini.setObjectName("btnLaunchHoudini") 34 | self.btnLaunchNuke = QtWidgets.QPushButton(self.splitter_7) 35 | self.btnLaunchNuke.setObjectName("btnLaunchNuke") 36 | self.btnOpenFolder = QtWidgets.QPushButton(self.splitter_7) 37 | self.btnOpenFolder.setObjectName("btnOpenFolder") 38 | self.verticalLayout.addWidget(self.splitter_7) 39 | 40 | self.retranslateUi(ProjectProperties) 41 | QtCore.QMetaObject.connectSlotsByName(ProjectProperties) 42 | 43 | def retranslateUi(self, ProjectProperties): 44 | ProjectProperties.setWindowTitle(QtWidgets.QApplication.translate("ProjectProperties", "Form", None, -1)) 45 | self.btnCreateProject.setText(QtWidgets.QApplication.translate("ProjectProperties", "Create Project", None, -1)) 46 | self.btnLaunchHoudini.setText(QtWidgets.QApplication.translate("ProjectProperties", "Launch Houdini", None, -1)) 47 | self.btnLaunchNuke.setText(QtWidgets.QApplication.translate("ProjectProperties", "Launch Nuke", None, -1)) 48 | self.btnOpenFolder.setText(QtWidgets.QApplication.translate("ProjectProperties", "Open Folder", None, -1)) 49 | 50 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_project_properties.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ProjectProperties 4 | 5 | 6 | 7 | 0 8 | 0 9 | 368 10 | 138 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Qt::Vertical 27 | 28 | 29 | 30 | 20 31 | 40 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 40 42 | 43 | 44 | 45 | Create Project 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::Horizontal 53 | 54 | 55 | 56 | Launch Houdini 57 | 58 | 59 | 60 | 61 | Launch Nuke 62 | 63 | 64 | 65 | 66 | Open Folder 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_sequence.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_sequence.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_sequence.ui' applies. 5 | # 6 | # Created: Wed Feb 05 14:00:53 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Sequence(object): 14 | def setupUi(self, Sequence): 15 | Sequence.setObjectName("Sequence") 16 | Sequence.resize(367, 182) 17 | self.shotLayout = QtWidgets.QVBoxLayout(Sequence) 18 | self.shotLayout.setContentsMargins(0, 0, 0, 0) 19 | self.shotLayout.setObjectName("shotLayout") 20 | self.splitter_2 = QtWidgets.QSplitter(Sequence) 21 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 22 | self.splitter_2.setObjectName("splitter_2") 23 | self.label_3 = QtWidgets.QLabel(self.splitter_2) 24 | self.label_3.setMinimumSize(QtCore.QSize(120, 0)) 25 | self.label_3.setMaximumSize(QtCore.QSize(120, 16777215)) 26 | self.label_3.setObjectName("label_3") 27 | self.linProjectName = QtWidgets.QLineEdit(self.splitter_2) 28 | self.linProjectName.setEnabled(False) 29 | self.linProjectName.setAlignment(QtCore.Qt.AlignCenter) 30 | self.linProjectName.setObjectName("linProjectName") 31 | self.shotLayout.addWidget(self.splitter_2) 32 | self.splitter = QtWidgets.QSplitter(Sequence) 33 | self.splitter.setOrientation(QtCore.Qt.Horizontal) 34 | self.splitter.setObjectName("splitter") 35 | self.label = QtWidgets.QLabel(self.splitter) 36 | self.label.setMinimumSize(QtCore.QSize(120, 0)) 37 | self.label.setMaximumSize(QtCore.QSize(120, 16777215)) 38 | self.label.setObjectName("label") 39 | self.linSequenceName = QtWidgets.QLineEdit(self.splitter) 40 | self.linSequenceName.setAlignment(QtCore.Qt.AlignCenter) 41 | self.linSequenceName.setObjectName("linSequenceName") 42 | self.shotLayout.addWidget(self.splitter) 43 | self.label_2 = QtWidgets.QLabel(Sequence) 44 | self.label_2.setObjectName("label_2") 45 | self.shotLayout.addWidget(self.label_2) 46 | self.txtDescription = QtWidgets.QTextEdit(Sequence) 47 | self.txtDescription.setMaximumSize(QtCore.QSize(16777215, 100)) 48 | self.txtDescription.setObjectName("txtDescription") 49 | self.shotLayout.addWidget(self.txtDescription) 50 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 51 | self.shotLayout.addItem(spacerItem) 52 | 53 | self.retranslateUi(Sequence) 54 | QtCore.QMetaObject.connectSlotsByName(Sequence) 55 | 56 | def retranslateUi(self, Sequence): 57 | Sequence.setWindowTitle(QtWidgets.QApplication.translate("Sequence", "Sequence", None, -1)) 58 | self.label_3.setText(QtWidgets.QApplication.translate("Sequence", "Project Name", None, -1)) 59 | self.label.setText(QtWidgets.QApplication.translate("Sequence", "Sequence Name", None, -1)) 60 | self.label_2.setText(QtWidgets.QApplication.translate("Sequence", "Sequence Description:", None, -1)) 61 | 62 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_sequence.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Sequence 4 | 5 | 6 | 7 | 0 8 | 0 9 | 367 10 | 182 11 | 12 | 13 | 14 | Sequence 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | Qt::Horizontal 24 | 25 | 26 | 27 | 28 | 120 29 | 0 30 | 31 | 32 | 33 | 34 | 120 35 | 16777215 36 | 37 | 38 | 39 | Project Name 40 | 41 | 42 | 43 | 44 | false 45 | 46 | 47 | Qt::AlignCenter 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | Qt::Horizontal 56 | 57 | 58 | 59 | 60 | 120 61 | 0 62 | 63 | 64 | 65 | 66 | 120 67 | 16777215 68 | 69 | 70 | 71 | Sequence Name 72 | 73 | 74 | 75 | 76 | Qt::AlignCenter 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Sequence Description: 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 16777215 93 | 100 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | Qt::Vertical 102 | 103 | 104 | 105 | 20 106 | 40 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_sequence_properties.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_sequence_properties.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_sequence_properties.ui' applies. 5 | # 6 | # Created: Wed Feb 05 11:14:17 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_SequenceProperties(object): 14 | def setupUi(self, SequenceProperties): 15 | SequenceProperties.setObjectName("SequenceProperties") 16 | SequenceProperties.resize(369, 103) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(SequenceProperties) 18 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 19 | self.verticalLayout.setObjectName("verticalLayout") 20 | self.layoutSequence = QtWidgets.QVBoxLayout() 21 | self.layoutSequence.setObjectName("layoutSequence") 22 | self.verticalLayout.addLayout(self.layoutSequence) 23 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 24 | self.verticalLayout.addItem(spacerItem) 25 | self.btnUpdateSequence = QtWidgets.QPushButton(SequenceProperties) 26 | self.btnUpdateSequence.setMinimumSize(QtCore.QSize(0, 45)) 27 | self.btnUpdateSequence.setObjectName("btnUpdateSequence") 28 | self.verticalLayout.addWidget(self.btnUpdateSequence) 29 | 30 | self.retranslateUi(SequenceProperties) 31 | QtCore.QMetaObject.connectSlotsByName(SequenceProperties) 32 | 33 | def retranslateUi(self, SequenceProperties): 34 | SequenceProperties.setWindowTitle(QtWidgets.QApplication.translate("SequenceProperties", "Form", None, -1)) 35 | self.btnUpdateSequence.setText(QtWidgets.QApplication.translate("SequenceProperties", "Update Sequence Data", None, -1)) 36 | 37 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_sequence_properties.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | SequenceProperties 4 | 5 | 6 | 7 | 0 8 | 0 9 | 369 10 | 103 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Qt::Vertical 27 | 28 | 29 | 30 | 20 31 | 40 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 45 42 | 43 | 44 | 45 | Update Sequence Data 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_shot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_shot.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_shot.ui' applies. 5 | # 6 | # Created: Tue Jul 14 23:48:02 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_Shot(object): 14 | def setupUi(self, Shot): 15 | Shot.setObjectName("Shot") 16 | Shot.resize(369, 460) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(Shot) 18 | self.verticalLayout.setObjectName("verticalLayout") 19 | self.splitter_3 = QtWidgets.QSplitter(Shot) 20 | self.splitter_3.setOrientation(QtCore.Qt.Horizontal) 21 | self.splitter_3.setObjectName("splitter_3") 22 | self.label_3 = QtWidgets.QLabel(self.splitter_3) 23 | self.label_3.setMinimumSize(QtCore.QSize(120, 0)) 24 | self.label_3.setMaximumSize(QtCore.QSize(120, 16777215)) 25 | self.label_3.setObjectName("label_3") 26 | self.linProjectName = QtWidgets.QLineEdit(self.splitter_3) 27 | self.linProjectName.setEnabled(False) 28 | self.linProjectName.setAlignment(QtCore.Qt.AlignCenter) 29 | self.linProjectName.setObjectName("linProjectName") 30 | self.verticalLayout.addWidget(self.splitter_3) 31 | self.splitter_4 = QtWidgets.QSplitter(Shot) 32 | self.splitter_4.setOrientation(QtCore.Qt.Horizontal) 33 | self.splitter_4.setObjectName("splitter_4") 34 | self.label_5 = QtWidgets.QLabel(self.splitter_4) 35 | self.label_5.setMinimumSize(QtCore.QSize(120, 0)) 36 | self.label_5.setMaximumSize(QtCore.QSize(120, 16777215)) 37 | self.label_5.setObjectName("label_5") 38 | self.linSequenceName = QtWidgets.QLineEdit(self.splitter_4) 39 | self.linSequenceName.setEnabled(False) 40 | self.linSequenceName.setAlignment(QtCore.Qt.AlignCenter) 41 | self.linSequenceName.setObjectName("linSequenceName") 42 | self.verticalLayout.addWidget(self.splitter_4) 43 | self.splitter_8 = QtWidgets.QSplitter(Shot) 44 | self.splitter_8.setOrientation(QtCore.Qt.Horizontal) 45 | self.splitter_8.setObjectName("splitter_8") 46 | self.label = QtWidgets.QLabel(self.splitter_8) 47 | self.label.setMinimumSize(QtCore.QSize(120, 0)) 48 | self.label.setMaximumSize(QtCore.QSize(120, 16777215)) 49 | self.label.setObjectName("label") 50 | self.linShotName = QtWidgets.QLineEdit(self.splitter_8) 51 | self.linShotName.setAlignment(QtCore.Qt.AlignCenter) 52 | self.linShotName.setObjectName("linShotName") 53 | self.verticalLayout.addWidget(self.splitter_8) 54 | self.splitter_5 = QtWidgets.QSplitter(Shot) 55 | self.splitter_5.setOrientation(QtCore.Qt.Horizontal) 56 | self.splitter_5.setObjectName("splitter_5") 57 | self.label_7 = QtWidgets.QLabel(self.splitter_5) 58 | self.label_7.setMinimumSize(QtCore.QSize(120, 0)) 59 | self.label_7.setMaximumSize(QtCore.QSize(120, 16777215)) 60 | self.label_7.setObjectName("label_7") 61 | self.linStartFrame = QtWidgets.QLineEdit(self.splitter_5) 62 | self.linStartFrame.setAlignment(QtCore.Qt.AlignCenter) 63 | self.linStartFrame.setObjectName("linStartFrame") 64 | self.linEndFrame = QtWidgets.QLineEdit(self.splitter_5) 65 | self.linEndFrame.setAlignment(QtCore.Qt.AlignCenter) 66 | self.linEndFrame.setObjectName("linEndFrame") 67 | self.verticalLayout.addWidget(self.splitter_5) 68 | self.splitter_6 = QtWidgets.QSplitter(Shot) 69 | self.splitter_6.setOrientation(QtCore.Qt.Horizontal) 70 | self.splitter_6.setObjectName("splitter_6") 71 | self.label_8 = QtWidgets.QLabel(self.splitter_6) 72 | self.label_8.setMinimumSize(QtCore.QSize(120, 0)) 73 | self.label_8.setMaximumSize(QtCore.QSize(120, 16777215)) 74 | self.label_8.setObjectName("label_8") 75 | self.linWidth = QtWidgets.QLineEdit(self.splitter_6) 76 | self.linWidth.setAlignment(QtCore.Qt.AlignCenter) 77 | self.linWidth.setObjectName("linWidth") 78 | self.linHeight = QtWidgets.QLineEdit(self.splitter_6) 79 | self.linHeight.setAlignment(QtCore.Qt.AlignCenter) 80 | self.linHeight.setObjectName("linHeight") 81 | self.verticalLayout.addWidget(self.splitter_6) 82 | self.splitter_7 = QtWidgets.QSplitter(Shot) 83 | self.splitter_7.setOrientation(QtCore.Qt.Horizontal) 84 | self.splitter_7.setObjectName("splitter_7") 85 | self.label_2 = QtWidgets.QLabel(self.splitter_7) 86 | self.label_2.setMinimumSize(QtCore.QSize(120, 0)) 87 | self.label_2.setMaximumSize(QtCore.QSize(120, 16777215)) 88 | self.label_2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 89 | self.label_2.setObjectName("label_2") 90 | self.splitter = QtWidgets.QSplitter(self.splitter_7) 91 | self.splitter.setOrientation(QtCore.Qt.Vertical) 92 | self.splitter.setObjectName("splitter") 93 | self.listAssets = QtWidgets.QListView(self.splitter) 94 | self.listAssets.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) 95 | self.listAssets.setObjectName("listAssets") 96 | self.splitter_2 = QtWidgets.QSplitter(self.splitter) 97 | self.splitter_2.setOrientation(QtCore.Qt.Horizontal) 98 | self.splitter_2.setObjectName("splitter_2") 99 | self.btnLinkAsset = QtWidgets.QPushButton(self.splitter_2) 100 | self.btnLinkAsset.setMaximumSize(QtCore.QSize(16777215, 30)) 101 | self.btnLinkAsset.setObjectName("btnLinkAsset") 102 | self.btnUnlinkAsset = QtWidgets.QPushButton(self.splitter_2) 103 | self.btnUnlinkAsset.setMaximumSize(QtCore.QSize(16777215, 30)) 104 | self.btnUnlinkAsset.setObjectName("btnUnlinkAsset") 105 | self.verticalLayout.addWidget(self.splitter_7) 106 | self.label_4 = QtWidgets.QLabel(Shot) 107 | self.label_4.setObjectName("label_4") 108 | self.verticalLayout.addWidget(self.label_4) 109 | self.txtDescription = QtWidgets.QTextEdit(Shot) 110 | self.txtDescription.setMaximumSize(QtCore.QSize(16777215, 100)) 111 | self.txtDescription.setObjectName("txtDescription") 112 | self.verticalLayout.addWidget(self.txtDescription) 113 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 114 | self.verticalLayout.addItem(spacerItem) 115 | 116 | self.retranslateUi(Shot) 117 | QtCore.QMetaObject.connectSlotsByName(Shot) 118 | 119 | def retranslateUi(self, Shot): 120 | Shot.setWindowTitle(QtWidgets.QApplication.translate("Shot", "Shot", None, -1)) 121 | self.label_3.setText(QtWidgets.QApplication.translate("Shot", "Project Name", None, -1)) 122 | self.label_5.setText(QtWidgets.QApplication.translate("Shot", "Sequence Name", None, -1)) 123 | self.label.setText(QtWidgets.QApplication.translate("Shot", "Shot Name", None, -1)) 124 | self.label_7.setText(QtWidgets.QApplication.translate("Shot", "Start | End", None, -1)) 125 | self.label_8.setText(QtWidgets.QApplication.translate("Shot", "Width | Height", None, -1)) 126 | self.label_2.setText(QtWidgets.QApplication.translate("Shot", "Linked Assets", None, -1)) 127 | self.btnLinkAsset.setText(QtWidgets.QApplication.translate("Shot", "Link Asset", None, -1)) 128 | self.btnUnlinkAsset.setText(QtWidgets.QApplication.translate("Shot", "Break Link", None, -1)) 129 | self.label_4.setText(QtWidgets.QApplication.translate("Shot", "Shot Description", None, -1)) 130 | 131 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_shot.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Shot 4 | 5 | 6 | 7 | 0 8 | 0 9 | 369 10 | 460 11 | 12 | 13 | 14 | Shot 15 | 16 | 17 | 18 | 19 | 20 | Qt::Horizontal 21 | 22 | 23 | 24 | 25 | 120 26 | 0 27 | 28 | 29 | 30 | 31 | 120 32 | 16777215 33 | 34 | 35 | 36 | Project Name 37 | 38 | 39 | 40 | 41 | false 42 | 43 | 44 | Qt::AlignCenter 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::Horizontal 53 | 54 | 55 | 56 | 57 | 120 58 | 0 59 | 60 | 61 | 62 | 63 | 120 64 | 16777215 65 | 66 | 67 | 68 | Sequence Name 69 | 70 | 71 | 72 | 73 | false 74 | 75 | 76 | Qt::AlignCenter 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Qt::Horizontal 85 | 86 | 87 | 88 | 89 | 120 90 | 0 91 | 92 | 93 | 94 | 95 | 120 96 | 16777215 97 | 98 | 99 | 100 | Shot Name 101 | 102 | 103 | 104 | 105 | Qt::AlignCenter 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Qt::Horizontal 114 | 115 | 116 | 117 | 118 | 120 119 | 0 120 | 121 | 122 | 123 | 124 | 120 125 | 16777215 126 | 127 | 128 | 129 | Start | End 130 | 131 | 132 | 133 | 134 | Qt::AlignCenter 135 | 136 | 137 | 138 | 139 | Qt::AlignCenter 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | Qt::Horizontal 148 | 149 | 150 | 151 | 152 | 120 153 | 0 154 | 155 | 156 | 157 | 158 | 120 159 | 16777215 160 | 161 | 162 | 163 | Width | Height 164 | 165 | 166 | 167 | 168 | Qt::AlignCenter 169 | 170 | 171 | 172 | 173 | Qt::AlignCenter 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | Qt::Horizontal 182 | 183 | 184 | 185 | 186 | 120 187 | 0 188 | 189 | 190 | 191 | 192 | 120 193 | 16777215 194 | 195 | 196 | 197 | Linked Assets 198 | 199 | 200 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 201 | 202 | 203 | 204 | 205 | Qt::Vertical 206 | 207 | 208 | 209 | QAbstractItemView::ExtendedSelection 210 | 211 | 212 | 213 | 214 | Qt::Horizontal 215 | 216 | 217 | 218 | 219 | 16777215 220 | 30 221 | 222 | 223 | 224 | Link Asset 225 | 226 | 227 | 228 | 229 | 230 | 16777215 231 | 30 232 | 233 | 234 | 235 | Break Link 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | Shot Description 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 16777215 254 | 100 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | Qt::Vertical 263 | 264 | 265 | 266 | 20 267 | 40 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_shot_properties.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'E:\Eve\Eve\tools\pm\ui\ui_shot_properties.ui', 4 | # licensing of 'E:\Eve\Eve\tools\pm\ui\ui_shot_properties.ui' applies. 5 | # 6 | # Created: Wed Feb 05 11:10:46 2020 7 | # by: pyside2-uic running on PySide2 5.9.0a1.dev1528389443 8 | # 9 | # WARNING! All changes made in this file will be lost! 10 | 11 | from PySide2 import QtCore, QtGui, QtWidgets 12 | 13 | class Ui_ShotProperties(object): 14 | def setupUi(self, ShotProperties): 15 | ShotProperties.setObjectName("ShotProperties") 16 | ShotProperties.resize(370, 193) 17 | self.verticalLayout = QtWidgets.QVBoxLayout(ShotProperties) 18 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 19 | self.verticalLayout.setObjectName("verticalLayout") 20 | self.layoutShot = QtWidgets.QVBoxLayout() 21 | self.layoutShot.setObjectName("layoutShot") 22 | self.verticalLayout.addLayout(self.layoutShot) 23 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 24 | self.verticalLayout.addItem(spacerItem) 25 | self.btnUpdateShot = QtWidgets.QPushButton(ShotProperties) 26 | self.btnUpdateShot.setMinimumSize(QtCore.QSize(0, 45)) 27 | self.btnUpdateShot.setObjectName("btnUpdateShot") 28 | self.verticalLayout.addWidget(self.btnUpdateShot) 29 | self.splitter_6 = QtWidgets.QSplitter(ShotProperties) 30 | self.splitter_6.setOrientation(QtCore.Qt.Horizontal) 31 | self.splitter_6.setObjectName("splitter_6") 32 | self.btnCreateShot = QtWidgets.QPushButton(self.splitter_6) 33 | self.btnCreateShot.setObjectName("btnCreateShot") 34 | self.btnOpenShot = QtWidgets.QPushButton(self.splitter_6) 35 | self.btnOpenShot.setObjectName("btnOpenShot") 36 | self.verticalLayout.addWidget(self.splitter_6) 37 | self.splitter_7 = QtWidgets.QSplitter(ShotProperties) 38 | self.splitter_7.setOrientation(QtCore.Qt.Horizontal) 39 | self.splitter_7.setObjectName("splitter_7") 40 | self.btnCreateShotAnim = QtWidgets.QPushButton(self.splitter_7) 41 | self.btnCreateShotAnim.setObjectName("btnCreateShotAnim") 42 | self.btnOpenShotAnim = QtWidgets.QPushButton(self.splitter_7) 43 | self.btnOpenShotAnim.setObjectName("btnOpenShotAnim") 44 | self.verticalLayout.addWidget(self.splitter_7) 45 | 46 | self.retranslateUi(ShotProperties) 47 | QtCore.QMetaObject.connectSlotsByName(ShotProperties) 48 | 49 | def retranslateUi(self, ShotProperties): 50 | ShotProperties.setWindowTitle(QtWidgets.QApplication.translate("ShotProperties", "Form", None, -1)) 51 | self.btnUpdateShot.setText(QtWidgets.QApplication.translate("ShotProperties", "Update Shot Data", None, -1)) 52 | self.btnCreateShot.setText(QtWidgets.QApplication.translate("ShotProperties", "Create Render Scene", None, -1)) 53 | self.btnOpenShot.setText(QtWidgets.QApplication.translate("ShotProperties", "Open Render Scene", None, -1)) 54 | self.btnCreateShotAnim.setText(QtWidgets.QApplication.translate("ShotProperties", "Create Animation Scene", None, -1)) 55 | self.btnOpenShotAnim.setText(QtWidgets.QApplication.translate("ShotProperties", "Open Animation Scene", None, -1)) 56 | 57 | -------------------------------------------------------------------------------- /Eve/tools/pm/ui/ui_shot_properties.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ShotProperties 4 | 5 | 6 | 7 | 0 8 | 0 9 | 370 10 | 193 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Qt::Vertical 27 | 28 | 29 | 30 | 20 31 | 40 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 45 42 | 43 | 44 | 45 | Update Shot Data 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::Horizontal 53 | 54 | 55 | 56 | Create Render Scene 57 | 58 | 59 | 60 | 61 | Open Render Scene 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | Qt::Horizontal 70 | 71 | 72 | 73 | Create Animation Scene 74 | 75 | 76 | 77 | 78 | Open Animation Scene 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /Eve/tools/usd/USD.py: -------------------------------------------------------------------------------- 1 | """ 2 | Pixar USD Python API 3 | 4 | Requirements: get compiled Python API: pip install usd-core 5 | 6 | Hello World: 7 | # xformPrim = UsdGeom.Xform.Define(stage, '/hello') 8 | # sphere = UsdGeom.Sphere.Define(stage, '/hello/world') 9 | # sphere.GetRadiusAttr().Set(2.0) 10 | # material = UsdShade.Material.Define(stage, '/myMaterial') 11 | # shader = UsdShade.Shader.Define(stage, '/myMaterial/myShader') 12 | 13 | # mesh = UsdGeom.Mesh.Define(stage, '/Root/super_plane') 14 | 15 | # mesh_path = Sdf.Path(root_xform.GetPath()).AppendChild('super_plane') 16 | # mesh = UsdGeom.Mesh.Define(stage, mesh_path) 17 | 18 | lot = [(1, 0, -1), (1, 0, 1), (0.6, 0, 1), (0.6, 0, 1.2), 19 | (0.2, 0, 1.2), (0.2, 0, 0.8), (0, 0, 0.8), (0, 0, -0.2), (0.4, 0, -0.2), (0.4, 0, -1)] 20 | """ 21 | 22 | from pxr import Usd, UsdGeom, Sdf, UsdShade 23 | import geo 24 | 25 | 26 | def crate_geometry(): 27 | """ 28 | Procedurally create geometry and save it to the USDA file 29 | """ 30 | 31 | shape = 'super_extrude' 32 | root_for_export = 'C:/Users/kko8/OneDrive/projects/houdini_snippets/PROD/3D/caches/ASSETS' 33 | stage = Usd.Stage.CreateNew(f'{root_for_export}/{shape}.usda') 34 | 35 | # Build mesh object 36 | UsdGeom.Xform.Define(stage, '/Root') 37 | mesh = UsdGeom.Mesh.Define(stage, f'/Root/{shape}') 38 | 39 | # Build mesh geometry 40 | # mesh_data = geo.plane(6, 6) 41 | # mesh_data = geo.sphere(8, 6) 42 | # mesh_data = geo.torus(8, 12, 1, 0.5) 43 | # mesh_data = geo.cone(12) 44 | # mesh_data = geo.polygon(lot) 45 | 46 | # Extrude Face 47 | # mesh_data = geo.EditMesh(geo.polygon()).extrude_face(0, 4) 48 | # mesh_data = geo.EditMesh(geo.torus(8, 12, 1, 0.5)).extrude_face(5, 0.3) 49 | # mesh_data = geo.EditMesh(geo.polygon(lot)).extrude_face(0, -5) 50 | 51 | # Create torus and extrude every third face 52 | mesh_data = geo.torus(12, 36, 2, 0.5) 53 | edit_mesh = geo.EditMesh(mesh_data) 54 | 55 | for i in reversed(range(36*12)): 56 | if not i % 3: 57 | edit_mesh.extrude_face(i, 0.3) 58 | 59 | mesh_data = edit_mesh.modified_mesh 60 | 61 | # Set mesh attributes 62 | mesh.GetPointsAttr().Set(mesh_data.points) 63 | mesh.GetFaceVertexCountsAttr().Set(mesh_data.face_vertex_counts) 64 | mesh.GetFaceVertexIndicesAttr().Set(mesh_data.face_vertex_indices) 65 | 66 | # Set orientation and subdivisionScheme 67 | mesh.CreateOrientationAttr().Set(UsdGeom.Tokens.leftHanded) 68 | mesh.CreateSubdivisionSchemeAttr().Set("none") 69 | 70 | stage.GetRootLayer().Save() 71 | 72 | 73 | def build_references(): 74 | """ 75 | Create USD hierarchy: 76 | "shot.usd" references "asset_a.usd" and "asset_b.usd" 77 | """ 78 | 79 | root_for_export = 'C:/Users/kko8/OneDrive/projects/houdini_snippets/PROD/3D/caches/ASSETS' 80 | 81 | # Asset A 82 | stage_a = Usd.Stage.CreateNew(f'{root_for_export}/asset_a.usda') 83 | UsdGeom.Xform.Define(stage_a, '/Root_A') 84 | UsdGeom.Xform.Define(stage_a, '/Root_A/object_A') 85 | stage_a.SetDefaultPrim(stage_a.GetPrimAtPath('/Root_A')) # Set name of the root prim that will be referenced 86 | stage_a.GetRootLayer().Save() 87 | 88 | # Asset B 89 | stage_b = Usd.Stage.CreateNew(f'{root_for_export}/asset_b.usda') 90 | UsdGeom.Xform.Define(stage_b, '/Root_B') 91 | UsdGeom.Xform.Define(stage_b, '/Root_B/object_B') 92 | stage_b.SetDefaultPrim(stage_b.GetPrimAtPath('/Root_B')) 93 | stage_b.GetRootLayer().Save() 94 | 95 | # Shot 96 | stage = Usd.Stage.CreateNew(f'{root_for_export}/shot.usda') 97 | UsdGeom.Xform.Define(stage, '/Root_Shot') 98 | reference_a = stage.OverridePrim('/Root_Shot/reference_a') # Define "over" prim that will be replaced 99 | reference_b = stage.OverridePrim('/Root_Shot/reference_b') 100 | reference_a.GetReferences().AddReference('./asset_a.usda') 101 | reference_b.GetReferences().AddReference('./asset_b.usda') 102 | stage.GetRootLayer().Save() 103 | 104 | 105 | crate_geometry() 106 | # build_references() 107 | 108 | -------------------------------------------------------------------------------- /Eve/tools/usd/houdini_export_geometry.py: -------------------------------------------------------------------------------- 1 | """ 2 | Export geometry from Houdini geometry context. 3 | 4 | Create Python node in Geometry context and connect your geometry to the first input. 5 | Material export will work if you assign material to geometry in SOP context (use principledshader material) 6 | """ 7 | 8 | import random 9 | from pxr import Usd, UsdGeom, UsdShade, Gf, Sdf 10 | import hou 11 | 12 | 13 | def create_usd_material(stage, material_path, material_properties): 14 | """ 15 | Create a USD material with diffuseColor from Houdini material properties. 16 | """ 17 | 18 | # Get properties 19 | base_color = Gf.Vec3f(material_properties['basecolorr'], 20 | material_properties['basecolorg'], 21 | material_properties['basecolorb']) 22 | 23 | # Create a material 24 | usd_material = UsdShade.Material.Define(stage, material_path) 25 | 26 | # Create a UsdPreviewSurface Shader and set its parameters 27 | shader = UsdShade.Shader.Define(stage, f'{material_path}/usdPreviewSurface') 28 | shader.CreateIdAttr('UsdPreviewSurface') 29 | 30 | # Set diffuseColor 31 | shader.CreateInput('diffuseColor', Sdf.ValueTypeNames.Color3f).Set(base_color) 32 | 33 | # Connect the shader's surface output to the material's surface output 34 | surface_output = shader.CreateOutput('surface', Sdf.ValueTypeNames.Token) 35 | usd_material_output = usd_material.CreateSurfaceOutput() 36 | usd_material_output.ConnectToSource(surface_output) 37 | 38 | return usd_material 39 | 40 | 41 | def get_material_properties(material): 42 | """ 43 | Extract properties from the Houdini material node. 44 | """ 45 | 46 | properties = {} 47 | for parameter in material.parms(): 48 | properties[parameter.name()] = parameter.eval() 49 | 50 | return properties 51 | 52 | 53 | def get_material_path(geometry): 54 | """ 55 | Get path to assigned material node from geometry object 56 | """ 57 | 58 | if geometry.findPrimAttrib("shop_materialpath"): 59 | primitive = geometry.prims()[0] 60 | material_path = primitive.attribValue("shop_materialpath") 61 | 62 | return material_path 63 | 64 | 65 | def setup_mesh(mesh, points, normals, face_vertex_counts, face_vertex_indices): 66 | """ 67 | Setup mesh attributes in USD file 68 | """ 69 | 70 | mesh.GetPointsAttr().Set(points) 71 | mesh.GetFaceVertexCountsAttr().Set(face_vertex_counts) 72 | mesh.GetFaceVertexIndicesAttr().Set(face_vertex_indices) 73 | 74 | if normals: 75 | mesh.CreateNormalsAttr().Set(normals) 76 | mesh.SetNormalsInterpolation(UsdGeom.Tokens.faceVarying) 77 | 78 | # Set orientation and subdivisionScheme 79 | mesh.CreateOrientationAttr().Set(UsdGeom.Tokens.leftHanded) 80 | mesh.CreateSubdivisionSchemeAttr().Set("none") 81 | 82 | 83 | def get_geometry_data(geometry): 84 | """ 85 | Get mesh geometry data including normals 86 | """ 87 | 88 | points = [] # List of point positions (point3f[] points) 89 | normals = [] # List of normals (normal3f[] normals) 90 | face_vertex_counts = [] # List of vertex count per face (int[] faceVertexCounts) 91 | face_vertex_indices = [] # List of vertex indices (int[] faceVertexIndices) 92 | 93 | # Collect points and normals 94 | for point in geometry.points(): 95 | position = point.position() 96 | points.append(Gf.Vec3f(position[0], position[1], position[2])) 97 | 98 | # Collect face data 99 | for primitive in geometry.prims(): 100 | vertices = primitive.vertices() 101 | face_vertex_counts.append(len(vertices)) 102 | 103 | for vertex in vertices: 104 | face_vertex_indices.append(vertex.point().number()) 105 | 106 | # Get Normals data 107 | if geometry.findVertexAttrib("N") is not None: 108 | normal = vertex.attribValue("N") 109 | normals.append(Gf.Vec3f(normal[0], normal[1], normal[2])) 110 | 111 | return points, normals, face_vertex_counts, face_vertex_indices 112 | 113 | 114 | def export_materials(stage, geometry, mesh): 115 | 116 | # Get assigned material data and create USD material 117 | material_path = get_material_path(geometry) 118 | material = hou.node(material_path) 119 | material_properties = get_material_properties(material) 120 | usd_material_path = f'/Root/Looks/{material.name()}' 121 | create_usd_material(stage, usd_material_path, material_properties) 122 | 123 | # Bind material to mesh 124 | material_prim = stage.GetPrimAtPath(usd_material_path) 125 | material = UsdShade.Material(material_prim) 126 | UsdShade.MaterialBindingAPI(mesh).Bind(material) 127 | 128 | 129 | def export_geometry(stage, geometry, input_node_name): 130 | 131 | # Get Geometry data 132 | points, normals, face_vertex_counts, face_vertex_indices = get_geometry_data(geometry) 133 | # print(f'{points}, {normals}, {face_vertex_counts}, {face_vertex_indices}') 134 | 135 | # Create a USD Mesh primitive and set properties 136 | mesh = UsdGeom.Mesh.Define(stage, f'/Root/Geometry/{input_node_name}') 137 | setup_mesh(mesh, points, normals, face_vertex_counts, face_vertex_indices) 138 | 139 | return mesh 140 | 141 | 142 | def export_usd(): 143 | """ 144 | Create and save a USD file with geometry and normals from the first input. 145 | """ 146 | 147 | # Create a new USD stage 148 | usd_file_path = f'E:/houdini_export_{random.randint(1, 100)}.usda' 149 | stage = Usd.Stage.CreateNew(usd_file_path) 150 | 151 | # Access the input geometry 152 | node = hou.pwd() 153 | geometry = node.geometry() 154 | input_node_name = node.inputs()[0].name() 155 | 156 | # Geometry 157 | mesh = export_geometry(stage, geometry, input_node_name) 158 | 159 | # Materials 160 | export_materials(stage, geometry, mesh) 161 | 162 | # Save the stage 163 | stage.GetRootLayer().Save() 164 | print(f'>> {usd_file_path}') 165 | 166 | 167 | export_usd() 168 | -------------------------------------------------------------------------------- /Eve/tools/usd/maya_export_geometry.py: -------------------------------------------------------------------------------- 1 | """ 2 | Export geometry from Maya scene to USD file 3 | """ 4 | 5 | import random 6 | from pxr import Usd, UsdGeom 7 | import pymel.core as pm 8 | 9 | 10 | def get_geometry_data(mesh): 11 | """ 12 | Get mesh geometry data 13 | """ 14 | 15 | points = [] # World position coordinates (tuples) for each geometry point (point3f[] points) 16 | face_vertex_counts = [] # Number of vertices in each geometry face (int[] faceVertexCounts) 17 | face_vertex_indices = [] # List of geometry vertex indexes (int[] faceVertexIndices) 18 | 19 | # Get vertex data for each face 20 | vertex_index = 0 21 | for face in mesh.faces: 22 | vertex_indexes = [] 23 | for vertex in face.getVertices(): 24 | position = tuple(mesh.vtx[vertex].getPosition(space='world')) 25 | points.append(position) 26 | vertex_indexes.append(vertex_index) 27 | vertex_index += 1 28 | 29 | face_vertex_counts.append(len(vertex_indexes)) 30 | face_vertex_indices.extend(vertex_indexes) 31 | 32 | return points, face_vertex_counts, face_vertex_indices 33 | 34 | 35 | def process_geometry(stage, root_xform): 36 | """ 37 | Iterate over all scene meshes and record them to the USD stage 38 | """ 39 | 40 | for mesh in pm.ls(type='mesh'): 41 | 42 | # Get geometry data 43 | points, face_vertex_counts, face_vertex_indices = get_geometry_data(mesh) 44 | 45 | # Create USD Mesh and record mesh data 46 | usd_mesh = UsdGeom.Mesh.Define(stage, root_xform.GetPath().AppendChild(mesh.getParent().name())) 47 | usd_mesh.GetPointsAttr().Set(points) 48 | usd_mesh.GetFaceVertexCountsAttr().Set(face_vertex_counts) 49 | usd_mesh.GetFaceVertexIndicesAttr().Set(face_vertex_indices) 50 | 51 | 52 | def export_geometry(): 53 | """ 54 | Create USD file and record geometry data 55 | """ 56 | 57 | # Create USD stage 58 | usd_file_path = f'D:/maya_geometry_{random.randint(1, 1000)}.usda' 59 | 60 | # Create USD stage and root object 61 | stage = Usd.Stage.CreateNew(usd_file_path) 62 | root_xform = UsdGeom.Xform.Define(stage, '/') 63 | 64 | process_geometry(stage, root_xform) 65 | 66 | # Save the USD stage to the file 67 | stage.GetRootLayer().Save() 68 | print(f'>> {usd_file_path}') 69 | 70 | 71 | export_geometry() 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Eve: Out of the box Houdini Pipeline 2 | [![](https://live.staticflickr.com/65535/48087908673_fb38ed89fe_o.jpg)](https://live.staticflickr.com/65535/48087908673_fb38ed89fe_o.jpg) 3 | 4 | 5 | ### Introduction 6 | "Eve" is an **out of the box VFX pipeline** for Houdini application on Windows OS. It is a full CG oriented pipeline which can 7 | handle small tasks with just a few shots as well as huge projects like animation feature or TV series. Eve does not 8 | provide any particular solutions for any of CG techniques like modeling, rendering etc, its just allows to structure all 9 | necessary data storage and exchange. In other words, Eve is an **abstract data management tool** for your Houdini projects. 10 | 11 | No matter how you would create your model, Eve will provide [tools](https://github.com/kiryha/Houdini/wiki/tools) 12 | to save the scene, share results for the next pipeline steps, version and publish working files. 13 | 14 | ### How to use Eve 15 | [Install necessary components](https://github.com/kiryha/Houdini/wiki/pipeline-tutorials#installation). 16 | Clone this repository to a local drive and run **Project Manager** tool with `project_manager.bat`. 17 | Select directory to hold the new project under 18 | `Eve` control, enter project name and press "Create New Project" button to build a folder structure with necessary data. 19 | 20 | Create assets and shots in database with **Project Manager** tool and you ar ready to produce the CGI magic with Houdini! 21 | 22 | Project Manager is a system which controls your pipeline data. It serves to replicate basic Shotgun functionality. 23 | 24 | Check [Eve tutorials](https://github.com/kiryha/Houdini/wiki/pipeline-tutorials) for quick start. 25 | 26 | ### Learning database 27 | Attempt to make first steps with Houdini, Programming or Math? In addition to `Eve` specific materials, we have plenty of Houdini tutorials! 28 | 29 | The best places to start with VEX and Python: 30 | - [VEX for artists](https://github.com/kiryha/Houdini/wiki/vex-for-artists) 31 | - [Python for artists](https://github.com/kiryha/Houdini/wiki//python-for-artists) 32 | - [Procedural Geometry and USD](https://github.com/kiryha/Houdini/wiki/pixar-usd-python-api) 33 | 34 | Don't miss [Programming basics](https://github.com/kiryha/Houdini/wiki//programming-basics) if you don't have programming experience! 35 | 36 | Applied Python in Houdini: [Python snippets](https://github.com/kiryha/Houdini/wiki/python-snippets) 37 | Applied VEX: [VEX snippets](https://github.com/kiryha/Houdini/wiki//vex-snippets) 38 | Small solutions as a HIP files: [HIP Examples](https://github.com/kiryha/Houdini/wiki//examples) 39 | 40 | 41 | ### Features: 42 | #### Supported OS: 43 | Windows 44 | 45 | #### Project Manager tool 46 | 47 | Here you can create projects with assets and shots, launch Houdini in a project context. 48 | 49 | [![](https://live.staticflickr.com/65535/50114534717_510ee4905c_o.png)](https://live.staticflickr.com/65535/50114534717_510ee4905c_o.png) 50 | 51 | #### File paths management system for all Eve files 52 | This module can create or read string file paths for any possible Eve file types. 53 | E.g. `D:/PROJECTS/Inception/PROD/3D/scenes/SHOTS/RENDER/cafe/destruction/destruction_001.hip` 54 | 55 | You need to have Python 2.7 with PySide2 in C:/Python27. 56 | [Get Python with PySide2](https://drive.google.com/open?id=1jC4x2-Dcf5saixe9Z5aBu-kIMMaGEmtJ) 57 | 58 | ### Learning database 59 | Attempt to make first steps with Houdini, Programming or Math? In addition to `Eve` specific materials, we have plenty of Houdini tutorials! 60 | 61 | The best places to start with VEX and Python: 62 | - [VEX for artists](https://github.com/kiryha/Houdini/wiki/vex-for-artists) 63 | - [Python for artists](https://github.com/kiryha/Houdini/wiki//python-for-artists) 64 | 65 | Don't miss [Programming basics](https://github.com/kiryha/Houdini/wiki//programming-basics) if you don't have programming experience! 66 | 67 | Applied Python in Houdini: [Python snippets](https://github.com/kiryha/Houdini/wiki/python-snippets) 68 | Applied VEX: [VEX snippets](https://github.com/kiryha/Houdini/wiki//vex-snippets) 69 | Small solutions as a HIP files: [HIP Examples](https://github.com/kiryha/Houdini/wiki//examples) 70 | 71 | ### Release structure for Eve: 72 | 73 | - Eve (root pipeline folder) 74 | - project_manager.bat 75 | - data (database file) 76 | - tools (pipeline tools) 77 | - core (common modules) 78 | - houdini (houdini tools) 79 | - nuke (nuke tools) 80 | - pm (Project Manager) 81 | 82 | 83 | Download release, extract to the temp folder, copy Eve folder from Eve-0.0 to the network drive. 84 | 85 | ### History 86 | "Eve" is an evolution of my VFX pipeline [Animation DNA](https://github.com/kiryha/AnimationDNA/wiki) used to 87 | create our [first Ukrainian 3D Animation film](https://www.imdb.com/title/tt5954304/). The core logic remains the same, 88 | I just switch from Maya to Houdini. The developing was done during personal project creation, [The Beauty](https://vimeo.com/343421950) music video: 89 | 90 | [![](https://live.staticflickr.com/65535/48093904051_82f1509e49_o.jpg)](https://live.staticflickr.com/65535/48093904051_82f1509e49_o.jpg) 91 | 92 | After finishing "The Beauty" Eve were restructured so the Project manager tool now drives all projects and Eve settings. --------------------------------------------------------------------------------