Aller au contenu

Messages recommandés

Posté(e)

bonjour

 

sujet surement deja evoqué ici mais OU ?? mystere

 

je voudrais récuperer toutes les valeurs des attributs d'un bloc

( ils seront surement récuper dans une liste et tjrs rangés dans le meme ordres , je ferais le tri )

 

pour les réinjecter dans un autre bloc meme nom d'attributs

 

voir pour inserer un nouveau bloc avec les valeurs d'attributs recuperer

 

car probleme d'orientation des texte avec les symetries et bloc parametriques

 

merci

 

phil

 

 

 

 

 

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

Salut,

 

Deux petites routines :

- getAtt pour récupérer les attributs d'un bloc, pas besoin de se soucier de l'ordre, la liste retournée est une liste d'association du type :

((etiquette1 . valeur1) (etiquette2 . valeur2) ...)

- putAtt pour donner ou changer leurs valeurs aux attributs d'un bloc, utilise aussi une liste d'association.

 

;; 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
) 

 

Un exemple pour tester :

 

(defun c:test (/ lst)
 (and
   (setq source (car (entsel "\nBloc source: ")))
   (setq lst (getatt source))
   (setq cible (car (entsel "\nBloc cible: ")))
   (putatt cible lst)
 )
 (princ)
) 

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

Posté(e)

Salut

 

Pour aller à l'essentiel

 

(setq bl (vlax-ename->vla-object (car (entsel)))) ; choix du bloc
(mapcar 'vla-get-textstring (vlax-invoke bl 'getattributes)) ; valeur des attributs

 

@+

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

Posté(e)

merci beaucoup pour les LISP

 

il me reste juste a les comprendre mais ca marche d'enfer

manipuler les deux lisp pour en faire un autre

 

selection du bloc1

recuperations des attributs bloc1

point dinsertion bloc1

 

insetion bloc2 au meme point que bloc1

suppression bloc1

remplacement des atributs de bloc2 par la liste de attributs bloc1

 

ni vu ni connu on ne clique que une fois

 

ha si souci les blocs on un fonction de visibilite car blocs parametrique

 

 

vla-get-textstring ou trouve t'on l'aide pour cette fonction ???

elle n'est pas dans "ACAD_ALR.CHM

 

 

si je comprend bien il y un "vla-get... " et un vla-put" pour chaque sous entite

 

"vla-get-layer" ...... oui ? voir fichier aide ok j'irais voir

 

PHIL

 

 

 

[surligneur] SELECTIONNER UNE ENTITE POUR INFO1.; IAcadLine: Interface AutoCAD Line

; Valeurs de propriétés:

; Angle (RO) = 0.0

; Application (RO) = #

; Delta (RO) = (100.0 0.0 0.0)

; Document (RO) = #

; EndPoint = (50.0 0.0 0.0)

; Handle (RO) = "11D8F"

; HasExtensionDictionary (RO) = 0

; Hyperlinks (RO) = #

; Layer = "C_AXES"

; Length (RO) = 100.0

; Linetype = "ByLayer"

; LinetypeScale = 1.0

; Lineweight = -1

; Material = "ByLayer"

; Normal = (0.0 0.0 1.0)

; ObjectID (RO) = 2126492024

; ObjectName (RO) = "AcDbLine"

; OwnerID (RO) = 2126491688

; PlotStyleName = "ByLayer"

; StartPoint = (-50.0 0.0 0.0)

; Thickness = 0.0

; TrueColor = #

type d'argument incorrect: VLA-OBJECT nilColor 20319680>

; Visible = -1[/surligneur]

 

 

 

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

vla-get-textstring ou trouve t'on l'aide pour cette fonction ???

 

Les fonctions vla-* sont des transpositions des méthodes et propriétés utilisées en VBA. Elle sont renseignées dans l'aide aux développeurs > ActiveX and VBA Reference.

Mais on y accède directement depuis l'éditeur Visual LISP par le bouton [?] soit après avoir sélectionné la fonction dans la routine soit en entrant son nom dans la petite boite de dialogue.

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

Posté(e)

SALUT patrick

 

je viens de tester ton lisp RBLOC

 

pas mal si on reste tjrs dans le meme scu

 

mon souci est que je fais des miroir des blocs possedant des attributs

aussi bien miroir par rapport a l'axe X que Y

 

donc je me retrouve avec des blocs

echx = 1, echy =1

et d'autre x=-1 , y=1

 

je voudrais tout remettre x=1, y=1

 

j'ai essayer avec MIRRTEXT = 0 ou = 1

 

les attributs sont soit tournés soit refltés et ne sont donc plus lisible en tournant le scu

 

le but serait non pas de remplacer l'atome N°2 ( nom du bloc) du bloc par un nouveau nom d'atome

 

mais bien de replacer un nouveau bloc tourner convenablement par rapport au scu choisi a l'origine de l'ancien bloc récuperer les attributs et les réinjecter dans le nouveau

 

pour etre sur que les textes soit lisible

 

pas sur que j'ai été comprehensible la

 

je peux envoyer un fichier pour etre plus clair

 

phil

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

pas sur que j'ai été comprehensible la

 

Pas vraiment, non.

 

Je te propose quelque chose, peut-être y verra-t-on plus clair après tes essais.

 

Ce LISP appelle les deux petites routines (getAtt et PutAtt) données plus haut, elles doivent donc être chargées.

De plus si getblock est chargé, le choix du bloc (pour le filtre de sélection) se fait par boite de dialogue, sinon il faut entrer son nom à la ligne de commande.

 

(defun c:b2b (/ name)
 (vl-load-com)
 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace acdoc)
	(vla-get-ModelSpace acdoc)
      )
 )
 (if (member (type getblock) '(SUBR USUBR))
   (setq name (getblock nil))
   (while (not
     (and (setq name (getstring "\nEntrez le nom du bloc: "))
	  (tblsearch "BLOCK" name)
     )
   )
     (princ (strcat "\nLe bloc \"" name "\" est introuvable."))
   )
 )
 (princ
   "\nSélectionnez les blocs (ou Entré, Espace ou clic droit pour Tous)."
 )
 (if (or (ssget (list '(0 . "INSERT") (cons 2 name)))
  (ssget "_X" (list '(0 . "INSERT") (cons 2 name)))
     )
   (progn
     (vla-StartUndoMark acdoc)
     (vlax-for	b (vla-get-ActiveSelectionSet acdoc)
(setq att (getAtt b))
(setq new
       (vla-InsertBlock
	 space
	 (vla-get-InsertionPoint b)
	 name
	 1.0
	 1.0
	 1.0
	 0.0
       )
)
(vla-delete b)
(putAtt new att)
     )
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
) 

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

Posté(e)

salut gile

 

merci pour le lisp

j'ai charge "getblock" aussi

 

ca ne marche pas

 

je peux t'envoyer un fichier ca sera nettement plus clair

 

phil

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

ca ne marche pas 

 

Qu'estce qui ne marche pas ?

 

je peux t'envoyer un fichier ca sera nettement plus clair

 

Je crains que le fichier ne me dise pas ce que tu veux faire, mais si tu veux :

 

gilecantel(a)wanadoo.fr

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

Posté(e)

Salut (gile)

 

Je pense que PHILPHIL à des blocs avec un facteur d'échellle de 1, et d'autres, un facteur d'échelle de -1 à cause des miroirs. Du coup, l'affichage des attributs liés aux blocs sont à l'envers. Il souhaiterait, si j'ai bien compris, que tout soit à l'endroit, donc de mettre un facteur d'échelle positif à ses blocs. Je me demande si ton lisp edit_bloc avec son facteur d'échelle le permet ?

 

@+

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

Posté(e)

Je me demande si ton lisp edit_bloc avec son facteur d'échelle le permet ?

 

Je ne pense pas, Edit_bloc agit sur les définitions de blocs, le facteur d'echelle permet de modifier l'échelle globale de toutes les entités composant le boc.

 

S'il s'agit juste de rendre positifs les facteurs d'échelle :

 

(defun c:b2b (/ name)
 (vl-load-com)
 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace acdoc)
	(vla-get-ModelSpace acdoc)
      )
 )
 (if (member (type getblock) '(SUBR USUBR))
   (setq name (getblock nil))
   (while (not
     (and (setq name (getstring "\nEntrez le nom du bloc: "))
	  (tblsearch "BLOCK" name)
     )
   )
     (princ (strcat "\nLe bloc \"" name "\" est introuvable."))
   )
 )
 (princ
   "\nSélectionnez les blocs (ou Entré, Espace ou clic droit pour Tous)."
 )
 (if (or (ssget (list '(0 . "INSERT") (cons 2 name)))
  (ssget "_X" (list '(0 . "INSERT") (cons 2 name)))
     )
   (progn
     (vla-StartUndoMark acdoc)
     (vlax-for	b (vla-get-ActiveSelectionSet acdoc)
(cond
  ((minusp (setq xsc (vla-get-XScaleFactor b)))
   (vla-put-XScaleFactor b (* -1 xsc))
  )
  ((minusp (setq ysc (vla-get-YScaleFactor b)))
   (vla-put-YScaleFactor b (* -1 ysc))
  )
  ((minusp (setq zsc (vla-get-ZScaleFactor b)))
   (vla-put-ZScaleFactor b (* -1 zsc))
  )
)
     )
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
) 

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

Posté(e)

Salut,

 

Il aurait été plus simple que tu demandes tout de suite de remplacer les blocs "cotnivD" par des nlocs "cotnivG" avec les mêmes valeurs d'attibuts et une rotation de 180°.

 

Les routines getAtt et PutAtt doivent être chargés

 

(defun c:d2g (/ name)
 (vl-load-com)
 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace acdoc)
	(vla-get-ModelSpace acdoc)
      )
 )
 (princ
   "\nSélectionnez les blocs (ou Entré, Espace ou clic droit pour Tous)."
 )
 (if (or (ssget '((0 . "INSERT") (2 . "cotnivD")))
  (ssget "_X" (list '(0 . "INSERT")))
     )
   (progn
     (vla-StartUndoMark acdoc)
     (vlax-for	b (vla-get-ActiveSelectionSet acdoc)
(setq att (getAtt b))
(setq new
       (vla-InsertBlock
	 space
	 (vla-get-InsertionPoint b)
	 "cotnivG"
	 1.0
	 1.0
	 1.0
	 0.0
       )
)
(vla-delete b)
(putAtt new att)
(vla-put-rotation new pi)
     )
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
) 

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

Posté(e)

SALUT GILE

 

appareemnt ca ne devait pas etre plus simple de l'exprimer ainsi car ca ne marche pas

 

les 3 attrubuts se retrouve sous la ligne d'axe

 

dsl je trouve pas le moyen de mettre une image pour te montrer ici

je viens de te l'envoyer par mail

 

mettre le nouveau bloc a 180 degre par raport au scu ne reglera pas le probleme

pour des blocs dont la symetrie a été faite par rapport a un autre axe non parrallele a X

 

bonne soirée

 

phil

 

 

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

salut gile

 

ne cherche plus j'ai trouvé

c'est nettement moins pointu que les vlax vla vlx mais ca marche dans tous les sens

 

et apres remaniment on doit surement pouvoir faire une boucle pour plusieurs bloc a la fois

 

merci a toi pour les bouts de LISP

 

phil

 

 

(defun C:GAP2 (/ LST)

;;; (and

(setq SOURCE (car (entsel "\nBloc source: ")))

(command "scu" "")

(setq LST (GETATT SOURCE))

(setq P1 (cdr (assoc 10 (entget SOURCE))))

(setq ANGLE1 (cdr (assoc 50 (entget SOURCE))))

(command "INSERER"

"c:/program files/AA2008/PERSO/bibliotheque/SYMBOLE/ [surligneur] cotnivG[/surligneur]"

P1

(rtos (/ (* 0.01 TXTECH) TECHL) 2 8)

""

(angtos ANGLE1 0 8)

)

(setq CIBLE (entlast))

(PUTATT CIBLE LST)

(command "effacer" SOURCE)

(princ)

)

 

;; 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

)

 

 

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

  • 5 mois après...
Posté(e)

ok je viens apres les reponses lips mais si il y en a qui cherche avec autres choses!

c'est un petit script fait sur excel et pour moi c'est tellement plus simple

 

open d:\0_CovBib_1000.Dwt -->nom du fichier où ce trouve les nouveaux blocs

-INSERER EP1 948296.806,109775.801,1012.181 1 0

Regard -->pas oublier le saut de ligne

DFe.100

1012,181

Ø400

1010,765

1,416

 

 

-INSERER EP2 948333.667,109800.752,1013.207 1 0

Regard

DFe.101

1013,207

Ø400

1010,468

2,739

Ø300

1012,082

1,125

 

 

dons si ton "gabarit" ou neo "dessin.dwg" qui comprend les nouveaux blocs est chargé au départ tu va tout faire automatiquement sur excel , faut pas oublier de le renommer en .scr

le fichier ascii

-inserer Nom de commande

ep2 nom du bloc

948***** x

1******* y

1013*** z

1 echelle uniforme pour le cas de mon bloc ou tu peut avoir echx 1 et ech y 1

0 rotation

regard & jusqu'a la fin ->remplissage attribut du bloc

 

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é