fabcad Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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,
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 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,
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 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
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 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]
lecrabe Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 Aie Erreur dont j'ai copié collé la phrase : Commande: VL_EXPL_OD ; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: ActiveSelectionSet
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 :casstet: c'est très curieux ce message. Peut-être devrait tu essayer dans un nouveau fichier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 Pareil que le décapode dans un nouveau dessin, Commande: EXPL_OD ; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: ActiveSelectionSet
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Ç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
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 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]
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
fabcad Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 Merci Gile, Ca fonctionne sur map 2009, Bienvenue à un nouveau map(peur) :-) Pour toute question AutoCAD MAP, n'hésite pas. Fabrice
lecrabe Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Hello De plus ca fonctionne sur MAP 2010 ! :) Encore Merci Gilles, Le Decapode PS :Bienvenue a un nouveau MAPpien ! :D Autodesk Expert Elite Team
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 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
lecrabe Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Hello COOL demain je t'envoie qq Infos ... Le Decapode Autodesk Expert Elite Team
SupportCova Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 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
lecrabe Posté(e) le 20 mars 2010 Posté(e) le 20 mars 2010 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant