revit-cli
Version:
A scalable CLI tool for Revit communication and data manipulation
103 lines • 4.31 kB
JavaScript
;
/**
* Select rooms command implementation
* Handles room selection and filtering operations
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createSelectRoomsCommand = createSelectRoomsCommand;
const commander_1 = require("commander");
const room_service_js_1 = require("../../services/room-service.js");
const room_utils_js_1 = require("../../utils/room-utils.js");
/**
* Creates the select-rooms command
* @param getState - Function to get CLI state
* @returns Commander command instance
*/
function createSelectRoomsCommand(getState) {
const command = new commander_1.Command('select-rooms')
.description('Select and filter rooms from Revit')
.option('-l, --level <level>', 'Filter by level')
.option('-d, --department <department>', 'Filter by department')
.option('-o, --occupancy <occupancy>', 'Filter by occupancy')
.option('-n, --name <pattern>', 'Filter by name pattern (regex)')
.option('-r, --number <pattern>', 'Filter by room number pattern (regex)')
.option('--min-area <area>', 'Minimum area filter', parseFloat)
.option('--max-area <area>', 'Maximum area filter', parseFloat)
.option('-f, --filter <filter>', 'Filter string in format "key=value,key2=value2"')
.option('-p, --extract-params', 'Extract additional parameters')
.option('--limit <count>', 'Limit number of results', parseInt)
.action(async (options) => {
try {
const state = await getState();
await executeSelectRooms(state.revitConnector, state.logger, options);
}
catch (error) {
const state = await getState();
state.logger.error('Select rooms command failed:', error);
process.exit(1);
}
});
return command;
}
/**
* Executes the select rooms operation
* @param revitConnector - Revit API connector instance
* @param logger - Logger instance
* @param options - Command options
*/
async function executeSelectRooms(revitConnector, logger, options) {
const roomService = new room_service_js_1.RoomService(revitConnector, logger);
// Build filter options
const filter = {};
// Parse individual filter options
if (options.level)
filter.level = options.level;
if (options.department)
filter.department = options.department;
if (options.occupancy)
filter.occupancy = options.occupancy;
if (options.name)
filter.namePattern = options.name;
if (options.number)
filter.numberPattern = options.number;
if (options.minArea !== undefined)
filter.minArea = options.minArea;
if (options.maxArea !== undefined)
filter.maxArea = options.maxArea;
// Parse filter string if provided
if (options.filter) {
const parsedFilter = (0, room_utils_js_1.parseFilterString)(options.filter);
Object.assign(filter, parsedFilter);
}
// Get all rooms
const allRooms = await roomService.getAllRooms();
logger.info(`Retrieved ${allRooms.length} total rooms`);
// Apply filters
let filteredRooms = (0, room_utils_js_1.filterRooms)(allRooms, filter);
logger.info(`${filteredRooms.length} rooms match filter criteria`);
// Apply limit if specified
if (options.limit && options.limit > 0) {
filteredRooms = filteredRooms.slice(0, options.limit);
logger.info(`Limited results to ${filteredRooms.length} rooms`);
}
// Display results
if (filteredRooms.length === 0) {
console.log('No rooms found matching the specified criteria.');
return;
}
console.log(`\nFound ${filteredRooms.length} rooms:\n`);
filteredRooms.forEach((room, index) => {
const displayText = (0, room_utils_js_1.formatRoomForDisplay)(room, options.extractParams);
console.log(`${index + 1}. ${displayText}`);
});
// Display filter summary
const activeFilters = Object.entries(filter)
.filter(([_, value]) => value !== undefined)
.map(([key, value]) => `${key}=${value}`)
.join(', ');
if (activeFilters) {
console.log(`\nActive filters: ${activeFilters}`);
}
console.log(`\nTotal: ${filteredRooms.length} rooms selected`);
}
//# sourceMappingURL=select-rooms.js.map