Aller au contenu

[Résolu]Extraction de données


nicolas2

Messages recommandés

Bonjour.

Je dessine un plan avec une multitude de cercle de même diamètre.

Je trace ces cercles dans un ordre précis (mais différent à chaque affaire).

Avec l'extraction de données, j'arrive à récupérer les coordonnés XY de chaque cercle, mais je n'arrive pas à récupérer l'ordre de tracé, indispensable pour pouvoir faire tourner une machine CND dans un ordre précis.

Est-il possible de récupérer cet ordre de tracé dans la liste d'extraction.

Merci à vous.

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je doute qu'il soit possible de retrouver l'ordre de tracé, quoique avec AutoCAD plus rien ne m'étonne. A mon avis il faudrait passer par un bloc avec attribut, l’attribut renseigné automatiquement, par exemple en fonction du nombre de bloc du même nom déjà insérés.

 

Dans l'extraction de données il ne reste plus qu'a classer tout les blocs en fonction de la valeur de cette attribut.

 

Quant à l'automatisation du renseignement de la valeur de l'attribut, c'est au delà de mes compétences.

 

Cordialy.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous.

 

Pourquoi ne pas tracer ces cercles via un petit lisp qui écrira, à chaque cercle, dans un fichier CSV (par exemple) les coordonnées, ce qui gardera l'ordre ce création des entités, à mesure qu'elle sont créées ?

 

Mais je rejoint didier, si tu en efface un et tu le redessine, il sera à la fin...

 

PS : faut faire gaffe à bien se relire, didier est dans la place. ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous et merci pour votre aide.

Ce LISP (provenant de CADXP):

(defun c:nettoyeur ( / ent dxf_ent js jsc n nw_js i l_dxf h)
(command "_zoom" "_e")
(while (null (setq ent (entsel "\nDésigner un cercle type: "))))
(setq dxf_ent (entget (car ent)))
(setq p1 (cdr (assoc 10 (entget (car ent)))))
(command "_.move" "_all" "" "_none" (trans p1 0 1) "_none" "*0.0,0.0,0.0")
(cond
((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
(setq
js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent)))
jsc (ssget "_x" (list (assoc 0 dxf_ent) (assoc 410 dxf_ent) (assoc 67 dxf_ent) (assoc 40 dxf_ent)))
n -1
)
(repeat (sslength jsc)
(ssdel (ssname jsc (setq n (1+ n))) js)
)
(if (not (tblsearch "LAYER" "UT1"))
(entmake '((0 . "LAYER")
(100 . "AcDbSymbolTableRecord")
(100 . "AcDbLayerTableRecord")
(2 . "UT1")
(70 . 0)
(62 . 7)
(6 . "Continuous")
(290 . 1)
(370 . -3)
)
)
)

(if js
(repeat (setq n (sslength js))
(entdel (ssname js (setq n (1- n))))
)
)
(if jsc
(repeat (setq n (sslength jsc))
(entmod (subst '(8 . "UT1") (assoc 8 (setq dxf_ent (entget (ssname jsc (setq n (1- n)))))) dxf_ent))
)
)
)
)
(command "_zoom" "_e")
(setq nw_js (ssadd) i 0)
(while (setq js (ssget"_:S"))
(ssadd (ssname js 0) nw_js)
(setq l_dxf (entget (ssname js 0)))
(setq h (* (cdr (assoc 40 l_dxf)) 0.5) i (1+ i))
(entmake
(list
'(0 . "TEXT")
'(10 0. 0. 0.)
(cons 11 (cdr (assoc 10 l_dxf)))
(cons 40 h)
(cons 1 (itoa i))
'(72 . 1)
'(73 . 2)
)
)
)
(setq js (ssget "_X"))
(cond
(js
(repeat (setq n (sslength js))
(ssadd (ssname js (setq n (1- n))) nw_js)
)
)
)
(cond
(nw_js
(setq n -1)
(repeat (sslength nw_js)
(entmake (setq l_dxf (entget (ssname nw_js (setq n (1+ n))))))
(entdel (cdar l_dxf))
)
)
)
(prin1)
) 

 

