Ashou Posté(e) le 21 décembre 2009 Posté(e) le 21 décembre 2009 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'entierset 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 ?
(gile) Posté(e) le 21 décembre 2009 Posté(e) le 21 décembre 2009 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ère1001 -> 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
Ashou Posté(e) le 22 décembre 2009 Auteur Posté(e) le 22 décembre 2009 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 ??
(gile) Posté(e) le 22 décembre 2009 Posté(e) le 22 décembre 2009 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
Ashou Posté(e) le 22 décembre 2009 Auteur Posté(e) le 22 décembre 2009 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)
Ashou Posté(e) le 22 décembre 2009 Auteur Posté(e) le 22 décembre 2009 Et ça plante à la derniere ligne
(gile) Posté(e) le 22 décembre 2009 Posté(e) le 22 décembre 2009 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 Objectpar : Dim Data(0 To 7) As Variant Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 22 décembre 2009 Posté(e) le 22 décembre 2009 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant