Aller au contenu

bonuscad

Membres
  • Compteur de contenus

    5 029
  • Inscription

  • Dernière visite

  • Jours gagnés

    56

Tout ce qui a été posté par bonuscad

  1. Pendant la pause déjeuner j'ai essayer d'intégrer le "U" pour l'annulation. J'ai du revoir un peu le montage du code pour cela, le pan ou le zoom avec la roulette reste toujours un problème avec (grread): l'appui sur la molette n'est pas reconnu, donc je ne peux pas l'identifier... Donc éviter au maximum l'usage de la roulette, maintenant le U permettra quand même d'annuler les segments générés pendant l'usage de celle-ci Il faut quand même une bonne dextérité pour l'usage, mais ça à l'air de fonctionner. Pour l'annulation l'appui sur la touche "U" suffit: NE PAS FAIRE ENTREE pour valider. Le code résultant: (defun round (num prec) (if (zerop (setq prec (abs prec))) num (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5))) ) ) (defun c:test ( / p1 p2 key pt_sel ss ent obj_lw param_pt new_param pt lst_pt lst_gr) (initget 1) (setq p1 (getpoint "\nPoint de départ: ") new_param nil ent nil lst_pt nil lst_gr nil ) (while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32)))) (/= (car key) 25)) (cond ((eq (car key) 5) (setq pt_sel (osnap (list (caadr key) (cadadr key)) "_near") ) (if pt_sel (progn (setq ss (ssget "_C" pt_sel pt_sel '((0 . "LWPOLYLINE")))) (if ss (setq ent (ssname ss 0))) ) ) (cond (ent (setq obj_lw (vlax-ename->vla-object ent) pt_sel (vlax-curve-getClosestPointTo obj_lw (trans (cadr key) 1 0)) ) (cond (pt_sel (setq param_pt (vlax-curve-getParamAtPoint obj_lw pt_sel) param_pt (round param_pt 1.0) ) (cond (new_param (setq pt (vlax-curve-getPointAtParam obj_lw param_pt)) (if (and (not (eq param_pt new_param)) (not (member pt lst_pt))) (progn (setq lst_pt (cons (trans pt 0 1) lst_pt)) (setq p2 (trans pt 0 1)) (setq lst_gr (append (cons 1 (list p1 p2)) lst_gr)) (grvecs lst_gr) (setq p1 p2) ) ) ) ) (setq new_param param_pt) ) ) ) ) ) ((member key '((2 117)(2 85))) (if lst_gr (setq lst_gr (cdddr lst_gr) lst_pt (cdr lst_pt) p1 (car lst_pt) ) ) (redraw) (grvecs lst_gr) ) (T (if lst_gr (grvecs lst_gr)) ) ) ) (redraw) (cond (lst_pt (setvar "CMDECHO" 0) (command "_.pline") (foreach n lst_pt (command "_none" n)) (command "") (setvar "CMDECHO" 1) (sssetfirst nil (ssadd (entlast))) ) ) (prin1) )
  2. bonuscad

    Trait d\'axe

    Essayé, mais pas trop testé, à voir... (defun sel_obj_median (msg / ent dxf_ent dlt) (while (not ent) (setq ent (entsel msg)) (cond (ent (if (eq (cdr (assoc 0 (setq dxf_ent (entget (car ent))))) "INSERT") (setq dlt (cdr (assoc 10 dxf_ent))) (setq dlt '(0.0 0.0 0.0)) ) (setq ent (nentselp (cadr ent))) (setq dxf_ent (entget (car ent))) (if (member (cdr (assoc 0 dxf_ent)) '("LINE" "ARC" "CIRCLE" "LWPOLYLINE")) (list dxf_ent dlt) (progn (setq ent nil) (princ "\nL'objet ne convient pas! Attend une LIGNE, ARC, CERCLE ou POLYLIGNE.") ) ) ) (T (princ "\nAucun objet sélectionné!") ) ) ) ) (defun c:vertex_median ( / fst_ob snd_obj dxf_obj n e_valid tmp_obj delta lst1 lst2 nw_lst l_vtx l_blg lremov) (setq fst_obj (sel_obj_median "\nSélectionner le 1er objet: ") snd_obj (sel_obj_median "\nSélectionner le 2ème objet: ") ) (cond ((eq (cdr (assoc 0 fst_obj)) (cdr (assoc 0 snd_obj))) (setq dxf_obj (car fst_obj) n 1 e_valid T tmp_obj (car snd_obj) delta (cadr fst_obj)) (repeat 2 (set (read (strcat "lst" (itoa n))) (cond ((eq (cdr (assoc 0 dxf_obj)) "LINE") (list (cons (mapcar '+ (cdr (assoc 10 dxf_obj)) delta) 0.0) (cons (mapcar '+ (cdr (assoc 11 dxf_obj)) delta) 0.0)) ) ((eq (cdr (assoc 0 dxf_obj)) "ARC") (list (cons (mapcar '+ (cdr (assoc 10 dxf_obj)) delta) (cdr (assoc 40 dxf_obj))) (cons (list (cdr (assoc 50 dxf_obj)) (cdr (assoc 51 dxf_obj))) 0.0)) ) ((eq (cdr (assoc 0 dxf_obj)) "CIRCLE") (list (cons (mapcar '+ (cdr (assoc 10 dxf_obj)) delta) (cdr (assoc 40 dxf_obj)))) ) ((eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE") (mapcar 'cons (mapcar '(lambda (x) (list (+ (car x) (car delta)) (+ (cadr x) (cadr delta)))) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_obj))) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_obj)) ) ) ) ) (setq dxf_obj (car snd_obj) n (1+ n)) ) (if (not (eq (length lst1) (length lst2))) (progn (setq e_valid nil) (princ "\nPas de cohérence dans le nombre de sommets."))) (While e_valid (setq nw_lst (mapcar 'cons (mapcar '(lambda (x y) (list (* (+ (caar x) (caar y)) 0.5) (* (+ (cadar x) (cadar y)) 0.5) ) ) lst1 lst2 ) (mapcar '(lambda (x y) (* (+ (cdr x) (cdr y)) 0.5) ) lst1 lst2 ) ) ) (cond ((eq (cdr (assoc 0 dxf_obj)) "LINE") (setq dxf_obj (subst (cons 10 (caar nw_lst)) (assoc 10 dxf_obj) dxf_obj) dxf_obj (subst (cons 11 (caadr nw_lst)) (assoc 11 dxf_obj) dxf_obj) ) ) ((eq (cdr (assoc 0 dxf_obj)) "ARC") (setq dxf_obj (subst (cons 10 (caar nw_lst)) (assoc 10 dxf_obj) dxf_obj) dxf_obj (subst (cons 40 (cdar nw_lst)) (assoc 40 dxf_obj) dxf_obj) dxf_obj (subst (cons 50 (caaadr nw_lst)) (assoc 50 dxf_obj) dxf_obj) dxf_obj (subst (cons 51 (car (cdaadr nw_lst))) (assoc 51 dxf_obj) dxf_obj) ) ) ((eq (cdr (assoc 0 dxf_obj)) "CIRCLE") (setq dxf_obj (subst (cons 10 (caar nw_lst)) (assoc 10 dxf_obj) dxf_obj) dxf_obj (subst (cons 40 (cdar nw_lst)) (assoc 40 dxf_obj) dxf_obj) ) ) ((eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE") (setq l_vtx (mapcar 'car nw_lst) l_blg (mapcar 'cdr nw_lst) dxf_obj nil) (while tmp_obj (cond ((eq (caar tmp_obj) 10) (setq dxf_obj (cons (cons 10 (car l_vtx)) dxf_obj) l_vtx (cdr l_vtx)) ) ((eq (caar tmp_obj) 42) (setq dxf_obj (cons (cons 42 (car l_blg)) dxf_obj) l_blg (cdr l_blg)) ) (T (setq dxf_obj (cons (car tmp_obj) dxf_obj)) ) ) (setq tmp_obj (cdr tmp_obj)) ) (setq dxf_obj (reverse dxf_obj)) ) ) (setq lremov nil) (foreach n dxf_obj (if (member (car n) '(5 330 -1)) (setq lremov (cons (car n) lremov)))) (foreach m lremov (setq dxf_obj (vl-remove (assoc m dxf_obj) dxf_obj)) ) (entmake (subst (cons 8 (getvar "CLAYER")) (assoc 8 dxf_obj) dxf_obj)) (cond ((not (member (cdr (assoc 0 dxf_obj)) '("ARC" "CIRCLE"))) (initget "Accepter Voir _Accept See") (if (eq (getkword "\nChoisir la solution affichée, [Accepter/Voir] la suivante? <Accepter>: ") "See") (progn (setq lst2 (reverse lst2) e_valid T) (if (eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE") (setq lst2 (mapcar 'cons (mapcar 'car lst2) (mapcar '- (mapcar 'cdr (append (cdr lst2) (list (car lst2)))))) tmp_obj snd_obj ) ) (entdel (entlast)) ) (setq e_valid nil) ) ) (T (setq e_valid nil)) ) ) ) (T (princ "\nLes objet sont de nature différente") ) ) (prin1) )
  3. J'ai voulu tester en cas réel, c'est à dire sur une feuille parcellaire comme si je voulais dessiner un zonage de POS. Et bien ça demande beaucoup de dextérité sur le maniement de la souris car les sommets sont vites générés. L'utilisation du zoom molette est vicieux car alors le curseur capte des sommets non désirés lors du zoom... Avec les segment de polyarc, cela ne fonctionne pas, (mais cela est rare dans du parcellaire). Je me suis aperçu aussi que les sommets pouvaient être générés plusieurs fois sans que cela se voit. Pour ce problème j'ai pu le corriger facilement (j'édite le code précédent) Je pense que la possibilité d'un "U" serait le bienvenu dans la boucle pour palier à une génération impromptue d'un segment. L'intégration dans (grread) risque d'être coton. Si j'ai un peu de temps je regarderais ça...
  4. Bonjour, Un embryon de code pour donner une piste, comme je sais que tu fais un peu de lisp, peut être que tu pourra approfondir le dev... (je n'ai pas trop de temps pour le faire moi même) (defun round (num prec) (if (zerop (setq prec (abs prec))) num (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5))) ) ) (defun c:test ( / cur_color key pt_sel ss ent obj_lw param_pt new_param pt lst_pt) (setq new_param nil ent nil lst_pt nil cur_color (getvar "CECOLOR") ) (setvar "CECOLOR" "1") (command "_.PLINE") (while (and (setq key (grread T 4 0)) (not (member key '((2 13) (2 32)))) (/= (car key) 25)) (setq pt_sel (osnap (list (caadr key) (cadadr key)) "_near") ) (if pt_sel (progn (setq ss (ssget "_C" pt_sel pt_sel '((0 . "LWPOLYLINE")))) (if ss (setq ent (ssname ss 0))) ) ) (cond (ent (setq obj_lw (vlax-ename->vla-object ent) pt_sel (vlax-curve-getClosestPointTo obj_lw (trans (cadr key) 1 0)) ) (cond (pt_sel (setq param_pt (vlax-curve-getParamAtPoint obj_lw pt_sel) param_pt (round param_pt 1.0) ) (cond (new_param (setq pt (vlax-curve-getPointAtParam obj_lw param_pt)) (if (and (not (eq param_pt new_param)) (not (member pt lst_pt))) (progn (setq lst_pt (cons pt lst_pt)) (command "_none" (trans pt 0 1)) ) ) ) ) (setq new_param param_pt) ) ) ) ) ) (command "") (setvar "CECOLOR" cur_color) (prin1) )
  5. Passer par un DXF? Une recherche (avec un éditeur de texte puissant) avec "acdblayout" dans celui-ci te permettra d'avoir les noms de tes présentation. Le must serait que le ScanDXF de Brice propose cette option, puis un export en CSV et hop tu génère tes macros!
  6. J'ai amélioré un peu mon précédent code. Ce qui a changé: - Suppression de la sélection automatique de toute les lignes dans le dessin, je préfère qu'une sélection soit faite par l'utilisateur. - Recherche des verticalités et horizontalités dans le SCU courant. - Élimination des intersections qui seraient identique aux extrémités des lignes. - Prise en compte des caractéristiques forcées éventuelles des lignes (couleur, type de ligne, épaisseur) - Substitution de l'utilisation de SNAPUNIT par DIMEXO pour le décalage de coupure (ça me semble plus logique de s'appuyer sur cette variable) (defun c:cut_line ( / js_all js_h js_v lst_exth lst_extv nb_all name_ent dxf_ent dxf_10 dxf_11 nb_v lst_pt_brk v_name dxf_entv lst_int lst_pt_make) ;recupere toutes les lignes du dessin dans js_all et declare deux jeux vides de selection vertical et horizontal (princ "\nSélectionner les lignes pour couper les lignes verticales avec les horizontales: ") (setq js_all (ssget '((0 . "LINE"))) js_h (ssadd) js_v (ssadd) lst_exth nil lst_extv nil) ;si il y a des lignes (cond (js_all ;alors pour chaque ligne on recupere ses points de definition (repeat (setq nb_all (sslength js_all)) (setq name_ent (ssname js_all (setq nb_all (1- nb_all))) dxf_ent (entget name_ent) dxf_10 (cdr (assoc 10 dxf_ent)) dxf_11 (cdr (assoc 11 dxf_ent)) ) ;si les Y sont identique dans le SCU courant à 0.00001 près alors on ajoute l'entite au jeu horizontal ;si les X sont identique dans le SCU courant à 0.00001 près alors on ajoute l'entite au jeu vertical (cond ((equal (cadr (trans dxf_10 0 1)) (cadr (trans dxf_11 0 1)) 1E-5) (setq js_h (ssadd name_ent js_h) lst_exth (cons (list dxf_10 dxf_11) lst_exth)) ) ((equal (car (trans dxf_10 0 1)) (car (trans dxf_11 0 1)) 1E-5) (setq js_v (ssadd name_ent js_v) lst_extv (cons (list dxf_10 dxf_11) lst_extv)) ) ) ) ) ) ;s'il y a effectivement un jeu vertical ET horizontal (cond ((and js_h js_v) ;pour chaque entite verticale on cherche les intersections par iteration avec toutes les horizontales (repeat (setq nb_v (sslength js_v)) (setq lst_pt_brk nil v_name (ssname js_v (setq nb_v (1- nb_v))) dxf_entv (entget v_name) dxf_10 (cdr (assoc 10 dxf_entv)) dxf_11 (cdr (assoc 11 dxf_entv)) lst_int (vl-remove nil (mapcar '(lambda (x) (inters dxf_10 dxf_11 (car x) (cadr x) T)) lst_exth)) ) ;si l'intersection fait partie des extremites horizontale, elles sont supprimées (foreach xint lst_int (if (member xint (apply 'append lst_exth)) (setq lst_int (vl-remove xint lst_int)) ) ) ;si des intersections ont été trouvées on calcule les points de part et d'autre dans le SCU courant qu'on trie par ordre croissant en Y ;et qu'on stocke dans une liste de point pour créer les segment de ligne et on efface le segment vertical original (cond (lst_int (mapcar '(lambda (el) (setq lst_pt_brk (cons (polar el (+ (atan (/ (cadr (getvar "UCSXDIR")) (car (getvar "UCSXDIR")))) (* pi 0.5)) (getvar "DIMEXO" )) (cons (polar el (+ (atan (/ (cadr (getvar "UCSXDIR")) (car (getvar "UCSXDIR")))) (* pi 1.5)) (getvar "DIMEXO" )) lst_pt_brk ) ) ) ) lst_int ) (setq lst_pt_make (vl-sort (cons dxf_11 (cons dxf_10 lst_pt_brk)) '(lambda (e1 e2) (< (cadr e1) (cadr e2))))) (while lst_pt_make (entmake (list (assoc 0 dxf_entv) '(100 . "AcDbEntity") (assoc 67 dxf_entv) (assoc 410 dxf_entv) (assoc 8 dxf_entv) (if (assoc 62 dxf_entv) (assoc 62 dxf_entv) '(62 . 256)) (if (assoc 6 dxf_entv) (assoc 6 dxf_entv) '(6 . "BYLAYER")) (if (assoc 48 dxf_entv) (assoc 48 dxf_entv) '(48 . 1.0)) (if (assoc 370 dxf_entv) (assoc 370 dxf_entv) '(370 . -1)) '(100 . "AcDbLine") (cons 10 (car lst_pt_make)) (cons 11 (cadr lst_pt_make)) (assoc 210 dxf_entv) ) ) (setq lst_pt_make (cddr lst_pt_make)) ) (entdel v_name) ) ) ) ) ) (prin1) )
  7. J'suis déjà tondu avec ton pari! :D
  8. Moi non plus je m'en étais jamais servi, du coup je t'en ais mis 1 à tes deux messages pour m'amuser. Tu aimes? :(rires forts):
  9. Bonjour, Je n'ai pas trop de culture sur ce point, mais le peu que je sais est que: Autodesk a toujours fourni ses drivers d'impression en HPGL puis HPGL2. Le format poscript est plutôt destiné à la P.A.O. (imprimeur etc...) Ce format à été créé par Adobe, on peut voir sur wikipedia que: A priori ce ne serait pas intéressant de prendre cette option. Mais d'autre avis de diront peut être le contraire...
  10. Ton code est bien répétitif, et donc très long...! Je pense avoir saisi à peu près ce que tu veux faire. Voici un code similaire qui doit faire je pense la même chose mais pas de la même façon: j'ai "shunter" la commande BREAK pour préférer un (entmake) Profites de mes commentaires que j'ai mis (c'est très rare que je le fasse :(rires forts): ) pour comprendre la démarche du code et pouvoir le perfectionner. (defun c:cut_line ( / js_all js_h js_v lst_exth lst_extv nb_all name_ent dxf_ent dxf_10 dxf_11 nb_v lst_pt_brk v_name dxf_entv lst_int lst_pt_make) ;recupere toutes les lignes du dessin dans js_all et declare deux jeux vides de selection vertical et horizontal (setq js_all (ssget "_X" '((0 . "LINE"))) js_h (ssadd) js_v (ssadd) lst_exth nil lst_extv nil) ;si il y a des lignes (cond (js_all ;alors pour chaque ligne on recupere ses points de definition (repeat (setq nb_all (sslength js_all)) (setq name_ent (ssname js_all (setq nb_all (1- nb_all))) dxf_ent (entget name_ent) dxf_10 (cdr (assoc 10 dxf_ent)) dxf_11 (cdr (assoc 11 dxf_ent)) ) ;si les Y sont identique à 0.00001 près alors on ajoute l'entite au jeu horizontal ;si les X sont identique à 0.00001 près alors on ajoute l'entite au jeu vertical (cond ((equal (cadr dxf_10) (cadr dxf_11) 1E-5) (setq js_h (ssadd name_ent js_h) lst_exth (cons (list dxf_10 dxf_11) lst_exth)) ) ((equal (car dxf_10) (car dxf_11) 1E-5) (setq js_v (ssadd name_ent js_v) lst_extv (cons (list dxf_10 dxf_11) lst_extv)) ) ) ) ) ) ;s'il y a effectivement un jeu vertical ET horizontal (cond ((and js_h js_v) ;pour chaque entite verticale on cherche les intersections par iteration avec toutes les horizontales (repeat (setq nb_v (sslength js_v)) (setq lst_pt_brk nil v_name (ssname js_v (setq nb_v (1- nb_v))) dxf_entv (entget v_name) dxf_10 (cdr (assoc 10 dxf_entv)) dxf_11 (cdr (assoc 11 dxf_entv)) lst_int (vl-remove nil (mapcar '(lambda (x) (inters dxf_10 dxf_11 (car x) (cadr x) T)) lst_exth)) ) ;si des intersections ont ete trouves on calcule les points de part et d'autre qu'on trie par ordre croissant en Y ;et qu'on stoke dans une liste de point pour créer les segment de ligne et on efface le segment vertical original (cond (lst_int (mapcar '(lambda (el) (setq lst_pt_brk (cons (polar el (* pi 0.5) (* (cadr (getvar "snapunit" )) 3)) (cons (polar el (* pi 1.5) (* (cadr (getvar "snapunit" )) 3)) lst_pt_brk ) ) ) ) lst_int ) (setq lst_pt_make (vl-sort (cons dxf_11 (cons dxf_10 lst_pt_brk)) '(lambda (e1 e2) (< (cadr e1) (cadr e2))))) (while lst_pt_make (entmake (list (assoc 0 dxf_entv) '(100 . "AcDbEntity") (assoc 67 dxf_entv) (assoc 410 dxf_entv) (assoc 8 dxf_entv) '(100 . "AcDbLine") (cons 10 (car lst_pt_make)) (cons 11 (cadr lst_pt_make)) (assoc 210 dxf_entv) ) ) (setq lst_pt_make (cddr lst_pt_make)) ) (entdel v_name) ) ) ) ) ) (prin1) )
  11. Sans voir ton code, moi non plus... Peut être en l'abordant sous un autre angle Un exemple (non achevé) de départ construit sur ton commentaire ((lambda ( / lst_pt js e_name obj js_b nb tmp_name tmp_obj vrt_pt pt) (vl-load-com) (setq js (ssget "_X" '((0 . "LINE")))) (repeat (setq n (sslength js)) (setq e_name (ssname js (setq n (1- n)))) (cond (e_name (setq obj (vlax-ename->vla-object e_name) js_b js ) (repeat (setq nb (sslength js_B)) (setq tmp_name (ssname js (setq nb (1- nb)))) (cond (tmp_name (setq tmp_obj (vlax-ename->vla-object tmp_name) vrt_pt (vlax-variant-value (vla-IntersectWith obj tmp_obj 0)) ) (if (>= (vlax-safearray-get-u-bound vrt_pt 1) 0) (progn (setq pt (vlax-safearray->list vrt_pt)) (if pt (if (> (length pt) 3) (repeat (/ (length pt) 3) (setq lst_pt (cons (list (car pt) (cadr pt) (caddr pt)) lst_pt) pt (cdddr pt)) ) (setq lst_pt (cons pt lst_pt)) ) ) ) ) ) ) ) ) ) ) (initget 7) (setvar "FILLETRAD" (getdist "Rayon des cercles: ")) (setvar "CMDECHO" 0) (if (and lst_pt (listp lst_pt)) (foreach el lst_pt (command "_.circle" "_none" (trans el 0 1) (getvar "FILLETRAD")))) lst_pt ))
  12. Mauvaise pioche! Pour ton info, chaque coupure (break) fonctionne comme ceci: L'entité originale est conservée ET modifiée (suivant l'ordre de création des points la constituant) jusqu'à ton point de coupure. Une nouvelle entité est crée en complémentarité des caractéristiques de l'originale qui représente la seconde partie de ta coupure. Donc tu dois ajouter A CHAQUE coupure ta seconde entité crée en utilisant (entlast): pour avoir la dernière entité créé. Sans voir le code, difficile de dire où est l'erreur. D'après le message une fonction attend une chaine (string) ou une variable (symbol), mais rien (nil) lui est fournie, d'où l'erreur...
  13. Bonjour, Si la coupure (command "_.break" ...) fait partie de ton code, il te suffit de rajouter juste après; la fonction (ssadd (entlast) js) NB: Si tu es dans une boucle, il peut être nécessaire de réajuster l'index si tu utilise (ssname js ind)
  14. Bonjour, Pour te donner un début de piste, j'avais fais ceci pour mettre les coordonnées de points dans un tableau. Je n'ai pas d'exemple pour des Xdata, mais cela ne doit pas être bien compliqué à adapter... Ou encore celui là qui permet d'avoir un récapitulatif de longueur de polyligne. A la différence du premier, celui ci se met à jour (ID d'objet) en cas de modification de l'entité concernée. NB:Conseil: Utilises les tableaux avec parcimonie car ils sont très consommateur de ressources (surtout avec des liens d'objets).
  15. Tu utilise la fonction (= arg1 arg2) qui est une fonction stricte d'égalité. Comme suggéré dans les posts précédents, utilise la fonction (equal arg1 arg2 fuzz) qui te permet de testé l'égalité avec une tolérance (fuzz) sur les décimales: 0.000001 ou 1E-5 par exemple
  16. la commande (inters) a soit 5 arguments (le cinquième ayant une valeur par défaut si omis) Les arguments sont dans l'ordre: - les 2 points d'extrémité de la 1ere ligne - les 2 points d’extrémité de la 2eme ligne - un argument qui est T ou nil (T si omis) Ce dernier argument te calculera l'intersection étendue au delà des extrémités s'il a pour valeur nil. Si il n'est pas fourni, seule l'intersection effective des 2 lignes sera recherchée. Ce qui peut se passer aussi, c'est que si les points fournis sont sous la forme (X Y Z), l'intersection 3D sera recherchée. Il suffit que tu ais un delta Z infime (comme pour ton problème d'angle) pour que la fonction (inters) échoue. Soit tu ne soumet que le (X Y) de tes lignes à (inters) pour avoir l'intersection projetée (sans Z), soit tu corrige le Z de ta ligne...
  17. Le 1er était celui-ci: (defun c:unload_xref ( / js name_xref) (princ "\nSélectionner l'XRef à décharger. ") (while (null (setq js (ssget "_+.:E:S" '((0 . "INSERT"))))) (princ "\nObjets non valable!") ) (cond ((eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js 0)))))))) 4) 4) (command "_.-xref" "_Unload" name_xref) ) (T (princ "\nN'est pas une référence externe. ")) ) (prin1) ) Ça peut fonctionner avec MULTIPLE, mais alors cela boucle sur la sélection (while (null (setq js ....... Il faut simplement faire ESC pour sortir. A la volée on pourrait essayer ceci (pas droit à l'erreur de sélection, sinon on sort de la boucle) (defun c:unload_xref ( / js name_xref) (princ "\nSélectionner l'XRef à décharger. ") (while (and (setq js (ssget "_+.:E:S" '((0 . "INSERT")))) (eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js 0)))))))) 4) 4) ) (command "_.-xref" "_Unload" name_xref) (princ "\nSélectionner l'XRef à décharger. ") ) (prin1) )
  18. J'ai modifié le code ci-dessus; le déchargement se fait après validation de l'ensemble de la sélection.
  19. Salut, Pas trop testé en profondeur, mais je pense que c'est bon... (defun c:unload_xref ( / js n name_xref) (princ "\nSélectionner les XRefs à décharger. ") (while (null (setq js (ssget "_+.:E" '((0 . "INSERT"))))) (princ "\nObjets non valable!") ) (repeat (setq n (sslength js)) (cond ((eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js (setq n (1- n)))))))))) 4) 4) (command "_.-xref" "_Unload" name_xref) ) (T (princ "\nN'est pas une référence externe. ")) ) ) (prin1) )
  20. Bonjour, Alternative aux MPolygon, passer par des régions! Tu transformes tes polylignes en régions (sur les quelles tu appliqueras une soustraction) Tu auras alors une surface identique pour ta région ET ta hachure.
  21. Ça fonctionne fort bien aussi... En tout cas votre coup de main m'a permis de réaliser un travail très facilement. Cela m'a servi découper des linéaires de routes sous AutocadMap en réaffectant automatiquement les nouvelles données d'objet curviligne (PR+ abscisses) aux entités sectionnées en tenant compte des positionnement des points routier. Donc un lisp très spécifique et adapté à ma base de données.
  22. Bonjour, D'après ce que j'ai compris, j'essayerais avec un lisp de (gile) nommé AddVtx&DelVtx. Tu utilises addvtx en montrant ton intersection projetée. Si tu as tes polylignes superposées, utilises le cycle de sélection d'autocad pour sélectionner la bonne polyligne.
  23. Bonjour, Si tu utilise la palette de gestion des xrefs, tu peux faire ça facilement (commande REFEXTERNES) Tu l'utilise avec les même raccourci que ton explorateur windows: En cliquant sur la colonne d'état tu les classes selon leur état (chargé/déchargé) En cliquant sur le premier nom de l'Xref puis sur le dernier (en maintenant la touche MAJ/SHIFT enfoncé)tu sélectionne l'ensemble, puis un click-droit sur les noms mis en surbrillance et tu choisis l'action que tu veux faire. NB: Tu peux aussi affiner ta sélection avec la touche Ctrl enfoncé pour basculer (rajouter/enlever) un fichier en plus ou en moins dans ta sélection.
  24. Que dire? Juste pour le fun c'est exactement ça! Juste pour ma convenance personnelle (pour ma suite de code), j'ai modifié le test de STRICTEMENT < ou >. Merci de ton coup de main, je ne pense pas que j'aurais réussi à faire aussi concis sans voir un exemple... :unsure:
  25. Toujours des rapides sur CadXp, merci Patrick_35 Je verrais de plus près dans la soirée, ou demain. Edit: Je viens de regarder rapidement, tu classes ma liste et me fais des encadrements avec les nombres de cette liste. Je cherche juste l'encadrement avec un nombre qui ne fais PAS partie de la liste d'origine.
×
×
  • 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é