宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

文章目录

    • 1. 插件向导
    • 2.项目设置
    • 3.属性表
    • 4.样板建立
    • 5.测试
    • 6.添加额外的命令
    • 7.有几件事需要考虑:
    • 8.作者答疑


  犀牛软件是一款专业的三维设计软件。简单实用方便,在三维矢量领域有着广泛的用途,开发拓展这款软件的插件,可以方便设计师摆脱一些繁重的重复劳动,有着现实的需求。作者翻译了官网的一个教程,创建一个C++插件的流程:


  本指南将带你使用C/C++和Visual Studio完成你的第一个Windows Rhino插件。假定您已经安装了必要的工具,并准备就绪。如果还没有安装,请参见安装工具(Windows)。Rhino SDK包括一个Visual Studio项目向导。向导程序为一个正常运行的插件生成代码。按照以下步骤来构建插件:

1. 插件向导

  启动Visual Studio 2019并导航到文件>新建>项目
  在New Project对话框中,从已安装的模板列表中选择Rhino 7插件模板,然后单击Next。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  键入如下所示的项目名称。如果您愿意,您可以输入不同的名称。向导在创建文件和类时使用项目名称。如果输入不同的名称,则文件和类的名称将与本教程中提到的文件和类的名称不同。不要忘记选择一个位置来存储项目。完成后,单击Create。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  单击OK,就会出现Rhino 6插件向导对话框的概览页面。此页提供向导将创建的项目类型的概述。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  注意,默认情况下,向导将执行以下操作:创建一个通用工具插件。如果您对默认设置感到满意,只需单击Finish按钮。如果要更改任何这些设置,请单击“下一步”按钮。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  插件设置页面允许您在生成插件源代码时修改向导使用的一些设置:
  插件名称:如果您想更改插件的名称,请修改此字段。注意:修改这个字段并不会修改项目名,而是修改Rhino的PlugInManager对话框中列出的插件名。插件类型:选择您希望向导创建的插件类型。源文件注释:如果您希望向导向生成的源文件添加详细的注释,请选择此选项。联机帮助:如果你想让你的插件支持联机帮助,请选择此选项。如果选中,一个菜单项将显示在Rhino的帮助菜单上。自动化:选择此选项允许您的程序操作在另一个程序中实现的对象。选择此选项还会向其他自动化客户端插件公开您的程序。Windows套接字:选择此选项表示您的程序支持Windows套接字。Windows套接字允许您编写通过TCP/IP网络通信的程序。安全开发生命周期(SDL)检查:选择此选项以向项目添加推荐的安全开发生命周期(SDL)检查。这些检查包括额外的安全相关警告,如错误,以及额外的安全代码生成特性。有关更多信息,请参见启用其他安全检查。对于本教程,只接受默认设置。单击Finish按钮,向导就会开始生成插件项目的文件夹、文件和类。当向导完成后,使用Visual Studio的解决方案资源管理器查看插件项目。
下列文件是值得关注的:

  Test.vcxproj是一个允许Visual c++构建插件的项目文件。stdafx.h是主要的项目头。stdafx.cpp用于生成预编译头文件。TestApp.h是包含CTestApp类声明的应用程序类头。TestApp.cpp是包含CTestApp成员函数的应用程序类实现。TestAppIn.h是包含CTestPlugIn类声明的插件类头文件。TestAppIn.cpp是包含CTestPlugIn成员函数的插件类实现。cmdTest.cpp是测试Rhino的示例命令。cmdTest.h是资源的#define常量定义。Test.rc and Test.rc2是脚本资源Test.def是模块定义。Test.ico是插件图标。

2.项目设置

  在Visual Studio 2019中,您可以通过单击项目> [ProjectName]属性…来查看项目的设置。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  回顾上述设置,您可以看到没有32位平台。这是因为Rhino 7只能作为64位应用程序使用。

3.属性表

  Visual Studio项目有数百个编译器开关和选项可供选择。使用自定义项目属性表是在其他项目之间同步或共享这些公共设置的方便方法。用于生成插件项目的插件向导将Rhino特定于插件的属性表添加到项目中。要查看这些属性表,请单击view >属性管理器。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客

4.样板建立

  Rhino插件向导除了生成代码之外,还会为插件创建一个自定义的项目文件。这个文件, Test.vcxproj,指定所有文件依赖项以及compile和link选项标志。在构建项目之前,我们需要填写Rhino plugin developer声明。这些声明将让插件的用户知道是谁生成了插件,如果需要,他们可以在哪里支持信息。

  打开TestPlugIn.cpp,修改以下代码行,提供你的公司名称和其他支持信息。

 RHINO_PLUG_IN_DEVELOPER_ORGANIZATION(L"My Company Name");RHINO_PLUG_IN_DEVELOPER_ADDRESS(L"123 Developer Street\r\nCity State 12345-6789");RHINO_PLUG_IN_DEVELOPER_COUNTRY(L"My Country");RHINO_PLUG_IN_DEVELOPER_PHONE(L"123.456.7890");RHINO_PLUG_IN_DEVELOPER_FAX(L"123.456.7891");RHINO_PLUG_IN_DEVELOPER_EMAIL(L"support@mycompany.com");RHINO_PLUG_IN_DEVELOPER_WEBSITE(L"http://www.mycompany.com");RHINO_PLUG_IN_UPDATE_URL(L"http://www.mycompany.com/support");

  当完成后,删除以下代码行,因为#error指令将阻止项目的构建:

 #error Developer declarations block is incomplete!

  注意:如果你不删除这一行,插件将会构建。现在,您可以从build菜单中选择build Test来构建项目了。如果构建成功,一个名为Test的插件文件。rhp创建在项目的Debug文件夹中。

5.测试

  从Visual Studio,导航到调试>开始调试。这将加载Rhino。启动的Rhino版本取决于您构建的配置。向导将下列配置添加到项目中:
  Debug:项目是一个发布项目,它使用编译器的程序数据库(/Zi)选项和链接器的生成调试信息(/ Debug)选项禁用优化并生成调试信息。这些选项设置允许您在开发自定义插件时使用调试器。调试配置还与发布运行时库相链接。使用调试配置构建的插件只会加载与Rhino一起安装的发布版本。
  Release:你的程序的释放配置不包含任何符号调试信息,并且是完全优化的。调试信息可以在PDB文件(c++)中生成,这取决于所使用的编译器选项。如果您以后需要调试您的发行版,创建PDB文件会非常有用。发布配置还与发布运行时库相链接。使用发布配置构建的插件只会加载与Rhino一起安装的发布版本。

对于本指南,构建调试配置。
插件安装:从Rhino内部,导航到工具>选项。导航到Rhino选项下的插件页面并安装插件。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  加载插件后,关闭选项对话框并运行测试命令。你已经完成了你的第一个插件的创建!

6.添加额外的命令

  Rhino插件可以包含任意数量的命令。命令是通过从CRhinoCommand派生一个新类来创建的。关于CRhinoCommand类的详细信息,请参见rhinoSdkCommand.h。
例子

  下面的示例代码演示了一个基本不做任何事情的简单命令类:

// Do NOT put the definition of class CCommandTest in a header
// file. There is only ONE instance of a CCommandTest class
// and that instance is the static theTestCommand that appears
// immediately below the class definition.class CCommandTest : public CRhinoCommand
{
public:// The one and only instance of CCommandTest is created below.// No copy constructor or operator= is required.// Values of member variables persist for the duration of the application.// CCommandTest::CCommandTest()// is called exactly once when static theTestCommand is created.CCommandTest() = default;// CCommandTest::~CCommandTest()// is called exactly once when static theTestCommand is destroyed.// The destructor should not make any calls to the Rhino SDK.// If your command has persistent settings, then override// CRhinoCommand::SaveProfile and CRhinoCommand::LoadProfile.~CCommandTest() = default;// Returns a unique UUID for this command.// If you try to use an id that is already being used, then// your command will not work. Use GUIDGEN.EXE to make unique UUID.UUID CommandUUID() override{// {F502C783-C0CE-4118-8869-EFB0CB34CCCB}static const GUID TestCommand_UUID ={ 0xF502C783, 0xC0CE, 0x4118, { 0x88, 0x69, 0xEF, 0xB0, 0xCB, 0x34, 0xCC, 0xCB } };return TestCommand_UUID;}// Returns the English command name.// If you want to provide a localized command name, then override// CRhinoCommand::LocalCommandName.const wchar_t* EnglishCommandName() override { return L"Test"; }// Rhino calls RunCommand to run the command.CRhinoCommand::result RunCommand(const CRhinoCommandContext& context) override;
};// The one and only CCommandTest object
// Do NOT create any other instance of a CCommandTest class.
static class CCommandTest theTestCommand;CRhinoCommand::result CCommandTest::RunCommand(const CRhinoCommandContext& context)
{// CCommandTest::RunCommand() is called when the user// runs the "Test".// TODO: Add command code here.// Rhino command that display a dialog box interface should also support// a command-line, or scriptable interface.ON_wString str;str.Format(L"The \"%s\" command is under construction.\n", EnglishCommandName());if (context.IsInteractive())RhinoMessageBox(str, TestPlugIn().PlugInName(), MB_OK);elseRhinoApp().Print(str);// TODO: Return one of the following values://   CRhinoCommand::success:  The command worked.//   CRhinoCommand::failure:  The command failed because of invalid input, inability//                            to compute the desired result, or some other reason//   CRhinoCommand::cancel:   The user interactively canceled the command//                            (by pressing ESCAPE, clicking a CANCEL button, etc.)//                            in a Get operation, dialog, time consuming computation, etc.return CRhinoCommand::success;
}

7.有几件事需要考虑:

  命令类必须返回唯一的UUID。如果尝试使用已经在使用的UUID,则命令将不起作用。使用Visual Studio附带的GUIDGEN.EXE创建唯一的uuid。命令类必须返回唯一的命令名。如果尝试使用已经在使用的命令名,则命令将不起作用。命令类只能创建一个实例。这就是为什么应该将命令类的定义放在.cpp文件中。

  犀牛命令发生器:Rhino命令生成器向导是一个独立的应用程序,它将生成新的骨架CRhinoCommand派生类。生成的源代码被复制到Windows剪贴板中,这样您就可以轻松地将其粘贴到源文件中。在Visual Studio 2019中使用此工具:,启动Visual Studio 2019。导航到工具>外部工具,使用Add按钮将RhinoCommandGenerator.exe文件添加到列表中。该文件可以在以下位置找到:C:\Program Files\Rhino 7.0 SDK\Wizards\Command。
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件-风君子博客
  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

8.作者答疑


  如有疑问,请留言。