判断链接文件偏移量创建空间。

start
[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;
    }
}
url:http://greatverve.cnblogs.com/p/revit-create-space.html
原文地址:https://www.cnblogs.com/greatverve/p/revit-create-space.html