Aller au contenu

Handle et XDATA


Messages recommandés

Bonjour,

 

Je cherche à sauvegarder dans un XDATA d'une entité le HANDLE d'une autre entité.

Ceci est il réalisable ?

 

En lisp cela est réalisable, je suppose que cela l’est également en .net, pour étayer mon affirmation et surtout faute de pouvoir écrire en .net, voici un petit exemple Lisp. En attendant mieux d’un autre cadxpien(ne)…

 

;; La fonction demande de sélectionner 2 objets et
;; enregistre le handle de chaque objet comme donnée étendu
;; de l'autre objet

(defun c:SVG-HANDLE (/ e1 e2)
 (if (and (setq e1 (car (entsel "\nChoix du 1er objet:")))
          (setq e2 (car (entsel "\nChoix du 2ème objet:")))
     )
   (progn (princ (strcat "\Leurs Handle sont respectivement "
                         (cdr (assoc 5 (setq e1 (entget e1))))
                         " & "
                         (cdr (assoc 5 (setq e2 (entget e2))))
                         " !!!"
                 )
          )
          (regapp "svghandle")
          (entmod
            (cons (list -3 (list "svghandle" '(1002 . "{") (cons 1005 (cdr (assoc 5 e1))) '(1002 . "}"))) e2)
          )
          (entmod
            (cons (list -3 (list "svghandle" '(1002 . "{") (cons 1005 (cdr (assoc 5 e2))) '(1002 . "}"))) e1)
          )
   )
 )
(princ)
)

 

Pour vérifier

;; Pour récupére la valeur de l'handle contenu dans les données étendues 
(defun c:getXhandle ()
 (cdr (assoc 1005 (cdr (assoc "svghandle" (cdr (assoc -3 (entget (car (entsel)) '("*"))))))))
)

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Bien sûr que c'est réalisable.

Il suffit de créer une instance de TypedValue avec le code DXF 1005 et le Handle se l'entité source et de l'ajouter au ResultBuffer qui contient les xdata :

new TypedValue((int)DxfCode.ExtendedDataHandle, handle)

ou, plus simple, mais peut être moins explicite quand on pas l'habitude des codes DXF :

new TypedValue((1005, handle)

 

un petit exemple:

        [CommandMethod("HandleToXData")]
       public void HandleToXdata()
       {
           Document doc = Application.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           PromptEntityResult per = ed.GetEntity("\nEntité source: ");
           if (per.Status != PromptStatus.OK) return;
           ObjectId sourceId = per.ObjectId;
           per = ed.GetEntity("\nEntité cible: ");
           if (per.Status != PromptStatus.OK) return;
           ObjectId targetId = per.ObjectId;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               RegAppTable rat = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
               if (!rat.Has("HandleApp"))
               {
                   rat.UpgradeOpen();
                   using (RegAppTableRecord rtr = new RegAppTableRecord())
                   {
                       rtr.Name = "HandleApp";
                       rat.Add(rtr);
                       tr.AddNewlyCreatedDBObject(rtr, true);
                   }
               }
               ResultBuffer xdata = new ResultBuffer(
                   new TypedValue(1001, "HandleApp"),
                   new TypedValue(1005, sourceId.Handle));
               Entity ent = (Entity)tr.GetObject(targetId, OpenMode.ForWrite);
               ent.XData = xdata;
               tr.Commit();
           }
       }

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

Lien vers le commentaire
Partager sur d’autres sites

Si tu mémorise le maintien d'une entité qui se trouve dans un autre dessin, tu ne dois pas utiliser 1005 car la commande AUDIT (CONTROLE) vérifie la validité des maintiens qui apparaissent dans les données étendues. Dans ce cas, tu dois stocker le maintien en tant que chaîne avec un code 1000.

 

Par contre, avec un code 1005, les maintiens sont traduits lorsqu'on insère un bloc ou qu'on le décompose (quand on insère un bloc, ce dernier vient avec des maintiens qui sont peut être déjà utilisés dans le dessin courant, donc AutoCAD doit affecter des nouveaux maintiens aux entités. Même chose quand on décompose, car AutoCAD crée des nouvelles entités).

 

Il faut lire la section "Using Handles in Extended Data" du guide du développeur ObjectARX.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

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é