创建链接模型标注
创建Floor等有实体形状的标注
今天在回答Revit API Forum的问题的时候发现一个问题,如何获取链接模型的reference从而实现标注Reference to Grid and Level from link,我便使用CreateLinkReference(doc)
这个方法直接获取,结果创建dimension失败
报错有无效的reference,后来debug直接获取手动创建的link reference成功标注,觉得是获取的reference的问题,后台查阅refernce的strign字符串发现不一致
后来看到这篇文章Revit处理链接文件标注Reference,修改后创建dimension成功,应该是转换的refernce-stable出现问题所以直接获取创建失败。
var floor = RevitCommandData.Document.GetElement(5676918) as Floor;
var reference = floor.GetTopFaceReferences().First();
var linkInstance = RevitCommandData.Document.GetElement(5678360) as RevitLinkInstance;
var linkDoc = linkInstance.GetLinkDocument();
var targetLinkEle = linkDoc.GetElement(5677607) as Floor;
var linkFace =
targetLinkEle.GetGeometryObjectFromReference(HostObjectUtils.GetTopFaces(targetLinkEle).First()) as
Face;
var linkRef = HostObjectUtils.GetTopFaces(targetLinkEle).First().CreateLinkReference(linkInstance);
var str = linkRef.ConvertToStableRepresentation(RevitCommandData.Document);
var str2 = referenceLink.ConvertToStableRepresentation(RevitCommandData.Document);
var strs = str.Split(':').ToList();
var newStr = $"{strs[0]}:0:RVTLINK:{strs[2]}:{strs[3]}:{strs[4]}";
var newReference = Reference.ParseFromStableRepresentation(RevitCommandData.Document, newStr);
var testRef = newReference.ConvertToStableRepresentation(RevitCommandData.Document);
TransactionUtils.Execute(RevitCommandData.Document,new Action<IDisposable>(x =>
{
var referenceArray = new ReferenceArray();
referenceArray.Append(reference);
referenceArray.Append(newReference);
var fakeLine = Line.CreateUnbound(new XYZ(-49.469472958128, 1769.33005941939, 209.147513214079),
-XYZ.BasisZ);
var dim = RevitCommandData.Document.Create.NewDimension(RevitCommandData.ActiveView, fakeLine,
referenceArray);
}),"test");
创建Level Grid等没有实体形状的标注
#region Create Link Level And Grid Dimension
//ModelLine
// var line = RevitCommandData.Document.GetElement(5679235) as ModelLine;
// var linkInstance = RevitCommandData.Document.GetElement(5678360) as RevitLinkInstance;
// var linkDoc = linkInstance.GetLinkDocument();
// var referenceLine = line.GeometryCurve.Reference;
// //Linked Grid
// var linkGrid = linkDoc.GetElement(5684684) as Autodesk.Revit.DB.Grid;
// var linkGridRefLine = (linkGrid.Curve.Reference).CreateLinkReference(linkInstance);
// var linkGridStr = linkGridRefLine.ConvertToStableRepresentation(RevitCommandData.Document);
// var strs = linkGridStr.Split(':').ToList();
// var completeGridRef = $"{strs[0]}:0:RVTLINK:{strs[2]}:{strs[3]}:{strs[4]}";
// var targetRef = Reference.ParseFromStableRepresentation(RevitCommandData.Document, completeGridRef);
// // Local Level
// var level = RevitCommandData.Document.GetElement(5672502) as Level;
// var levelRefPlane = new Reference(level);
// //Link Level
// var linkLevel = linkDoc.GetElement(5672528) as Level;
// var linkLevelRefLine = (new Reference(linkLevel)).CreateLinkReference(linkInstance);
// var linkLevelStr = linkLevelRefLine.ConvertToStableRepresentation(RevitCommandData.Document);
// var linkRefSplits = linkLevelStr.Split(':');
// var completeLevelRef = $"{linkRefSplits[0]}:0:RVTLINK:{linkRefSplits[2]}:0:SURFACE";
// var targetLevelRef = Reference.ParseFromStableRepresentation(RevitCommandData.Document, completeLevelRef);
//
//
// TransactionUtils.Execute(RevitCommandData.Document , new Action<IDisposable>(x =>
// {
// //Create Link-Level And Local-Level
// // var array = new ReferenceArray();
// // array.Append(levelRefPlane);
// // array.Append(targetLevelRef);
// // var l = Line.CreateUnbound(new XYZ(160.658709208543, -55.1818640250467, 39.7924116653103), -XYZ.BasisZ);
// // var dimLevel = RevitCommandData.Document.Create.NewDimension(RevitCommandData.ActiveView, l, array);
// //Create Link-Grid And ModelLine
// var array2 = new ReferenceArray();
// array2.Append(referenceLine);
// array2.Append(targetRef);
// var l2 = Line.CreateUnbound(new XYZ(34.4348591859389, 52.0854280621026, 0), XYZ.BasisY);
// var dimGrid = RevitCommandData.Document.Create.NewDimension(RevitCommandData.ActiveView, l2, array2);
// }),"test");
#endregion