using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using RevitHttpControl.Models;
using RevitHttpControl.Services;
using RevitHttpControl.Common;
namespace RevitHttpControl.Controllers
{
///
/// 薄壳优化控制器
///
[RoutePrefix("api/shell")]
public class ShellController : ApiController
{
private readonly ShellAnalyzer _analyzer;
private readonly ShellOptimizer _optimizer;
public ShellController()
{
_analyzer = new ShellAnalyzer();
_optimizer = new ShellOptimizer();
}
///
/// 分析模型薄壳优化方案
///
/// 分析请求
/// 分析结果
[HttpPost]
[Route("analyze")]
public HttpResponseMessage AnalyzeShell([FromBody] ShellAnalyzeRequest request)
{
try
{
// 参数验证
if (request == null)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"请求参数不能为空",
HttpStatusCode.BadRequest
);
}
// 验证优化模式
if (!Enum.IsDefined(typeof(ShellOptimizeMode), request.Mode))
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"无效的优化模式",
HttpStatusCode.BadRequest
);
}
// 执行分析
var result = RevitService.AnalyzeShellOptimization(request.Mode);
return this.CreateSuccessResponse(result, "薄壳分析完成");
}
catch (InvalidOperationException ex)
{
return this.CreateErrorResponse(
ErrorCodes.NO_DOCUMENT_OPEN,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (ArgumentException ex)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (TimeoutException ex)
{
return this.CreateErrorResponse(
ErrorCodes.OPERATION_TIMEOUT,
ex.Message,
HttpStatusCode.RequestTimeout
);
}
catch (Exception ex)
{
return this.CreateErrorResponse(
ErrorCodes.REVIT_API_ERROR,
"薄壳分析失败",
HttpStatusCode.InternalServerError,
ex.Message
);
}
}
///
/// 执行薄壳优化(异步)
///
/// 执行请求
/// 异步任务响应
[HttpPost]
[Route("execute")]
public HttpResponseMessage ExecuteShell([FromBody] ShellExecuteRequest request)
{
try
{
// 参数验证
if (request == null)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"请求参数不能为空",
HttpStatusCode.BadRequest
);
}
// 验证优化模式
if (!Enum.IsDefined(typeof(ShellOptimizeMode), request.Mode))
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"无效的优化模式",
HttpStatusCode.BadRequest
);
}
// 创建异步任务
var taskId = TaskManager.Instance.CreateTask(request.ExecutionId);
TaskManager.Instance.SetTaskRunning(taskId);
// 异步执行薄壳优化
RevitService.ExecuteShellOptimizationAsync(request.Mode, request.BackupOriginal, taskId, TaskManager.Instance);
var asyncResponse = new AsyncOperationResponse
{
TaskId = taskId,
StatusUrl = $"/api/task/{taskId}"
};
return this.CreateSuccessResponse(asyncResponse, "薄壳优化任务已创建", HttpStatusCode.Accepted);
}
catch (InvalidOperationException ex)
{
return this.CreateErrorResponse(
ErrorCodes.NO_DOCUMENT_OPEN,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (ArgumentException ex)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (Exception ex)
{
return this.CreateErrorResponse(
ErrorCodes.REVIT_API_ERROR,
"创建薄壳优化任务失败",
HttpStatusCode.InternalServerError,
ex.Message
);
}
}
///
/// 执行薄壳优化(同步)- 用于小型模型或测试
///
/// 执行请求
/// 执行结果
[HttpPost]
[Route("execute/sync")]
public HttpResponseMessage ExecuteShellSync([FromBody] ShellExecuteRequest request)
{
try
{
// 参数验证
if (request == null)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"请求参数不能为空",
HttpStatusCode.BadRequest
);
}
// 验证优化模式
if (!Enum.IsDefined(typeof(ShellOptimizeMode), request.Mode))
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"无效的优化模式",
HttpStatusCode.BadRequest
);
}
// 同步执行薄壳优化
var result = RevitService.ExecuteShellOptimization(request.Mode, request.BackupOriginal);
return this.CreateSuccessResponse(result, "薄壳优化执行完成");
}
catch (InvalidOperationException ex)
{
return this.CreateErrorResponse(
ErrorCodes.NO_DOCUMENT_OPEN,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (ArgumentException ex)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (TimeoutException ex)
{
return this.CreateErrorResponse(
ErrorCodes.OPERATION_TIMEOUT,
ex.Message,
HttpStatusCode.RequestTimeout
);
}
catch (UnauthorizedAccessException ex)
{
return this.CreateErrorResponse(
ErrorCodes.FILE_WRITE_PERMISSION_DENIED,
"文件写入权限不足:" + ex.Message,
HttpStatusCode.Forbidden
);
}
catch (System.IO.IOException ex)
{
return this.CreateErrorResponse(
ErrorCodes.FILE_IO_ERROR,
"文件操作失败:" + ex.Message,
HttpStatusCode.InternalServerError
);
}
catch (Exception ex)
{
return this.CreateErrorResponse(
ErrorCodes.REVIT_API_ERROR,
"薄壳优化执行失败",
HttpStatusCode.InternalServerError,
ex.Message
);
}
}
///
/// 按类别自定义执行删除(同步)
///
/// 自定义删除请求
/// 执行结果
[HttpPost]
[Route("execute/custom")]
public HttpResponseMessage ExecuteShellCustom([FromBody] ShellCustomExecuteRequest request)
{
try
{
if (request == null)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"请求参数不能为空",
HttpStatusCode.BadRequest
);
}
if (request.CategoryIds == null || request.CategoryIds.Count == 0)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
"CategoryIds 不能为空,且至少包含一个类别ID",
HttpStatusCode.BadRequest
);
}
var result = RevitService.ExecuteShellOptimizationByCategories(request.CategoryIds, request.BackupOriginal);
return this.CreateSuccessResponse(result, "自定义类别删除执行完成");
}
catch (InvalidOperationException ex)
{
if (ex.Message.Contains(ErrorMessages.NO_DOCUMENT_OPEN_MSG))
{
return this.CreateErrorResponse(
ErrorCodes.NO_DOCUMENT_OPEN,
ex.Message,
HttpStatusCode.BadRequest
);
}
if (ex.Message.Contains("创建备份失败"))
{
return this.CreateErrorResponse(
ErrorCodes.FILE_WRITE_PERMISSION_DENIED,
ex.Message,
HttpStatusCode.Forbidden
);
}
return this.CreateErrorResponse(
ErrorCodes.REVIT_COMMAND_FAILED,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (ArgumentException ex)
{
return this.CreateErrorResponse(
ErrorCodes.INVALID_REQUEST_PARAMETERS,
ex.Message,
HttpStatusCode.BadRequest
);
}
catch (TimeoutException ex)
{
return this.CreateErrorResponse(
ErrorCodes.OPERATION_TIMEOUT,
ex.Message,
HttpStatusCode.RequestTimeout
);
}
catch (UnauthorizedAccessException ex)
{
return this.CreateErrorResponse(
ErrorCodes.FILE_WRITE_PERMISSION_DENIED,
"文件写入权限不足:" + ex.Message,
HttpStatusCode.Forbidden
);
}
catch (System.IO.IOException ex)
{
return this.CreateErrorResponse(
ErrorCodes.FILE_IO_ERROR,
"文件操作失败:" + ex.Message,
HttpStatusCode.InternalServerError
);
}
catch (Exception ex)
{
return this.CreateErrorResponse(
ErrorCodes.REVIT_API_ERROR,
"自定义类别删除执行失败",
HttpStatusCode.InternalServerError,
ex.Message
);
}
}
///
/// 获取薄壳优化预设配置
///
/// 优化模式配置信息
[HttpGet]
[Route("modes")]
public HttpResponseMessage GetOptimizeModes()
{
try
{
var modes = new[]
{
new
{
Mode = ShellOptimizeMode.Conservative,
Name = "保守模式",
Description = "仅删除装饰元素,减少约30%文件大小",
EstimatedReduction = "30%",
DeletedElements = new[] { "配景", "植物", "装饰元素" }
},
new
{
Mode = ShellOptimizeMode.Standard,
Name = "标准模式",
Description = "删除家具和部分内墙,减少约65%文件大小",
EstimatedReduction = "65%",
DeletedElements = new[] { "家具", "橱柜", "配景", "植物", "部分灯具" }
},
new
{
Mode = ShellOptimizeMode.Aggressive,
Name = "激进模式",
Description = "删除所有内部元素,减少约80%文件大小",
EstimatedReduction = "80%",
DeletedElements = new[] { "家具", "设备", "天花板", "配景", "植物", "灯具", "内部装饰" }
},
new
{
Mode = ShellOptimizeMode.EnvelopeOnly,
Name = "仅保留围护+场地",
Description = "严格只保留外壳(外墙/屋顶/外门窗等)与场地地形,删除所有室内与链接模型",
EstimatedReduction = "-",
DeletedElements = new[] { "所有室内构件", "结构构件", "链接模型" }
}
};
return this.CreateSuccessResponse(modes, "优化模式配置获取成功");
}
catch (Exception ex)
{
return this.CreateErrorResponse(
ErrorCodes.REVIT_API_ERROR,
"获取优化模式配置失败",
HttpStatusCode.InternalServerError,
ex.Message
);
}
}
}
}