Tue, 16 Apr 2013 18:27:08 +0300
Added functionality for getting a primitive name from a radial.
common.h | file | annotate | diff | comparison | revisions | |
file.cpp | file | annotate | diff | comparison | revisions | |
gui.cpp | file | annotate | diff | comparison | revisions | |
ldtypes.cpp | file | annotate | diff | comparison | revisions | |
ldtypes.h | file | annotate | diff | comparison | revisions | |
misc.cpp | file | annotate | diff | comparison | revisions | |
misc.h | file | annotate | diff | comparison | revisions | |
zz_newPartDialog.cpp | file | annotate | diff | comparison | revisions |
--- a/common.h Tue Apr 16 14:36:56 2013 +0300 +++ b/common.h Tue Apr 16 18:27:08 2013 +0300 @@ -153,7 +153,8 @@ extern const matrix g_mIdentity; typedef unsigned int uint; -typedef unsigned long ulong; +typedef short unsigned int ushort; +typedef long unsigned int ulong; // Typedef out the _t suffices :) typedef int8_t int8;
--- a/file.cpp Tue Apr 16 14:36:56 2013 +0300 +++ b/file.cpp Tue Apr 16 18:27:08 2013 +0300 @@ -330,15 +330,15 @@ // Handle BFC statements if (tokens.size() > 2 && tokens[1] == "BFC") { - for (short i = 0; i < NUM_BFCStatements; ++i) + for (short i = 0; i < LDBFC::NumStatements; ++i) if (zComment == str::mkfmt ("BFC %s", LDBFC::saStatements [i])) - return new LDBFC (i); + return new LDBFC ((LDBFC::Type) i); // MLCAD is notorious for stuffing these statements in parts it // creates. The above block only handles valid statements, so we // need to handle MLCAD-style invertnext separately. if (zComment == "BFC CERTIFY INVERTNEXT") - return new LDBFC (BFC_InvertNext); + return new LDBFC (LDBFC::InvertNext); } if (tokens.size() > 2 && tokens[1] == "!LDFORGE") {
--- a/gui.cpp Tue Apr 16 14:36:56 2013 +0300 +++ b/gui.cpp Tue Apr 16 18:27:08 2013 +0300 @@ -555,15 +555,15 @@ case OBJ_BFC: { LDBFC* bfc = static_cast<LDBFC*> (obj); - zText = LDBFC::saStatements[bfc->dStatement]; + zText = LDBFC::saStatements[bfc->eStatement]; } break; case OBJ_Radial: { LDRadial* pRad = static_cast<LDRadial*> (obj); - zText.format ("%d / %d %s", pRad->dSegments, pRad->dDivisions, - pRad->radialTypeName()); + zText.format ("%s: %d / %d %s", pRad->makeFileName ().chars (), + pRad->dSegments, pRad->dDivisions, pRad->radialTypeName()); if (pRad->eRadialType == LDRadial::Ring || pRad->eRadialType == LDRadial::Cone) zText.appendformat (" %d", pRad->dRingNum);
--- a/ldtypes.cpp Tue Apr 16 14:36:56 2013 +0300 +++ b/ldtypes.cpp Tue Apr 16 18:27:08 2013 +0300 @@ -62,9 +62,6 @@ parent = null; } -void LDObject::commonInit () { -} - LDGibberish::LDGibberish () { dColor = -1; } @@ -185,7 +182,7 @@ }; str LDBFC::getContents () { - return str::mkfmt ("0 BFC %s", LDBFC::saStatements[dStatement]); + return str::mkfmt ("0 BFC %s", LDBFC::saStatements[eStatement]); } // ============================================================================= @@ -243,8 +240,6 @@ } LDLine::LDLine (vertex v1, vertex v2) { - commonInit (); - vaCoords[0] = v1; vaCoords[1] = v2; } @@ -345,7 +340,7 @@ case OBJ_BFC: // Filter non-INVERTNEXT statements - if (static_cast<LDBFC*> (obj)->dStatement != BFC_InvertNext) + if (static_cast<LDBFC*> (obj)->eStatement != LDBFC::InvertNext) continue; break; @@ -679,9 +674,54 @@ return paObjects; } +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= str LDRadial::getContents () { return str::mkfmt ("0 !LDFORGE RADIAL %s %d %d %d %d %s %s", str (radialTypeName()).toupper ().strip (' ').chars (), dColor, dSegments, dDivisions, dRingNum, vPosition.getStringRep (false).chars(), mMatrix.getStringRep().chars()); +} + +char const* g_saRadialNameRoots[] = { + "edge", + "cyli", + "disc", + "ndis", + "ring", + "cone", + null +}; + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= +str LDRadial::makeFileName () { + short dNumerator = dSegments, + dDenominator = dDivisions; + + // Simplify the fractional part, but the denominator is at least 4. + simplify (dNumerator, dDenominator); + + if (dDenominator < 4) { + const short dFactor = (4 / dDenominator); + + dNumerator *= dFactor; + dDenominator *= dFactor; + } + + // Compose some general information: prefix, fraction, root, ring number + str zPrefix = (dDivisions == 16) ? "" : str::mkfmt ("%d/", dDivisions); + str zFrac = str::mkfmt ("%d-%d", dNumerator, dDenominator); + str zRoot = g_saRadialNameRoots[eRadialType]; + str zRingNum = (eRadialType == Ring || eRadialType == Cone) ? str::mkfmt ("%d", dRingNum) : ""; + + // Truncate the root if necessary (7-16rin4.dat for instance). + // However, always keep the root at least 2 characters. + short dExtra = (~zFrac + ~zRingNum + ~zRoot) - 8; + zRoot -= min<short> (max<short> (dExtra, 0), 2); + + // Stick them all together and return the result. + return str::mkfmt ("%s%s%s%s", zPrefix.chars(), zFrac.chars (), zRoot.chars (), zRingNum.chars ()); } \ No newline at end of file
--- a/ldtypes.h Tue Apr 16 14:36:56 2013 +0300 +++ b/ldtypes.h Tue Apr 16 18:27:08 2013 +0300 @@ -99,9 +99,6 @@ return new LDObject (*this); } - // Sets data common to all objects. - void commonInit (); - // Replace this LDObject with another LDObject. This method deletes the // object and any pointers to it become invalid. void replace (LDObject* replacement); @@ -161,7 +158,7 @@ class LDComment : public LDObject { public: IMPLEMENT_LDTYPE (Comment) - LDComment (str zText) : zText (zText) { commonInit (); } + LDComment (str zText) : zText (zText) {} str zText; // The text of this comment }; @@ -174,27 +171,23 @@ // ============================================================================= class LDBFC : public LDComment { public: + enum Type { + CertifyCCW, + CCW, + CertifyCW, + CW, + NoCertify, // Winding becomes disabled (0 BFC NOCERTIFY) + InvertNext, // Winding is inverted for next object (0 BFC INVERTNEXT) + NumStatements + }; + IMPLEMENT_LDTYPE (BFC) - LDBFC (const int dType) : dStatement (dType) { commonInit (); } + LDBFC (const LDBFC::Type eType) : eStatement (eType) {} // Statement strings static const char* saStatements[]; - static str statementString (short dValue); - short dStatement; -}; - - -// ----------------------------------------------------------------------------- -// Enumerator for LDBFC's dStatement -enum LDBFCType_e { - BFC_CertifyCCW, - BFC_CCW, - BFC_CertifyCW, - BFC_CW, - BFC_NoCertify, // Winding becomes disabled (0 BFC NOCERTIFY) - BFC_InvertNext, // Winding is inverted for next object (0 BFC INVERTNEXT) - NUM_BFCStatements + Type eStatement; }; // ============================================================================= @@ -328,8 +321,10 @@ dDivisions (dDivisions), dSegments (dSegments), dRingNum (dRingNum) {} char const* radialTypeName (); + std::vector<LDObject*> decompose (bool bTransform); + str makeFileName (); + static char const* radialTypeName (const LDRadial::Type eType); - std::vector<LDObject*> decompose (bool bTransform); }; // =============================================================================
--- a/misc.cpp Tue Apr 16 14:36:56 2013 +0300 +++ b/misc.cpp Tue Apr 16 18:27:08 2013 +0300 @@ -21,6 +21,60 @@ #include "common.h" #include "misc.h" +// Prime number table. +const ushort g_uaPrimes[NUM_PRIMES] = { + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, +}; + // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= @@ -89,6 +143,32 @@ // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= +void simplify (short& a, short& b) { + bool repeat; + + do { + repeat = false; + + for (ulong x = 0; x < NUM_PRIMES; x++) { + ulong i = NUM_PRIMES - x - 1; + + ushort prime = g_uaPrimes[i]; + if (a <= prime || b <= prime) + continue; + + if (a % prime == 0 && b % prime == 0) { + a /= prime; + b /= prime; + repeat = true; + break; + } + } + } while (repeat); +} + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= stringparser::stringparser (str zInText, char cSeparator) { zaTokens = zInText.split (cSeparator, true); dPos = -1;
--- a/misc.h Tue Apr 16 14:36:56 2013 +0300 +++ b/misc.h Tue Apr 16 18:27:08 2013 +0300 @@ -22,6 +22,9 @@ #include "common.h" #include "str.h" +#define NUM_PRIMES 500 +extern const ushort g_uaPrimes[NUM_PRIMES]; + inline str GetWord (str& zString, ulong ulIndex) { return (zString / " ")[ulIndex]; } @@ -54,6 +57,8 @@ return out; } +void simplify (short& a, short& b); + // ============================================================================= // stringparser //
--- a/zz_newPartDialog.cpp Tue Apr 16 14:36:56 2013 +0300 +++ b/zz_newPartDialog.cpp Tue Apr 16 18:27:08 2013 +0300 @@ -96,10 +96,10 @@ vector<LDObject*>& objs = g_CurrentFile->objects; idx = dlg.qCB_BFCBox->currentIndex (); - const LDBFCType_e eBFCType = - (idx == BFCBOX_CCW) ? BFC_CertifyCCW : - (idx == BFCBOX_CW) ? BFC_CertifyCW : - BFC_NoCertify; + const LDBFC::Type eBFCType = + (idx == BFCBOX_CCW) ? LDBFC::CertifyCCW : + (idx == BFCBOX_CW) ? LDBFC::CertifyCW : + LDBFC::NoCertify; idx = dlg.qCB_LicenseBox->currentIndex (); const char* sLicense =