Тема: как получить элемент?

в лиспе есть замечательная весч (entget) - даёт лист с записью объекта, в .NET API говорят есть подобное...
как оно выглядит???

Re: как получить элемент?

https://www.caduser.ru/forum/topic35374.html

Re: как получить элемент?

там какимито извращенскими методами это всё делаеца... я с таким же успехом могу (entget) с коммандлайн выполнить...
как я понял они там загружают DLLку с функцией acdbentget - а может тогда её можно и в VBA загрузить и вызвать???

Re: как получить элемент?

> todesengel
1) Они - это я.
2) Никакая dll-ка не загружается. Она всегда загружена если запущен AutoCAD.
3) Из VBA (IMHO) не вызовешь - она не STDCALL. В .NET использование P/Invoke в порядке вещей.
4) Запускать через командную строку то, что можно сделать иначе - это и есть извращение.

Re: как получить элемент?

через VBA я уже повертел повсякому - действительно - запустить можно - параметры передать не выходит...
но всё таки в ObjectARX помоему можно всё это делать проще... хотя заявляют, что .NET API тотже ObjectARX...
ладно, видимо пути проще и короче нету...
а функции entmake и entmod можешь так же описать???

Re: как получить элемент?

> todesengel
Можно. Потренируйся.

Re: как получить элемент?

todesengel пишет:

но всё таки в ObjectARX помоему можно всё это делать проще...

В ObjectARX это действительно намного проще.

хотя заявляют, что .NET API тотже ObjectARX...

Об этом я уже писал. .NET API - это обертки для функций ObjectARX. Для каких-то функций/классов/методов они сделаны. Для каких-то нет. Вот и приходится пользоваться P/Invoke или писать свои обертки для тех, которые не сделаны или сделаны с ошибками.

Re: как получить элемент?

где я могу прочитать чё такое пи-инвоук и как я узнаю где лежат те функции АРХ которые мне нужны??? есть инструменты для этого???

Re: как получить элемент?

> todesengel
Про P/Invoke почитай в толстых книжках по C# или поиском в google. Инструменты для получения сигнатур функций из exe/dll/arx/dbx-файлов - это dumpbin.exe и undname.exe (из состава MS VS).

Re: как получить элемент?

да - фсё грусно и нудно...
жаль чё аффтары аффтакада не сделали обёртки для самых важных функций...

Re: как получить элемент?

Вот тебе еще подарок:

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
      }
    }
  }
}

Re: как получить элемент?

ой спасибы!!!
хотя ты наверное заметил я всё в теме "python для афтокада" отираюсь - всё исчу замену лиспу.
и есть у меня подозрения чё все эти манипуляции на python-е не пркатят ибо у него кажись p-invoke нету...

Re: как получить элемент?

> todesengel
Про питон ничего сказать не могу. Но P/Invoke - это возможность .NET, а не конкретного языка программирования.

Re: как получить элемент?

нмда?.!
тогда есть шансы - если железный питон полностью .NET ориентированное приложение... поисчу...