首页 > 其他分享 >Revit 机电模型导入 Unity (二)

Revit 机电模型导入 Unity (二)

时间:2023-03-24 23:46:43浏览次数:47  
标签:Doc FBX Unity 导入 过滤器 using activeView Revit

解决思路

  1. 通过Revit导出FBX格式不同过滤器的机电模型并拿到各个不同过滤器的颜色设置
  2. 将FBX格式机电模型统一到Unity当中,设置材质、修改构件为ID

解决步骤

此篇文件先完成解决思路一的内容,此部分主要设计到Revit二次开发的内容,博主也是小白,相关知识不大了解,如有错误欢迎各位大佬批评指正。步骤如下:

  1. 设置全部过滤器为不可见,拿到没有划分到过滤器中的构件,输出FBX模型(Revit直接输出FBX是不带材质的,如对此类构件也有材质需求,可以输出nwc格式再进行下一步操作,详见Revit 机电模型导入Unity(一)
  2. 隐藏步骤1中的未被划分到过滤器的构件(因为Revit导出FBX是按照一个三维视图内的全部构件,如果未隐藏此部分,导出每一个过滤器所包含的构件时这部分会重复,增添Unity中操作难度)
  3. 循环,单独设置每一个过滤器可见,将颜色RGB写入txt文本、导出FBX格式模型
  4. 恢复视图

相关代码

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using System.Collections.ObjectModel;
using System.IO;

namespace ExportFBX
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]

    public class ExportFBX : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Document Doc = uiDoc.Document;

            View activeView = Doc.ActiveView;
            Type type = activeView.GetType();

            if (type.Equals(typeof(View3D)))
            {
                ViewSet viewSet = new ViewSet();
                viewSet.Insert(activeView);

                FBXExportOptions OP = new FBXExportOptions();
                //设置模型精度
                OP.UseLevelsOfDetail = true;
                OP.LevelsOfDetailValue = 5;
                //设置保存路径
                string myPath = @"";//自己填写
                StreamWriter sw = new StreamWriter(myPath + "\\Filters.txt", false);

                ICollection<ElementId> allFilters = activeView.GetFilters();

                Transaction trans = new Transaction(Doc, "Export 3D Models");
                trans.Start();

                foreach (var filter in allFilters)
                {
                    Element elem = Doc.GetElement(filter);
                    activeView.SetFilterVisibility(filter, false);
                }

                Doc.Export(myPath, "未被划分在过滤器中的构件", viewSet, OP);

                FilteredElementCollector collector = new FilteredElementCollector(Doc, activeView.Id);
                collector.WhereElementIsNotElementType();
                ICollection<ElementId> elementIdToHide = collector.ToElementIds();
                foreach (var eleId in elementIdToHide.ToArray())
                {
                    Element ele = Doc.GetElement(eleId);
                    if (!ele.CanBeHidden(activeView))
                    {
                        elementIdToHide.Remove(eleId);
                    }
                }
                activeView.HideElements(elementIdToHide);


                string filterColorTxt = "";
                foreach (var item in allFilters)
                {
                    Element elem = Doc.GetElement(item);
                    activeView.SetFilterVisibility(item, true);

                    FilteredElementCollector collectorinView = new FilteredElementCollector(Doc, activeView.Id).WhereElementIsNotElementType();
                    ICollection<ElementId> elementIdinView = collectorinView.ToElementIds();

                    OverrideGraphicSettings ogs = activeView.GetFilterOverrides(elem.Id);
                    Color filterColor = ogs.SurfaceForegroundPatternColor;
                    if (filterColor.IsValid)
                    {
                        filterColorTxt += elem.Name.Replace(",", "").Replace(" ", "") + " " + filterColor.Red + "," + filterColor.Green + "," + filterColor.Blue + "\n";
                    }

                    Doc.Export(myPath, elem.Name.Replace(",", "").Replace(" ", ""), viewSet, OP);
                    activeView.SetFilterVisibility(item, false);
                }

                foreach (var filter in allFilters)
                {
                    Element elem = Doc.GetElement(filter);
                    activeView.SetFilterVisibility(filter, true);
                }
                activeView.UnhideElements(elementIdToHide);

                trans.Commit();
                sw.Write(filterColorTxt);
                sw.Close();
                TaskDialog.Show("Export FBX", "全部导出成功");
            }
            else
            {
                TaskDialog.Show("Error", "请选择一个三维视图后重试");
            }


            return Result.Succeeded;
        }
    }
}

其中,在隐藏未被划分在过滤器的构件时,需要将不能够在当前视图中隐藏的构件移除(这一点很坑,在下一节会讲讲这部分构件是什么),另外在保存过滤器颜色与FBX模型名字需要保持一致为后续在Unity中操作提供方便。

标签:Doc,FBX,Unity,导入,过滤器,using,activeView,Revit
From: https://www.cnblogs.com/Felix-Fu/p/17253696.html

相关文章

  • POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
    场景SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践)在进行解析Excel时提示:Causedby:java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(ILjava/......
  • SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践)
    场景IDEA中开发SpringBoot项目时需要将Excel模板中数据导入的到数据库。Excel模板如下实现思想首先将模板上传到服务器中某路径,并将当前路径存储,然后使用POI自带的工具类获......
  • Unity的LayoutGroup刷新会延迟一帧的问题
    在去年遇到过LayoutGroup完全不刷新的问题:https://www.cnblogs.com/strawberryPudding/p/15593869.html当时的解决方案是关了之后等一帧再开,但是也有一些问题。在时不时需......
  • Vue3+vite项目中如何动态导入并创建多个全局组件
    背景实际开发项目中,有些时候我们需要通过全局注册多个自定义组件,但是每个组件都导入一次,将会导致代码很冗余。实现方案customComponents/index.jsconstfiles=impor......
  • Unity Shader 实现 Lambert Phong BlinnPhong
    1.Lambert模型基于Lambert余弦定理构造出的模型,只计算了漫反射部分代码部分解析可以看到Lambert模型中只返回了漫反射(diffuse) 再看一下di......
  • Apinto网关导入Swagger报错问题记录
    问题描述ApintoDashboard已经部署完成,想通过导入Swagger文件的方式快速把接口同步到ApintoDashboard,但此时导入报错:CLUSTERDOWNHashslotnotserved,如下问题原因Re......
  • Spring Boot(二):第一种导入依赖方式的实战案例
    文章目录第一种导入依赖方式的实战案例一、导入依赖二、依赖传递结构图三、开发案例代码第一种导入依赖方式的实战案例一、导入依赖<?xmlversion="1.0"encoding="UTF-8"?>......
  • QGIS 导入文本数据(WKT)
    在做GIS数据处理的时候,经常会遇到原始数据是text、csv、Excel等格式的数据。要使用数据前提是要先转换数据。这里是介绍用QGIS导入数据。打开导入方式如下(根......
  • Unity可视化资源依赖关系开发总结
    为了更好的查看资源依赖关系,有必要将资源数据和依赖关系按可视化的形式展现。0x0使用有向图作为数据结构由于预制体资源依赖关系复杂,可能呈现网状关系,因此关系利用有向......
  • fabricjs如何导入echarts
    Fabric.js是一个强大的HTML5canvas库,而ECharts是一个基于JavaScript的图表库。要将ECharts导入到Fabric.js中,您需要先将ECharts渲染到一个离屏canvas,然后将......