Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Avec AutoCAD MAP, nous avons l'objet Mpolygone (version améliorée d'une polyligne avec remplissage), il est très facile de convertir une polyligne en mpolygone en conservant les données d'objets mais le contraire n'est pas possible.

Lorsqu'il n'y a pas de données d'objets, j'utilise la fonctions Décomposer AutoCAD qui transforme bien le mpolygone en lwpolyligne mais qui perd les données d'objets si précieuses.

 

Je souhaiterais donc une fonction AutoLISP/VisualLISP,

 

1- la première idée qui m'est venue à l'esprit est d'utiliser la commande décomposer AutoCAD mais à quel endroit utiliser copy_od pour récupérer et copier les données d'objets.

 

2- recréer une lwpolyligne du mpolygone (avec la différence de géométrie des points sommets) et d'assigner les données d'objets à cet nouvel objet lwpolyligne et d'effacer son équivalent mpolygone.

 

3- Bien sur le tout dans une boucle afin de traiter plusieurs objets mpolygones en même temps.

 

Merci,

 

Posté(e)

Salut,

 

Je te propose un petit truc que je n'ai pas essayé.

Il utilise la routine copy_data utilisée par copy_od.

 

;; ExplodeAndCopyData
;; Décompose un objet et copie les ObjectData vers les objets résultant
(defun ExplodeAndCopyData (source / copy ss n ent)
 (command "_.copy" source "" "" "")
 (setq copy (entlast))
 (command "_.explode" copy)
 (setq	ss (ssget "_P")
n  -1
 )
 (while (setq ent (ssname ss (setq n (1+ n))))
   (copy_data source ent "All")
 )
 (entdel source)
)

;; EXPL_OD
;; Décompose tous les objets sélectionnés et copie les ObjectData
(defun c:expl_od (/)
 (if (and (setq n -1) (setq ss (ssget)))
   (while (setq ent (ssname ss (setq n (1+ n))))
     (ExplodeAndCopyData ent)
   )
 )
)

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

Posté(e)

Merci Gile,

 

La routine fonctionne sur Ma MAP 3D 2009, j'ai rajouté le fichier copy_od.lsp au début de la fonction afin de ne pas recharger la fonction au démarrage.

 

Afin de rajouter le calque d'origine en Visuallisp, faut-il ajouter deux fois la fonction (vlax-release-object obj_vl) une pour l'objet effacé et une autre pour l'objet créé ?

 

Merci,

 

Fabrice,

 

Posté(e)

J'ai essayé ceci mais ca ne fonctionne pas et je perds la notion de bouclage sur objet :

;; ExplodeAndCopyData
;; Décompose un objet et copie les ObjectData vers les objets résultant
(defun ExplodeAndCopyData (source / copy ss n ent)
(setq obj_vl_source (vlax-ename->vla-object source))
(setq calque_obj_vl_source (vla-get-Layer obj_vl_source))
(command "_.copy" source "" "" "")
(setq copy (entlast))
(command "_.explode" copy)
(setq ss (ssget "_P") n -1)
(while (setq ent (ssname ss (setq n (1+ n))))
	(copy_data source ent "All")
)
(entdel source)
(setq obj_vl_cible (vlax-ename->vla-object copy))
(setq calque_obj_vl_cible (vla-put-Layer calque_obj_vl_source))
(vlax-release-object obj_vl_source)
(vlax-release-object obj_vl_cible)
);fin defun ExplodeAndCopyData

;; EXPL_OD
;; Décompose tous les objets sélectionnés et copie les ObjectData
(defun c:expl_od (/)
(setvar "cmdecho" 0)
(vl-load-com)
(if (and (setq n -1) (setq ss (ssget)))
	(while (setq ent (ssname ss (setq n (1+ n))))
		(ExplodeAndCopyData ent)
	);fin while
);fin if
); fin c:expl_od

Posté(e)

