mirror of https://github.com/vitalif/openscad
Update offset() parameter handling.
- Rounded offset is now using parameter r - Using delta only or delta with camfer = false creates no chamfer - Using delta with chamfer =true creates chamfer at delta distancemaster
parent
f42dbea817
commit
ad51cadfbd
|
@ -54,7 +54,7 @@ AbstractNode *OffsetModule::instantiate(const Context *ctx, const ModuleInstanti
|
||||||
OffsetNode *node = new OffsetNode(inst);
|
OffsetNode *node = new OffsetNode(inst);
|
||||||
|
|
||||||
AssignmentList args;
|
AssignmentList args;
|
||||||
args += Assignment("delta");
|
args += Assignment("r");
|
||||||
|
|
||||||
Context c(ctx);
|
Context c(ctx);
|
||||||
c.setVariables(args, evalctx);
|
c.setVariables(args, evalctx);
|
||||||
|
@ -64,30 +64,25 @@ AbstractNode *OffsetModule::instantiate(const Context *ctx, const ModuleInstanti
|
||||||
node->fs = c.lookup_variable("$fs")->toDouble();
|
node->fs = c.lookup_variable("$fs")->toDouble();
|
||||||
node->fa = c.lookup_variable("$fa")->toDouble();
|
node->fa = c.lookup_variable("$fa")->toDouble();
|
||||||
|
|
||||||
ValuePtr delta = c.lookup_variable("delta");
|
// default with no argument at all is round / delta = 1
|
||||||
|
// radius takes precedence if both r and delta are given.
|
||||||
node->delta = 1;
|
node->delta = 1;
|
||||||
delta->getDouble(node->delta);
|
node->chamfer = false;
|
||||||
|
node->join_type = ClipperLib::jtRound;
|
||||||
|
const ValuePtr r = c.lookup_variable("r", true);
|
||||||
|
const ValuePtr delta = c.lookup_variable("delta", true);
|
||||||
|
const ValuePtr chamfer = c.lookup_variable("chamfer", true);
|
||||||
|
|
||||||
ValuePtr miter_limit = c.lookup_variable("miter_limit", true);
|
if (r->isDefinedAs(Value::NUMBER)) {
|
||||||
node->miter_limit = 2;
|
r->getDouble(node->delta);
|
||||||
miter_limit->getDouble(node->miter_limit);
|
} else if (delta->isDefinedAs(Value::NUMBER)) {
|
||||||
|
delta->getDouble(node->delta);
|
||||||
ValuePtr join_type = c.lookup_variable("join_type", true);
|
|
||||||
if (join_type->type() == Value::STRING) {
|
node->join_type = ClipperLib::jtMiter;
|
||||||
std::string jt = join_type->toString();
|
if (chamfer->isDefinedAs(Value::BOOL) && chamfer->toBool()) {
|
||||||
if (std::string("bevel") == jt) {
|
node->chamfer = true;
|
||||||
node->join_type = ClipperLib::jtSquare;
|
node->join_type = ClipperLib::jtSquare;
|
||||||
} else if (std::string("round") == jt) {
|
}
|
||||||
node->join_type = ClipperLib::jtRound;
|
|
||||||
} else if (std::string("miter") == jt) {
|
|
||||||
node->join_type = ClipperLib::jtMiter;
|
|
||||||
} else {
|
|
||||||
PRINTB("WARNING: Unknown join_type for offset(): '%s'", jt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((node->join_type != ClipperLib::jtMiter) && !miter_limit->isUndefined()) {
|
|
||||||
PRINTB("WARNING: miter_limit is ignored in offset() for join_type: '%s'", jt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<AbstractNode *> instantiatednodes = inst->instantiateChildren(evalctx);
|
std::vector<AbstractNode *> instantiatednodes = inst->instantiateChildren(evalctx);
|
||||||
|
@ -100,21 +95,17 @@ std::string OffsetNode::toString() const
|
||||||
{
|
{
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
|
|
||||||
stream << this->name()
|
bool isRadius = this->join_type == ClipperLib::jtRound;
|
||||||
<< "(delta = " << std::dec << this->delta
|
const char *var = isRadius ? "(r = " : "(delta = ";
|
||||||
<< ", join_type = \""
|
|
||||||
<< (this->join_type == ClipperLib::jtSquare
|
stream << this->name() << var << std::dec << this->delta;
|
||||||
? "bevel"
|
if (!isRadius) {
|
||||||
: this->join_type == ClipperLib::jtRound
|
stream << ", chamfer = " << (this->chamfer ? "true" : "false");
|
||||||
? "round"
|
|
||||||
: "miter") << "\"";
|
|
||||||
if (this->join_type == ClipperLib::jtMiter) {
|
|
||||||
stream << ", miter_limit = " << this->miter_limit;
|
|
||||||
}
|
}
|
||||||
stream << ", $fn = " << this->fn
|
stream << ", $fn = " << this->fn
|
||||||
<< ", $fa = " << this->fa
|
<< ", $fa = " << this->fa
|
||||||
<< ", $fs = " << this->fs << ")";
|
<< ", $fs = " << this->fs << ")";
|
||||||
|
|
||||||
return stream.str();
|
return stream.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,13 +8,15 @@
|
||||||
class OffsetNode : public AbstractPolyNode
|
class OffsetNode : public AbstractPolyNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OffsetNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi), fn(0), fs(0), fa(0), delta(1), miter_limit(2.0), join_type(ClipperLib::jtMiter) { }
|
OffsetNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi), fn(0), fs(0), fa(0), delta(1), miter_limit(1000000.0), join_type(ClipperLib::jtRound) { }
|
||||||
virtual Response accept(class State &state, Visitor &visitor) const {
|
virtual Response accept(class State &state, Visitor &visitor) const {
|
||||||
return visitor.visit(state, *this);
|
return visitor.visit(state, *this);
|
||||||
}
|
}
|
||||||
virtual std::string toString() const;
|
virtual std::string toString() const;
|
||||||
virtual std::string name() const { return "offset"; }
|
virtual std::string name() const { return "offset"; }
|
||||||
|
|
||||||
double fn, fs, fa, delta, miter_limit;
|
bool chamfer;
|
||||||
|
double fn, fs, fa, delta;
|
||||||
|
double miter_limit; // currently fixed high value to disable chamfers with jtMiter
|
||||||
ClipperLib::JoinType join_type;
|
ClipperLib::JoinType join_type;
|
||||||
};
|
};
|
||||||
|
|
12
src/value.cc
12
src/value.cc
|
@ -130,9 +130,19 @@ Value::ValueType Value::type() const
|
||||||
return static_cast<ValueType>(this->value.which());
|
return static_cast<ValueType>(this->value.which());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Value::isDefined() const
|
||||||
|
{
|
||||||
|
return this->type() != UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Value::isDefinedAs(const ValueType type) const
|
||||||
|
{
|
||||||
|
return this->type() == type;
|
||||||
|
}
|
||||||
|
|
||||||
bool Value::isUndefined() const
|
bool Value::isUndefined() const
|
||||||
{
|
{
|
||||||
return this->type() == UNDEFINED;
|
return !isDefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Value::toBool() const
|
bool Value::toBool() const
|
||||||
|
|
|
@ -117,6 +117,8 @@ public:
|
||||||
~Value() {}
|
~Value() {}
|
||||||
|
|
||||||
ValueType type() const;
|
ValueType type() const;
|
||||||
|
bool isDefined() const;
|
||||||
|
bool isDefinedAs(const ValueType type) const;
|
||||||
bool isUndefined() const;
|
bool isUndefined() const;
|
||||||
|
|
||||||
double toDouble() const;
|
double toDouble() const;
|
||||||
|
|
|
@ -1,46 +1,55 @@
|
||||||
|
module m(x, y) {
|
||||||
module shape1(x, y) {
|
translate(60 * [x, y]) children();
|
||||||
translate([50 * x, 50 * y]) difference() {
|
|
||||||
square([30, 30], center = true);
|
|
||||||
square([8, 8], center = true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module shape2(x, y) {
|
module shape1(w = 20) {
|
||||||
translate([50 * x, 50 * y]) {
|
difference() {
|
||||||
polygon(points=[
|
square([ w, w], center = true);
|
||||||
[-15, 80],[15, 80],[0,-15],[-8, 60],[8, 60],[0, 5]
|
square([10, 10], center = true);
|
||||||
], paths=[
|
}
|
||||||
[0,1,2],[3,4,5]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset(delta = -1, join_type = "miter") shape2(-1, 2);
|
module shape2() {
|
||||||
shape2(0, 2);
|
polygon(points=[
|
||||||
offset(delta = 1, join_type = "miter") shape2(1, 2);
|
[-15, 80],[15, 80],[0,-15],[-8, 60],[8, 60],[0, 5]
|
||||||
|
], paths=[
|
||||||
|
[0,1,2],[3,4,5]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
offset(delta = -1, join_type = "miter", miter_limit = 10) shape2(2, 2);
|
m(-1, 0) shape1();
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 10) shape2(3, 2);
|
m(-1, 2) shape2();
|
||||||
|
|
||||||
offset(delta = -1, join_type = "bevel") shape2(2, -1);
|
m(0, 0) offset() shape1();
|
||||||
offset(delta = 1, join_type = "bevel") shape2(3, -1);
|
m(0, 1) offset(5) shape1();
|
||||||
|
m(0, 2) offset(5) shape2();
|
||||||
|
|
||||||
offset(delta = -5, join_type = "round") shape1(-1, 1);
|
m(1, 0) offset(r = 1) shape1(30);
|
||||||
shape1(0, 1);
|
m(1, 1) offset(r = 5) shape1(30);
|
||||||
offset(delta = 5, join_type = "round") shape1(1, 1);
|
m(1, 2) offset(r = 5) shape2();
|
||||||
|
|
||||||
offset(-4) shape1(-1, 0);
|
m(2, 0) offset(r = -5) shape1(40);
|
||||||
shape1(0, 0);
|
m(2, 1) offset(r = -10.01) shape1(50);
|
||||||
offset(4) shape1(1, 0);
|
m(2, 2) offset(r = -1) shape2();
|
||||||
|
|
||||||
offset(delta = -5) shape1(2, 1);
|
m(3, 0) offset(delta = 4) shape1();
|
||||||
shape1(0, -1);
|
m(3, 1) offset(delta = 1) shape1();
|
||||||
offset(delta = 5) shape1(1, -1);
|
m(3, 2) offset(delta = 5) shape2();
|
||||||
|
|
||||||
|
m(4, 0) offset(delta = -2) shape1(30);
|
||||||
|
m(4, 1) offset(delta = -5) shape1(40);
|
||||||
|
m(4, 2) offset(delta = -1) shape2();
|
||||||
|
|
||||||
|
m(5, 0) offset(delta = 4, chamfer = true) shape1();
|
||||||
|
m(5, 1) offset(delta = 1, chamfer = true) shape1();
|
||||||
|
m(5, 2) offset(delta = 5, chamfer = true) shape2();
|
||||||
|
|
||||||
|
m(6, 0) offset(delta = -2, chamfer = true) shape1(30);
|
||||||
|
m(6, 1) offset(delta = -5, chamfer = true) shape1(40);
|
||||||
|
m(6, 2) offset(delta = -1, chamfer = true) shape2();
|
||||||
|
|
||||||
// Bug with fragment calculateion with delta < 1 due to abs() instead of std::abs()
|
// Bug with fragment calculateion with delta < 1 due to abs() instead of std::abs()
|
||||||
translate([-50,-50]) scale([25,25,1])
|
m(-2, 1) scale([30, 30]) offset(r = 0.8) square(1);
|
||||||
offset(delta = 0.9, join_type="round") square(.1);
|
|
||||||
|
|
||||||
// Malformed offsets
|
// Malformed offsets
|
||||||
offset();
|
offset();
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
@ -1,7 +1,7 @@
|
||||||
group() {
|
group() {
|
||||||
group();
|
group();
|
||||||
linear_extrude(height = 20, center = false, convexity = 1, scale = [0.5, 0.5], $fn = 40, $fa = 12, $fs = 2) {
|
linear_extrude(height = 20, center = false, convexity = 1, scale = [0.5, 0.5], $fn = 40, $fa = 12, $fs = 2) {
|
||||||
offset(delta = 10, join_type = "round", $fn = 40, $fa = 12, $fs = 2) {
|
offset(r = 10, $fn = 40, $fa = 12, $fs = 2) {
|
||||||
square(size = [50, 50], center = true);
|
square(size = [50, 50], center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,12 @@ group() {
|
||||||
linear_extrude(height = 20, center = false, convexity = 1, scale = [1, 1], $fn = 40, $fa = 12, $fs = 2) {
|
linear_extrude(height = 20, center = false, convexity = 1, scale = [1, 1], $fn = 40, $fa = 12, $fs = 2) {
|
||||||
group() {
|
group() {
|
||||||
difference() {
|
difference() {
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 2, $fn = 40, $fa = 12, $fs = 2) {
|
offset(r = 1, $fn = 40, $fa = 12, $fs = 2) {
|
||||||
group() {
|
group() {
|
||||||
circle($fn = 40, $fa = 12, $fs = 2, r = 15);
|
circle($fn = 40, $fa = 12, $fs = 2, r = 15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
offset(delta = -1, join_type = "miter", miter_limit = 2, $fn = 40, $fa = 12, $fs = 2) {
|
offset(r = -1, $fn = 40, $fa = 12, $fs = 2) {
|
||||||
group() {
|
group() {
|
||||||
circle($fn = 40, $fa = 12, $fs = 2, r = 15);
|
circle($fn = 40, $fa = 12, $fs = 2, r = 15);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,6 @@ group() {
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);
|
||||||
color([-1, -1, -1, 1]);
|
color([-1, -1, -1, 1]);
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2);
|
offset(r = 1, $fn = 0, $fa = 12, $fs = 2);
|
||||||
text(text = "", size = 10, spacing = 1, font = "", direction = "ltr", language = "en", script = "latin", halign = "left", valign = "baseline", $fn = 0, $fa = 12, $fs = 2);
|
text(text = "", size = 10, spacing = 1, font = "", direction = "ltr", language = "en", script = "latin", halign = "left", valign = "baseline", $fn = 0, $fa = 12, $fs = 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,144 +1,311 @@
|
||||||
group() {
|
group() {
|
||||||
offset(delta = -1, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, -50], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
group() {
|
group() {
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, -60], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
group() {
|
||||||
}
|
group() {
|
||||||
}
|
difference() {
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
square(size = [20, 20], center = true);
|
||||||
group() {
|
square(size = [10, 10], center = true);
|
||||||
multmatrix([[1, 0, 0, 50], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
}
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = -1, join_type = "miter", miter_limit = 10, $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 100], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 10, $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 150], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = -1, join_type = "bevel", $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 100], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = 1, join_type = "bevel", $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 150], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = -5, join_type = "round", $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, -50], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
group() {
|
group() {
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, -60], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
difference() {
|
group() {
|
||||||
square(size = [30, 30], center = true);
|
group() {
|
||||||
square(size = [8, 8], center = true);
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = 5, join_type = "round", $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 50], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = -4, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
group() {
|
group() {
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
difference() {
|
group() {
|
||||||
square(size = [30, 30], center = true);
|
offset(r = 1, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
square(size = [8, 8], center = true);
|
group() {
|
||||||
}
|
difference() {
|
||||||
}
|
square(size = [20, 20], center = true);
|
||||||
}
|
square(size = [10, 10], center = true);
|
||||||
offset(delta = 4, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
}
|
||||||
group() {
|
}
|
||||||
multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
offset(delta = -5, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
|
||||||
group() {
|
|
||||||
multmatrix([[1, 0, 0, 100], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
group() {
|
group() {
|
||||||
multmatrix([[1, 0, 0, 0], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
difference() {
|
group() {
|
||||||
square(size = [30, 30], center = true);
|
offset(r = 5, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
square(size = [8, 8], center = true);
|
group() {
|
||||||
}
|
difference() {
|
||||||
}
|
square(size = [20, 20], center = true);
|
||||||
}
|
square(size = [10, 10], center = true);
|
||||||
offset(delta = 5, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
}
|
||||||
group() {
|
}
|
||||||
multmatrix([[1, 0, 0, 50], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
|
||||||
difference() {
|
|
||||||
square(size = [30, 30], center = true);
|
|
||||||
square(size = [8, 8], center = true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
multmatrix([[1, 0, 0, -50], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
group() {
|
||||||
multmatrix([[25, 0, 0, 0], [0, 25, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
offset(delta = 0.9, join_type = "round", $fn = 0, $fa = 12, $fs = 2) {
|
group() {
|
||||||
square(size = [0.1, 0.1], center = false);
|
offset(r = 5, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2);
|
group() {
|
||||||
offset(delta = 1, join_type = "miter", miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) {
|
multmatrix([[1, 0, 0, 60], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = 1, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [30, 30], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 60], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = 5, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [30, 30], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 60], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = 5, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 120], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = -5, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [40, 40], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 120], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = -10.01, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [50, 50], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 120], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(r = -1, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 180], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 4, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [20, 20], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 180], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 1, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [20, 20], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 180], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 5, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 240], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -2, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [30, 30], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 240], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -5, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [40, 40], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 240], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -1, chamfer = false, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 300], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 4, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [20, 20], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 300], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 1, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [20, 20], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 300], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = 5, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 360], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -2, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [30, 30], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 360], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -5, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
difference() {
|
||||||
|
square(size = [40, 40], center = true);
|
||||||
|
square(size = [10, 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, 360], [0, 1, 0, 120], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
offset(delta = -1, chamfer = true, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
group() {
|
||||||
|
polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group() {
|
||||||
|
multmatrix([[1, 0, 0, -120], [0, 1, 0, 60], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
group() {
|
||||||
|
multmatrix([[30, 0, 0, 0], [0, 30, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
offset(r = 0.8, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
|
square(size = [1, 1], center = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
offset(r = 1, $fn = 0, $fa = 12, $fs = 2);
|
||||||
|
offset(r = 1, $fn = 0, $fa = 12, $fs = 2) {
|
||||||
square(size = [0, 0], center = false);
|
square(size = [0, 0], center = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 3.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 3.8 KiB |
Loading…
Reference in New Issue