From 2ccf5954d4a8802f4a95986a4e34c2c5120639b9 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Tue, 11 Oct 2016 23:46:42 +0700 Subject: [PATCH] Allow creating n-dimensional arrays with translate and rotate groups. Before this commit, a translate group based on another translate group would always use the "union" boolean operation, which does not work at all if one wants an array with a difference operation, and results in degraded performance if one wants an array with an assemble operation. --- CHANGELOG.md | 2 ++ src/group.cpp | 6 ++++++ test/CMakeLists.txt | 1 + test/group/translate_nd/normal.png | Bin 0 -> 4983 bytes test/group/translate_nd/normal.slvs | Bin 0 -> 283298 bytes test/group/translate_nd/test.cpp | 7 +++++++ 6 files changed, 16 insertions(+) create mode 100644 test/group/translate_nd/normal.png create mode 100644 test/group/translate_nd/normal.slvs create mode 100644 test/group/translate_nd/test.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index fce70d0..c828b14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ Changelog New sketch features: * Extrude, lathe, translate and rotate groups can now use the "assembly" boolean operation, to increase performance. + * Translate and rotate groups can create n-dimensional arrays using + the "difference" and "assembly" boolean operations. New export/import features: * Three.js: allow configuring projection for exported model, and initially diff --git a/src/group.cpp b/src/group.cpp index b1206e5..f459dd4 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -471,6 +471,9 @@ void Group::Generate(IdList *entity, } case Type::TRANSLATE: { + // inherit meshCombine from source group + Group *srcg = SK.GetGroup(opA); + meshCombine = srcg->meshCombine; // The translation vector AddParam(param, h.param(0), gp.x); AddParam(param, h.param(1), gp.y); @@ -498,6 +501,9 @@ void Group::Generate(IdList *entity, return; } case Type::ROTATE: { + // inherit meshCombine from source group + Group *srcg = SK.GetGroup(opA); + meshCombine = srcg->meshCombine; // The center of rotation AddParam(param, h.param(0), gc.x); AddParam(param, h.param(1), gc.y); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 97f374d..081477a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -54,6 +54,7 @@ set(testsuite_SOURCES request/line_segment/test.cpp request/ttf_text/test.cpp group/translate_asy/test.cpp + group/translate_nd/test.cpp ) add_executable(solvespace_testsuite diff --git a/test/group/translate_nd/normal.png b/test/group/translate_nd/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5ee2c74ccb18e3990e448ba91446e4f0d2cfcc GIT binary patch literal 4983 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 OyC6sKgKR<0uKx+3D(*`F literal 0 HcmV?d00001 diff --git a/test/group/translate_nd/test.cpp b/test/group/translate_nd/test.cpp new file mode 100644 index 0000000..ccea849 --- /dev/null +++ b/test/group/translate_nd/test.cpp @@ -0,0 +1,7 @@ +#include "harness.h" + +TEST_CASE(normal_roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +}