Revit IExternal Application Error - кажется, не работает вообще - PullRequest
0 голосов
/ 24 апреля 2020

Должно ли у нас быть что-то с внешним приложением, чтобы правильно зарегистрировать событие?

Я также попытался поместить две точки останова, одну внутри стартового модуля, а другую внутри модуля экспорта. первый ответил и ждал, пока я продолжу, а следующий не ответил (надеюсь, строка не запустилась)

Кроме того, я вручную попытался скопировать файл надстройки в расположение надстройки, чтобы избежать какого-либо события после сборки ошибка, но по-прежнему не работает.

Не могли бы вы сказать мне, что я делаю здесь не так.

Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.DB.Events;
using System.IO;

namespace UserDataSheet
{
    [Transaction(TransactionMode.Manual)]

    [Regeneration(RegenerationOption.Manual)]

    public class UserDataSheetclass : IExternalApplication
    {
        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {
            try
            {
                // Register event. 
                application.ControlledApplication.DocumentOpened += new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(ExportLog);
                return Result.Succeeded;
            }
            catch (Exception)
            {
                return Result.Failed;
            }
        }
        public void ExportLog(object sender, DocumentOpenedEventArgs args)
        {
            var doc = sender as Document;
            var isFamilyDoc = doc.IsFamilyDocument;

            // variables to use 
            string RevitUserName = "";
            DateTime OpenTime = new DateTime();
            string localUserName = "";
            string filename = "";
            string filepath = "";
            string content = "";

            if (isFamilyDoc == false)
            {

                var IsloggedIn = Autodesk.Revit.ApplicationServices.Application.IsLoggedIn;
                if (IsloggedIn == true )//&& doc.IsModelInCloud == true)
                {
                    // use variables
                    filepath = doc.PathName;
                    filename = doc.Title;
                    RevitUserName = doc.Application.Username;
                    OpenTime = DateTime.Now;
                    localUserName = System.Environment.MachineName;

                }
                content = string.Format("Date and time : {0} \n Revit UserName : {1} \n Local PC UserName : {2} \n FileName : {3} \n FilePath : {4} "
                    , OpenTime.ToString(), RevitUserName, localUserName, filename, filepath);
                TaskDialog.Show("Model Open Writer info", "user and file details : \n " + content);
            }
            var writefilepath = Path.GetTempPath();
            var Writefile = writefilepath + "//records.txt"; 
            FileStream fs = new FileStream(Writefile, FileMode.Append);
            StreamWriter writer = new StreamWriter(fs);
            writer.Write(content);
            writer.Close();
            File.OpenRead(Writefile);

        }  
    }
}

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Прежде всего, вы можете полностью удалить TransactionMode и RegenerationOption. Последний полностью устарел и вообще ничего не делает. Первый полезен только при объявлении внешней команды. Это бесполезно и игнорируется в контексте внешнего приложения.

Во-вторых, для решения вашего вопроса: вы можете установить точку останова в начале OnStartup. Если точка останова не достигнута, ваша надстройка вообще не загружается. Возможно, что-то не так с вашей регистрацией надстройки, например, в файле манифеста надстройки *.addin.

Go обратно на круги своя, т. Е. Работа с материалом Getting Staring и руководство разработчика инструкции по регистрации и загрузке надстройки Revit .

0 голосов
/ 27 апреля 2020
  1. Вы можете увидеть класс sender самостоятельно, установив точку останова в начале ExportLog и заглянув в отладчик.
  2. Нет, вы не можете изменить сигнатуру обработчика события , Это предопределено Revit API.
  3. Да.

Мне кажется, что вы могли бы сэкономить немного времени и усилий для себя, узнав немного больше об основах C# и. NET программирование перед продолжением решения этой задачи.

0 голосов
/ 26 апреля 2020

Если достигнута точка останова в OnStartup, значит, ваша надстройка загружается правильно, что означает, что файл манифеста надстройки *addin исправен. Таким образом, вам не нужно беспокоиться об этом. Кстати, тег VisibilityMode не используется для внешних приложений.

0 голосов
/ 26 апреля 2020

Спасибо, Джереми. Это сработало

Во-первых, я извиняюсь за то, что добавил это как ответ (я не знаю, как добавить коды в комментарии)

Это сработало, когда я удалил свой файл Addin и воссоздал, может быть, я сделал в этом какую-то ошибку.

тем временем я скопировал следующий код из примеров и использовал его, честно говоря, я не понял эту строку кода.

"public void ExportLog(object sender, DocumentOpenedEventArgs args)"

Вы можете указать на правильный источник, который объясняет это часть. У меня есть три вопроса:

  1. какой тип объекта является отправителем, и аргументы они типа приложения?
  2. Как добавить третий параметр в этот метод, скажем, я хочу, чтобы пользователь ввел строку для имени файла, в который копируются данные.
  3. Могу ли я сделать это

           var newEvent  = new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(ExportLog);
    

вместо

application.ControlledApplication.DocumentOpened += new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(ExportLog);

Почему во всех примерах используется + = это для регистрации события каждый раз, когда открывается новый экземпляр Revit?

Спасибо за вашу помощь.

...