@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
JavaScript
;
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