Pour le voir fonctionner (pour l'exemple):

- On trace une dizaine de cercles du même diamètre

- On trace une ligne

- On écrit un texte

On lance le LISP (commande "nettoyeur")

- Zoom étendu

Clique sur un des cercles :

- 1 => Suppression de tout sauf des cercles de même diamètre

- 2 => Zoom étendu sur ces cercles

- 3 => Création d'un calque UT1 (reconnu par la machine)

Clique sur un des cercles :

- 1 => Ce cercle est déplacé en X0 - Y0

- 2 => les clics suivant permettent de recréer "l'historique" (1-2-3...)

 

Je voudrais donc récupérer cet "historique" par une "extraction de données", mais je ne trouve pas la solution.

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Difficile de suivre ton besoin...

Avec ton explication et ton code, j'ai l'impression que tu veux faire 2 choses bien distinctes:

1 Trier tes cercle en fonction de leur rayons.

2 Trier ce résultat par ordre de création de l'objet cercle.

 

Si c'est le cas, je me servirais du handle (maintien: code DXF 5) de l'entité pour faire le tri par l'ordre de création

 

Donc par exemple en repartant du code proposé:

 

(defun c:nettoyeur ( / ent dxf_ent p1 js jsc n nw_js i l_dxf l_ent l_handent)
 (command "_zoom" "_e")
 (while (null (setq ent (entsel "\nDésigner un cercle type: "))))
 (setq dxf_ent (entget (car ent)) l_ent nil)
 (setq p1 (cdr (assoc 10 (entget (car ent)))))
 (command "_.move" "_all" "" "_none" (trans p1 0 1) "_none" "*0.0,0.0,0.0")
 (cond
   ((eq (cdr (assoc 0 dxf_ent)) "CIRCLE")
     (setq
       js (ssget "_x" (list (assoc 410 dxf_ent) (assoc 67 dxf_ent)))
       jsc (ssget "_x" (list (assoc 0 dxf_ent) (assoc 410 dxf_ent) (assoc 67 dxf_ent) (assoc 40 dxf_ent)))
       n -1
     )
     (repeat (sslength jsc)
       (ssdel (ssname jsc (setq n (1+ n))) js)
     )
     (if (not (tblsearch "LAYER" "UT1"))
         (entmake
         '(
           (0 . "LAYER")
           (100 . "AcDbSymbolTableRecord")
           (100 . "AcDbLayerTableRecord")
           (2 . "UT1")
           (70 . 0)
           (62 . 7)
           (6 . "Continuous")
           (290 . 1)
           (370 . -3)
         )
       )
     )
     (if js
       (repeat (setq n (sslength js))
         (entdel (ssname js (setq n (1- n))))
       )
     )
     (if jsc
       (repeat (setq n (sslength jsc))
         (entmod (subst '(8 . "UT1") (assoc 8 (setq dxf_ent (entget (ssname jsc (setq n (1- n)))))) dxf_ent))
         (setq l_ent (cons (cons (cdr (assoc 5 dxf_ent)) (cdr (assoc -1 dxf_ent))) l_ent))
       )
     )
   )
 )
 (cond
   (l_ent
     (setq l_handent (vl-sort (mapcar 'car l_ent) '<))
     (setq nw_js (ssadd) i 0)
     (foreach el l_handent
       (ssadd (ssmemb (cdr (assoc el l_ent)) jsc) nw_js)
     )
   )
 )
 (setq n -1 i 0)
 (cond
   (nw_js
     (repeat (sslength nw_js)
       (setq l_dxf (entget (ssname nw_js (setq n (1+ n)))))
       (entmake
         (list
           '(0 . "TEXT")
           '(8 . "UT1")
           '(10 0.0 0.0 0.0)
           (cons 11 (cdr (assoc 10 l_dxf)))
           (cons 40 (* (cdr (assoc 40 l_dxf)) 0.5))
           (cons 1 (itoa (setq i (1+ i))))
           '(50 . 0)
           '(71 . 0)
           '(72 . 1)
           '(73 . 2)
         )
       )
     )
   )
 )
 (command "_zoom" "_e")
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bonuscad, bonjour à tous.

Merci pour le LISP !

Pour être plus clair sur mon besoin... :

- Le LISP me permet de modifier (remanier) l'historique de tracé en final.

- Par l'extraction de données il faudrait que je récupère la position centrale de tous mes cercles en X/Y et qu'ils soient classés conformément à ma nouvelle disposition.

Le programme (lisible par ma machine) doit ressembler à ça :

 

;Date :30/11/2016				
;Travail N.:				
;Plans  N.:				
;Notes :				
GOTOF "N"<<R199			
N1 X0 Y0
N2 X41.24 Y0
N3 X82.49 Y0
N4 X123.73 Y0
...
M17

 

Les parties :

Début => ;Date.... jusqu'à R199

et

Fin => M17

sont toujours identiques.

Pour l'instant, je récupère bien les X et Y de mes cercles avec l'extraction de données, mais je n'arrive pas à garder l'ordre pour avoir :

N1 X0 Y0

N2 X41.24 Y0

...

Je ne trouve pas ce choix d'"ORDRE" dans l'"EXTRACTIONS DE DONNÉES", peut-être faut il passer par ailleurs...?).

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Dans EXTRACTDONNEES, à l'étape 5 de 8 le fait de cliquer sur une tête de colonne classe toutes les données selon le contenu de cette colonne, dans l'ordre alphabétique ou anti-alphabétique, comme dans un tableau excel.

 

Cordialy.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bonuscad, bonjour à tous.

Merci pour le LISP !

Pour être plus clair sur mon besoin... :

- Le LISP me permet de modifier (remanier) l'historique de tracé en final.

- Par l'extraction de données il faudrait que je récupère la position centrale de tous mes cercles en X/Y et qu'ils soient classés conformément à ma nouvelle disposition.

Le programme (lisible par ma machine) doit ressembler à ça :

 

;Date :30/11/2016				
;Travail N.:				
;Plans  N.:				
;Notes :				
GOTOF "N"<<R199			
N1 X0 Y0
N2 X41.24 Y0
N3 X82.49 Y0
N4 X123.73 Y0
...
M17

 

Les parties :

Début => ;Date.... jusqu'à R199

et

Fin => M17

sont toujours identiques.

Pour l'instant, je récupère bien les X et Y de mes cercles avec l'extraction de données, mais je n'arrive pas à garder l'ordre pour avoir :

N1 X0 Y0

N2 X41.24 Y0

...

Je ne trouve pas ce choix d'"ORDRE" dans l'"EXTRACTIONS DE DONNÉES", peut-être faut il passer par ailleurs...?).

Merci pour votre aide.

 

Pour qu'on ce comprenne bien, ce que j'ai surligné en rouge dans tes propos, cela veut dire que c'est toi qui désigne UN à UN tes cercles pour leur assigner un ordre de traçage pour ta machine?

Cela n'a rien à voir avec l'ordre dont le cercle à été tracé dans Autocad, si je comprends bien? (ce que j'ai tenté de faire dans le lisp proposé)

 

Si c'est cela, effectivement ton code proposé en 1er lieu n'est pas loin, au lieu d'écrire le texte dans le dessin, il suffit d'écrire les données dans un fichier (Quel est l'extension de celui-ci d'ailleurs?), au lieu de passé par l'extraction de données.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

 

- Par l'extraction de données il faudrait que je récupère la position centrale de tous mes cercles en X/Y et qu'ils soient classés conformément à ma nouvelle disposition.

 

...

Je ne trouve pas ce choix d'"ORDRE" dans l'"EXTRACTIONS DE DONNÉES", peut-être faut il passer par ailleurs...?).

Merci pour votre aide.

 

Si les cercles sont positionnés dans un ordre logique pour un gain de temps dans les programmes machines tu peux toujours "Filtrer" les centres X/Y sur Excel une fois l'extraction faite.

 

Sinon il y a L'exportation des attributs dans express tools (Attout)mais il va falloir faire des blocs avec un attribut de position et plus des cercles ce qui peut être moins rapide pour toi. =>réponse #5 Lecrabe

 

Petit Bloc pas trop compliqué

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Aleck.

Dans l'extraction de données, quand je fais un choix sur les cercles, j'ai le choix d'extraire (en choisissant un filtrage de catégories sur Géométrie):

 

Aire

Centre X

Centre Y

Centre Z

Circonférence

Diamètre

Position X

Position Y

Position Z

Rayon

 

Rien ne me permet de choisir l'ordre dans lequel les classer...(?)

 

Par contre, deuxième piste, si je choisis d'extraire le texte, je peux récupérer la valeur et les positions X et Y.

Deux problèmes :

- La position X et Y du texte, n'est pas centré sur le centre du cercle => exemple mon premier cercle X0 Y0, le chiffre 1 X-1.8889 Y-2.4313

- Lors du classement croissant des valeurs => 1-10-11-12-13-2-3-4 au lieu de 1-2-3-4...

 

Pour palier à ce problème, il faudrait dans mon LIPS de départ :

- Centrer le texte sur le centre du cercle (pour que les positions concordent)

- Créer du texte 0001 (au lieu de 1 - je n'ai jamais plus de 9999 cercles)

mais là je ne maitrise pas le LISP, si Bonuscad peut y jeter un coup d'œil...

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Pour en revenir à mon premier poste : pour pouvoir classer tout tes cercles dans l'ordre, il faudrait faire un bloc avec un attribut masqué, l'attribut ayant pour valeur la position du cercle dans la liste.

 

Dans l'extraction de donnée il est alors possible de les classer.

 

Je n'ais pas suivi les autres LISP proposés parce que je n'y comprend rien, mais un LISP qui placerais le bloc et qui lui donnerait comme valeur d'attribut le nombre de bloc du même nom déjà dans le dessin plus 1 ferait l'affaire.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous.

 

Combien, en gros, as-tu de cercles ?

 

Et dans ton fichier MPF, sont-il triés géographiquement (de gauche à droite et de haut en bas) ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bon, j'ai pas eu vraiment réponse à mes questions.

 

Voilà ce que j'ai fais en ayant compris comme je pouvais.

Cela écrit directement dans le fichier au format préconisé.

 

(defun def_date (td / j y d m)
 (setq j (- (fix td) 1721119.0))
 (setq y (fix (/ (1- (* 4 j)) 146097.0)))
 (setq j (- (* j 4.0) 1.0 (* 146097.0 y)))
 (setq d (fix (/ j 4.0)))
 (setq j (fix (/ (+ (* 4.0 d) 3.0) 1461.0)))
 (setq d (- (+ (* 4.0 d) 3.0) (* 1461.0 j)))
 (setq d (fix (/ (+ d 4.0) 4.0)))
 (setq m (fix (/ (- (* 5.0 d) 3) 153.0)))
 (setq d (- (* 5.0 d) 3.0 (* 153.0 m)))
 (setq d (fix (/ (+ d 5.0) 5.0)))
 (setq y (+ (* 100.0 y) j))
 (if (< m 10.0)
   (setq m (+ m 3))
   (progn  
     (setq m (- m 9))
     (setq y (1+ y))
   )
 )
 (strcat
   (itoa (fix d))
   "/"
   (itoa (fix m))
   "/"
   (itoa (fix y))
 )
)
(defun c:cercle2mpf ( / js dxf_cod lremov count n i file2open f_open js_one dxf_ent base_pt nw_pt write_pt)
 (princ "\nChoix d'un cercle modèle pour le filtrage: ")
 (while
   (null
     (setq js
       (ssget "_+.:E:S"
         (list
           '(0 . "CIRCLE")
           (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
           (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
         )
       )
     )
   )
   (princ "\nCe n'est pas un objet cercle valable pour cette fonction!")
 )
 (if (not (tblsearch "LAYER" "UT1"))
     (entmake
     '(
       (0 . "LAYER")
       (100 . "AcDbSymbolTableRecord")
       (100 . "AcDbLayerTableRecord")
       (2 . "UT1")
       (70 . 0)
       (62 . 3)
       (6 . "Continuous")
       (290 . 1)
       (370 . -3)
     )
   )
 )
 (setq
   dxf_cod (entget (ssname js 0))
   js
   (ssget "_X" 
     (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 40 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov))))
       (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
     )
   )
   count 0
   n (sslength js)
 )
 (repeat (setq i (sslength js))
   (redraw (ssname js (setq i (1- i))) 3)
 )
 (setq file2open (strcat (getvar "DWGPREFIX") (vl-string-right-trim ".dwg" (getvar "DWGNAME")) ".mpf"))
 (setq f_open (open file2open (if (findfile file2open) "a" "w")))
 (princ (strcat ";Date :" (def_date (getvar "TDCREATE"))) f_open)
 (princ "\n;Travail N.:" f_open)
 (princ "\n;Plans  N.:" f_open)
 (princ "\n;Notes :" f_open)
 (princ "\nGOTOF \"N\"<<R199" f_open)
 (while (< count n)
   (princ (strcat "\nDésignez votre cercle " (itoa (1+ count))))
   (while (not (setq js_one (ssget "_+.:E:S" dxf_cod))))
   (setq ent (ssname js_one 0))
   (cond
     ((and js_one (ssmemb ent js))
       (ssdel ent js)
       (setq dxf_ent (entget ent))
       (cond
         ((zerop count)
           (setq base_pt (cdr (assoc 10 dxf_ent)))
           (setq nw_pt '(0.0 0.0 0.0))
         )
         (T
           (setq nw_pt (cdr (assoc 10 dxf_ent)))
         )
       )
       (entmod (subst '(8 . "UT1") (assoc 8 dxf_ent) dxf_ent))
       (entmake
         (list
           '(0 . "TEXT")
           '(8 . "UT1")
           '(10 0.0 0.0 0.0)
           (cons 11 (cdr (assoc 10 dxf_ent)))
           (cons 40 (* (cdr (assoc 40 dxf_ent)) 0.5))
           (cons 1 (itoa (1+ count)))
           '(50 . 0)
           '(71 . 0)
           '(72 . 1)
           '(73 . 2)
         )
       )
       (setq
         write_pt (if (zerop count) nw_pt (mapcar '- nw_pt base_pt))
         count (1+ count)
       )
       (princ
         (strcat
           "\nN" (itoa count)
           " X" (if (zerop (car write_pt)) (rtos (car write_pt) 2 0) (rtos (car write_pt) 2 2))
           " Y" (if (zerop (cadr write_pt)) (rtos (cadr write_pt) 2 0) (rtos (cadr write_pt) 2 2))
         )
         f_open
       )
       (redraw ent 4)
     )
   )
 )
 (princ "\nM17\n" f_open)
 (close f_open)
 (princ (strcat "\nDonnées écrites dans " file2open))
 (prin1)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Pardon Bonuscad pour ne pas avoir répondu à tes questions.

Ton programme fonctionne très bien.

Juste, si tu peux ajouter/modifier 2 choses :

- Ecrire le N° du cercle au milieu des cercles (comme dans mon LIPS de départ, j'imprime une feuille pour l'opérateur sur la machine pour qu'il puisse suivre le cheminement)

- Et du coup, écrire 1-2-3... (au lieu de 0001-0002-0003...puisque nous ne passons plus par une extraction de données qui classait 1-10-11-12-2-21-22-3...).

Pour apporter une vision claire de l'utilité de ce programme, tu peux aller voir sur www.pcvs.fr, la petite vidéo de présentation à environ 1m28, on voit la machine en action.

Merci encore et désolé pour la manque de clarté.

Lien vers le commentaire
Partager sur d’autres sites

L'essentiel est que j'ai pu cerner ton besoin pour le concrétiser...

Impressionnant la machine outil, c'est pas de la maquette :rolleyes:

 

Le code a été mis à jour dans mon post précédent.

Contrôle quand même les résultats, je suis pas à l'abri de faire des boulettes et ça me ferais mal d'être responsable indirectement d'une malfaçon et surtout des coûts qui pourrait en découler.

 

NB: Si dans le même fichier dessin, la commande "cercle2mpf" est relancée pour traiter par exemple des cercles avec d'autres rayons, les données seront alors RAJOUTEES au fichier. mpf selon le même schéma. Je tenais à le préciser...

La précision est à deux chiffre après la virgule comme dans ton exemple, elle peut être augmenté (voir la fonction (rtos) dans le code)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é