繁体   English   中英

如何在C#中使用Revit API向Revit中的族添加参数?

[英]How to add parameter to a family in Revit using Revit API in C#?

我正在尝试向 Revit 族添加参数。 当我打开 Revit Family 文档并在宏中执行以下代码时,出现此错误:

System.Exception:文档重新生成失败。 在 MacroModule.executeMacro_(MacroModule*, AString* MacroName) 在 MacroModule.executeMacro_(MacroModule*, AString* )

知道如何解决这个问题吗?

public void FamilyInstanceParameters()
{
    Document document = this.ActiveUIDocument.ActiveView.Document;
    if (!document.IsFamilyDocument)
    {
        TaskDialog.Show("Info", "This is not a FamilyDocument");
    }
    else
    {
        try
        {
            Transaction transaction = new Transaction(document);
            transaction.Start("Param");

            // Get the family document category
            Family family = document.OwnerFamily;
            Category category = family.FamilyCategory;

            FamilyType familyType = document.FamilyManager.NewType("New Type A");
            document.FamilyManager.CurrentType = familyType;


            // Parameter group
            BuiltInParameterGroup builtInParamGroup = BuiltInParameterGroup.PG_IDENTITY_DATA;


            document.Regenerate();
            FamilyParameter familyParameter = document.FamilyManager
               .AddParameter("parameterName", builtInParamGroup, category, false);

            document.FamilyManager.Set(familyParameter, "parameterValue");

            transaction.Commit();
            transaction.Dispose();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}

在调试器中运行您的代码,并准确确定是哪一行导致了问题。 如果是对document.Regenerate的调用,也许可以跳过它。 众多详细解决方案请搜索Revit API论坛添加族参数

我通过使用以下方法重载解决了这个问题:

public FamilyParameter AddParameter( string parameterName, ForgeTypeId groupTypeId, ForgeTypeId specTypeId, bool isInstance )

public void FamilyInstanceParameters()
{
    Document document = this.ActiveUIDocument.ActiveView.Document;
    if (!document.IsFamilyDocument)
    {
        TaskDialog.Show("Info", "This is not a FamilyDocument");
    }
    else
    {
        try
        {
            Transaction transaction = new Transaction(document);
            transaction.Start("Param");

            // Get the family document category
            Family family = document.OwnerFamily;
            Category category = family.FamilyCategory;

            FamilyType familyType = document.FamilyManager.NewType("New Type A");
            document.FamilyManager.CurrentType = familyType;


            // ParameterName en value
            string parameterName = "parameterNameLength";
            int parameterValue = 20;

            FamilyParameter familyParameter = document.FamilyManager.AddParameter(parameterName: parameterName, groupTypeId: GroupTypeId.Constraints, specTypeId: SpecTypeId.Length, isInstance: false);


            document.FamilyManager.Set(familyParameter, parameterValue);

            transaction.Commit();
            transaction.Dispose();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}

这是添加文本参数的方法

    public void AddParameter(Document familyDoc)
    {
        using(Transaction tx = new Transaction(familyDoc, "AddParameter"))
        {
            tx.Start();
            
            familyDoc.FamilyManager.NewType("New Type A"); //add new type - "new type" becomes current type
            FamilyParameter familyParameter = familyDoc.FamilyManager.AddParameter("parameterName", GroupTypeId.IdentityData, SpecTypeId.String.Text, false); //method overload to add text parameter
            familyDoc.FamilyManager.Set(familyParameter, "parameterValue");
            //familyDoc.FamilyManager.SetFormula(familyParameter, "\"parameterValue\"");
            
            tx.Commit();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM