Aller au contenu

ROUTINE LISP


Chris24

Messages recommandés

Bonjour à toutes et à tous,

Je cherche une petite routine lisp qui me permettrai de changer un type de ligne par une autre,comme cette petite routine

(defun c:chtl (/ ss)  (if (setq ss (ssget "_I" '((6 . "nom_du_type_de_ligne"))))
(sssetfirst nil ss)
(sssetfirst nil (ssget "_X" (list (cons 6 "nom_du_type_de_ligne") (cons 410 (getvar "ctab")))))
)  
 (princ)
 )

mais, me permettre de taper le nom du type de ligne avec getstring je penseVoilà.

Merci pour votre aide.

Chris24

@+

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

(getstring) est bien pensé.

 

Mais une chose que tu ne dis pas. Ces types de ligne sont appliqués aux calques ou sont forcé par entités.La gestion n'est pas la même.

 

Ton code à l'air de vouloir s'appliquer a des entités forcées, mais sache que le code DXF 6 n'est défini que si le type de ligne est différent de "DuCalque"

Donc par exemple (ssget '((6 . "BYLAYER"))) retournera toujours une sélection vide même si des entités ayant le type de ligne "ducalque" existent dans le dessin.

Des précisions?

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour et merci pour ta réponse Bonuscad,

En fait, je souhaiterais sélectionner un type de ligne présent sur tout mon dessin, ducalque, forcé, même sur des bloc, et ensuite les remplacer par un autre type de ligne.

Imagine que sur des plan archi que je nettoie, il y a plusieurs type de ligne qui représente la même chose, mon but est de mettre un seule type de ligne.

L'algorithme

defun c:chtl
choix de l'utilisateur "\nNom du type de ligne à remplacer: "
nombres trouvés
choix de l'utilisateur "\nRemplacer le nombre trouver par: "
(princ)

 

Et si on veux pousser un peu, avoir la possibilité de choisir plusieurs types de lignes et les remplacer par une seul

 

L'algorithme
defun c:chtl
choix de l'utilisateur "\nNom des types de ligne à remplacer: "
nombres trouvés
choix de l'utilisateur "\nRemplacer le nombre trouver par: "
(princ)

Chris24

@+

Lien vers le commentaire
Partager sur d’autres sites

  • 5 mois après...

Bonjour,

 

Je sais que cela ne correspond pas parfaitement à ta demande, mais ce code m'a permis de modifier le calque des sous-entités composant chaque définition de bloc en spécifiant l'ancien calque (1er argument) et le nouveau (2nd argument). Le 3ème argument permet juste d'afficher ou non le résultat dans la barre de commande (doit être égal à "prompt" pour fonctionner).

 

(defun BlockEntity_Layer (search replace Display / Bloc_name_List Bloc_name Bloc_Data EntB EntB_DXF)

(setq Bloc_name_List (flt_tbl "BLOCK" "*")
      Ent_Obj 0
)
(if (not Nb_Obj) (setq Nb_Obj 0))
(if (= Display "prompt") (setq Bloc_List nil))
(foreach Bloc_name Bloc_name_List
	(setq Bloc_Data (tblsearch "BLOCK" Bloc_name)
	      EntB (cdr (assoc -2 Bloc_Data))
	      EntB_DXF (entget EntB)
	)
	(if (wcmatch (cdr (assoc 8 EntB_DXF)) search)
		(progn
			(setq EntB_DXF (subst (cons 8 replace) (assoc 8 EntB_DXF) EntB_DXF))
			(entmod EntB_DXF)
			(entupd EntB)
			(setq Nb_Obj (1+ Nb_Obj)
			      Ent_Obj (1+ Ent_Obj)
			      Bloc_List (cons (cdr (assoc 2 Bloc_Data)) Bloc_List)
			)
		)
	)
	(while (setq EntB (entnext EntB))
		(setq EntB_DXF (entget EntB))
		(if (wcmatch (cdr (assoc 8 EntB_DXF)) search)
			(progn
				(setq EntB_DXF (subst (cons 8 replace) (assoc 8 EntB_DXF) EntB_DXF))
				(entmod EntB_DXF)
				(entupd EntB)
				(setq Nb_Obj (1+ Nb_Obj)
				      Ent_Obj (1+ Ent_Obj)
				      Bloc_List (cons (cdr (assoc 2 Bloc_Data)) Bloc_List)
				)
			)
		)
	)
)
(if (= Display "prompt")
	(prompt
		(strcat "\nLa fonction BlockEntity_Layer a trouvé "
			(itoa Ent_Obj)
			" objets sur le calque "
			"\""
			search
			"\""
			", remplacé par le calque "
			"\""
			replace
			"\""
			"."
			"\n"
			"\nVoici la liste des blocs ayant été modifié (les blocs dynamiques apparaîssent sous la forme \"*U###\" ou \"*D###\") :"
			(if Bloc_List (DXF_List Bloc_List "\n  - " "left" "Tri" "") "")
			"\n"
		)
	)
)

)

 

C'est encore un peu bancal et comme l'a spécifié BonusCad, les types de lignes "BYLAYER" ne sont pas sélectionnable par un filtre de sélection donc il reste encore du taf ;p

 

Pour le reste des objets de la base de données (obtenus avec (ssget "_X")) j'utilise la commande "_CHPROP" applicable à un jeu de sélection (donc simple d'utilisation) et d'ici tu devrais pouvoir modifier le type de ligne (même s'il s'agit du type "BYLAYER").

 

Cependant, pour une routine de ce genre, le plus simple reste encore de modifier les propriétés des calques, auquel cas, en sélectionnant l'objet, il faut récupérer le nom de son calque et vérifier si son type de ligne est forcé ou non. Si le type de ligne (assoc 6) retourne nil, alors il faut modifier le type de ligne du calque nommé (on peut accéder aux propriétés du calque grâce à la fonction (tblsearch "LAYER" nomcalque)).

 

Après je suis débutant donc je commencerais par là, sans savoir si ce chemin mènera à un échec cuisant ou une victoire écrasante ^^

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é