Aller au contenu

rendre un bloc unique


whitesquare

Messages recommandés

euh ............c'est pas comme dans sketchup pour ceux qui connaissent,

je m excuse, je me suis mal exprimé, en fait je m interroge sur la procedure a utiliser pour enregistrer un bloc sous un autre nom afin de pouvoir le modifier sans que cela modifie tous les blocs deja present dans le dessin.

 

la premiere chose qui me vient est de decomposer et de renregistré

j ai vu qu il est egalement possible, dans l editeur de bloc de faire enregistrer sous, mais cela ne modifie pas le bloc en question, il faut alors inserer le nouveau bloc (il n y a pas, à ma connaissance, de possibilité de modifier le bloc lui meme)

 

 

Lien vers le commentaire
Partager sur d’autres sites

dans Autodesk Architectural Desktop, il avait une fonction pour ça (je ne me rappelle plus trop du nom, "copier la définition du bloc et associer").

En lisp ce ne doit pas être trop comlexe je pense...

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

En m'inspirant largement de ce qu'avait fait Bred (UCS2WCSMatrix de Doug Broad inclue).

 

Edit : Devrait fonctionner quelque soit le SCU courant et quelque soient la rotation du bloc et le SCU dans lequel il a été inséré.

 

(defun c:nbl (/ old name AcDoc Space zdir ins rot nor obj new ref)
 (vl-load-com)
 (while (not
   (and
     (setq old (car (entsel "\nSélectionner le bloc à re-créer: ")))
     (= "INSERT" (cdr (assoc 0 (entget old))))
   )
 )
   (princ "\nObjet incorrect.")
 )
 (while
   (not
     (and
(setq
  name (getstring T "\nEntrez le nouveau nom pour le bloc: ")
)
(/= name "")
(null (tblsearch "BLOCK" name))
     )
   )
    (princ "\nNom incorrect.")
 )
 (setq	acDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
zdir  (trans '(0 0 1) 1 0 T)
old   (vlax-ename->vla-object old)
ins   (vlax-get old 'InsertionPoint)
rot   (vla-get-Rotation old)
nor   (vlax-get old 'Normal)
obj   (vlax-invoke old 'Explode)
new   (vla-add (vla-get-Blocks AcDoc)
	       (vlax-3d-point (trans ins 0 nor))
	       name
      )
 )
 (foreach n obj
   (vla-rotate3d
     n
     (vlax-3d-point ins)
     (vlax-3d-point (mapcar '+ ins nor))
     (- rot)
   )
   (vla-transformby
     n
     (vlax-tmatrix
(append
  (mapcar
    '(lambda (vec org)
       (append (trans vec nor 0 T) (list org))
     )
    (list '(1 0 0) '(0 1 0) '(0 0 1))
    (trans '(0 0 0) 0 nor)
  )
  (list '(0 0 0 1))
)
     )
   )
 )
 (vlax-invoke acDoc 'CopyObjects obj new)
 (mapcar 'vla-delete (cons old obj))
 (setq	ref
 (vla-insertblock
   Space
   (vlax-3d-point '(0 0 0))
   name
   1
   1
   1
   0
 )
 )
 (vla-transformby
   ref
   (vlax-tmatrix
     (append
(mapcar
  '(lambda (vec org)
     (append vec (list org))
   )
  (mxm
    (mapcar '(lambda (x) (trans x 0 nor T))
	    '((1 0 0) (0 1 0) (0 0 1))
    )
    (mapcar '(lambda (x) (trans x zdir 0 T))
	    '((1 0 0) (0 1 0) (0 0 1))
    )
  )
  ins
)
(list '(0 0 0 1))
     )
   )
 )
 (vla-rotate3d
   ref
   (vlax-3d-point ins)
   (vlax-3d-point (mapcar '+ ins nor))
   rot
 )
 (princ (strcat "Le bloc \"" name "\" a été créé."))
 (princ)
)

;; Multiply two matrices by Vladimir Nesterovsky
(defun mxm (m q)
 (mapcar '(lambda (r)
     (mapcar '(lambda (l) (apply '+ (mapcar '* l r)))
	     (apply 'mapcar (cons 'list q))
     )
   )
  m
 )
) 

 

[Edité le 6/5/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Hello Gilles

 

Comme d'habitude, FELICITATIONS ! J'aime bien cette routine :) :D :cool:

 

Cependant je signale un point "subtil" qui ne me gêne pas du tout :

 

Sur des blocs qui ont subi une commande MIRROIR, il y a souvent un facteur d'Echelle en X ou Y qui est NEGATIF (= Normal), lorsque tu reconstruit le nouveau bloc, il est refait à sa nouvelle position et avec une rotation normale donc X ou Y sont toujours positifs !

 

Pour moi c parfait, mais bon dans certains cas, les gens peuvent

peut être parfois interpréter ce facteur négatif (A vérifier) ... :exclam:

 

Attendons de voir ce que vont en dire les utilisateurs ! ;)

 

Routine testée et validée sur MAP 2004 / 2006 / 2007 et aussi sur MAP R6 (ACAD 2002)

 

Le Decapode (toujours impressionné par ton efficacité et réactivité)

 

 

[Edité le 7/5/2007 par lecrabe]

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut,

 

NBL crée une nouvelle définition de bloc dans le dessin à partir d'une référence insérée.

La nouvelle définition sera identique à la référence sélectionnée.

 

Pour l'utiliser, charger le LISP, sélectionner une référence dans le dessin et spécifier le nom du nouveau bloc. Les instructions apparaissent sur la ligne de commande.

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

Lien vers le commentaire
Partager sur d’autres sites

euh...... je comprend ce que tu m explique, du moind je crois, seulement lorsque je tape nbl cela ne fionctionne pas,

 

j avais dans un premier temps crée un fichier lsp, chargé, puis redemarrage autocad

c'est à l'evidence pas la bonne procedure puisque cela ne marche pas

 

dans un second temps j ai chargé le lisp dans la ligne de commande directement et meme resultat.

 

j ai egalement esssayé dans l editeur de bloc.........

veuillez excuser mon ignorance........et merci de votre aide

 

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

bonjou à tous,

 

suite à mon message dans le forum AUTOCAD 2009 (BLOC *U139) et aprés une recherche sur Cadxp, je suis tombé sur cette discussion.

 

(gile): nbl fonctionne, mais le bloc *U139 existe 50 fois dans le fichier. nbl ne change que le bloc *U139 que j'ai selectionné il ne modifi pas les 49 autres bloc *U139.

 

Tu crois que cela peut-être faisable???

 

A+

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne comprends pas bien ta demande.

Le LISP nbl créer une nouvelle définition de bloc en copiant une référence dans le dessin (et remplace cette référence par une référence du nouveau bloc créé).

 

Si tu veux remplacer toutes les références de l'ancien bloc, tu peux utiliser rbloc de Patrick_35 qui fonctionne avec les blocs dynamiques.

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

Lien vers le commentaire
Partager sur d’autres sites

  • 14 ans après...

hello Philsogood

 

;; InputBox (gile)
;; Ouvre une boite de dialogue pour récupérer une valeur
;; sous forme de chaine de caractère
;;
;; Arguments
;; tous les arguments sont de chaines de caractère (ou "")
;; box : titre de la boite de dialogue
;; msg : message d'invite
;; val : valeur par défaut
;;
;; Retour
;; une chaine ("" si annulation)
;;
;; Modifié par Patrick_35 pour inclure le caractère \n
;; comme retour chariot

(defun inputbox2 (box msg val / subr temp file dcl_id
                                               ;;ret
) ;; Retour chariot automatique à 50 caractères
  (defun subr (str / pos)
    (cond ((setq pos (vl-string-search "\n" str))
           (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))))          )
          ((and (< 80 (strlen str)) (setq pos (vl-string-position 32 (substr str 1 80) nil t)))
           (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))))    )
          (t (strcat ":text_part{label=\"" str "\";}"))
    )
  )
  ;; Créer un fichier DCL temporaire
  (setq temp (vl-filename-mktemp "Tmp.dcl")
        file (open temp "w")
        ret  ""
  )
  ;; Ecrire le fichier
  (write-line (strcat "InputBox:dialog{key=\"box\";initial_focus=\"val\";spacer;:paragraph{"
                      (subr msg)
                      "}spacer;:edit_box{key=\"val\";edit_width=120;allow_accept=true;}
    spacer;ok_cancel;}"
              )
              file
  )
  (close file)
  ;; Ouvrir la boite de dialogue
  (setq dcl_id (load_dialog temp))
  (if (not (new_dialog "InputBox" dcl_id))
    (exit)
  )
  (set_tile "box" box)
  (set_tile "val" val)
  (action_tile "accept" "(setq ret (get_tile \"val\")) (done_dialog)")
  (start_dialog)
  (unload_dialog dcl_id)
  ;;Supprimer le fichier
  (vl-file-delete temp)
  ret
)

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

Il y a 2 heures, philsogood a dit :

je me rappelle plus si j'ai déjà posté ce pb mais toujours est-il que je n'ai pas corrigé le lisp

après avoir sélectionné mon lisp, j'ai en retour la ligne suivante

erreur: no function definition: INPUTBOX2

que faut-il faire?

Phil

De quoi parle-t-on ?

Ce sujet a 15 ans et il n'y est jamais question d'une fonction INPUTBOX2 !

  • Upvote 1

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

Lien vers le commentaire
Partager sur d’autres sites

hello Gile

j'ai modifie ton lisp en rajoutant un "inputbox"

ca doit etre de ce lisp que parle Philsogood, par contre je ne sais plus sur quel post je l'ai mis.

Phil

;;;-----------------------------
;;;créer un clone avec un nom different
;;;-----------------------------


;; NBL -03/08/07- version 2.2
;; Crée un nouvelle définition de bloc semblable à celle de la référence sélectionnée.
;; La référence sélectionnée est remplacée par une référence de la nouvelle définition
;; qui conserve ses propriétés.

(defun c:nbl2 (/ old-ref new-name acdoc space blocks old-name old-block new-block obj new-ref)
  (vl-load-com)
  (while (not (and (setq old-ref (car (entsel "\nSélectionner le bloc à re-créer: ")))
                   (= "INSERT" (cdr (assoc 0 (entget old-ref))))
              )
         )
    (princ "\nObjet incorrect.")
  )
  (while (not (and (setq new-name (getstring t "\nEntrez le nouveau nom pour le bloc: "))
                   (/= new-name "")
                   (null (tblsearch "BLOCK" new-name))
              )
         )
    (princ "\nNom incorrect.")
  )
  (setq acdoc     (vla-get-activedocument (vlax-get-acad-object))
        space     (if (= (getvar "CVPORT") 1)
                    (vla-get-paperspace acdoc)
                    (vla-get-modelspace acdoc)
                  )
        blocks    (vla-get-blocks acdoc)
        old-ref   (vlax-ename->vla-object old-ref)
        old-name  (if (vlax-property-available-p old-ref 'effectivename)
                    (vla-get-effectivename old-ref)
                    (vla-get-name old-ref)
                  )
        old-block (vla-item blocks old-name)
        new-block (vla-add blocks (vlax-3d-point '(0 0 0)) new-name)
  )
  (vlax-for o old-block (setq obj (cons o obj)))
  (vlax-invoke acdoc 'copyobjects obj new-block)
  (and (vlax-property-available-p old-block 'units)
       (vla-put-units new-block (vla-get-units old-block))
  )
  (setq new-ref (vla-insertblock space
                                 (vlax-3d-point '(0 0 0))
                                 new-name
                                 (vla-get-xscalefactor old-ref)
                                 (vla-get-yscalefactor old-ref)
                                 (vla-get-zscalefactor old-ref)
                                 (vla-get-rotation old-ref)
                )
  )
  (vla-put-normal new-ref (vla-get-normal old-ref))
  (vla-put-insertionpoint new-ref (vla-get-insertionpoint old-ref))
  (if (= (vla-get-hasattributes old-ref) :vlax-true)
    (progn (setq old-att (mapcar '(lambda (att) (cons (vla-get-tagstring att) att)) (vlax-invoke old-ref 'getattributes))
                 new-att (mapcar '(lambda (att) (cons (vla-get-tagstring att) att)) (vlax-invoke new-ref 'getattributes))
           )
           (foreach att new-att
             (foreach prop (list 'alignment      'backward       'color          'fieldlength    'height         'insertionpoint 'invisible
                                 'layer          'textstring     'linetype       'linetypescale  'lineweight     'material       'normal
                                 'obliqueangle   'rotation       'scalefactor    'stylename      'textstring     'thickness      'truecolor
                                 'upsidedown     'visible
                                )
               (if (vlax-property-available-p (cdr (assoc (car att) old-att)) prop)
                 (vlax-put (cdr att) prop (vlax-get (cdr (assoc (car att) old-att)) prop))
               )
             )
           )
    )
  )
  (vla-delete old-ref)
  (princ (strcat "Le bloc \"" new-name "\" a été créé."))
  (princ)
)



;; NBL -09/06/16- version 2.3
;; gile
;; Crée un nouvelle définition de bloc semblable à celle de la référence sélectionnée.
;; La référence sélectionnée est remplacée par une référence de la nouvelle définition
;; qui conserve ses propriétés.

(defun c:nbl (/ old-ref new-name acdoc space blocks old-name old-block new-block obj new-ref)
  (vl-load-com)
  (while (not (and (setq old-ref (car (entsel "\nSélectionner le bloc à re-créer: ")))
                   (= "INSERT" (cdr (assoc 0 (entget old-ref))))
              )
         )
    (princ "\nObjet incorrect.")
  )
  (setq old-ref  (vlax-ename->vla-object old-ref)
        old-name (if (vlax-property-available-p old-ref 'effectivename)
                   (vla-get-effectivename old-ref)
                   (vla-get-name old-ref)
                 )
  )
  (while (not (and (progn (setq boite "MODIFICATION DU NOM DE BLOC")
                          (setq message "NOUVEAU NOM")
                          (inputbox2 boite message old-name)
;;;                          (setq new-name ret)
                          (snvalid (setq new-name ret))
                   )
                   (/= new-name "")
                   (null (tblsearch "BLOCK" new-name))
              )
         )
    (princ "\nNOM INCORRECT.")
  )
  (setq acdoc     (vla-get-activedocument (vlax-get-acad-object))
        space     (if (= (getvar "CVPORT") 1)
                    (vla-get-paperspace acdoc)
                    (vla-get-modelspace acdoc)
                  )
        blocks    (vla-get-blocks acdoc)
        old-block (vla-item blocks old-name)
        new-block (vla-add blocks (vlax-3d-point '(0 0 0)) new-name)
  )
  (vlax-for o old-block (setq obj (cons o obj)))
  (vlax-invoke acdoc 'copyobjects obj new-block)
  (and (vlax-property-available-p old-block 'units)
       (vla-put-units new-block (vla-get-units old-block))
  )
  (setq new-ref (vla-insertblock space
                                 (vlax-3d-point '(0 0 0))
                                 new-name
                                 (vla-get-xscalefactor old-ref)
                                 (vla-get-yscalefactor old-ref)
                                 (vla-get-zscalefactor old-ref)
                                 (vla-get-rotation old-ref)
                )
  )
  (vla-put-normal new-ref (vla-get-normal old-ref))
  (vla-put-insertionpoint new-ref (vla-get-insertionpoint old-ref))
  (if (= (vla-get-hasattributes old-ref) :vlax-true)
    (progn (setq old-att (mapcar '(lambda (att) (cons (vla-get-tagstring att) att)) (vlax-invoke old-ref 'getattributes))
                 new-att (mapcar '(lambda (att) (cons (vla-get-tagstring att) att)) (vlax-invoke new-ref 'getattributes))
           )
           (foreach att new-att
             (foreach prop (list 'alignment      'backward       'color          'fieldlength    'height         'insertionpoint 'invisible
                                 'layer          'textstring     'linetype       'linetypescale  'lineweight     'material       'normal
                                 'obliqueangle   'rotation       'scalefactor    'stylename      'textstring     'thickness      'truecolor
                                 'upsidedown     'visible
                                )
               (if (vlax-property-available-p (cdr (assoc (car att) old-att)) prop)
                 (vlax-put (cdr att) prop (vlax-get (cdr (assoc (car att) old-att)) prop))
               )
             )
           )
    )
  )
  (vla-delete old-ref)
  (princ (strcat "Le bloc \"" new-name "\" a été créé."))
  (princ)
)

 

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

Le 14/01/2023 à 17:47, (gile) a dit :

De quoi parle-t-on ?

Ce sujet a 15 ans et il n'y est jamais question d'une fonction INPUTBOX2 !

15 ans... c'est moche ske tu viens de dire... j'ai repris ton code comme tu l'avais ecrit à l'initial et je n'ai plus de pb

bonne année M. le retraité 😉

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

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é