Skip to main content
Glama

move_elements

Batch move Revit elements with precise coordinate adjustments. Automates unit conversion (mm to feet), provides detailed results, and handles errors effectively via JSON-RPC 2.0.

Instructions

移动Revit元素,支持批量操作,遵循JSON-RPC 2.0规范。 mcp_tool使用时params不要有任何注释信息

特性:

  • 支持批量移动多个Revit元素

  • 自动处理单位转换(毫米转英尺)

  • 返回移动后的元素详细信息(使用ElementModelRequest格式)

  • 完善的错误处理机制

参数: ctx (Context): FastMCP上下文对象 method (str): JSON-RPC方法名,默认为"MoveElements" params (List[Dict]): 移动参数列表,每个字典包含: - elementId (str): 要移动的元素ID - x (float): X方向移动距离(毫米) - y (float): Y方向移动距离(毫米) - z (float): Z方向移动距离(毫米)

返回: dict: JSON-RPC 2.0格式的响应,结构为: 成功时: { "jsonrpc": "2.0", "result": [ { "elementId": "移动后的元素ID", "name": "元素名称", "familyName": "族名称" }, ... ], "id": request_id } 失败时: { "jsonrpc": "2.0", "error": { "code": int, "message": str, "data": any }, "id": request_id }

示例: response = move_elements(ctx, params=[ {"elementId": "123456", "x": 100, "y": 200, "z": 0}, {"elementId": "789012", "x": -50, "y": 0, "z": 300} ])

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
methodNoMoveElements
paramsNo

Implementation Reference

  • The 'move_elements' tool is included in the GENERAL_TOOLS list used for registration.
    GENERAL_TOOLS = [ get_commands, execute_commands, call_func, find_elements, update_elements, delete_elements, parameter_elements, get_locations, move_elements, show_elements, active_view, get_selected_elements, link_dwg_and_activate_view, get_view_data ]
  • Loop that registers all tools in GENERAL_TOOLS, including 'move_elements', using the FastMCP tool decorator.
    # 注册通用工具 for tool in GENERAL_TOOLS: server.tool()(tool)
  • Call to register_tools which registers the 'move_elements' tool.
    register_tools(mcp)
  • Utility function to get the RevitConnection used by tool handlers to send commands to Revit.
    def get_revit_connection() -> RevitConnection: """ 获取或创建持久的Revit连接 返回: RevitConnection: 与Revit的连接对象 异常: Exception: 连接失败时抛出 """ global _connection, _enabled if _connection is not None: try: # 测试连接是否有效 result = _connection.send_command("get_polyhaven_status") _enabled = result.get("enabled", False) return _connection except Exception as e: logger.warning(f"现有连接已失效: {str(e)}") try: _connection.disconnect() except: pass _connection = None # 创建新连接 if _connection is None: _connection = RevitConnection(host="localhost", port=_port) if not _connection.connect(): logger.error("无法连接到Revit") _connection = None raise Exception( "无法连接到Revit。请确保Revit插件正在运行。") logger.info("已创建新的持久连接到Revit") return _connection
  • The send_command method likely called by tool handlers like move_elements to execute the logic in Revit via RPC.
    def send_command(self, command_type: str, params: Union[Dict[str, Any], List[Dict[str, Any]]] = None) -> Dict[ str, Any]: """ 向Revit发送命令并返回响应 参数: command_type (str): 命令类型 params (Dict[str, Any] 或 List[Dict[str, Any]]): 命令参数 返回: Dict[str, Any]: 命令响应 异常: ConnectionError: 连接错误 TimeoutError: 请求超时 ValueError: 参数或响应无效 Exception: 其他错误 """ # 确保连接 if not self.sock and not self.connect(): raise ConnectionError("无法连接到Revit") try: logger.info(f"发送命令: {command_type}") logger.debug(f"命令参数: {params}") # 导入并创建请求对象 from .rpc import JsonRPCRequest, JsonRPCResponse command = JsonRPCRequest(method=command_type, params=params) command_json = json.dumps(command.__dict__) # 发送命令 self.sock.sendall(command_json.encode('utf-8')) logger.debug("命令已发送,等待响应...") # 使用 receive_full_response 接收完整数据流 response_data = self.receive_full_response() logger.debug(f"已接收 {len(response_data)} 字节数据") # 解析响应 try: response_dict = json.loads(response_data.decode('utf-8')) response = JsonRPCResponse( id=response_dict.get("id"), result=response_dict.get("result"), error=response_dict.get("error") ) except json.JSONDecodeError as e: logger.error(f"无法解析Revit响应: {str(e)}") if response_data: logger.error(f"原始响应 (前200字节): {response_data[:200]}") raise ValueError(f"无效的Revit响应: {str(e)}") # 处理错误 if response.error: error_message = response.error.get("message", "未知错误") error_code = response.error.get("code", -1) error_data = response.error.get("data") logger.error(f"Revit错误 (代码: {error_code}): {error_message}") if error_data: logger.error(f"错误数据: {error_data}") raise Exception(f"Revit错误: {error_message}") return response.result or {}

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ZedMoster/revit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server