Тема: можно ли получить в vbnet список DXF кодов для entity
Вопрос в теме
Есть ли в .NET аналоги entget лиспа и acdbEntGet ObjectARX
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Вопрос в теме
Есть ли в .NET аналоги entget лиспа и acdbEntGet ObjectARX
> serzh
Как обычно: P/Invoke для acdbEntGet.
Или Autodesk.AutoCAD.DatabaseServices.DBObject.DxfOut()
> Александр Ривилис
Что бы я без Вас делал.
Очень хорошо. Но так как мой опыт в vb равен нескольким дням чистого времени, очень большая просьба рассказать поподробне.
Допустим имеем переменную en с типом Entity, как из нее вытащить коды.
Как сделать P/invoke для acdbEntget я не знаю(((
> serzh
На VB я ничего хорошего не напишу - не моё. Если устроит C#, то через пару дней выложу.
С использованием 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
Как ни странно - но и этот код работает. :)
> Александр Ривилис
Спасибо.
Как ни странно — но и этот код работает. :)
SharpDevelop рулит!!!!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc