Aller au contenu

BLOC PARAMETRIQUE DONNEE PERSONNALISEE


PHILPHIL

Messages recommandés

Bonjour

 

 

je voudrais pouvoir en Vl-lisp récuperer toutes les données personnalisées

d'un bloc parametrique préalablement inserer dans un fichier

pour les réinjecter dans un autre bloc que j'insers

 

comment savoir ou sont planques les infos ( données personnalisées) ???

 

MR AUTODESK est ce que l'on pourrait avoir une arborescence pour les données VL

pour que ce soit plus lisibles que ca et avoir tous en UNE seule fois

ou Mme DESk :

 

ok je vois l'image est trop grande sinon on vois rien

je l'effacerais plus tard ok

 

bonne journée

 

phil

 

 

[Edité le 24/9/2008 par PHILPHIL]

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne suis pas sûr d'avoir compris exactement la demande, si tu veux copier les propriétés dynamiques pour les attribuer à un un bloc lors de son insertion, autant copier le bloc, non ?

 

Ceci dit, voici un LISP (commenté) dont tu peux t'inspirer.

Il copie les propriétés dynamique d'un bloc source vers les blocs sélectionné (un peu comme la commande CORRESPROP ou MATCHPROP).

 

 

;;; MatchDynProp (gile)
;;; Copie les propriétés dynamiques d'un bloc source vers les blocs sélectionnés

(defun c:MatchDynProp (/ source name dynprop dynval target)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 
 (if

   ;; on sélectionne le bloc source et on contrôle sa validité (bloc dynamique)
   (and
     (setq source (car (entsel "\nSélectionnez le bloc source: ")))
     (setq source (vlax-ename->vla-object source))
     (= (vla-get-ObjectName source) "AcDbBlockReference")
     (= (vla-get-IsDynamicBlock source) :vlax-true)
     (setq name (vla-get-EffectiveName source))
   )

    ;; on sélectionne les blocs cible
    (if (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*"))))
      (progn
 (vla-StartUndoMark *acdoc*)

 ;; on récupère la liste des propriétés dynamiques du bloc source (vla-objects)
 (setq dynprop (vlax-invoke source 'GetDynamicBlockProperties))
 
 ;; on récupère la valeur de chaque propriété dynamique
 (setq dynval  (mapcar (function (lambda (p) (vla-get-Value p)))
		       dynprop
	       )
 )

 ;; on traite le jeu de sélection
 (vlax-for b (setq target (vla-get-ActiveSelectionSet *acdoc*))

   ;; contrôle du nom de bloc (blocs anonymes non filtrés)
   (if (= (vla-get-Effectivename b) name)

     ;; on attribue les valeurs des propriétés dynamiques du bloc source
     ;; aux propriétés des blocs cible (sauf pour les propriétés "Origin")
     (mapcar (function (lambda (p v)
			 (or (= (vla-get-PropertyName p) "Origin")
			     (vla-put-Value p v)
			 )
		       )
	     )
	     (vlax-invoke b 'GetDynamicBlockProperties)
	     dynval
     )
   )
 )
 (vla-delete target)
 (vla-EndUndoMark *acdoc*)
      )
    )
    (princ "\nEntité non valide")
 )
 (princ)
) 

 

[Edité le 24/9/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour moi, le plus difficile avec les blocs dynamiques était de trouver la commande

(vla-getdynamicblockproperties source) ou (vlax-invoke source 'GetDynamicBlockProperties)

qui nous ouvrent la porte sur les données qui correspondent aux paramètres dynamiques d'un bloc. C'est vrai que ce n'est pas beaucoup expliqué dans l'aide et il m'a fallu un peu de temps pour trouver.

Pour mémoire, voilà ce qu'on trouve dans l'aide

GetDynamicBlockProperties Method

 

Gets the properties of the dynamic block.

 

Signature

 

object.GetDynamicBlockProperties

 

object

 

BlockRef, MInsertBlock

The object or objects this method applies to.

 

Remarks

BlockRef.GetDynamicBlockProperties returns a collection of DynamicBlockReferenceProperty objects if the block reference is a dynamic block containing custom properties.

 

Note To access this method, use the IAcadBlockReference2 or IAcadMInsertBlock2 interface.

 

On en avait parlé ici

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

L'avntage de de (vlax-invoke source 'GetDynamicBlockProperties) sur (vla-GetDynamicBlockProperties source) est que le premier retourne une liste AutoLISP directement exploitable, le second un variant contenant un safearray. Voir ce sujet.

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

Lien vers le commentaire
Partager sur d’autres sites

hello

 

pourquoi faire simple quand on peut faire compliqué ??

 

soit cette réponse s'adresse a AUTODESK ? la désolé je ne peux pas répondre a sa place

soit elle est pour moi , la je peux répondre

 

je m'explique

 

je dessine des logements avec , des portes ( avec texte de largeur ), amenagement de placard, amenagement de SdB et cuisine plein de petits blocs qui font un beau plan d'archi ( j'entend déja dire les bureaux d'étude béton dire que ca sert a rien si les murs ne sont pas bien déssinés ) détrompez vous 18cm de béton font bien 180mm déssiné

 

parfois il arrive qu'il y est des symetrique

donc les bloc se retrouvent a etre a échelle x=-1, y=1, z=1 et ca je deteste comme bcp d'autre je pense

 

passe par la mon petit LISP qui en cliquant sur le(s) dit bloc(s) incriminé(s) à la volée remet au meme endroit un nouveau bloc x=1,y=1,z=1 et ainsi les textes des portes se retrouve dans le bon sens de lecture , ce qui me prend 1minutes par appartement plutot que 10 minutes multiplier par le nb d'apparte et le fait que ce devienne Ch...

 

ca parrait compliquer mais tres simple d'utilisation

 

en gros mon lisp recupere le nom du BLOC et le rappelle, le réinsert au meme point et le tourne à 180degres ( un bloc pour gauche, un bloc pour droit ) ca marche tres bien pour les blocs simples ca se complique pour les paramétriques pour retrouver les données

 

 

je vais tester/ fouiller/ aprivoiser ce que vous m'avez donner GILLES et ZEBULON, je vous en remercie

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

soit cette réponse s'adresse a AUTODESK ? la désolé je ne peux pas répondre a sa place

soit elle est pour moi , la je peux répondre

Je ne me serais pas permis d'adresser cette réponse ni à Autodesk ni à toi. En fait, la réponse s'adressait à moi, puisque dans mon exemple, j'utilise vla--GetDynamicBlockProperties qui renvoie variant qu'il faut encore transformer en liste pour l'exploiter avec lisp, alors que (Gile) utilise (vlax-invoke source 'GetDynamicBlockProperties) qui renvoie directement une liste.

 

Désolé pour le malentendu

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

parfois il arrive qu'il y est des symétrique

donc les bloc se retrouvent a être a échelle x=-1, y=1, z=1 et ça je déteste comme bcp d'autre je pense

 

Tout à fait, faisant des plans d'implantation électrique, il m'arrive, comme en ce moment, d'avoir des logements (110... :P ) symétriques d'où des blocs inversé comme toi. Et le client aime bien avoir les hauteurs ou les désignations à l'endroit :) .

 

Et je pense que nous ne sommes pas seul et que ce genre de lisp va en intéresser beaucoup.

 

Bon courage

 

Olivier

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

hello

 

vue que je pensais etre le seul ok

 

voila le LISP ( merci gille pour les premiere partie du lisp )

 

il faut le relancer pour chaque bloc, mais le pouce sur" barre espace" ou le doigt sur "bouton droit" ca va tres vite

 

quand j'aurais decortique ce que gille m'a envoyer

je ferais la mise a jour pour les blocs parametriques, et aussi pour d'abord tout selectionner et que ensuite le LISP fasse la manip

 

par contre tu dois avoir deux blocs un pour gauche et un pour droit, apres tu peux aussi avoir des blocs parametrique avec dedans un parametre d'inversion au point de base

 

phil

 

 

 

 

 

 ;; GETATT
;; Retourne une liste d'association des attribut du bloc
;;
;; Argument
;; bl : la référence de bloc (ename ou vla-object)
;;
;; Retour
;; une liste d'association du type : ((etiquette . valeur) ...)

(defun GETATT (BL)
 (vl-load-com)
 (or (= (type BL) 'VLA-OBJECT)
     (setq BL (vlax-ename->vla-object BL))
 )
 (if (and (= (vla-get-objectname BL) "AcDbBlockReference")
   (= (vla-get-hasattributes BL) :vlax-true)
     )
   (mapcar (function
      (lambda (X)
	(cons (vla-get-tagstring X) (vla-get-textstring X))
      )
    )
    (vlax-invoke BL 'GETATTRIBUTES)
   )
 )
)

;; PUTATT
;; Donne les valeurs de la liste aux attributs du bloc
;;
;; Arguments
;; bl : la référence de bloc (ename ou vla-object)
;; lst : une liste d'association du type : ((etiquette . valeur) ...)
;;
;; Retour
;; une liste d'association du type des attributs traités

(defun PUTATT (BL LST / ATT RET)
 (vl-load-com)
 (or (= (type BL) 'VLA-OBJECT)
     (setq BL (vlax-ename->vla-object BL))
 )
 (if (and (= (vla-get-objectname BL) "AcDbBlockReference")
   (= (vla-get-hasattributes BL) :vlax-true)
     )
   (mapcar (function
      (lambda (X)
	(if (setq ATT (assoc (vla-get-tagstring X) LST))
	  (progn (vla-put-textstring X (cdr ATT))
		 (setq RET (cons ATT RET))
	  )
	)
      )
    )
    (vlax-invoke BL 'GETATTRIBUTES)
   )
 )
 RET
)


(defun C: DG (/
      LST
;;;	      / P1 LST ANGLES ECHLX
;;;	      NOMENTS NOMENTC
     )
 (setq SOURCE (car (entsel "\nBloc source: ")))
 (command "scu" "")
 (setq LST (GETATT SOURCE))
 (setq	P1	(cdr (assoc 10 (entget SOURCE)))
NOMENTS	(vla-get-effectivename (vlax-ename->vla-object SOURCE))
CALQ	(cdr (assoc 8 (entget SOURCE)))
ANGLES	(cdr (assoc 50 (entget SOURCE)))
ECHLX	(cdr (assoc 41 (entget SOURCE)))
 )
 (setq CAV (getvar "clayer"))
 (command "-calque" "ch" CALQ "")

 ;;bloc de base créer symetriquement par rapport a l'axe Y
 (if (= NOMENTS "COTNIVD")
   (setq NOMENTC "c:/PERSO/bibliotheque/SYMBOLE/COTNIVG"
  ANGLEC  (angtos ANGLES 0 8)
   )
 )
 (if (= NOMENTS "COTNIVG")
   (setq NOMENTC "c:/PERSO/bibliotheque/SYMBOLE/COTNIVD"
  ANGLEC  (angtos  [surligneur] ANGLES[/surligneur] 0 8)
   )
 )
 ;;fin bloc de base créer symetriquement par rapport a l'axe Y
 
 
 ;;porte 90
 ;;bloc de base créer symetriquement par rapport a l'axe X

 
 (if (= NOMENTS " [surligneur] P90D 50 50[/surligneur]")
   (setq NOMENTC " [surligneur] c:/PERSO/bibliotheque/MENINT/DESSUS/P90G 50 50[/surligneur]"
  ANGLEC  (angtos (- ANGLES pi) 0 8)
   )
 )
 (if (=   NOMENTS [surligneur]"P90G 50 50[/surligneur]")
   (setq NOMENTC " [surligneur] c:/PERSO/bibliotheque/MENINT/DESSUS/P90D 50 50[/surligneur]"
  ANGLEC  (angtos  [surligneur] (- ANGLES pi)[/surligneur] 0 8)
   )
 )
;;fin porte 90

 
 (command "INSERER" NOMENTC P1 (abs ECHLX) "" ANGLEC)
 (setq CIBLE (entlast))
 (PUTATT CIBLE LST)
 (command "effacer" SOURCE "")
 (command "scu" "P")
 (setvar "clayer" CAV)
 (princ)
)

 

[Edité le 26/9/2008 par PHILPHIL]

 

[Edité le 26/9/2008 par PHILPHIL]

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

:D

Merci beaucoup

Je test dés que j'ai 5 minute ( ou plutôt dés que le client m'auras envoyer les fonds de plans à jours)

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

  • 3 semaines après...

Il y a une erreur de syntaxe avec :

(defun C: DG (/

LST

;;; / P1 LST ANGLES ECHLX

;;; NOMENTS NOMENTC...

 

Et de manière plus générale, le lisp ce charge bien mais quand je tape GETATT, il me met commande inconnue :?:

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

Salut Oli553,

 

Et de manière plus générale, le lisp ce charge bien mais quand je tape GETATT, il me met commande inconnue :?:

 

GETATT (comme PUTATT) sont des "sous-routines", c'est à dire des fonctions LISP définies par l'utilisateur qui s'utilisent comme les fonctions LISP natives (prédéfinies).

on reconnaît ces fonctions par leur nom qui ne commence pas par c:

(defun getatt (bl) ...)

 

Ces fonctions sont appelées par la commande définie en LISP DG qu'on reconnaît, elle, à son préfixe c:

(defun C:DG ...)

 

C'est donc DG qu'il faut entrer à la ligne de commande pour lancer la commande.

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

Lien vers le commentaire
Partager sur d’autres sites

oups, et en plus je le savait.......je suis impardonnable. :(

Merci (gile)

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é