Revit二次开发之“加载A项目中的族到B项目中”
2011-05-10 09:36
513 查看
start
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI.Selection;
using RevitApp = Autodesk.Revit.ApplicationServices;
namespace RevitCodes
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
//[Journaling(JournalingMode.NoCommandData)]
public class LoadFamilyFromOtherFile : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
//加载一个Revit文件
//Document DOC = commandData.Application.Application.OpenDocumentFile("D:\\Backup\\桌面\\项目1.rvt");
//遍历已经打开的Revit文件
Document myFamilyDoc = null;
foreach (Document doc in commandData.Application.Application.Documents)
{
if (doc.PathName == "D:\\Backup\\桌面\\加载万能窗.rvt")
{
//遍历找到族
FilteredElementCollector collector = new FilteredElementCollector(doc);
if (collector != null)
collector.OfCategory(BuiltInCategory.OST_Windows);
IList<Element> list = collector.ToElements();
foreach (Element e in list)
{
FamilySymbol fs = e as FamilySymbol;
if (fs.Family.Name == "万能窗")
{
myFamilyDoc = doc.EditFamily(fs.Family);
break;
}
}
}
}
//加载到当前项目中
if (myFamilyDoc != null)
uiDoc.Document.LoadFamily(myFamilyDoc);//只能是族文件才可以加载。即.rfa
return Result.Succeeded;
}
}
一个项目A中有族myFamiy,我想加载到另一个打开的项目B中,通过手工的方式可以实现。在A中把族另存为myFamily.rfa 文件,然后在B中加载族即可。
如何通过编程在一个命令中实现?
这个是可以用编程方式来实现。
下面是主要步骤。
方法1. 模仿手工步骤
1. 在项目A中,通过对象访问函数找到myFamily族
2. Document myFamilyDoc = A.EditFamily(myFamily);
3. 保存myFamilyDoc, myFamilyDoc.SaveAs(rfaFileName),
4. B中加载该文件, B.LoadFamily(rfaFileName).
方法2. 直接加载到B中,简单高效
1. 在项目A中,通过对象访问函数找到myFamily族
2. Document myFamilyDoc = A.EditFamily(myFamily);
3. B中加载该文件, B.LoadFamily(myFamilyDoc),或用另一个重载函数
可以通过Application.Documents 访问当前REvit中打开的多个文档。
下面是方法2的例子代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class RevitCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
Transaction trans = new Transaction(uiDoc.Document);
trans.Start("loadfamily");
Document myFamilyDoc = null;
foreach (Document doc in commandData.Application.Application.Documents)
{
if (doc.PathName.ToLower() == @"c:\yejo\revit\adn\userproject\1269157\a.rvt")
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
if (collector != null)
collector.OfClass(typeof(Family));
IList<Element> list = collector.ToElements();
foreach (Element f in list)
{
Family family = f as Family;
if (family.Name == "M_Window-Square Opening")
{
myFamilyDoc = doc.EditFamily(family);
break;
}
}
}
}
//加载到当前项目中
if (myFamilyDoc != null)
myFamilyDoc.LoadFamily(uiDoc.Document);
trans.Commit();
return Result.Succeeded;
}
}
原来是LoadFamily();用颠倒了。
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI.Selection;
using RevitApp = Autodesk.Revit.ApplicationServices;
namespace RevitCodes
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
//[Journaling(JournalingMode.NoCommandData)]
public class LoadFamilyFromOtherFile : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
//加载一个Revit文件
//Document DOC = commandData.Application.Application.OpenDocumentFile("D:\\Backup\\桌面\\项目1.rvt");
//遍历已经打开的Revit文件
Document myFamilyDoc = null;
foreach (Document doc in commandData.Application.Application.Documents)
{
if (doc.PathName == "D:\\Backup\\桌面\\加载万能窗.rvt")
{
//遍历找到族
FilteredElementCollector collector = new FilteredElementCollector(doc);
if (collector != null)
collector.OfCategory(BuiltInCategory.OST_Windows);
IList<Element> list = collector.ToElements();
foreach (Element e in list)
{
FamilySymbol fs = e as FamilySymbol;
if (fs.Family.Name == "万能窗")
{
myFamilyDoc = doc.EditFamily(fs.Family);
break;
}
}
}
}
//加载到当前项目中
if (myFamilyDoc != null)
uiDoc.Document.LoadFamily(myFamilyDoc);//只能是族文件才可以加载。即.rfa
return Result.Succeeded;
}
}
一个项目A中有族myFamiy,我想加载到另一个打开的项目B中,通过手工的方式可以实现。在A中把族另存为myFamily.rfa 文件,然后在B中加载族即可。
如何通过编程在一个命令中实现?
这个是可以用编程方式来实现。
下面是主要步骤。
方法1. 模仿手工步骤
1. 在项目A中,通过对象访问函数找到myFamily族
2. Document myFamilyDoc = A.EditFamily(myFamily);
3. 保存myFamilyDoc, myFamilyDoc.SaveAs(rfaFileName),
4. B中加载该文件, B.LoadFamily(rfaFileName).
方法2. 直接加载到B中,简单高效
1. 在项目A中,通过对象访问函数找到myFamily族
2. Document myFamilyDoc = A.EditFamily(myFamily);
3. B中加载该文件, B.LoadFamily(myFamilyDoc),或用另一个重载函数
可以通过Application.Documents 访问当前REvit中打开的多个文档。
下面是方法2的例子代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class RevitCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application;
Transaction trans = new Transaction(uiDoc.Document);
trans.Start("loadfamily");
Document myFamilyDoc = null;
foreach (Document doc in commandData.Application.Application.Documents)
{
if (doc.PathName.ToLower() == @"c:\yejo\revit\adn\userproject\1269157\a.rvt")
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
if (collector != null)
collector.OfClass(typeof(Family));
IList<Element> list = collector.ToElements();
foreach (Element f in list)
{
Family family = f as Family;
if (family.Name == "M_Window-Square Opening")
{
myFamilyDoc = doc.EditFamily(family);
break;
}
}
}
}
//加载到当前项目中
if (myFamilyDoc != null)
myFamilyDoc.LoadFamily(uiDoc.Document);
trans.Commit();
return Result.Succeeded;
}
}
原来是LoadFamily();用颠倒了。
相关文章推荐
- webpack开发vue2项目中的一些坑(1、跨域 2、打包后后端访问一片空白3、加载第三方库的字体文件出错4、加载背景图出错)
- Revit二次开发----在项目环境中直接建族
- 实习小白::(转) Cocos2d-x 3.0 开发(十六)cocos2dx-3.0beta版建立新项目并加载CocoStudio导出文件
- 开发大型 web 项目时如何按需加载?
- linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf
- Geoserver项目开发(三) -图层加载限制(一)
- Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)
- 混合APP开发的套路(二):加载项目中的html
- Revit二次开发之获得项目族预览图
- VS2010开发web项目打开后,项目不可用,提示“需要缺少的 Web 组件才能进行加载”
- Geoserver项目开发(三) -图层加载限制(二)
- 利用 React/Redux/React-Router 4/webpack 开发大型 web 项目时如何按需加载
- IDEA下开发SpringBoot项目,实现代码的热部署/热加载
- C++项目开发中加载第三方动态库的方法
- 多人开发同一项目,项目加载Xcode编译报错 问题
- 完美解决“换另一台电脑上用VS2008继续开发web项目时出现“System.Runtime.InteropServices.COMException”,然后是加载不了项目。”
- 最近项目要求开发一个echarts的小功能图表,需要动态加载数据,现在做完后把源码拷上来
- Revit二次开发之编辑族并载入到项目文档里
- Windows 10开发基础——VS2015 Update1新建UWP项目,XAML设计器无法加载的解决
- Eclipse 开发WEB项目 webcontent下lib中的jar包不自动加载的问题