Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous

Je suis novice avec le LISP aussi je m'adresse à vous pour m'aiguiller.

Lorsque je veux saisir tous les objets d'un calque, par exemple, j'écris:

[surligneur](setq a (ssegt "x" '((8 . "nom du calque"))))[/surligneur]

de même pour les polylignes avec le code 6 et le nom du type de ligne ; pour çà pas de problème, mais lorsque que je veux sélectionner toutes les lignes ayant la même longueur, là je n'y arrive pas. Quelqu'un aurait t'il la solution ?

merci d'avance.

Posté(e)

Salut,

 

Dans un filtre de sélection, on ne peut utiliser que les données DXF. La longueur d'une ligne ne fait pas parti des données DXF de la ligne (voir Aide aux développeurs >Référence DXF > Section ENTITIES.

 

Il faut donc a près avoir fait ton jeu de sélection, le parcourir pour en supprimer les lies lignes qui n'auraient pas la longueur voulue

 

;; sélection de toutes les lignes
(setq a (ssget "_X" '((0 . "LINE"))))

;; mise à 0 du compteur
(setq n 0)

;; tant qu'il reste une ligne dans le jeu de sélection
(while (setq l (ssname a n))

 ;; si la longuer de la ligne est égale à 100.0 ...
 (if (= (distance (cdr (assoc 10 (entget l)))
	   (cdr (assoc 11 (entget l)))
 )
 100.0
     )
 
   ;; ... on ajoute 1 au compteur
   (setq n (1+ n))

   ;; sinon, on supprime la ligne du jeu de sélection
   (ssdel l a)
 )
) 

 

NOTA : tu peux utiliser equal à la place de = et ajouter une tolérance dans la comparaison.

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

Posté(e)

Si ton besoin est de ne sélectionner que par leur longueur, la commande SELECTRAP (_QSELECT) permet de faire ce type de sélection.

 

Si ton besoin est une sélection dans une routine lisp, la boite de dialogue de _QSelect devient gênante et la méthode en ligne de code est indispensable.

 

Il y avait aussi ce sujet similaire

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

Posté(e)

Merci encore pour vos réponses aussi rapide. Ce que j'essaie de faire est un travail fastidieux que je voudrais rendre moins pénible avec une seule commande.

 

Je reçois chaque année de l'Hôtel des impôts des fichiers de toutes les sections cadastrales de notre communauté de commune et je dois transformer ceux-ci en changeant les couleurs des calques, les types de ligne et ajouter des hachures sur les bâtiments.

Pour ces dernières j'ai un Lisp qui fonctionne très bien car il m'oriente ces hachures à 45° par rapport à chaque bâtiment à l'aide du SCU. Le problème est qu'avec ces planches cadastrales le SCU ne tourne pas et j'ai découvert pourquoi. Lorsque je décompose les polylignes des bâtiments je me retrouve, pour un bâti rectangulaire, avec 5 lignes dont une de longueur 0 et c'est ce dernier segment qui fait perdre la boule au SCU. Après l'avoir supprimé, je reforme mes polylignes avec la commande Pedit et seulement à ce moment là le SCU refonctionne. Toutes ces manips me prennent du temps et je voudrais exécuter un programme qui me fasse tout d'un seul clic. J'ai commencé à faire quelques petites manips qui fonctionnent seules mais je n'arrive pas à les assembler pour ne faire qu'une seule commande.

D'abord je créé un nom pour ma commande

[surligneur](defun c:NOM() [/surligneur]

Je charge tous les types de ligne

[surligneur](command"-typeligne""ch" "*" """""""")[/surligneur]

puis je fais un ZOOM étendu

[surligneur](command "zoom""et")[/surligneur]

je sélectionne tous les objets du calque "3BATIDUR" en l'occurence des polylignes puisqu'il n'y a que çà dans cette couche.

[surligneur](setq a(ssget "X" '((8 . "3BATIDUR"))))[/surligneur]

que je décompose

[surligneur](command "decompos" a)[/surligneur]

Ensuite je sélectionne toutes les lignes de longueurs égales à 0 (programme que Gile m'a gentiment réalisé et dont j'ai modifié la longueurs.

[surligneur](setq a (ssget "_X" '((0 . "LINE"))))

(setq n 0)

(while (setq l (ssname a n))

(if (= (distance (cdr (assoc 10 (entget l)))

(cdr (assoc 11 (entget l)))

)

0

)

(setq n (1+ n))

(ssdel l a)

)

)[/surligneur]

puis je les supprime

[surligneur](command "del" a)[/surligneur]

Je resélectionne à nouveau les lignes du calque 3BATIDUR que je retransforme en polyligne.

[surligneur](setq a(ssget "X" '((8 . "3BATIDUR"))))

(commad "pedit" "m" a "j" "" "t")[/surligneur]

Je change la couleur des couches

[surligneur](setvar "CLAYER" "3BATIDUR")

(command "calque""couleur""7""""")[/surligneur]

et je créé la couche 3HACHURES avec sa couleur

[surligneur](command "calque" "N""3HACHURES""")

(setvar "CLAYER" "3HACHURES")

(command "calque""couleur""8""""ch""0""")[/surligneur]

Je trace mes hachures sur le bati

[surligneur](setq objsel (ssget "X" '((8 . "3BATIDUR"))))

(setq calquecourant (getvar "CLAYER"))

(setvar "CLAYER" "3HACHURES")

(setq n 0)

(repeat (sslength objsel)

(setq nomobj (ssname objsel n))

(command "scu" "ob" nomobj)

(command "hachures""U""50""0.7" "n" nomobj "")

(setq n (+ 1 n))

)

(command "scu" "g")

(setvar "CLAYER" calquecourant)[/surligneur]

puis je purge le dessin du superflu

[surligneur](command "purge" "tout")[/surligneur]

Enfin j'ajoute un prompt pour le chargement de l'application

[surligneur](princ "\nTaper «NOM» pour lancer l'éxécution du programme.")

(princ)[/surligneur]

Tous ces prog fonctionnent indépendemment mais lorsque je veux les assembler, bien que le chargement de l'application s'effectue correctement, çà ne veux pas aller jusqu'au bout. Le chargement des types de ligne et le Zoom s'effectuent correctement puis plus rien .

Pourriez-vous me dégrossir ce truc car je n'arrive pas à comprendre d'où vient l'erreur. Je rappelle que je suis novice

Une nouvelle fois Merci d'avance.

Posté(e)

Pour hachurer tes contours je peux te proposer de voir ce post .

 

Il est prévu pour traiter des polylignes seulement fermées.

 

Si tu peux isoler tes contours pour les sélectionner d'un seul coup, je peut te proposer une légère modification du code (suppression du code 70 dans le filtre de sélection) pour que cela fonctionne avec tes polylignes fermées par un segment de longueur nul, sans que tu sois obligé de les traiter avec une décomposition, suppression du segment nul et recomposition du contour.

 

Donc essayes ce code, j'espère qu'il fonctionnera, s'il fonctionne les défaut de paramétrage (s'il y en a) seront facile a adapter.

 

(defun c:multi_hatch-45 ( / js n model_hatch scale_hatch ang_hatch ent dxf_ent lst_pt lst_d where alpha)
(setq js (ssget '((0 . "LWPOLYLINE"))))
(cond
	(js
		(setq
			n -1
			model_hatch (getvar "HPNAME")
			scale_hatch (getvar "HPSCALE")
			ang_hatch (getvar "HPANG")
		)
		(setvar "HPNAME" "ANSI31")
		(setvar "HPSCALE" (* (getvar "HPSCALE") (getvar "DIMSCALE")))
		(repeat (sslength js)
			(setq
				ent (ssname js (setq n (1+ n)))
				dxf_ent (entget ent)
				lst_pt (mapcar '(lambda (x) (trans x ent 0)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))
				lst_d (mapcar 'distance lst_pt (cons (last lst_pt) lst_pt))
				where (- (length lst_pt) (length (member (apply 'max lst_d) lst_d)))
				alpha (angle (if (zerop where) (last lst_pt) (nth (1- where) lst_pt)) (nth where lst_pt))
			)
			(setvar "HPANG" (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) alpha scale_hatch) 0 1)))
			(command "_.HATCH" "" "" "" ent "")
		)
		(setvar "HPNAME" model_hatch)
		(setvar "HPSCALE" scale_hatch)
		(setvar "HPANG" ang_hatch)
	)
	(T (princ "\nAucune LWPOLYLINE fermée trouvé !"))
)
(princ)
)

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

Posté(e)

Slt bruno,

 

c'est quoi le code de ta macro car j'ai essayé " multi_hatch-45 " et ça marche pas

 

[surligneur] (defun c:multi_hatch-45 ( / js n model_hatch scale_hatch ang_hatch ent dxf_ent lst_pt lst_d where alpha)

(setq js (ssget '((0 . "LWPOLYLINE"))))

(cond

(js

(setq

n -1

model_hatch (getvar "HPNAME")

scale_hatch (getvar "HPSCALE")

ang_hatch (getvar "HPANG")

)

(setvar "HPNAME" "ANSI31")

(setvar "HPSCALE" (* (getvar "HPSCALE") (getvar "DIMSCALE")))

(repeat (sslength js)

(setq

ent (ssname js (setq n (1+ n)))

dxf_ent (entget ent)

lst_pt (mapcar '(lambda (x) (trans x ent 0)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))

lst_d (mapcar 'distance lst_pt (cons (last lst_pt) lst_pt))

where (- (length lst_pt) (length (member (apply 'max lst_d) lst_d)))

alpha (angle (if (zerop where) (last lst_pt) (nth (1- where) lst_pt)) (nth where lst_pt))

)

(setvar "HPANG" (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) alpha scale_hatch) 0 1)))

(command "_.HATCH" "" "" "" ent "")

)

(setvar "HPNAME" model_hatch)

(setvar "HPSCALE" scale_hatch)

(setvar "HPANG" ang_hatch)

)

(T (princ "\nAucune LWPOLYLINE fermée trouvé !"))

)

(princ)

)[/surligneur]

Posté(e)

c'est quoi le code de ta macro car j'ai essayé " multi_hatch-45 " et ça marche pas

 

Le code que j'ai proposé était destiné au cas particulier de chti52 qui a (d'après ce que j'ai compris) des polylignes ouvertes mais dessiné de manière fermées (option "Clore" non utilisé) et comportant en plus à l'endroit de la fermeture un segment de longueur nulle. Une plaie quoi !

 

Donc ici le filtre n'est pas bon pour un usage général, car hachurer un contour ouvert rique fort de ne pas fonctionner.

 

Si tu veux l'essayer, regarde plutôt le code ORIGINAL

Vérifie aussi que la variable DIMSCALE soit différente de 0.0

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

Posté(e)

Bonsoir

j'ai essayé multi_hatch-45 mais çà ne fonctionne qu'avec une seule entité à la fois. Lorsque je saisis toutes les polylignes en même temps j'ai ce message

Aucune LWPOLYLINE fermée trouvé !

Je te remercie BonusCad pour cette aide mais ma commande fonctionne très bien, il faut simplement que je décompose les polylignes et les recrée après avoir supprimé les vecteurs nuls avant de la mettre en application. Si je ne les décompose pas, le prog me trace toutes les hachures à 45° dans le SCU général.

Le but de ma requête je l'ai expliqué plus haut, c'est de charger mes types de ligne, de faire un zoom étendu car je n'ai pas le dessin à l'écran lorsque je l'ouvre, de saisir toutes les polylignes du calque, de les décomposer, de saisir les lignes de longueur nulle, de recréer les polylignes fermées, de changer la couleur et le type de ligne de certains calques, d'en créer un pour les hachures, de hachurer les polylignes fermées qui iront directement se mettre dans le calque hachures, de purger le tout et enfin de faire une sauvegarde, tout çà avec un seul programme car étant donné le nombre important de planches cadastrales à modifier je ne serai pas au bout de mes peines d'autant que je dois remettre çà tous les ans.

J'essaie quand même de mon coté de monter ce prog.

Je vous suis très reconnaissant pour l'aide que vous m'apportez.

Posté(e)

J'essaie quand même de mon coté de monter ce prog.

 

Bravo, c'est tout à ton honneur, et c'est comme cela qu'on progresse.

 

Pour ma routine tu m'intrigues, peut être veut tu traiter des anciennes polylignes et non des polylignes optimisées (POLYLINE au lieu de LWPOLYLINE)

 

Le chargement des types de ligne et le Zoom s'effectuent correctement puis plus rien .

 

Donc pour revenir a ton problème, cela vient peut être d'ici:

[surligneur](command "decompos" a) [/surligneur]

 

Suivant la valeur de la variable QAFLAGS (non documenté), la commande "decompos" n'explose pas un jeux de sélection, mais seulement une entité.

 

Soit du fait une boucle pour décomposer une à une tes entités, soit tu changes la variables QAFLAGS temporairement.

Je te conseille plutôt la 1ère solution, utiliser une variable non-documenté peut se révéler dangereux sur le comportement d'autocad.

 

Fait une recherche sur le forum au sujet de QAFLAGS si tu veux plus d'informations.

 

Bon montage de ton code ;)

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

Posté(e)

Bonsoir BonusCad

C'est bien des POLYLINE et non des LWPOLYLINE . Cà n'est pas grave car ton lisp me servira pour d'autres dessins.

En effet tu as vu juste pour la commande "décompos", elle n'explose qu'une entité et arrête le prog. Je vais faire comme tu as dis, je vais les exploser en boucle.

Merci encore.

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é