OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
anonymous_namespace{TextLines.cpp} Namespace Reference

Functions

indexed_triangle_set its_create_torus (const Slic3r::Polygon &polygon, float radius, size_t steps=20)
TextLines select_closest_contour (const std::vector< Polygons > &line_contours)
Eigen::AngleAxis< double > get_rotation ()
indexed_triangle_set create_its (const TextLines &lines, float radius)
GLModel::Geometry create_geometry (const TextLines &lines, float radius, bool is_mirrored)

Function Documentation

◆ create_geometry()

GLModel::Geometry anonymous_namespace{TextLines.cpp}::create_geometry ( const TextLines & lines,
float radius,
bool is_mirrored )
214{
215 indexed_triangle_set its = create_its(lines, radius);
216
217 GLModel::Geometry geometry;
218 geometry.format = {GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3};
219 ColorRGBA color(.7f, .7f, .7f, .7f); // Transparent Gray
220 geometry.color = color;
221
222 geometry.reserve_vertices(its.vertices.size());
223 for (Vec3f vertex : its.vertices)
224 geometry.add_vertex(vertex);
225
226 geometry.reserve_indices(its.indices.size() * 3);
227
228 if (is_mirrored) {
229 // change order of indices
230 for (Vec3i32 t : its.indices)
231 geometry.add_triangle(t[0], t[2], t[1]);
232 } else {
233 for (Vec3i32 t : its.indices)
234 geometry.add_triangle(t[0], t[1], t[2]);
235 }
236 return geometry;
237}
Definition Color.hpp:80
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65
Eigen::Matrix< int32_t, 3, 1, Eigen::DontAlign > Vec3i32
Definition Point.hpp:59
indexed_triangle_set create_its(const TextLines &lines, float radius)
Definition TextLines.cpp:197
Definition GLModel.hpp:28
void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3)
Definition GLModel.cpp:121
void reserve_indices(size_t indices_count)
Definition GLModel.hpp:71
ColorRGBA color
Definition GLModel.hpp:68
void reserve_vertices(size_t vertices_count)
Definition GLModel.hpp:70
void add_vertex(const Vec2f &position)
Definition GLModel.cpp:43
Format format
Definition GLModel.hpp:64

References Slic3r::GUI::GLModel::Geometry::add_triangle(), Slic3r::GUI::GLModel::Geometry::add_vertex(), Slic3r::GUI::GLModel::Geometry::color, create_its(), Slic3r::GUI::GLModel::Geometry::format, Slic3r::GUI::GLModel::Geometry::P3, Slic3r::GUI::GLModel::Geometry::reserve_indices(), Slic3r::GUI::GLModel::Geometry::reserve_vertices(), and Slic3r::GUI::GLModel::Geometry::Triangles.

Here is the call graph for this function:

◆ create_its()

indexed_triangle_set anonymous_namespace{TextLines.cpp}::create_its ( const TextLines & lines,
float radius )
198{
199 indexed_triangle_set its;
200 // create model from polygons
201 for (const TextLine &line : lines) {
202 const Slic3r::Polygon &polygon = line.polygon;
203 if (polygon.empty()) continue;
204 indexed_triangle_set line_its = its_create_torus(polygon, radius);
205 auto transl = Eigen::Translation3d(0., line.y, 0.);
206 Transform3d tr = transl * get_rotation();
207 its_transform(line_its, tr);
208 its_merge(its, line_its);
209 }
210 return its;
211}
bool empty() const
Definition MultiPoint.hpp:51
Definition Polygon.hpp:31
Define polygon for draw letters.
Definition Emboss.hpp:438
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Transform3d
Definition Point.hpp:96
void its_merge(indexed_triangle_set &A, const indexed_triangle_set &B)
Definition TriangleMesh.cpp:1448
Eigen::AngleAxis< double > get_rotation()
Definition TextLines.cpp:195
indexed_triangle_set its_create_torus(const Slic3r::Polygon &polygon, float radius, size_t steps=20)
Definition TextLines.cpp:48

References Slic3r::MultiPoint::empty(), get_rotation(), its_create_torus(), and Slic3r::its_merge().

Referenced by create_geometry().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_rotation()

Eigen::AngleAxis< double > anonymous_namespace{TextLines.cpp}::get_rotation ( )
inline
195{ return Eigen::AngleAxis(-M_PI_2, Vec3d::UnitX()); }

Referenced by create_its().

Here is the caller graph for this function:

◆ its_create_torus()

