diff --git a/dist/dxf-parser.js b/dist/dxf-parser.js index a1278b8..80e598f 100644 --- a/dist/dxf-parser.js +++ b/dist/dxf-parser.js @@ -1 +1,375 @@ -!function(e,a){"object"==typeof exports&&"object"==typeof module?module.exports=a():"function"==typeof define&&define.amd?define([],a):"object"==typeof exports?exports.DxfParser=a():e.DxfParser=a()}("undefined"!=typeof self?self:this,function(){return function(e){var a={};function t(r){if(a[r])return a[r].exports;var n=a[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}return t.m=e,t.c=a,t.d=function(e,a,r){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var n in e)t.d(r,n,function(a){return e[a]}.bind(null,n));return r},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="",t(t.s=4)}([function(e,a,t){"use strict";t.d(a,"b",function(){return n}),t.d(a,"a",function(){return o});var r=t(1);function n(e){var a={};e.rewind();var t=e.next(),r=t.code;if(a.x=t.value,r+=10,(t=e.next()).code!=r)throw new Error("Expected code for point value to be "+r+" but got "+t.code+".");return a.y=t.value,r+=10,(t=e.next()).code!=r?(e.rewind(),a):(a.z=t.value,a)}function o(e,a){switch(a.code){case 0:e.type=a.value;break;case 5:e.handle=a.value;break;case 6:e.lineType=a.value;break;case 8:e.layer=a.value;break;case 48:e.lineTypeScale=a.value;break;case 60:e.visible=0===a.value;break;case 62:e.colorIndex=a.value,e.color=(t=Math.abs(a.value),r[t]);break;case 67:e.inPaperSpace=0!==a.value;break;case 100:break;case 330:e.ownerHandle=a.value;break;case 347:e.materialObjectHandle=a.value;break;case 370:e.lineweight=a.value;break;case 420:e.color=a.value;break;case 1e3:e.extendedData=e.extendedData||{},e.extendedData.customStrings=e.extendedData.customStrings||[],e.extendedData.customStrings.push(a.value);break;case 1001:e.extendedData=e.extendedData||{},e.extendedData.applicationName=a.value;break;default:return!1}var t;return!0}},function(e,a,t){"use strict";t.r(a),a.default=[0,16711680,16776960,65280,65535,255,16711935,16777215,8421504,12632256,16711680,16744319,13369344,13395558,10027008,10046540,8323072,8339263,4980736,4990502,16727808,16752511,13382400,13401958,10036736,10051404,8331008,8343359,4985600,4992806,16744192,16760703,13395456,13408614,10046464,10056268,8339200,8347455,4990464,4995366,16760576,16768895,13408512,13415014,10056192,10061132,8347392,8351551,4995328,4997670,16776960,16777087,13421568,13421670,10000384,10000460,8355584,8355647,5000192,5000230,12582656,14679935,10079232,11717734,7510016,8755276,6258432,7307071,3755008,4344870,8388352,12582783,6736896,10079334,5019648,7510092,4161280,6258495,2509824,3755046,4194048,10485631,3394560,8375398,2529280,6264908,2064128,5209919,1264640,3099686,65280,8388479,52224,6736998,38912,5019724,32512,4161343,19456,2509862,65343,8388511,52275,6737023,38950,5019743,32543,4161359,19475,2509871,65407,8388543,52326,6737049,38988,5019762,32575,4161375,19494,2509881,65471,8388575,52377,6737074,39026,5019781,32607,4161391,19513,2509890,65535,8388607,52428,6737100,39064,5019800,32639,4161407,19532,2509900,49151,8380415,39372,6730444,29336,5014936,24447,4157311,14668,2507340,32767,8372223,26316,6724044,19608,5010072,16255,4153215,9804,2505036,16383,8364031,13260,6717388,9880,5005208,8063,4149119,4940,2502476,255,8355839,204,6710988,152,5000344,127,4145023,76,2500172,4129023,10452991,3342540,8349388,2490520,6245528,2031743,5193599,1245260,3089996,8323327,12550143,6684876,10053324,4980888,7490712,4128895,6242175,2490444,3745356,12517631,14647295,10027212,11691724,7471256,8735896,6226047,7290751,3735628,4335180,16711935,16744447,13369548,13395660,9961624,9981080,8323199,8339327,4980812,4990540,16711871,16744415,13369497,13395634,9961586,9981061,8323167,8339311,4980793,4990530,16711807,16744383,13369446,13395609,9961548,9981042,8323135,8339295,4980774,4990521,16711743,16744351,13369395,13395583,9961510,9981023,8323103,8339279,4980755,4990511,3355443,5987163,8684676,11382189,14079702,16777215]},function(e,a,t){"use strict";t.r(a),t.d(a,"default",function(){return n});var r=t(0);function n(){}n.ForEntityName="VERTEX",n.prototype.parseEntity=function(e,a){var t={type:a.value};for(a=e.next();"EOF"!==a&&0!==a.code;){switch(a.code){case 10:t.x=a.value;break;case 20:t.y=a.value;break;case 30:t.z=a.value;break;case 40:case 41:case 42:0!=a.value&&(t.bulge=a.value);break;case 70:t.curveFittingVertex=0!=(1&a.value),t.curveFitTangent=0!=(2&a.value),t.splineVertex=0!=(8&a.value),t.splineControlPoint=0!=(16&a.value),t.threeDPolylineVertex=0!=(32&a.value),t.threeDPolylineMesh=0!=(64&a.value),t.polyfaceMeshVertex=0!=(128&a.value);break;case 50:case 71:case 72:case 73:case 74:break;default:r.a(t,a)}a=e.next()}return t}},function(e,a,t){var r,n;!function(o,c){"use strict";void 0===(n="function"==typeof(r=function(){var e=function(){},a="undefined",t=["trace","debug","info","warn","error"];function r(e,a){var t=e[a];if("function"==typeof t.bind)return t.bind(e);try{return Function.prototype.bind.call(t,e)}catch(a){return function(){return Function.prototype.apply.apply(t,[e,arguments])}}}function n(a,r){for(var n=0;n=0&&r<=u.levels.SILENT))throw"log.setLevel() called with invalid level: "+r;if(i=r,!1!==o&&function(e){var r=(t[e]||"silent").toUpperCase();if(typeof window===a)return;try{return void(window.localStorage[s]=r)}catch(e){}try{window.document.cookie=encodeURIComponent(s)+"="+r+";"}catch(e){}}(r),n.call(u,r,e),typeof console===a&&r=10&&e<=59?parseFloat(a):e>=60&&e<=99?parseInt(a):e>=100&&e<=109?a:e>=110&&e<=149?parseFloat(a):e>=160&&e<=179?parseInt(a):e>=210&&e<=239?parseFloat(a):e>=270&&e<=289?parseInt(a):e>=290&&e<=299?function(e){if("0"===e)return!1;if("1"===e)return!0;throw TypeError("String '"+e+"' cannot be cast to Boolean type")}(a):e>=300&&e<=369?a:e>=370&&e<=389?parseInt(a):e>=390&&e<=399?a:e>=400&&e<=409?parseInt(a):e>=410&&e<=419?a:e>=420&&e<=429?parseInt(a):e>=430&&e<=439?a:e>=440&&e<=459?parseInt(a):e>=460&&e<=469?parseFloat(a):e>=470&&e<=481?a:999===e?a:e>=1e3&&e<=1009?a:e>=1010&&e<=1059?parseFloat(a):e>=1060&&e<=1071?parseInt(a):(console.log("WARNING: Group code does not have a defined type: %j",{code:e,value:a}),a)}t.r(a),r.prototype.next=function(){var e;if(!this.hasNext())throw this._eof?new Error("Cannot call 'next' after EOF group has been read"):new Error("Unexpected end of input: EOF group not read before end of file. Ended on code "+this._data[this._pointer]);return e={code:parseInt(this._data[this._pointer])},this._pointer++,e.value=n(e.code,this._data[this._pointer].trim()),this._pointer++,0===e.code&&"EOF"===e.value&&(this._eof=!0),this.lastReadGroup=e,e},r.prototype.peek=function(){if(!this.hasNext())throw this._eof?new Error("Cannot call 'next' after EOF group has been read"):new Error("Unexpected end of input: EOF group not read before end of file. Ended on code "+this._data[this._pointer]);var e={code:parseInt(this._data[this._pointer])};return e.value=n(e.code,this._data[this._pointer+1].trim()),e},r.prototype.rewind=function(e){e=e||1,this._pointer=this._pointer-2*e},r.prototype.hasNext=function(){return!this._eof&&!(this._pointer>this._data.length-2)},r.prototype.isEOF=function(){return this._eof};var o=t(1),c=t(0);function i(){}function u(e,a){var t,r=[],n=!1,o=!1;for(t=0;t<=4;t++){for(var c={};"EOF"!==a&&0!==a.code&&!o;){switch(a.code){case 10:case 11:case 12:case 13:if(n){o=!0;continue}c.x=a.value,n=!0;break;case 20:case 21:case 22:case 23:c.y=a.value;break;case 30:case 31:case 32:case 33:c.z=a.value;break;default:return r}a=e.next()}r.push(c),n=!1,o=!1}return e.rewind(),r}function s(){}function l(){}function d(){}function v(){}function b(){}function f(){}function p(){}function k(){}function y(e,a){if(!e||e<=0)throw Error("n must be greater than 0 verticies");var t,r=[],n=!1,o=!1,c=a.lastReadGroup;for(t=0;t0&&(o.pattern=[]),t=a.next();break;case 40:o.patternLength=t.value,t=a.next();break;case 49:o.pattern.push(t.value),t=a.next();break;case 0:O.debug("}"),r>0&&r!==o.pattern.length&&O.warn("lengths do not match on LTYPE pattern"),n[e]=o,o={},O.debug("LType {"),t=a.next();break;default:t=a.next()}return O.debug("}"),n[e]=o,n}},LAYER:{tableRecordsProperty:"layers",tableName:"layer",dxfSymbolName:"LAYER",parseTableRecords:function(){var e,r,n={},c={};for(O.debug("Layer {"),t=a.next();!s(0,"ENDTAB");)switch(t.code){case 2:c.name=t.value,e=t.value,t=a.next();break;case 62:c.visible=t.value>=0,c.colorIndex=Math.abs(t.value),c.color=(r=c.colorIndex,o.default[r]),t=a.next();break;case 70:c.frozen=0!=(1&t.value)||0!=(2&t.value),t=a.next();break;case 0:"LAYER"===t.value&&(O.debug("}"),n[e]=c,O.debug("Layer {"),c={},e=void 0,t=a.next());break;default:T(t),t=a.next()}return O.debug("}"),n[e]=c,n}}},k=function(e){var r=[],n=e?"ENDBLK":"ENDSEC";for(e||(t=a.next());;)if(0===t.code){if(t.value===n)break;var o,c=u._entityHandlers[t.value];if(null==c){O.warn("Unhandled entity "+t.value),t=a.next();continue}O.debug(t.value+" {"),o=c.parseEntity(a,t),t=a.lastReadGroup,O.debug("}"),x(o),r.push(o)}else t=a.next();return"ENDSEC"==n&&(t=a.next()),r},y=function(){var e={},r=t.code;if(e.x=t.value,r+=10,(t=a.next()).code!=r)throw new Error("Expected code for point value to be "+r+" but got "+t.code+".");return e.y=t.value,r+=10,(t=a.next()).code!=r?(a.rewind(),e):(e.z=t.value,e)},x=function(e){if(!e)throw new TypeError("entity cannot be undefined or null");e.handle||(e.handle=c++)};return function(){for(t=a.next();!a.isEOF();)if(0===t.code&&"SECTION"===t.value){if(2!==(t=a.next()).code){console.error("Unexpected code %s after 0:SECTION",S(t)),t=a.next();continue}"HEADER"===t.value?(O.debug("> HEADER"),n.header=l(),O.debug("<")):"BLOCKS"===t.value?(O.debug("> BLOCKS"),n.blocks=d(),O.debug("<")):"ENTITIES"===t.value?(O.debug("> ENTITIES"),n.entities=k(!1),O.debug("<")):"TABLES"===t.value?(O.debug("> TABLES"),n.tables=b(),O.debug("<")):"EOF"===t.value?O.debug("EOF"):O.warn("Skipping section '%s'",t.value)}else t=a.next()}(),n};a.default=N}]).default}); \ No newline at end of file +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["DxfParser"] = factory(); + else + root["DxfParser"] = factory(); +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/loglevel/lib/loglevel.js": +/*!***********************************************!*\ + !*** ./node_modules/loglevel/lib/loglevel.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = \"loglevel\";\n if (name) {\n storageKey += \":\" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== \"string\" || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n\n\n//# sourceURL=webpack://DxfParser/./node_modules/loglevel/lib/loglevel.js?"); + +/***/ }), + +/***/ "./src/AutoCadColorIndex.js": +/*!**********************************!*\ + !*** ./src/AutoCadColorIndex.js ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\r\n * AutoCad files sometimes use an indexed color value between 1 and 255 inclusive.\r\n * Each value corresponds to a color. index 1 is red, that is 16711680 or 0xFF0000.\r\n * index 0 and 256, while included in this array, are actually reserved for inheritance\r\n * values in AutoCad so they should not be used for index color lookups.\r\n */\r\n\r\n/* harmony default export */ __webpack_exports__[\"default\"] = ([\r\n 0,\r\n 16711680,\r\n 16776960,\r\n 65280,\r\n 65535,\r\n 255,\r\n 16711935,\r\n 16777215,\r\n 8421504,\r\n 12632256,\r\n 16711680,\r\n 16744319,\r\n 13369344,\r\n 13395558,\r\n 10027008,\r\n 10046540,\r\n 8323072,\r\n 8339263,\r\n 4980736,\r\n 4990502,\r\n 16727808,\r\n 16752511,\r\n 13382400,\r\n 13401958,\r\n 10036736,\r\n 10051404,\r\n 8331008,\r\n 8343359,\r\n 4985600,\r\n 4992806,\r\n 16744192,\r\n 16760703,\r\n 13395456,\r\n 13408614,\r\n 10046464,\r\n 10056268,\r\n 8339200,\r\n 8347455,\r\n 4990464,\r\n 4995366,\r\n 16760576,\r\n 16768895,\r\n 13408512,\r\n 13415014,\r\n 10056192,\r\n 10061132,\r\n 8347392,\r\n 8351551,\r\n 4995328,\r\n 4997670,\r\n 16776960,\r\n 16777087,\r\n 13421568,\r\n 13421670,\r\n 10000384,\r\n 10000460,\r\n 8355584,\r\n 8355647,\r\n 5000192,\r\n 5000230,\r\n 12582656,\r\n 14679935,\r\n 10079232,\r\n 11717734,\r\n 7510016,\r\n 8755276,\r\n 6258432,\r\n 7307071,\r\n 3755008,\r\n 4344870,\r\n 8388352,\r\n 12582783,\r\n 6736896,\r\n 10079334,\r\n 5019648,\r\n 7510092,\r\n 4161280,\r\n 6258495,\r\n 2509824,\r\n 3755046,\r\n 4194048,\r\n 10485631,\r\n 3394560,\r\n 8375398,\r\n 2529280,\r\n 6264908,\r\n 2064128,\r\n 5209919,\r\n 1264640,\r\n 3099686,\r\n 65280,\r\n 8388479,\r\n 52224,\r\n 6736998,\r\n 38912,\r\n 5019724,\r\n 32512,\r\n 4161343,\r\n 19456,\r\n 2509862,\r\n 65343,\r\n 8388511,\r\n 52275,\r\n 6737023,\r\n 38950,\r\n 5019743,\r\n 32543,\r\n 4161359,\r\n 19475,\r\n 2509871,\r\n 65407,\r\n 8388543,\r\n 52326,\r\n 6737049,\r\n 38988,\r\n 5019762,\r\n 32575,\r\n 4161375,\r\n 19494,\r\n 2509881,\r\n 65471,\r\n 8388575,\r\n 52377,\r\n 6737074,\r\n 39026,\r\n 5019781,\r\n 32607,\r\n 4161391,\r\n 19513,\r\n 2509890,\r\n 65535,\r\n 8388607,\r\n 52428,\r\n 6737100,\r\n 39064,\r\n 5019800,\r\n 32639,\r\n 4161407,\r\n 19532,\r\n 2509900,\r\n 49151,\r\n 8380415,\r\n 39372,\r\n 6730444,\r\n 29336,\r\n 5014936,\r\n 24447,\r\n 4157311,\r\n 14668,\r\n 2507340,\r\n 32767,\r\n 8372223,\r\n 26316,\r\n 6724044,\r\n 19608,\r\n 5010072,\r\n 16255,\r\n 4153215,\r\n 9804,\r\n 2505036,\r\n 16383,\r\n 8364031,\r\n 13260,\r\n 6717388,\r\n 9880,\r\n 5005208,\r\n 8063,\r\n 4149119,\r\n 4940,\r\n 2502476,\r\n 255,\r\n 8355839,\r\n 204,\r\n 6710988,\r\n 152,\r\n 5000344,\r\n 127,\r\n 4145023,\r\n 76,\r\n 2500172,\r\n 4129023,\r\n 10452991,\r\n 3342540,\r\n 8349388,\r\n 2490520,\r\n 6245528,\r\n 2031743,\r\n 5193599,\r\n 1245260,\r\n 3089996,\r\n 8323327,\r\n 12550143,\r\n 6684876,\r\n 10053324,\r\n 4980888,\r\n 7490712,\r\n 4128895,\r\n 6242175,\r\n 2490444,\r\n 3745356,\r\n 12517631,\r\n 14647295,\r\n 10027212,\r\n 11691724,\r\n 7471256,\r\n 8735896,\r\n 6226047,\r\n 7290751,\r\n 3735628,\r\n 4335180,\r\n 16711935,\r\n 16744447,\r\n 13369548,\r\n 13395660,\r\n 9961624,\r\n 9981080,\r\n 8323199,\r\n 8339327,\r\n 4980812,\r\n 4990540,\r\n 16711871,\r\n 16744415,\r\n 13369497,\r\n 13395634,\r\n 9961586,\r\n 9981061,\r\n 8323167,\r\n 8339311,\r\n 4980793,\r\n 4990530,\r\n 16711807,\r\n 16744383,\r\n 13369446,\r\n 13395609,\r\n 9961548,\r\n 9981042,\r\n 8323135,\r\n 8339295,\r\n 4980774,\r\n 4990521,\r\n 16711743,\r\n 16744351,\r\n 13369395,\r\n 13395583,\r\n 9961510,\r\n 9981023,\r\n 8323103,\r\n 8339279,\r\n 4980755,\r\n 4990511,\r\n 3355443,\r\n 5987163,\r\n 8684676,\r\n 11382189,\r\n 14079702,\r\n 16777215\r\n]);\n\n//# sourceURL=webpack://DxfParser/./src/AutoCadColorIndex.js?"); + +/***/ }), + +/***/ "./src/DxfArrayScanner.js": +/*!********************************!*\ + !*** ./src/DxfArrayScanner.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return DxfArrayScanner; });\n/**\r\n * DxfArrayScanner\r\n *\r\n * Based off the AutoCad 2012 DXF Reference\r\n * http://images.autodesk.com/adsk/files/autocad_2012_pdf_dxf-reference_enu.pdf\r\n *\r\n * Reads through an array representing lines of a dxf file. Takes an array and\r\n * provides an easy interface to extract group code and value pairs.\r\n * @param data - an array where each element represents a line in the dxf file\r\n * @constructor\r\n */\r\nfunction DxfArrayScanner(data) {\r\n\tthis._pointer = 0;\r\n\tthis._data = data;\r\n\tthis._eof = false;\r\n}\r\n\r\n/**\r\n * Gets the next group (code, value) from the array. A group is two consecutive elements\r\n * in the array. The first is the code, the second is the value.\r\n * @returns {{code: Number}|*}\r\n */\r\nDxfArrayScanner.prototype.next = function() {\r\n\tvar group;\r\n\tif(!this.hasNext()) {\r\n\t\tif(!this._eof)\r\n\t\t\tthrow new Error('Unexpected end of input: EOF group not read before end of file. Ended on code ' + this._data[this._pointer]);\r\n\t\telse\r\n\t\t\tthrow new Error('Cannot call \\'next\\' after EOF group has been read');\r\n\t}\r\n\r\n\tgroup = {\r\n\t\tcode: parseInt(this._data[this._pointer])\r\n\t};\r\n\r\n\tthis._pointer++;\r\n\r\n\tgroup.value = parseGroupValue(group.code, this._data[this._pointer].trim());\r\n\t\r\n\tthis._pointer++;\r\n\r\n\tif(group.code === 0 && group.value === 'EOF') this._eof = true;\r\n\r\n\tthis.lastReadGroup = group;\r\n\r\n\treturn group;\r\n};\r\n\r\nDxfArrayScanner.prototype.peek = function() {\r\n\tif(!this.hasNext()) {\r\n\t\tif(!this._eof)\r\n\t\t\tthrow new Error('Unexpected end of input: EOF group not read before end of file. Ended on code ' + this._data[this._pointer]);\r\n\t\telse\r\n\t\t\tthrow new Error('Cannot call \\'next\\' after EOF group has been read');\r\n\t}\r\n\t\r\n\tvar group = {\r\n\t\tcode: parseInt(this._data[this._pointer])\r\n\t};\r\n\r\n\tgroup.value = parseGroupValue(group.code, this._data[this._pointer + 1].trim());\r\n\r\n\treturn group;\r\n};\r\n\r\n\r\nDxfArrayScanner.prototype.rewind = function(numberOfGroups) {\r\n\tnumberOfGroups = numberOfGroups || 1;\r\n\tthis._pointer = this._pointer - numberOfGroups * 2;\r\n};\r\n\r\n/**\r\n * Returns true if there is another code/value pair (2 elements in the array).\r\n * @returns {boolean}\r\n */\r\nDxfArrayScanner.prototype.hasNext = function() {\r\n\t// Check if we have read EOF group code\r\n\tif(this._eof) {\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\t// We need to be sure there are two lines available\r\n\tif(this._pointer > this._data.length - 2) {\r\n\t\treturn false;\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n/**\r\n * Returns true if the scanner is at the end of the array\r\n * @returns {boolean}\r\n */\r\nDxfArrayScanner.prototype.isEOF = function() {\r\n\treturn this._eof;\r\n};\r\n\r\n/**\r\n * Parse a value to its proper type.\r\n * See pages 3 - 10 of the AutoCad DXF 2012 reference given at the top of this file\r\n *\r\n * @param code\r\n * @param value\r\n * @returns {*}\r\n */\r\nfunction parseGroupValue(code, value) {\r\n\tif(code <= 9) return value;\r\n\tif(code >= 10 && code <= 59) return parseFloat(value);\r\n\tif(code >= 60 && code <= 99) return parseInt(value);\r\n\tif(code >= 100 && code <= 109) return value;\r\n\tif(code >= 110 && code <= 149) return parseFloat(value);\r\n\tif(code >= 160 && code <= 179) return parseInt(value);\r\n\tif(code >= 210 && code <= 239) return parseFloat(value);\r\n\tif(code >= 270 && code <= 289) return parseInt(value);\r\n\tif(code >= 290 && code <= 299) return parseBoolean(value);\r\n\tif(code >= 300 && code <= 369) return value;\r\n\tif(code >= 370 && code <= 389) return parseInt(value);\r\n\tif(code >= 390 && code <= 399) return value;\r\n\tif(code >= 400 && code <= 409) return parseInt(value);\r\n\tif(code >= 410 && code <= 419) return value;\r\n\tif(code >= 420 && code <= 429) return parseInt(value);\r\n\tif(code >= 430 && code <= 439) return value;\r\n\tif(code >= 440 && code <= 459) return parseInt(value);\r\n\tif(code >= 460 && code <= 469) return parseFloat(value);\r\n\tif(code >= 470 && code <= 481) return value;\r\n\tif(code === 999) return value;\r\n\tif(code >= 1000 && code <= 1009) return value;\r\n\tif(code >= 1010 && code <= 1059) return parseFloat(value);\r\n\tif(code >= 1060 && code <= 1071) return parseInt(value);\r\n\r\n\tconsole.log('WARNING: Group code does not have a defined type: %j', { code: code, value: value });\r\n\treturn value;\r\n}\r\n\r\n/**\r\n * Parse a boolean according to a 1 or 0 value\r\n * @param str\r\n * @returns {boolean}\r\n */\r\nfunction parseBoolean(str) {\r\n\tif(str === '0') return false;\r\n\tif(str === '1') return true;\r\n\tthrow TypeError('String \\'' + str + '\\' cannot be cast to Boolean type');\r\n}\n\n//# sourceURL=webpack://DxfParser/./src/DxfArrayScanner.js?"); + +/***/ }), + +/***/ "./src/DxfParser.js": +/*!**************************!*\ + !*** ./src/DxfParser.js ***! + \**************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return DxfParser; });\n/* harmony import */ var _DxfArrayScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DxfArrayScanner */ \"./src/DxfArrayScanner.js\");\n/* harmony import */ var _AutoCadColorIndex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AutoCadColorIndex */ \"./src/AutoCadColorIndex.js\");\n/* harmony import */ var _entities_3dface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./entities/3dface */ \"./src/entities/3dface.js\");\n/* harmony import */ var _entities_arc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./entities/arc */ \"./src/entities/arc.js\");\n/* harmony import */ var _entities_attdef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./entities/attdef */ \"./src/entities/attdef.js\");\n/* harmony import */ var _entities_circle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./entities/circle */ \"./src/entities/circle.js\");\n/* harmony import */ var _entities_dimension__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./entities/dimension */ \"./src/entities/dimension.js\");\n/* harmony import */ var _entities_ellipse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./entities/ellipse */ \"./src/entities/ellipse.js\");\n/* harmony import */ var _entities_hatch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./entities/hatch */ \"./src/entities/hatch.js\");\n/* harmony import */ var _entities_insert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./entities/insert */ \"./src/entities/insert.js\");\n/* harmony import */ var _entities_line__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./entities/line */ \"./src/entities/line.js\");\n/* harmony import */ var _entities_lwpolyline__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./entities/lwpolyline */ \"./src/entities/lwpolyline.js\");\n/* harmony import */ var _entities_mtext__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./entities/mtext */ \"./src/entities/mtext.js\");\n/* harmony import */ var _entities_point__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./entities/point */ \"./src/entities/point.js\");\n/* harmony import */ var _entities_polyline__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./entities/polyline */ \"./src/entities/polyline.js\");\n/* harmony import */ var _entities_solid__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./entities/solid */ \"./src/entities/solid.js\");\n/* harmony import */ var _entities_spline__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./entities/spline */ \"./src/entities/spline.js\");\n/* harmony import */ var _entities_text__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./entities/text */ \"./src/entities/text.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//import Vertex from './entities/';\r\n\r\nvar log = __webpack_require__(/*! loglevel */ \"./node_modules/loglevel/lib/loglevel.js\");\r\n\r\n//log.setLevel('trace');\r\n//log.setLevel('debug');\r\n//log.setLevel('info');\r\n//log.setLevel('warn');\r\nlog.setLevel('error');\r\n//log.setLevel('silent');\r\n\r\nfunction registerDefaultEntityHandlers(dxfParser) {\r\n\t// Supported entities here (some entity code is still being refactored into this flow)\r\n\tdxfParser.registerEntityHandler(_entities_3dface__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_arc__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_attdef__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_circle__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_dimension__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_ellipse__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_hatch__WEBPACK_IMPORTED_MODULE_8__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_insert__WEBPACK_IMPORTED_MODULE_9__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_line__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_lwpolyline__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_mtext__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_point__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_polyline__WEBPACK_IMPORTED_MODULE_14__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_solid__WEBPACK_IMPORTED_MODULE_15__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_spline__WEBPACK_IMPORTED_MODULE_16__[\"default\"]);\r\n\tdxfParser.registerEntityHandler(_entities_text__WEBPACK_IMPORTED_MODULE_17__[\"default\"]);\r\n\t//dxfParser.registerEntityHandler(require('./entities/vertex'));\r\n}\r\n\r\nfunction DxfParser() {\r\n\tthis._entityHandlers = {};\r\n\r\n\tregisterDefaultEntityHandlers(this);\r\n}\r\n\r\nDxfParser.prototype.parse = function(source, done) {\r\n\tthrow new Error(\"read() not implemented. Use readSync()\");\r\n};\r\n\r\nDxfParser.prototype.registerEntityHandler = function(handlerType) {\r\n\tvar instance = new handlerType();\r\n\tthis._entityHandlers[handlerType.ForEntityName] = instance;\r\n}\r\n\r\nDxfParser.prototype.parseSync = function(source) {\r\n\tif(typeof(source) === 'string') {\r\n\t\treturn this._parse(source);\r\n\t}else {\r\n\t\tconsole.error('Cannot read dxf source of type `' + typeof(source));\r\n\t\treturn null;\r\n\t}\r\n};\r\n\r\nDxfParser.prototype.parseStream = function(stream, done) {\r\n\r\n\tvar dxfString = \"\";\r\n\tvar self = this;\r\n\r\n\tstream.on('data', onData);\r\n\tstream.on('end', onEnd);\r\n\tstream.on('error', onError);\r\n\r\n\tfunction onData(chunk) {\r\n\t\tdxfString += chunk;\r\n\t}\r\n\r\n\tfunction onEnd() {\r\n\t\ttry {\r\n\t\t\tvar dxf = self._parse(dxfString);\r\n\t\t}catch(err) {\r\n\t\t\treturn done(err);\r\n\t\t}\r\n\t\tdone(null, dxf);\r\n\t}\r\n\r\n\tfunction onError(err) {\r\n\t\tdone(err);\r\n\t}\r\n};\r\n\r\nDxfParser.prototype._parse = function(dxfString) {\r\n\tvar scanner, curr, dxf = {}, lastHandle = 0;\r\n\tvar dxfLinesArray = dxfString.split(/\\r\\n|\\r|\\n/g);\r\n\r\n\tscanner = new _DxfArrayScanner__WEBPACK_IMPORTED_MODULE_0__[\"default\"](dxfLinesArray);\r\n\tif(!scanner.hasNext()) throw Error('Empty file');\r\n\r\n\tvar self = this;\r\n\r\n\tvar parseAll = function() {\r\n\t\tcurr = scanner.next();\r\n\t\twhile(!scanner.isEOF()) {\r\n\t\t\tif(curr.code === 0 && curr.value === 'SECTION') {\r\n\t\t\t\tcurr = scanner.next();\r\n\r\n\t\t\t\t// Be sure we are reading a section code\r\n\t\t\t\tif (curr.code !== 2) {\r\n\t\t\t\t\tconsole.error('Unexpected code %s after 0:SECTION', debugCode(curr));\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (curr.value === 'HEADER') {\r\n\t\t\t\t\tlog.debug('> HEADER');\r\n\t\t\t\t\tdxf.header = parseHeader();\r\n\t\t\t\t\tlog.debug('<');\r\n\t\t\t\t} else if (curr.value === 'BLOCKS') {\r\n\t\t\t\t\tlog.debug('> BLOCKS');\r\n\t\t\t\t\tdxf.blocks = parseBlocks();\r\n\t\t\t\t\tlog.debug('<');\r\n\t\t\t\t} else if(curr.value === 'ENTITIES') {\r\n\t\t\t\t\tlog.debug('> ENTITIES');\r\n\t\t\t\t\tdxf.entities = parseEntities(false);\r\n\t\t\t\t\tlog.debug('<');\r\n\t\t\t\t} else if(curr.value === 'TABLES') {\r\n\t\t\t\t\tlog.debug('> TABLES');\r\n\t\t\t\t\tdxf.tables = parseTables();\r\n\t\t\t\t\tlog.debug('<');\r\n\t\t\t\t} else if(curr.value === 'EOF') {\r\n\t\t\t\t\tlog.debug('EOF');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog.warn('Skipping section \\'%s\\'', curr.value);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t\t// If is a new section\r\n\t\t}\r\n\t};\r\n\r\n\tvar groupIs = function(code, value) {\r\n\t\treturn curr.code === code && curr.value === value;\r\n\t};\r\n\r\n\t/**\r\n\t *\r\n\t * @return {object} header\r\n\t */\r\n\tvar parseHeader = function() {\r\n\t\t// interesting variables:\r\n\t\t// $ACADVER, $VIEWDIR, $VIEWSIZE, $VIEWCTR, $TDCREATE, $TDUPDATE\r\n\t\t// http://www.autodesk.com/techpubs/autocad/acadr14/dxf/header_section_al_u05_c.htm\r\n\t\t// Also see VPORT table entries\r\n\t\tvar currVarName = null, currVarValue = null;\r\n\t\tvar header = {};\r\n\t\t// loop through header variables\r\n\t\tcurr = scanner.next();\r\n\r\n\t\twhile(true) {\r\n\t\t\tif(groupIs(0, 'ENDSEC')) {\r\n\t\t\t\tif(currVarName) header[currVarName] = currVarValue;\r\n\t\t\t\tbreak;\r\n\t\t\t} else if(curr.code === 9) {\r\n\t\t\t\tif(currVarName) header[currVarName] = currVarValue;\r\n\t\t\t\tcurrVarName = curr.value;\r\n\t\t\t\t// Filter here for particular variables we are interested in\r\n\t\t\t} else {\r\n\t\t\t\tif(curr.code === 10) {\r\n\t\t\t\t\tcurrVarValue = { x: curr.value };\r\n\t\t\t\t} else if(curr.code === 20) {\r\n\t\t\t\t\tcurrVarValue.y = curr.value;\r\n\t\t\t\t} else if(curr.code === 30) {\r\n\t\t\t\t\tcurrVarValue.z = curr.value;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcurrVarValue = curr.value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcurr = scanner.next();\r\n\t\t}\r\n\t\t// console.log(util.inspect(header, { colors: true, depth: null }));\r\n\t\tcurr = scanner.next(); // swallow up ENDSEC\r\n\t\treturn header;\r\n\t};\r\n\r\n\r\n\t/**\r\n\t *\r\n\t */\r\n\tvar parseBlocks = function() {\r\n\t\tvar blocks = {}, block;\r\n\r\n curr = scanner.next();\r\n\r\n\t\twhile(curr.value !== 'EOF') {\r\n\t\t\tif(groupIs(0, 'ENDSEC')) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif(groupIs(0, 'BLOCK')) {\r\n\t\t\t\tlog.debug('block {');\r\n\t\t\t\tblock = parseBlock();\r\n\t\t\t\tlog.debug('}');\r\n\t\t\t\tensureHandle(block);\r\n if(!block.name)\r\n log.error('block with handle \"' + block.handle + '\" is missing a name.');\r\n\t\t\t\telse\r\n blocks[block.name] = block;\r\n\t\t\t} else {\r\n\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn blocks;\r\n\t};\r\n\r\n\tvar parseBlock = function() {\r\n\t\tvar block = {};\r\n\t\tcurr = scanner.next();\r\n\r\n\t\twhile(curr.value !== 'EOF') {\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tblock.xrefPath = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tblock.name = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tblock.name2 = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\tblock.handle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 8:\r\n\t\t\t\t\tblock.layer = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 10:\r\n\t\t\t\t\tblock.position = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 67:\r\n\t\t\t\t\tblock.paperSpace = (curr.value && curr.value == 1) ? true : false;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 70:\r\n\t\t\t\t\tif (curr.value != 0) {\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_ANONYMOUS_FLAG) console.log(' Anonymous block');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_NON_CONSTANT_FLAG) console.log(' Non-constant attributes');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_XREF_FLAG) console.log(' Is xref');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_XREF_OVERLAY_FLAG) console.log(' Is xref overlay');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_EXTERNALLY_DEPENDENT_FLAG) console.log(' Is externally dependent');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_RESOLVED_OR_DEPENDENT_FLAG) console.log(' Is resolved xref or dependent of an xref');\r\n\t\t\t\t\t\t//if(curr.value & BLOCK_REFERENCED_XREF) console.log(' This definition is a referenced xref');\r\n\t\t\t\t\t\tblock.type = curr.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 100:\r\n\t\t\t\t\t// ignore class markers\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 330:\r\n\t\t\t\t\tblock.ownerHandle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tif(curr.value == 'ENDBLK')\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tblock.entities = parseEntities(true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\r\n\t\t\tif(groupIs(0, 'ENDBLK')) {\r\n\t\t\t\tcurr = scanner.next();\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn block;\r\n\t};\r\n\r\n\t/**\r\n\t * parseTables\r\n\t * @return {Object} Object representing tables\r\n\t */\r\n\tvar parseTables = function() {\r\n\t\tvar tables = {};\r\n\t\tcurr = scanner.next();\r\n\t\twhile(curr.value !== 'EOF') {\r\n\t\t\tif(groupIs(0, 'ENDSEC'))\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tif(groupIs(0, 'TABLE')) {\r\n\t\t\t\tcurr = scanner.next();\r\n\r\n\t\t\t\tvar tableDefinition = tableDefinitions[curr.value];\r\n\t\t\t\tif(tableDefinition) {\r\n\t\t\t\t\tlog.debug(curr.value + ' Table {');\r\n\t\t\t\t\ttables[tableDefinitions[curr.value].tableName] = parseTable();\r\n\t\t\t\t\tlog.debug('}');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog.debug('Unhandled Table ' + curr.value);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// else ignored\r\n\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcurr = scanner.next();\r\n\t\treturn tables;\r\n\t};\r\n\r\n\tconst END_OF_TABLE_VALUE = 'ENDTAB';\r\n\r\n\tvar parseTable = function() {\r\n\t\tvar tableDefinition = tableDefinitions[curr.value],\r\n\t\t\ttable = {},\r\n\t\t\texpectedCount = 0,\r\n\t\t\tactualCount;\r\n\r\n\t\tcurr = scanner.next();\r\n\t\twhile(!groupIs(0, END_OF_TABLE_VALUE)) {\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\ttable.handle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 330:\r\n\t\t\t\t\ttable.ownerHandle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 100:\r\n\t\t\t\t\tif(curr.value === 'AcDbSymbolTable') {\r\n\t\t\t\t\t\t// ignore\r\n\t\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 70:\r\n\t\t\t\t\texpectedCount = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tif(curr.value === tableDefinition.dxfSymbolName) {\r\n\t\t\t\t\t\ttable[tableDefinition.tableRecordsProperty] = tableDefinition.parseTableRecords();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar tableRecords = table[tableDefinition.tableRecordsProperty];\r\n\t\tif(tableRecords) {\r\n\t\t\tif(tableRecords.constructor === Array){\r\n\t\t\t\tactualCount = tableRecords.length;\r\n\t\t\t} else if(typeof(tableRecords) === 'object') {\r\n\t\t\t\tactualCount = Object.keys(tableRecords).length;\r\n\t\t\t}\r\n\t\t\tif(expectedCount !== actualCount) log.warn('Parsed ' + actualCount + ' ' + tableDefinition.dxfSymbolName + '\\'s but expected ' + expectedCount);\r\n\t\t}\r\n\t\tcurr = scanner.next();\r\n\t\treturn table;\r\n\t};\r\n\r\n\tvar parseViewPortRecords = function() {\r\n\t\tvar viewPorts = [], // Multiple table entries may have the same name indicating a multiple viewport configuration\r\n\t\t\tviewPort = {};\r\n\r\n\t\tlog.debug('ViewPort {');\r\n\t\tcurr = scanner.next();\r\n\t\twhile(!groupIs(0, END_OF_TABLE_VALUE)) {\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 2: // layer name\r\n\t\t\t\t\tviewPort.name = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 10:\r\n\t\t\t\t\tviewPort.lowerLeftCorner = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 11:\r\n\t\t\t\t\tviewPort.upperRightCorner = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 12:\r\n\t\t\t\t\tviewPort.center = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 13:\r\n\t\t\t\t\tviewPort.snapBasePoint = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 14:\r\n\t\t\t\t\tviewPort.snapSpacing = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 15:\r\n\t\t\t\t\tviewPort.gridSpacing = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 16:\r\n\t\t\t\t\tviewPort.viewDirectionFromTarget = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 17:\r\n\t\t\t\t\tviewPort.viewTarget = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 42:\r\n\t\t\t\t\tviewPort.lensLength = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 43:\r\n\t\t\t\t\tviewPort.frontClippingPlane = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 44:\r\n\t\t\t\t\tviewPort.backClippingPlane = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 45:\r\n\t\t\t\t\tviewPort.viewHeight = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 50:\r\n\t\t\t\t\tviewPort.snapRotationAngle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 51:\r\n\t\t\t\t\tviewPort.viewTwistAngle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n case 79:\r\n viewPort.orthographicType = curr.value;\r\n curr = scanner.next();\r\n break;\r\n\t\t\t\tcase 110:\r\n\t\t\t\t\tviewPort.ucsOrigin = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 111:\r\n\t\t\t\t\tviewPort.ucsXAxis = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 112:\r\n\t\t\t\t\tviewPort.ucsYAxis = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 110:\r\n\t\t\t\t\tviewPort.ucsOrigin = parsePoint();\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 281:\r\n\t\t\t\t\tviewPort.renderMode = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 281:\r\n\t\t\t\t\t// 0 is one distant light, 1 is two distant lights\r\n\t\t\t\t\tviewPort.defaultLightingType = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 292:\r\n\t\t\t\t\tviewPort.defaultLightingOn = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 330:\r\n\t\t\t\t\tviewPort.ownerHandle = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 63:\r\n\t\t\t\tcase 421:\r\n\t\t\t\tcase 431:\r\n\t\t\t\t\tviewPort.ambientColor = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\t// New ViewPort\r\n\t\t\t\t\tif(curr.value === 'VPORT') {\r\n\t\t\t\t\t\tlog.debug('}');\r\n\t\t\t\t\t\tviewPorts.push(viewPort);\r\n\t\t\t\t\t\tlog.debug('ViewPort {');\r\n\t\t\t\t\t\tviewPort = {};\r\n\t\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Note: do not call scanner.next() here,\r\n\t\t// parseTable() needs the current group\r\n\t\tlog.debug('}');\r\n\t\tviewPorts.push(viewPort);\r\n\r\n\t\treturn viewPorts;\r\n\t};\r\n\r\n\tvar parseLineTypes = function() {\r\n\t\tvar ltypes = {},\r\n\t\t\tltypeName,\r\n\t\t\tltype = {},\r\n\t\t\tlength;\r\n\r\n\t\tlog.debug('LType {');\r\n\t\tcurr = scanner.next();\r\n\t\twhile(!groupIs(0, 'ENDTAB')) {\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tltype.name = curr.value;\r\n\t\t\t\t\tltypeName = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tltype.description = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 73: // Number of elements for this line type (dots, dashes, spaces);\r\n\t\t\t\t\tlength = curr.value;\r\n\t\t\t\t\tif(length > 0) ltype.pattern = [];\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 40: // total pattern length\r\n\t\t\t\t\tltype.patternLength = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 49:\r\n\t\t\t\t\tltype.pattern.push(curr.value);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tlog.debug('}');\r\n\t\t\t\t\tif(length > 0 && length !== ltype.pattern.length) log.warn('lengths do not match on LTYPE pattern');\r\n\t\t\t\t\tltypes[ltypeName] = ltype;\r\n\t\t\t\t\tltype = {};\r\n\t\t\t\t\tlog.debug('LType {');\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog.debug('}');\r\n\t\tltypes[ltypeName] = ltype;\r\n\t\treturn ltypes;\r\n\t};\r\n\r\n\tvar parseLayers = function() {\r\n\t\tvar layers = {},\r\n\t\t\tlayerName,\r\n\t\t\tlayer = {};\r\n\r\n\t\tlog.debug('Layer {');\r\n\t\tcurr = scanner.next();\r\n\t\twhile(!groupIs(0, 'ENDTAB')) {\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 2: // layer name\r\n\t\t\t\t\tlayer.name = curr.value;\r\n\t\t\t\t\tlayerName = curr.value;\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 62: // color, visibility\r\n\t\t\t\t\tlayer.visible = curr.value >= 0;\r\n\t\t\t\t\t// TODO 0 and 256 are BYBLOCK and BYLAYER respectively. Need to handle these values for layers?.\r\n\t\t\t\t\tlayer.colorIndex = Math.abs(curr.value);\r\n\t\t\t\t\tlayer.color = getAcadColor(layer.colorIndex);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 70: // frozen layer\r\n\t\t\t\t\tlayer.frozen = ((curr.value & 1) != 0 || (curr.value & 2) != 0);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\t// New Layer\r\n\t\t\t\t\tif(curr.value === 'LAYER') {\r\n\t\t\t\t\t\tlog.debug('}');\r\n\t\t\t\t\t\tlayers[layerName] = layer;\r\n\t\t\t\t\t\tlog.debug('Layer {');\r\n\t\t\t\t\t\tlayer = {};\r\n\t\t\t\t\t\tlayerName = undefined;\r\n\t\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogUnhandledGroup(curr);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Note: do not call scanner.next() here,\r\n\t\t// parseLayerTable() needs the current group\r\n\t\tlog.debug('}');\r\n\t\tlayers[layerName] = layer;\r\n\r\n\t\treturn layers;\r\n\t};\r\n\r\n\tvar tableDefinitions = {\r\n\t\tVPORT: {\r\n\t\t\ttableRecordsProperty: 'viewPorts',\r\n\t\t\ttableName: 'viewPort',\r\n\t\t\tdxfSymbolName: 'VPORT',\r\n\t\t\tparseTableRecords: parseViewPortRecords\r\n\t\t},\r\n\t\tLTYPE: {\r\n\t\t\ttableRecordsProperty: 'lineTypes',\r\n\t\t\ttableName: 'lineType',\r\n\t\t\tdxfSymbolName: 'LTYPE',\r\n\t\t\tparseTableRecords: parseLineTypes\r\n\t\t},\r\n\t\tLAYER: {\r\n\t\t\ttableRecordsProperty: 'layers',\r\n\t\t\ttableName: 'layer',\r\n\t\t\tdxfSymbolName: 'LAYER',\r\n\t\t\tparseTableRecords: parseLayers\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Is called after the parser first reads the 0:ENTITIES group. The scanner\r\n\t * should be on the start of the first entity already.\r\n\t * @return {Array} the resulting entities\r\n\t */\r\n\tvar parseEntities = function(forBlock) {\r\n\t\tvar entities = [];\r\n\r\n\t\tvar endingOnValue = forBlock ? 'ENDBLK' : 'ENDSEC';\r\n\r\n\t\tif (!forBlock) {\r\n\t\t\tcurr = scanner.next();\r\n\t\t}\r\n\t\twhile(true) {\r\n\r\n\t\t\tif(curr.code === 0) {\r\n\t\t\t\tif(curr.value === endingOnValue) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar entity;\r\n\t\t\t\tvar handler = self._entityHandlers[curr.value];\r\n\t\t\t\tif(handler != null) {\r\n\t\t\t\t\tlog.debug(curr.value + ' {');\r\n\t\t\t\t\tentity = handler.parseEntity(scanner, curr);\r\n\t\t\t\t\tcurr = scanner.lastReadGroup;\r\n\t\t\t\t\tlog.debug('}');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog.warn('Unhandled entity ' + curr.value);\r\n\t\t\t\t\tcurr = scanner.next();\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tensureHandle(entity);\r\n\t\t\t\tentities.push(entity);\r\n\t\t\t} else {\r\n\t\t\t\t// ignored lines from unsupported entity\r\n\t\t\t\tcurr = scanner.next();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(endingOnValue == 'ENDSEC') curr = scanner.next(); // swallow up ENDSEC, but not ENDBLK\r\n\t\treturn entities;\r\n\t};\r\n\r\n\t/**\r\n\t * Parses a 2D or 3D point, returning it as an object with x, y, and\r\n\t * (sometimes) z property if it is 3D. It is assumed the current group\r\n\t * is x of the point being read in, and scanner.next() will return the\r\n\t * y. The parser will determine if there is a z point automatically.\r\n\t * @return {Object} The 2D or 3D point as an object with x, y[, z]\r\n\t */\r\n\tvar parsePoint = function() {\r\n\t\tvar point = {},\r\n\t\t\tcode = curr.code;\r\n\r\n\t\tpoint.x = curr.value;\r\n\r\n\t\tcode += 10;\r\n\t\tcurr = scanner.next();\r\n\t\tif(curr.code != code)\r\n\t\t\tthrow new Error('Expected code for point value to be ' + code +\r\n\t\t\t' but got ' + curr.code + '.');\r\n\t\tpoint.y = curr.value;\r\n\r\n\t\tcode += 10;\r\n\t\tcurr = scanner.next();\r\n\t\tif(curr.code != code)\r\n\t\t{\r\n\t\t\tscanner.rewind();\r\n\t\t\treturn point;\r\n\t\t}\r\n\t\tpoint.z = curr.value;\r\n\r\n\t\treturn point;\r\n\t};\r\n\r\n\tvar ensureHandle = function(entity) {\r\n\t\tif(!entity) throw new TypeError('entity cannot be undefined or null');\r\n\r\n\t\tif(!entity.handle) entity.handle = lastHandle++;\r\n\t};\r\n\r\n\tparseAll();\r\n\treturn dxf;\r\n};\r\n\r\nfunction logUnhandledGroup(curr) {\r\n\tlog.debug('unhandled group ' + debugCode(curr));\r\n}\r\n\r\n\r\nfunction debugCode(curr) {\r\n\treturn curr.code + ':' + curr.value;\r\n}\r\n\r\n/**\r\n * Returns the truecolor value of the given AutoCad color index value\r\n * @return {Number} truecolor value as a number\r\n */\r\nfunction getAcadColor(index) {\r\n\treturn _AutoCadColorIndex__WEBPACK_IMPORTED_MODULE_1__[\"default\"][index];\r\n}\r\n\r\nconst BLOCK_ANONYMOUS_FLAG = 1;\r\nconst BLOCK_NON_CONSTANT_FLAG = 2;\r\nconst BLOCK_XREF_FLAG = 4;\r\nconst BLOCK_XREF_OVERLAY_FLAG = 8;\r\nconst BLOCK_EXTERNALLY_DEPENDENT_FLAG = 16;\r\nconst BLOCK_RESOLVED_OR_DEPENDENT_FLAG = 32;\r\nconst BLOCK_REFERENCED_XREF = 64;\r\n\r\n\r\n/* Notes */\r\n// Code 6 of an entity indicates inheritance of properties (eg. color).\r\n// BYBLOCK means inherits from block\r\n// BYLAYER (default) mean inherits from layer\n\n//# sourceURL=webpack://DxfParser/./src/DxfParser.js?"); + +/***/ }), + +/***/ "./src/ParseHelpers.js": +/*!*****************************!*\ + !*** ./src/ParseHelpers.js ***! + \*****************************/ +/*! exports provided: getAcadColor, parsePoint, checkCommonEntityProperties */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getAcadColor\", function() { return getAcadColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePoint\", function() { return parsePoint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkCommonEntityProperties\", function() { return checkCommonEntityProperties; });\n/* harmony import */ var _AutoCadColorIndex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AutoCadColorIndex */ \"./src/AutoCadColorIndex.js\");\n\r\n\r\n/**\r\n * Returns the truecolor value of the given AutoCad color index value\r\n * @return {Number} truecolor value as a number\r\n */\r\nfunction getAcadColor(index) {\r\n\treturn _AutoCadColorIndex__WEBPACK_IMPORTED_MODULE_0__[\"default\"][index];\r\n}\r\n\r\n/**\r\n * Parses the 2D or 3D coordinate, vector, or point. When complete,\r\n * the scanner remains on the last group of the coordinate.\r\n * @param {*} scanner \r\n */\r\nfunction parsePoint(scanner) {\r\n var point = {};\r\n\r\n // Reread group for the first coordinate\r\n scanner.rewind();\r\n var curr = scanner.next();\r\n\r\n var code = curr.code;\r\n point.x = curr.value;\r\n\r\n code += 10;\r\n curr = scanner.next();\r\n if(curr.code != code)\r\n throw new Error('Expected code for point value to be ' + code +\r\n ' but got ' + curr.code + '.');\r\n point.y = curr.value;\r\n\r\n code += 10;\r\n curr = scanner.next();\r\n if(curr.code != code)\r\n {\r\n // Only the x and y are specified. Don't read z.\r\n scanner.rewind(); // Let the calling code advance off the point\r\n return point;\r\n }\r\n point.z = curr.value;\r\n \r\n return point;\r\n};\r\n\r\n/**\r\n * Attempts to parse codes common to all entities. Returns true if the group\r\n * was handled by this function.\r\n * @param {*} entity - the entity currently being parsed \r\n * @param {*} curr - the current group being parsed\r\n */\r\nfunction checkCommonEntityProperties(entity, curr) {\r\n switch(curr.code) {\r\n case 0:\r\n entity.type = curr.value;\r\n break;\r\n case 5:\r\n entity.handle = curr.value;\r\n break;\r\n case 6:\r\n entity.lineType = curr.value;\r\n break;\r\n case 8: // Layer name\r\n entity.layer = curr.value;\r\n break;\r\n case 48:\r\n entity.lineTypeScale = curr.value;\r\n break;\r\n case 60:\r\n entity.visible = curr.value === 0;\r\n break;\r\n case 62: // Acad Index Color. 0 inherits ByBlock. 256 inherits ByLayer. Default is bylayer\r\n entity.colorIndex = curr.value;\r\n entity.color = getAcadColor(Math.abs(curr.value));\r\n break;\r\n case 67:\r\n entity.inPaperSpace = curr.value !== 0;\r\n break;\r\n case 100:\r\n //ignore\r\n break;\r\n case 330:\r\n entity.ownerHandle = curr.value;\r\n break;\r\n case 347:\r\n entity.materialObjectHandle = curr.value;\r\n break;\r\n case 370:\r\n //From https://www.woutware.com/Forum/Topic/955/lineweight?returnUrl=%2FForum%2FUserPosts%3FuserId%3D478262319\r\n // An integer representing 100th of mm, must be one of the following values:\r\n // 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, 140, 158, 200, 211.\r\n // -3 = STANDARD, -2 = BYLAYER, -1 = BYBLOCK\r\n entity.lineweight = curr.value;\r\n break;\r\n case 420: // TrueColor Color\r\n entity.color = curr.value;\r\n break;\r\n case 1000: \r\n entity.extendedData = entity.extendedData || {};\r\n entity.extendedData.customStrings = entity.extendedData.customStrings || []; \r\n entity.extendedData.customStrings.push(curr.value);\r\n break;\r\n case 1001: \r\n entity.extendedData = entity.extendedData || {};\r\n entity.extendedData.applicationName = curr.value;\r\n break;\r\n default:\r\n return false;\r\n }\r\n return true;\r\n};\r\n\n\n//# sourceURL=webpack://DxfParser/./src/ParseHelpers.js?"); + +/***/ }), + +/***/ "./src/entities/3dface.js": +/*!********************************!*\ + !*** ./src/entities/3dface.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = '3DFACE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n\r\n var entity = { type: curr.value, vertices: [] };\r\n curr = scanner.next();\r\n while (curr !== 'EOF') {\r\n if (curr.code === 0) break;\r\n switch (curr.code) {\r\n case 70: // 1 = Closed shape, 128 = plinegen?, 0 = default\r\n entity.shape = ((curr.value & 1) === 1);\r\n entity.hasContinuousLinetypePattern = ((curr.value & 128) === 128);\r\n break;\r\n case 10: // X coordinate of point\r\n entity.vertices = parse3dFaceVertices(scanner, curr);\r\n curr = scanner.lastReadGroup;\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\r\n\r\nfunction parse3dFaceVertices(scanner, curr) {\r\n var vertices = [],\r\n i;\r\n var vertexIsStarted = false;\r\n var vertexIsFinished = false;\r\n var verticesPer3dFace = 4; // there can be up to four vertices per face, although 3 is most used for TIN\r\n \r\n for (i = 0; i <= verticesPer3dFace; i++) {\r\n var vertex = {};\r\n while (curr !== 'EOF') {\r\n if (curr.code === 0 || vertexIsFinished) break;\r\n\r\n switch (curr.code) {\r\n case 10: // X0\r\n case 11: // X1\r\n case 12: // X2\r\n case 13: // X3\r\n if (vertexIsStarted) {\r\n vertexIsFinished = true;\r\n continue;\r\n }\r\n vertex.x = curr.value;\r\n vertexIsStarted = true;\r\n break;\r\n case 20: // Y\r\n case 21:\r\n case 22:\r\n case 23:\r\n vertex.y = curr.value;\r\n break;\r\n case 30: // Z\r\n case 31:\r\n case 32:\r\n case 33:\r\n vertex.z = curr.value;\r\n break;\r\n default:\r\n // it is possible to have entity codes after the vertices. \r\n // So if code is not accounted for return to entity parser where it might be accounted for\r\n return vertices;\r\n continue;\r\n }\r\n curr = scanner.next();\r\n }\r\n // See https://groups.google.com/forum/#!topic/comp.cad.autocad/9gn8s5O_w6E\r\n vertices.push(vertex);\r\n vertexIsStarted = false;\r\n vertexIsFinished = false;\r\n }\r\n scanner.rewind();\r\n return vertices;\r\n};\r\n\n\n//# sourceURL=webpack://DxfParser/./src/entities/3dface.js?"); + +/***/ }), + +/***/ "./src/entities/arc.js": +/*!*****************************!*\ + !*** ./src/entities/arc.js ***! + \*****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'ARC';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity, endAngle;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10: // X coordinate of point\r\n entity.center = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40: // radius\r\n entity.radius = curr.value;\r\n break;\r\n case 50: // start angle\r\n entity.startAngle = Math.PI / 180 * curr.value;\r\n break;\r\n case 51: // end angle\r\n entity.endAngle = Math.PI / 180 * curr.value;\r\n entity.angleLength = entity.endAngle - entity.startAngle; // angleLength is deprecated\r\n break;\r\n default: // ignored attribute\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/arc.js?"); + +/***/ }), + +/***/ "./src/entities/attdef.js": +/*!********************************!*\ + !*** ./src/entities/attdef.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'ATTDEF';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = {\r\n type: curr.value,\r\n scale: 1,\r\n textStyle: 'STANDARD'\r\n };\r\n curr = scanner.next();\r\n while (curr !== 'EOF') {\r\n if (curr.code === 0) {\r\n break;\r\n }\r\n switch(curr.code) {\r\n case 1:\r\n entity.text = curr.value;\r\n break;\r\n case 2:\r\n entity.tag = curr.value;\r\n break;\r\n case 3:\r\n entity.prompt = curr.value;\r\n break;\r\n case 7:\r\n entity.textStyle = curr.value;\r\n break;\r\n case 10: // X coordinate of 'first alignment point'\r\n entity.startPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 11: // X coordinate of 'second alignment point'\r\n entity.endPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 39:\r\n entity.thickness = curr.value;\r\n break;\r\n case 40:\r\n entity.textHeight = curr.value;\r\n break;\r\n case 41:\r\n entity.scale = curr.value;\r\n break;\r\n case 50:\r\n entity.rotation = curr.value;\r\n break;\r\n case 51:\r\n entity.obliqueAngle = curr.value;\r\n break;\r\n case 70:\r\n entity.invisible = !!(curr.value & 0x01);\r\n entity.constant = !!(curr.value & 0x02);\r\n entity.verificationRequired = !!(curr.value & 0x04);\r\n entity.preset = !!(curr.value & 0x08);\r\n break;\r\n case 71:\r\n entity.backwards = !!(curr.value & 0x02);\r\n entity.mirrored = !!(curr.value & 0x04);\r\n break;\r\n case 72:\r\n // TODO: enum values?\r\n entity.horizontalJustification = curr.value;\r\n break;\r\n case 73:\r\n entity.fieldLength = curr.value;\r\n break;\r\n case 74:\r\n // TODO: enum values?\r\n entity.verticalJustification = curr.value;\r\n break;\r\n case 100:\r\n break;\r\n case 210:\r\n entity.extrusionDirectionX = curr.value;\r\n break;\r\n case 220:\r\n entity.extrusionDirectionY = curr.value;\r\n break;\r\n case 230:\r\n entity.extrusionDirectionZ = curr.value;\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/attdef.js?"); + +/***/ }), + +/***/ "./src/entities/circle.js": +/*!********************************!*\ + !*** ./src/entities/circle.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'CIRCLE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity, endAngle;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10: // X coordinate of point\r\n entity.center = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40: // radius\r\n entity.radius = curr.value;\r\n break;\r\n case 50: // start angle\r\n entity.startAngle = Math.PI / 180 * curr.value;\r\n break;\r\n case 51: // end angle\r\n endAngle = Math.PI / 180 * curr.value;\r\n if(endAngle < entity.startAngle)\r\n entity.angleLength = endAngle + 2 * Math.PI - entity.startAngle;\r\n else\r\n entity.angleLength = endAngle - entity.startAngle;\r\n entity.endAngle = endAngle;\r\n break;\r\n default: // ignored attribute\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/circle.js?"); + +/***/ }), + +/***/ "./src/entities/dimension.js": +/*!***********************************!*\ + !*** ./src/entities/dimension.js ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'DIMENSION';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n\t\tentity = { type: curr.value };\r\n\t\tcurr = scanner.next();\r\n\t\twhile(curr !== 'EOF') {\r\n\t\t\tif(curr.code === 0) break;\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 2: // Referenced block name\r\n\t\t\t\t\tentity.block = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 10: // X coordinate of 'first alignment point'\r\n\t\t\t\t\tentity.anchorPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 11:\r\n\t\t\t\t\tentity.middleOfText = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 12: // Insertion point for clones of a dimension\r\n\t\t\t\t\tentity.insertionPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 13: // Definition point for linear and angular dimensions \r\n\t\t\t\t\tentity.linearOrAngularPoint1 = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 14: // Definition point for linear and angular dimensions \r\n\t\t\t\t\tentity.linearOrAngularPoint2 = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 15: // Definition point for diameter, radius, and angular dimensions\r\n\t\t\t\t\tentity.diameterOrRadiusPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 16: // Point defining dimension arc for angular dimensions\r\n\t\t\t\t\tentity.arcPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 70: // Dimension type\r\n\t\t\t\t\tentity.dimensionType = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 71: // 5 = Middle center\r\n\t\t\t\t\tentity.attachmentPoint = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 42: // Actual measurement\r\n\t\t\t\t\tentity.actualMeasurement = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1: // Text entered by user explicitly\r\n\t\t\t\t\tentity.text = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 50: // Angle of rotated, horizontal, or vertical dimensions\r\n\t\t\t\t\tentity.angle = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault: // check common entity attributes\r\n\t\t\t\t\t_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcurr = scanner.next();\r\n\t\t}\r\n\r\n\t\treturn entity;\r\n};\r\n\r\n\r\n\n\n//# sourceURL=webpack://DxfParser/./src/entities/dimension.js?"); + +/***/ }), + +/***/ "./src/entities/ellipse.js": +/*!*********************************!*\ + !*** ./src/entities/ellipse.js ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'ELLIPSE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10:\r\n entity.center = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 11:\r\n entity.majorAxisEndPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40:\r\n entity.axisRatio = curr.value;\r\n break;\r\n case 41:\r\n entity.startAngle = curr.value;\r\n break;\r\n case 42:\r\n entity.endAngle = curr.value;\r\n break;\r\n case 2:\r\n entity.name = curr.value;\r\n break;\r\n default: // check common entity attributes\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n \r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/ellipse.js?"); + +/***/ }), + +/***/ "./src/entities/hatch.js": +/*!*******************************!*\ + !*** ./src/entities/hatch.js ***! + \*******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() { }\r\n\r\nEntityParser.ForEntityName = 'HATCH';\r\n\r\nEntityParser.prototype.parseEntity = function (scanner, curr) {\r\n\tvar entity;\r\n\tentity = { type: curr.value, boundaries: [] };\r\n\tcurr = scanner.next();\r\n\twhile (curr !== 'EOF') {\r\n\t\tif (curr.code === 0) break;\r\n\t\t// console.log(\"parseHatch pointer: \" + scanner._pointer);\r\n\t\t// console.log(\"parseHatch code: \" + curr.code);\r\n\t\t// console.log(\"parseHatch value: \" + curr.value);\r\n\t\tswitch (curr.code) {\r\n\t\t\tcase 2:\r\n\t\t\t\tentity.patternName = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 10:\r\n\t\t\t\tentity.elevationX = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 20:\r\n\t\t\t\tentity.elevationY = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 30:\r\n\t\t\t\tentity.elevationZ = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 41: // Hatch pattern scale or spacing (pattern fill only)\r\n\t\t\t\tentity.scale = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 47:\r\n\t\t\t\tentity.pixelSize = curr.value;\r\n\t\t\tcase 70: // Solid fill flag (solid fill = 1; pattern fill = 0); for MPolygon, the version of MPolygon\r\n\t\t\t\tentity.solidFill = (curr.value & 1) !== 0;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 71: // Associativity flag (associative = 1; non-associative = 0); for MPolygon, solid-fill flag (has solid fill = 1; lacks solid fill = 0)\r\n\t\t\t\tentity.associativity = (curr.value & 1) !== 0;\r\n\t\t\t\tbreak;\r\n\t\t\t// case 72: // 16-bit integer value\r\n\t\t\tcase 73: // For MPolygon, boundary annotation flag (boundary is an annotated boundary = 1; boundary is not an annotated boundary = 0)\r\n\t\t\t\tentity.annotatedBoundary = (curr.value & 1) !== 0;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 75: // Hatch style: 0 = Hatch “odd parity” area (Normal style), 1 = Hatch outermost area only (Outer style), 2 = Hatch through entire area (Ignore style)\r\n\t\t\t\tentity.style = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 76: // Hatch pattern type: 0 = User-defined; 1 = Predefined; 2 = Custom\r\n\t\t\t\tentity.patternStyle = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 91: // Number of boundary paths (loops)\r\n\t\t\t\tentity.boundaryPathsCount = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\t// case 92: // Number of bytes in the proxy entity graphics represented in the subsequent 310 groups, which are binary chunk records (optional)\r\n\t\t\t// This one is from common entity propierties\r\n\t\t\tcase 93:\r\n\t\t\t\tvar boundryVerticeCount = curr.value;\r\n\t\t\t\tvar boundry = parseHatchVertices(boundryVerticeCount, scanner)\r\n\t\t\t\tentity.boundaries.push(boundry);\r\n\t\t\t// case 97: // 32-bit integer value\r\n\t\t\tcase 98:\r\n\t\t\t\tentity.seedPointsCount = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 210:\r\n\t\t\t\tentity.extrusionDirectionX = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 220:\r\n\t\t\t\tentity.extrusionDirectionY = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 230:\r\n\t\t\t\tentity.extrusionDirectionZ = curr.value;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\t_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tcurr = scanner.next();\r\n\t}\r\n\t// console.log(\"parseHatch exit\");\r\n\r\n\treturn entity;\r\n};\r\n\r\nfunction parseHatchVertices(n, scanner) {\r\n\tif (!n || n <= 0) throw Error('n must be greater than 0 verticies');\r\n\tvar vertices = [], i;\r\n\tvar vertexIsStarted = false;\r\n\tvar vertexIsFinished = false;\r\n\tvar curr = scanner.next();\r\n\r\n\tfor (i = 0; i < n; i++) {\r\n\t\t// console.log(\"parseHatchVertices.i: \" + i);\r\n\t\tvar vertex = {};\r\n\t\twhile (curr !== 'EOF') {\r\n\t\t\tif (curr.code === 0 || vertexIsFinished) break;\r\n\r\n\t\t\tswitch (curr.code) {\r\n\t\t\t\tcase 10: // X\r\n\t\t\t\t\tif (vertexIsStarted) {\r\n\t\t\t\t\t\tvertexIsFinished = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvertex.x = curr.value;\r\n\t\t\t\t\tvertexIsStarted = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 20: // Y\r\n\t\t\t\t\tvertex.y = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 42: // bulge\r\n\t\t\t\t\tif (curr.value != 0) vertex.bulge = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t// if we do not hit known code return vertices. Code might belong to entity\r\n\t\t\t\t\tif (vertexIsStarted) {\r\n\t\t\t\t\t\tvertices.push(vertex);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// console.log(\"parseHatchVertices exit from default\");\r\n\t\t\t\t\treturn vertices;\r\n\t\t\t}\r\n\t\t\tcurr = scanner.next();\r\n\t\t}\r\n\t\tvertices.push(vertex);\r\n\t\tvertexIsStarted = false;\r\n\t\tvertexIsFinished = false;\r\n\t}\r\n\t// console.log(\"parseHatchVertices exit\");\r\n\tscanner.rewind();\r\n\treturn vertices;\r\n};\r\n\n\n//# sourceURL=webpack://DxfParser/./src/entities/hatch.js?"); + +/***/ }), + +/***/ "./src/entities/insert.js": +/*!********************************!*\ + !*** ./src/entities/insert.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'INSERT';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 2:\r\n entity.name = curr.value;\r\n break;\r\n case 41:\r\n entity.xScale = curr.value;\r\n break;\r\n case 42:\r\n entity.yScale = curr.value;\r\n break;\r\n case 43:\r\n entity.zScale = curr.value;\r\n break;\r\n case 10:\r\n entity.position = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 50:\r\n entity.rotation = curr.value;\r\n break;\r\n case 70:\r\n entity.columnCount = curr.value;\r\n break;\r\n case 71:\r\n entity.rowCount = curr.value;\r\n break;\r\n case 44:\r\n entity.columnSpacing = curr.value;\r\n break;\r\n case 45:\r\n entity.rowSpacing = curr.value;\r\n break;\r\n case 210:\r\n entity.extrusionDirection = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n default: // check common entity attributes\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\r\n\r\n\r\n\n\n//# sourceURL=webpack://DxfParser/./src/entities/insert.js?"); + +/***/ }), + +/***/ "./src/entities/line.js": +/*!******************************!*\ + !*** ./src/entities/line.js ***! + \******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'LINE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = { type: curr.value, vertices: [] };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10: // X coordinate of point\r\n entity.vertices.unshift(_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner));\r\n break;\r\n case 11:\r\n entity.vertices.push(_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner));\r\n break;\r\n case 210:\r\n entity.extrusionDirection = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 100:\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n \r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/line.js?"); + +/***/ }), + +/***/ "./src/entities/lwpolyline.js": +/*!************************************!*\ + !*** ./src/entities/lwpolyline.js ***! + \************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'LWPOLYLINE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = { type: curr.value, vertices: [] },\r\n numberOfVertices = 0;\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 38:\r\n entity.elevation = curr.value;\r\n break;\r\n case 39:\r\n entity.depth = curr.value;\r\n break;\r\n case 70: // 1 = Closed shape, 128 = plinegen?, 0 = default\r\n entity.shape = ((curr.value & 1) === 1);\r\n entity.hasContinuousLinetypePattern = ((curr.value & 128) === 128);\r\n break;\r\n case 90:\r\n numberOfVertices = curr.value;\r\n break;\r\n case 10: // X coordinate of point\r\n entity.vertices = parseLWPolylineVertices(numberOfVertices, scanner);\r\n break;\r\n case 43:\r\n if(curr.value !== 0) entity.width = curr.value;\r\n break;\r\n case 210:\r\n entity.extrusionDirectionX = curr.value;\r\n break;\r\n case 220:\r\n entity.extrusionDirectionY = curr.value;\r\n break;\r\n case 230:\r\n entity.extrusionDirectionZ = curr.value;\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\r\n\r\nfunction parseLWPolylineVertices(n, scanner) {\r\n if(!n || n <= 0) throw Error('n must be greater than 0 verticies');\r\n var vertices = [], i;\r\n var vertexIsStarted = false;\r\n var vertexIsFinished = false;\r\n var curr = scanner.lastReadGroup;\r\n\r\n for(i = 0; i < n; i++) {\r\n var vertex = {};\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0 || vertexIsFinished) break;\r\n\r\n switch(curr.code) {\r\n case 10: // X\r\n if(vertexIsStarted) {\r\n vertexIsFinished = true;\r\n continue;\r\n }\r\n vertex.x = curr.value;\r\n vertexIsStarted = true;\r\n break;\r\n case 20: // Y\r\n vertex.y = curr.value;\r\n break;\r\n case 30: // Z\r\n vertex.z = curr.value;\r\n break;\r\n case 40: // start width\r\n vertex.startWidth = curr.value;\r\n break;\r\n case 41: // end width\r\n vertex.endWidth = curr.value;\r\n break;\r\n case 42: // bulge\r\n if(curr.value != 0) vertex.bulge = curr.value;\r\n break;\r\n default:\r\n // if we do not hit known code return vertices. Code might belong to entity\r\n if (vertexIsStarted) {\r\n vertices.push(vertex);\r\n }\r\n return vertices;\r\n }\r\n curr = scanner.next();\r\n }\r\n // See https://groups.google.com/forum/#!topic/comp.cad.autocad/9gn8s5O_w6E\r\n vertices.push(vertex);\r\n vertexIsStarted = false;\r\n vertexIsFinished = false;\r\n }\r\n scanner.rewind();\r\n return vertices;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/lwpolyline.js?"); + +/***/ }), + +/***/ "./src/entities/mtext.js": +/*!*******************************!*\ + !*** ./src/entities/mtext.js ***! + \*******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'MTEXT';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = { type: curr.value };\r\n\t\tcurr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 3:\r\n entity.text ? entity.text += curr.value : entity.text = curr.value;\r\n break;\r\n case 1:\r\n entity.text ? entity.text += curr.value : entity.text = curr.value;\r\n break;\r\n case 10:\r\n entity.position = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40:\r\n //Note: this is the text height\r\n entity.height = curr.value;\r\n break;\r\n case 41:\r\n entity.width = curr.value;\r\n break;\r\n case 50:\r\n entity.rotation = curr.value;\r\n break;\r\n case 71:\r\n entity.attachmentPoint = curr.value;\r\n break;\r\n case 72:\r\n entity.drawingDirection = curr.value;\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/mtext.js?"); + +/***/ }), + +/***/ "./src/entities/point.js": +/*!*******************************!*\ + !*** ./src/entities/point.js ***! + \*******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'POINT';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10:\r\n entity.position = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 39:\r\n entity.thickness = curr.value;\r\n break;\r\n case 210:\r\n entity.extrusionDirection = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 100:\r\n break;\r\n default: // check common entity attributes\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/point.js?"); + +/***/ }), + +/***/ "./src/entities/polyline.js": +/*!**********************************!*\ + !*** ./src/entities/polyline.js ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n/* harmony import */ var _vertex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vertex */ \"./src/entities/vertex.js\");\n\r\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'POLYLINE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = { type: curr.value, vertices: [] };\r\n\t\tcurr = scanner.next();\r\n\t\twhile(curr !== 'EOF') {\r\n\t\t\tif(curr.code === 0) break;\r\n\r\n\t\t\tswitch(curr.code) {\r\n\t\t\t\tcase 10: // always 0\r\n\t\t\t\tcase 20: // always 0\r\n\t\t\t\tcase 30: // elevation\r\n\t\t\t\tcase 39: // thickness\r\n entity.thickness = curr.value;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 40: // start width\r\n\t\t\t\tcase 41: // end width\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 70:\r\n\t\t\t\t\tentity.shape = (curr.value & 1) !== 0;\r\n entity.includesCurveFitVertices = (curr.value & 2) !== 0;\r\n entity.includesSplineFitVertices = (curr.value & 4) !== 0;\r\n entity.is3dPolyline = (curr.value & 8) !== 0;\r\n entity.is3dPolygonMesh = (curr.value & 16) !== 0;\r\n entity.is3dPolygonMeshClosed = (curr.value & 32) !== 0; // 32 = The polygon mesh is closed in the N direction\r\n entity.isPolyfaceMesh = (curr.value & 64) !== 0;\r\n entity.hasContinuousLinetypePattern = (curr.value & 128) !== 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 71: // Polygon mesh M vertex count\r\n\t\t\t\tcase 72: // Polygon mesh N vertex count\r\n\t\t\t\tcase 73: // Smooth surface M density\r\n\t\t\t\tcase 74: // Smooth surface N density\r\n\t\t\t\tcase 75: // Curves and smooth surface type\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 210:\r\n entity.extrusionDirection = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcurr = scanner.next();\r\n\t\t}\r\n\r\n\t\tentity.vertices = parsePolylineVertices(scanner, curr);\r\n\r\n\t\treturn entity;\r\n};\r\n\r\nfunction parsePolylineVertices(scanner, curr) {\r\n var vertexParser = new _vertex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\r\n\r\n var vertices = [];\r\n while (!scanner.isEOF()) {\r\n if (curr.code === 0) {\r\n if (curr.value === 'VERTEX') {\r\n vertices.push(vertexParser.parseEntity(scanner, curr));\r\n curr = scanner.lastReadGroup;\r\n } else if (curr.value === 'SEQEND') {\r\n parseSeqEnd(scanner, curr);\r\n break;\r\n }\r\n }\r\n }\r\n return vertices;\r\n};\r\n\r\nfunction parseSeqEnd(scanner, curr) {\r\n var entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr != 'EOF') {\r\n if (curr.code == 0) break;\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\r\n\n\n//# sourceURL=webpack://DxfParser/./src/entities/polyline.js?"); + +/***/ }), + +/***/ "./src/entities/solid.js": +/*!*******************************!*\ + !*** ./src/entities/solid.js ***! + \*******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'SOLID';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, currentGroup) {\r\n var entity;\r\n entity = { type: currentGroup.value };\r\n entity.points = [];\r\n currentGroup = scanner.next();\r\n while(currentGroup !== 'EOF') {\r\n if(currentGroup.code === 0) break;\r\n\r\n switch(currentGroup.code) {\r\n case 10:\r\n entity.points[0] = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 11:\r\n entity.points[1] = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 12:\r\n entity.points[2] = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 13:\r\n entity.points[3] = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 210:\r\n entity.extrusionDirection = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n default: // check common entity attributes\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, currentGroup);\r\n break;\r\n }\r\n currentGroup = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/solid.js?"); + +/***/ }), + +/***/ "./src/entities/spline.js": +/*!********************************!*\ + !*** ./src/entities/spline.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'SPLINE';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF')\r\n {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10:\r\n if (!entity.controlPoints) entity.controlPoints = [];\r\n entity.controlPoints.push(_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner));\r\n break;\r\n case 11:\r\n if (!entity.fitPoints) entity.fitPoints = [];\r\n entity.fitPoints.push(_ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner));\r\n break;\r\n case 12:\r\n entity.startTangent = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 13:\r\n entity.endTangent = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40:\r\n if (!entity.knotValues) entity.knotValues = [];\r\n entity.knotValues.push(curr.value);\r\n break;\r\n case 70:\r\n if ((curr.value & 1) != 0) entity.closed = true;\r\n if ((curr.value & 2) != 0) entity.periodic = true;\r\n if ((curr.value & 4) != 0) entity.rational = true;\r\n if ((curr.value & 8) != 0) entity.planar = true;\r\n if ((curr.value & 16) != 0) \r\n {\r\n entity.planar = true;\r\n entity.linear = true;\r\n }\r\n break;\r\n \r\n case 71:\r\n entity.degreeOfSplineCurve = curr.value;\r\n break;\r\n case 72:\r\n entity.numberOfKnots = curr.value;\r\n break;\r\n case 73:\r\n entity.numberOfControlPoints = curr.value;\r\n break;\r\n case 74:\r\n entity.numberOfFitPoints = curr.value;\r\n break;\r\n case 210:\r\n entity.normalVector = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/spline.js?"); + +/***/ }), + +/***/ "./src/entities/text.js": +/*!******************************!*\ + !*** ./src/entities/text.js ***! + \******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'TEXT';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity;\r\n\t\tentity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n switch(curr.code) {\r\n case 10: // X coordinate of 'first alignment point'\r\n entity.startPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 11: // X coordinate of 'second alignment point'\r\n entity.endPoint = _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"parsePoint\"](scanner);\r\n break;\r\n case 40: // Text height\r\n entity.textHeight = curr.value;\r\n break;\r\n case 41:\r\n entity.xScale = curr.value;\r\n break;\r\n case 50: // Rotation in degrees\r\n entity.rotation = curr.value;\r\n break;\r\n case 1: // Text\r\n entity.text = curr.value;\r\n break;\r\n // NOTE: 72 and 73 are meaningless without 11 (second alignment point)\r\n case 72: // Horizontal alignment\r\n entity.halign = curr.value;\r\n break;\r\n case 73: // Vertical alignment\r\n entity.valign = curr.value;\r\n break;\r\n default: // check common entity attributes\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/text.js?"); + +/***/ }), + +/***/ "./src/entities/vertex.js": +/*!********************************!*\ + !*** ./src/entities/vertex.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EntityParser; });\n/* harmony import */ var _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ParseHelpers */ \"./src/ParseHelpers.js\");\n\r\n\r\n\r\nfunction EntityParser() {}\r\n\r\nEntityParser.ForEntityName = 'VERTEX';\r\n\r\nEntityParser.prototype.parseEntity = function(scanner, curr) {\r\n var entity = { type: curr.value };\r\n curr = scanner.next();\r\n while(curr !== 'EOF') {\r\n if(curr.code === 0) break;\r\n\r\n switch(curr.code) {\r\n case 10:\t// X\r\n entity.x = curr.value;\r\n break;\r\n case 20: // Y\r\n entity.y = curr.value;\r\n break;\r\n case 30: // Z\r\n entity.z = curr.value;\r\n break;\r\n case 40: // start width\r\n case 41: // end width\r\n case 42: // bulge\r\n if(curr.value != 0) entity.bulge = curr.value;\r\n break;\r\n case 70: // flags\r\n entity.curveFittingVertex = (curr.value & 1) !== 0;\r\n entity.curveFitTangent = (curr.value & 2) !== 0;\r\n entity.splineVertex = (curr.value & 8) !== 0;\r\n entity.splineControlPoint = (curr.value & 16) !== 0;\r\n entity.threeDPolylineVertex = (curr.value & 32) !== 0;\r\n entity.threeDPolylineMesh = (curr.value & 64) !== 0;\r\n entity.polyfaceMeshVertex = (curr.value & 128) !== 0;\r\n break;\r\n case 50: // curve fit tangent direction\r\n case 71: // polyface mesh vertex index\r\n entity.faceA = curr.value;\r\n break;\r\n case 72: // polyface mesh vertex index\r\n entity.faceB = curr.value;\r\n break;\r\n case 73: // polyface mesh vertex index\r\n entity.faceC = curr.value;\r\n break;\r\n case 74: // polyface mesh vertex index\r\n entity.faceD = curr.value;\r\n break;\r\n default:\r\n _ParseHelpers__WEBPACK_IMPORTED_MODULE_0__[\"checkCommonEntityProperties\"](entity, curr);\r\n break;\r\n }\r\n \r\n curr = scanner.next();\r\n }\r\n return entity;\r\n};\n\n//# sourceURL=webpack://DxfParser/./src/entities/vertex.js?"); + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _DxfParser_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DxfParser.js */ \"./src/DxfParser.js\");\n\r\n\r\n/* harmony default export */ __webpack_exports__[\"default\"] = (_DxfParser_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack://DxfParser/./src/index.js?"); + +/***/ }) + +/******/ })["default"]; +}); \ No newline at end of file diff --git a/package.json b/package.json index 70350ca..40abbc1 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "dist/dxf-parser.js", "scripts": { "test": "mocha --require @babel/register test", + "test-debug": "mocha --inspect-brk --require @babel/register test", "start": "webpack --mode development", "build": "webpack --mode production" }, diff --git a/src/DxfParser.js b/src/DxfParser.js index 9bfac33..09e58b3 100644 --- a/src/DxfParser.js +++ b/src/DxfParser.js @@ -7,6 +7,7 @@ import AttDef from './entities/attdef'; import Circle from './entities/circle'; import Dimension from './entities/dimension'; import Ellipse from './entities/ellipse'; +import Hatch from './entities/hatch'; import Insert from './entities/insert'; import Line from './entities/line'; import LWPolyline from './entities/lwpolyline'; @@ -35,6 +36,7 @@ function registerDefaultEntityHandlers(dxfParser) { dxfParser.registerEntityHandler(Circle); dxfParser.registerEntityHandler(Dimension); dxfParser.registerEntityHandler(Ellipse); + dxfParser.registerEntityHandler(Hatch); dxfParser.registerEntityHandler(Insert); dxfParser.registerEntityHandler(Line); dxfParser.registerEntityHandler(LWPolyline); @@ -717,7 +719,7 @@ DxfParser.prototype._parse = function(dxfString) { return point; } point.z = curr.value; - + return point; }; diff --git a/src/entities/hatch.js b/src/entities/hatch.js new file mode 100644 index 0000000..32291ac --- /dev/null +++ b/src/entities/hatch.js @@ -0,0 +1,129 @@ + +import * as helpers from '../ParseHelpers' + +export default function EntityParser() { } + +EntityParser.ForEntityName = 'HATCH'; + +EntityParser.prototype.parseEntity = function (scanner, curr) { + var entity; + entity = { type: curr.value, boundaries: [] }; + curr = scanner.next(); + while (curr !== 'EOF') { + if (curr.code === 0) break; + // console.log("parseHatch pointer: " + scanner._pointer); + // console.log("parseHatch code: " + curr.code); + // console.log("parseHatch value: " + curr.value); + switch (curr.code) { + case 2: + entity.patternName = curr.value; + break; + case 10: + entity.elevationX = curr.value; + break; + case 20: + entity.elevationY = curr.value; + break; + case 30: + entity.elevationZ = curr.value; + break; + case 41: // Hatch pattern scale or spacing (pattern fill only) + entity.scale = curr.value; + break; + case 47: + entity.pixelSize = curr.value; + case 70: // Solid fill flag (solid fill = 1; pattern fill = 0); for MPolygon, the version of MPolygon + entity.solidFill = (curr.value & 1) !== 0; + break; + case 71: // Associativity flag (associative = 1; non-associative = 0); for MPolygon, solid-fill flag (has solid fill = 1; lacks solid fill = 0) + entity.associativity = (curr.value & 1) !== 0; + break; + // case 72: // 16-bit integer value + case 73: // For MPolygon, boundary annotation flag (boundary is an annotated boundary = 1; boundary is not an annotated boundary = 0) + entity.annotatedBoundary = (curr.value & 1) !== 0; + break; + case 75: // Hatch style: 0 = Hatch “odd parity” area (Normal style), 1 = Hatch outermost area only (Outer style), 2 = Hatch through entire area (Ignore style) + entity.style = curr.value; + break; + case 76: // Hatch pattern type: 0 = User-defined; 1 = Predefined; 2 = Custom + entity.patternStyle = curr.value; + break; + case 91: // Number of boundary paths (loops) + entity.boundaryPathsCount = curr.value; + break; + // case 92: // Number of bytes in the proxy entity graphics represented in the subsequent 310 groups, which are binary chunk records (optional) + // This one is from common entity propierties + case 93: + var boundryVerticeCount = curr.value; + var boundry = parseHatchVertices(boundryVerticeCount, scanner) + entity.boundaries.push(boundry); + // case 97: // 32-bit integer value + case 98: + entity.seedPointsCount = curr.value; + break; + case 210: + entity.extrusionDirectionX = curr.value; + break; + case 220: + entity.extrusionDirectionY = curr.value; + break; + case 230: + entity.extrusionDirectionZ = curr.value; + break; + default: + helpers.checkCommonEntityProperties(entity, curr); + break; + } + curr = scanner.next(); + } + // console.log("parseHatch exit"); + + return entity; +}; + +function parseHatchVertices(n, scanner) { + if (!n || n <= 0) throw Error('n must be greater than 0 verticies'); + var vertices = [], i; + var vertexIsStarted = false; + var vertexIsFinished = false; + var curr = scanner.next(); + + for (i = 0; i < n; i++) { + // console.log("parseHatchVertices.i: " + i); + var vertex = {}; + while (curr !== 'EOF') { + if (curr.code === 0 || vertexIsFinished) break; + + switch (curr.code) { + case 10: // X + if (vertexIsStarted) { + vertexIsFinished = true; + continue; + } + vertex.x = curr.value; + vertexIsStarted = true; + break; + case 20: // Y + vertex.y = curr.value; + break; + case 42: // bulge + if (curr.value != 0) vertex.bulge = curr.value; + break; + default: + // if we do not hit known code return vertices. Code might belong to entity + if (vertexIsStarted) { + vertices.push(vertex); + } + // console.log("parseHatchVertices exit from default"); + return vertices; + } + curr = scanner.next(); + } + vertices.push(vertex); + vertexIsStarted = false; + vertexIsFinished = false; + } + // console.log("parseHatchVertices exit"); + scanner.rewind(); + return vertices; +}; diff --git a/test/DxfParser.test.js b/test/DxfParser.test.js index ac1f759..3df910a 100644 --- a/test/DxfParser.test.js +++ b/test/DxfParser.test.js @@ -40,7 +40,7 @@ describe('Parser', function() { tables.should.have.property('layer'); var expectedOutputFilePath = path.join(__dirname,'data','layer-table.expected.json'); - + var expected = fs.readFileSync(expectedOutputFilePath, {encoding: 'utf8'}); tables.layer.should.eql(JSON.parse(expected)); }); @@ -54,7 +54,7 @@ describe('Parser', function() { var expected = fs.readFileSync(expectedOutputFilePath, {encoding: 'utf8'}); tables.lineType.should.eql(JSON.parse(expected)); }); - + it('should parse the dxf viewPort table', function() { should.exist(tables); tables.should.have.property('viewPort'); @@ -65,10 +65,28 @@ describe('Parser', function() { tables.viewPort.should.eql(JSON.parse(expected)); }); - it('should parse a complex BLOCKS section', function() { - verifyDxf(path.join(__dirname, 'data', 'blocks.dxf')) - }); - + it('should parse HATCH', function() { + verifyDxf + var file = fs.readFileSync(path.join(__dirname, 'data', 'hatch.dxf'), 'utf8'); + + var parser = new DxfParser(); + var dxf; + try { + dxf = parser.parseSync(file); + fs.writeFileSync(path.join(__dirname, 'data', 'hatch.actual.json'), JSON.stringify(dxf, null, 2)); + }catch(err) { + should.not.exist(err); + } + should.exist(dxf); + + var expected = fs.readFileSync(path.join(__dirname, 'data', 'hatch.expected.json'), {encoding: 'utf8'}); + dxf.should.eql(JSON.parse(expected)); + }); + + // it('should parse a complex BLOCKS section', function() { + // verifyDxf(path.join(__dirname, 'data', 'blocks.dxf')) + // }); + it('should parse a simple BLOCKS section', function() { var file = fs.readFileSync(path.join(__dirname, 'data', 'blocks2.dxf'), 'utf8'); @@ -86,7 +104,7 @@ describe('Parser', function() { var expected = fs.readFileSync(path.join(__dirname, 'data', 'blocks2.expected.json'), {encoding: 'utf8'}); dxf.should.eql(JSON.parse(expected)); }); - + it('should parse POLYLINES', function() { verifyDxf var file = fs.readFileSync(path.join(__dirname, 'data', 'polylines.dxf'), 'utf8'); @@ -123,7 +141,7 @@ describe('Parser', function() { var expected = fs.readFileSync(path.join(__dirname, 'data', 'ellipse.expected.json'), {encoding: 'utf8'}); dxf.should.eql(JSON.parse(expected)); }); - + it('should parse SPLINE entities', function() { var file = fs.readFileSync(path.join(__dirname, 'data', 'splines.dxf'), 'utf8'); @@ -157,7 +175,7 @@ describe('Parser', function() { var expected = fs.readFileSync(path.join(__dirname, 'data', 'extendeddata.expected.json'), {encoding: 'utf8'}); dxf.should.eql(JSON.parse(expected)); }); - + it('should parse SPLINE entities that are like arcs and circles', function() { verifyDxf(path.join(__dirname, 'data', 'arcs-as-splines.dxf')); }); diff --git a/test/data/hatch.dxf b/test/data/hatch.dxf new file mode 100644 index 0000000..863a11b --- /dev/null +++ b/test/data/hatch.dxf @@ -0,0 +1,200 @@ +0 +SECTION +2 +ENTITIES +0 +HATCH +5 +20000 +8 +0 +100 +AcDbEntity +100 +AcDbHatch +10 +0 +20 +0 +30 +0 +210 +0 +220 +0 +230 +1 +2 +SOLID +70 +1 +71 +0 +91 +1 +92 +2 +72 +0 +73 +1 +93 +6 +10 +481167.286973555 +20 +6757868.46229187 +10 +483012.242899119 +20 +6758349.75514202 +10 +482771.596474045 +20 +6754740.05876591 +10 +479964.054848188 +20 +6752814.88736533 +10 +477156.513222331 +20 +6755782.85994123 +10 +481167.286973555 +20 +6757868.46229187 +97 +0 +75 +0 +76 +1 +98 +0 +0 +HATCH +5 +20001 +8 +0 +100 +AcDbEntity +100 +AcDbHatch +10 +0 +20 +0 +30 +0 +210 +0 +220 +0 +230 +1 +2 +SOLID +70 +1 +71 +0 +91 +1 +92 +2 +72 +0 +73 +1 +93 +19 +10 +478259.476003918 +20 +6765308.44760039 +10 +477697.967678746 +20 +6763062.4142997 +10 +476534.843290891 +20 +6763744.24583741 +10 +477256.782566112 +20 +6765669.417238 +10 +483914.666993144 +20 +6766591.89520078 +10 +487724.902056807 +20 +6765990.2791381 +10 +487765.009794319 +20 +6761297.67384917 +10 +484797.037218413 +20 +6764987.58570029 +10 +482029.603330069 +20 +6765629.30950049 +10 +481909.280117532 +20 +6762059.7208619 +10 +480385.186092067 +20 +6759573.04113614 +10 +475411.826640548 +20 +6758008.83937316 +10 +467951.787463271 +20 +6760455.41136141 +10 +466908.986287953 +20 +6764746.93927522 +10 +474770.102840353 +20 +6761337.78158668 +10 +478379.799216454 +20 +6760335.08814887 +10 +479984.108716944 +20 +6762661.33692458 +10 +480746.155729677 +20 +6764787.04701273 +10 +478259.476003918 +20 +6765308.44760039 +97 +0 +75 +0 +76 +1 +98 +0 +0 +ENDSEC +0 +EOF diff --git a/test/data/hatch.expected.json b/test/data/hatch.expected.json new file mode 100644 index 0000000..5ae93b0 --- /dev/null +++ b/test/data/hatch.expected.json @@ -0,0 +1,150 @@ +{ + "entities": [ + { + "type": "HATCH", + "boundaries": [ + [ + { + "x": 481167.286973555, + "y": 6757868.46229187 + }, + { + "x": 483012.242899119, + "y": 6758349.75514202 + }, + { + "x": 482771.596474045, + "y": 6754740.05876591 + }, + { + "x": 479964.054848188, + "y": 6752814.88736533 + }, + { + "x": 477156.513222331, + "y": 6755782.85994123 + }, + { + "x": 481167.286973555, + "y": 6757868.46229187 + } + ] + ], + "handle": "20000", + "layer": "0", + "elevationX": 0, + "elevationY": 0, + "elevationZ": 0, + "extrusionDirectionX": 0, + "extrusionDirectionY": 0, + "extrusionDirectionZ": 1, + "patternName": "SOLID", + "solidFill": true, + "associativity": false, + "boundaryPathsCount": 1, + "annotatedBoundary": true, + "seedPointsCount": 0, + "style": 0, + "patternStyle": 1 + }, + { + "type": "HATCH", + "boundaries": [ + [ + { + "x": 478259.476003918, + "y": 6765308.44760039 + }, + { + "x": 477697.967678746, + "y": 6763062.4142997 + }, + { + "x": 476534.843290891, + "y": 6763744.24583741 + }, + { + "x": 477256.782566112, + "y": 6765669.417238 + }, + { + "x": 483914.666993144, + "y": 6766591.89520078 + }, + { + "x": 487724.902056807, + "y": 6765990.2791381 + }, + { + "x": 487765.009794319, + "y": 6761297.67384917 + }, + { + "x": 484797.037218413, + "y": 6764987.58570029 + }, + { + "x": 482029.603330069, + "y": 6765629.30950049 + }, + { + "x": 481909.280117532, + "y": 6762059.7208619 + }, + { + "x": 480385.186092067, + "y": 6759573.04113614 + }, + { + "x": 475411.826640548, + "y": 6758008.83937316 + }, + { + "x": 467951.787463271, + "y": 6760455.41136141 + }, + { + "x": 466908.986287953, + "y": 6764746.93927522 + }, + { + "x": 474770.102840353, + "y": 6761337.78158668 + }, + { + "x": 478379.799216454, + "y": 6760335.08814887 + }, + { + "x": 479984.108716944, + "y": 6762661.33692458 + }, + { + "x": 480746.155729677, + "y": 6764787.04701273 + }, + { + "x": 478259.476003918, + "y": 6765308.44760039 + } + ] + ], + "handle": "20001", + "layer": "0", + "elevationX": 0, + "elevationY": 0, + "elevationZ": 0, + "extrusionDirectionX": 0, + "extrusionDirectionY": 0, + "extrusionDirectionZ": 1, + "patternName": "SOLID", + "solidFill": true, + "associativity": false, + "boundaryPathsCount": 1, + "annotatedBoundary": true, + "seedPointsCount": 0, + "style": 0, + "patternStyle": 1 + } + ] +} \ No newline at end of file