Aller au contenu

[Résolu] Transformer un cylindre en trou (cercle)


Krisp

Messages recommandés

Bonjour,

 

J'ai 39 ans et je suis dessinateur, j'utilise Autocad depuis environ 20 ans.

 

Aujourd'hui j'en appel à vous afin de m'aider sur un problème récurant pour moi.

Je dessine sur autocad architecture 2017 en 3D principalement des solides et des cylindres.

En vu d'une programmation pour une CNC, je récupère chaque pièce afin de les exporter en DXF.

Malheureusement les cylindres (qui représentent des trous) me posent problème, car pour chacun d'eux, afin de pouvoir les récupérer sur mon logiciel de programmation CNC, je doit les transformer en cercles avec une épaisseur négative.

Je doit garder du cylindre les propriétés du calque, la couleur, le diamètre, la hauteur et la direction.

 

Voici les actions que j'effectue pour chaque cylindre:

-décomposer mon cylindre

-décomposer la surface qui en résulte

-mesurer la distance entre les cercle pour connaitre l'épaisseur négative de mon trou

-donner au cercle du départ du trou son épaisseur négative

-effacer les cercles qui reste de la décomposition.

 

Pour tenter d'être plus explicite:

Le but de ma demande est de transformer un cylindre (ou même plusieurs) en un cercle (ou plusieurs ;)) d'épaisseur négative de manière rapide et sans devoir traiter les cylindres un par un par de multiples actions.

 

 

Avant:

 

le cylindre appartenant à un calque, d'une certaine couleur, diamètre, direction et hauteur

 

http://nsa37.casimages.com/img/2017/07/04/170704120422490326.png

 

 

Après :

 

Un cercle de même calque, couleur, diamètre, direction et d'une épaisseur négative égale à la hauteur du cylindre

 

http://nsa38.casimages.com/img/2017/07/04/170704120420962693.png

 

Le point de départ du cylindre correspond au centre du cercle qui récupère en épaisseur négative la hauteur du cylindre!

 

 

 

Sachant que j'ai énormément de trou par pièces, environ une centaine et dans des orientations différentes... cela me prends énormément de temps!

 

Est ce que quelqu'un aurai une idée pour m'en faire gagner?

 

voici un exemple de fichier que j'ai à traiter : https://we.tl/KOzGmxlqTs

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Krisp.

S'il s'agit d'agrandir les rayons des cylindres avant de les soustraire, on peut tout modifier dans la palette des propriétés en visant la propriété rayon !

J'ai essayé en vlisp, d'y accèder grâce à des fonctions de cette page, longuement mémorisée chez moi :

http://cadxp.com/topic/32904-4-nouvelles-fonctions-autolisp-dans-a2012/page__p__176399__hl__dumpallproperties__fromsearch__1#entry176399

Mais impossible hélas sur ma 2016.

C'est quoi donc ce rayon négatif, que l'on comprenne bien ? :P (Parce qu'en fait je n'ai pas compris je crois. on parle même d'une distance...)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Wouahou !

Je suis enfin en vacances, et depuis des années maintenant que je ne peux plus publier dans les forums faute de temps avec mes deux jeunes enfants et mes projets, voilà que je réponds à une demande tout à fait étrange :P

En somme tu te débarrasses de cylindres en solides pour les remplacer par des cercles épais, des cercles 2,5D comme on dit parfois ?!

Plutôt facile même avec du bon vieux Autolisp a priori mais ma question est POURQUOI !?

PS : j'ai compris la distance négative

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Merci de te pencher sur mon étrange demande :P ... surtout pendant tes vacances!

 

ma question est POURQUOI !?

 

C'est une bonne question, je vais essayer d'y répondre ^^

 

...En gros c'est la faute de mon logiciel de programmation pour CNC

 

Pour ces pièces (qui sont une charpente bois) je dois programmer uniquement de façon manuel par le biais d'un DXF. (j'utilise un BTL et programmation semi-automatique habituellement...)

