Aller au contenu

petite routine


philsogood

Messages recommandés

hello,

je souhaiterai savoir si l'un d'entre vous aurait, dans un grand élan de générosité, le temps pour me faire une routine assez simple : pouvoir forcer la couleur et le type de ligne d'une sélection d'objets en couleur 252 caché

vous auriez toute ma gratitude... ça ne doit aps prendre très logntemps à faire mais... et puis je ne travaille plus ou rpesque sur AutoCAD, j'ai été asspiré par le BIM... qui me amnge bcp de temps (sans même toucher à dynamo)

merci à vous

PS : didier, je vais aussi suivre pendant mon temps libre des cours de limitation de faute de frappes... ça va être bon ça!! 🙂

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Essaye ceci (non testé) :

(defun c:Force>COLOR+LTYPE (/ jsel i name entlist co lt n subprop)

	(defun subprop (entlist tag value)

		(if (assoc tag entlist)
			(subst
				(cons tag value)
				(assoc tag entlist)
				entlist
			)
			(append
				entlist
				(list (cons tag value))
			)
		)

	)

	(if (setq n 0
		  co 252
		  lt "Cache"
		  jsel (ssget)
	    )
		(progn
			(repeat (setq i (sslength jsel))
				(setq name (ssname jsel (setq i (1- i)))
				      entlist (entget name)
				      entlist (subprop entlist 62 co)
				      entlist (subprop entlist 6 lt)
				      entlist	(vl-remove-if
							'(lambda (x)
							 	(member (car x) '(420 430))
							 )
							entlist
						)
				)
				(if (entmod entlist) (setq n (1+ n)))
			)
			(prompt	(strcat	"\nUn total de "
					(itoa n)
					" / "
					(itoa (sslength jsel))
					" objets ont été modifiés avec succès."
				)
			)
		)
	)
	(princ)

)

Il n'y a pas de vérification sur l'existence du type de ligne dans le dessin mais je doute que cela soit nécessaire. La couleur et le type de ligne sont définis en argument pour pouvoir les modifier à tout moment depuis l'IDE. J'ai également ajouté la suppression des codes 420 et 430 au cas où (je ne sais pas comment se comporte l'entité si on modifie son code 62 alors qu'elle possède un code 420 et/ou 430. Tu peux également te remove le (prompt) si pas besoin (c'est juste par habitude que je fais chat)

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Vui, j'ai testé rapidement chat ne modifie pas l'objet voilà tout (pas d'erreur en soit donc pas de sushis !), en revanche étant donné que j'entmod uniquement à la fin, si le type de ligne n'existe pas, la couleur n'est pas forcée non plus donc à modifier éventuellement selon les besoins de chacun :3

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

un petit truc en VLA pour l'exemple

(vl-load-com)
(defun c:ptitruc (/ ss)
  (if (ssget)
   (progn
    (vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
      (vla-put-color obj 252)
      (vla-put-Linetype obj (load-line-type "CACHE" "acad.lin"))
    )
    (vla-delete ss)
   )
  )
)
(defun load-line-type ( typ fil / lin)
    (setq lin (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object))))
    (and (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list lin typ)))
         (vla-load lin typ (findfile fil))
    )
    typ
)

 

Lien vers le commentaire
Partager sur d’autres sites

@Fraid Juste deux petites remarques, si je peux me permettre :

1. il me semble qu'on peut tout simplement faire : (vla-put-Color obj 252)

2. quand on utilise : vla-get-ActiveSelectionSet (plus généralement un jeu de sélection COM) il est préférable de le supprimer avec vla-Delete. Le nombre de jeu de sélection actifs est limité à 128, avec AutoLISP (vanilla) le jeu est supprimé en même temps que la variable à laquelle il est assigné, mais avec COM, il faut le faire explicitement.

(if (ssget)
  (progn
    (vlax-for obj (setq ss (vla-get-activeselectionset acdc))
      (vla-put-color obj 252)
      (vla-put-Linetype obj (load-line-type "CACHE" "acad.lin"))
    )
    (vla-delete ss)
  )
)

 

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

Lien vers le commentaire
Partager sur d’autres sites

1 hour ago, Fraid said:

la suppression de la sélection est une découverte...

Quand on veut faire un jeu de sélection en VBA (ou, si on est maso, en "pur vlisp') il faut créer un objet SelectionSet nommé et l'ajouter à la collection des jeux de sélection du dessin. Cette collection a une capacité limitée à 128 objets. Quand en vlisp on appelle vla-get-ActiveSelection le jeu de sélection courant est automatiquement ajouté à cette collection (avec un nom incrémenté comme les blocs ou les groupes anonymes, j'imagine) et, si on ne le supprime pas explicitement avec vla-Delete, restera dans la collection pendant toute la session. Et, quand la coupe collection est pleine, ça déborde plante.

Un exemple sur cette page, permet de voir la différence entre VBA et .NET.
En .NET (comme en LISP), il n'est ni besoin de nommer le jeu de sélection, ni de l'ajouter à une collection, ni de le supprimer quand on n'en plus besoin. Au passage on voit clairement que VB .NET est plus proche de C# que de de VBA.

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

Lien vers le commentaire
Partager sur d’autres sites

13 hours ago, (gile) said:

Cette collection a une capacité limitée à 128 objets

Cela me rappelle le nombre de plans que j'arrive à ouvrir et fermer avant "plantage" 

est ce lié?

13 hours ago, (gile) said:

Un exemple sur cette page,

Une vrais pierre de Rosette cette page.

J'en ai profité pour allez voir l'aide sur activeselectionset, il n'en parle pas...encore un oublie ou est ce volontaire de leur part?

on commence à se poser des questions de conspirationniste

Lien vers le commentaire
Partager sur d’autres sites

18 hours ago, (gile) said:

Quand on veut faire un jeu de sélection en VBA (ou, si on est maso, en "pur vlisp') il faut créer un objet SelectionSet nommé et l'ajouter à la collection des jeux de sélection du dessin. Cette collection a une capacité limitée à 128 objets. Quand en vlisp on appelle vla-get-ActiveSelection le jeu de sélection courant est automatiquement ajouté à cette collection (avec un nom incrémenté comme les blocs ou les groupes anonymes, j'imagine) et, si on ne le supprime pas explicitement avec vla-Delete, restera dans la collection pendant toute la session. Et, quand la coupe collection est pleine, ça déborde plante.

Un exemple sur cette page, permet de voir la différence entre VBA et .NET.
En .NET (comme en LISP), il n'est ni besoin de nommer le jeu de sélection, ni de l'ajouter à une collection, ni de le supprimer quand on n'en plus besoin. Au passage on voit clairement que VB .NET est plus proche de C# que de de VBA.

J'ai lu ! c'est très instructif !

(Personnellement, je n'ai pas encore eu besoin de travailler sur cette méthode en VBA)

Le C# et le VB.NET sont "visuellement" / "structurellement" plus propre que le lisp pour moi...

(je comprends plus de choses que quand je vois du lisp)

en tout je te remercie pour ces exemples !

 

Lien vers le commentaire
Partager sur d’autres sites

  • 6 mois après...

Hello

La commande native  "DEFDUCALQUE / _SETBYLAYER" (qui existe depuis AutoCAD 2008) et son option  "PArametres"  ne te suffit pas !?

https://knowledge.autodesk.com/fr/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2019/FRA/AutoCAD-Core/files/GUID-A9D9FF14-4EF6-4A25-B0F4-506C6B792E9E-htm.html

https://howtoautocad.com/the-setbylayer-command/

La Sante, Bye, lecrabe

 

Autodesk Expert Elite Team

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é