Si tu veux utiliser Visual LISP, autant l'utiliser d'un bout à l'autre.

 

Pas testé non plus (mais on peut annuler)

 

;; ExplodeAndCopyData
;; Décompose un objet et copie les ObjectData vers les objets résultant
(defun ExplodeAndCopyData (source / layer copy obj-lst)
 (setq	layer	(vla-get-Layer source) ;_ calque de l'objet source
copy	(vla-Copy source) ;_ copie de l'objet source
obj-lst	(vlax-invoke copy 'Explode) ;_ liste des objets résultant
 )
 (foreach obj obj-lst ;_ pour chaque objet résultant
   (copy_data source ent "All") ;_ copie des ObjectData
   (vla-put-Layer obj layer) ;_ attribution du calque de l'objet source
 )
 (vla-Delete source)
) ;_ fin defun ExplodeAndCopyData

;; EXPL_OD
;; Décompose tous les objets sélectionnés et copie les ObjectData
(defun c:expl_od (/ *error* acdoc ss)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))

 ;; redéfinition locale de *error*
 (defun *error* (msg)
   (or	(= msg "Fonction annulée")
(princ (strcat "\nErreur: " + msg))
   )
   (vla-EndUndoMark acdoc)
   (princ)
 )

 (if (ssget)
   (progn
     (vla-StartUndoMark acdoc)
     ;; traitement de tous les objets du jeu de sélection actif
     (vlax-for	obj (setq ss (vla-get-ActiveSelectionSet acdoc))
(ExplodeAndCopyData obj)
     )
     (vla-Delete ss) ;_ suppression du jeu de sélection
     (vla-EndUndoMark acdoc)
   )
 )
)

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

Posté(e)

Un message d'erreur avec la version en visual lisp :

NB : J'ai enlevé la fonction COPY_OD devant le corps de la fonction expl_OD

Commande: EXPL_OD
; erreur: une erreur est survenue dans la fonction *erreur*type d'argument 
incorrect: stringp #

 

[Edité le 9/3/2010 par fabcad]

Posté(e)

 

Hello Fab

 

J'ai charge avant la routine COPY_OD.lsp d'Autodesk

et quand je lance EXPL_OD j'ai la meme erreur que toi !

 

Sniff, sniff, je fais quoi ?

 

Mais j'ai confiance en Gilles, il nous a toujours developpe des routines Nickel-Chrome ! :)

 

So waiting ...

Merci d'avance, Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Oupss !...

 

J'avais laissé trainé des *acdoc* (variable globale chez moi) à la place de acdoc la variable définie dans le LISP.

 

J'ai corrigé le code, ça devrait marcher.

Finalement, je vais peut-être finir par installer MAP 2009 pour pouvoir faire des tests...

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

Posté(e)

Sacré Gile le mot de la fin pour bien rigoler.

 

En effet, je crois qu'Autodesk devrait même te la fournir gratuitement,

 

Je ressaie,

 

A tout de suite,

 

Fabrice

 

Posté(e)

Aie Erreur dont j'ai copié collé la phrase :

Commande: VL_EXPL_OD ; erreur: Le serveur ActiveX a renvoyé l'erreur: nom 
inconnu: ActiveSelectionSet

Posté(e)

 

Hello

 

Sous MAP 2010, je confirme le message (y compris dans un nouveau dessin) et y compris en ayant charge et utilise COPY_OD.lsp avant de lancer EXPL_OD ...

 

Je plane complet ...

 

Le Decapode

 

 

Autodesk Expert Elite Team

Posté(e)

Pareil que le décapode dans un nouveau dessin,

Commande: EXPL_OD
; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: ActiveSelectionSet

Posté(e)

Ça y est, j'ai trouvé, j'avais mis ActiveSelectionSet à la place de ActiveDocument.

 

J'ai corrigé.

 