Pour reconnaitre un perçage seul un cercle à hauteur négative est détecté par le logiciel, c'est donc pour cela que je dois remplacer mes cylindres par un cercle d'épaisseur négative sous Autocad et exporter le tout en DXF.

 

D'habitude dans ce cas, je dessine directement les cercle à épaisseur négative dans mon 3D mais pour ce projet j'ai du dessiner exclusivement des solides (soit des cylindres... et qui soit dit en passant sont des objets beaucoup plus simple à gérer...).

 

Je me retrouve avec beaucoup de pièces et beaucoup de cercle à redessiner et à l'avenir cela risque de m'arriver de plus en plus souvent, d'ou mon post sur ce forum...

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait un bout de code, pour l'instant c'est pour 1 cylindre à la fois.

Mais j'y reviens.

 

(defun c:1cyl( /  p1 p2)
 (setq voir(car(entsel))); sans filtre
 (setq dern(entlast))
 (command "_explode" voir "")
 (while(and dern(setq ent(entnext dern)))
   (cond((="SURFACE"(cdr(assoc 0 (entget ent))))(setq dern ent)(entdel ent))
 ((="REGION"(cdr(assoc 0 (entget ent))))(setq dern ent)(command "_explode" ent ""))
 ((="CIRCLE" (cdr(assoc 0 (entget ent))))(setq dern ent)
  (setq p1(trans (cdr(assoc 10(entget dern)))dern 0)
	p2(trans (cdr(assoc 10(entget(entnext dern))))(entnext dern) 0)
	)
  (entdel(entnext dern))
  (setq dern nil)
  (princ(strcat"\nDistance="(rtos(distance p1 p2)2 2))); renvoie la distance
  )
 ((setq dern nil)); pour protéger un peu la boucle 
;de solides qui ne contiendraient pas de cercles
 )    
   )
 (and p1 p2(entmod (append(entget ent)(list(cons 39(- (distance p1 p2)))))))
 )

Il faut lancer 1cyl une fois chargé.

Problème de distance, pas encore trouvé et cercle pas effacé.

J'y retourne. Après, il suffira de généraliser.

Aurait pu être pensé en VisualLisp...

Modifié par Tramber
code modifié

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Je viens de modifier le code.

Plus d'erreurs de distances grâce à la fonction trans et effacement du cercle superflu.

 

A voir maintenant, faut-il faire dans l'autre sens ? éditer l'autre cercle ? Je suppose vraiment, qu'à l'explosion, le cylindre a un sens, autrement dit ma routine devrait être convenable pour un sens mais à revoir pour l'autre...

 

Essaie voir, avant de généraliser.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Cool, un gran merci à toi Tramber! ^^

 

Cela fonctionne très bien et de la bonne façon!

 

A voir maintenant, faut-il faire dans l'autre sens ? éditer l'autre cercle ? Je suppose vraiment, qu'à l'explosion, le cylindre a un sens, autrement dit ma routine devrait être convenable pour un sens mais à revoir pour l'autre...

 

Si je comprends ta question, je n'utilise que le cercle qui représente le départ du cylindre explosé, j'ai une certaine rigueur quand je dessine les cylindres et c'est vraiment rare que le cylindre soit dans le mauvais sens... Mais je te l'accorde tout peut arriver xD

Lien vers le commentaire
Partager sur d’autres sites

Pour ma part j'ai cherché en vlisp, mais j'ai un petit souci que je ne sais résoudre:

C'est pour déterminer la variable dxf_210 avec 'PrincipalDirections qui retourne 9 éléments.

Des fois ça peut être les 3 premier, les 3 du milieu ou les 3 dernier.

 

Je donne ce que j'ai fais (qui fonctionne bien avec les cylindre créés dans le SCG).

 

