revit-cli
Version:
A scalable CLI tool for Revit communication and data manipulation
171 lines • 5.52 kB
JavaScript
;
/**
* Utility functions for room operations
* Extracted from room-commands.ts for better maintainability
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.collectParameters = collectParameters;
exports.filterRooms = filterRooms;
exports.validateUpdateParameters = validateUpdateParameters;
exports.formatRoomForDisplay = formatRoomForDisplay;
exports.parseFilterString = parseFilterString;
/**
* Collects and formats room parameters for display
* @param room - The room data object
* @param extractParams - Whether to extract additional parameters
* @returns Formatted parameter string
*/
function collectParameters(room, extractParams = false) {
const params = [];
if (room.level)
params.push(`Level=${room.level}`);
if (room.area)
params.push(`Area=${room.area}`);
if (room.volume)
params.push(`Volume=${room.volume}`);
if (room.comments)
params.push(`Comments=${room.comments}`);
if (room.department)
params.push(`Department=${room.department}`);
if (room.occupancy)
params.push(`Occupancy=${room.occupancy}`);
if (extractParams && room.parameters) {
Object.entries(room.parameters).forEach(([key, value]) => {
if (value !== null && value !== undefined && value !== '') {
params.push(`${key}=${value}`);
}
});
}
return params.join(', ');
}
/**
* Filters rooms based on provided criteria
* @param rooms - Array of room data
* @param filter - Filter options
* @returns Filtered array of rooms
*/
function filterRooms(rooms, filter) {
return rooms.filter(room => {
// Level filter
if (filter.level && room.level !== filter.level) {
return false;
}
// Department filter
if (filter.department && room.department !== filter.department) {
return false;
}
// Occupancy filter
if (filter.occupancy && room.occupancy !== filter.occupancy) {
return false;
}
// Name pattern filter
if (filter.namePattern) {
const regex = new RegExp(filter.namePattern, 'i');
if (!regex.test(room.name)) {
return false;
}
}
// Number pattern filter
if (filter.numberPattern) {
const regex = new RegExp(filter.numberPattern, 'i');
if (!regex.test(room.number)) {
return false;
}
}
// Area filters
if (filter.minArea !== undefined && room.area < filter.minArea) {
return false;
}
if (filter.maxArea !== undefined && room.area > filter.maxArea) {
return false;
}
return true;
});
}
/**
* Validates room update parameters
* @param parameters - Parameters to validate
* @returns Validation result with errors if any
*/
function validateUpdateParameters(parameters) {
const errors = [];
if (!parameters || Object.keys(parameters).length === 0) {
errors.push('At least one parameter must be provided for update');
}
// Validate specific parameter types
if (parameters.area !== undefined) {
const area = Number(parameters.area);
if (isNaN(area) || area < 0) {
errors.push('Area must be a positive number');
}
}
if (parameters.volume !== undefined) {
const volume = Number(parameters.volume);
if (isNaN(volume) || volume < 0) {
errors.push('Volume must be a positive number');
}
}
return {
isValid: errors.length === 0,
errors
};
}
/**
* Formats room data for console display
* @param room - Room data to format
* @param includeParameters - Whether to include additional parameters
* @returns Formatted string for display
*/
function formatRoomForDisplay(room, includeParameters = false) {
const basicInfo = `${room.name} (${room.number}) - ${room.level}`;
if (!includeParameters) {
return basicInfo;
}
const parameters = collectParameters(room, true);
return parameters ? `${basicInfo} | ${parameters}` : basicInfo;
}
/**
* Parses filter string into RoomFilterOptions
* @param filterString - Filter string in format "key=value,key2=value2"
* @returns Parsed filter options
*/
function parseFilterString(filterString) {
const filter = {};
if (!filterString) {
return filter;
}
const pairs = filterString.split(',');
for (const pair of pairs) {
const [key, value] = pair.split('=').map(s => s.trim());
if (!key || !value) {
continue;
}
switch (key.toLowerCase()) {
case 'level':
filter.level = value;
break;
case 'department':
filter.department = value;
break;
case 'occupancy':
filter.occupancy = value;
break;
case 'name':
case 'namepattern':
filter.namePattern = value;
break;
case 'number':
case 'numberpattern':
filter.numberPattern = value;
break;
case 'minarea':
filter.minArea = Number(value);
break;
case 'maxarea':
filter.maxArea = Number(value);
break;
}
}
return filter;
}
//# sourceMappingURL=room-utils.js.map