Aller au contenu

Duplication des objets sur un Layer dans une XREF


YUHTINA44

Messages recommandés

Bonjour à toutes et à tous,

Dans un Dessin Courant AutoCAD, j'ai un calque nommé RESEAU et différents fichiers .dwg ont été attachés en XREF, sur un calque nommé REFERENCES. Les fichiers .dwg  attachés en XREF ont la même structure. En particulier, dans chacun d'entre eux, des objets graphiques sont placées sur un calque nommé FILAIRE.

Dans le Dessin Courant AutoCAD, j'aimerais dupliquer sur le calque RESEAU - via un code AutoLISP - les objets contenus sur le calque FILAIRE de chacune des XREF.

Merci pour votre aide.

YUHTINA44

Lien vers le commentaire
Partager sur d’autres sites

Merci lili2006 pour ta réponse.

J'ai bien sûr commencé par regarder cette commande _NCOPY. Il est même possible de l'utiliser au sein d'une fonction AutoLISP.

Mon problème est de constituer le jeu de sélection attendu dans les paramètres de la commande. Constituer un jeu de sélection à partir d'objets contenus dans le Dessin Courant AutoCAD, ce n'est pas un problème - d'une manière ou d'une autre. En revanche, quid d'un jeu de sélection contenant des objets présents sur un calque dans une XREF.

Je recherche une solution analogue à : (setq ensW (ssget "X" (list (cons 8 "FILAIRE")))) - mais dans une XREF

Merci encore.

Lien vers le commentaire
Partager sur d’autres sites

Hello

Tu devrais regarder cette routine Lisp "NN" qui extrait UN objet depuis une XREF puis cree un Bloc puis l'explose / decompose ...

Tu y trouveras peut etre de l'inspiration pour boucler sur N objets !?

Tiree de mon stock de 3001 routines !

La Sante, Bye, lecrabe

 

 
;; 
;; https://www.theswamp.org/index.php?topic=27786.0
;; 

;; 
;; XShrimp 2009.3.13 -Commande: NN
;; 

(defun c:NN ( / acaddocument acadobject blockobj blockrefobj i mspace n nent obj objent) 

(VL-LOAD-COM) 

(defun make*ublock(obj / blockobj) 
  (setq blockObj (vla-add (vla-get-Blocks AcadDocument) (vlax-3d-point (list 0 0 0))  "*U" )  )     
  (vla-CopyObjects AcadDocument
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbObject (cons 0 0) )
      (list obj)   
    )
   blockObj
  )   
 (vla-delete obj)
 (vla-get-name  blockObj)
)
(setq AcadObject (vlax-get-acad-object)
      AcadDocument (vla-get-ActiveDocument Acadobject)
      mSpace (vla-get-ModelSpace Acaddocument)
)
(if (= (length (setq nent (nentsel))) 4)
(progn
  (entmake (entget (car nent)))
  (setq objent (vlax-ename->vla-object (entlast))i 0)   
  (foreach n (last nent) 
  (setq obj (vlax-ename->vla-object n))   
  (setq blockRefObj
    ( vla-InsertBlock
      mSpace
      (vla-get-InsertionPoint obj)
      (make*ublock  objent )
      (vla-get-xScaleFactor   obj)
      (vla-get-yScaleFactor   obj)
      (vla-get-zScaleFactor   obj)
      (vla-get-Rotation       obj)
    )
  )
  (setq i (1+ i)) 
  (if(> i 1)  (command "_.explode" (entlast))  )
  (setq objent(vlax-ename->vla-object (entlast)))     
  );end foreach  

(command "_.explode" (entlast)) ;; Explode the created entity

(sssetfirst nil (ssget "p")) 
)
)
(prin1)
)

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup lecrabe. Sympa comme speudo !

Ce qui me pose problème, c'est que je ne peux pas - ou ne veux pas - avoir d'interaction avec l'utilisateur. Tout doit se dérouler de manière "silencieuse". D'où l'analogie que j'évoquais : (setq ensW (ssget "X" (list (cons 8 "FILAIRE"))))

Je pense que la fonction ssget n'est pas applicable avec les objets contenus dans une XREF. Je suis donc en recherche d'une solution alternative.

Merci beaucoup.

Lien vers le commentaire
Partager sur d’autres sites

J'avais créé un lisp pour une création de calque "valeur ajoutée" du style CFO/AME .... par rapport à plusieurs calques de référence contenus dans un ou plusieurs Xref.

 

J'avais tenté de refaire mon lisp afin de l'optimiser un peu (et accessoirement de rajouter quelques remarques), donc voici le début :

Pour infos, structure du calque de référence :
Mini : TOP-?-?-?
Maxi : TOP??-?????-????????-?

Exemple 1 : TOP1M-CR204-EF-E
Exemple 2 : TOP-_-_-W

*****************


;;; Nom du corps d'état de référence
;;; Variable vcalquerefbase : Nom du corps d'état de référence
(defun pcalquerefbase()
  (setq vcalquerefbase "TOP")
)

;;; Récupération nom XREF avec Début du nom du calque de référence
;;; Variable vcalquerefbase : voir Programme pcalquerefbase
;;; Variable vxnc : Début du nom du calque de référence
(defun pxrefname()
  (defun biton ( v vbit / )
    (cond
      ((/= (logand v vbit) 0) T)
      (T nil)
    )
  )
  ;entree
  (setq res nil)
  (setq tbl (tblnext "BLOCK" t))
  (while tbl
    (setq ass70 (cdr (assoc 70 tbl)))
    (if (biton ass70 4)                        ; traitement d'un xref
      (progn
        (setq ass2 (cdr (assoc 2 tbl)))       ; Récupération du nom public
        (setq vxnc (strcat ass2 "|" vcalquerefbase))
        (ppcc) ; lancement du programme pour la création des calques
        (setq res (append res (list ass2)))   ; ajout à la liste res     
      )
    )
    (setq tbl (tblnext "BLOCK"))
  )
  (setq vxnc vcalquerefbase)
 (ppcc) ; lancement du programme pour la création des calques
)

;;; 
;;; 
;;; Lancement du programme
;;; 
(defun c:creacalque()
  (pcalquerefbase)
  (pxrefname)
)

;;; Fin du nom du calque de référence
;;; Variable vxncf : Fin du nom du calque de référence
;;; Variable wvxncf : Compteur / Boucle pour la variable vxncf
(defun pcalquereffin()
 (if (= wvxncf 0)
  (setq vcrf "-_-W"))
 (if (= wvxncf 1)
  (setq vcrf "-PD-E"))
 (if (= wvxncf 2)
  (setq vcrf "-EF-E"))
 (if (= wvxncf 3)
  (setq vcrf "-CL-E"))
)

;;; Programme pour la création des calques
(defun ppcc()
 (princ vxnc)
)

Si ça peut aider 😉 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Il y a cette solution mais avec intervention de l'utilisateur (peut-être scriptable) https://www.youtube.com/watch?v=6b3XPcWB7nw

Sinon, si tu parles couramment le C# il y a le blog de Norman Yuan qui explique comment faire ça :

https://drive-cad-with-code.blogspot.com/2019/08/selecting-multiple-nested-entities-2-of.html

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

hello

quelques routines, pour extraire sans ou avec destruction des entites dans l'XREF ou bloc,

pour incorporer avec ou sans destruction d'entité dans l'Xref ou bloc

 

les Xref ne doivent pas etre ouvert dans autocad

pour extraire d'un Xref, le plus simple et de ne faire apparaitre que la couche a extraire.

et pour la routine "c:extraire_entite_xref_bloc_copie_CALQUE"  il suffit d'etre déja dans le calque ou l'on veut que la copie soit faite

SANS DESTRUCTION DES ENTITES

c:extraire_entite_xref_bloc_copie

c:extraire_entite_xref_bloc_copie_CALQUE

c:INCORPORER_entite_xref_bloc_copie

AVEC DESTRUCTION DES ENTITES

c:extraire_entite_xref_bloc_efface

c:INCORPORER_entite_xref_bloc_efface

a+

Phil
 

