Revit API - 项目中未加载 Space 标签族
Revit API - No Space Tags family is loaded in the project
如何仅使用 API 添加 Space 标签系列?我正在尝试使用
doc.Create.NewSpaces2(level, phase, view);
(https://www.revitapidocs.com/2019/94b4e479-2301-2e78-6201-5bb5614ed796.htm)
在我的项目中,但出现错误 "No Space Tags family is loaded in the project"。
当我使用 Revit GUI 添加 Annotations/Mechanical/Space Tag.rfa 时,一切正常。
您可以将 SpaceTag.rfa
作为资源嵌入到您的 DLL 中,然后在不存在时以编程方式将其加载到 Revit 文件中。
这是一个例子:
1。检查家庭是否存在:
var loadedFam = new FilteredElementCollector(Doc)
.OfClass(typeof(Family))
.Cast<Family>()
.FirstOrDefault(x.Name == famName);
2。如果族不存在则加载它:
if (loadedFam == null)
{
var resourcePath = GetFamilyFromResource(famName);
if (string.IsNullOrWhiteSpace(resourcePath) ||
!e.Document.LoadFamilySymbol(resourcePath,symbolName, out fs)) return null;
}
3。我这里的实用方法是:
private static string GetFamilyFromResource(string resourceName)
{
var contents = Resources.StreamBinaryEmbeddedResource(AppCommand.AppInstance.Assembly,
$"FullPathToResource.{resourceName}.rfa");
if (!contents.Any()) return string.Empty;
var filePath = Path.Combine(Path.GetTempPath(), $"{resourceName}.rfa");
using (var fileStream = File.Open(filePath, FileMode.Create))
using (var writer = new BinaryWriter(fileStream))
{
writer.Write(contents);
}
if (!File.Exists(filePath) || new FileInfo(filePath).Length <= 0) return string.Empty;
return filePath;
}
public static byte[] StreamBinaryEmbeddedResource(Assembly assembly, string fileName)
{
using (var stream = assembly.GetManifestResourceStream(fileName))
{
if (stream == null) return new byte[] { };
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Dispose();
return buffer;
}
}
如何仅使用 API 添加 Space 标签系列?我正在尝试使用
doc.Create.NewSpaces2(level, phase, view);
(https://www.revitapidocs.com/2019/94b4e479-2301-2e78-6201-5bb5614ed796.htm)
在我的项目中,但出现错误 "No Space Tags family is loaded in the project"。
当我使用 Revit GUI 添加 Annotations/Mechanical/Space Tag.rfa 时,一切正常。
您可以将 SpaceTag.rfa
作为资源嵌入到您的 DLL 中,然后在不存在时以编程方式将其加载到 Revit 文件中。
这是一个例子:
1。检查家庭是否存在:
var loadedFam = new FilteredElementCollector(Doc)
.OfClass(typeof(Family))
.Cast<Family>()
.FirstOrDefault(x.Name == famName);
2。如果族不存在则加载它:
if (loadedFam == null)
{
var resourcePath = GetFamilyFromResource(famName);
if (string.IsNullOrWhiteSpace(resourcePath) ||
!e.Document.LoadFamilySymbol(resourcePath,symbolName, out fs)) return null;
}
3。我这里的实用方法是:
private static string GetFamilyFromResource(string resourceName)
{
var contents = Resources.StreamBinaryEmbeddedResource(AppCommand.AppInstance.Assembly,
$"FullPathToResource.{resourceName}.rfa");
if (!contents.Any()) return string.Empty;
var filePath = Path.Combine(Path.GetTempPath(), $"{resourceName}.rfa");
using (var fileStream = File.Open(filePath, FileMode.Create))
using (var writer = new BinaryWriter(fileStream))
{
writer.Write(contents);
}
if (!File.Exists(filePath) || new FileInfo(filePath).Length <= 0) return string.Empty;
return filePath;
}
public static byte[] StreamBinaryEmbeddedResource(Assembly assembly, string fileName)
{
using (var stream = assembly.GetManifestResourceStream(fileName))
{
if (stream == null) return new byte[] { };
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Dispose();
return buffer;
}
}