1+ using DeveMazeGeneratorCore . Coaster3MF . Models ;
2+
13namespace DeveMazeGeneratorCore . Coaster3MF
24{
35 public static class BambuStudioMetadata
46 {
57 public static string ContentTypes => """
68 <?xml version="1.0" encoding="UTF-8"?>
79 <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
8- <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
9- <Default Extension="model" ContentType="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"/>
10- <Default Extension="png" ContentType="image/png"/>
11- <Default Extension="gcode" ContentType="text/x.gcode"/>
10+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
11+ <Default Extension="model" ContentType="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"/>
12+ <Default Extension="png" ContentType="image/png"/>
13+ <Default Extension="gcode" ContentType="text/x.gcode"/>
1214 </Types>
1315 """ ;
1416
1517 public static string RootRelationships => """
1618 <?xml version="1.0" encoding="UTF-8"?>
1719 <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
18- <Relationship Target="/3D/3dmodel.model" Id="rel-1" Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel"/>
19- <Relationship Target="/Metadata/plate_1.png" Id="rel-2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"/>
20- <Relationship Target="/Metadata/plate_1.png" Id="rel-4" Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-middle"/>
21- <Relationship Target="/Metadata/plate_1_small.png" Id="rel-5" Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-small"/>
20+ <Relationship Target="/3D/3dmodel.model" Id="rel-1" Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel"/>
21+ <Relationship Target="/Metadata/plate_1.png" Id="rel-2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"/>
22+ <Relationship Target="/Metadata/plate_1.png" Id="rel-4" Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-middle"/>
23+ <Relationship Target="/Metadata/plate_1_small.png" Id="rel-5" Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-small"/>
2224 </Relationships>
2325 """ ;
2426
25- public static string ModelRelationships => """
26- <?xml version="1.0" encoding="UTF-8"?>
27- <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
28- <Relationship Target="/3D/Objects/object_1. model" Id="rel-1 " Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel"/>
29- </Relationships>
30- """ ;
27+ public static string GetSingleModelRelationShip ( ThreeMFModel model )
28+ {
29+ return $ """
30+ <Relationship Target="/3D/Objects/object_ { model . ModelId } . model" Id="rel-{ model . ModelId } " Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel"/>
31+ """ ;
32+ }
3133
32- public static string CutInformation => """
33- <?xml version="1.0" encoding="utf-8"?>
34- <objects>
35- <object id="1">
36- <cut_id id="0" check_sum="1" connectors_cnt="0"/>
37- </object>
38- </objects>
39- """ ;
34+ public static string GetModelRelationships ( List < ThreeMFPlate > plates )
35+ {
36+ return $ """
37+ <?xml version="1.0" encoding="UTF-8"?>
38+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
39+ { string . Join ( Environment . NewLine , plates . SelectMany ( p => p . Models ) . Select ( m => GetSingleModelRelationShip ( m ) ) ) }
40+ </Relationships>
41+ """ ;
42+ }
43+
44+ public static string GetSingleCutRelationship ( ThreeMFModel model )
45+ {
46+ return $ """
47+ <object id="{ model . ModelId } ">
48+ <cut_id id="0" check_sum="1" connectors_cnt="0"/>
49+ </object>
50+ """ ;
51+ }
52+
53+ public static string GetCutInformation ( List < ThreeMFPlate > plates )
54+ {
55+ return $ """
56+ <?xml version="1.0" encoding="utf-8"?>
57+ <objects>
58+ { string . Join ( Environment . NewLine , plates . SelectMany ( p => p . Models ) . Select ( m => GetSingleCutRelationship ( m ) ) ) }
59+ </objects>
60+ """ ;
61+ }
4062
4163 public static string SliceInfo => """
4264 <?xml version="1.0" encoding="UTF-8"?>
@@ -46,18 +68,47 @@ public static class BambuStudioMetadata
4668 <header_item key="X-BBL-Client-Version" value="02.01.01.52"/>
4769 </header>
4870 </config>
71+
4972 """ ;
5073
51- public static string GetModelSettings ( int faceCount )
74+
75+ private static string GetThreeMFPlateModelInstance ( int objectId )
5276 {
5377 return $ """
54- <?xml version="1.0" encoding="UTF-8"?>
55- <config>
56- <object id="2">
78+ <model_instance>
79+ <metadata key="object_id" value="{ objectId } "/>
80+ <metadata key="instance_id" value="0"/>
81+ <metadata key="identify_id" value="{ objectId + 100 } "/>
82+ </model_instance>
83+ """ ;
84+ }
85+
86+ public static string GetThreeMFPlate ( int plateId , IEnumerable < int > objectIds )
87+ {
88+ return $ """
89+ <plate>
90+ <metadata key="plater_id" value="{ plateId } "/>
91+ <metadata key="plater_name" value=""/>
92+ <metadata key="locked" value="false"/>
93+ <metadata key="filament_map_mode" value="Auto For Flush"/>
94+ <metadata key="filament_maps" value="1 1 1 1"/>
95+ <metadata key="thumbnail_file" value="Metadata/plate_1.png"/>
96+ <metadata key="thumbnail_no_light_file" value="Metadata/plate_no_light_1.png"/>
97+ <metadata key="top_file" value="Metadata/top_1.png"/>
98+ <metadata key="pick_file" value="Metadata/pick_1.png"/>
99+ { string . Join ( Environment . NewLine , objectIds . Select ( id => GetThreeMFPlateModelInstance ( id ) ) ) }
100+ </plate>
101+ """ ;
102+ }
103+
104+ public static string GetThreeMFObject ( ThreeMFModel model )
105+ {
106+ return $ """
107+ <object id="{ model . ObjectId } ">
57108 <metadata key="name" value="Maze_Coaster"/>
58109 <metadata key="extruder" value="1"/>
59- <metadata key=" face_count" value ="{ faceCount } "/>
60- <part id="1 " subtype="normal_part">
110+ <metadata face_count="{ model . MeshData . Triangles . Count / 2 } "/>
111+ <part id="{ model . PartId } " subtype="normal_part">
61112 <metadata key="name" value="Maze_Coaster"/>
62113 <metadata key="matrix" value="1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"/>
63114 <metadata key="source_file" value="maze_coaster.3mf"/>
@@ -66,33 +117,36 @@ public static string GetModelSettings(int faceCount)
66117 <metadata key="source_offset_x" value="9.5"/>
67118 <metadata key="source_offset_y" value="9.5"/>
68119 <metadata key="source_offset_z" value="2.5"/>
69- <mesh_stat face_count="{ faceCount } " edges_fixed="0" degenerate_facets="0" facets_removed="0" facets_reversed="0" backwards_edges="0"/>
120+ <mesh_stat face_count="{ model . MeshData . Triangles . Count / 2 } " edges_fixed="0" degenerate_facets="0" facets_removed="0" facets_reversed="0" backwards_edges="0"/>
70121 </part>
71122 </object>
72- <plate>
73- <metadata key="plater_id" value="1"/>
74- <metadata key="plater_name" value=""/>
75- <metadata key="locked" value="false"/>
76- <metadata key="filament_map_mode" value="Auto For Flush"/>
77- <metadata key="thumbnail_file" value="Metadata/plate_1.png"/>
78- <metadata key="thumbnail_no_light_file" value="Metadata/plate_no_light_1.png"/>
79- <metadata key="top_file" value="Metadata/top_1.png"/>
80- <metadata key="pick_file" value="Metadata/pick_1.png"/>
81- <model_instance>
82- <metadata key="object_id" value="2"/>
83- <metadata key="instance_id" value="0"/>
84- <metadata key="identify_id" value="84"/>
85- </model_instance>
86- </plate>
123+ """ ;
124+ }
125+
126+ public static string GetAssembleItem ( int objectId )
127+ {
128+ return $ """
129+ <assemble_item object_id="{ objectId } " instance_id="0" transform="1 0 0 0 1 0 0 0 1 0 0 0" offset="0 0 0" />
130+ """ ;
131+ }
132+
133+ public static string GetModelSettings ( List < ThreeMFPlate > plates )
134+ {
135+ return $ """
136+ <?xml version="1.0" encoding="UTF-8"?>
137+ <config>
138+ { string . Join ( Environment . NewLine , plates . SelectMany ( t => t . Models ) . Select ( m => GetThreeMFObject ( m ) ) ) }
139+ { string . Join ( Environment . NewLine , plates . Select ( p => GetThreeMFPlate ( p . PlateId , p . Models . Select ( t => t . ObjectId ) ) ) ) }
87140 <assemble>
88- <assemble_item object_id="2" instance_id="0" transform="1 0 0 0 1 0 0 0 1 0 0 0" offset="0 0 0"/>
141+ { string . Join ( Environment . NewLine , plates . SelectMany ( p => p . Models ) . Select ( m => GetAssembleItem ( m . ObjectId ) ) ) }
89142 </assemble>
90143 </config>
144+
91145 """ ;
92146 }
93147
94148 public static string ProjectSettings => """
95- {
149+ {
96150 "accel_to_decel_enable": "0",
97151 "accel_to_decel_factor": "50%",
98152 "activate_air_filtration": [
0 commit comments