;;;------------------------------------------
;;;EXTRAIRE DES ENTITEES D'UN BLOC OU XREF
;;;------------------------------------------


(defun c:extraire_entite_xref_bloc_copie ()
  (setq osm (getvar "osmode"))
  (prompt "\nVEUILLEZ SELECTIONNER UN XREF OU BLOC POUR L'EXTRACTION D'ENTITES ")
  (command-s "-editref" pause "" "OK" "T" "N")
  (prompt "\nCLIQUER SUR LES OBJETS A EXTRAIRE :")
  (setq obj nil)
  (while (null obj) (setq obj (ssget)))
  (setvar "osmode" 0)
  (command-s "ALIGNER3D" obj "" "c" "0,0,0" "100000,0,0" "" "0,0,0" "100000,0,0" "q")
  (command-s "_refset" "S" obj "")
  (command-s "_refclose" "e" "d" "0,0,0" "0,0,0" )
  (setvar "osmode" osm)
)


(defun c:extraire_entite_xref_bloc_copie_CALQUE ()
  (setq osm (getvar "osmode"))
  (setq cav (getvar "clayer"))
  (prompt "\nVEUILLEZ SELECTIONNER UN XREF OU BLOC POUR L'EXTRACTION D'ENTITES ")
  (command-s "-editref" pause "" "OK" "T" "N")
  (prompt "\nCLIQUER SUR LES OBJETS A EXTRAIRE :")
  (setq obj nil)
  (while (null obj) (setq obj (ssget)))
  (setvar "osmode" 0)
  (command-s "ALIGNER3D" obj "" "c" "0,0,0" "100000,0,0" "" "0,0,0" "100000,0,0" "q")
  (command "_laymch" obj "" "N" cav)
  (command-s "_refset" "S" obj "")
  (command-s "_refclose" "e" "d" "0,0,0" "0,0,0" )
  (setvar "osmode" osm)
)

(defun c:INCORPORER_entite_xref_bloc_copie ()
  (setq osm (getvar "osmode"))
  (prompt "\nCLIQUER SUR LES OBJETS A INCORPORER :")
  (setq obj nil)
  (while (null obj) (setq obj (ssget)))
  (setvar "osmode" 0)
  (command-s "ALIGNER3D" obj "" "c" "0,0,0" "100000,0,0" "" "0,0,0" "100000,0,0" "q")
  (prompt "\nVEUILLEZ SELECTIONNER UN XREF OU BLOC POUR L'INCORPORATION D'ENTITES ")
  (command-s "-editref" pause "" "OK" "T" "N")
  (command-s "_refset" "A" obj "")
  (command-s "_refclose" "e" "d" "0,0,0" "0,0,0" )
  (setvar "osmode" osm)
)

(defun c:extraire_entite_xref_bloc_efface ()
  (setq osm (getvar "osmode"))
  (prompt "\nVEUILLEZ SELECTIONNER UN XREF OU BLOC POUR L'EXTRACTION D'ENTITES ")
  (command-s "-editref" pause "" "OK" "T" "N")
  (prompt "\nCLIQUER SUR LES OBJETS A EXTRAIRE :")
  (setq obj nil)
  (while (null obj) (setq obj (ssget)))
  (setvar "osmode" 0)
  (command-s "_refset" "S" obj "")
  (command-s "_refclose" "e" "d" "0,0,0" "0,0,0" )
  (setvar "osmode" osm)
)

(defun c:INCORPORER_entite_xref_bloc_efface ()
  (setq osm (getvar "osmode"))
  (prompt "\nCLIQUER SUR LES OBJETS A INCORPORER :")
  (setq obj nil)
  (while (null obj) (setq obj (ssget)))
  (setvar "osmode" 0)
  (prompt "\nVEUILLEZ SELECTIONNER UN XREF OU BLOC POUR L'INCORPORATION D'ENTITES ")
  (command-s "-editref" pause "" "OK" "T" "N")
  (command-s "_refset" "A" obj "")
  (command-s "_refclose" "e" "d" "0,0,0" "0,0,0" )
  (setvar "osmode" osm)
)

 

 

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

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é