cleanup / rework
Stefan Schuermans

Stefan Schuermans commited on 2017-06-04 16:48:09
Showing 1 changed files, with 157 additions and 101 deletions.


move some code from main to own functions
exit with few different error codes
... ...
@@ -35,6 +35,13 @@
35 35
 #include "pixel.h"
36 36
 #include "point.h"
37 37
 
38
+#define SUCCESS (0) // no error
39
+#define ERR_USAGE (2) // invalid command line arguments
40
+#define ERR_FILE_OPEN (3) // could not open input/output file
41
+#define ERR_FILE_READ (4) // could not read input file
42
+#define ERR_FILE_PROC (5) // could not process input file
43
+#define ERR_PROC (5) // error in processing of objects found in input file
44
+
38 45
 // layers of drawing
39 46
 Layer gLayerVideo, gLayerPixel, gLayerNetwork;
40 47
 std::map<unsigned int, Layer> gLayerCables, gLayerDistributors;
... ...
@@ -209,11 +216,71 @@ static bool cbEntity(const class dimeState * const state,
209 216
   return true;
210 217
 }
211 218
 
219
+/**
220
+ * @brief read a DXF file and process objects found in it
221
+ * @param[in] strDxfFileName name of DXF file
222
+ * @param[out] width width of logical video frame
223
+ * @param[out] height height of logical video frame
224
+ * @param[out] chains number of chains (outputs) per distributor
225
+ * @param[out] pixels number of pixels in one chain
226
+ *                                    (i.e. connected to one output)
227
+ * @return SUCCESS on success, other value on error
228
+ */
229
+static int readDXF(std::string const &strDxfFileName,
230
+                   unsigned int &width, unsigned int &height,
231
+                   unsigned int &chains, unsigned int &pixels)
232
+{
233
+  // read DXF file
234
+  dimeInput in;
235
+  if (!in.setFile(strDxfFileName.c_str())) {
236
+    std::cerr << "error opening file \"" << strDxfFileName
237
+              << "\" for reading" << std::endl;
238
+    return ERR_FILE_OPEN;
239
+  }
240
+  dimeModel model;
241
+  if (!model.read(&in)) {
242
+    std::cerr << "DXF read error in line " << in.getFilePosition()
243
+              << " of file \"" << strDxfFileName << "\""
244
+              << std::endl;
245
+    return ERR_FILE_READ;
246
+  }
247
+
248
+  // get configuration from layers
249
+  if (! get_config(model, width, height, chains, pixels)) {
250
+    return ERR_FILE_PROC;
251
+  }
252
+
253
+  // enumerate all entities
254
+  model.traverseEntities(cbEntity, NULL);
255
+
256
+  // merge all cable layers
257
+  std::map<unsigned int, Layer>::iterator itCable;
258
+  for (itCable = gLayerCables.begin();
259
+       itCable != gLayerCables.end(); ++itCable)
260
+  gLayerCable.merge(&itCable->second);
261
+  // gLayerCables[] is now empty and will not be used any more
262
+
263
+  // output object count information
264
+  std::cout << "object counts:" << std::endl;
265
+  std::cout << "  video: " << gLayerVideo.mObjects.size() << std::endl;
266
+  std::cout << "  pixel: " << gLayerPixel.mObjects.size() << std::endl;
267
+  std::cout << "  cable: " << gLayerCable.mObjects.size() << std::endl;
268
+  std::cout << "  network: " << gLayerNetwork.mObjects.size() << std::endl;
269
+  std::cout << "  distributor:" << std::endl;
270
+  std::map<unsigned int, Layer>::const_iterator itDistri;
271
+  for (itDistri = gLayerDistributors.begin();
272
+       itDistri != gLayerDistributors.end(); ++itDistri)
273
+    std::cout << "    " << itDistri->first << ": "
274
+              << itDistri->second.mObjects.size() << std::endl;
275
+
276
+  return SUCCESS;
277
+}
278
+
212 279
 /**
213 280
  * @brief create a chain
214 281
  * @param[in] chain chain to create
215 282
  * @param[in] pObjCable cable to first pixel
216
- * @return 0 on success, -1 on error
283
+ * @return SUCCESS on success, other value on error
217 284
  */
218 285
 static int createChain(Chain &chain, const Object *pObjCable)
219 286
 {
... ...
@@ -238,14 +305,14 @@ static int createChain(Chain &chain, const Object *pObjCable)
238 305
 
239 306
     // end of chain
240 307
     if (intersectsPixels.size() < 1)
241
-      return 0;
308
+      return SUCCESS;
242 309
 
243 310
     // more than one next pixel
244 311
     if (intersectsPixels.size() > 1) {
245 312
       std::cerr << "pixel cable connects multiple pixels ("
246 313
                 << intersectsPixels[0].pt.mX << ","
247 314
                 << intersectsPixels[0].pt.mY << ")" << std::endl;
248
-      return -1;
315
+      return ERR_PROC;
249 316
     }
250 317
 
251 318
     // pixel found
... ...
@@ -271,14 +338,14 @@ static int createChain(Chain &chain, const Object *pObjCable)
271 338
 
272 339
     // end of chain
273 340
     if (intersectsCables.size() < 1)
274
-      return 0;
341
+      return SUCCESS;
275 342
 
276 343
     // more than one next pixel
277 344
     if (intersectsCables.size() > 1) {
278 345
       std::cerr << "pixel connected to multiple pixel cables ("
279 346
                 << intersectsCables[0].pt.mX << ","
280 347
                 << intersectsCables[0].pt.mY << ")" << std::endl;
281
-      return -1;
348
+      return ERR_PROC;
282 349
     }
283 350
 
284 351
     // next cable found
... ...
@@ -299,7 +366,7 @@ static bool intersectsCablesSort(const Layer::Intersection& i1,
299 366
  * @param[in] distri distributor to create
300 367
  * @param[in] pLayer layer containing distributor
301 368
  * @param[in] pixels number of pixels per chain
302
- * @return 0 on success, -1 on error
369
+ * @return SUCCESS on success, other value on error
303 370
  */
304 371
 static int createDistri(Distri &distri, const Layer *pLayer,
305 372
                         unsigned int pixels)
... ...
@@ -308,7 +375,7 @@ static int createDistri(Distri &distri, const Layer *pLayer,
308 375
   if (pLayer->mObjects.size() != 1) {
309 376
     std::cerr << "layer of distributor 0x" << std::hex << distri.getNo()
310 377
               << "contains no object or multiple objects" << std::endl;
311
-    return -1;
378
+    return ERR_PROC;
312 379
   }
313 380
   const Object *pObjDistri = pLayer->mObjects[0];
314 381
 
... ...
@@ -319,7 +386,7 @@ static int createDistri(Distri &distri, const Layer *pLayer,
319 386
     std::cerr << "distributor 0x" << std::hex << distri.getNo()
320 387
               << "has no network connection or multiple network connections"
321 388
               << std::endl;
322
-    return -1;
389
+    return ERR_PROC;
323 390
   }
324 391
   Point ptNetwork = intersectsNet[0].pt;
325 392
 
... ...
@@ -344,7 +411,72 @@ static int createDistri(Distri &distri, const Layer *pLayer,
344 411
       err = true;
345 412
   }
346 413
 
347
-  return err ? -1 : 0;
414
+  return err ? ERR_PROC : SUCCESS;
415
+}
416
+
417
+/**
418
+ * @brief make config file object from DXF layers
419
+ * @param[in] width width of logical video frame
420
+ * @param[in] height height of logical video frame
421
+ * @param[in] chains number of chains (outputs) per distributor
422
+ * @param[in] pixels number of pixels in one chain
423
+ *                                    (i.e. connected to one output)
424
+ * @param[out] distris distributor objects
425
+ * @return true on success, false on error
426
+ */
427
+static bool makeObjects(unsigned int width, unsigned int height,
428
+                        unsigned int chains, unsigned int pixels,
429
+                        std::vector<Distri> &distris)
430
+{
431
+  // get origin and size of pixels in video
432
+  Box boundsVideo;
433
+  gLayerVideo.getBounds(boundsVideo);
434
+  Point ptPixel0(boundsVideo.mBL.mX, boundsVideo.mTR.mY);
435
+  Point ptPixelSz = boundsVideo.mTR - boundsVideo.mBL;
436
+  ptPixelSz.mX /= (double)width;
437
+  ptPixelSz.mY /= (double)height;
438
+  ptPixelSz.mY *= -1;
439
+  std::cout << "video bounds: "
440
+            << boundsVideo.mBL.mX << "," << boundsVideo.mBL.mY
441
+            << " " << boundsVideo.mTR.mX << "," << boundsVideo.mTR.mY
442
+            << std::endl;
443
+
444
+  // create distributors
445
+  bool ok = true;
446
+  std::map<unsigned int, Layer>::const_iterator itDistri;
447
+  for (itDistri = gLayerDistributors.begin();
448
+       itDistri != gLayerDistributors.end(); ++itDistri) {
449
+    distris.push_back(Distri(itDistri->first, chains, pixels));
450
+    if (createDistri(distris.back(), &itDistri->second, pixels) != SUCCESS) {
451
+      ok = false;
452
+    }
453
+  }
454
+
455
+  // obtain pixel coordinates
456
+  std::vector<Distri>::iterator itD;
457
+  for (itD = distris.begin(); itD != distris.end(); ++itD)
458
+    if (itD->pixCoord(ptPixel0, ptPixelSz, width, height) != 0)
459
+      ok = false;
460
+
461
+  // count pixels connected to distributors and compare to total pixels
462
+  size_t distri_pixels = 0;
463
+  for (itD = distris.begin(); itD != distris.end(); ++itD)
464
+    distri_pixels += itD->countPixels();
465
+  std::cout << "pixels connected to distributors: "
466
+            << distri_pixels << std::endl;
467
+  if (distri_pixels != gLayerPixel.mObjects.size()) {
468
+    std::cerr << "number of connected pixels (" << distri_pixels
469
+              << ") does not match total number of pixels ("
470
+              << gLayerPixel.mObjects.size() << ")" << std::endl;
471
+    ok = false;
472
+  }
473
+
474
+  // output extra error message if errors were detected
475
+  if (! ok) {
476
+    std::cerr << "ERRORs were found" << std::endl;
477
+  }
478
+
479
+  return ok;
348 480
 }
349 481
 
350 482
 /**
... ...
@@ -352,6 +484,7 @@ static int createDistri(Distri &distri, const Layer *pLayer,
352 484
  * @param[in] width width of video in pixels
353 485
  * @param[in] height height of video in pixels
354 486
  * @param[in] distris distributor objects
487
+ * @reutrn SUCCESS on success, other value on error
355 488
  */
356 489
 static int writeCfg(unsigned int width, unsigned int height,
357 490
                     const std::vector<Distri> &distris,
... ...
@@ -362,7 +495,7 @@ static int writeCfg(unsigned int width, unsigned int height,
362 495
   if (!strm.is_open()) {
363 496
     std::cerr << "could not open \"" << strCfgFileName
364 497
               << "\" for wrinting" << std::endl;
365
-    return -1;
498
+    return ERR_FILE_OPEN;
366 499
   }
367 500
 
368 501
   // video size
... ...
@@ -386,14 +519,14 @@ static int writeCfg(unsigned int width, unsigned int height,
386 519
   strm << std::endl;
387 520
 
388 521
   strm.close();
389
-  return 0;
522
+  return SUCCESS;
390 523
 }
391 524
 
392 525
 /**
393 526
  * @brief main program
394 527
  * @param[in] argc number of parameters
395 528
  * @param[in] argv parameter values
396
- * @return 0 on success, -1 on error
529
+ * @return SUCCESS on success, other value on error
397 530
  */
398 531
 int main(int argc, char *argv[])
399 532
 {
... ...
@@ -405,107 +538,30 @@ int main(int argc, char *argv[])
405 538
               << ETPCG_VER_REV << std::endl
406 539
               << "usage: " << argv[0] << " <schematic_drawing.dxf> <config.etp>"
407 540
               << std::endl;
408
-    return -1;
541
+    return ERR_USAGE;
409 542
   }
410 543
   std::string strDxfFileName = argv[1];
411 544
   std::string strCfgFileName = argv[2];
412 545
 
413 546
   // read DXF file
414
-  dimeInput in;
415
-  if (!in.setFile(strDxfFileName.c_str())) {
416
-    std::cerr << "error opening file \"" << strDxfFileName
417
-              << "\" for reading" << std::endl;
418
-    return -1;
419
-  }
420
-  dimeModel model;
421
-  if (!model.read(&in)) {
422
-    std::cerr << "DXF read error in line " << in.getFilePosition()
423
-              << " of file \"" << strDxfFileName << "\""
424
-              << std::endl;
425
-    return -1;
426
-  }
427
-
428
-  // get configuration from layers
429 547
   unsigned int width, height, chains, pixels;
430
-  if (! get_config(model, width, height, chains, pixels)) {
431
-    return -1;
548
+  int ret = readDXF(strDxfFileName, width, height, chains, pixels);
549
+  if (ret != SUCCESS) {
550
+    return ret;
432 551
   }
433 552
 
434
-  // enumerate all entities
435
-  model.traverseEntities(cbEntity, NULL);
436
-
437
-  // merge all cable layers
438
-  std::map<unsigned int, Layer>::iterator itCable;
439
-  for (itCable = gLayerCables.begin();
440
-       itCable != gLayerCables.end(); ++itCable)
441
-  gLayerCable.merge(&itCable->second);
442
-  // gLayerCables[] is now empty and will not be used any more
443
-
444
-  // output object count information
445
-  std::cout << "object counts:" << std::endl;
446
-  std::cout << "  video: " << gLayerVideo.mObjects.size() << std::endl;
447
-  std::cout << "  pixel: " << gLayerPixel.mObjects.size() << std::endl;
448
-  std::cout << "  cable: " << gLayerCable.mObjects.size() << std::endl;
449
-  std::cout << "  network: " << gLayerNetwork.mObjects.size() << std::endl;
450
-  std::cout << "  distributor:" << std::endl;
451
-  std::map<unsigned int, Layer>::const_iterator itDistri;
452
-  for (itDistri = gLayerDistributors.begin();
453
-       itDistri != gLayerDistributors.end(); ++itDistri)
454
-    std::cout << "    " << itDistri->first << ": "
455
-              << itDistri->second.mObjects.size() << std::endl;
456
-
457
-  // get origin and size of pixels in video
458
-  Box boundsVideo;
459
-  gLayerVideo.getBounds(boundsVideo);
460
-  Point ptPixel0(boundsVideo.mBL.mX, boundsVideo.mTR.mY);
461
-  Point ptPixelSz = boundsVideo.mTR - boundsVideo.mBL;
462
-  ptPixelSz.mX /= (double)width;
463
-  ptPixelSz.mY /= (double)height;
464
-  ptPixelSz.mY *= -1;
465
-  std::cout << "video bounds: "
466
-            << boundsVideo.mBL.mX << "," << boundsVideo.mBL.mY
467
-            << " " << boundsVideo.mTR.mX << "," << boundsVideo.mTR.mY
468
-            << std::endl;
469
-
470
-  // create distributors
471
-  bool err = false;
553
+  // make config file objects from DXF layers
472 554
   std::vector<Distri> distris;
473
-  for (itDistri = gLayerDistributors.begin();
474
-       itDistri != gLayerDistributors.end(); ++itDistri) {
475
-    distris.push_back(Distri(itDistri->first, chains, pixels));
476
-    if (createDistri(distris.back(), &itDistri->second, pixels) != 0) {
477
-      err = true;
478
-    }
479
-  }
480
-
481
-  // obtain pixel coordinates
482
-  std::vector<Distri>::iterator itD;
483
-  for (itD = distris.begin(); itD != distris.end(); ++itD)
484
-    if (itD->pixCoord(ptPixel0, ptPixelSz, width, height) != 0)
485
-      err = true;
486
-
487
-  // count pixels connected to distributors and compare to total pixels
488
-  size_t distri_pixels = 0;
489
-  for (itD = distris.begin(); itD != distris.end(); ++itD)
490
-    distri_pixels += itD->countPixels();
491
-  std::cout << "pixels connected to distributors: "
492
-            << distri_pixels << std::endl;
493
-  if (distri_pixels != gLayerPixel.mObjects.size()) {
494
-    std::cerr << "number of connected pixels (" << distri_pixels
495
-              << ") does not match total number of pixels ("
496
-              << gLayerPixel.mObjects.size() << ")" << std::endl;
497
-    err = true;
555
+  if (! makeObjects(width, height, chains, pixels, distris)) {
556
+    return ERR_PROC;
498 557
   }
499 558
 
500 559
   // write config file
501
-  if (writeCfg(width, height, distris, strCfgFileName) != 0)
502
-    err = true;
503
-
504
-  // output message if errors were detected
505
-  if (err) {
506
-    std::cerr << "ERRORs were found" << std::endl;
507
-    return -1;
560
+  ret = writeCfg(width, height, distris, strCfgFileName);
561
+  if ( ret != SUCCESS) {
562
+    return ret;
508 563
   }
509
-  return 0;
564
+
565
+  return SUCCESS;
510 566
 }
511 567
 
512 568