indexed_triangle_set anonymous_namespace{TextLines.cpp}::its_create_torus ( const Slic3r::Polygon & polygon,
float radius,
size_t steps = 20 )
49{
50 assert(!polygon.empty());
51 if (polygon.empty())
52 return {};
53
54 size_t count = polygon.size();
55 if (count < 3)
56 return {};
57
58 // convert and scale to float
59 std::vector<Vec2f> points_d;
60 points_d.reserve(count);
61 for (const Point &point : polygon.points)
62 points_d.push_back(unscale(point).cast<float>());
63
64 // pre calculate normalized line directions
65 auto calc_line_norm = [](const Vec2f &f, const Vec2f &s) -> Vec2f { return (s - f).normalized(); };
66 std::vector<Vec2f> line_norm(points_d.size());
67 for (size_t i = 0; i < count - 1; ++i)
68 line_norm[i] = calc_line_norm(points_d[i], points_d[i + 1]);
69 line_norm.back() = calc_line_norm(points_d.back(), points_d.front());
70
71 // precalculate sinus and cosinus
72 double angle_step = 2 * M_PI / steps;
73 std::vector<std::pair<double, float>> sin_cos;
74 sin_cos.reserve(steps);
75 for (size_t s = 0; s < steps; ++s) {
76 double angle = s * angle_step;
77 sin_cos.emplace_back(
78 radius * std::sin(angle),
79 static_cast<float>(radius * std::cos(angle))
80 );
81 }
82
83 indexed_triangle_set sphere = its_make_sphere(radius, 2 * PI / steps);
84
85 // create torus model along polygon path
86 indexed_triangle_set model;
87 model.vertices.reserve(2 * steps * count + sphere.vertices.size()*count);
88 model.indices.reserve(2 * steps * count + sphere.indices.size()*count);
89
90 const Vec2f *prev_prev_point_d = &points_d[count-2]; // one before back
91 const Vec2f *prev_point_d = &points_d.back();
92
93 auto calc_angle = [](const Vec2f &d0, const Vec2f &d1) {
94 double dot = d0.dot(d1);
95 double det = d0.x() * d1.y() - d0.y() * d1.x(); // Determinant
96 return std::atan2(det, dot); // atan2(y, x) or atan2(sin, cos)
97 };
98
99 // opposit previos direction of line - for calculate angle
100 Vec2f opposit_prev_dir = (*prev_prev_point_d) - (*prev_point_d);
101 for (size_t i = 0; i < count; ++i) {
102
103 const Vec2f & point_d = points_d[i];
104 // line segment direction
105 Vec2f dir = point_d - (*prev_point_d);
106
107 double angle = calc_angle(opposit_prev_dir, dir);
108 double allowed_preccission = 1e-6;
109 if (angle >= (PI - allowed_preccission) ||
110 angle <= (-PI + allowed_preccission))
111 continue; // it is almost line
112
113 // perpendicular direction to line
114 Vec2d p_dir(dir.y(), -dir.x());
115 p_dir.normalize(); // Should done with double preccission
116 // p_dir is tube unit side vector
117 // tube unit top vector is z direction
118
119 // Tube
120 int prev_index = model.vertices.size() + 2 * sin_cos.size() - 2;
121 for (const auto &[s, c] : sin_cos) {
122 Vec2f side = (s * p_dir).cast<float>();
123 Vec2f xy0 = side + (*prev_point_d);
124 Vec2f xy1 = side + point_d;
125 model.vertices.emplace_back(xy0.x(), xy0.y(), c); // pointing of prev index
126 model.vertices.emplace_back(xy1.x(), xy1.y(), c);
127
128 // create triangle indices
129 int f0 = prev_index;
130 int s0 = f0 + 1;
131 int f1 = model.vertices.size() - 2;
132 int s1 = f1 + 1;
133 prev_index = f1;
134 model.indices.emplace_back(s0, f0, s1);
135 model.indices.emplace_back(f1, s1, f0);
136 }
137
138 prev_prev_point_d = prev_point_d;
139 prev_point_d = &point_d;
140 opposit_prev_dir = -dir;
141 }
142
143 // sphere on each point
144 for (Vec2f& p: points_d){
145 indexed_triangle_set sphere_copy = sphere;
146 its_translate(sphere_copy, Vec3f(p.x(), p.y(), 0.f));
147 its_merge(model, sphere_copy);
148 }
149
150 return model;
151}
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
#define M_PI
Definition ExtrusionSimulator.cpp:31
Points points
Definition MultiPoint.hpp:22
size_t size() const
Definition MultiPoint.hpp:50
static constexpr double PI
Definition libslic3r.h:81
std::optional< float > calc_angle(const Selection &selection)
Calculate up vector angle.
Definition SurfaceDrag.cpp:259
indexed_triangle_set sphere(double rho, Portion portion, double fa)
Definition SupportTreeMesher.cpp:14
indexed_triangle_set its_make_sphere(double radius, double fa)
Definition TriangleMesh.cpp:1128
double angle(const Eigen::MatrixBase< Derived > &v1, const Eigen::MatrixBase< Derived2 > &v2)
Definition Point.hpp:138
static double f(double x, double z_sin, double z_cos, bool vertical, bool flip)
Definition FillGyroid.cpp:124
T unscale(Q v)
Definition libslic3r.h:138
Eigen::Matrix< float, 2, 1, Eigen::DontAlign > Vec2f
Definition Point.hpp:64
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
T dot(const boost::geometry::model::d2::point_xy< T > &v1, const boost::geometry::model::d2::point_xy< T > &v2)
Definition ExtrusionSimulator.cpp:154
auto cast(const BoundingBoxBase< Tin > &b)
Definition BoundingBox.hpp:299

