TellmeRevitPluging/Controllers/ShellController.cs

418 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 薄壳优化控制器
/// </summary>
[RoutePrefix("api/shell")]
public class ShellController : ApiController
{
private readonly ShellAnalyzer _analyzer;
private readonly ShellOptimizer _optimizer;
public ShellController()
{
_analyzer = new ShellAnalyzer();
_optimizer = new ShellOptimizer();
}
/// <summary>
/// 分析模型薄壳优化方案
/// </summary>
/// <param name="request">分析请求</param>
/// <returns>分析结果</returns>
[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
);
}
}
/// <summary>
/// 执行薄壳优化(异步)
/// </summary>
/// <param name="request">执行请求</param>
/// <returns>异步任务响应</returns>
[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
);
}
}
/// <summary>
/// 执行薄壳优化(同步)- 用于小型模型或测试
/// </summary>
/// <param name="request">执行请求</param>
/// <returns>执行结果</returns>
[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
);
}
}
/// <summary>
/// 按类别自定义执行删除(同步)
/// </summary>
/// <param name="request">自定义删除请求</param>
/// <returns>执行结果</returns>
[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
);
}
}
/// <summary>
/// 获取薄壳优化预设配置
/// </summary>
/// <returns>优化模式配置信息</returns>
[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
);
}
}
}
}