[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class cmd : IExternalCommand
{
/// <summary>
/// 根据链接文件名称找到对应链接路径,模糊匹配,待改进
/// </summary>
/// <param name="listPath"></param>
/// <param name="strKey"></param>
/// <returns></returns>
private string GetPath(List< string> listPath, string strKey)
{
foreach ( string strPath in listPath)
{
if (strPath.Contains(strKey))
return strPath;
}
return "";
}
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
{
UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
UIApplication uiApp = cmdData.Application;
Document doc = uiDoc.Document;
Selection selection = uiDoc.Selection;
Transaction ts = new Transaction(doc, " www ");
ts.Start();
FilteredElementCollector collector = new FilteredElementCollector(doc); //
collector.OfClass( typeof(Instance)).OfCategory(BuiltInCategory.OST_RvtLinks); // RevitLinkType
List< string> listPath = GetLinkFilePaths(doc);
foreach (Element elDoc in collector)
{
Instance ins = elDoc as Instance;
if (ins != null)
{
Transform transForm = ins.GetTransform();
string strKey = elDoc.Name.Substring( 0, elDoc.Name.IndexOf( " .rvt ")); // 找到链接文件名称
Document docLink = uiApp.Application.OpenDocumentFile(GetPath(listPath, strKey));
FilteredElementCollector collectorLink = new FilteredElementCollector(docLink);
collectorLink.OfCategory(BuiltInCategory.OST_Rooms);
foreach (Element el in collectorLink)
{
Room room = el as Room;
LocationPoint roomPoint = room.Location as LocationPoint;
UV uv = new UV();
if (room.Location != null)
{
uv = new UV(roomPoint.Point.X + transForm.Origin.X, roomPoint.Point.Y + transForm.Origin.Y);
}
doc.Create.NewSpace(room.Level, uv);
}
}
}
ts.Commit();
return Result.Succeeded;
}
/// <summary>
/// 取得链接文件路径
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List< string> GetLinkFilePaths(Document doc)
{
List< string> listPath = new List< string>();
foreach (ElementId elId in ExternalFileUtils.GetAllExternalFileReferences(doc))
{
if (doc.get_Element(elId).IsExternalFileReference())
{
ExternalFileReference fileRef = doc.get_Element(elId).GetExternalFileReference();
if ( " RevitLink " == fileRef.ExternalFileReferenceType.ToString())
listPath.Add(ModelPathUtils.ConvertModelPathToUserVisiblePath(fileRef.GetAbsolutePath()));
}
}
return listPath;
}
}
[Regeneration(RegenerationOption.Manual)]
public class cmd : IExternalCommand
{
/// <summary>
/// 根据链接文件名称找到对应链接路径,模糊匹配,待改进
/// </summary>
/// <param name="listPath"></param>
/// <param name="strKey"></param>
/// <returns></returns>
private string GetPath(List< string> listPath, string strKey)
{
foreach ( string strPath in listPath)
{
if (strPath.Contains(strKey))
return strPath;
}
return "";
}
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
{
UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
UIApplication uiApp = cmdData.Application;
Document doc = uiDoc.Document;
Selection selection = uiDoc.Selection;
Transaction ts = new Transaction(doc, " www ");
ts.Start();
FilteredElementCollector collector = new FilteredElementCollector(doc); //
collector.OfClass( typeof(Instance)).OfCategory(BuiltInCategory.OST_RvtLinks); // RevitLinkType
List< string> listPath = GetLinkFilePaths(doc);
foreach (Element elDoc in collector)
{
Instance ins = elDoc as Instance;
if (ins != null)
{
Transform transForm = ins.GetTransform();
string strKey = elDoc.Name.Substring( 0, elDoc.Name.IndexOf( " .rvt ")); // 找到链接文件名称
Document docLink = uiApp.Application.OpenDocumentFile(GetPath(listPath, strKey));
FilteredElementCollector collectorLink = new FilteredElementCollector(docLink);
collectorLink.OfCategory(BuiltInCategory.OST_Rooms);
foreach (Element el in collectorLink)
{
Room room = el as Room;
LocationPoint roomPoint = room.Location as LocationPoint;
UV uv = new UV();
if (room.Location != null)
{
uv = new UV(roomPoint.Point.X + transForm.Origin.X, roomPoint.Point.Y + transForm.Origin.Y);
}
doc.Create.NewSpace(room.Level, uv);
}
}
}
ts.Commit();
return Result.Succeeded;
}
/// <summary>
/// 取得链接文件路径
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List< string> GetLinkFilePaths(Document doc)
{
List< string> listPath = new List< string>();
foreach (ElementId elId in ExternalFileUtils.GetAllExternalFileReferences(doc))
{
if (doc.get_Element(elId).IsExternalFileReference())
{
ExternalFileReference fileRef = doc.get_Element(elId).GetExternalFileReference();
if ( " RevitLink " == fileRef.ExternalFileReferenceType.ToString())
listPath.Add(ModelPathUtils.ConvertModelPathToUserVisiblePath(fileRef.GetAbsolutePath()));
}
}
return listPath;
}
}