29 #define _unused(x) ((void)(x)) 33 #include "SUAPI-CppWrapper/model/Entities.hpp" 35 #include "SUAPI-CppWrapper/model/GeometryInput.hpp" 36 #include "SUAPI-CppWrapper/model/Vertex.hpp" 37 #include "SUAPI-CppWrapper/model/Loop.hpp" 38 #include "SUAPI-CppWrapper/Transformation.hpp" 39 #include "SUAPI-CppWrapper/model/ComponentDefinition.hpp" 40 #include "SUAPI-CppWrapper/model/ComponentInstance.hpp" 41 #include "SUAPI-CppWrapper/model/Group.hpp" 42 #include "SUAPI-CppWrapper/model/Face.hpp" 43 #include "SUAPI-CppWrapper/model/Edge.hpp" 44 #include "SUAPI-CppWrapper/model/Model.hpp" 45 #include "SUAPI-CppWrapper/model/Material.hpp" 56 m_entities(SU_INVALID),
61 std::vector<Face> Entities::faces()
const {
62 if (!SUIsValid(m_entities)) {
63 throw std::logic_error(
"CW::Entities::faces(): Entities is null");
66 SUResult res = SUEntitiesGetNumFaces(m_entities, &count);
67 assert(res == SU_ERROR_NONE);
69 return std::vector<Face>(0);
71 std::vector<SUFaceRef> face_refs(count, SU_INVALID);
72 res = SUEntitiesGetFaces(m_entities, count, face_refs.data(), &count);
73 assert(res == SU_ERROR_NONE); _unused(res);
74 std::vector<Face> faces(count);
75 std::transform(face_refs.begin(), face_refs.end(), faces.begin(),
76 [](
const SUFaceRef& value) {
83 std::vector<Edge> Entities::edges(
bool stray_only)
const {
84 if (!SUIsValid(m_entities)) {
85 throw std::logic_error(
"CW::Entities::edges(): Entities is null");
88 SUResult res = SUEntitiesGetNumEdges(m_entities, stray_only, &count);
89 assert(res == SU_ERROR_NONE);
91 return std::vector<Edge>(0);
93 std::vector<SUEdgeRef> edge_refs(count, SU_INVALID);
94 res = SUEntitiesGetEdges(m_entities, stray_only, count, edge_refs.data(), &count);
95 assert(res == SU_ERROR_NONE); _unused(res);
96 std::vector<Edge> edges(count);
97 std::transform(edge_refs.begin(), edge_refs.end(), edges.begin(),
98 [](
const SUEdgeRef& value) {
105 std::vector<ComponentInstance> Entities::instances()
const {
106 if (!SUIsValid(m_entities)) {
107 throw std::logic_error(
"CW::Entities::instances(): Entities is null");
110 SUResult res = SUEntitiesGetNumInstances(m_entities, &count);
111 assert(res == SU_ERROR_NONE);
113 return std::vector<ComponentInstance>{};
115 std::vector<SUComponentInstanceRef> instance_refs(count, SU_INVALID);
116 res = SUEntitiesGetInstances(m_entities, count, instance_refs.data(), &count);
117 assert(res == SU_ERROR_NONE); _unused(res);
118 std::vector<ComponentInstance> instances(count);
119 std::transform(instance_refs.begin(), instance_refs.end(), instances.begin(),
120 [](
const SUComponentInstanceRef& value) {
127 std::vector<Group> Entities::groups()
const {
128 if (!SUIsValid(m_entities)) {
129 throw std::logic_error(
"CW::Entities::groups(): Entities is null");
132 SUResult res = SUEntitiesGetNumGroups(m_entities, &count);
133 assert(res == SU_ERROR_NONE);
135 return std::vector<Group>(0);
137 std::vector<SUGroupRef> group_refs(count);
138 res = SUEntitiesGetGroups(m_entities, count, &group_refs[0], &count);
139 assert(res == SU_ERROR_NONE); _unused(res);
140 std::vector<Group> groups;
141 groups.reserve(count);
142 for (
size_t i=0; i < group_refs.size(); ++i) {
143 groups.push_back(
Group(group_refs[i],
true));
150 if (!SUIsValid(m_entities)) {
151 throw std::logic_error(
"CW::Entities::groups(): Entities is null");
153 SUBoundingBox3D box = SU_INVALID;
154 SUResult res = SUEntitiesGetBoundingBox(m_entities, &box);
155 assert(res == SU_ERROR_NONE); _unused(res);
161 if (!SUIsValid(m_entities)) {
162 throw std::logic_error(
"CW::Entities::size(): Entities is null");
164 size_t total_count = 0;
166 SUResult res = SUEntitiesGetNumFaces(m_entities, &count);
167 assert(res == SU_ERROR_NONE);
168 total_count += count;
170 res = SUEntitiesGetNumEdges(m_entities,
true, &count);
171 assert(res == SU_ERROR_NONE);
172 total_count += count;
174 res = SUEntitiesGetNumInstances(m_entities, &count);
175 assert(res == SU_ERROR_NONE);
176 total_count += count;
178 res = SUEntitiesGetNumGroups(m_entities, &count);
179 assert(res == SU_ERROR_NONE); _unused(res);
180 total_count += count;
186 if (!SUIsValid(m_entities) || !SUIsValid(other.m_entities)) {
187 throw std::logic_error(
"CW::Entities::add(): Entities is null");
190 geom_input.add_faces(other.faces());
191 geom_input.add_edges(other.edges());
192 this->
fill(geom_input);
193 std::vector<ComponentInstance> instances = other.instances();
194 for (
size_t i=0; i < instances.size(); ++i) {
195 this->add_instance(instances[i].definition(), instances[i].transformation(), instances[i].name());
197 std::vector<Group> other_groups = other.groups();
198 for (
size_t i=0; i < other_groups.size(); ++i) {
199 Group new_group = this->add_group();
200 new_group.
entities().
add(other_groups[i].entities());
202 new_group.
name(other_groups[i].name());
210 if (!SUIsValid(m_entities)) {
211 throw std::logic_error(
"CW::Entities::fill(): Entities is null");
214 if (geom_input.
empty()) {
215 return SU_ERROR_NONE;
219 size_t num_faces_before = 0;
220 SUResult res = SUEntitiesGetNumFaces(m_entities, &num_faces_before);
221 assert(res == SU_ERROR_NONE); _unused(res);
223 SUResult fill_res = SUEntitiesFill(m_entities, geom_input.m_geometry_input,
true);
224 assert(fill_res == SU_ERROR_NONE); _unused(fill_res);
267 std::vector<Face> Entities::add_faces(std::vector<Face>& faces) {
268 if (!SUIsValid(m_entities)) {
269 throw std::logic_error(
"CW::Entities::add_faces(): Entities is null");
271 std::vector<SUFaceRef> refs(faces.size(), SU_INVALID);
272 std::transform(faces.begin(), faces.end(), refs.begin(), [](
const CW::Face& face) {
return face.ref(); });
274 SUResult res = SUEntitiesAddFaces(m_entities, refs.size(), refs.data());
275 assert(res == SU_ERROR_NONE); _unused(res);
278 for (
auto& face : faces)
284 std::vector<Edge> Entities::add_edges(std::vector<Edge>& edges) {
285 if (!SUIsValid(m_entities)) {
286 throw std::logic_error(
"CW::Entities::add_edges(): Entities is null");
288 std::vector<SUEdgeRef> refs(edges.size(), SU_INVALID);
289 std::transform(edges.begin(), edges.end(), refs.begin(), [](
const CW::Edge& edge) {
return edge.ref(); });
291 SUResult res = SUEntitiesAddEdges(m_entities, refs.size(), refs.data());
292 assert(res == SU_ERROR_NONE); _unused(res);
295 for (
auto& edge : edges)
302 Edge Entities::add_edge(
Edge& edge) {
303 if (!SUIsValid(m_entities)) {
304 throw std::logic_error(
"CW::Entities::add_edge(): Entities is null");
306 SUEdgeRef edge_ref = edge.
ref();
307 SUResult res = SUEntitiesAddEdges(m_entities, 1, &edge_ref);
308 assert(res == SU_ERROR_NONE); _unused(res);
315 if (!SUIsValid(m_entities)) {
316 throw std::logic_error(
"CW::Entities::add_instance(): Entities is null");
319 throw std::invalid_argument(
"CW::Entities::add_instance(): ComponentInstance argument is invalid");
321 SUResult res = SUEntitiesAddInstance(m_entities, instance,
nullptr);
322 assert(res == SU_ERROR_NONE); _unused(res);
328 if (!SUIsValid(m_entities)) {
329 throw std::logic_error(
"CW::Entities::add_instance(): Entities is null");
332 throw std::invalid_argument(
"CW::Entities::add_instance(): ComponentDefinition argument is invalid");
334 SUComponentInstanceRef instance = SU_INVALID;
335 SUResult res = SUComponentDefinitionCreateInstance(definition.
ref(), &instance);
336 assert(res == SU_ERROR_NONE);
337 SUTransformation transform = transformation.ref();
338 res = SUComponentInstanceSetTransform(instance, &transform);
339 assert(res == SU_ERROR_NONE);
341 res = SUEntitiesAddInstance(m_entities, instance, NULL);
344 SUStringRef name_ref = name.ref();
345 res = SUEntitiesAddInstance(m_entities, instance, &name_ref);
347 assert(res == SU_ERROR_NONE); _unused(res);
355 if (!SUIsValid(m_entities)) {
356 throw std::logic_error(
"CW::Entities::add_group(): Entities is null");
359 throw std::invalid_argument(
"CW::Entities::add_group(): ComponentDefinition argument is invalid");
362 throw std::invalid_argument(
"CW::Entities::add_group(): ComponentDefinition given is not a group");
365 Group new_group = this->add_group();
370 std::vector<Face> def_faces = def_entities.faces();
371 for (
size_t i=0; i < def_faces.size(); ++i) {
374 std::vector<Edge> def_edges = def_entities.edges(
true);
375 for (
size_t i=0; i < def_edges.size(); ++i) {
376 group_entities.add_edge(def_edges[i]);
378 group_entities.
fill(geom_input);
380 std::vector<Group> def_groups = def_entities.groups();
381 for (
size_t i=0; i < def_groups.size(); ++i) {
382 group_entities.add_group(def_groups[i].definition() , def_groups[i].transformation());
384 std::vector<ComponentInstance> def_instances = def_entities.instances();
385 for (
size_t i=0; i < def_instances.size(); ++i) {
386 group_entities.add_instance(def_instances[i].definition(), def_instances[i].transformation());
399 Group Entities::add_group() {
400 if (!SUIsValid(m_entities)) {
401 throw std::logic_error(
"CW::Entities::add_group(): Entities is null");
403 SUGroupRef group = SU_INVALID;
404 SUResult res = SUGroupCreate(&group);
405 assert(res == SU_ERROR_NONE);
407 res = SUEntitiesAddGroup(m_entities, group);
408 assert(res == SU_ERROR_NONE); _unused(res);
414 if (!SUIsValid(m_entities)) {
415 throw std::logic_error(
"CW::Entities::transform_entities(): Entities is null");
417 SUTransformation trans_ref = transform.ref();
418 SUResult res = SUEntitiesTransform(m_entities, elems.size(), elems[0], &trans_ref);
419 assert(res == SU_ERROR_NONE || res == SU_ERROR_GENERIC); _unused(res);
420 if (res == SU_ERROR_UNSUPPORTED) {
421 throw std::invalid_argument(
"CW::Entities::transform_entities(): One of the elements given in the Entity vector is not contained by this Entities object.");
423 else if (SU_ERROR_GENERIC) {
431 if (!SUIsValid(m_entities)) {
432 throw std::logic_error(
"CW::Entities::transform_entities(): Entities is null");
434 if (elems.size() != transforms.size()) {
435 throw std::invalid_argument(
"CW::Entities::transform_entities(): different number of elements to transformation objects given - the same number must be given.");
437 assert(elems.size() == transforms.size());
438 SUResult res = SUEntitiesTransformMultiple(m_entities, elems.size(), elems[0], transforms[0]);
439 if (res == SU_ERROR_UNSUPPORTED) {
440 throw std::invalid_argument(
"CW::Entities::transform_entities(): One of the elements given in the Entity vector is not contained by this Entities object.");
442 else if (SU_ERROR_GENERIC) {
450 if (SUIsInvalid(m_model)) {
453 return Model(m_model,
false);
457 Entities::operator SUEntitiesRef() {
SUComponentDefinitionRef ref() const
bool transform_entities(std::vector< Entity > &elems, const Transformation &transform)
bool attached() const
Returns true if the entity is attached to another object.
SUResult fill(GeometryInput &geom_input)
Entities entities() const
Transformation transformation() const
BoundingBox3D bounding_box() const
void add(const Entities &other)
Entities entities() const