Aller au contenu

Code DXF


LUDWIG

Messages recommandés

Rebonjour,

 

Patrick_35 m'avait gentiment transmis un programme pour "normaliser" chaques entités constituant chaques blocs d'un dessin.

 

 (defun c:bl(/ i n tot)
(setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS 
(while i
(setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC
(while n
(setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC
(if (/= (cdr (assoc 8 n)) "0")
(progn
(setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0
(entmod n)
)
)
(setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE
)
(setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT
)
(princ (strcat "\nTraitement de " (itoa tot) " bloc(s)"))
(princ)
)

 

Je l'ai modifié pour que les entités soient également nomalisées en couleur dubloc :

 

 (defun c:bl2(/ i n tot)
(setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS 
(while i
(setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC
(while n
(setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC
(if (/= (cdr (assoc 8 n)) "0")
(progn
(setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0
(entmod n)
)
)
[b] (if (/= (cdr (assoc 62 n)) 0)
(progn
(setq n (subst (cons 62 0) (assoc 62 n) n)) ;SI L'ENTITE N'EST PAS de couleur 0, la change en 0 (couleur 0 =dubloc)
(entmod n)
)
)[/b](setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE
)
(setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT
)
(princ (strcat "\nTraitement de " (itoa tot) " bloc(s)"))
(princ)
)

 

Ca marche, sauf pour les entités qui sont définies en couleur Ducalque : elles restent en couleur Ducalque.

 

J'ai essayé de rajouter :

 

 (if (/= (cdr (assoc 62 n)) "256") ; et aussi dubloc ; "dubloc" ; bylayer ; "bylayer" ; nil ; "nil"...
(progn
(setq n (subst (cons 62 0) (assoc 62 n) n))
(entmod n)
)
)

 

Mais rien n'y fait. Je ne comprends pas d'où vient mon erreur.

 

Quelqu'un pourrait-il m'aider ? Merci d'avance...

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut Ludwig,

 

tu sais Patrick_35 ne pourra pas te répondre, il est au stade des devinette. Il passe par un grand SPLINE....

 

Pour ton problème, il me semble que le code 62 est inexistant lorsque l'objet est en DUCALQUE.

 

me semble-je !

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

il est au stade des devinette. Il passe par un grand SPLINE.
--> Je ne comprends pas trop ce que cela signifie... mais bon !

 

J'ai effectivement l'impression que le code 62 est inexistant quand la couleur est bylayer, c'est pour cela que j'ai testé :

 

 (if (/= (cdr (assoc 62 n)) nil)...

 

mais bon, ça ne marche pô !

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

citation extraite du message original:

il est au stade des devinette. Il passe par un grand SPLINE.

 

--> Je ne comprends pas trop ce que cela signifie... mais bon !

 

voici le message de Patrick_35...

http://www.cadxp.com/sujetXForum-4605.htm

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

J'allais le dire Patrick_35 ;)

 

		(cond
			((/= (cdr (assoc 62 n)) 0)
				(setq n (subst (cons 62 0) (assoc 62 n) n))
				(entmod n)
			)
				((null (assoc 62 n))
				(setq n (append (cons 62 0) n))
				(entmod n)
			)
		)

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

Malgré tous mes efforts (!), ça ne veut pas marcher !

(defun c:bl(/ i n tot)
(setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS 
(while i
(setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC
(while n
(setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC
(if (/= (cdr (assoc 8 n)) "0")
(progn
(setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0
(entmod n)
)
)
[b] (cond
((/= (cdr (assoc 62 n)) 0);SI L'ENTITE N'EST PAS DE COULEUR 0, LA CHANGE EN 0 (=DuBloc)
(setq n (subst (cons 62 0) (assoc 62 n) n))
(entmod n)
)
((null (assoc 62 n));SI L'ENTITE N'A PAS LE CODE DXF 62 (=DuCalque), LE CREE ET LUI AFFECTE LA VALEUR 0 (=DuBloc)
(setq n (append (cons 62 0) n))
(entmod n)
))[/b](setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE
)
(setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT
)
(princ (strcat "\nTraitement de " (itoa tot) " bloc(s)"))
(princ)
)

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Aîe ! Aîe ! Aîe !

 

En plus, je viens de remarquer que :

- AVEC EDITREF : un bloc avec attributs peut avoir tous ces éléments constituants sur le calque 0

- AVEC L'EDITEUR D'ATTRIBUTS ETENDU : les étiquettes sont en fait définies sur un autre calque...

 

Par exemple, 1 dessin avec 1 seul bloc inséré en 0 et constitué de 1 seul attribut défini sur le calque 0. Normalement, après avoir purgé, il ne doit rester que le calque 0. Or quand on double clique sur le bloc pour ouvrir l'éditeur d'attributs étendu, on s'aperçoit que l'étiquette du bloc est définie sur un autre calque qui, du coup n'est pas purgé...

 

Vous connaissez ce problème ? Comment le résoudre dans mon code de "normalisation" des blocs ?

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut

Déjà pour solutionner la couleur dubloc

(if (not (assoc 62 n))
 (setq n (append n (list (cons 60 0))))
 (if (/= (cdr (assoc 62 n)) 0)
   (setq n (subst (cons 62 0) (assoc 62 n) n))
 )
)
(entmod n)

 

Ensuite, pour ce qui est des attibuts

Si le code 66 pour un bloc est présent, c'est que des attributs suivent

Dand ce cas par exemple

(setq sel (ssget "x" (list (cons 0 "INSERT"))))
(setq j 0)
(while (ssname sel j)
 (setq n (entget (ssname sel j)
 (if (assoc 66 n)
   (progn
     (setq i (entget (entnext (cdr (assoc -1 n)))))
     (while (/= (cdr (assoc 0 i)) "SEQEND")
       (setq i (subst (assoc 8 n) (assoc 8 i) i)) ; mettre l'attribut sur le même calque que celui du bloc par exemple
       (entmod i) ; modifier l'entité
       (entupd (cdr (assoc -1 i))) ; mettre à jour sur l'écran l'entité
       (setq i (entget (entnext (cdr (assoc -1 i)))))
     )
   )
 )
 (setq j (1+ j))
)

Nb : la sélection doit se faire cette fois ci dans tout le dessin et non plus dans la table des blocs. Ce n'est valable que pour des blocs qui sont déjà insérés dans le dessin

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

 (setq n (append n (list (cons 60 0))))

 

ça marche ! sauf que c list (cons 6 20))))

 

Pour ce qui est des attributs, je testerai plus tard..

 

Merci Patrick_35... Est-ce que ces réponses te viennent instinctivement ? Le Lisp est-il ta langue maternelle ?

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Ah exact, tu as gagné 10 pts pour ce bug ;)

Le lisp n'est pas ma langue maternelle mais j'ai commencé sur autocad V12, ce qui fait presque 9 ans déjà. Et comme j'ai développé plein d'outils pour mon boulot, ça aide, malgré que ce ne soit pas mon métier.

 

J'en apprends tous les jours, même avec tes lisps comme la fonction sssetfirst dont je ne me suis jamais servi. Il est toujours utile de regarder ce que font les autres, quelle est leur logique et de quelles fonctions ils se servent. Ca rafraîchi parfois la mémoire ou ça permet de faire plus court et plus simple. :cool:

 

Tu sais, une fois que tu as bien compris comment fonctionne la programmation, le reste n'est plus qu'un jeu et une question d'interprétation.

 

Un ordinateur est bête, si on lui dit un plus un, il répond deux. Maintenant, si le résultat est de trois, c'est qu'il y a un bug, une chose qui n'a pas été comprise, ou pire encore, un virus qui met son grain de sel. :mad2:

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Et voici donc la version finale (j'espère) du programme que vous m'avez aider à constituer. J'espère que ça servira à d'autres...

 

 ;****************************************
;- NORMALISER BLOCS -
;****************************************
;Patrick_35 de CadXP modifié par Ludwig

(defun c:bl  (/ i n tot)
 
;Normalisation des blocs dans la table des blocs
;-----------------------------------------------
 (setq	i   (tblnext "block" t)
tot 1); RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS 
 (while i
   (setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC
   (while n
     (setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC
     (if (/= (cdr (assoc 8 n)) "0")
(progn
  (setq n (subst (cons 8 "0") (assoc 8 n) n));SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0
  (entmod n)
  )
)

     (if (not (assoc 62 n));SI L'ENTITE N'A PAS LE CODE DXF 62 (=DuCalque), LE CREE ET LUI AFFECTE LA VALEUR 0 (=DuBloc)
(setq n (append n (list (cons 62 0))))
(if (/= (cdr (assoc 62 n)) 0);SI L'ENTITE N'EST PAS DE COULEUR 0, LA CHANGE EN 0 (=DuBloc)
  (setq n (subst (cons 62 0) (assoc 62 n) n))
  )
)
     (entmod n)
     (setq n (entnext (cdr (assoc -1 n))));ENTITE SUIVANTE
     )
   (setq i   (tblnext "block")
  tot (1+ tot));BLOC SUIVANT
   )

;Normalisation des étiquettes d'attributs de blocs dans le dessin (car une étiquette peut avoir des valeurs de calque, couleur, etc. différentes de l'attribut)
;-----------------------------------------------

 (setq sel (ssget "x" (list (cons 0 "INSERT"))))
 (setq j 0)
 (while (ssname sel j)
   (setq n (entget (ssname sel j)))
   (if	(assoc 66 n)
     (progn
(setq i (entget (entnext (cdr (assoc -1 n)))))
(while (/= (cdr (assoc 0 i)) "SEQEND")
  (setq i (subst (cons 8 "0") (assoc 8 i) i))
				; mettre l'attribut sur le même calque que celui du bloc par exemple
  (setq i (subst (cons 62 0) (assoc 62 i) i))
				; mettre l'attribut sur le même calque que celui du bloc par exemple

  (entmod i)			; modifier l'entité
  (entupd (cdr (assoc -1 i)))	; mettre à jour sur l'écran l'entité
  (setq i (entget (entnext (cdr (assoc -1 i)))))
  )
)
     )
   (setq j (1+ j))
   )

;Résultat
;-----------------------------------------------

 (princ
   (strcat "\nTraitement de "
    (itoa (+ tot j))
    " bloc(s) ("
    (itoa tot)
    " dans la table des blocs et "
    (itoa j)
    " étiquettes d'attributs de blocs dans le dessin"))

 (princ)
 )

(prompt "\bl : Normaliser les blocs du dessin (calque 0 - Couleur Dubloc")

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Bravo Ludwig,

 

Je l'ai essayé, ça fonctionne, sauf dans un cas (je suis tombé dessus).:(

 

Pour ton info:

Si le bloc est sur un calque verrouillé, la procédure s'execute sans aucune erreur, mais rien ne se passe après un "regen" .

 

C'est ce qui est le plus pénible en programmation, envisager tout les cas de figure.

En tout cas tu as déjà fait un joli boulot

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

ah oui il faut que je rajoute :

 

- extraction du nom du calque sur lequel est inséré le bloc

- deverouillage de ce calque s'il était verrouillé

- traitement

- reverrouillage s'il était verrouillé

 

Sinon, je dirais que c'est surtout du code "Patrick_35"

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

(command "_-LAYER" "_state" "_save" "ParDéfaut" "" "" "") ; Sauve l'état de tes calques
(command "_-LAYER" "L" "*"" "") ; déverrouille tout tes calques
..... ton lisp
(command "_-LAYER" "_state" "_restore" "ParDéfaut" "" ""); restaure l'état de tes calques

 

;)

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...
Et voici donc la version finale (j'espère) du programme que vous m'avez aider à constituer. J'espère que ça servira à d'autres...

 

Oh oui, je viens de redéfinir tous ma bibliothéque de bloc. Sa marche super même avec les blocs paramétriques. :D

L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
"Il vaut mieux mobiliser son intelligence sur des conneries, que sa connerie sur des choses intelligentes" - Devise Shadok.
"ceux qui ne se souviennent pas du passé sont condamnés à le revivre" George Santayana

Ma bibliothèque de blocs électrique :symbole elec.dwg

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é