UNPKG

revit-cli

Version:

A scalable CLI tool for Revit communication and data manipulation

202 lines 10.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerWallCommands = registerWallCommands; const chalk_1 = __importDefault(require("chalk")); /** * Register wall-related CLI commands */ function registerWallCommands(program, getState) { // Select walls command with pipeline support program.command('select-elements') .description('Select elements by category with filtering and parameter extraction (generic element selector)') .option('--category <category>', 'Element category to select (e.g., "Walls")') .option('--filter <param=value>', 'Filter elements by parameter value (e.g., "Function=Exterior")') .option('--get-param <parameter>', 'Get specific parameter value (e.g., "Area")') .option('-d, --details', 'Show detailed element information') .option('-g, --geometry', 'Include geometry information') .action(async (options) => { try { const { revitConnector, logger } = await getState(); logger.debug('Starting select command with options:', JSON.stringify(options)); // Validate required options if (!options.category) { logger.error('Category is required. Use --category <category>'); process.exit(1); } logger.info(`Selecting elements from category: ${options.category}`); // Step 1: Get elements by category const requestConfig = { method: 'GET', url: `/elements/category/${encodeURIComponent(options.category)}` }; logger.debug('Making API request:', JSON.stringify(requestConfig)); const response = await revitConnector.request(requestConfig); if (!response.success || !response.data) { logger.error('Failed to retrieve elements. Response details:', { success: response.success, data: response.data, error: response.error }); process.exit(1); } let elements = response.data; logger.debug(`Retrieved ${elements.length} elements from category ${options.category}`); // Step 2: Apply parameter filter if specified if (options.filter) { const filterParts = options.filter.split('='); if (filterParts.length !== 2) { logger.error('Filter format should be: parameter=value (e.g., "Function=Exterior")'); process.exit(1); } const [paramName, paramValue] = filterParts; logger.debug(`Applying filter: ${paramName} = ${paramValue}`); const originalCount = elements.length; elements = elements.filter(element => { const parameterValue = element.parameters?.[paramName]; return parameterValue && parameterValue.toString().toLowerCase() === paramValue.toLowerCase(); }); logger.debug(`Filter applied: ${originalCount} -> ${elements.length} elements`); } if (elements.length === 0) { const message = `No elements found in category "${options.category}"` + (options.filter ? ` with filter "${options.filter}"` : ''); logger.warn(message); return; } // Step 3: Extract specific parameter if requested if (options.getParam) { logger.info(`Extracting parameter: ${options.getParam}`); console.log(chalk_1.default.blue(`\nParameter "${options.getParam}" values:\n`)); elements.forEach((element, index) => { const paramValue = element.parameters?.[options.getParam]; const displayValue = paramValue !== undefined ? paramValue : 'N/A'; console.log(`${chalk_1.default.yellow(`${index + 1}.`)} ${chalk_1.default.green(element.name)} (ID: ${element.id})`); console.log(` ${options.getParam}: ${chalk_1.default.cyan(displayValue)}`); console.log(); // Empty line for spacing }); } else { // Step 4: Display element information logger.debug('Displaying element information...'); console.log(chalk_1.default.blue(`\nFound ${elements.length} element(s) in category "${options.category}":\n`)); elements.forEach((element, index) => { console.log(`${chalk_1.default.yellow(`${index + 1}.`)} ${chalk_1.default.green(element.name)} (ID: ${element.id})`); console.log(` Category: ${element.category}`); console.log(` Type: ${element.typeName}`); console.log(` Level: ${element.level}`); if (options.details && element.parameters) { console.log(` Parameters:`); Object.entries(element.parameters).forEach(([key, value]) => { console.log(` ${key}: ${value}`); }); } if (options.geometry && element.geometry) { console.log(` Geometry:`); if (element.geometry.boundingBox) { const bb = element.geometry.boundingBox; console.log(` Bounding Box: (${bb.min.x.toFixed(2)}, ${bb.min.y.toFixed(2)}, ${bb.min.z.toFixed(2)}) to (${bb.max.x.toFixed(2)}, ${bb.max.y.toFixed(2)}, ${bb.max.z.toFixed(2)})`); } if (element.geometry.location?.curve) { const curve = element.geometry.location.curve; console.log(` Length: ${curve.length.toFixed(2)}`); } } console.log(); // Empty line for spacing }); } logger.success(`Successfully processed ${elements.length} elements`); } catch (error) { const { logger } = await getState(); logger.error('Failed to select elements. Error details:', { message: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined, type: typeof error }); process.exit(1); } }); // List walls command (specific to walls) program .command('walls') .description('List all walls in the current Revit project') .option('-d, --details', 'Show detailed wall information including parameters') .option('-f, --filter <pattern>', 'Filter walls by name or type pattern') .option('-g, --geometry', 'Include geometry information') .action(async (options) => { try { const { revitConnector, logger } = await getState(); logger.debug('Starting walls command with options:', JSON.stringify(options)); logger.info('Retrieving walls from Revit...'); const requestConfig = { method: 'GET', url: '/elements/category/Walls' }; logger.debug('Making API request:', JSON.stringify(requestConfig)); const response = await revitConnector.request(requestConfig); if (!response.success || !response.data) { logger.error('Failed to retrieve walls. Response details:', { success: response.success, data: response.data, error: response.error }); process.exit(1); } let walls = response.data; logger.debug(`Retrieved ${walls.length} walls from API`); // Apply filter if provided if (options.filter) { const pattern = options.filter.toLowerCase(); logger.debug(`Applying filter pattern: "${pattern}"`); const originalCount = walls.length; walls = walls.filter(wall => wall.name.toLowerCase().includes(pattern) || wall.typeName.toLowerCase().includes(pattern)); logger.debug(`Filter applied: ${originalCount} -> ${walls.length} walls`); } if (walls.length === 0) { const message = 'No walls found' + (options.filter ? ` matching pattern "${options.filter}"` : ''); logger.warn(message); return; } logger.debug('Displaying wall information...'); console.log(chalk_1.default.blue(`\nFound ${walls.length} wall(s):\n`)); walls.forEach((wall, index) => { console.log(`${chalk_1.default.yellow(`${index + 1}.`)} ${chalk_1.default.green(wall.name)} (${chalk_1.default.cyan(wall.typeName)})`); console.log(` ID: ${wall.id}`); console.log(` Level: ${wall.level}`); console.log(` Family: ${wall.familyName}`); if (options.geometry && wall.geometry) { if (wall.geometry.boundingBox) { const bb = wall.geometry.boundingBox; console.log(` Bounding Box: (${bb.min.x.toFixed(2)}, ${bb.min.y.toFixed(2)}, ${bb.min.z.toFixed(2)}) to (${bb.max.x.toFixed(2)}, ${bb.max.y.toFixed(2)}, ${bb.max.z.toFixed(2)})`); } if (wall.geometry.location?.curve) { const curve = wall.geometry.location.curve; console.log(` Length: ${curve.length.toFixed(2)}`); } } if (options.details && wall.parameters) { console.log(` Parameters:`); Object.entries(wall.parameters).forEach(([key, value]) => { console.log(` ${key}: ${value}`); }); } console.log(); // Empty line for spacing }); logger.success(`Successfully retrieved and displayed ${walls.length} walls`); } catch (error) { const { logger } = await getState(); logger.error('Failed to retrieve walls. Error details:', { message: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined, type: typeof error }); process.exit(1); } }); } //# sourceMappingURL=wall-commands.js.map