Krisp Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 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
Tramber Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 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#entry176399Mais 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 ./__\. (.°=°.)
Krisp Posté(e) le 4 juillet 2017 Auteur Posté(e) le 4 juillet 2017 Bonjour Tramber, Oui je ne suis peut-être pas assez explicite!J'ai édité mon 1er post... et oui un Lisp serait vraiment le bienvenu!
Tramber Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 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 ./__\. (.°=°.)
Krisp Posté(e) le 4 juillet 2017 Auteur Posté(e) le 4 juillet 2017 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...
Tramber Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 (modifié) 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é le 4 juillet 2017 par Tramber code modifié Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 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 ./__\. (.°=°.)
Krisp Posté(e) le 4 juillet 2017 Auteur Posté(e) le 4 juillet 2017 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
bonuscad Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 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
Krisp Posté(e) le 4 juillet 2017 Auteur Posté(e) le 4 juillet 2017 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?
Tramber Posté(e) le 4 juillet 2017 Posté(e) le 4 juillet 2017 Pour généraliser, j'ai très honteusement adapté mon code dans la structure de sélection de Bonuscad 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) ) 1 Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Krisp Posté(e) le 4 juillet 2017 Auteur Posté(e) le 4 juillet 2017 Alors un énorme merci à toi et bonuscad! C'est parfait, je n'aurais espéré mieux!!! :) Vous êtes formidable :P ... Et passe de bonnes vacances Tramber! ;)
Tramber Posté(e) le 5 juillet 2017 Posté(e) le 5 juillet 2017 ...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 ./__\. (.°=°.)
bonuscad Posté(e) le 5 juillet 2017 Posté(e) le 5 juillet 2017 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
Krisp Posté(e) le 5 juillet 2017 Auteur Posté(e) le 5 juillet 2017 tu voulais dire "formidables" :P Oui, c'est ce que je voulais dire ;) Merci encore!
Krisp Posté(e) le 24 juillet 2017 Auteur Posté(e) le 24 juillet 2017 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!
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant