@@ -95,19 +95,8 @@ public struct Model: Sendable {
9595 let directives = inheritedEnvironment. whileCurrent {
9696 self . directives ( )
9797 }
98- let localOptions : ModelOptions = [
99- . init( ModelName ( name: name) ) ,
100- inheritedOptions ?? [ ] ,
101- options,
102- . init( directives. compactMap ( \. options) )
103- ]
104-
105- var mutatingEnvironment = inheritedEnvironment
106- for builder in directives. compactMap ( \. environment) {
107- builder ( & mutatingEnvironment)
108- }
109- mutatingEnvironment. modelOptions = localOptions
110- let environment = mutatingEnvironment
98+ let options = self . options. adding ( modelName: name, defaults: inheritedOptions, directives: directives)
99+ let environment = inheritedEnvironment. adding ( directives: directives, modelOptions: options)
111100
112101 let baseURL : URL
113102 if let parent = directory {
@@ -116,31 +105,24 @@ public struct Model: Sendable {
116105 baseURL = URL ( expandingFilePath: name)
117106 }
118107
119- let geometries3D = directives. compactMap ( \. geometry3D)
120- let geometries2D = directives. compactMap ( \. geometry2D)
121108 let provider : OutputDataProvider
122109
123110 do {
124- if geometries3D. count > 0 {
125- let promotedFrom2D = geometries2D. map { $0. promotedTo3D ( ) }
126- let result = try await generateResult ( for: Union ( geometries3D + promotedFrom2D) , in: environment, context: context)
127-
128- switch localOptions [ ModelOptions . FileFormat3D. self] {
129- case . threeMF: provider = ThreeMFDataProvider ( result: result, options: localOptions)
130- case . stl: provider = BinarySTLDataProvider ( result: result, options: localOptions)
131- }
132-
133- } else if geometries2D. count > 0 {
134- let result = try await generateResult ( for: Union ( geometries2D) , in: environment, context: context)
135-
136- switch localOptions [ ModelOptions . FileFormat2D. self] {
137- case . threeMF: provider = ThreeMFDataProvider ( result: result. promotedTo3D ( ) , options: localOptions)
138- case . svg: provider = SVGDataProvider ( result: result, options: localOptions)
139- }
140- } else {
141- logger. warning ( " No geometry for model \" \( name) \" " )
142- return nil
111+ let warnings : [ BuildWarning ]
112+ ( provider, warnings) = try await ContinuousClock ( ) . measure {
113+ try await directives. build ( with: options, in: environment, context: context)
114+ } results: { duration, _ in
115+ logger. debug ( " Built geometry node tree in \( duration) " )
116+ }
117+
118+ for warning in warnings {
119+ logger. warning ( " ⚠️ \( warning. description) " )
143120 }
121+
122+ } catch BuildError . noGeometry {
123+ logger. error ( " No geometry for model \" \( name) \" " )
124+ return nil
125+
144126 } catch {
145127 logger. error ( " Cadova caught an error while evaluating model \" \( name) \" : \n 🛑 \( error) \n " )
146128 return nil
@@ -158,21 +140,6 @@ public struct Model: Sendable {
158140
159141 return fileExisted ? nil : url
160142 }
161-
162- private func generateResult< D: Dimensionality > (
163- for geometry: D . Geometry ,
164- in environment: EnvironmentValues ,
165- context: EvaluationContext
166- ) async throws -> BuildResult < D > {
167- let result = try await ContinuousClock ( ) . measure {
168- try await context. buildModelResult ( for: geometry, in: environment)
169- } results: { duration, _ in
170- logger. debug ( " Built geometry node tree in \( duration) " )
171- }
172-
173- result. printWarnings ( modelName: name)
174- return result
175- }
176143}
177144
178145extension Error {
@@ -184,18 +151,3 @@ extension Error {
184151 }
185152 }
186153}
187-
188- fileprivate extension Geometry2D {
189- func promotedTo3D( ) -> any Geometry3D {
190- extruded ( height: 0.001 )
191- }
192- }
193-
194- fileprivate extension BuildResult {
195- func printWarnings( modelName: String ) {
196- if hasOnly {
197- logger. warning ( " ⚠️ Model \" \( modelName) \" uses only() modifier; saving a partial geometry tree " )
198- }
199- elements [ ReferenceState . self] . printWarningsAtTopLevel ( )
200- }
201- }
0 commit comments