Aller au contenu

decoupe pline traversant un rectangle


Messages recommandés

Posté(e)

Bonjour,

Quelqu'un peut-il m'aider sur cette ébauche de fonction.But recherché :Découpe d'une ou plusieurs lwpolylines traversant une polyline fermée ou un rectangle.

Les erreurs :la découpe devrait ne se faire qu'à l'intérieure du rectangle,messages d'erreur

"la courbe doit couper les arètes sécantes au moins deux fois et pas d'intersection à l'intérieur de cette courbe"

ma première analyse est que la commande trim pose un problème losque l'on découpe

pile poil sur la polyline fermée .faut-il nécessairement que le rectangle que je cré pour la découpe soit légèrement inférieur à le polyline fermée ou y a t-il une astuce.

merci d'avance pour qui voudra bien me répondre

 

le lisp dans la réponse suivante

 

[Edité le 8/4/2006 par sergeluc][Edité le 8/4/2006 par sergeluc][Edité le 9/4/2006 par sergeluc]

 

[Edité le 9/4/2006 par sergeluc]

Posté(e)

Une question bête. Pourquoi ne pas utiliser ajuster avec trajet ?

Bonjour,

Parceque ce n'est qu'un bout de routine de test qui me sert a traiter un point parmis d'autres

sur des blocs ,bloc imbiqué,xref ,exct....Pour que mon programme principal fonctionne complètement

il me faut résoudre celui-ci.

Quelqu'un a t-il une réponse à cela ?

faut-il nécessairement que le rectangle que je cré pour la découpe soit légèrement inférieur à le polyline fermée ou y a t-il une astuce.
Posté(e)

 

Le lisp : Ce n'est qu'une fonction qui doit en rejoindre d'autres pour un traitement plus poussé sur des blocs.

Les messages d'erreurs se situe a l'utilisation de la commade "TRIM"

 

 

 
;test de decoupe par la fonction TRIM de ligne ou pline traversant une polyline FERMEE
(defun c:test4 (/ ent)
(vl-load-com)
 (setq ent (entsel "\nChoix d'une polyligne "))
(setq ent (entget(car ent)))
(test4)
(princ)
);defun



(defun test4 ( / pt_lst bbox1 pt1-bbox1 pt2-bbox1 pt3-bbox1 pt4-bbox1 pt5-bbox1)
;sort la liste des points de tous les sommets
 (cond
   ((= (cdr (assoc 0 ent)) "LWPOLYLINE")
    (setq nbs	  (cdr (assoc 90 ent))
   cnt	  0
   pt_lst '()
    ) ;_ Fin de setq
    (while (< cnt nbs)
      (if (= (caar ent) 10)
 (setq pt_lst (cons (cdar ent) pt_lst)
       cnt    (+ cnt 1)
 ) ;_ Fin de setq
      ) ;_ Fin de if
      (setq ent (cdr ent))
    ) ;_ Fin de while
    (setq pt_lst (reverse pt_lst));sans Z
 (setq ptscu (mapcar '(lambda (x) (trans x 0 1)) pt_lst));avec Z

;-------------POUR INFO pour après
;verifier si c'est un lwpolyline ouverte ou fermée
(if (equal(car ptscu)(last ptscu))
(alert "lwpolyline fermée")
(alert "lwpolyline ouverte")
);if
;-------------


;je récupère les points min et max pour dessiner un rectangle
 (setq
p_min 
(list
	(apply 'min (mapcar 'car ptscu))
;pour les cas ou on trouve pwline fermée +lines exct
	;(apply 'min (mapcar 'caddr ptscu));a voir pour pwline fermées
               (apply 'max (mapcar 'cadr ptscu));pour pwline ouvertes
0.0
);list
p_max
(list
	(apply 'max (mapcar 'car ptscu))
	;(apply 'max (mapcar 'caddr ptscu));a voir pour pwline fermées
               (apply 'min (mapcar 'cadr ptscu));pour pwline ouvertes
0.0
);list
 );setq



;création du rectangle qui sert à la découpe
(command "_.rectang" p_min p_max);pour test
 (setq bbox1 (entlast))

;je récupére les 4 assoc 10 du rectangle
(if bbox1
(progn
(setq n-bbox1 (entget bbox1))

    (setq nbs	  (cdr (assoc 90 n-bbox1))
   cnt	  0
   pt_lst '()
    ) ;_ Fin de setq
    (while (< cnt nbs)
      (if (= (caar n-bbox1) 10)
 (setq pt_lst (cons (cdar n-bbox1) pt_lst)
       cnt    (+ cnt 1)
 ) ;_ Fin de setq
      ) ;_ Fin de if
      (setq n-bbox1 (cdr n-bbox1))
    ) ;_ Fin de while
    (setq pt_lst (reverse pt_lst));sans Z
 (setq ptscu1 (mapcar '(lambda (x) (trans x 0 1)) pt_lst));liste avec les Z

;les 4 assoc 10
(setq pt1-bbox1 (nth 0 ptscu1)
     pt2-bbox1 (nth 1 ptscu1)
     pt3-bbox1 (nth 2 ptscu1)
     pt4-bbox1 (nth 3 ptscu1)
);setq

;;;;;;;;;DECOUPE DU POINT 1 AU POINT 1;;;;;;;;;;;;;;
;les TESTS avec messages d'erreur

;TEST 1 La courbe doit couper les arêtes sécantes au moins deux fois
; (command "_TRIM" "_SINGLE" bbox1 "_F" pt1-bbox1 pt2-bbox1 pt3-bbox1 pt4-bbox1 pt1-bbox1  "" "")

;TEST 2 La courbe doit couper les arêtes sécantes au moins deux fois.
;Pas d'intersection à l'intérieur de cette courbe.
(command "_TRIM" bbox1 "" "_F" pt1-bbox1 pt2-bbox1  "" "_F" pt2-bbox1 pt3-bbox1 "" "_F" pt3-bbox1  pt4-bbox1  "" "_F" pt4-bbox1 pt1-bbox1 "" "")

;suppression du rectangle
 (entdel bbox1)

(alert "terminé");test fin de fonction
);progn
);if bbox


   );cond
 ) ;_ Fin de cond

);defun test4 



(c:test4)

Posté(e)

Il y avait eu ce SUJET .

 

Bien qu'elle doit fonctionner avec des segments de contour courbe, mais cette situation n'est pas simple à résoudre (elle peut ne pas fonctionner correctement)

Par contre pour un contour composé de segment droit ça doit fonctionner sans problème (sous réserve tou de même).

 

Voilà, si ça t'interresse, pour avoir une idée de méthode, mais je dis pas que c'est la meilleure.

 

Il ya "_Extrim" des Express qui permet de faire cela, pas toujours parfaitement non-plus, mais c'est quand même une fonction beaucoup plus aboutie. (Par contre difficile à décortiquer) :casstet:

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

merci bonuscad pour ta réponse ,tu as bien saisi mon petit souci,le lien je l'avais trouvé hier soir.je ne désespère pas et j'essaie d'aborder le problème différemment.Si j'y arrive je posterai

mes résultats

 

  • 5 mois après...
Posté(e)

Bonjour à tous ;

avec un peu ......de temps on trouve ,voici une solution :

 

;test de decoupe par la fonction TRIM de lignes , plines , lwpolylines traversant une lwpolyline FERMEE (exemple: un rectangle) et suppression des objets a l'interieur de la fenetre
de découpe
;on peut aussi découper des cercles,vertex


(defun c:test4 (/ ent)
(vl-load-com)
(setq ent (entsel "\nChoix d'une polyligne "));pour exemple
(setq ent (entget(car ent)))
(test4)
(princ)
);defun



(defun test4 ( / pt_lst bbox1 pt1-bbox1 pt2-bbox1 pt3-bbox1 pt4-bbox1 pt5-bbox1)
;sort la liste des points de tous les sommets
(cond
((= (cdr (assoc 0 ent)) "LWPOLYLINE");pour exemple
(setq nbs (cdr (assoc 90 ent))
cnt 0
pt_lst '()
) ;_ Fin de setq
(while (< cnt nbs)
(if (= (caar ent) 10)
(setq pt_lst (cons (cdar ent) pt_lst)
cnt (+ cnt 1)
) ;_ Fin de setq
) ;_ Fin de if
(setq ent (cdr ent))
) ;_ Fin de while
(setq pt_lst (reverse pt_lst));sans Z
(setq ptscu (mapcar '(lambda (x) (trans x 0 1)) pt_lst));avec Z


;je récupère les points min et max pour dessiner un rectangle
(setq
p_min 
(list
(apply 'min (mapcar 'car ptscu))
;pour les cas ou on trouve pwline fermée +lines exct
;(apply 'min (mapcar 'caddr ptscu));a voir pour pwline fermées
(apply 'max (mapcar 'cadr ptscu));pour pwline ouvertes
0.0
);list
p_max
(list
(apply 'max (mapcar 'car ptscu))
;(apply 'max (mapcar 'caddr ptscu));a voir pour pwline fermées
(apply 'min (mapcar 'cadr ptscu));pour pwline ouvertes
0.0
);list
);setq

;création du rectangle qui sert à la découpe
(command "_.rectang" p_min p_max);pour test
(setq bbox1 (entlast))

;je récupére les 4 assoc 10 du rectangle
(if bbox1
(progn
(setq n-bbox1 (entget bbox1))

(setq nbs (cdr (assoc 90 n-bbox1))
cnt 0
pt_lst '()
) ;_ Fin de setq
(while (< cnt nbs)
(if (= (caar n-bbox1) 10)
(setq pt_lst (cons (cdar n-bbox1) pt_lst)
cnt (+ cnt 1)
) ;_ Fin de setq
) ;_ Fin de if
(setq n-bbox1 (cdr n-bbox1))
) ;_ Fin de while
(setq pt_lst (reverse pt_lst));sans Z
(setq ptscu1 (mapcar '(lambda (x) (trans x 0 1)) pt_lst));liste avec les Z

;les 4 assoc 10
(setq pt1-bbox1 (nth 0 ptscu1)
pt2-bbox1 (nth 1 ptscu1)
pt3-bbox1 (nth 2 ptscu1)
pt4-bbox1 (nth 3 ptscu1)
);setq


;suppression des objets superflus a l'interieur de la fenetre
 (command "_.erase" "_w" pt1-bbox1 pt4-bbox1 "_r" bbox1 "")
;;;;;;;;;DECOUPE DU POINT 1 AU POINT 1;;;;;;;;;;;;;;
 (command "_.trim" bbox "" "_f" pt1-bbox1 pt2-bbox1 ""     
                         "_f" pt2-bbox1 pt3-bbox1 ""     
                         "_f" pt3-bbox1 pt4-bbox1 ""     
                         "_f" pt4-bbox1 pt1-bbox1 "" ""  
);command

;suppression du rectangle
(entdel bbox1)

(alert "terminé");test fin de fonction
);progn
);if bbox


);cond
) ;_ Fin de cond

);defun test4 



(c:test4)

 

 

 

[Edité le 26/9/2006 par sergeluc]

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é