ludo07 Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Bonjour à tous, Comment obtenir 2 arcs à partir d'1 cercle.A partir du cercle je veux simplement pouvoir sélectionner 2 points sur ce cercle pour obtenir 2 arcs distincts mais qui se touchent. Aujourd'hui je trace 2 lignes parallèle puis je coupe entre les 2 lignes puis ensuite je re prolonges. Avec la commande coupure je n'y arrive pas.Y as t'il une commande native qui permet de le faire?Ou un lisp peut être?MERCI A+
lecrabe Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Hello AutoCAD n'autorise pas les arcs de 360 degres ou 400 grades, donc en effet on ne peut pas couper un Cercle a UN point ! A priori un progr en Lisp/VLisp me semble la seule solution en cliquant 2 points precis, on pourrait generer 2 arcs ... Bonne Annee et surtout la Sante, lecrabe Autodesk Expert Elite Team
lecrabe Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Hello En farfouillant dans mon stock, j'ai retrouve cette routine : C2A Cercle to Arc qui genere UN Arc depuis un Cercle avec 2 Points cliques Desole mais je n'ai pas mieux sous la main ! Comme le Cercle n'est pas supprime, en lancant DEUX fois la Routine C2A tu auras 2 ARCs avec 2 x 2 CLICs subtils ... A toi de voir, si tu veux supprimer APRES le Cercle de Depart ! lecrabe ;; ;; CERCLE to ARC - Routine : C2A ;; (defun c:c2a (/ val_dxf cercle cen ang1 ang2) (defun val_dxf (code ent) (cdr (assoc code (entget ent))) ) (while (not (and (setq cercle (car (entsel "\nSélectionnez un Cercle: "))) (= (val_dxf 0 cercle) "CIRCLE") ) ) ) (setq cen (val_dxf 10 cercle)) (command "_ucs" "_n" "_ob" cercle) (initget 1) (setq ang1 (getangle '(0 0) "\nSpécifiez l'angle de Départ de l'Arc: ")) (initget 1) (setq ang2 (getangle '(0 0) "\nSpécifiez l'angle de Fin de l'Arc: ")) (command "_ucs" "_p") (setq lst (list '(0 . "ARC") (cons 10 cen) (cons 40 (val_dxf 40 cercle)) (cons 8 (val_dxf 8 cercle)) (cons 50 ang1) (cons 51 ang2) (cons 210 (val_dxf 210 cercle)) ) ) (foreach code '(6 62 48) (if (val_dxf code cercle) (setq lst (reverse (cons (cons code (val_dxf code cercle)) (reverse lst)) ) ) ) ) (command "_regen") (entmake lst) ;;; Supprimer ou PAS le Cercle ;;; (entdel cercle) (princ) ) Autodesk Expert Elite Team
VDH-Bruno Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Salut, Un petit truc vite fait encore un peu brut de décoffrage, pour dépanner..;; Coupure d'un Cercle en 2 Arc VDH Bruno (defun c:CC2A () (command "_.BREAK" (while (not (zerop (getvar "cmdactive"))) (command pause))) ((lambda (e) (if (= "ARC" (cdr (assoc 0 e))) (entmake (list (assoc 0 e) (assoc 8 e) (assoc 10 e) (assoc 40 e) (assoc 210 e) (cons 50 (cdr (assoc 51 e))) (cons 51 (cdr (assoc 50 e))) ) ) ) ) (entget (entlast)) ) (princ) ) Tapez CC2A pour lancer la routine..La fonction exécute la commande coupure qui une fois terminé, trace un arc complémentaire à celui qui vient d’être créé par la coupure du cercle. Cordialement Apprendre => Prendre => Rendre
lecrabe Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Hey Bruno Sorry mais Non ca ne fait pas reellement le resultat attendu ! Avec un Cercle coupe par une Ligne, on obtient UN Arc (50% du resultat escompte) avec la Ligne non touchee ... Avec un Cercle coupe par un Arc, on obtient UN Arc puis un grand cercle dont l'origine est l'Arc qui sert de Coupure ... lecrabe Autodesk Expert Elite Team
VDH-Bruno Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 Salut, A partir du cercle je veux simplement pouvoir sélectionner 2 points sur ce cercle pour obtenir 2 arcs distincts mais qui se touchent. Je répondais à cette demande par 2 points comme avec la commande coupure, re-teste en configurant CMDECHO à 1 pour voir les invites.. Sinon je vois pas car sur 2007 cela fonctionne très bien. A+ Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 28 janvier 2013 Posté(e) le 28 janvier 2013 (modifié) Salut,Une variation sur le même modèle, une routine qui trace l’arc de cercle complémentaire de celui pointé en référence. ;; VDH-Bruno ;; Dessine l'arc complémentaire à l'arc pointé en référence (defun c:A2A (/ e ang50 ang51) ; Arc to 2 Arc (princ "\nSélectionnez un arc de cercle: ") (and (setq e (ssget "_:S:E" '((0 . "ARC")))) (setq e (entget (ssname e 0)) ang50 (assoc 50 e) ang51 (assoc 51 e) ) (entmake (subst (cons 51 (cdr ang50)) ang51 (subst (cons 50 (cdr ang51)) ang50 e))) (progn (initget "Oui Non") (if (= (getkword "\nEffacer l'Arc référent ? [Oui/Non] <N>: ") "Oui") (entdel (cdr(assoc -1 e))) ) ) ) (princ) ) A+ Modifié le 29 janvier 2013 par VDH-Bruno Apprendre => Prendre => Rendre
ludo07 Posté(e) le 28 janvier 2013 Auteur Posté(e) le 28 janvier 2013 Bonsoir. Merci pour vos reponses. J'essairais ca demain. A+
FormaBois Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 Salut,Une variation sur le même modèle, une routine qui trace l’arc de cercle complémentaire de celui pointé en référence.Salut,ne fonctionne pas chez moi, voici le message :Commande: A2A ; erreur: nombre d'arguments insuffisants Studio Gfilm - Agence de communication par l'image "Le matin tu peux rester couché pour poursuivre ton rêve, ou te lever pour le réaliser"
bonuscad Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 (modifié) Bonjour, Ma contribution rapide:Cela convertira le cercle en deux arcs opposés Haut-Bas (ou Nord Sud) puis rendra les poignées actives.Il suffira d'activer au choix les poignées Est ou Ouest puis d'amener cette poignée (avec le mode proche) sur un point désiré du cercle sélectionné pour créer l'angle voulu d'arc. (defun c:Circle2Arc ( / js ent dxf_ent pt_cen new_js) (while (null (setq js (ssget "_:S" '((0 . "CIRCLE")))))) (setq ent (ssname js 0) dxf_ent (entget ent) pt_cen (cdr (assoc 10 dxf_ent)) radius (cdr (assoc 40 dxf_ent)) new_js (ssadd) ) (entmake (list '(0 . "ARC") '(100 . "AcDbEntity") (assoc 67 dxf_ent) (assoc 410 dxf_ent) (assoc 8 dxf_ent) (if (assoc 6 dxf_ent) (assoc 6 dxf_ent) '(6 . "BYLAYER")) (if (assoc 62 dxf_ent) (assoc 62 dxf_ent) '(62 . 256)) (if (assoc 370 dxf_ent) (assoc 370 dxf_ent) '(370 . -3)) (if (assoc 48 dxf_ent) (assoc 48 dxf_ent) '(48 . 1.0)) '(100 . "AcDbCircle") (cons 38 (caddr pt_cen)) (if (assoc 39 dxf_ent) (assoc 39 dxf_ent) '(39 . 0.0)) (cons 10 pt_cen) (cons 40 radius) (assoc 210 dxf_ent) '(100 . "AcDbArc") (cons 50 0.0) (cons 51 pi) ) ) (setq new_js (ssadd (entlast) new_js)) (entmake (list '(0 . "ARC") '(100 . "AcDbEntity") (assoc 67 dxf_ent) (assoc 410 dxf_ent) (assoc 8 dxf_ent) (if (assoc 6 dxf_ent) (assoc 6 dxf_ent) '(6 . "BYLAYER")) (if (assoc 62 dxf_ent) (assoc 62 dxf_ent) '(62 . 256)) (if (assoc 370 dxf_ent) (assoc 370 dxf_ent) '(370 . -3)) (if (assoc 48 dxf_ent) (assoc 48 dxf_ent) '(48 . 1.0)) '(100 . "AcDbCircle") (cons 38 (caddr pt_cen)) (if (assoc 39 dxf_ent) (assoc 39 dxf_ent) '(39 . 0.0)) (cons 10 pt_cen) (cons 40 radius) (assoc 210 dxf_ent) '(100 . "AcDbArc") (cons 50 pi) (cons 51 (* 2.0 pi)) ) ) (setq new_js (ssadd (entlast) new_js)) (entdel ent) (sssetfirst nil new_js) (prin1) ) Modifié le 29 janvier 2013 par bonuscad Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 Salut,ne fonctionne pas chez moi, voici le message :Commande: A2A ; erreur: nombre d'arguments insuffisants Oui merci, tu a raison une coquille, c'est corrigé dans le code précédent..Il fallait corrigé cette ligne(defun c:A2A (e ang50 ang51) ; Arc to 2 Arcde la façon suivante(defun c:A2A (/ e ang50 ang51) ; Arc to 2 Arc A+ Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 Bonjour, Ma contribution rapide: .... (cons 38 (caddr fst_pt)) .... .... (cons 38 (caddr fst_pt)) .... Fonctionne bien sous AutoCAD 2007, sans le code 38 (attention la variable fst_pt n’est pas initialisé…) A+ Apprendre => Prendre => Rendre
ludo07 Posté(e) le 29 janvier 2013 Auteur Posté(e) le 29 janvier 2013 Bonsoir à tous.Tout dabord merci d'avoir pris le temps de me répondre.J'ai essayé vos propositions, ci-dessous mes remarques (et j'esperes mettre les formes pour que personne prenne mal mes remarques. hiii) Pour BONUSCAD:Quand je charge le lisp pas de soucis.Par contre aprés avoir lancé la commande et selectionné un cercle.Autocad me renvois le message: erreur: groupe DXF incorrect: (38).J'ai bien lu que sur un message de VDH-BRUNO il avait évoqué ce problème.Mais ne connaissant pas le lisp je ne sais que faire. Pour VDH-BRUNO:Programme A2A:Je l'ai essayé, il marche trés bien. Mais comme tu l'as justement écris ce n'est pas exactement ce que je recherchais. HiiiiiiProgramme CC2A:Coooooool exactement ce que je recherche. Cependant il marche que dans certaines conditions et je vais lister ci-dessous mes essais et mes résultats:Cas 1:Si je trace le cercle et que je lance CC2A, AUCUN SOUCIS j'obtiens bien les 2 arcs (break, 2eme points ou par selection+1er point + 2eme point). ceci dit dans ce cas la les 2 points que je selectionne sont certe aléatoire sur le cercle mais je n'ais pas choisis des points correspondant avec une intersection avec un autre objet.Cas 2:Je trace dabord une ligne puis aprés je trace un cercle sur cette ligne. Je lance CC2A, break choix du cercle, 1er point l'une des intersections entre la ligne et le dit cercle puis 2eme points la deuxiéme intersections. J'obtiens bien les 2 arcs. Donc cooooooolCas 3:Si je trace dabord le cercle puis ensuite une ligne passant par ce cercle. Quand je lance CC2A même méthode qu'au dessus. Beh la j'obiens qu'un seul arc et le deuxiéme est effacé??????????????? NOT COOOOOL Bref peux tu me dire si cela le fait aussi chez toi?Puis si j'osais!! pourrais tu apporter la modification pour que cela fonctionne? MerciMerciA tous.A+si je trace
lecrabe Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 Hello J'aime le programme de Bonuscad qui marche mieux en supprimant les DEUX lignes : (cons 38 (caddr fst_pt)) Mais les progrs de VDH-Bruno sont sympas aussi ... lecrabe Autodesk Expert Elite Team
ludo07 Posté(e) le 29 janvier 2013 Auteur Posté(e) le 29 janvier 2013 ReDonc suite au message de "lecrabe" j'ai supprimé les 2 lignes.Le programme de bonuscad n'affiche plus le message.Mais il faut que je l'utilise pour comprendre exactement ce qu'il fait. Hiiiiii Bonne soiré
VDH-Bruno Posté(e) le 29 janvier 2013 Posté(e) le 29 janvier 2013 Bonsoir ludo07, Puis si j'osais!! pourrais tu apporter la modification pour que cela fonctionne?Merci du retour, effectivement la fonction _break est un peu capricieuse dans C2A, je verrais ce qu’il est possible de faire… A+ Apprendre => Prendre => Rendre
bonuscad Posté(e) le 30 janvier 2013 Posté(e) le 30 janvier 2013 J'aime le programme de Bonuscadqui marche mieux en supprimant les DEUX lignes :(cons 38 (caddr fst_pt)) Une coquille de ma part lors des copiés-collés pour faire l'adaptation rapide (l'original faisait une LwPolyligne à 1 seul segment d'un demi-arrondi et close)C'est mieux de conserver le code DXF 38, il permet d'associer la même élévation d'objet que l'original. (de mémoire) donc ce n'est pas (caddr fst_pt) mais (caddr pt_cen), j'ai corrigé dans le post initial. Merci à vous tous, pour la remarque. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 30 janvier 2013 Posté(e) le 30 janvier 2013 Hello Mr B 0) Merci pour le boulot ! Je viens de retester ta routine sur un MAP 2012 32 bits, c OK !Les Hauteurs/Epaisseurs et Elevations sont recuperees ... Neanmoins SVP si tu as qq mns, je desire 2 petites ameliorations : 1) Pouvoir selectionner N Cercles et donc generer N x 2 Arcs 2) Poser la question : Conserver les Cercles (Oui/Non) Defaut = Non Merci d'avance, le crabe Autodesk Expert Elite Team
VDH-Bruno Posté(e) le 30 janvier 2013 Posté(e) le 30 janvier 2013 Salut, Puis si j'osais!! pourrais tu apporter la modification pour que cela fonctionne? Une version plus abouti qui fonctionne en 3D quelques soit le repère, et préserve les éventuelles données étendues (les copies sur chaque arcs).Ce qui n’est pas sécurisé c’est si les points cliqués appartiennent bien au cercle, et s’ils sont bien distincts. Commande SC2A pour tester..Cordialement Bruno, ;; Scinder un Cercle en 2 Arcs VDH-Bruno (defun c:SC2A (/ ename cercle arc p1 p2) (while (not (and (setq ename (car (entsel "\nSélectionnez le cercle à scinder en 2 arcs: "))) (= "CIRCLE" (cdr (assoc 0 (entget ename)))) ) ) (if ename (princ "\nL'objet sélectionné n'est pas un cercle!") ) ) (and (setq arc (entmake (append (subst '(0 . "ARC") (assoc 0 (setq cercle (entget ename '("*")))) cercle) (list '(100 . "AcDbArc") (cons 50 (angle (cdr (assoc 10 cercle)) (progn (initget 1) (trans (setq p1 (getpoint "\nSpécifiez le premier point de coupure: ")) 1 ename)) ) ) (cons 51 (angle (cdr (assoc 10 cercle)) (progn (initget 1) (trans (getpoint p1 "\nSpécifiez le second point de coupure: ") 1 ename)) ) ) ) ) ) ) (entmake (subst (cons 51 (cdr (setq p1 (assoc 50 arc)))) (setq p2 (assoc 51 arc)) (subst (cons 50 (cdr p2)) p1 arc) ) ) (progn (initget "Oui Non") (if (not (= (getkword "\nConservez le cercle d'origine ? [Oui/Non] <N>: ") "Oui")) (entdel ename) ) ) ) (princ) ) Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 30 janvier 2013 Posté(e) le 30 janvier 2013 Hello Mr B 0) Merci pour le boulot ! Je viens de retester ta routine sur un MAP 2012 32 bits, c OK !Les Hauteurs/Epaisseurs et Elevations sont recuperees ... Neanmoins SVP si tu as qq mns, je desire 2 petites ameliorations : 1) Pouvoir selectionner N Cercles et donc generer N x 2 Arcs 2) Poser la question : Conserver les Cercles (Oui/Non) Defaut = Non Merci d'avance, le crabe Cela devrait répondre à ta demande à voir…Si tu ne veux pas des données étendues, remplace cette ligne :(setq cercle (entget (ssname ss (setq i (1- i))) '("*")))Par cette dernière:(setq cercle (entget (ssname ss (setq i (1- i))))) Le code: ;; Scinde une sélection de cercles en 2 arcs (Nord-Sud SCO) VDH-Bruno ;; Adaptation du code de BonusCAD (defun c:MC2A (/ ss js i rep cercle ) (and (setq ss (cond ((ssget "_I" '((0 . "CIRCLE")))) (T (prompt "\nSélectionnez les cercles à scinder en 2 arcs... ") (ssget '((0 . "CIRCLE")))) ) ) (setq rep (progn (initget "Oui Non") (not (= (getkword "\nConservez les cercles d'origine ? [Oui/Non] <N>: ") "Oui")) ) ) ) (setq js (ssadd)) (repeat (setq i (if ss (sslength ss) 0)) (setq cercle (entget (ssname ss (setq i (1- i))) '("*"))) (entmake (append (subst '(0 . "ARC") '(0 . "CIRCLE") cercle) (list '(100 . "AcDbArc") (cons 50 0.0) (cons 51 pi)) ) ) (ssadd (entlast) js) (entmake (append (subst '(0 . "ARC") '(0 . "CIRCLE") cercle) (list '(100 . "AcDbArc") (cons 50 pi) (cons 51 (* 2.0 pi))) ) ) (ssadd (entlast) js) (if rep (entdel (cdr (assoc -1 cercle)))) ) (sssetfirst nil js) (princ) ) (Ps : J’espère que BonusCAD m’en voudra pas trop de répondre à sa place)Amicalement Bruno (Edit : Ajouté mise en surbrillance des entités nouvellement créer) Apprendre => Prendre => Rendre
ludo07 Posté(e) le 5 février 2013 Auteur Posté(e) le 5 février 2013 Bonjour, Avec un peu de retard, j'ai essayais le code de BRUNO. Aprés quelque test il semble fonctionner correctment. Je te dis donc un grand merci. A+
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