Aller au contenu

Problème avec Xdata ..


Messages recommandés

Posté(e)

Bonjour,

 

Je recherche un exemple d'utilisation des fonctions SetXData et GetXData pour VB.NET

 

Comme indiqué dans la doc, j'écris :

 

lineobj.SetXData(Datatype, Data)

 

avec Datatype un tableau d'entiers

et Data un tableau d'objets

 

à l'execution de ce code, on me sort un message disant qu'il y a un "Argument de type incorrect dans la méthode" !!

 

Avez vous des idées sur la provenance de cette erreur ?

Posté(e)

Salut,

 

Je recherche un exemple d'utilisation des fonctions SetXData et GetXData pour VB.NET

 

Tu veux dire VBA ?

À ma connaissance, il n'y a pas de méthode SetXdata ou GetXdata en .NET.

Avec .NET il existe une propriété Xdata dans la classe DBObject accessible en lecture et écriture qui fonctionne avec un ResultBuffer.

 

En VBA (avec COM/ActiveX en fait), lineobj.SetXdata(Datatype, Data) fonctionne si chaque entier dans le tableau Datatype correspond bien au type de l'objet dans Data.

Le premier élément de Datatype doit être 1001 et le premier de Data le nom de l'application enregistrée (string). pour les autres éléments, regarde dans l'aide aux développeurs pour trouver les codes correspondants aux types de données.

Les principaux :

1000 -> Chaîne de caractère

1001 -> Nom de l'application (doit être en premier dans le tableau)

1002 -> Caractère de contrôle "{" ou "}" (convention)

1003 -> Nom de calque (convention)

1005 -> Maintien (handle) (convention)

1010 -> Point 3d (variant contenant un array de 3 doubles)

1040 -> Nombre réel (double)

1070 -> Nombre entier

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

Non, je suis bien en VB.net, et j'ai bien les fonctions SendXData et GetXData.

 

 

le tableau de données commence bien par le nom de mon application, mais j'ai toujours cette même erreur !!!!

 

 

Ou alors, j'utilise un activeX VBA en travaillant sous VB.net ??

 

Quel est l'ActiveX dédié au VB.net ??

 

 

 

 

Posté(e)

OK,

 

Le langage avec lequel tu écris est VB.net mais tu utilises l'interface COM/ActiveX (comme en VBA ou Visual LISP).

 

Avec .NET on peut utiliser cette interface et/ou l'interface .NET (le Framework.net de Windows et les APIs AutoCAD .NET qui est constitué de classes ObjectARX "managées").

L'environnement .NET est plus étendu et plus puissant que COM -qui continue à être indispensable pour certaines choses comme, par exemple, la programmation de Windows Office (!).

Tu trouveras de plus amples explications (en anglais) dans AutoCAD .NET Developer's Guide

 

Concernant ton erreur, difficile d'en dire plus sans voir un peu de ton code. De plus, je ne pratique pas VBA...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

ok, voici mon code :

 

' Create the line

Dim lineObj As AcadLine

Dim startPt(0 To 2) As Double, endPt(0 To 2) As Double

startPt(0) = 1.0# : startPt(1) = 1.0# : startPt(2) = 0.0#

endPt(0) = 5.0# : endPt(1) = 5.0# : endPt(2) = 0.0#

lineObj = vAcadDoc.ModelSpace.AddLine(startPt, endPt)

 

' Initialize all the xdata values. Note that first data in the list should be

' application name and first datatype code should be 1001

Dim DataType(0 To 7) As Integer

Dim Data(0 To 7) As Object

 

DataType(0) = 1001 : Data(0) = "application_name"

DataType(1) = 1000 : Data(1) = "This is a test for xdata"

DataType(2) = 1003 : Data(2) = "0" ' layer

DataType(3) = 1040 : Data(3) = 1.23479137438413E+40 ' real

DataType(4) = 1041 : Data(4) = 1237324938 ' distance

DataType(5) = 1070 : Data(5) = 32767 ' 16 bit Integer

DataType(6) = 1071 : Data(6) = 32767 ' 32 bit Integer

DataType(7) = 1042 : Data(7) = 10 ' scaleFactor

 

 

' Attach the xdata to the line

lineObj.SetXData(DataType, Data)

Posté(e)

Comme je disais je ne connais pas bien VB(A) mais je pense que le tableau de données doit être un tableau de variants et pas un tableau d'objets.

 

