Тема: как получить элемент?
в лиспе есть замечательная весч (entget) - даёт лист с записью объекта, в .NET API говорят есть подобное...
как оно выглядит???
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
в лиспе есть замечательная весч (entget) - даёт лист с записью объекта, в .NET API говорят есть подобное...
как оно выглядит???
там какимито извращенскими методами это всё делаеца... я с таким же успехом могу (entget) с коммандлайн выполнить...
как я понял они там загружают DLLку с функцией acdbentget - а может тогда её можно и в VBA загрузить и вызвать???
> todesengel
1) Они - это я.
2) Никакая dll-ка не загружается. Она всегда загружена если запущен AutoCAD.
3) Из VBA (IMHO) не вызовешь - она не STDCALL. В .NET использование P/Invoke в порядке вещей.
4) Запускать через командную строку то, что можно сделать иначе - это и есть извращение.
через VBA я уже повертел повсякому - действительно - запустить можно - параметры передать не выходит...
но всё таки в ObjectARX помоему можно всё это делать проще... хотя заявляют, что .NET API тотже ObjectARX...
ладно, видимо пути проще и короче нету...
а функции entmake и entmod можешь так же описать???
но всё таки в ObjectARX помоему можно всё это делать проще...
В ObjectARX это действительно намного проще.
хотя заявляют, что .NET API тотже ObjectARX...
Об этом я уже писал. .NET API - это обертки для функций ObjectARX. Для каких-то функций/классов/методов они сделаны. Для каких-то нет. Вот и приходится пользоваться P/Invoke или писать свои обертки для тех, которые не сделаны или сделаны с ошибками.
где я могу прочитать чё такое пи-инвоук и как я узнаю где лежат те функции АРХ которые мне нужны??? есть инструменты для этого???
> todesengel
Про P/Invoke почитай в толстых книжках по C# или поиском в google. Инструменты для получения сигнатур функций из exe/dll/arx/dbx-файлов - это dumpbin.exe и undname.exe (из состава MS VS).
да - фсё грусно и нудно...
жаль чё аффтары аффтакада не сделали обёртки для самых важных функций...
Вот тебе еще подарок:
using System; using System.Runtime.InteropServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using AcRx = Autodesk.AutoCAD.Runtime; using AcEd = Autodesk.AutoCAD.EditorInput; using AcDb = Autodesk.AutoCAD.DatabaseServices; using AcAp = Autodesk.AutoCAD.ApplicationServices; [assembly: CommandClass(typeof(Rivilis.EntFunctions))] namespace Rivilis { public class EntFunctions { [System.Security.SuppressUnmanagedCodeSecurity] [DllImport("acdb17.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")] private static extern int acdbGetAdsName(long[] name, ObjectId objId); [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntGet")] private static extern System.IntPtr acdbEntGet(long[] name); [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntMod")] private static extern System.Int32 acdbEntMod(System.IntPtr resbuf); [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntMake")] private static extern System.Int32 acdbEntMake(System.IntPtr resbuf); [CommandMethod("DXFGet")] static public void DXFGet() { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; AcEd.PromptEntityOptions entityOpts = new AcEd.PromptEntityOptions("\nSelect entity: "); AcEd.PromptEntityResult rc = ed.GetEntity(entityOpts); if (rc.Status == AcEd.PromptStatus.OK) { long[] ent = new long[] { 0, 0 }; acdbGetAdsName(ent, rc.ObjectId); System.IntPtr rb = acdbEntGet(ent); AcDb.ResultBuffer dxflist = AcRx.DisposableWrapper.Create(typeof(AcDb.ResultBuffer), rb, true) as AcDb.ResultBuffer; if (dxflist != null) { foreach (TypedValue val in dxflist) { ed.WriteMessage("\n({0} . {1})", val.TypeCode, val.Value.ToString()); } } } } [CommandMethod("DXFDup")] static public void DXFDup() { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; AcEd.PromptEntityOptions entityOpts = new AcEd.PromptEntityOptions("\nSelect entity: "); AcEd.PromptEntityResult rc = ed.GetEntity(entityOpts); if (rc.Status == AcEd.PromptStatus.OK) { long[] ent = new long[] { 0, 0 }; acdbGetAdsName(ent, rc.ObjectId); System.IntPtr rb = acdbEntGet(ent); AcDb.ResultBuffer dxflist = AcRx.DisposableWrapper.Create(typeof(AcDb.ResultBuffer), rb, true) as AcDb.ResultBuffer; acdbEntMake(dxflist.UnmanagedObject); // Duplicate entity } } } }
ой спасибы!!!
хотя ты наверное заметил я всё в теме "python для афтокада" отираюсь - всё исчу замену лиспу.
и есть у меня подозрения чё все эти манипуляции на python-е не пркатят ибо у него кажись p-invoke нету...
> todesengel
Про питон ничего сказать не могу. Но P/Invoke - это возможность .NET, а не конкретного языка программирования.
нмда?.!
тогда есть шансы - если железный питон полностью .NET ориентированное приложение... поисчу...
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc