Aller au contenu

arc =>> cercle


haithem

Messages recommandés

bonjour

merci bonuscad pour la reponse rapide

 

j'ai dejas utilise la commande JOINDRE ds covadis 2007 et le lisp que m'avez indiquer

 

mais le seul pb c'est que il faut selectionner les cercles 1 à 1, ce que je cherche c'est transformer l'ensemble des arcs contenu ds le dessin en faisant une seclection en groupe ,

 

voila et merci tt de meme pour la reponse.

 

a+

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

(defun c:A2C (/ ss n arc)
 (princ "\nSélectionnez les arcs ou : ")
 (if
   (or	(setq ss (ssget '((0 . "ARC"))))
(setq ss (ssget "_X" '((0 . "ARC"))))
   )
    (while (setq arc (ssname ss (setq n (if n (1+ n) 0))))
      (entmake	(cons '(0 . "CIRCLE")
	      (vl-remove-if
		'(lambda (x)
		   (member (car x) '(-1 0 330 5 100 50 51))
		 )
		(entget arc)
	      )
	)
      )
      (entdel arc)
    )
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai la sale manie de vouloir écrire de manière concise ce qui ne rend pas le code toujours très explicite. En plus, là je m'amuse à essayer un nouveau truc pour parcourir le jeu de sélection.

 

(princ "\nSélectionnez les arcs ou : ")
 (if
   (or	(setq ss (ssget '((0 . "ARC"))))
(setq ss (ssget "_X" '((0 . "ARC"))))
   )
 ...
)

Le if est une habitude (bonne celle là) pour éviter les erreurs s'il n'y avait pas de jeu de sélection.

Le or permet, si l'utilisateur fait Entré Espace ou clic droit au lieu de faire une sélection, de faire une sélection dans tout le dessin (ssget "_X" ...)

On pourrait écrire de manière plus explicite :

(princ "\nSélectionnez les arcs ou : ")
(if (not (setq ss (ssget '((0 . "ARC")))))
 (setq ss (ssget "_X" '((0 . "ARC"))))
)
(if ss
 ...
)

 

Pour le traitement du jeu de sélection, on peut utiliser soit une boucle repeat soit une boucle while

Les deux demandent d'initialiser un indice (n) qui est ensuite incrémenté (ou décrémenté) pour être passé comme argument à ssname.

L'initialisation de n demande une ligne de plus et comme on est dans une expression if, il faudrait inclure tout ça dans un progn.

On peut éviter le progn en utilisant repeat :

(repeat (setq n (sslength ss))
 (setq ent (ssname ss (setq n (1- n))))
 ...
)

Mais ce n'est pas très explicite non plus et while est un peu plus rapide que repeat alors j'ai voulu imbriquer l'initialisation ou l'incrémentation de n dans l'expression test de while.

(while (setq arc (ssname ss (setq n (if n (1+ n) 0))))
 ...
)

Au premier appel, n est nil donc l'expression : (if n (1+ n) 0) retourne 0 à (ssname ...) et la première entité du jeu de sélection est affectée à la variable arc qui se retrouve non nil donc on entre dans la boucle.

Aux appels suivants l'expression (if n (1+ n) 0) incrémente n (qui n'est plus nil). n est passé à (ssname ...) et tant que l'indice correspond à une entité du jeu de sélection la boucle continue. Quand n arrive à une valeur pour laquelle il n'y a plus d'entité ssname retourne nil donc (setq arc ...) aussi, donc on sort de la boucle.

 

(entmake (cons '(0 . "CIRCLE")
       (vl-remove-if
	 '(lambda (x)
	    (member (car x) '(-1 0 330 5 100 50 51))
	  )
	 (entget arc)
       )
 )
)

Les liste DXF des arcs et des cercles ne diffèrent que par leurs groupes -1 0 330 5 100 50 51. En supprimant ces groupes avec vl-remove-if sur la liste DXF de l'arc, il est jute nécessaire d'ajouter la paire (0 . "CIRCLE") en début de liste avec cons pour obtenir une liste susceptible de créer le cercle avec entmake. Cette méthode permet d'attribuer au cercle toute les propriétés de l'arc (espace, calque, couleur etc...).

 

En espérant avoir été clair...

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Très clair , merci , t'es top. C'est très intéressant de voir comme tu arrives à tirer le meilleur du language lisp, ça en devient artistique, la recherche de la perfection et de la beauté sont des expressions de l'Amour.Bon exemple à suivre.

Tout ça me donne envie d' apprendre , j'aurai grand besoin d'une formation lisp pour aller plus loin que mon niveau "école primaire", enfin bon c'est une autre histoire.

Salut et encore merci pour ton aide sur les forums.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tout ça me donne envie d' apprendre , j'aurai grand besoin d'une formation lisp pour aller plus loin que mon niveau "école primaire", enfin bon c'est une autre histoire.

 

À mon avis, tu as niveau largement au delà de "l'école primaire", il suffit de voir ce que tu diffuse ici.

 

Pour ce qui est du style, c'est vrai que j'y suis très (trop) sensible, mais c'est un peu à double tranchant comme dit plus haut (ça peut nuire à la compréhension du code).

 

J'ai énormément appris en lisant des codes écris pas certains de mes "grand maîtres" : Reini Urban, Vladimir Nesterovsky,Tony Tanzillo, Michael Puckett, Elpanov Evgeniy (et j'en oublie...)

La pureté du style se remarque plus facilement dans des routines courtes comme celles données dans la FAQ AutoLISP de Reini Urban ou dans les challenges LISP de TheSwamp ou CADxp.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é