Aller au contenu

Sujet épineux : les régions et les polylignes


Titifonky

Messages recommandés

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ées

Entre 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 polyligne

Cette 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
Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

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

 

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é