Тема: Выгрузить CUI используя C#
Как выгрузить CUI файл используя C#?
заранее спасибо
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → .NET → Выгрузить CUI используя C#
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как выгрузить CUI файл используя C#?
заранее спасибо
Команда MENUUNLOAD (точно работает) или попробовать Autodesk.AutoCAD.Interop.IAcadMenuGroup.Unload() (не пробовал, но должно работать)
Команда MENUUNLOAD, видимо, имеется ввиду аналог CUIUNLOAD - функции LISP ... моя проблема заключается в том что мне необходимо выгрузить меню из модуля DLL написанного на C# ... тогда еще вопрос ... как вызвать функцию LISP из кода C#? (или аналог COMMANDа)
> Александр Ривилис
Лучше привыкать к команде CUIUNLOAD, хотя пока это одно и то же.
> Н.Н.Полещук
Тяжело привыкать... :)
> Миша
Как вызвать функцию 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 нужно заменить "\\" на "\\\\" или на "/"
Спасибо за советы и ссылки!
к сожалению последняя команда выдает окно запроса выбора выгружаемого меню ... ... не хотелось бы что бы пользователь в этом учавствовал ....
> Миша
А переключить значение переменной FILEDIA в 0 а после команды восстановить его слабо? :)
Сделал по другому .... наисал функцию LISP удаляющую меню ... и вызываю ее ... только в конце надо не забыть кавычки добавить ...("(функция) \"\"" .... )
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → .NET → Выгрузить CUI используя C#
Форум работает на PunBB, при поддержке Informer Technologies, Inc