C# 代码在一个加载项中工作,但在另一个加载项中不执行任何操作 FilteredElementCollector Lincoln=新的FilteredElementCollector(doc); Lincoln.of Category(BuiltInCategory.ostrvtlinks);Autodesk.Revit.DB.View CurrentView=uiDoc.ActiveView; ICollection Toggle_On=Lincoln.ToelementId();将_打开。清除(); ICollection Toggle_Off=Lincoln.ToelementId();关闭。清除(); 已处理列表=新列表(); List Revit_On=新建列表();List Revit_Off=新建列表(); 列出Revit_名称=新建列表(); foreach(林肯一号元素链接) { 字符串Revit_Name=One_Link.Name; 如果(!Revit\u Names.Contains(Revit\u Name))//阻止处理同一链接两次;/!!!! { Revit\u名称。添加(Revit\u名称); Boolean Is_Hidden=一个链接。ishiden(CurrentView)// 如果(是否隐藏) { 切换启用.Add(一个链接.Id);Revit启用.Add(一个链接.Name); }//这显然能探测到隐藏的东西; 其他的 { 切换_Off.Add(一个链接.Id);Revit_Off.Add(一个链接.Name); } } } 事务Do_切换=新事务(文档,“DoToggle”); Do_Toggle.Start(); 如果(!Toggle_Off.Count.Equals(0)){CurrentView.HideElements(Toggle_Off);} 如果(!Toggle_On.Count.Equals(0)){CurrentView.UnhideElements(Toggle_On);} Do_Toggle.Commit();

C# 代码在一个加载项中工作,但在另一个加载项中不执行任何操作 FilteredElementCollector Lincoln=新的FilteredElementCollector(doc); Lincoln.of Category(BuiltInCategory.ostrvtlinks);Autodesk.Revit.DB.View CurrentView=uiDoc.ActiveView; ICollection Toggle_On=Lincoln.ToelementId();将_打开。清除(); ICollection Toggle_Off=Lincoln.ToelementId();关闭。清除(); 已处理列表=新列表(); List Revit_On=新建列表();List Revit_Off=新建列表(); 列出Revit_名称=新建列表(); foreach(林肯一号元素链接) { 字符串Revit_Name=One_Link.Name; 如果(!Revit\u Names.Contains(Revit\u Name))//阻止处理同一链接两次;/!!!! { Revit\u名称。添加(Revit\u名称); Boolean Is_Hidden=一个链接。ishiden(CurrentView)// 如果(是否隐藏) { 切换启用.Add(一个链接.Id);Revit启用.Add(一个链接.Name); }//这显然能探测到隐藏的东西; 其他的 { 切换_Off.Add(一个链接.Id);Revit_Off.Add(一个链接.Name); } } } 事务Do_切换=新事务(文档,“DoToggle”); Do_Toggle.Start(); 如果(!Toggle_Off.Count.Equals(0)){CurrentView.HideElements(Toggle_Off);} 如果(!Toggle_On.Count.Equals(0)){CurrentView.UnhideElements(Toggle_On);} Do_Toggle.Commit();,c#,revit-api,C#,Revit Api,不知何故,交易失败了吗?撤消不可用,因此它认为它没有执行任何可能需要撤消的操作。请注意,我的另一个外接程序中使用了这段代码(其中多个可选子程序通过在窗体上选择单选选项来控制)。但是当我尝试在独立版本中使用代码时,它失败了(没有错误)。还要注意,我插入了多个TaskDialog条目,以验证它是否确实找到了在当前视图中可见或隐藏的RvtLinks。但它只是拒绝实际改变它们的可见性。如果我运行对话框控制的版本,所有内容都会切换,但是如果我立即运行单机版,任何内容都不会切换(证明它不是不可编辑的固定链接

不知何故,交易失败了吗?撤消不可用,因此它认为它没有执行任何可能需要撤消的操作。请注意,我的另一个外接程序中使用了这段代码(其中多个可选子程序通过在窗体上选择单选选项来控制)。但是当我尝试在独立版本中使用代码时,它失败了(没有错误)。还要注意,我插入了多个TaskDialog条目,以验证它是否确实找到了在当前视图中可见或隐藏的RvtLinks。但它只是拒绝实际改变它们的可见性。如果我运行对话框控制的版本,所有内容都会切换,但是如果我立即运行单机版,任何内容都不会切换(证明它不是不可编辑的固定链接)。我通过将“切换链接”设置为默认设置,用户可以调用我收集的程序并点击回车键,从而使用此选项,但我需要将其设置为真正的独立选项。

您编写的代码让我感到困惑。例如,为什么要初始化带有成员值的
Toggle_On
Toggle_Off
集合,然后立即清除它们

在任何情况下,事务的使用都不会遵循建议的模式,即使用语句将其封装在


有关在Revit API中使用事务的详细信息,请参阅上的“Building Coder”主题组。

关于事务结构,我正在使用一个我在许多其他程序中见过(并使用过)的程序,包括一个完全可以使用此代码的程序——它只是我的独立程序,在它失败的地方。关于清除Toggle_Off和Toggle_On…我刚刚养成了这样的习惯,在开始添加之前,我会尝试确保延迟值(例如表单使用的值)完全清除。我将查看您的“处理事务和…”引用,但这仍然不能解释在一个程序中工作的相同代码,而不能解释在另一个程序中工作的相同代码(包括相同的“引用”)。因此,基本上,这个“答案”根本不解决这个问题,而只是对在一个地方工作但在另一个地方不工作的代码结构的注释。这个“答案”让我困惑。
FilteredElementCollector Lincoln = new FilteredElementCollector(doc);
Lincoln.OfCategory(BuiltInCategory.OST_RvtLinks); Autodesk.Revit.DB.View CurrentView = uiDoc.ActiveView;
ICollection<ElementId> Toggle_On = Lincoln.ToElementIds(); Toggle_On.Clear();
ICollection<ElementId> Toggle_Off = Lincoln.ToElementIds(); Toggle_Off.Clear();
List<Element> Processed = new List<Element>();
List<string> Revit_On = new List<string>(); List<string> Revit_Off = new List<string>();
List<string> Revit_Names = new List<string>();
foreach (Element One_Link in Lincoln)
{
    string Revit_Name = One_Link.Name;
    if (!Revit_Names.Contains(Revit_Name))//prevents processing same link twice;/but does NOT change anyway!!!!
    {
        Revit_Names.Add(Revit_Name);
        Boolean Is_Hidden = One_Link.IsHidden(CurrentView);//
        if (Is_Hidden)
        {
            Toggle_On.Add(One_Link.Id); Revit_On.Add(One_Link.Name);
        }//this apparently does detect what is hidden;
        else
        {
            Toggle_Off.Add(One_Link.Id); Revit_Off.Add(One_Link.Name);
        }
    }
}
Transaction Do_Toggle = new Transaction(doc, "DoToggle");
Do_Toggle.Start();
if (!Toggle_Off.Count.Equals(0)) { CurrentView.HideElements(Toggle_Off); }
if (!Toggle_On.Count.Equals(0)) { CurrentView.UnhideElements(Toggle_On); }
Do_Toggle.Commit();