revit-cli
Version:
A scalable CLI tool for Revit communication and data manipulation
202 lines • 10.9 kB
JavaScript
;
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