Aller au contenu

lisp dans autocad donnant la somme des polylignes dans un dessin


jeanpoco

Messages recommandés

 

Bonjour,

 

Je suis à la recherche d'une routine,d'un lisp ou d'un programme, donnant dans un dessin autocad le nombre total de polylignes, lainsi que leur somme totale.

Pour info,je pourrais utiliser les CHAMPS ,combinés à un TABLEAU....mais un peu long quand on a un cinquantaine de polylignes..

 

Merci pour vos idées.

 

POCO.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

((lambda (/ ss n long obj)
  (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
    (progn
      (setq n (sslength ss))
      (princ
 (strcat "\nLe dessin contient : " (itoa n) " polylignes, ")
      )
      (setq long 0.0)
      (repeat n
 (setq obj  (vlax-ename->vla-object (ssname ss (setq n (1- n))))
       long (+ long
	       (vlax-curve-getDistAtParam
		 obj
		 (vlax-curve-getEndParam obj)
	       )
	    )
 )
      )
      (princ (strcat "d'une longueur totale de : " (rtos long)))
    )
  )
  (princ)
)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Comme je ne savais pas ce que tu voulais exactement, j'ai juste donné ces quelques lignes comme exemple.

C'est une fonction lambda, tu copies tout le code, tu le colles sur la ligne de commade et tu tapes ENTER. Le nombre de polylignes et la longueur totale s'affichera sur la ligne de commande.

 

Si la fonction te conviens en l'état et que tu veux t'en faire une commande,colle le code dans le bloc note et remplace :

 

((lambda

 

au début du code, par :

 

(defun c:MaFonction

 

(tu peux remplacer MaFonction par ce que tu veux en évitant les nom de commandes déjà définis)

 

et supprime la dernière paranthèse (il doit y avoir autant de paranthèses ouvrantes que de fermantes).

 

Puis enregistre le fichier avec l'extension .lsp et charge le dans AutoCAD. Ils uffit ensuite de taper "MaFonction" ou ce que tu auras mis derrière c: dans le defun).

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

Lien vers le commentaire
Partager sur d’autres sites

Salut Gile,

 

J'ai bien suivi tes instructions et a bien incorporé ton programme dans autocad.

J'ai le resultat siuvant: "Le dessin contient : 2 polylignes, d'une longueur totale de : 30" ....(par exemple)

.Serait il possible la longueur de chaque polyligne....P1=...P2=...,en plus de la longueur toale.

 

Merci.

 

POCO

 

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

((lambda (/ ss tot n long obj lst)
  (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
    (progn
      (setq n (sslength ss))
      (princ
 (strcat "\n\nLe dessin contient : " (itoa n) " polylignes")
      )
      (setq tot 0.0)
      (repeat n
 (setq obj  (vlax-ename->vla-object (ssname ss (setq n (1- n))))
       long (vlax-curve-getDistAtParam
		 obj
		 (vlax-curve-getEndParam obj)
	       )
       lst (cons (strcat "P" (itoa (1+ n)) " = " (rtos long)) lst)
       tot (+ tot long)
 )
      )
      (mapcar 'print lst)
      (princ (strcat "\nLongueur totale = " (rtos tot)))
      (textscr)
    )
    (princ "\nLe dessin ne contient pas de polylignes.")
  )
  (princ)
)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

slt....

 

je doit etre un peu neuneu.....

 

si je colle ta fonction lambda, j'ai un message:

 

Le dessin contient : 6 polylignes; erreur: no function definition:

VLAX-ENAME->VLA-OBJECT

 

pareil si je fait un fichier lisp...

 

de plus, un truc qui serai géant, se serai que la somme des poly tienne compte des calques... pour sortir les réseaux vrd... du genre

somme des EU:....

somme des EP:...

.

.

.

 

sinon? est ce que la fonction tien compte des calques non alumés? de manière a pouvoir la lancer sur chaque calque...

 

edit..................

 

harf.. je vien de voir le titre du forum... je suis sous 2006... sans doute pour ça que ça tourne pas. :(

 

[Edité le 1/10/2006 par x_all]

Lien vers le commentaire
Partager sur d’autres sites

Salut x_all,

 

je suis sous 2006... sans doute pour ça que ça tourne pas.

Ça devrait tourner sous 2006 sans problème, j'ai effectivement oublié de glisser un (vl-load-com) en début de routine, mais il me semble que ceci n'est plus nécéssaire depuis les versions 2004.

 

sinon? est ce que la fonction tien compte des calques non alumés?

 

Telle quelle la routine fonctionne sur tous les calques (actif/inactif, gelé/dégelé, vérouillé/dévérouillé) si tu veux écarter certains calques, il faut remplacer :

(ssget "_X" '((0 . "LWPOLYLINE"))) par :

(ssget "_A" '((0 . "LWPOLYLINE"))), et les calques gelés ne seront pas traités.

 

de plus, un truc qui serai géant, se serai que la somme des poly tienne compte des calques...

 

Quelque chose comme ça ?

 

((lambda (/ ss tot nb n long obj lst lay l_lay)
  (vl-load-com)
  (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
    (progn
      (setq nb (sslength ss)
     n 0
     tot 0.0)
      (princ
 (strcat "\n\nLe dessin contient : " (itoa nb) " polylignes")
      )
      (repeat nb
 (setq obj  (vlax-ename->vla-object (ssname ss n))
       long (vlax-curve-getDistAtParam
	      obj
	      (vlax-curve-getEndParam obj)
	    )
       tot  (+ tot long)
       lay (vla-get-Layer obj)
 )
 (princ	(strcat	"\nP"
		(itoa (setq n (1+ n)))
		" = "
		(rtos long)
		"\tCalque : "
		lay
	)
 )
 (if (setq l_lay (assoc lay lst))
   (setq lst (subst (cons lay (+ long (cdr l_lay))) l_lay lst))
   (setq lst (cons (cons lay long) lst))
 )
      )
      (mapcar '(lambda	(x)
	  (princ (strcat "\nLongueur totale sur le calque "
			 (car x)
			 " : "
			 (rtos (cdr x))
		 )
	  )
	)
       lst
      )
      (princ (strcat "\nLongueur totale dans le dessin = " (rtos tot)))
      (textscr)
    )
    (princ "\nLe dessin ne contient pas de polylignes.")
  )
  (princ)
)
) 

 

[Edité le 1/10/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...
  • 9 mois après...

Pour reprendre et pour compliquer l'affaire,

 

comment peut-on faire pour generer la somme des surfaces de plusieurs polylignes dans un bloc dynamic avec attributs;

 

du genre la surface de l'appartement apparait sur le plan et est calculée selon les polylignes de l'ensemble des pièces.

 

Si quelqu'un peut m'aider...

 

Un grand merci !

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é