Revit Addin中的Windows窗体

时间:2017-06-30 16:34:47

标签: revit-api revit

我现在已经写了很多不同的加载项,但我一直在努力让一个Windows窗体在Revit上工作。该程序构建正常,我已设置为Revit访问的DLL。

以下是我的代码的不同部分。该程序比看到的更广泛,但我认为问题是参考问题或我的ADDIN文件的问题。也许有一种不同的方式我需要设置我的ADDIN文件,因为我有一个Windows窗体?让我知道。

Here is a Dropbox folder with the screenshots in it.

如果您还需要查看其他内容,请与我们联系。 Revit中的错误说它与FullName有关但我相信我正确地将它放在ADDIN文件中,而且我和其他ADDIN一样。

感谢您的帮助!

[TransactionAttribute(TransactionMode.Manual)]
[RegenerationAttribute(RegenerationOption.Manual)]
public class CicuitChecker : IExternalCommand
{

    public Result Execute(
      ExternalCommandData commandData,
      ref string message,
      ElementSet elements)
    {
        //set document variable
        Document document = commandData.Application.ActiveUIDocument.Document;

        using (Transaction trans = new Transaction(document))
        {
            trans.Start("Circuit Checker");
            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            //run through looped form in case of user not selecting needed fields, and store what family the user wants the program to check
            Boolean messedUp = false;
            Boolean All = false, lightF = false, recep = false, elecEquip = false, equipCon = false, junc = false, panels = false;
            FilteredElementCollector collector = new FilteredElementCollector(doc), collector2 = new FilteredElementCollector(doc);
            while (messedUp)
            { 
                CircuitChecker.CircuitCheckerForm form = new CircuitChecker.CircuitCheckerForm();
                form.ShowDialog();
                //Get application and document objects


                foreach (String item in form.getSelectionElementsLB())
                {
                    if (item.Equals("All"))
                    {
                        All = true;
                        break;
                    }
                    else if (item.Equals("Lighting Fixtures"))
                    {
                        lightF = true;
                    }
                    else if (item.Equals("Recepticales"))
                    {
                        recep = true;
                    }
                    else if (item.Equals("Electrical Equipment (including Panels)"))
                    {
                        elecEquip = true;
                    }
                    else if (item.Equals("Junctions"))
                    {
                        junc = true;
                    }
                    else
                    {
                        messedUp = true;
                        TaskDialog.Show("Error", "At least one element must be selected.");

                    }
                }

                if (form.getSelectionPlaceLB().Equals("Entire Project"))
                {
                    collector
                        = new FilteredElementCollector(doc)
                        .WhereElementIsNotElementType();
                    collector2
                        = new FilteredElementCollector(doc)
                        .WhereElementIsNotElementType();
                }
                else if (form.getSelectionPlaceLB().Equals("Elements in Current View"))
                {
                    collector
                        = new FilteredElementCollector(doc, document.ActiveView.Id)
                        .WhereElementIsNotElementType();
                    collector2
                        = new FilteredElementCollector(doc, document.ActiveView.Id)
                        .WhereElementIsNotElementType();
                }
                else
                {
                    messedUp = true;
                    TaskDialog.Show("Error", "A place must be selected.");
                }
            }


            Color color = new Color(138, 43, 226); // RGB
            OverrideGraphicSettings ogs = new OverrideGraphicSettings();
            OverrideGraphicSettings ogsOriginal = new OverrideGraphicSettings();
            ogs.SetProjectionLineColor(color);
            int notCircuited = 0;
            //ElementId symbolId = family
            ElementCategoryFilter lightFilter = new ElementCategoryFilter(BuiltInCategory.OST_LightingFixtures);
            ElementCategoryFilter recepFilter = new ElementCategoryFilter(BuiltInCategory.OST_ElectricalFixtures);
            ElementCategoryFilter elecEquipFilter = new ElementCategoryFilter(BuiltInCategory.OST_ElectricalEquipment);
            //ElementClassFilter filter = new ElementClassFilter(typeof("Junction Boxes - Load"));
            //FamilyInstanceFilter juncFilter1 = new FamilyInstanceFilter(doc, );
            LogicalOrFilter first = new LogicalOrFilter(lightFilter, recepFilter);

            if (All)
            {


                collector.WherePasses(first);
                IList<Element> allArr = collector.ToElements();
                foreach (Element e in allArr)
                {
                    int cirNum = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_NUMBER).AsInteger();
                    String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_PANEL_PARAM).AsString();
                    if (!(IsNumeric(cirNum)) || (panel.Equals("")) || (panel.Equals("<unnamed>")))
                    {
                        doc.ActiveView.SetElementOverrides(e.Id, ogs);
                        notCircuited++;
                    }
                    else
                    {
                        doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                    }
                }
                collector2.WherePasses(elecEquipFilter);
                IList<Element> elecEquipArr = collector.ToElements();
                foreach (Element e in elecEquipArr)
                {
                    String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_PANEL_SUPPLY_FROM_PARAM).AsString();
                    if ((panel.Equals("")))
                    {
                        doc.ActiveView.SetElementOverrides(e.Id, ogs);
                        notCircuited++;
                    }
                    else
                    {
                        doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                    }
                }
                TaskDialog.Show("Circuit Checker", notCircuited + " lighting fixtures are not circuited in this view.");
                trans.Commit();
            }

            if (!trans.HasEnded())
            {
                if (lightF)
                {
                    collector.WherePasses(lightFilter);
                    IList<Element> lightArr = collector.ToElements();
                    foreach (Element e in lightArr)
                    {
                        int cirNum = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_NUMBER).AsInteger();
                        String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_PANEL_PARAM).AsString();
                        if (!(IsNumeric(cirNum)) || (panel.Equals("")) || (panel.Equals("<unnamed>")))
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogs);
                            notCircuited++;
                        }
                        else
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                        }
                    }
                }

                if (recep)
                {
                    collector.WherePasses(recepFilter);
                    IList<Element> recepArr = collector.ToElements();
                    foreach (Element e in recepArr)
                    {
                        int cirNum = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_NUMBER).AsInteger();
                        String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_PANEL_PARAM).AsString();
                        if (!(IsNumeric(cirNum)) || (panel.Equals("")) || (panel.Equals("<unnamed>")))
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogs);
                            notCircuited++;
                        }
                        else
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                        }
                    }
                }
                if (elecEquip)
                {
                    collector.WherePasses(elecEquipFilter);
                    IList<Element> elecEquipArr = collector.ToElements();
                    foreach (Element e in elecEquipArr)
                    {
                        String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_PANEL_SUPPLY_FROM_PARAM).AsString();
                        if ((panel.Equals("")))
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogs);
                            notCircuited++;
                        }
                        else
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                        }
                    }
                }
                if (junc)
                {
                    collector.WherePasses(recepFilter);
                    IList<Element> juncArr = collector.ToElements();
                    foreach (Element e in juncArr)
                    {
                        int cirNum = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_NUMBER).AsInteger();
                        String panel = e.get_Parameter(BuiltInParameter.RBS_ELEC_CIRCUIT_PANEL_PARAM).AsString();
                        if (!(IsNumeric(cirNum)) || (panel.Equals("")) || (panel.Equals("<unnamed>")))
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogs);
                            notCircuited++;
                        }
                        else
                        {
                            doc.ActiveView.SetElementOverrides(e.Id, ogsOriginal);
                        }
                    }
                }

                TaskDialog.Show("Circuit Checker", notCircuited + " lighting fixtures are not circuited in this view.");
                trans.Commit();
            }
        }
        return Result.Succeeded;
    }
    public static Boolean IsNumeric(Object Expression)
    {
        if (Expression == null || Expression is DateTime)
            return false;

        if (Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean)
            return true;

        try
        {
            if (Expression is string)
                Double.Parse(Expression as string);
            else
                Double.Parse(Expression.ToString());
            return true;
        }
        catch { } // just dismiss errors but return false
        return false;
    }
}

