Revit二次开发---项目文件转族文件

将项目文件(.rvt)转换成族文件(.rfa), 项目中的系统族用这种方式转不了

1. 获取到项目中实例

2. 遍历实例记录属性/坐标/中心线等,并且将实例保存成.rfa格式文件

3. 加载一个空的族文件,并且把刚刚导出的实例全部加载到空的族文件中设置其属性/坐标等

4. 将族文件保存

//获取实例
FilteredElementCollector fec = new FilteredElementCollector(doc).ofClass(typeof(FamilyInstance));

fec.UnionWith(new FilteredElementCollector(doc).ofClass(typeof(HostObject))).ToElements();

//属性记录...
Dictionary<string,ParamaterSet> dicPara = new Dictionary<string,ParamaterSet>();
//导出路径
List<string> lstExportPath = new List<string>();

//把实例保存.rfa文件
if(elem is FamilyInstance)
{
    Familyinstance ins = elem as Familyinstance;
    Family family = ins.Symbol.Family;
    Document insDoc = ins.EditFamily(family);
    string sPath = "d:\\"+ins.Id+".rfa";
    lstExportPath.Add(sPath);
    insDoc.SaveAs("d:\\ins.rfa");
    insDoc.Close(false);
    dicPara.Add(sPath,ins.Paramters);
}

//加载一个空族并将实例加载 创建
Family fa = null;
using(Transaction trans = new Transaction(doc,"load"))
{
    trans.start();
    try
    {
        doc.LoadFamily("",familyLoadOption,out fa);
        trans.Commit();
    }
    catch
    {
        trans.RollBack();
    }
}

//遍历lstExportPath 创建
Document fDoc = doc.EditFamily(fa);
foreach(string path in lstExportPath)
{
    Family loadFamily;
    FamilySymbol fs = null;
    fDoc.LoadFamily(path,familyLoadOption,out loadFamily);
    ISet<ElementId> symbolIds = loadFamily.GetFamilySymbolIds();
    foreach(Elementid symbolId in symbolIds)
    {
        fs = fDoc.GetElement(symbolId) as FamilySymbol;
        if(fs == null) Continue;
        if(!fs.IsActive) { fs.Activate(); break; }
    }
    if(fs == null) Comtinue;
    //这里创建基于点的实例, 线/面 反正都是这个方法
    fDoc.FamilyCreate.NewFamilyInstance(记录的坐标,fs,StructuralType.NoStructural);
    //设置属性,旋转角度 Math.PI / 180 * 记录的角度
    ...
    ...
    ...
}
//都创建完保存就行了
fDoc.SaveAs("路径");
fDoc.Close(false);

手打心好累, 功能不难,写了一个大概。

希望能帮到大家。

 

------------------------------------------------------------------------------------------ 更新一下 -----------------------------------------------------------------------------------------------------------------------------

忘记考虑内建模型了,只需在   把项目中实例保存成rfa文件时    加个判断即可

if(!family.IsEditable) continue;

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Revit二次开发中,导入族可以通过使用LoadFamily方法来实现。首先,你需要加载族文件,然后将其导入到Revit项目中。 要加载族文件,你可以使用LoadFamily方法的重载形式,其中包含一个IFamilyLoadOptions接口参数。通过实现这个接口,你可以定义在导入族时如何处理族实例。 在加载族文件之前,你需要确保你已经引用了Revit API的相关命名空间。然后,你可以使用以下代码来导入族: // 创建一个FamilyLoadOptions的实例 IFamilyLoadOptions loadOptions = new MyFamilyLoadOptions(); // 使用LoadFamily方法载入族文件,并应用FamilyLoadOptions doc.LoadFamily(familyPath, loadOptions); 在这个例子中,MyFamilyLoadOptions是一个自定义的类,实现了IFamilyLoadOptions接口。在这个类中,你可以根据需要定义如何处理族实例。例如,你可以选择覆盖现有的族实例,或者创建一个新的族实例。 请注意,族文件的路径必须是有效的,并且与Revit项目文件在同一个位置或者可以通过相对路径访问。 通过以上方法,你就可以在Revit二次开发中成功导入族文件了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Revit二次开发—载入族并交互式放置](https://blog.csdn.net/weixin_40626630/article/details/123245520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Revit二次开发】族](https://blog.csdn.net/weixin_44037272/article/details/126479319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘿呦嘿呦嘿呦嘿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值