Skip to content

Commit ac5a4fe

Browse files
committed
Store hidden parts in ViewOptions
1 parent bc0210a commit ac5a4fe

File tree

5 files changed

+63
-53
lines changed

5 files changed

+63
-53
lines changed

Cadova Viewer/Document/Document.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class Document: NSDocument, NSWindowDelegate {
6060
override func restoreState(with coder: NSCoder) {
6161
super.restoreState(with: coder)
6262
if let data = coder.decodeObject(forKey: Self.viewOptionsKey) as? Data,
63-
let viewOptions = try? JSONDecoder().decode(ViewportController.ViewOptions.self, from: data)
63+
let viewOptions = try? JSONDecoder().decode(ViewOptions.self, from: data)
6464
{
6565
documentHostingController?.viewportController.setViewOptions(viewOptions)
6666
}

Cadova Viewer/Preferences/Preferences.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Preferences: ObservableObject {
3939
set { self[Self.navLibWhitelistedAppsDataKey] = newValue }
4040
}
4141

42-
var viewOptions: ViewportController.ViewOptions {
42+
var viewOptions: ViewOptions {
4343
get { self[Self.viewOptionsDataKey] ?? .init() }
4444
set { self[Self.viewOptionsDataKey] = newValue }
4545
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Foundation
2+
import SceneKit
3+
4+
struct ViewOptions: Codable {
5+
var showGrid = true
6+
var showOrigin = true
7+
var showCoordinateSystemIndicator = true
8+
var edgeVisibility: EdgeVisibility = .sharp
9+
var cameraTransform: SCNMatrix4 = SCNMatrix4Identity
10+
var hiddenPartIDs: Set<ModelData.Part.ID> = []
11+
12+
enum CodingKeys: String, CodingKey {
13+
case showGrid
14+
case showOrigin
15+
case showCoordinateSystemIndicator
16+
case cameraTransform
17+
case edgeVisibility
18+
case hiddenPartIDs
19+
}
20+
21+
init() {}
22+
23+
init(from decoder: any Decoder) throws {
24+
let container = try decoder.container(keyedBy: CodingKeys.self)
25+
showGrid = try container.decode(Bool.self, forKey: .showGrid)
26+
showOrigin = try container.decode(Bool.self, forKey: .showOrigin)
27+
showCoordinateSystemIndicator = try container.decode(Bool.self, forKey: .showCoordinateSystemIndicator)
28+
cameraTransform = try container.decode(SCNMatrix4.CodingWrapper.self, forKey: .cameraTransform).scnMatrix4
29+
edgeVisibility = (try? container.decode(EdgeVisibility.self, forKey: .edgeVisibility)) ?? .sharp
30+
hiddenPartIDs = try container.decode(Set<ModelData.Part.ID>.self, forKey: .hiddenPartIDs)
31+
}
32+
33+
func encode(to encoder: any Encoder) throws {
34+
var container = encoder.container(keyedBy: CodingKeys.self)
35+
try container.encode(showGrid, forKey: .showGrid)
36+
try container.encode(showOrigin, forKey: .showOrigin)
37+
try container.encode(showCoordinateSystemIndicator, forKey: .showCoordinateSystemIndicator)
38+
try container.encode(SCNMatrix4.CodingWrapper(cameraTransform), forKey: .cameraTransform)
39+
try container.encode(edgeVisibility, forKey: .edgeVisibility)
40+
try container.encode(hiddenPartIDs, forKey: .hiddenPartIDs)
41+
}
42+
43+
enum EdgeVisibility: String, Codable {
44+
case none
45+
case sharp
46+
case all
47+
}
48+
}

Cadova Viewer/Viewport/ViewportController+Parts.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ extension ViewportController {
1515
}
1616
}
1717

18+
var hiddenPartIDs: Set<ModelData.Part.ID> {
19+
get { viewOptions.hiddenPartIDs }
20+
set { viewOptions.hiddenPartIDs = newValue }
21+
}
22+
1823
var visibleParts: Set<ModelData.Part.ID> {
1924
get {
2025
Set(sceneController.parts.map(\.id)).subtracting(hiddenPartIDs)
@@ -42,10 +47,10 @@ extension ViewportController {
4247
if oldValue != nil {
4348
highlightNode?.removeFromParentNode()
4449
highlightNode = nil
45-
updatePartNodeVisibility()
50+
updatePartNodeVisibility(viewOptions.hiddenPartIDs)
4651
}
4752
if let highlightedPartID, let part = part(withID: highlightedPartID) {
48-
updatePartNodeVisibility()
53+
updatePartNodeVisibility(viewOptions.hiddenPartIDs)
4954

5055
let clone = part.nodes.model.clone()
5156
clone.opacity = 1
@@ -82,7 +87,7 @@ extension ViewportController {
8287
}
8388
}
8489

85-
func updatePartNodeVisibility() {
90+
func updatePartNodeVisibility(_ hiddenPartIDs: Set<ModelData.Part.ID>) {
8691
for part in sceneController.parts {
8792
let visibility = hiddenPartIDs.contains(part.id) == false && highlightedPartID != part.id
8893
part.nodes.model.setVisible(visibility, forViewportID: categoryID)

Cadova Viewer/Viewport/ViewportController.swift

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,6 @@ class ViewportController: NSObject, ObservableObject, SCNSceneRendererDelegate {
3636
didSet { updateCameraProjection() }
3737
}
3838

39-
// Parts
40-
@Published var hiddenPartIDs: Set<ModelData.Part.ID> = [] {
41-
didSet { updatePartNodeVisibility() }
42-
}
43-
4439
@Published var highlightedPartID: ModelData.Part.ID? {
4540
didSet { updateHighlightedPart(oldID: oldValue, newID: highlightedPartID) }
4641
}
@@ -135,13 +130,16 @@ class ViewportController: NSObject, ObservableObject, SCNSceneRendererDelegate {
135130

136131
grid.updateBounds(geometry: sceneController.modelContainer)
137132
setEdgeVisibilityInParts(viewOptions.edgeVisibility)
133+
updatePartNodeVisibility(viewOptions.hiddenPartIDs)
134+
objectWillChange.send()
138135
}.store(in: &observers)
139136

140137
$viewOptions.sink { [weak self] viewOptions in
141138
guard let self else { return }
142139
setEdgeVisibilityInParts(viewOptions.edgeVisibility)
143140
grid.showGrid = viewOptions.showGrid
144141
grid.showOrigin = viewOptions.showOrigin
142+
updatePartNodeVisibility(viewOptions.hiddenPartIDs)
145143
}.store(in: &observers)
146144

147145
cameraNodeChanged(cameraNode)
@@ -282,10 +280,11 @@ class ViewportController: NSObject, ObservableObject, SCNSceneRendererDelegate {
282280
self.viewOptions = viewOptions
283281
grid.showGrid = viewOptions.showGrid
284282
grid.showOrigin = viewOptions.showOrigin
285-
Preferences().viewOptions = viewOptions
286283
cameraNode.transform = viewOptions.cameraTransform
287284
setEdgeVisibilityInParts(viewOptions.edgeVisibility)
285+
updatePartNodeVisibility(viewOptions.hiddenPartIDs)
288286
hasSetInitialView = true
287+
Preferences().viewOptions = viewOptions
289288
}
290289

291290
func showSceneKitRenderingOptions() {
@@ -300,46 +299,4 @@ class ViewportController: NSObject, ObservableObject, SCNSceneRendererDelegate {
300299
case orthographic
301300
case perspective
302301
}
303-
304-
struct ViewOptions: Codable {
305-
var showGrid = true
306-
var showOrigin = true
307-
var showCoordinateSystemIndicator = true
308-
var edgeVisibility: EdgeVisibility = .sharp
309-
var cameraTransform: SCNMatrix4 = SCNMatrix4Identity
310-
311-
enum CodingKeys: String, CodingKey {
312-
case showGrid
313-
case showOrigin
314-
case showCoordinateSystemIndicator
315-
case cameraTransform
316-
case edgeVisibility
317-
}
318-
319-
init() {}
320-
321-
init(from decoder: any Decoder) throws {
322-
let container = try decoder.container(keyedBy: CodingKeys.self)
323-
showGrid = try container.decode(Bool.self, forKey: .showGrid)
324-
showOrigin = try container.decode(Bool.self, forKey: .showOrigin)
325-
showCoordinateSystemIndicator = try container.decode(Bool.self, forKey: .showCoordinateSystemIndicator)
326-
cameraTransform = try container.decode(SCNMatrix4.CodingWrapper.self, forKey: .cameraTransform).scnMatrix4
327-
edgeVisibility = (try? container.decode(EdgeVisibility.self, forKey: .edgeVisibility)) ?? .sharp
328-
}
329-
330-
func encode(to encoder: any Encoder) throws {
331-
var container = encoder.container(keyedBy: CodingKeys.self)
332-
try container.encode(showGrid, forKey: .showGrid)
333-
try container.encode(showOrigin, forKey: .showOrigin)
334-
try container.encode(showCoordinateSystemIndicator, forKey: .showCoordinateSystemIndicator)
335-
try container.encode(SCNMatrix4.CodingWrapper(cameraTransform), forKey: .cameraTransform)
336-
try container.encode(edgeVisibility, forKey: .edgeVisibility)
337-
}
338-
339-
enum EdgeVisibility: String, Codable {
340-
case none
341-
case sharp
342-
case all
343-
}
344-
}
345302
}

0 commit comments

Comments
 (0)