Aller au contenu

1 cercles en 2arcs


Messages recommandés

Posté(e)

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+

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e) (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é par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e) (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é par bonuscad

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

Posté(e)

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 Arc

de la façon suivante

(defun c:A2A (/ e ang50 ang51) ; Arc to 2 Arc

 

A+

Apprendre => Prendre => Rendre

Posté(e)

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

Posté(e)

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. Hiiiiii

Programme 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 coooooool

Cas 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?

 

Merci

Merci

A tous.

A+

si je trace

Posté(e)

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

Posté(e)

Re

Donc 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é

Posté(e)

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

Posté(e)
J'aime le programme de Bonuscad

qui 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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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+

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é