由于VC++是在CLR中被编译所以无法达到加密的效果,如果想要保护自己的代码还是建议使用C++做核心算法,C#做交互。
由于做族库中,考虑到连接数据库代码可能会被反编译,上个版本中我采用的是WCF的方式与服务器数据交互,文章可在我前几篇找到,但是最近在学习QT相尝试使用QT+C++或是VC++开发,看一下效果,所以简单写了一个c++开发的demo。
参考链接:C++ Revit Add-In
步骤:
- 需要确保我们的VS上面安装CLI工具,如果按照上面的步骤直接进行的话,是没有类库选项需要我们安装额外的组件。安装点击:工具-获取工具和功能即可安装

- 创建类库,输入名字与.netframwork框架版本即可,版本与RevitAPI需要的版本对应

- 按照c#的开发方式,添加引用即可,在头文件中,将transation头添加,并添加iexternalcommand接口,并在cpp文件中写内容即可。但是在添加[transation]的时候无法通过智能提示添加,不清楚是不是我的原因,由于c++使用指针,如果习惯var变量可以使用auto替代,代码类中加上^符号即可。其他的只需要遵循c++的写法就可以实现c++做revit的二次开发了。
代码:
header
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #pragma once
using namespace System; using namespace Autodesk::Revit::Attributes;
namespace ClassLibrary3 { [Autodesk::Revit::Attributes::Transaction( Autodesk::Revit::Attributes::TransactionMode::Manual)]
[Autodesk::Revit::Attributes::Regeneration( Autodesk::Revit::Attributes::RegenerationOption::Manual)] public ref class Class1:Autodesk::Revit::UI::IExternalCommand { public: virtual Autodesk::Revit::UI::Result Execute(Autodesk::Revit::UI::ExternalCommandData^ commandData, String^% message, Autodesk::Revit::DB::ElementSet^ elements); };
|
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include "pch.h"
#include "ClassLibrary3.h" #include "NameSpace.h"
namespace RevitAddin { }
Autodesk::Revit::UI::Result ClassLibrary3::Class1::Execute(Autodesk::Revit::UI::ExternalCommandData^ commandData, String^% message, Autodesk::Revit::DB::ElementSet^ elements) { auto uiDoc = commandData->Application->ActiveUIDocument; auto doc = uiDoc->Document; auto selection = uiDoc->Selection; auto refer = selection->PickObject(Autodesk::Revit::UI::Selection::ObjectType::Element, "select"); auto ele = doc->GetElement(refer); auto wall = static_cast<Autodesk::Revit::DB::Wall^>(ele); Autodesk::Revit::UI::TaskDialog::Show("Revit",wall->Name); return Autodesk::Revit::UI::Result::Succeeded; }
|
