Aller au contenu

Duplication des objets sur un Layer dans une XREF


YUHTINA44
 Partager

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 2019 sous windows 10 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...