Pourriez vous me dire en 2 mots comment ajouter des données d'objet à un Mpolygon (j'ai installé MAP 2009 et dessiné un Mpolygon, mais je n'arrive pas à lui ajouter des données).

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

Posté(e)

Les Mpolygons ne supportent pas la méthode Explode (vla-Explode).

 

Il va peut-être falloir en revenir à command...

 

PS : j'ai trouvé pour les ObjectData

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

Posté(e)

En effet la sélection fonctionne mais un message d'erreur s'affiche après.

 

Peut-on revenir avec Command pour Décomposer le mpolygone mais en gradnat le visuallisp pour la mise à jour du calque.

 

a+

 

 

[Edité le 9/3/2010 par fabcad]

Posté(e)

La routine COPY_DATA n'utilise pas Visual LISP et requiert des arguments de type ENAME donc je ne suis pas sûr que ce soit vraiment intéressant d'utiliser Visual LISP.

 

Une nouvelle version qui limite l'utilisation de command à explode et qui fonctionne ! Testée sur MAP 2009 !!!

 

PS : les données étendues sont aussi conservées.

 

;; ExplodeAndCopyData
;; Décompose un objet et copie les ObjectData vers les objets résultant
(defun ExplodeAndCopyData (source / layer copy ss n ent)
 (setq layer (cdr (assoc 8 (entget source))))
;;;  (command "_.copy" source "" "" "")
;;;  (setq copy (entlast))
 (setq copy (entmakex (entget source '("*"))))
 (command "_.explode" copy)
 (setq	ss (ssget "_P")
n  -1
 )
 (while (setq ent (ssname ss (setq n (1+ n))))
   (copy_data source ent "All")
   (setq elst (entget ent))
   (entmod (subst (cons 8 layer) (assoc 8 elst) elst))
 )
 (entdel source)
)

;; EXPL_OD
;; Décompose tous les objets sélectionnés et copie les ObjectData
(defun c:expl_od (/)
 (if (and (setq n -1) (setq ss (ssget)))
   (while (setq ent (ssname ss (setq n (1+ n))))
     (ExplodeAndCopyData ent)
   )
 )
)

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

Posté(e)

Merci Gile,

 

Ca fonctionne sur map 2009,

 

Bienvenue à un nouveau map(peur) :-)

 

Pour toute question AutoCAD MAP, n'hésite pas.

 

Fabrice

 

Posté(e)

 

Hello

 

De plus ca fonctionne sur MAP 2010 ! :)

 

Encore Merci Gilles, Le Decapode

 

PS :Bienvenue a un nouveau MAPpien ! :D

 

 

Autodesk Expert Elite Team

Posté(e)

Le nouveau "map(peur)" ou "MAPpien" ne comprends pas grand chose à ce logiciel...

 

Je n'arrive même pas à ouvrir les dessins du dossier Samples :

Cet élément ne contient aucune donnée de grille.

L'obtention de données de bande a échoué.

L'étendue de la carte courante ne contient pas de donnée.

L'ouverture de la connexion FDO a échoué.

Le répertoire 'C:\AutoCAD Map 3D 2009 Sample Data\NAVTEQ Data\Rio de Janeiro, Brazil\' n'existe pas.

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

  • 2 semaines après...
Posté(e)

Bonjour,

 

Il y aurait peut-être une solution sans programmation.

 

Export des MPolygone et leurs données d'objets en SHP file (ou SDF) , puis ré-import du SHP (SDF) avec les OD en cochant l'option "traiter les polygones en polyligne"

 

C'est moins fun, c'est sûr!!!

 

Olivier

Support Technique Covadis

Posté(e)

 

Hello Olivier

 

Oui absolument par un MAPEXPORT puis un MAPIMPORT en cochant l'option evoquee

par Olivier, on obtient le resultat voulu ! :)

 

Mais cela peut s'averer un peu fastidieux ... :casstet:

 

Le Decapode

 

Autodesk Expert Elite Team

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é