Тема: Выгрузить CUI используя C#

Как выгрузить CUI файл используя C#?
заранее спасибо

Re: Выгрузить CUI используя C#

Команда MENUUNLOAD (точно работает) или попробовать Autodesk.AutoCAD.Interop.IAcadMenuGroup.Unload() (не пробовал, но должно работать)

Re: Выгрузить CUI используя C#

Команда MENUUNLOAD, видимо, имеется ввиду аналог CUIUNLOAD - функции LISP ... моя проблема заключается в том что мне необходимо выгрузить меню из модуля DLL написанного на C# ... тогда еще вопрос ... как вызвать функцию LISP из кода C#? (или аналог COMMANDа) smile

Re: Выгрузить CUI используя C#

> Александр Ривилис
Лучше привыкать к команде CUIUNLOAD, хотя пока это одно и то же.

Re: Выгрузить CUI используя C#

> Н.Н.Полещук
Тяжело привыкать... :)

> Миша
Как вызвать функцию lisp из C# описано здесь: http://discussion.autodesk.com/thread.j … ID=5094145
Еще один вариант (AutoCAD 2007, но можно переделать и под 2006):

// Only for AutoCAD 2007+
// This class is using undocumented function acedEvaluateLisp
//
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using System.Runtime.InteropServices;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
[assembly: CommandClass(typeof(Rivilis.CSharpToLisp))]
namespace Rivilis
{
  public class CSharpToLisp
  {
    //
    // From adscodes.h :
    //
    // Type of resbuf element
    const int RTNONE      = 5000; /* No result */
    const int RTREAL      = 5001; /* Real number */
    const int RTPOINT     = 5002; /* 2D point X and Y only */
    const int RTSHORT     = 5003; /* Short integer */
    const int RTANG       = 5004; /* Angle */
    const int RTSTR       = 5005; /* String */
    const int RTENAME     = 5006; /* Entity name */
    const int RTPICKS     = 5007; /* Pick set */
    const int RTORINT     = 5008; /* Orientation */
    const int RT3DPOINT   = 5009; /* 3D point - X, Y, and Z */
    const int RTLONG      = 5010; /* Long integer */
    const int RTVOID      = 5014; /* Blank symbol */
    const int RTLB        = 5016; /* list begin */
    const int RTLE        = 5017; /* list end */
    const int RTDOTE      = 5018; /* dotted pair */
    const int RTNIL       = 5019; /* nil */
    const int RTDXF0      = 5020; /* DXF code 0 for ads_buildlist only */
    const int RTT         = 5021; /* T atom */
    const int RTRESBUF    = 5023; /* resbuf */
    [System.Security.SuppressUnmanagedCodeSecurity]
    [DllImport("acad.exe", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl,
      EntryPoint = "?acedEvaluateLisp@@YAHPB_WAAPAUresbuf@@@Z")]
    extern private static int acedEvaluateLisp(string lispLine, out IntPtr result);
    static public ResultBuffer AcadEvalLisp(string arg)
    {
      IntPtr rb = IntPtr.Zero;
      acedEvaluateLisp(arg, out rb);
      if (rb != IntPtr.Zero) {
        try {
          ResultBuffer rbb = DisposableWrapper.Create(typeof(ResultBuffer), rb, true) as ResultBuffer;
          return rbb;
        } catch {
          return null;
        }
      }
      return null;
    }
    // Define Command "CSharpToLisp"
    // Only for testing we can define this function.
    //
    // Example:
    //   Command: CSharpToLisp
    //   Enter lisp expression: (+ 100 50 30 20 10)
    //   -----------------------------
    //    5003 -> 210
    //   -----------------------------
    [CommandMethod("CSharpToLisp")]
    static public void test()
    {
      PromptResult rs =
        AcadApp.DocumentManager.MdiActiveDocument.Editor.GetString("\nEnter lisp expression: ");
      if (rs.Status == PromptStatus.OK && rs.StringResult != "") {
        ResultBuffer rb = AcadEvalLisp(rs.StringResult);
        if (rb != null)  {
          PrintResbuf(rb);
        } else {
          AcadApp.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nError in evaluation");
        }
      }
    }
    // This code was posted by Tony Tanzillo:
    // http://discussion.autodesk.com/thread.jspa?messageID=5094658
    private static void PrintResbuf(ResultBuffer rb)
    {
      string s = "\n-----------------------------";
      foreach (TypedValue val in rb)
      {
        s += string.Format("\n{0} -> {1}", val.TypeCode,
        val.Value.ToString());
        s += "\n-----------------------------";
      }
      AcadApp.DocumentManager.MdiActiveDocument.Editor.WriteMessage(s);
    }
  }
}

Команду (в ассинхронном режиме) можно вызвать при помощи SendStringToExecute:

Application.DocumentManager.MdiActiveDocument.SendStringToExecute("_.cuiunload \"" + fileName + "\" ", false, false, false);

В filename нужно заменить "\\" на "\\\\" или на "/"

Re: Выгрузить CUI используя C#

Спасибо за советы и ссылки!
к сожалению последняя команда выдает окно запроса выбора выгружаемого меню ... sad ... не хотелось бы что бы пользователь в этом учавствовал ....

Re: Выгрузить CUI используя C#

> Миша
А переключить значение переменной FILEDIA в 0 а после команды восстановить его слабо? :)

Re: Выгрузить CUI используя C#

Сделал по другому .... наисал функцию LISP удаляющую меню ... и вызываю ее ... только в конце надо не забыть кавычки добавить ...("(функция) \"\"" .... )

Re: Выгрузить CUI используя C#

> Миша
Работает? Ну и прекрасно! :)