References Slic3r::angle(), Slic3r::GUI::calc_angle(), Slic3r::cast(), count, Slic3r::dot(), Slic3r::MultiPoint::empty(), Slic3r::f(), Slic3r::its_make_sphere(), Slic3r::its_merge(), M_PI, PI, Slic3r::MultiPoint::points, Slic3r::MultiPoint::size(), and Slic3r::unscale().

Referenced by create_its().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ select_closest_contour()

TextLines anonymous_namespace{TextLines.cpp}::select_closest_contour ( const std::vector< Polygons > & line_contours)
154 {
155 TextLines result;
156 result.reserve(line_contours.size());
157 Vec2d zero(0., 0.);
158 for (const Polygons &polygons : line_contours){
159 if (polygons.empty()) {
160 result.emplace_back();
161 continue;
162 }
163 // Improve: use int values and polygons only
164 // Slic3r::Polygons polygons = union_(polygons);
165 // std::vector<Slic3r::Line> lines = to_lines(polygons);
166 // AABBTreeIndirect::Tree<2, Point> tree;
167 // size_t line_idx;
168 // Point hit_point;
169 // Point::Scalar distance = AABBTreeLines::squared_distance_to_indexed_lines(lines, tree, point, line_idx, hit_point);
170
171 ExPolygons expolygons = union_ex(polygons);
172 std::vector<Linef> linesf = to_linesf(expolygons);
174
175 size_t line_idx = 0;
176 Vec2d hit_point;
177 // double distance =
178 AABBTreeLines::squared_distance_to_indexed_lines(linesf, tree, zero, line_idx, hit_point);
179
180 // conversion between index of point and expolygon
181 ExPolygonsIndices cvt(expolygons);
182 ExPolygonsIndex index = cvt.cvt(static_cast<uint32_t>(line_idx));
183
184 const Slic3r::Polygon& polygon = index.is_contour() ?
185 expolygons[index.expolygons_index].contour :
186 expolygons[index.expolygons_index].holes[index.hole_index()];
187
188 Point hit_point_int = hit_point.cast<Point::coord_type>();
189 TextLine tl{polygon, PolygonPoint{index.point_index, hit_point_int}};
190 result.emplace_back(tl);
191 }
192 return result;
193}
Keep conversion from ExPolygonsIndex to Index and vice versa ExPolygonsIndex .. contour(or hole) poin...
Definition ExPolygonsIndex.hpp:40
Definition Point.hpp:199
coord_t coord_type
Definition Point.hpp:201
Tree< 2, double > Tree2d
Definition AABBTreeIndirect.hpp:223
VectorType::Scalar squared_distance_to_indexed_lines(const std::vector< LineType > &lines, const TreeType &tree, const VectorType &point, size_t &hit_idx_out, Eigen::PlainObjectBase< VectorType > &hit_point_out, typename VectorType::Scalar max_sqr_dist=std::numeric_limits< typename VectorType::Scalar >::infinity())
Definition AABBTreeLines.hpp:211
AABBTreeIndirect::Tree< LineType::Dim, typename LineType::Scalar > build_aabb_tree_over_indexed_lines(const std::vector< LineType > &lines)
Definition AABBTreeLines.hpp:172
std::vector< TextLine > TextLines
Definition Emboss.hpp:448
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:20
Linesf to_linesf(const ExPolygons &src, uint32_t count_lines=0)
Definition ExPolygon.hpp:154
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, PolyFillType fill_type)
Definition ClipperUtils.cpp:1011
Define point laying on polygon keep index of polygon line and point coordinate.
Definition Polygon.hpp:302
Index into ExPolygons Identify expolygon, its contour (or hole) and point.
Definition ExPolygonsIndex.hpp:14
uint32_t expolygons_index
Definition ExPolygonsIndex.hpp:16
uint32_t point_index
Definition ExPolygonsIndex.hpp:24
bool is_contour() const
Definition ExPolygonsIndex.hpp:26
uint32_t hole_index() const
Definition ExPolygonsIndex.hpp:28

References Slic3r::AABBTreeLines::build_aabb_tree_over_indexed_lines(), Slic3r::ExPolygonsIndices::cvt(), Slic3r::ExPolygonsIndex::expolygons_index, Slic3r::ExPolygonsIndex::hole_index(), Slic3r::ExPolygonsIndex::is_contour(), Slic3r::ExPolygonsIndex::point_index, Slic3r::AABBTreeLines::squared_distance_to_indexed_lines(), Slic3r::to_linesf(), and Slic3r::union_ex().

Here is the call graph for this function: