@@ -12,12 +12,14 @@ namespace fs = filesystem;
1212using namespace slm ;
1313using namespace base ;
1414
15- Writer::Writer (const char * fname) : ready(false )
15+ Writer::Writer (const char * fname) : ready(false ),
16+ mSortLayers(false )
1617{
1718 this ->setFilePath (std::string (fname));
1819}
1920
20- Writer::Writer (const std::string &fname) : ready(false )
21+ Writer::Writer (const std::string &fname) : ready(false ),
22+ mSortLayers(false )
2123{
2224 this ->setFilePath (fname);
2325}
@@ -35,7 +37,7 @@ void Writer::getFileHandle(std::fstream &file) const
3537 if (this ->isReady ()) {
3638 file.open (filePath,std::fstream::in | std::fstream::out | std::fstream::trunc | std::fstream::binary);
3739 if (!file.is_open ()) {
38- std::cerr << " Cannot create file handler - " << filePath;
40+ std::cerr << " Cannot create file handler - " << filePath << std::endl ;
3941 }
4042 }
4143}
@@ -46,3 +48,132 @@ void Writer::setFilePath(const std::string &path)
4648 this ->filePath = path;
4749 std::cout << " File '" << path << " ' is ready to write" << std::endl;
4850}
51+
52+ Layer::Ptr Writer::getTopLayerByPosition (const std::vector<Layer::Ptr> &layers)
53+ {
54+ uint64_t zMax = 0 ;
55+
56+ Layer::Ptr fndLayer;
57+
58+ for (auto layer : layers) {
59+
60+ if (layer->getZ () > zMax) {
61+ fndLayer = layer;
62+ zMax = layer->getZ ();
63+ }
64+ }
65+
66+ return fndLayer;
67+ }
68+
69+ Layer::Ptr Writer::getTopLayerById (const std::vector<Layer::Ptr> &layers)
70+ {
71+ uint64_t zId = 0 ;
72+
73+ Layer::Ptr fndLayer;
74+
75+ for (auto layer : layers) {
76+
77+ if (layer->getLayerId () > zId) {
78+ fndLayer = layer;
79+ zId = layer->getLayerId ();
80+ }
81+ }
82+
83+ return fndLayer;
84+ }
85+
86+ std::vector<Layer::Ptr> Writer::sortLayers (const std::vector<Layer::Ptr> &layers)
87+ {
88+ std::vector<Layer::Ptr> layersCpy (layers);
89+
90+ std::sort (layersCpy.begin (), layersCpy.end (), [](Layer::Ptr a, Layer::Ptr b) {
91+ return a->getZ () > b->getZ ();
92+ });
93+
94+ return layersCpy;
95+ }
96+
97+ int64_t Writer::getTotalNumHatches (const std::vector<Layer::Ptr> &layers)
98+ {
99+ return Writer::getTotalGeoms<HatchGeometry>(layers);
100+ }
101+
102+
103+ int64_t Writer::getTotalNumContours (const std::vector<Layer::Ptr> &layers)
104+ {
105+ return Writer::getTotalGeoms<ContourGeometry>(layers);
106+ }
107+
108+ void Writer::getLayerBoundingBox (float *bbox, Layer::Ptr layer)
109+ {
110+ float minX = 1e9 , minY = 1e9 , maxX = -1e9 , maxY = -1e9 ;
111+
112+ for (auto geom : layer->geometry ()) {
113+ auto minCols = geom->coords .colwise ().minCoeff ();
114+ auto maxCols = geom->coords .colwise ().maxCoeff ();
115+
116+ if (minCols[0 , 0 ] < minX)
117+ minX = minCols[0 ,0 ];
118+
119+ if (minCols[0 ,1 ] < minY)
120+ minY = minCols[0 ,1 ];
121+
122+ if (maxCols[0 ,0 ] > maxX)
123+ maxX = maxCols[0 ,0 ];
124+
125+ if (maxCols[0 ,1 ] > maxY)
126+ maxY = maxCols[0 ,1 ];
127+ }
128+ }
129+
130+ void Writer::getBoundingBox (float *bbox, const std::vector<Layer::Ptr> &layers)
131+ {
132+ float minX = 1e9 , minY = 1e9 , maxX = -1e9 , maxY = -1e9 ;
133+
134+ for (auto layer: layers) {
135+ for (auto geom : layer->geometry ()) {
136+ auto minCols = geom->coords .colwise ().minCoeff ();
137+ auto maxCols = geom->coords .colwise ().maxCoeff ();
138+
139+ if (minCols[0 , 0 ] < minX)
140+ minX = minCols[0 ,0 ];
141+
142+ if (minCols[0 ,1 ] < minY)
143+ minY = minCols[0 ,1 ];
144+
145+ if (maxCols[0 ,0 ] > maxX)
146+ maxX = maxCols[0 ,0 ];
147+
148+ if (maxCols[0 ,1 ] > maxY)
149+ maxY = maxCols[0 ,1 ];
150+
151+ }
152+ }
153+
154+ bbox[0 ] = minX;
155+ bbox[1 ] = maxX;
156+ bbox[2 ] = minY;
157+ bbox[3 ] = maxY;
158+ }
159+
160+ std::tuple<float , float > Writer::getLayerMinMax (const std::vector<slm::Layer::Ptr> &layers)
161+ {
162+ float zMin = 0.0 ;
163+ float zMax = 0.0 ;
164+ float zPos = 0.0 ;
165+
166+ for (auto layer : layers) {
167+
168+ zPos = layer->getZ ();
169+
170+ if (zPos < zMin)
171+ zMin = zPos;
172+
173+ if (zPos > zMax)
174+ zMax = zPos;
175+ }
176+
177+ return std::make_tuple (zMin, zMax);
178+ }
179+
0 commit comments