2010-11-08 21 views
2

J'ai un plugin AutoCAD 2008 écrit en VB.NET. Ce plugin utilise principalement l'interface COM pour accéder aux objets ACAD.Comment obtenir l'objet .NET à partir d'un objet COM donné dans AutoCAD

Je passe actuellement de l'interface COM à l'interface gérée et j'ai la question suivante: Comment puis-je obtenir l'objet ACAD géré correspondant à partir d'un objet COM ACAD donné.

Exemple: J'ai un objet AcadBlockReference et je ne souhaite pas avoir l'objet BlockReference qui pointe vers le même objet dans le dessin. Comment puis-je obtenir cet objet ou peut-être son ObjectID?

Répondre

2

J'utilise assez souvent la bibliothèque .NET pour saisir des références de bloc, cependant, je n'en ai jamais saisi une à l'aide d'un objet COM. La méthode suivante est celle que j'ai eu qui prendrait dans un nom et un emplacement de bloc, et renverrait la référence de bloc. Je l'ai modifié ici pour prendre un AcadBlockReference et j'utilise sa propriété Name pour le trouver dans le BlockTable. Je n'ai pas testé cela car je n'ai pas le temps de le faire, mais j'ai juste pensé que je le lancerais ici et j'espère que cela vous aidera à aller de l'avant.

Désolé que mon exemple soit en C#, mais il devrait être assez facile de réécrire dans VB.NET.

public BlockReference GetBlockReferenceFromCOM(AcadBlockReference comReference, Point3d location) 
    { 
     using (Database database = Application.DocumentManager.MdiActiveDocument.Database) 
     { 
      using (Transaction transaction = database.TransactionManager.StartTransaction()) 
      { 
       BlockTable blockTable = transaction.GetObject(database.BlockTableId, OpenMode.ForRead) as BlockTable; 
       BlockTableRecord acBlkTblRecNewDoc = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite); 

       BlockReference newBlockReference = new BlockReference(location, blockTable[comReference.Name]); 

       transaction.Commit(); 

       return newBlockReference; 
      } 
     } 
    } 

EDIT Avez-vous l'ID d'objet pour ces articles? Si oui, vous pourriez faire quelque chose comme ceci:

public DBObject GetBlockReferenceFromCOM(ObjectId id) 
    { 
     using (Database database = Application.DocumentManager.MdiActiveDocument.Database) 
     { 
      using (Transaction transaction = database.TransactionManager.StartTransaction()) 
      { 
       return transaction.GetObject(id, OpenMode.ForRead); 
      } 
     } 
    } 
+0

Nous vous remercions de votre réponse. Bien que je ne l'ai pas encore testé, il manque une chose importante: je ne veux pas faire cela pour tous les objets. Non seulement pour BlockReferences. Et d'autres objets comme des lignes, 3Dpolys etc. n'ont pas la propriété "Name". – WizzardsApprentice

+0

La réponse a été modifiée. – JSprang

+0

Merci. C'était exactement ce que je cherchais! – WizzardsApprentice

1

Vous pourriez vouloir enquêter sur les Handle ou ObjectID propriétés de l'objet COM et voir si vous pouvez les faire correspondre avec le ObjectId de l'objet .NET ou Handle propriété de ce ObjectId.