From 7fa13c0f6df7d2f45cb6ca1b2582409e8a96f593 Mon Sep 17 00:00:00 2001 From: barnestr Date: Mon, 14 Mar 2022 14:49:24 -0500 Subject: [PATCH] lots of progress on lab 1 --- Lab 1/ReadSTL.cpp | 43 -------- Lab1/ReadSTL.cpp | 129 ++++++++++++++++++++++++ {Lab 1 => Lab1}/STLFiles/brianascii.stl | 0 {Lab 1 => Lab1}/STLFiles/shape.stl | 0 Lab1/main.cpp | 18 ++++ Lab1/makefile | 25 +++++ Lecture/Week1/main | Bin 34336 -> 0 bytes 7 files changed, 172 insertions(+), 43 deletions(-) delete mode 100644 Lab 1/ReadSTL.cpp create mode 100644 Lab1/ReadSTL.cpp rename {Lab 1 => Lab1}/STLFiles/brianascii.stl (100%) rename {Lab 1 => Lab1}/STLFiles/shape.stl (100%) create mode 100644 Lab1/main.cpp create mode 100644 Lab1/makefile delete mode 100755 Lecture/Week1/main diff --git a/Lab 1/ReadSTL.cpp b/Lab 1/ReadSTL.cpp deleted file mode 100644 index a54943e..0000000 --- a/Lab 1/ReadSTL.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include -using namespace std; - -class ReadSTL { - private: - int numFacet; - double Xmin; - double Xmax; - double Ymin; - double Ymax; - double Zmin; - double Zmax; - public: - ReadSTL(string filename) { - ifstream inputfile(filename, ifstream::in); - string line; - string solidName; - // Solid header line - getline(inputfile, line); - istringstream inputstream(line); - // Iterate stream past "solid" - - // Retrieve name of solid - inputstream >> solidName; - // Process entire solid, looping through each facet - getline(inputfile, line); - while(1) { - // Iterate stream past "facet" - // Process entire facet, - - } - } - -}; - -int main(int argc, char** argv) { - ReadSTL RF(argv[1]); - - return 0; -} \ No newline at end of file diff --git a/Lab1/ReadSTL.cpp b/Lab1/ReadSTL.cpp new file mode 100644 index 0000000..a9c87b1 --- /dev/null +++ b/Lab1/ReadSTL.cpp @@ -0,0 +1,129 @@ +#include +#include +#include +#include +using namespace std; + +class ReadSTL { + private: + int numFacet; + double Xmin = 0; + double Xmax = 0; + double Ymin = 0; + double Ymax = 0; + double Zmin = 0; + double Zmax = 0; + public: + ReadSTL(string filename) { + // Input Stream setup + ifstream inputfile(filename, ifstream::in); + string line; + string solidName; + // Solid header line + getline(inputfile, line); + // Input string stream for each line + istringstream lineStream(line); + string token; + // Iterate stream past "solid" + lineStream >> token; // Might not be a valid way of iterating stream + // Get solid name + lineStream >> token; + solidName = token; // Might not work + do { + // Process entire solid, looping through each facet + getline(inputfile, line); + istringstream lineStream(line); + lineStream >> token; + if(!token.compare("facet")) { + // Process facet + do { + // Process facet header + // "normal" + lineStream >> token; + // Coord double value + double coord; + // Convert coord string to double + // X Coord + lineStream >> token; + coord = stod(token); + // Min + if(coord < Xmin) { + Xmin = coord; + } + // Max + if(coord > Xmax) { + Xmax = coord; + } + // Y Coord + lineStream >> token; + coord = stod(token); + // Min + if(coord < Ymin) { + Ymin = coord; + } + // Max + if(coord > Ymax) { + Ymax = coord; + } + // Z Coord + lineStream >> token; + coord = stod(token); + // Min + if(coord < Zmin) { + Zmin = coord; + } + // Max + if(coord > Zmax) { + Zmax = coord; + } + // End facet header + do { + getline(inputfile, line); + istringstream lineStream(line); + lineStream >> token; + if(token.compare("vertex")) { + //Process vertex + // No functionality needed + // Does nothing but iterate through each coord + // X coord + lineStream >> token; + // Y coord + lineStream >> token; + // Z coord + lineStream >> token; + } // End vertex line + } while(line.compare("endloop")); // Endloop + } while(line.compare("endfacet")); // Endfacet + // Iterate facet counter + numFacet++; + } + } while (token.compare("endsolid")); + // Close file + inputfile.close(); + } + + int getNumFacets(){ + return numFacet; + } + + double getXmin() { + return Xmin; + } + double getXmax() { + return Xmax; + } + + double getYmin() { + return Ymin; + } + double getYmax() { + return Ymax; + } + + double getZmin() { + return Zmin; + } + double getZmax() { + return Zmax; + } +}; diff --git a/Lab 1/STLFiles/brianascii.stl b/Lab1/STLFiles/brianascii.stl similarity index 100% rename from Lab 1/STLFiles/brianascii.stl rename to Lab1/STLFiles/brianascii.stl diff --git a/Lab 1/STLFiles/shape.stl b/Lab1/STLFiles/shape.stl similarity index 100% rename from Lab 1/STLFiles/shape.stl rename to Lab1/STLFiles/shape.stl diff --git a/Lab1/main.cpp b/Lab1/main.cpp new file mode 100644 index 0000000..6e6f5a8 --- /dev/null +++ b/Lab1/main.cpp @@ -0,0 +1,18 @@ +#include "ReadSTL.cpp" +using namespace std; + +int main(int argc, char** argv) { + + ReadSTL stl1(argv[1]); + cout << "Facets in file:" << stl1.getNumFacets() << endl; + cout << "X Min: " << stl1.getXmin() << endl; + cout << "X Max: " << stl1.getXmax() << endl; + + cout << "Y Min: " << stl1.getYmin() << endl; + cout << "Y Max: " << stl1.getYmax() << endl; + + cout << "Z Min: " << stl1.getZmin() << endl; + cout << "Z Max: " << stl1.getZmax() << endl; + + return 0; +} \ No newline at end of file diff --git a/Lab1/makefile b/Lab1/makefile new file mode 100644 index 0000000..7ad58cd --- /dev/null +++ b/Lab1/makefile @@ -0,0 +1,25 @@ +# lab1barnestr Makefile + +CC = g++ +CFLAGS = -c -MMD +LFLAGS = +# Change w/ every new project +SOURCES = ReadSTL.cpp main.cpp +OBJECTS = $(SOURCES:.cpp=.o) +# Change w/ every new project +EXECUTABLE = lab1barnestr + +all: $(EXECUTABLE) $(SOURCES) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(LFLAGS) -o $@ $(OBJECTS) + +-include * .d + +%.o:%.cpp + $(CC) $(CFLAGS) $< + +clean: + rm -f $(EXECUTABLE) + rm -f $(OBJECTS) + rm -f *.d \ No newline at end of file diff --git a/Lecture/Week1/main b/Lecture/Week1/main deleted file mode 100755 index faa6d0f0d28517ae65d5c146df2b82922106af29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34336 zcmeHwdwg6~z35UqIs;^$xNa%I&Za~W2?a;H~Sq`6p#zI2Mo$flBt0@L5ryi8^kmTgE;olrP z3^epqc>xOJ3dnB?K1l{#24>39HxDfovU+IENO;^S?^!y6mtz;vlzY~Zd)ARN@HMAA z1C2lF6aGEo=*@;Lpz$)0yu3PIN_H__6ku*N+^NyZKqI#eal_U5(cpC4ROU8f`+TwJ}ldMVxQMx?u)eMfygEPX3{3Q6Ke$9J(3j%(yf#kz7hW?u=swKj;L{lUevh4u4yth$+Kw z@{c!YJo~8Wo5Vbsfp<(1#%D9|&eS0I=QHr83=ℜ8C&E^;!l#FNIa=tqi=Kfj4o^ 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