Aller au contenu

Messages recommandés

Posté(e)

Bonjour...

 

je suis une buse en lisp, et j'ai bricoler un bout de code pour faire des liste de longueur par calque (je sais plus si je l'a pas réupéré qq par en fait...)

 

bref ce lisp fait une somme des longueurs de lignes et polyligne par calque... rien de bien méchant.

 

mon soucis, c'est que la somme tient compte des lignes qui sont dans les espaces papier des présentations !!!

pas cool pour les métrés...

 

à la réflexion, le lisp "Special_selections.lsp" de (gile) fait de même, quand je suis en EO et que je fait un ssl sur le calque A, les entitées sont sélectionnées aussi dans l'espace papier (faire l'expérience dans un dessin vide avec 1 ligne en EO et une en EP...) le SSL renvoie 2 entitée mais si on fait suprimer ou déplacer , seulle celle de l'EO est afféctée (ouf, mais je m'en serai rendu compte plustot :) )

 

Comment résoudre ce pb d'espace? qui me dézingue mes métrés

 

((defun c:lgr (/ ss tot nb n long obj lst lay l_lay)
  (vl-load-com)
  (if (setq ss (ssget "_A" '((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)
)
) 

Posté(e)

Pour ma part, je préfère cette syntaxe qui offrirait plus de souplesse, tient compte de l'onglet et de l'espace courant.

(setq ss
(ssget "_A"
	(list
		'(0 . "LWPOLYLINE")
		(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
		(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
	)
)
)

 

((defun c:lgr

Pas très utile la double parenthèse encadrant defun ...

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

Posté(e)

ha lala... je sais bien que ssget, c'est la base de tout, mais franchement ... j'ai du mal avec (410 . "Model")...

 

par contre, j'ai récupérer un autre bout que j'ai gréfé (oui je sais à ce niveau de nulité, c'est pas de la programmation, c'est du jardinage) et qui solutionne les 2 problèmes

 

(if (setq ss (ssget (list '(-4 . "<OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR>"))))

 

du coup, je programme me demande une sélection, plus besoin d'effacer la légende, et plus de pb de polyligne en espace papier....

 

mais si tu as qqs instants pour me dire pourquoi je m'endormirai moins bête...

Posté(e)

c'est quand même de la magie...

 

j'ai bien compris (par l'expérience) que ça obligeai à faire une sélection... et j'avais déduis que (410 . "Model") correspondais à l'espace objet.

 

Mais je ne comprend pas ou est le mot clef "faire une selection" dans la commande

(setq ss (ssget (list '(-4 . "<OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR>")))

 

La logique voudrai que que "_A" soit TOUT (que tu filtre en excluant "Model") mais d'ou sort le 410

et que l'appel de "list" oblige à faire une selection (?) mais alors là, les (-4 . "<OR") servent à quoi?? c'est ça que tu appele des entitées "légères"

 

ou trouver une documentation? j'ai entendu parler d'un fichier d'aide aux developpeurs mais apparament il n'est pas dans ma 2009...

Pour moi,autolisp, est une suite de formule magiqueet d'incantation. Quelques adeptes et grand gourous y ont été initié dans le secret de grimoires caché aux yeux du profanes. Je remerci au passage tous les gourou de cadXp, et je comprend bien que vous n'avez pas toujours le temps de nous transmetre dans le détail les trucs et astuce ou même le B A Ba de la syntaxe (même si (gile) fait à fait un gros boulot dans ce sens). Je rale après autocad qui livre une porche sans les clef pour le prix d'une ferrari voir d'une asthon-martin. Alors on a le droit de monter dedans, mais pas de la conduire...

 

Quoi qu'il en soit, ça m'arrange comme ça, en obligeant à faire la sélection, je me retrouve avec une liste des longueurs que j'ai sous les yeux et pas de surprise due soit à un espace papier soit à la légende que j'ai oublier d'éffacer (chose que je devais faire avec le 1er code).

 

autre bizaroîdité... si j'ai des lignes sur le calque 0 d'une Xref elles apparaissent dans mon listing... curieux non?

les voies du lisp sont impénétrables.....

:)

Posté(e)

L'aide aux développeurs est disponible dans le menu ? -> Ressources supplémentaires -> Aide aux Développeurs Autocad.

 

Pour ton dernier exemple, autocad te demande de faire une sélection car tu n'as pas le paramètre "_a" après ssget; si tu le rajoute on ne te demanderas rien.

(setq ss (ssget "_a" (list '(-4 . "<OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR>"))))

 

La syntaxe de ssget est la suivante:

(ssget <methode de sélection> <filtres>)

(ssget) => demande une sélection

(ssget "x") => sélectionne tout

(ssget "_a") => sélectionne tout ce qui est visible

 

à cela s'ajoutent les filtres:

'((0 . "LWPOLYLINE")(410 . "Model")) => toutes les polylignes de l'espace objet

'((0 . "TEXT")) => tous les textes simples

(list '(-4 . "<OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR>")) => selectionne les polyligne et les lignes

'((0 . "LWPOLYLINE")(8 . "toto")) => toutes les polylignes du calque toto

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Posté(e)

Il y a quand même pas mal d'infos dans l'aide pour les notions de base, ou sur des sites comme Afralisp (que je te conseille, si tu comprends l'anglais).

 

Je ne vais donc pas faire un cours sur le Lisp (du moins ce que j'en connais), juste répondre à quelques unes de tes questions sur (ssget).

 

(setq ss (ssget))

va te demander de faire une sélection, et la stocker dans la variable ss.

 

Mais ssget accepte un certain nombre d'options comme _X, ou _A, etc.

Par exemple:

(ssget "_X")

sélectionne d'office tous les objets du dessin (y compris sur des calques gelés ou verrouillés), alors que

(ssget "_A")

sélectionne tous les objets du dessin qui ne sont pas sur des calques gelés.

 

ssget accepte également une liste de filtres permettant de filtrer les objets sélectionnés en fonction de leurs codes DXF (par exemple le code 0 qui correspond au type d'objet, ou le code 410 qui correspond à l'onglet dans lequel se trouve l'objet).

Donc

(ssget "_A" '( (0 . "LINE") ) )

sélectionne toutes les lignes du dessin qui ne sont pas sur des calques gelés.

 

Si plusieurs filtres sont utilisés, l'objet doit correspondre à tous ces critères pour être sélectionné (opérateur ET implicite).

Par exemple

(ssget "_A" '( (0 . "LINE")(410 . "Model") )

sélectionne toutes les lignes du dessin qui ne sont pas sur des calques gelés ET qui se trouvent dans l'onglet Objet.

 

On peut aussi utiliser des caractères génériques comme *, ~, etc.

Par exemple

(ssget "_X" '( (0 . "*LINE,CIRCLE") ) )

sélectionne tous les objets du dessin dont le type est CIRCLE OU se termine par LINE (càd POLYLINE, LINE, LWPOLYLINE, XLINE).

 

Entre parenthèses, une LWPOLYLINE est ce que j'appelle une polyligne "légère".

Elles sont apparues dans la R14, en remplacement des polylignes 2D "lourdes" qui existaient auparavant.

 

Et pour des sélections encore plus sophistiquées, ssget permet également d'utiliser des opérateurs (AND, OR, >, <, etc.) dans les filtres, à l'aide du code -4.

Par exemple

(ssget "_X" '( (0 . "LINE")(-4 . "<OR")(8 . "toto")(8. "test")(-4 . "OR>") ) )

sélectionne toutes les objets qui:

- sont des lignes

ET

- dont le calque (code DXF 8) est toto OU test.

 

Tu peux voir les codes DXF d'un objet de ton dessin en tapant (entget(car(entsel))) dans la ligne de commande, puis en cliquant sur l'objet (appuyer sur F2 si besoin pour voir toute la liste). ;)

Posté(e)

ou lala....

c'est bien ma veine, sur ma 2009 au boulot, le menu ? à disparu suite à un bricolage malhereux... il ne m'avais jamais imaginé en avoir besion connaissant "apropos" et F1... bon va faloir chercher

 

pour vos lumière sur ssget ben merci beaucoup... je me sent un peu moins couillon et du coup je vais rebricoler mon truc pour essayer de lister aussi les surfaces de poly fermée dans le listing...

 

mais ce soir j'ai la flème... j'y suis depuis 7h30 ça suffi comme ça...

 

à suivre....

Posté(e)

Si tu n'as plus le menu, tu peux ouvrir le fichier suivant:

C:\Program Files\Autocad 2009\Help\acad_dev172.chm

 

Pour la liste de toutes les fonctions et leur utilisation, vas dans le menu AutoLISP Reference -> AutoLISP Functions

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

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é