Aller au contenu

Messages recommandés

Posté(e)

bonjour

 

es ce qu'il existe une commande pour transformer tous les arc de cercle contenus ds un dessin en cercle automatiquement en les selectionnant en groupe?

 

merci

 

[Edité le 11/5/2009 par haithem]

Posté(e)

Bonjour,

 

Regardes cette réponse

 

Bien qu'ancienne, je pense qu'elle conviendra bien à ta demande.

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

Posté(e)

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+

Posté(e)

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

Posté(e)

Bonjour,

J'aimerai , si tu le veux bien (gile) et si tu as le temps, que tu nous expliques comment fonctionne ton lisp car je n'arrive déjà pas à comprendre ce qui se passe au niveau des ssget , alors la suite ?

Posté(e)

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

Posté(e)

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.

Posté(e)

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

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é