Bonjour Christian
Il est vrai que la valeur décimale de "ObjId" n'est pas définie dans le code DXF d'un objet.
On ne récupère seulement que le code "Entité" de l'objet, exprimé en hexadécimal.
Ce code là est de type "Ename" et il n'y a pas de fonctions AutoLisp basiques qui permettent une conversion de cette valeur en valeur entière ou en chaine de caractères.
Comme le disent @Luna3 et @_gile on peut récupérer ce code entité en Visual Lisp pour obtenir son "ObjId" en décimal.
Aussi, quelquefois il faut savoir penser différemment, comme par exemple "Comment construire 4 triangles équilatéraux avec 6 alumettes".
Bon revenons à notre AutoLisp basique (non Visual Lisp).
Donc si on souhaite convertir le code entité d'un objet "Entity Name", de type "Ename", en valeur décimale on peut simplement l'écrire dans un fichier texte. En relisant ce fichier texte on récupére ce code en tant que chaine de caractères.
A partir de là on peut supprimer, par la fontion "Substr", les caractères qui ne correspondent pas au code hexadécimal.
Ensuite, via un algorithme écrit par Lee Mac en 2011, on convertit cette valeur hexa en décimale pour obtenir enfin le fameux code "ObjId".
Il faut savoir qu'à chaque ouverture du même dessin, le code entité du même objet, change. Le code "Id" du champ se mettra à jour automatiquement. Ouf !
Voici un petit AutoLisp qui permet de récupérer ce code "Id".
Sauf à me tromper, je pense donc que maintenant ce code "ObjId" devrait être MACROTABLE pour toi !!!
(defun c:DV_ObjIdHexaVersDecimal ( / Obj_Ent Fichier Obj_Ent Ent_Hexa ValHexa ValDecimale)
(setq Obj_Ent (car (entsel)))
;; Mémorisation dans un fichier txt du code entité en tant que type "Ename"
;;; Chemin à redéfinir selon le poste
(setq Fichier (open "C:\\temp\\temp.txt" "w"))
(princ Obj_Ent Fichier)
(close Fichier)
;; Récupération du code entité en tant que chaine de caractères
;;; Chemin à redéfinir selon le poste
(setq Fichier (open "C:\\temp\\temp.txt" "r"))
(setq Ent_Hexa (read-line Fichier))
(close Fichier)
;; Suppression des caractères "<Nom d'entité: " au début et ">" à la fin du code entité
;; afin de ne conserver que les valeurs Hexadécimales
(setq ValHexa (substr Ent_Hexa 16))
(setq ValHexa (substr ValHexa 1 (- (strlen ValHexa) 1)))
;; Conversion de la valeur Hexa en Décimal
(setq ValDecimale (hex2dec ValHexa))
(print ValDecimale)
(princ)
)
;;; Code de Lee Mac 2011 ===========================================================================
(defun hex2dec ( str / l1 l2 mat pas vec x x1 )
(setq vec (mapcar '(lambda ( x ) (- x (if (< x 58) 48 55))) (vl-string->list (strcase str)))
pas (_pascalmatrix (length vec) '((1.0)))
mat pas
)
(repeat 5 (setq mat (mxm mat pas)))
(setq l1 (reverse (vxm vec mat))
x1 (car l1)
)
(while (< 0 x1)
(setq l2 (cons (chr (+ (fix (rem x1 10)) 48)) l2)
l1 (cdr l1)
x1 (+ (/ (fix x1) 10) (cond ((car l1)) (0)))
)
)
(apply 'strcat l2)
)
(defun _pascalmatrix ( n l )
(if (< n 2)
l
(_pascalmatrix (1- n)
(cons
(mapcar '+ (cons 0.0 (car l)) (append (car l) '(0.0)))
(mapcar (function (lambda ( x ) (cons 0.0 x))) l)
)
)
)
)
;; Matrix Transpose - Doug Wilson
;; Args: m - nxn matrix
(defun trp ( m )
(apply 'mapcar (cons 'list m))
)
;; Matrix x Matrix - Vladimir Nesterovsky
;; Args: m,n - nxn matrices
(defun mxm ( m n )
( (lambda ( a ) (mapcar '(lambda ( r ) (mxv a r)) m)) (trp n))
)
;; Matrix x Vector - Vladimir Nesterovsky
;; Args: m - nxn matrix, v - vector in R^n
(defun mxv ( m v )
(mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
)
(defun vxm ( v m )
(mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) (trp m))
)
Cordialement
Dominique VAQUAND
www.dovaq.fr
Si mon message propose une solution, veuillez cliquer sur "Accepter comme solution"
If my post offers a solution, please click "Accept as Solution"n o
Cordialement
Dominique VAQUAND
www.dovaq.fr
Cette publication vous a-t-elle été utile ? N’hésitez pas à attribuer la mention J’aime à cette publication.
Avez-vous obtenu la réponse à votre question ? Cliquez ensuite sur le bouton ACCEPTER LA SOLUTION.