此代码具有“主类”中的功能。我已经将功能移动到konrad建议的表单类,但仍然在Revit中收到FullClassName错误。请帮助!

3 个答案:

答案 0 :(得分:0)

以下是我通常如何设置基于Windows窗体的外部命令。请记住,您必须创建一个外部命令,并且您的插件清单必须指向此类。然后从这个课程中你可以像这样启动表格:

    [Transaction(TransactionMode.Manual)]
    public class SomeCommand : IExternalCommand
    {
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            // Get application and document objects
            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            UIDocument uidoc = uiApp.ActiveUIDocument;

            try
            {
                SomeNamespace.SomeForm form = new SomeNamespace.SomeForm(doc);
                form.ShowDialog();

                return Result.Succeeded;
            }
            // Catch any exceptions and display them
            catch (Autodesk.Revit.Exceptions.OperationCanceledException)
            {
                return Result.Cancelled;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return Result.Failed;
            }
        }
    }

所以我有一个Form类,我从ExternalCommand实例化并将Document传递给它的构造函数。这样,当我稍后与表单交互时,我可以访问文档。我在表单后面的代码中连接了所有功能。

答案 1 :(得分:0)

计划数据加载项提供了一个完整的Visual Studio解决方案,演示了如何在Revit加载项中显示Windows窗体,包括动态生成Windows窗体:

http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html

答案 2 :(得分:0)

同意,OP的问题是为什么插件没有工作...... 从查看图像来看,问题似乎是Revit没有正确查找命令的完整类名。

您没有将命令类包装在命名空间中(例如,您的表单类),这有点不寻常。

我建议将它包装在像“circuitchecker”这样的命名空间中 - 就像你的表单类一样。

然后addin文件中的“全名”将成为“circuitchecker.circuitchecker”

(namespace.classname) - 这有助于Revit区分可能具有相同名称的不同类。

旁注:我不相信将URL放入插件中的Image / LargeImage字段会起作用 - 但不是正面的。