Не удается заставить "IscommandAvailable" работать - PullRequest
1 голос
/ 01 апреля 2012

Это мой первый вопрос здесь. Я новичок в программировании Revit API, поэтому извините, если мой вопрос слишком хромает или не ориентирован. Надеюсь, кто-нибудь может мне помочь. Я пытаюсь реализовать доступный метод Iscommand в этом простом учебном примере, и я не могу понять, почему он не работает, я имею в виду, что команда все еще доступна для использования в любом сценарии. Заранее спасибо!

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;
using System.Windows.Forms;

namespace PruebasAPI
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Automatic)]
    class IExternalcommand_elements : IExternalCommand
{

    public bool IsCommandAvailable(Autodesk.Revit.UI.UIApplication applicationData,
        CategorySet selectedCategories)
    {
        //allow button click if there is no active selection
        if (selectedCategories.IsEmpty)
            return true;
        //allow button click if there is at least one wall selected
        foreach (Category c in selectedCategories)
            {
                if (c.Id.IntegerValue == (int)BuiltInCategory.OST_Walls)
                    return true;
            }
            return false;
        }


    public Result Execute(
                            ExternalCommandData commandData,
                                     ref string message,
                                     ElementSet elements)
    {
        try
        {
            Document doc = commandData.Application.ActiveUIDocument.Document;
            UIDocument uidoc = commandData.Application.ActiveUIDocument;

            //delete selected elements
            ICollection<Autodesk.Revit.DB.ElementId> ids = doc.Delete(uidoc.Selection.Elements);

            TaskDialog taskdialog = new TaskDialog("Revit");
            taskdialog.MainContent =
                ("click yes to return succeded.Selected members will be deleted. \n" +
                "click no to return failed.Selected members will not be deleted \n" +
                "click cancel to return cancelled. Selected members will not be deleted.");

            TaskDialogCommonButtons buttons = TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No | TaskDialogCommonButtons.Cancel;
            taskdialog.CommonButtons = buttons;
            TaskDialogResult taskdialogresult = taskdialog.Show();

            if (taskdialogresult == TaskDialogResult.Yes)
            {
                return Result.Succeeded;
            }
            else if (taskdialogresult == TaskDialogResult.No)
            {
                elements = uidoc.Selection.Elements;
                message = "failed to delete selection";
                return Result.Failed;
            }
            else
            {
                return Result.Cancelled;
            }
        }
        catch
        {
            message = "unespected dika";
            return Result.Failed;
        }
    }
}

} `

1 Ответ

2 голосов
/ 01 апреля 2012

IsCommandAvailable не должно быть в вашем командном классе. Вам действительно нужно написать класс, который реализует IExternalCommandAvailability. Вот пример из руководства по API:

public class SampleAccessibilityCheck : IExternalCommandAvailability
{
    public bool IsCommandAvailable(Autodesk.Revit.UI.UIApplication applicationData,
         CategorySet selectedCategories)
    {
        // Allow button click if there is no active selection 
        if (selectedCategories.IsEmpty)
            return true;
        // Allow button click if there is at least one wall selected 
        foreach (Category c in selectedCategories)
        {
            if (c.Id.IntegerValue == (int)BuiltInCategory.OST_Walls)
                return true;
        }
        return false;
    }
}

Затем вы можете указать это имя класса в файле манифеста Addin внутри тега AvailabilityClassName, например:

<AvailabilityClassName>MyNamespace.SampleAccessibilityCheck</AvailabilityClassName>

если у вас есть кнопка на ленте, у класса PushButton также есть свойство PushButton.AvailabilityClassName, где вы можете задать имя этого класса, чтобы ваша командная кнопка включала / отключала соответственно.

Надеюсь, это поможет.

...