Titifonky Posté(e) le 6 juin 2005 Posté(e) le 6 juin 2005 Bonjour à tous, Je suis en train de faire un petit programme (ça faisait longtemps) pour transformer des régions en polyligne. J'ai chercher sur le forum mais je n'ais rien trouver de très intéressant pour m'aider.Ma demarche est la suivante : (dans le même programme Lisp) 1 - Je crée des régions en utilisant la commande "Boundary"2 - J'assemble les régions avec la commande "Union"3 - J'explose la région obtenu.4 - Je crée une polyligne à partir des objets récupéré de l'explosion Mon problème se trouve entre l'étape 2 et l'étape 3. Quand la région est crée à partir de la commande "Union", je n'arrive pas à récupérer le numéro de l'entité crée. (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (while (setq point (getpoint)) (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) ;; mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ) ;_ Fin de while ;; annulations de la mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; union des régions (eval (append '(command "union") list_ent)) ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; le numéro de cette entité correspond au numéro récupéré avant la commande union !!!!!! (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Il faudrait peut-être mettre à jour la base de donnée des objets mais comment !!!!J'ai essayé de faire un "entupd" sur les régions que j'ai crée mais ça ne met pas à jour le fait que ces régions ont été unie.La solution pourrait être d'avoir deux programmes Lisp:-le premier programme permettrait d'unir les régions créesEntre les deux programmes, les objets serait mis à jour automatiquement par Autocad-le deuxième programme recupererait la région crée par union et la décomposerait pour créer la polyligneCette solution ne m'interresse pas car elle demande de faire deux manipulation mais s'il n'y a pas d'autre solutions je me resignerais à utiliser celle-ci. J'ai essayé de passer par le VLisp pour l'union des régions mais je n'ais pas tout compris vue le peu d'information que j'ais pu trouver. Il semblerait que l'union ne peut se faire qu'avec deux entités maximum ????? J'ai pensé également à récuperer les données de définition de la région mais je comprend pas ou l'on peut trouver les informations sur ses sommets et les différentes types d'objets qui la compose. Cet objet AutoCAD à l'air assez complexe à utiliser. Je ne pensais pas qu'il serait aussi compliqué de faire un programme comme ça !!!! Si quelqu'un à déjà rencontré le problème de la mise à jour des entités, son aide serait la bienvenue Merci www.le-metal.net, sur la métallerie
Tramber Posté(e) le 6 juin 2005 Posté(e) le 6 juin 2005 Je ne peux t'aider en direct car je n'ai pas le logiciel sous les doigts. Mais tu n'as pas fait de (setq ent (entlast)) avant tes opérations pour faire ensuite des entnext ?! C'est tout bête mais ca marche Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Serge Posté(e) le 6 juin 2005 Posté(e) le 6 juin 2005 Titifunky, Je ne sais pas si tu connais la variable HPBOUND ni l'aboutissement de ton programme. Cependant, voici quelques corrections [ le mélange de (command), de (entmake) et de (vla-*) donne de mauvais résultats si on compile en fas ou vlx). (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (setq repere (entlast)) (initget 1) (setq point (getpoint "\nMontrez le point interne: ")) (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) ;; mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;;;(mapcar ;;;'(lambda (x) ;;;(vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ;;;) ;_ Fin de lambda ;;;list_ent ;;;) ;_ Fin de mapcar ;;;) ;_ Fin de while ;; annulations de la mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;;;(mapcar ;;;'(lambda (x) ;;;(vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ;;;) ;_ Fin de lambda ;;;list_ent ;;;) ;_ Fin de mapcar ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; union des régions (setq ss (ssadd)) (foreach x list_ent (ssadd x ss)) (if (and ss (> (sslength ss) 1)) (command "._union" ss "")) (if (/= repere (entlast)) (progn (setq ss (ssadd)) (setq repere (entlast)) (command "._explode" (entlast) "") (setq x (entnext repere)) (while x (setq ss (ssadd x ss) x (entnext x))) (if ss (progn (princ (strcat "\nIl y a " (itoa (if ss (sslength ss) 0)) " objet(s) décomposé(s)")) (princ "\nLes voici bouger") (command "._move" ss "" point pause) ) (progn (princ "\nRaté !") )) )) ;;;(eval (append '(command "union") list_ent)) ;; recupération du numero de la dernière entitée crée ;;;(princ (entlast)) ;; le numéro de cette entité correspond au numéro récupéré avant la commande union !!!!!! (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Serge
Titifonky Posté(e) le 7 juin 2005 Auteur Posté(e) le 7 juin 2005 Bonjour Serge, Pour repondre à ta question, ce programme me sert à creer des profils métallique à partir de formes rapide à dessiner tel que les cercles et les rectangles. Ces formes sont assemblées et transformées en polyligne à l'aide de ce programme.Après quelques modification, j'ai repris la base de mon programme que tu m'as corrigé et je l'ai terminé. J'ai rajouté un filtre pour les splines (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (setq repere (entlast)) (initget 1) (while (setq point (getpoint "\nMontrez le point interne des régions à assembler : " ) ;_ Fin de getpoint ) ;_ Fin de setq (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ) ;_ Fin de while ;; mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;; annulations de la mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ;; union des régions (setq ss (ssadd)) (foreach x list_ent (ssadd x ss)) (if (and ss (> (sslength ss) 1)) (command "._union" ss "") ) ;_ Fin de if (if (/= repere (entlast)) (progn (setq ss (ssadd)) (setq repere (entlast)) (command "._explode" (entlast) "") (setq x (entnext repere)) (while x (if (not (equal (cdr (assoc 0 (entget x))) "SPLINE")) (setq ss (ssadd x ss)) ) ;_ Fin de if (setq x (entnext x)) ) ;_ Fin de while ) ;_ Fin de progn ) ;_ Fin de if (command "_pedit" "_multiple" ss "" "_yes" "_join" "" "") (setq poly (entlast)) (command "._move" poly "" pause pause) (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Merci beaucoup pour ton aide Titifonky [Edité le 7/6/2005 par Titifonky] www.le-metal.net, sur la métallerie
Serge Posté(e) le 7 juin 2005 Posté(e) le 7 juin 2005 Titifonky, Pas de quoi. Tu peux corriger cela: (command "pedit" "m" ss "" "o" "j" "" "") en (command "_pedit" "_multiple" ss "" "_yes" "_join" "" "") Ça se lit mieux que des abbréviations (mis à part les termes anglais). Serge
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