29 this->model().objectsById[id] = object.get(); |
29 this->model().objectsById[id] = object.get(); |
30 this->model().append(std::move(object)); |
30 this->model().append(std::move(object)); |
31 return id; |
31 return id; |
32 } |
32 } |
33 |
33 |
|
34 void Model::EditContext::remove(int position) |
|
35 { |
|
36 this->model().remove(position); |
|
37 } |
|
38 |
34 void Model::EditContext::setObjectProperty( |
39 void Model::EditContext::setObjectProperty( |
35 ldraw::Object* object, |
40 ldraw::id_t id, |
36 ldraw::Property property, |
41 ldraw::Property property, |
37 const QVariant& value) |
42 const QVariant& value) |
38 { |
43 { |
39 object->setProperty(property, value); |
44 ldraw::Object* object = this->model().objectAt(id); |
|
45 if (object != nullptr) |
|
46 { |
|
47 object->setProperty(property, value); |
|
48 } |
40 } |
49 } |
41 |
50 |
42 void Model::EditContext::invertObject(ldraw::id_t id) |
51 void Model::EditContext::invertObject(ldraw::id_t id) |
43 { |
52 { |
44 auto it = this->model().objectsById.find(id); |
53 auto it = this->model().objectsById.find(id); |
52 Model& Model::EditContext::model() |
61 Model& Model::EditContext::model() |
53 { |
62 { |
54 return this->storedModel; |
63 return this->storedModel; |
55 } |
64 } |
56 |
65 |
|
66 namespace |
|
67 { |
|
68 using PropertyTriplet = std::tuple<ldraw::Property, ldraw::Property, ldraw::Property>; |
|
69 } |
|
70 |
|
71 static std::array<PropertyTriplet, 2> diagonalToPointProperties(ldraw::Diagonal diagonal) |
|
72 { |
|
73 std::array<PropertyTriplet, 2> result; |
|
74 switch (diagonal) |
|
75 { |
|
76 case ldraw::Diagonal::Diagonal_13: |
|
77 result = { |
|
78 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point3), |
|
79 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point3, ldraw::Property::Point4) |
|
80 }; |
|
81 break; |
|
82 case ldraw::Diagonal::Diagonal_24: |
|
83 result = { |
|
84 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point4), |
|
85 std::make_tuple(ldraw::Property::Point2, ldraw::Property::Point3, ldraw::Property::Point4) |
|
86 }; |
|
87 break; |
|
88 } |
|
89 return result; |
|
90 } |
|
91 |
57 auto ldraw::splitQuadrilateral( |
92 auto ldraw::splitQuadrilateral( |
58 Model::EditContext& editor, |
93 Model::EditContext& editor, |
59 ldraw::quadrilateralid_t quadrilateral_id, |
94 ldraw::quadrilateralid_t quadrilateral_id, |
60 ldraw::QuadrilateralSplit splitType |
95 ldraw::Diagonal splitType |
61 ) -> std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> |
96 ) -> std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> |
62 { |
97 { |
63 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; |
98 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; |
64 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id); |
99 QModelIndex index; |
|
100 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id, &index); |
65 if (quadrilateral != nullptr) |
101 if (quadrilateral != nullptr) |
66 { |
102 { |
67 |
103 Q_ASSERT(index.isValid()); |
|
104 int position = index.row(); |
|
105 editor.remove(position); |
|
106 std::vector<ldraw::triangleid_t> triangles; |
|
107 triangles.reserve(2); |
|
108 const std::array<PropertyTriplet, 2> split = diagonalToPointProperties(splitType); |
|
109 for (const PropertyTriplet& properties : split) |
|
110 { |
|
111 const ldraw::triangleid_t triangle = editor.insert<ldraw::Triangle>( |
|
112 position, |
|
113 quadrilateral->getProperty(std::get<0>(properties)).value<glm::vec3>(), |
|
114 quadrilateral->getProperty(std::get<1>(properties)).value<glm::vec3>(), |
|
115 quadrilateral->getProperty(std::get<2>(properties)).value<glm::vec3>(), |
|
116 ldraw::Color{quadrilateral->getProperty(ldraw::Property::Color).toInt()}); |
|
117 triangles.push_back(triangle); |
|
118 position += 1; |
|
119 } |
|
120 result = {triangles[0], triangles[1]}; |
68 } |
121 } |
69 return result; |
122 return result; |
70 } |
123 } |