previous arrowprevious arrow
next arrownext arrow
PlayPause
previous arrownext arrow
Shadow

Wir realisieren Ihre CAD-Projekte

im AutoCAD, Inventor, Revit und Autodesk Forge Platform

Umfeld
Wir helfen Ihnen bei der Realisierung Ihrer Projekte.

Blog - CAD-Becker.de

Beiträge zu AutoCAD und dessen Vertikalprodukte.
Tipps und Tricks, viele Neuigkeiten aus der Autodesk Welt.
3 Minuten Lesezeit (554 Worte)

Visual Lisp To C# - (Vlax-ldata-get) in .Net C# übersetzt

Anzeige

Aktuelle Top-Angebote der Telekom, Online-Vorteile, Attraktive Prämien

​Eine der Aufgaben bei der Übersetzung von Visual Lisp nach C# ist wohl die Datenschnittstelle, um die zuvor mit mit Visual Lisp erstellten Daten in einer vorhandenen Zeichnung zu lesen und zurückzuschreiben.

In diesem Posting möchte ich erläutern wie die DIctionary-Daten gelesen werden können, die mit den vlax-ldata Anweisung geschrieben, gelesen und aufgelistet wurden.

Die Schwierigkeit hierbei liegt darin, dass die Daten in einem Objekt abgelegt wurden, die wir mit .Net Möglichkeiten nicht bearbeiten können.

Das abgelegte Objekt ist vom Typ "Autodesk.AutoCAD.DatabaseServices.ImpDBObject" dieser im Namespace DatabaseServices definierte Klasse ist internal und sealed deklariert. Somit besteht für den Entwickler keine Möglichkeit diese Klasse zu instanzieren. 

Es gibt allerdings die Möglichkeit über ein COM-Objekt diese Daten zu lesen. Im Folgenden ist zeige ich ein Beispiel wie das zu realisieren ist.

 Zunächst werden zwei DLL-Importe erstellt:

  1. acdbGetAdsName64: Ermittelt den Entitynamen des Objekts anhand der Objekt-ID.
  2. acdbEntGetX: Gibt eine IntPr Struktur zurück die den Pointer oder das Handle des Objekts repräsentiert.

Die statische Methode Create des Datentyps ResultBuffer  erstellt aus dem Pointer (IntPr-Struktur des Objekts) einen ResultBuffer, der unsere Daten enthält.

DLL-Import 

[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr acdbEntGetX(
    AdsName objName, 
    IntPtr app);

[DllImport("acdb22.dll", 
    CallingConvention = CallingConvention.Cdecl, 
    EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AEAY01_JVAcDbObjectId@@@Z")]
    static extern ErrorStatus acdbGetAdsName64(
        out AdsName objName, 
        id); 

Ermitteln des Objekts 

ResultBuffer m_Resultbuffer = 
        new ResultBuffer();
AdsName m_EName = new AdsName();
acdbGetAdsName64(
    out m_EName, 
    m_ImpDBObjectAsDBObject.ObjectId);
    
IntPtr m_IntPrResult = 
    acdbEntGetX(
        m_EName, 
        m_Resultbuffer.UnmanagedObject); 
Ergebnis von (vlax-ldata-get) als Resultpuffer.

Das Ergebnis des Resultbuffers in der Variable m_ResultBuffer kann nun ausgewertet werden, z.B. mit der Methode AsArray() des ResultBuffer. Unter dem DYFCode 300 finden wir nun unseren zuvor in das Dictionary geschriebenen Wert "Gumbo Jumbo"-

Vollständiger Code 

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using System;

namespace CADBecker.AutoCAD.Helpers
{
    public static class Commands
    {
        [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl)]
        static extern IntPtr acdbEntGet(AdsName objName);
        [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl)]
        static extern IntPtr acdbEntGetX(AdsName objName, IntPtr app);

        [DllImport("acdb22.dll", 
            CallingConvention = CallingConvention.Cdecl, 
            EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AEAY01_JVAcDbObjectId@@@Z")]
        static extern ErrorStatus acdbGetAdsName64(out AdsName objName, ObjectId id);
        
        [Autodesk.AutoCAD.Runtime.CommandMethod("CB_GetDict")]
        public static void CB_GetDict()
        {
            Document m_Document = Application.DocumentManager.MdiActiveDocument;
            using (Transaction m_Transaction = 
                            m_Document.Database.TransactionManager.StartTransaction())
            {
                DBDictionary m_DBDictionary = 
                    (DBDictionary)m_Transaction.GetObject(
                        m_Document.Database.NamedObjectsDictionaryId, 
                        OpenMode.ForRead);
                if (m_DBDictionary != null)
                {
                    ObjectId m_DictObjectId = m_DBDictionary.GetAt("dict");
                    DBDictionary m_Dictionary = (DBDictionary)m_Transaction.GetObject
                                                    (m_DictObjectId, 
                                                    OpenMode.ForRead);
                    ObjectId hObjectID = m_Dictionary.GetAt("cay");
                    DBObject m_ImpDBObjectAsDBObject = (DBObject)m_Transaction.GetObject(
                                                            hObjectID, 
                                                            OpenMode.ForRead);
                    
                    ResultBuffer m_Resultbuffer = new ResultBuffer();
                    AdsName m_EName = new AdsName();
                    acdbGetAdsName64(out m_EName, m_ImpDBObjectAsDBObject.ObjectId);
                    IntPtr m_IntPrResult = acdbEntGetX(m_EName, m_Resultbuffer.UnmanagedObject);

                    if (m_IntPrResult != IntPtr.Zero) 
                    {
                        m_ResultBuffer = ResultBuffer.Create(m_IntPrResult, true);
                    }

                }
                m_Transaction.Commit();
            }
        }
    }
} 
 

Zusätzliche Information

  • Benötigen Sie Hilfe, dann helfe ich gerne. Sagen Sie einfach Bescheid. Meine Kontakte finden Sie über den Menüpunkt "Über uns".

Copyright

© Copyright 2019 by CAD-Becker.de

Visual Lisp To C# - (Vlax-ldata-list) in .Net C# ü...
Visual Lisp To C# - Lisp ruft C# Befehle auf -

Ähnliche Beiträge

 

Über mich

  Dipl.-Ing.
Jürgen A. Becker
Versorgungstechnik

 

 

Suchen

Abonniere Blog

Kalender

Warte kurz, während wir den Kalender laden

Kontakt

Jürgen A. Becker

CAD-Becker.de
Detmolder Str. 786
33699 Bielefeld
Germany
Telefon
+49 (5202) 9953808 
Mobil
+49 170 870 8679
E-Mail
Juergen.Becker(at)CAD-Becker.de

Menu-de