IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Revit SDK 介绍:RebarFreeForm -> 正文阅读

[JavaScript知识库]Revit SDK 介绍:RebarFreeForm

前言

这个例子介绍了如何做自由造型的钢筋,并且可以自动更新。

内容

最终运行的效果如下:
在这里插入图片描述
不过这个工程也是年久失修,可以编译通过,但无法正常运行,需要做些修改。自带的addin文件里没有添加共享参数的命令,需要把它加进来。最终结果如下:

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Command">
    <Assembly>RebarFreeForm.dll</Assembly>
    <ClientId>9d871749-6401-419f-ba8f-99a44c03adf5</ClientId>
    <FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.Command</FullClassName>
    <Text>Rebar Free Form</Text>
    <Description>External command to create a Rebar FreeForm element and external application to implement the custom server used to regenerate the rebar geometry based on constraints</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
	<LanguageType>Unknown</LanguageType>
	<VendorId>ADSK</VendorId>
  </AddIn>
  <AddIn Type="Command">
    <Assembly>RebarFreeForm.dll</Assembly>
    <ClientId>9d871749-6401-419f-ba8f-11a44c03adf5</ClientId>
    <FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.AddSharedParams</FullClassName>
    <Text>Add Shared Params</Text>
    <Description>Add Shared Parameters.</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
	<LanguageType>Unknown</LanguageType>
	<VendorId>ADSK</VendorId>
  </AddIn>
  <AddIn Type="Application">
    <Name>RebarFreeForm</Name>
    <Assembly>RebarFreeForm.dll</Assembly>
    <ClientId>a6ea850e-a041-48bb-85f5-8ce21b2ba972</ClientId>
    <FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.Application</FullClassName>
	<VendorId>ADSK</VendorId>
	<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
  </AddIn>
</RevitAddIns>

入口

这个插件的核心逻辑在它的 Application 里面:

  1. 需要一个 Updater,CurveElementRegenUpdater
  2. 需要一个 ExternalService, RebarUpdateServer
namespace Revit.SDK.Samples.RebarFreeForm.CS
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
    public class Application : IExternalApplication
    {

      RebarUpdateServer m_server = new RebarUpdateServer();
      public Result OnShutdown(UIControlledApplication application)
      {
         return Result.Succeeded;
      }
      public Result OnStartup(UIControlledApplication application)
      {
         // Register CurveElement updater with revit to trigger regen in rebar for selected lines
         CurveElementRegenUpdater updater = new CurveElementRegenUpdater(application.ActiveAddInId);
         UpdaterRegistry.RegisterUpdater(updater);
         ElementClassFilter modelLineFilter = new ElementClassFilter(typeof(CurveElement));
         UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), modelLineFilter, Element.GetChangeTypeAny());
         
         //Register the RebarUpdateServer
         ExternalService service = ExternalServiceRegistry.GetService(m_server.GetServiceId());
         if (service != null)
         {
            service.AddServer(m_server);
            return Result.Succeeded;
         }
         return Result.Succeeded;
      }
   }
}

从 Updater 到 ExternalService

// 在 CurveElementRegenUpdater 中改变 rebar 的共享参数,来让 RebarUpdateServer 有机会执行
foreach(Element elem in elemBars)
{
   Rebar bar = elem as Rebar;
   if (modifiedIds.Contains(id))// if id of line is in the rebar, then trigger regen
   {
      var param = bar.LookupParameter(AddSharedParams.m_paramName);
      param.Set(param.AsInteger() == 0? 1: 0);// just flip the value to register a change that will trigger the regeneration of that rebar on commit.
   }
}

RebarUpdateServer

从测试的结果看,这个 RebarUpdateServer 可能也是年久失修,如果选择创建多个钢筋,也被堆在了一起,或者没考虑过我测试的这种情况。
Revit API:IRebarUpdateServer 更新自定义造型钢筋的接口
如何将数据传入 RebarUpdateServer

  1. RebarUpdateServer 设定 CustomHandle
  2. 在插件的命令中为这些handle添加关联数据

RebarUpdateServer 设定 CustomHandle

public bool GetCustomHandles(RebarHandlesData data)
{
   data.AddCustomHandle((int)BarHandle.FirstHandle);
   data.AddCustomHandle((int)BarHandle.SecondHandle);
   data.AddCustomHandle((int)BarHandle.ThirdHandle);
   data.SetStartHandle((int)BarHandle.StartHandle);
   data.SetEndHandle((int)BarHandle.EndHandle);
   return true;
}
public bool GetHandlesPosition(RebarHandlePositionData data)
{
   if (data.GetNumberOfBars() <= 0)
      return false;
         
   IList<Curve> firstBar = data.GetBarGeometry(0);
   data.SetPosition((int)BarHandle.FirstHandle, firstBar[0].Evaluate(0.5, true));
   data.SetPosition((int)BarHandle.SecondHandle, firstBar[0].Evaluate(0.3, true));
   data.SetPosition((int)BarHandle.ThirdHandle, firstBar[0].Evaluate(0.7, true));
   data.SetPosition((int)BarHandle.StartHandle, firstBar[0].Evaluate(0, true));
   data.SetPosition((int)BarHandle.EndHandle, firstBar[0].Evaluate(1, true));
   return true;
}

public bool GetCustomHandleName(RebarHandleNameData handleNameData)
{
   switch (handleNameData.GetCustomHandleTag())
   {
      case (int)BarHandle.FirstHandle:
         handleNameData.SetCustomHandleName("First Handle");
         break;
      case (int)BarHandle.SecondHandle:
         handleNameData.SetCustomHandleName("Second Handle");
         break;
      case (int)BarHandle.ThirdHandle:
         handleNameData.SetCustomHandleName("Third Handle");
         break;
      default:
         return false;
   }
   return true;
}

在插件的命令中为这些handle添加关联数据

foreach (RebarConstrainedHandle handle in handles)
{
   if (handle.GetHandleType() == RebarHandleType.StartOfBar || handle.GetHandleType() == RebarHandleType.EndOfBar)
      continue;

   Reference reference = sel.PickObject(ObjectType.Face, "Select face for " + handle.GetHandleName());
   if (reference == null)
      continue;
   List<Reference> refs = new List<Reference>();
   refs.Add(reference);
   RebarConstraint constraint = RebarConstraint.Create(handle, refs, true, 0.0);
   rManager.SetPreferredConstraintForHandle(handle, constraint);
}

其它

这个例子应该还有些 bug,但使用的 API 基本就是这些了,如果有相似的需求,可以以此为基础去进行改造。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:41:13  更:2022-03-13 21:43:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:53:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码