由于VC++是在CLR中被编译所以无法达到加密的效果,如果想要保护自己的代码还是建议使用C++做核心算法,C#做交互。


由于做族库中,考虑到连接数据库代码可能会被反编译,上个版本中我采用的是WCF的方式与服务器数据交互,文章可在我前几篇找到,但是最近在学习QT相尝试使用QT+C++或是VC++开发,看一下效果,所以简单写了一个c++开发的demo。
参考链接:C++ Revit Add-In
步骤:

  1. 需要确保我们的VS上面安装CLI工具,如果按照上面的步骤直接进行的话,是没有类库选项需要我们安装额外的组件。安装点击:工具-获取工具和功能即可安装
    在这里插入图片描述
  2. 创建类库,输入名字与.netframwork框架版本即可,版本与RevitAPI需要的版本对应
    在这里插入图片描述
  3. 按照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);
// TODO: 在此处为此类添加方法。
};

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;
}

在这里插入图片描述