UNPKG

@plastichub/osr-cad

Version:

This is a CLI(CommandLineInterface) toolset to convert 3D files, using Solidworks and other software.

373 lines (371 loc) 14.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convert = exports.targets = exports.report = exports.convertFiles = exports.convertFile = void 0; const path = require("path"); const pMap = require("p-map"); const which_1 = require("which"); const osr_commons_1 = require("@plastichub/osr-commons"); const sw_util_1 = require("./sw-util"); const report_1 = require("../report"); const __1 = require(".."); const lib_1 = require("../lib/"); const index_1 = require("../lib/process/index"); const exists_1 = require("@plastichub/fs/exists"); const read_1 = require("@plastichub/fs/read"); const write_1 = require("@plastichub/fs/write"); const dir_1 = require("@plastichub/fs/dir"); const remove_1 = require("@plastichub/fs/remove"); const objects_1 = require("@plastichub/core/objects"); const sw_types_1 = require("./sw-types"); const lib_2 = require("@plastichub/osr-cache/lib"); const constants_1 = require("../constants"); const sw_util_2 = require("./sw-util"); const convertFile = async (src, target, view, onNode = () => { }, options, configuration) => { configuration = options.configuration || configuration; options.close && (0, sw_util_2.closeAppByName)('SLDWORKS'); const osr_cache = (0, osr_commons_1.OSR_CACHE)(); let cache_key_obj = { sw: options.sw, src, target, configuration }; if (target.endsWith('.jpg')) { cache_key_obj = { ...cache_key_obj, quality: options.quality, width: options.width, height: options.height, renderer: options.renderer }; } if (target.endsWith('.xlsx')) { cache_key_obj = { ...cache_key_obj, "bom-config": options['bom-config'], "bom-detail": options['bom-detail'], "bom-template": options['bom-template'], "bom-type": options['bom-type'], "bom-images": options['bom-images'], }; } const ca_options = JSON.parse(JSON.stringify((0, lib_1.removeEmpty)(cache_key_obj))); let cached = await (0, lib_2.get_cached)(src, ca_options, constants_1.MODULE_NAME); const cachedPath = await (0, lib_2.get_path_cached)(src, ca_options, constants_1.MODULE_NAME); if (!(0, exists_1.sync)(target)) { cached = null; } if (osr_cache && cached && cachedPath && options.cache == true) { if (!(0, exists_1.sync)(target) || !(0, sw_util_1.equalFiles)(target, cachedPath)) { (0, write_1.sync)(target, Buffer.from(cached)); } __1.logger.debug(`[${constants_1.MODULE_NAME}] Skipping conversion of ${src} to ${target}`); await onNode({ src, target, options }); return Promise.resolve(); } const parts = path.parse(target); const source_parts = path.parse(src); let exe = '' + options.script; let cwd = (0, sw_util_2.getSWBin)(options.sw); let _target = '' + target; let onPost = null; // SW Photoview wont render correctly in hidden mode if (parts.ext === '.jpg' && source_parts.ext.toLowerCase() === '.sldasm' && options.renderer.toLowerCase() === ' ') { __1.logger.debug(`[${constants_1.MODULE_NAME}] Converting ${src} to ${target} : - Photoview: - ` + options.hidden); options.hidden = "false"; } let args = [ `--source="${src}"`, `--target="${target}"`, `--configuration="${configuration}"`, `--view="*${view}"`, `--hidden=` + options.hidden || "true", `--width=` + options.width, `--height=` + options.height, `--swv=` + options.swv, `--renderer=` + options.renderer.toLowerCase() || "solidworks", `--quality=${options.quality || sw_types_1.swRayTraceRenderQuality_e.swRenderQuality_Good}` ]; if (options.save) args.push(`--save`); if (options.pack) args.push(`--pack`); if (options.rebuild) args.push(`--rebuild`); if (options.light) args.push(`--light`); if (options.write) args.push(`--write`); if (parts.ext === '.json' && source_parts.ext.toLowerCase() === '.sldasm') { exe = 'model-reader.exe'; args = [ `--source="${path.resolve(src)}"`, `--target="${_target}"` ]; onPost = () => { try { let props = (0, read_1.sync)(_target, 'json'); if (!props) { __1.logger.error('Error reading model file ', src); return false; } props = props.map(lib_1.removeEmpty); (0, write_1.sync)(_target, props); return true; } catch (e) { __1.logger.error(`Error executing model-reader::onPost for ${src} to ${_target}`); (0, write_1.sync)(_target, {}); return false; } }; } if (parts.base.endsWith('-configs.json') && source_parts.ext.toLowerCase() === '.sldasm') { exe = 'getconfigs.exe'; args = [ `--source="${path.resolve(src)}"`, `--target="${path.resolve(_target)}"` ]; onPost = () => { try { let props = (0, read_1.sync)(_target, 'json'); if (!props) { __1.logger.error('Error reading configurations file ', src); return false; } return true; } catch (e) { __1.logger.error(`Error executing get::onPost for ${src} to ${_target}`); (0, write_1.sync)(_target, {}); return false; } }; } if (parts.ext === '.html') { exe = 'ExportHTML.exe'; if (!configuration || configuration === 'Default') { args = [ `"${src}"`, `"${target}"`, ]; } else if (configuration) { //EDrawings Control doesnt support configurations directly, we need a configuration specific edrawings file exported instead const eDrawingsFile = src.toLowerCase().replace('.sldasm', `-${configuration}.EASM`); if (!(0, exists_1.sync)(eDrawingsFile)) { __1.logger.error(`Configuration specific edrawing file ${eDrawingsFile} doesnt exists`); return Promise.resolve(); } args = [ `"${eDrawingsFile}"`, `"${target}"`, `${configuration}` ]; } } if (parts.ext === '.xlsx') { exe = 'bom.exe'; args = [ `"${src}"`, `"${target}"`, `--configuration ${options['bom-config']}`, `--type ${options['bom-type']}`, `--detail ${options['bom-detail']}` ]; options['bom-images'] && args.push('--images'); options['bom-template'] && args.push(`--template ${options['bom-template']}`); if (!options.cache && (0, exists_1.sync)(target)) { (0, remove_1.sync)(target); } } if (source_parts.ext === '.drawio') { exe = 'draw.io.exe'; try { cwd = path.parse((0, which_1.sync)(exe)).dir; } catch (e) { __1.logger.error(`Cant find ${exe}`); return Promise.resolve(); } args = [ `"${src}"`, '-x', `-f ${parts.ext.replace('.', '')}`, `${options.args}` ]; } const bin = path.resolve(`${cwd}/${exe}`); if (!(0, exists_1.sync)(bin)) { __1.logger.error(`${bin} doesnt exists in ${cwd}`); __1.logger.error('__dirname:' + __dirname); __1.logger.error('options.sw ' + options.sw); return; } const ret = await index_1.Helper.run(cwd, exe, args, options.debug); ret.messages = [...new Set(ret.messages)]; const failed = !!ret.messages.find((m) => m.includes(constants_1.MSG_FAILED_TO_LOAD)); ret.messages = ret.messages.map((m) => (0, sw_util_1.swProcMessage)(m)).filter(x => x != null).map(x => x.message); const info = { ...ret, src, target, failed: failed, options }; await onNode(info); onPost && onPost(); if (info.failed) { (0, remove_1.sync)(_target); return ret; } osr_cache && options.cache == true && await (0, lib_2.set_cached)(src, ca_options, constants_1.MODULE_NAME, (0, sw_util_2.fileAsBuffer)(_target)); options.close && (0, sw_util_2.closeAppByName)('SLDWORKS'); return ret; }; exports.convertFile = convertFile; async function convertFiles(file, targets, view, onNode = () => { }, options) { if (options.dry) { __1.logger.info(`Dry run convert ${file} to `, targets.map((t) => { `\n\t${t}`; }).join(',\n')); return Promise.resolve(); } return pMap(targets, (target) => { return (0, exports.convertFile)(file, target.target, view, onNode, options, target.configuration); }, { concurrency: 1 }); } exports.convertFiles = convertFiles; const report = (data, dst) => { let report = null; if (dst.endsWith('.md')) { //report = reportMarkdown(data) } if (dst.endsWith('.csv')) { report = (0, report_1.reportCSV)(data); } __1.logger.info(`Write report to ${dst}`); report = (0, write_1.sync)(dst, data); return report; }; exports.report = report; const targets = (f, options) => { const srcParts = path.parse(f); const variables = (0, objects_1.clone)(options.variables); const targets = []; let configurations = { "Default": null }; if (options.configuration && options.configuration !== 'Default') { configurations[options.configuration] = null; delete configurations["Default"]; } if (options.dstInfo.PATH.includes('{CONFIGURATION}') && srcParts.ext.toLowerCase() === '.sldasm') { const configurationsFile = `${srcParts.dir}/${srcParts.name}-configs.json`; if ((0, exists_1.sync)(configurationsFile)) { try { configurations = (0, read_1.sync)(configurationsFile, 'json'); } catch (error) { __1.logger.error(`Error reading configurations file ${configurationsFile}`); } } } for (const conf in configurations) { if (options.dstInfo.IS_GLOB) { options.dstInfo.GLOB_EXTENSIONS.forEach((e) => { variables.SRC_NAME = srcParts.name; variables.SRC_DIR = srcParts.dir; variables.CONFIGURATION = conf; let targetPath = (0, __1.substitute)(options.alt, options.variables.DST_PATH, variables); targetPath = path.resolve(targetPath.replace(options.variables.DST_FILE_EXT, '') + e); const parts = path.parse(targetPath); if (srcParts.ext === parts.ext) { return; } if (!(0, exists_1.sync)(parts.dir)) { try { (0, dir_1.sync)(parts.dir); } catch (e) { if (options.debug) { __1.logger.error(`Error creating target path ${parts.dir} for ${targetPath}`); } return; } } targets.push({ target: targetPath, configuration: conf }); }); } else { variables.SRC_NAME = srcParts.name; variables.SRC_DIR = srcParts.dir; variables.CONFIGURATION = conf; let targetPath = (0, __1.substitute)(options.alt, options.variables.DST_PATH, variables); if (!(0, exists_1.sync)(targetPath)) { try { (0, dir_1.sync)(targetPath); } catch (e) { if (options.debug) { __1.logger.error(`Error creating target path ${targetPath}`); } return; } } targets.push({ target: targetPath, configuration: conf }); } } return targets; }; exports.targets = targets; async function convert(options) { __1.logger.setSettings({ minLevel: options.logLevel || 'warn' }); let reports = []; const onNode = options.onNode || ((data) => reports.push(data)); if (options.srcInfo.FILES.length === 0) { __1.logger.warn(`No files found to convert : `, options.src); return; } //skip orphan / temporary files options.srcInfo.FILES = options.srcInfo.FILES.filter((f) => { return f.includes('~$') === false; }); const ret = await pMap(options.srcInfo.FILES, async (f) => { const outputs = (0, exports.targets)(f, options); __1.logger.info(`Convert ${f} to ${outputs.map(t => t.target).join(',')}`); return convertFiles(f, outputs, options.view, onNode, options); }, { concurrency: 1 }); if (options.report) { const reportOutFile = path.resolve((0, osr_commons_1.resolve)(options.report, false, { dst: options.srcInfo.DIR, ...options.variables, CONFIGURATION: options.configuration || '' })); __1.logger.debug(`Write report to ${reportOutFile}`); (0, exports.report)(reports, reportOutFile); } return ret; } exports.convert = convert; /* const on3DHTML = (src, dst, options: SolidworkOptions) => { const web_root = path.resolve(__dirname + '/../../web/xeo'); const config = JSON.parse(read(path.resolve(__dirname + '/../../config.json')) as any); const templatePath = path.resolve(`${web_root}/template.html`); const template = read(templatePath, 'string') as string; const srcParts = path.parse(src); const variables = { ...config.variables, SRC_PATH_WEB: './' + srcParts.name + '_3D.html', MODEL_SRC: './' + srcParts.name + '.3dxml', }; const content = substitute(false, template, variables); write(dst, content); } */ //# sourceMappingURL=sw-convert.js.map