Тема: можно ли получить в vbnet список DXF кодов для entity

Вопрос в теме
Есть ли в .NET аналоги entget лиспа и acdbEntGet ObjectARX

Re: можно ли получить в vbnet список DXF кодов для entity

> serzh
Как обычно: P/Invoke для acdbEntGet.
Или Autodesk.AutoCAD.DatabaseServices.DBObject.DxfOut()

Re: можно ли получить в vbnet список DXF кодов для entity

> Александр Ривилис
Что бы я без Вас делал.
Очень хорошо. Но так как мой опыт в vb равен нескольким дням чистого времени, очень большая просьба рассказать поподробне.
Допустим имеем переменную en с типом Entity, как из нее вытащить коды.
Как сделать P/invoke для acdbEntget я не знаю(((

Re: можно ли получить в vbnet список DXF кодов для entity

> serzh
На VB я ничего хорошего не напишу - не моё. Если устроит C#, то через пару дней выложу.

Re: можно ли получить в vbnet список DXF кодов для entity

С использованием P/Invoke:

//-------------------------------------------------
// В AutoCAD 2005...2006 работать не будет из-за
// ограничений на содержимое ResultBuffer!
//-------------------------------------------------
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.EntGet))]
namespace Rivilis
{
  public class EntGet
  {
    [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);
    [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());
          }
        }
      }
    }
  }
}

Если есть en с типом Entity, то вместо ObjectId можно использовать en.ObjectId
Так этот код выглядит на VB.NET (использовал перекодировщик C# -> VB из SharpDevelop)

'
' В AutoCAD 2005...2006 работать не будет из-за
' ограничений на ResultBuffer!
'
Imports System
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports AcRx = Autodesk.AutoCAD.Runtime
Imports AcEd = Autodesk.AutoCAD.EditorInput
Imports AcDb = Autodesk.AutoCAD.DatabaseServices
Imports AcAp = Autodesk.AutoCAD.ApplicationServices
<Assembly: CommandClass(GetType(Rivilis.EntGet))>
Namespace Rivilis
  Public Class EntGet
    <System.Security.SuppressUnmanagedCodeSecurity()> _
    <DllImport("acdb17.dll", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")> _
    Private Shared Function acdbGetAdsName(ByVal name As Long(), ByVal objId As ObjectId) As Integer
    End Function
    <DllImport("acad.exe", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="acdbEntGet")> _
    Private Shared Function acdbEntGet(ByVal name As Long()) As System.IntPtr
    End Function
    <CommandMethod("DXFGet")> _
    Public Shared Sub DXFGet()
      Dim ed As AcEd.Editor = AcAp.Application.DocumentManager.MdiActiveDocument.Editor
      Dim entityOpts As New AcEd.PromptEntityOptions("" & Chr(10) & "Select entity: ")
      Dim rc As AcEd.PromptEntityResult = ed.GetEntity(entityOpts)
      If rc.Status = AcEd.PromptStatus.OK Then
        Dim ent As Long() = New Long() {0, 0}
        acdbGetAdsName(ent, rc.ObjectId)
        Dim rb As System.IntPtr = acdbEntGet(ent)
        Dim dxflist As AcDb.ResultBuffer = TryCast(AcRx.DisposableWrapper.Create(GetType(AcDb.ResultBuffer), rb, True), AcDb.ResultBuffer)
        If dxflist IsNot Nothing Then
          For Each val As TypedValue In dxflist
            ed.WriteMessage("" & Chr(10) & "({0} . {1})", val.TypeCode, val.Value.ToString())
          Next
        End If
      End If
    End Sub
  End Class
End Namespace

Как ни странно - но и этот код работает. :)

Re: можно ли получить в vbnet список DXF кодов для entity

> Александр Ривилис
Спасибо.

Как ни странно — но и этот код работает. :)

SharpDevelop рулит!!!!