• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Appliquer la fonction lisp aux blocs sélectionnés

psluca91

Guest
Bonjour à tous,

Je m'excuse à l'avance si le sujet a déjà été traité dans d'autres sujets et pour la banalité de la question, mais je n'ai pas été en mesure de trouver un guide ou des discussions qui m'aident dans la fonction de recherche.

J'ai écrit le lisp suivant en prenant le code d'autres lisp trouvés sur le net:
Code:
;; changer de couleur par couche dans la couleur et la couche respectives "0"
(défun c:ccb (/ b_name col)
(setq b_name (cdr (assoc 2 (entier (voiture))))))
(commande "-bedit" b_name)
(setq listobj (ssget "x")

(setq nobj (longueur listobj)

(commande de réglage 0)

(alors que (< nobj control)




(setq obj (entget (ssname listobj control) ))
(couleur de setq (assoc '62 obj))

(si (= couleur zéro)
(progrès)
(setq objlay (assoc '8 obj))
(setq laycol (cdr (assoc '62 (tblsearch "layer")))
(commande "_change" (cdar obj) "_prop" "_color" laycol ")
);
);

(commande de réglage (+ commande 1))

) ; pendant la fermeture du contrôle
(commande "_chprop" "_all" "_layer" 0 "_bclose")
); arrêt de la fermeture
Le lisp fonctionne mais je dois sélectionner les blocs un par un. Comment puis-je effectuer le lisp sur plusieurs blocs à la fois?

Merci d'avance !
 
vous nommez le bloc à changer pour la variable b_name(setq b_name (cdr (assoc 2 (entier (voiture))))))si vous voulez sélectionner plus d'un bloc, vous devez d'abord sélectionner (au moyen d'une chose comme CHAPITRE)
une liste de blocs et les assigner à une variable, nous disons blklist.
pour ne pas mal faire le lisp aller, je recommande un filtrage sur le ssget qui prend seulement les blocs (ssget(0). "bloc"puis compter combien de blocs vous avez sélectionnés (longueur blklist)et un contrôle variable - dire unedéfinir un compteur que nous appellerons Nombre a 0 (sec Nombre 0)

et ensuite emballer tout votre lisp dans une répétition du nombre d'articles que vous avez sur la liste blklist

;; changer de couleur par couche dans la couleur et la couche respectives "0"
(défun c:ccb (/ b_name col)

nombre d'objets de sélection et de calcul multiples(
répéter une(sec _Nom nom Nombre de blklists)
(
sec Nombre (+ nombre) 1))
.... votre lisp

) ; fermeture des répétitions

); arrêt de la fermeture
 
Crystal, je vous remercie pour la réponse rapide !

J'ai essayé de créer le code à partir de votre suggestion, mais j'ai trouvé des erreurs :

- si elle est imposée (setq blklist (ssget '(0 . " bloc"))), elle m'exclut de la sélection (y compris les blocs) et je ne peux donc pas démarrer le lisp qui me donne l'erreur suivante: "sélectionner les objets : ; erreur : mauvais type d'argument : lselsetp zéro".

- si je supprime le filtre "bloc" et sélectionne manuellement les blocs, cela me donne toujours la même erreur... .

Je vais récupérer le code.
Code:
;;cambia colore blocco e couche 0
(défun c:ccb4 (/ b_name col)
(setq blklist (ssget))

(setq num (longueur de la liste))

(compte de setq 0)

(répète
(setq b_name ssname blklist count)
(nombre fixe (+ nombre 1))
(commande "-bedit" b_name)
(setq listaobj (ssget "x")

(setq nobj (longueur listaobj))

(setq controllo 0)

(alors que (< controllo nobj)




(setq obj (entget (ssname listaobj controllo) ))
(couleur de setq (assoc '62 obj))

(si (= couleur zéro)
(progrès
(setq objlay (assoc '8 obj))
(setq laycol (cdr (assoc '62 (tblsearch " couche " (cdr objlay)))))
(commande "_change" (cdar obj) "" "_prop" "_color" laycol "")
);
); chiusura si la couleur est nulle

(setq controllo (+ controllo 1))

) ;;chiusura pendant le contrôle
(commande "_chprop" "_all" "" "_layer" 0 "" "_bclose" "")
) ;;; chiusura répéter
); chiusura defun;
Où ai-je tort ?
 
J'ai trouvé une erreur :

setq blklist (ssget )

(setq num (longueur listobj)

corriger dans:

setq blklist (ssget )

(setq num (sleong blklist)

maintenant la commande commence, mais elle s'arrête à l'ouverture du bloc, où il m'apparaît comme le nom du bloc "-changement" et à l'intérieur du bloc il n'y a rien. Dans la barre de commande, ce mot m'apparaît :
"commande: ccb4
sélectionner les objets: coin opposé: 2 trouvés
sélectionner les objets & #160;: - Quoi ?
saisir le nom du bloc ou [?]:
Nom du bloc non valide.
Saisissez le nom du bloc ou [?]: _changer le modèle régénérant.
commande & #160;: <bad entity="" ffa818b0="" name:="">"</bad>
 
C'est vrai. doit devenir (0 . "insérer") - ceci pour le filtrage

(longueur) Listaobj) - compter le nombre d'entités sur une liste qui n'existe pas. test en le remplaçant par (setq num (longueur blklist))
 
ho apportato le modifiche come da te suggerito, ma continua a bloccarsi all'interno del editor blocchi di un blocco inessinge....

queste le righe di comando che mi escono...

commande : _appload ccb5.lsp chargé avec succès.
commande : ; erreur : liste mal formée sur entrée
commande & #160;:
commande : ccb5
sélectionner les objets: spécifier le coin opposé: 2 trouvés
sélectionner les objets & #160;: -bedit
saisir le nom du bloc ou [?]:
Nom du bloc non valide.
Saisissez le nom du bloc ou [?]: _changer le modèle régénérant.
commande & #160;: <bad a468a920="" entity="" name:=""></bad>
 
le problème réside dans l'utilisation de la commande bedit.

le nom de l'entité que vous détenez dans la variable _Nom est le nom intérieur de ce et seulement ça entité.
i vous avez 5 instances du bloc peuplier, vous aurez 5 valeurs _Nom différent, je ne sais pas si j'étais clair

à la commande bedit vous devez passer le nom du bloc, pas celui de son instance, sinon bedit croit que vous voulez modifier un bloc qui est appelé <entity 7ff75520dc10="" name:=""></entity> Autres peuplier que vous voulez modifier

Comment résoudre ? rapidement, en attribuant le nom du bloc (pas son instance) à une nouvelle variable, nous disons Nom_bleTu viens si fa ?
(setq _Nom (cdr (assoc '2) _Nom))

vous dites assigner à name_bl la partie restante (cdr) du groupe 2 (assoc '2) à partir de la liste complète (entget) de l'entité b_name.

à ce point au bedit vous n'avez pas à passer plus de b_name, mais name_bl
(commande "-bedit" _Nom)

Cependant, puisque vous sélectionnez un certain nombre de blocs différents dans lesquels il y aura plus d'instances du même bloc, vous trouverez vous-même l'édition du même bloc déjà édité plusieurs fois, et je ne sais pas si cela peut générer d'autres crashs de programme.
vous pouvez aussi avoir des problèmes sur les blocs dynamiques, car ces derniers, lorsqu'ils sont variés par rapport à la "base", prennent un nouveau nom, type anonyme (démarrer pour astérisque)

pour avoir plus de vitesse d'exécution vous devez approfondir la commande tblsearch et essayer d'obtenir les noms des blocs existants dans le design afin de modifier une fois le bloc source, pas ses instances
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut