Aller au contenu

Mise à jour d'échelle de blocs dynamiques


Messages recommandés

Posté(e)

Bonjour, 

Je travaille avec AutoCAD Map 2014 ainsi que Covadis 17 en tant que géomètre topographe, j'ai un besoin un peu particulier que je n'arrive pas à régler par moi même.

Mon souhait de base est de pouvoir générer via une table de codification (covadis), un bloc dynamique. En l'occurrence il s'agit d'un bloc représentant un seuil de porte. J'ai bien crée le bloc dynamique, sans trop de soucis. Mon problème étant que (dites moi si je me trompe, il n'est pas possible d'avoir les actions dynamiques sur un bloc qui n'a pas une échelle uniforme. Quand je génère mon dessin via la table de codification, je suis obligé de générer un bloc qui n'a pas une échelle uniforme (même échelle X, même échelle Y, mais pas même échelle Z). Du coup je suis obligé de faire en 2 étapes, générer un bloc non dynamique via ma table de codif, puis remplacer ce bloc par un visuellement identique mais dynamique (afin d'avoir des actions d'étirement, d'inversion, etc...). Alors remplacer un bloc par un autre, je sais faire, Covadis le fait, et le lisp RBlock le fait aussi très bien. Problème : Une fois le remplacement fait par un bloc dynamique (et donc échelle uniforme), les échelles de mon nouveau bloc dynamique apparaissent grisées (sauf l'échelle X) mais avec les mêmes valeurs que pour mon bloc non-dynamique. Comme les échelles ne sont pas les mêmes, les actions dynamiques ne sont pas visibles, et tout cela m'est inutile !

Le seul moyen que j'ai trouvé pour restaurer les actions dynamiques, c'est de remplacer l'échelle X (2.5248 par exemple, c'est jamais la même chose, car issue de points topos) par une échelle bidon, puis de remettre la valeur (2.5248). De cette manière, l'échelle de mon bloc s'"actualise", les échelles X,Y et Z deviennent identiques et il m'est possible d'avoir les actions dynamiques ! Etant donné que chaque bloc est inséré dans le dessin avec une échelle toujours différente (c'est de la topo), je suis obligé de faire cette manip pour chaque bloc, ce qui n'est pas gérable et sans gain de temps. Alors je me demande s'il est possible de passer par un lisp, qui ferait en sorte que pour tels blocs, l'échelle X soit mis à jour (par la même valeur, ce qui est étrange) afin que les autres échelles Y et Z aient la même valeur que la Z, et donc que les actions dynamiques apparaissent.

Ci-joint des screens pour illustrer mon propos et un .dwg avec les 2 blocs en question. (l'image 4 est une suggestion de modification du lisp, permettre de choisir échelle uniforme, mais en gardant l'échelle X de chaque bloc.

 

Ma première idée était bien sûr de modifier ma table de codif afin d'insérer directement un bloc dynamique, mais ce n'est pas toujours possible. J'ai fait des tests, et quand un symbole est défini par plusieurs points (deux dans mon cas, les extrémités du seuil) Covadis génere bien le bloc dynamique, avec la bonne rotation, mais ne touche pas a l'échelle du bloc, donc le bloc reste à l'échelle 1. Je vais me rapprocher d'eux afin de savoir s'il est possible d'intégrer correctement des blocs dynamiques dans les tables de codifications.

 

J'espère avoir été clair, ma demande n'est pas très simple à comprendre mais j'espère qu'avez le .dwg et les screens quelqu'un pourra m'aider :) et désolé pour le pavé !

1.jpg

2.jpg

3.JPG

4.jpg

5.jpg

BlocSeuil.dwg

Posté(e)

Bonjour @Kilian336

 

Avec ce code, ça met l'échelle en Z identique à X si X et Y sont identiques. A utiliser avant RBLOC

(defun C:BLOC_ECHELLE_UNIFORME ( / JEU I oBloc oBlocLst xScale yScale)
  (if (setq JEU (ssget (list (cons 0 "INSERT"))))
    (progn
      (setq I 0)
      (repeat (sslength JEU)
	(setq oBloc (ssname JEU I))
	(setq I (1+ I))
	(setq oBlocLst (entget oBloc))
	(setq xScale (cdr (assoc 41 oBlocLst)))
	(setq yScale (cdr (assoc 42 oBlocLst)))
	(if (= xScale yScale)
	  (progn
	    (setq oBlocLst (subst (cons 43 xScale) (assoc 43 oBlocLst) oBlocLst))
	    (entmod oBlocLst)
	    (entupd oBloc)
	  )
	)
      )
    )
  )
)

 

Olivier

Posté(e)

Coucou,

Les échelles de référence de bloc sont grisées (Y et Z, sauf X) lorsqu'à la création du bloc l'option "Echelle uniforme" est cochée. Je pense que c'est une option qu'il est préférable d'éviter de cocher.
La petite particularité c'est qu'en échelle uniforme, un utilisateur lambda ne peut pas modifier les échelles séparément (l'échelle X = Y = Z) mais si on passe par la programmation, il est tout à fait possible de modifier les échelles séparément...Un vrai mystère pour moi ^^"

Bisous,
Luna

Posté(e)

Bonjour,

Je republie ici des routines extraits de cette discussion: https://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/?do=findComment&comment=232105

;;;=================================================================
;;; VPBD.LSP V1.01                                          VDH-Bruno
;;;
;;; "Verrouille" Les propriétés dynamiques des références de blocs.
;;; (Modifie l'échelle d'insertion en Z de la référence de bloc) 
;;;

(defun c:vpbd (/ ss i e dxf oldEchZ newEchZ)
  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (repeat (setq i (if (setq ss (ssget '((0 . "INSERT"))))
                    (sslength ss)
                    0
                  )
          )
    (setq e (ssname ss (setq i (1- i))))
    (if (vlax-invoke (vlax-ename->vla-object e) 'GetDynamicBlockProperties)
      (progn (setq dxf     (entget e)
                   oldEchZ (assoc 43 dxf)
                   newEchZ (cons (car oldEchZ) (1+ (cdr oldEchZ)))
             )
             (entmod (subst newEchZ oldEchZ dxf))
      )
    )
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

;;;=================================================================
;;; DVPBD.LSP V1.01                                        VDH-Bruno
;;;
;;; "DéVerrouille" Les propriétés dynamiques des références de blocs.
;;; (Homogénise l'échelle d'insertion en Z de la référence de bloc
;;; en fonction des valeurs d'échelle en X et Y)
;;;

(defun c:Dvpbd (/ ss i e dxf EchX EchY EchZ)
  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (repeat (setq i (if (setq ss (ssget '((0 . "INSERT"))))
                    (sslength ss)
                    0
                  )
          )
    (setq e    (ssname ss (setq i (1- i)))
          dxf  (entget e)
          EchX (assoc 41 dxf)
          EchY (assoc 42 dxf)
    )
    (if (= (cdr EchX) (cdr EchY))
      (entmod (subst (cons 43 (cdr EchX)) (assoc 43 dxf) dxf))
    )
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

@+ VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

Hello

SVP j'aimerais bien avoir un retour positif sur l'une de CES Routines !

Car je n'arrive a rien de correct avec le DWG Test de Kilian336 sur son Bloc Camera que j'ai multiplie avec des rotations dynamiques multiples !!

Merci, La Sante, Bye, lecrabe

 

Autodesk Expert Elite Team

Posté(e)
Il y a 3 heures, Olivier Eckmann a dit :

Bonjour @Kilian336

 

Avec ce code, ça met l'échelle en Z identique à X si X et Y sont identiques. A utiliser avant RBLOC

(defun C:BLOC_ECHELLE_UNIFORME ( / JEU I oBloc oBlocLst xScale yScale)
  (if (setq JEU (ssget (list (cons 0 "INSERT"))))
    (progn
      (setq I 0)
      (repeat (sslength JEU)
	(setq oBloc (ssname JEU I))
	(setq I (1+ I))
	(setq oBlocLst (entget oBloc))
	(setq xScale (cdr (assoc 41 oBlocLst)))
	(setq yScale (cdr (assoc 42 oBlocLst)))
	(if (= xScale yScale)
	  (progn
	    (setq oBlocLst (subst (cons 43 xScale) (assoc 43 oBlocLst) oBlocLst))
	    (entmod oBlocLst)
	    (entupd oBloc)
	  )
	)
      )
    )
  )
)

 

Olivier

 

Merci, en effet cela fonctionne bien, peut-être ce code peut-il être modifié ? Il est possible que j'ai des blocs avec une echelle X et Y différente, je souhaiterais donc remplacer l'échelle Y et Z par l'échelle X. Ce code ne fonctionne que si l'échelle X = échelle Y. En tout cas c'est super gentil de ta part, merci !

Il y a 2 heures, Luna a dit :

Coucou,

Les échelles de référence de bloc sont grisées (Y et Z, sauf X) lorsqu'à la création du bloc l'option "Echelle uniforme" est cochée. Je pense que c'est une option qu'il est préférable d'éviter de cocher.
La petite particularité c'est qu'en échelle uniforme, un utilisateur lambda ne peut pas modifier les échelles séparément (l'échelle X = Y = Z) mais si on passe par la programmation, il est tout à fait possible de modifier les échelles séparément...Un vrai mystère pour moi ^^"

Bisous,
Luna

 

Oui effectivement mais si je ne coche pas cette option, et que par une mauvaise manip ou autre je me retrouve avec des échelles X,Y,Z différentes, je perd mes actions dynamiques, ce que je souhaite conserver dans tous les cas. Par contre effectivement c'est assez bizarre qu'il soit possible de modifier les échelles grisées par programmations et pas par simple saisie dans les propriétés. Merci de ta réponse en tout cas :)

 

Il y a 3 heures, VDH-Bruno a dit :

Bonjour,

Je republie ici des routines extraits de cette discussion: https://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/?do=findComment&comment=232105

;;;=================================================================
;;; VPBD.LSP V1.01                                          VDH-Bruno
;;;
;;; "Verrouille" Les propriétés dynamiques des références de blocs.
;;; (Modifie l'échelle d'insertion en Z de la référence de bloc) 
;;;

(defun c:vpbd (/ ss i e dxf oldEchZ newEchZ)
  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (repeat (setq i (if (setq ss (ssget '((0 . "INSERT"))))
                    (sslength ss)
                    0
                  )
          )
    (setq e (ssname ss (setq i (1- i))))
    (if (vlax-invoke (vlax-ename->vla-object e) 'GetDynamicBlockProperties)
      (progn (setq dxf     (entget e)
                   oldEchZ (assoc 43 dxf)
                   newEchZ (cons (car oldEchZ) (1+ (cdr oldEchZ)))
             )
             (entmod (subst newEchZ oldEchZ dxf))
      )
    )
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

;;;=================================================================
;;; DVPBD.LSP V1.01                                        VDH-Bruno
;;;
;;; "DéVerrouille" Les propriétés dynamiques des références de blocs.
;;; (Homogénise l'échelle d'insertion en Z de la référence de bloc
;;; en fonction des valeurs d'échelle en X et Y)
;;;

(defun c:Dvpbd (/ ss i e dxf EchX EchY EchZ)
  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (repeat (setq i (if (setq ss (ssget '((0 . "INSERT"))))
                    (sslength ss)
                    0
                  )
          )
    (setq e    (ssname ss (setq i (1- i)))
          dxf  (entget e)
          EchX (assoc 41 dxf)
          EchY (assoc 42 dxf)
    )
    (if (= (cdr EchX) (cdr EchY))
      (entmod (subst (cons 43 (cdr EchX)) (assoc 43 dxf) dxf))
    )
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

@+ VDH-Bruno

 

Alors je suis pas sûr de bien saisir, mais ca parle d'échelle d'insertion et moi je ne cherche pas a toucher a cette donnée, tout doit rester a Z = 0. Merci en tout cas

Posté(e)

Hello @Kilian336

Donc SVP tu utilises "avec succes" la routine d'Olivier pour uniformiser le facteur d'echelle des Blocs

PUIS la routine RBLOC v2.23 de notre regrette Patrick_35 !?

Ou quoi d'autre ??

Merci de tes Infos, La Sante, Bye, lecrabe

 

Autodesk Expert Elite Team

Posté(e)
Il y a 2 heures, Kilian336 a dit :

Alors je suis pas sûr de bien saisir, mais ca parle d'échelle d'insertion et moi je ne cherche pas a toucher a cette donnée, tout doit rester a Z = 0. Merci en tout cas

Il fallait tester la 2ème routines que je viens d'adapter rapidement pour répondre à ta dernière demande

A tester:
 

;; Tous les facteurs d'échelle des bloc dyn selectionné à la valeur de l'echelle X
(defun c:BD_echX (/ ss i e dxf EchX EchY EchZ)
  (vl-load-com)
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (repeat (setq i (if (setq ss (ssget '((0 . "INSERT"))))
                    (sslength ss)
                    0
                  )
          )
    (setq e    (ssname ss (setq i (1- i)))
      dxf  (entget e)
      EchX (assoc 41 dxf)
      dxf  (subst (cons 42 (cdr EchX)) (assoc 42 dxf) dxf)
      dxf  (subst (cons 43 (cdr EchX)) (assoc 43 dxf) dxf)
    )    
      (entmod dxf)
    
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

Cdt

Apprendre => Prendre => Rendre

Posté(e)

Hello @VDH-Bruno

SVP OU dans ta routine tu ne traites QUE les Blocs dynamiques ??

Vu de loin (sans AutoCAD), j'ai l'impression que tu traites TOUS les Blocs !?

La Sante, Bye, lecrabe

 

Autodesk Expert Elite Team

Posté(e)
il y a 8 minutes, lecrabe a dit :

Hello @VDH-Bruno

SVP OU dans ta routine tu ne traites QUE les Blocs dynamiques ??

Vu de loin, j'ai l'impression que tu traites TOUS les Blocs !?

La Sante, Bye, lecrabe

 

Oui merci Patrice bien vu😉, j'ai été un peu rapide dans mon adaptation, la même avec filtrage sur les blocs dynamique

(defun c:BD_echX (/ ss i e dxf EchX EchY EchZ)
  (vl-load-com)
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (repeat (setq	i (if (setq ss (ssget '((0 . "INSERT"))))
		    (sslength ss)
		    0
		  )
	  )
    (setq e (ssname ss (setq i (1- i))))
    (if	(vlax-invoke
	  (vlax-ename->vla-object e)
	  'GetDynamicBlockProperties
	)
      (entmod (setq dxf	 (entget e)
		    EchX (assoc 41 dxf)
		    dxf	 (subst (cons 42 (cdr EchX)) (assoc 42 dxf) dxf)
		    dxf	 (subst (cons 43 (cdr EchX)) (assoc 43 dxf) dxf)
	      )
      )
    )
  )
  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

 

Apprendre => Prendre => Rendre

Posté(e)
Il y a 10 heures, VDH-Bruno a dit :

Oui merci Patrice bien vu😉, j'ai été un peu rapide dans mon adaptation, la même avec filtrage sur les blocs dynamique

(defun c:BD_echX (/ ss i e dxf EchX EchY EchZ)
  (vl-load-com)
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (repeat (setq	i (if (setq ss (ssget '((0 . "INSERT"))))
		    (sslength ss)
		    0
		  )
	  )
    (setq e (ssname ss (setq i (1- i))))
    (if	(vlax-invoke
	  (vlax-ename->vla-object e)
	  'GetDynamicBlockProperties
	)
      (entmod (setq dxf	 (entget e)
		    EchX (assoc 41 dxf)
		    dxf	 (subst (cons 42 (cdr EchX)) (assoc 42 dxf) dxf)
		    dxf	 (subst (cons 43 (cdr EchX)) (assoc 43 dxf) dxf)
	      )
      )
    )
  )
  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

 

Super ! Cela fonctionne très bien, pense-tu qu'il est possible de l'intégrer dans Rbloc directement ? Sinon c'est très bien comme c'est, merci énormément !

Il y a 12 heures, lecrabe a dit :

Hello @Kilian336

Donc SVP tu utilises "avec succes" la routine d'Olivier pour uniformiser le facteur d'echelle des Blocs

PUIS la routine RBLOC v2.23 de notre regrette Patrick_35 !?

Ou quoi d'autre ??

Merci de tes Infos, La Sante, Bye, lecrabe

 

Hello, oui c'est ça, d'abord son Lisp, puis Rbloc 2.23 effectivement.

 

Et la nouvelle méthode de VDH-Bruno me convient encore mieux car elle met à jour tous les blocs,

même ceux ayant une échelle X différente de la Y, ce que ne fait pas le Lisp de Oliver Eckmann (que je remercie de nouveau au passage !)

Posté(e)
Il y a 22 heures, Kilian336 a dit :

Super ! Cela fonctionne très bien, pense-tu qu'il est possible de l'intégrer dans Rbloc directement ? Sinon c'est très bien comme c'est, merci énormément !

Le 04/11/2021 à 14:01, lecrabe a dit :

Bonsoir,

Si cela convient je suis heureux d'avoir pu aider, oui il doit être possible d'émuler Rbloc même si je ne suis pas utilisateur de cette routine, mais je n'irais pas plus loin dans ma contribution, n'ayant que très peux de disponibilité pour lisper (à regret), dans mes disponibilité il m'est plus facile d'adapter/réchauffer des codes dont je suis déjà l'auteur (moins chronophage), que de me plonger dans des programmes écrit par d'autres et dont je n'ai pas vraiment l'usage. 

Apprendre => Prendre => Rendre

Posté(e)
il y a une heure, VDH-Bruno a dit :

Bonsoir,

Si cela convient je suis heureux d'avoir pu aider, oui il doit être possible d'émuler Rbloc même si je ne suis pas utilisateur de cette routine, mais je n'irais pas plus loin dans ma contribution, n'ayant que très peux de disponibilité pour lisper (à regret), dans mes disponibilité il m'est plus facile d'adapter/réchauffer des codes dont je suis déjà l'auteur (moins chronophage), que de me plonger dans des programmes écrit par d'autres et dont je n'ai pas vraiment l'usage. 

Oui je comprend pas de soucis ! Merci beaucoup en tout cas, bon week end :)

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é