Revit⼆次开发,在winform中制作3d预览效果。完整项⽬可⽣
产中实例运⽤。
⽬前,见到使⽤的三维预览,是以⼆维平⾯⽣成的线段,类似如:
那么如何做到真正的三维效果呢?我们知道,要在winform中⽣成三维,那⼀般得需要有3d引擎。但我们不太可能为了某⼀个功能,跑去开发⼀个3d引擎,如果真能开发出3d引擎,那么你⾃⼰就可以开⼀家公司了,光3d引擎技术就够你吃⾹的喝辣的了。
⾔归正传,本⽂是使⽤Revit的三维效果,嵌⼊到winfrom中实现的。
正⽂开始之前,先看下最终效果:
请注意,此三维预览,是在winform中先预览,然后才去Revit中,⽣成你的实际效果。⽽不是将Revit的建筑预览到Winform中。
⼀、⾸先我们先实现IExternalCommand接⼝,制作⼀个插件
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Previewer;
using Previewer.Extensions;
using Previewer.Runtime;
using Previewer.Runtime;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows.Forms;
namespace Rotation
{
/// <summary>
/// Revit预览
/// </summary>
/// <creator>marc</creator>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class DefaultCommand : IExternalCommand
{
/// <summary>
/// 执⾏指令
/// </summary>
/// <param name="commandData"></param>
/// <param name="message"></param>
/// <param name="elements"></param>
/
// <returns></returns>
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) {
var activeDocument = commandData.Application.ActiveUIDocument;
var document = activeDocument.Document;
IDataContext context = new DataContext(commandData);
RevitRuntime.SetDataContext(context);
Result result;
Transaction tran = new Transaction(document, Guid.NewGuid().ToString());
try
{
tran.Start();
IWork work = new PreviewWork();
result = work.Run();
tran.Commit();
}
catch (System.Exception exp)
{
tran.RollBack();
result = Result.Failed;
Debug.WriteLine(exp.Message);
}
finally
{
tran.Dispose();
}
return result;
}
}
}
上述接⼝实现,⾥⾯就⼀句核⼼代码:IWork.Run(),也就是说业务逻辑的代码,已经放在了Run⽅法中,那么我们看下IWork接⼝⼆、定义IWork业务逻辑接⼝
using Autodesk.Revit.UI;
namespace Previewer
{
/// <summary>
/// 逻辑作业接⼝
/// </summary>
/// <creator>marc</creator>
public interface IWork
{
/// <summary>
/// 运⾏
/// </summary>
/// <returns></returns>
Result Run();
}
}
三、实现IWork⽅法
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Previewer.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Previewer
{
/// <summary>
/// Revit预览的具体逻辑
/// </summary>
/// <creator>marc</creator>
public class PreviewWork : IWork
{
/// <summary>
/// 运⾏
/
// </summary>
/// <returns></returns>
public virtual Result Run()
{
this.ShowForm();
return Result.Succeeded;
}
/// <summary>
/// 显⽰窗体
/// </summary>
private void ShowForm()
{
var document = PreviewConfigure.GetOrCreateDocument(PreviewRealtime.ProjectName); using (Transaction tran = new Transaction(document, Guid.NewGuid().ToString()))
{
tran.Start();
var form = new PreviewForm();
DialogResult result = form.ShowDialog();
if (result != DialogResult.OK)
{
tran.RollBack();
return;
}
tran.Commit();
}
}
}
}
如上述,我们的具体实现,只是显⽰了⼀个Winform窗体。
四、我们在显⽰Winform窗体之前,先创建⼀个⾃定义的Winform控件
⾃定义Winform控件的界⾯如下:
五、下⾯创建⼀个Winform窗体,并载⼊上⾯的⾃定义控件,界⾯如下:
右侧看不见的区域,就是⾃定义控件的东西。⽤来显⽰三维预览的。
六、看下Winform窗体的代码,讲解下:
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Previewer.Core;
using Previewer.CustomControls;
using Previewer.Runtime;
using Previewer.UI;
writeline方法的作用using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Previewer
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论