(defun c:cyl2cer ( / js n ent dxf_ent cyl pt_pos height radius dxf_210)
 (cond
   ((setq js (ssget '((0 . "3DSOLID"))))
     (repeat (setq n (sslength js))
       (setq
         ent (ssname js (setq n (1- n)))
         dxf_ent (entget ent)
         cyl (vlax-ename->vla-object ent)
       )
       (cond
         ((= (vl-catch-all-apply 'vla-get-SolidType (list cyl)) "Cylindre")
           (setq
             pt_pos (vlax-get cyl 'Position)
             height (* 2 (distance pt_pos (vlax-get cyl 'centroid)))
             radius (sqrt (/ (vla-get-Volume cyl) (* pi height)))
             dxf_210 (cdddr (cdddr (vlax-get cyl 'PrincipalDirections)))
           )
           (vla-delete cyl)
           (entmake
             (list
               (cons 0 "CIRCLE")
               (assoc 67 dxf_ent)
               (assoc 410 dxf_ent)
               (assoc 8 dxf_ent)
               (if (assoc 62 dxf_ent)
                 (assoc 62 dxf_ent)
                 (cons 62 256)
               )
               (cons 39 height)
               (cons 10 (trans pt_pos 0 dxf_210))
               (cons 40 radius)
               (cons 210 dxf_210)
             )
           )
         )
       )
     )
   )
 )
)

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 et merci à toi aussi bonuscad,

 

En effet seul les cylindres perpendiculaires au SGC terminent correctement après ta routine, les autres partent aux fraises xD

 

Qu'est que la varibale DXF_210? c'est la variable qui défini la direction d'extrusion de l'objet?

Lien vers le commentaire
Partager sur d’autres sites

Pour généraliser, j'ai très honteusement adapté mon code dans la structure de sélection de Bonuscad :rolleyes:

Très pratique B)

Je ne connaissais pas le 'vla-get-SolidType ou avais oublié.

 

(defun c:xcyl ( / js n ent dxf_ent cyl  dern   p1 p2)
 (cond
   ((setq js (ssget '((0 . "3DSOLID"))))
     (repeat (setq n (sslength js))
(setq ent (ssname js (setq n (1- n)))
      dxf_ent (entget ent)
      cyl (vlax-ename->vla-object ent))
       (cond
  ((= (vl-catch-all-apply 'vla-get-SolidType (list cyl)) "Cylindre")
   (setq dern(entlast))
   (command-s "_explode" ent "" )
   (while(and dern(setq ent(entnext dern)))
     (cond((="SURFACE"(cdr(assoc 0 (entget ent))))(setq dern ent)(entdel ent))
	  ((="REGION"(cdr(assoc 0 (entget ent))))(setq dern ent)(command-s "_explode" ent "" ))
	  ((="CIRCLE" (cdr(assoc 0 (entget ent))))(setq dern ent)
	   (setq p1(trans (cdr(assoc 10(entget dern)))dern 0)
		 p2(trans (cdr(assoc 10(entget(entnext dern))))(entnext dern) 0)
		 )
	   (entdel(entnext dern))
	   (setq dern nil)
	   (princ(strcat"\nDistance="(rtos(distance p1 p2)2 2))); renvoie la distance
	   
	   )
	  ((setq dern nil)); pour protéger un peu la boucle de solides qui ne contiendraient pas de cercles
	  )
     )
   (and p1 p2(entmod (append(entget ent)(list(cons 39(- (distance p1 p2)))))))
   )
       )
     )
   )
 )
     (princ)
)

  • Upvote 1

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

...cool !

tu voulais dire "formidables" :P

Merci. Bon j'ai encore un peu de travail mais je vais enfin me reposer pour tout lâcher dans 10 jours pendant 15 avec camping et mini-club et garde d'enfants :)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Je ne connaissais pas le 'vla-get-SolidType ou avais oublié.

 

J'ai aucun mérite car je ne le connaissais pas non-plus, je l'ai pompé sur un code de (gile) que j'ai retrouvé sur les forums d'AutoDesk.

Merci à lui.

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

  • 3 semaines après...

Bonjour,

 

Je tenais juste encore à vous remercier, Tramber et bonuscad, pour votre aide précieuse!

Grâce à vous j'ai pu finir mon projet dans les temps et il m'en fera encore gagner dans le futur!

 

Je vous met comme retour (et sans vouloir faire de pub...) l'ouvrage réalisé!

 

Bonne vacances à ceux qui en ont et bonne continuation pour les autres!

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é