Remplace :

Dim Data(0 To 7) As Object

par :

Dim Data(0 To 7) As Variant

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Un exemple en "pur .NET"

acdbmgd.dll et acmgd.dll doivent être référencées

 

C#

using System;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;

using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace XdatSample
{
   public class Class1
   {
       [CommandMethod("TEST")]
       public void Test()
       {
           Document doc = acadApp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           try
           {
               using (Transaction tr = db.TransactionManager.StartTransaction())
               {
                   Point3d startPt = new Point3d(1.0, 1.0, 0.0);
                   Point3d endPt = new Point3d(5.0, 5.0, 0.0);
                   Line line = new Line(startPt, endPt);
                   BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                   BlockTableRecord btr = tr.GetObject(bt[blockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                   btr.AppendEntity(line);
                   tr.AddNewlyCreatedDBObject(line, true);
                   RegAppTable rat = tr.GetObject(db.RegAppTableId, OpenMode.ForRead) as RegAppTable;
                   if (!rat.Has("application_name"))
                   {
                       RegAppTableRecord ratr = new RegAppTableRecord();
                       ratr.Name = "application_name";
                       rat.UpgradeOpen();
                       rat.Add(ratr);
                       tr.AddNewlyCreatedDBObject(ratr, true);
                   }
                   ResultBuffer xdatas = new ResultBuffer();
                   xdatas.Add(new TypedValue(1001, "application_name"));
                   xdatas.Add(new TypedValue(1000, "This is a test for xdata"));
                   xdatas.Add(new TypedValue(1003, "0"));
                   xdatas.Add(new TypedValue(1040, 1.23479137438413E+40));
                   xdatas.Add(new TypedValue(1041, 1237324938.0));
                   xdatas.Add(new TypedValue(1070, 32767));
                   xdatas.Add(new TypedValue(1071, 32767));
                   xdatas.Add(new TypedValue(1042, 10.0));
                   line.XData = xdatas;
                   tr.Commit();
               }
           }
           catch (System.Exception ex)
           {
               ed.WriteMessage("Erreur: " + ex.Message);
           }
       }
   }
}

 

VB (traduction automatique)

Imports System
Imports System.Linq
Imports System.Text
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry

Imports acadApp = Autodesk.AutoCAD.ApplicationServices.Application

Namespace XdatSample
   Public Class Class1
        _
       Public Sub Test()
           Dim doc As Document = acadApp.DocumentManager.MdiActiveDocument
           Dim db As Database = doc.Database
           Dim ed As Editor = doc.Editor
           Try
               Using tr As Transaction = db.TransactionManager.StartTransaction()
                   Dim startPt As New Point3d(1R, 1R, 0R)
                   Dim endPt As New Point3d(5R, 5R, 0R)
                   Dim line As New Line(startPt, endPt)
                   Dim bt As BlockTable = TryCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                   Dim btr As BlockTableRecord = TryCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                   btr.AppendEntity(line)
                   tr.AddNewlyCreatedDBObject(line, True)
                   Dim rat As RegAppTable = TryCast(tr.GetObject(db.RegAppTableId, OpenMode.ForRead), RegAppTable)
                   If Not rat.Has("application_name") Then
                       Dim ratr As New RegAppTableRecord()
                       ratr.Name = "application_name"
                       rat.UpgradeOpen()
                       rat.Add(ratr)
                       tr.AddNewlyCreatedDBObject(ratr, True)
                   End If
                   Dim xdatas As New ResultBuffer()
                   xdatas.Add(New TypedValue(1001, "application_name"))
                   xdatas.Add(New TypedValue(1000, "This is a test for xdata"))
                   xdatas.Add(New TypedValue(1003, "0"))
                   xdatas.Add(New TypedValue(1040, 1.23479137438413E+40))
                   xdatas.Add(New TypedValue(1041, 1237324938R))
                   xdatas.Add(New TypedValue(1070, 32767))
                   xdatas.Add(New TypedValue(1071, 32767))
                   xdatas.Add(New TypedValue(1042, 10R))
                   line.XData = xdatas
                   tr.Commit()
               End Using
           Catch ex As System.Exception
               ed.WriteMessage("Erreur: " & ex.Message)
           End Try
       End Sub
   End Class
End Namespace

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité