2010-10-06 18 views
0

J'ai une application C# qui s'interface avec AutoCad. Son travail consiste à déchiffrer toutes les entités d'un modèle et à trouver celles qui s'appliquent à ce que nous faisons en recherchant la présence de balises XData spécifiques.Problème de disparition d'AutoCad XData

Le problème est alors que les rédacteurs déplacer un bloc à une couche qui est marqué comme « invisible » (c.-à-tour couche off) puis le xdata est pas détectable par l'intermédiaire de la boucle habituelle:

foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace) 
{ 
    ... get xData from the entity. 
} 

I « ai essayé tourner la couche à nouveau en utilisant le code suivant:

ACAD.ActiveDocument.Layers.Item("HIDDENLAYER").LayerOn = true; 
ACAD.Update(); 
foreach... 

... mais le xDonnée ne semble pas revenir avec elle. C'est comme si le déplacer vers un calque invisible effaçait la XData de l'objet. Ce serait mauvais.

Existe-t-il un moyen "correct" d'obtenir le XData à partir d'éléments sur des calques invisibles?

Merci.

+0

S'agit-il d'un assemblage .NET pour AutoCAD ou d'une application utilisant l'interface d'automatisation ActiveX/COM? – Knyphe

+0

Il s'agit d'une application utilisant l'interface COM. – Jerry

Répondre

0

Pour l'instant, la réponse est devenue "Ne déplacez pas cet élément vers un calque caché". Au lieu de cela, je marque la couche comme étant masquée par défaut avant de placer la XData, et cela semble fonctionner correctement. Je ne suis pas sûr de savoir comment le XData disparaît, mais pour l'instant, cela fonctionne pour moi.

Je suis toujours curieux si quelqu'un a des suggestions sur la façon dont le XData disparaît.

0

Xdata est volatile. Si vous ATTSYNC un bloc, il disparaît. Cela peut ne pas être lié à votre problème spécifique, mais c'est une bonne raison de ne pas compter sur Xdata.

+1

ATTSYNC échange les blocs existants pour des blocs complètement différents. La [documentation en ligne] (http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS1a9193826455f5ffa23ce210c4a30acaf-512c.htm,topicNumber=d0e199454) appelle même spécifiquement la perte de données avec un grand avertissement rouge. Je ne suis pas sûr que je dirais que cela rend xdata "volatile" ... –

+0

Je pense que cela le rend volatile parce qu'un utilisateur peut involontairement supprimer le Xdata et ne pas recevoir d'avertissement. La raison pour laquelle les données ont disparu n'est pas facile à retracer non plus. J'utilise "volatile" comme antonyme pour "robuste" ici. –

+0

Je suppose que je suis plus curieux de savoir ce que vous considérez comme une méthode robuste de stockage de données sur des entités dans un dessin AutoCAD. Les données du dictionnaire d'extension seraient-elles qualifiées? Y a-t-il autre chose à laquelle je ne pense pas? –

1

Je ne peux pas reproduire cela dans AutoCAD (Map) 2012. Quelle version d'AutoCAD utilisez-vous?

Que faites-vous réellement à l'intérieur ... get xData from the entity.? Je l'ai fait:

static AcadApplication ACAD 
    { 
     get 
     { 
      return 
       Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as AcadApplication; 
     } 
    } 

    [CommandMethod("tlo")] 
    public static void TestLayerOff() 
    { 
     foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace) 
     { 
      //... get xData from the entity. 
      object xdata, xdataType; 
      ent.GetXData("MyRegisteredAppName", out xdataType, out xdata); 
      //... read and spit out the xdata to the command line to see what we got 
     } 
    } 

Cela a fonctionné après que j'ai éteint la couche mes entités xdata'ed étaient sur. Il a également fonctionné après que je les ai déplacés à une couche différente qui était éteinte. Y a-t-il un pas à reproduire pour que je manque? Que font exactement les «rédacteurs» lorsqu'ils «bougent un pâté de maisons»? De plus, si vous craignez que les données x soient effacées, utilisez la commande XDLIST pour les afficher directement dans AutoCAD. Enfin, je vais lancer une recommandation générale pour échapper à la substance COM et utiliser l'API C# native, qui fera tout ce que vous essayez de faire ici.