sergeluc Posté(e) le 8 avril 2006 Posté(e) le 8 avril 2006 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écoupepile 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]
Patrick_35 Posté(e) le 8 avril 2006 Posté(e) le 8 avril 2006 SalutUne question bête. Pourquoi ne pas utiliser ajuster avec trajet ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
sergeluc Posté(e) le 9 avril 2006 Auteur Posté(e) le 9 avril 2006 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'autressur des blocs ,bloc imbiqué,xref ,exct....Pour que mon programme principal fonctionne complètementil 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.
sergeluc Posté(e) le 9 avril 2006 Auteur Posté(e) le 9 avril 2006 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)
bonuscad Posté(e) le 9 avril 2006 Posté(e) le 9 avril 2006 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
sergeluc Posté(e) le 10 avril 2006 Auteur Posté(e) le 10 avril 2006 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 posteraimes résultats
sergeluc Posté(e) le 26 septembre 2006 Auteur Posté(e) le 26 septembre 2006 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]
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