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. bonuscad

    Sélection de calques

    Je pense qu'il serait bien que tu réflèchisse et t'investisse un peu par toi même et faire au moins une proposition de code au lieu de te mettre en attente de réflexion d'autrui. Je m'investis pour l'entraide et non pour une demande qui en plus est bien spécifique à ton boulot, ça ne profite qu'a toi. :mad: Je te donne quand même ce que je ferais, mais je n'ai pas du tout testé ma proposition, si ça ne fonctionne pas, à toi d'ajuster en conséquence. ((lambda ( / target_lay stuff_lay js n dxf_ent def_lay nam_lay trans_lay) (setq stuff_lay '("0" "FORT" "CACHE" "COTATION" "AXES" "HACHURES" "FIN") target_lay '("Main-1" "Main-1" "Main-2" "Main-3" "Main-4" "Main-16" "Main-19") ) (cond ((setq js (ssget "_X" '((0 . "DIMENSION")))) (setq n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst '(8 . "COTATION") (assoc 8 dxf_ent) dxf_ent)) (entmod (subst '(3 . "AM_ISO$0") (assoc 3 dxf_ent) dxf_ent)) ) ) ) (setq def_lay (tblnext "LAYER" T) nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) (while (setq def_lay (tblnext "LAYER")) (setq nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) ) (foreach n stuff_lay (command "_.purge" "_layer" n "_no")) (command "_.purge" "_dimstyle" "ISO-5,STANDARD" "_no") (prin1) ))
  2. bonuscad

    Traiter une selection

    Un exemple rapide: Sélectionner en mode nom/verbe (suivant la valeur de "CMDACTIVE") toutes les entités ayant la couleur du calque par défaut dans l'espace courant. ((lambda ( / js) (if (zerop (getvar "pickfirst")) (setvar "pickfirst" 1)) (setq js (ssget "_X" (list (cons 67 (if (eq (getvar "CVPORT") 2) 0 1)) (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB"))) (cons 62 (acad_colordlg 256 T)) ) ) ) (if (zerop (getvar "cmdactive")) (sssetfirst nil js) js ) ))
  3. C'est relativement simple, tu mets autant d'opérateur que contient le groupe que tu veux tester. Exemple, sélectionner tous les cercles ayant leur centre à 0,0,0 : (ssget "_x" '((0 . "CIRCLE") (-4 . "=,=,=") (10 0.0 0.0 0.0))) Tu peux ignorer le Z en faisant (-4 . "=,=") qui est équivalent en fait à (-4 . "=,=,*") Tu peux employer tous les autres opérateurs sauf "&" et "&=" qui sont destinés plutôt à des test booleen sur des bits (nombre entier dans des listes de paire pointées)
  4. Bien que la façon de Gilles fonctionne, je te donne aussi une autre voie (qui est pratiquement identique à celle de Gilles). Celle-ci s"appuie sur la même astuce mais enlève après coup les entités qui conviennent pas du jeu de sélection f_m. Il peut être interessant de conserver ce jeu de sélection. Mais la boucle de Gilles peut contenir aussi d'autres actions, c'est 'kif-kif' :P Cependant de rajouter le code (67 . 1) dans le filtre peut être une sécurité et rapidité en plus. En tout cas ton problème a permis de mettre le doigt sur un comportement anormal de (ssget) ((lambda ( / f_m l_ent dxf_ent index couleur ent) (vl-load-com) (while (null (setq f_m (ssget '((0 . "*POLYLINE,SPLINE,ELLIPSE,CIRCLE,REGION,VIEWPORT") (67 . 1)) ) ) ) ) (setq l_ent (ssnamex f_m) index -1) (foreach n l_ent (cond ((eq (type (cadr n)) 'ENAME) (setq dxf_ent (entget (cadr n))) (if (and (not (eq (cdr (assoc 0 dxf_ent)) "VIEWPORT")) (null (assoc 102 dxf_ent)) ) (setq f_m (ssdel (cadr n) f_m)) ) ) ) ) (if f_m (progn (setq index -1 couleur (acad_colordlg 1) ) (repeat (sslength f_m) (setq ent (vlax-ename->vla-object (ssname f_m (setq Index (1+ Index))))) (vla-put-color ent couleur) ) ) ) (prin1) ))
  5. Pour compléter Tramber, voir ICI pour voir comment éviter ce genre d'erreur avec des commandes 3D employé de manière récursive ou en boucle dans des routines lisp
  6. Effectivement après plusieurs tests, je constate la même chose, ainsi que pour les polylignes anciennes ?!?!? :casstet: Là franchement, je vois pas pourquoi ces entités sont écartés alors qu'elles font partie du filtre.... :o Ca sent le bug avec (ssget) , du moins sous cette forme, avec; (102 . "{ACAD_REACTORS")
  7. Gilles m'a devancer sur la réponse concernat (entmod) et les fenêtres. Donc tout est dit, cependant tu peux améliorer ton filtre comme ceci (0 . "*POLYLINE,SPLINE,ELLIPSE,CIRCLE,REGION")(102 . "{ACAD_REACTORS") Car les fenêtres peuvent être faites à partir de ces objets.
  8. bonuscad

    Sélection de calques

    La proposition de emeric est interressante (je ne l'ai jamais utilisé) :( Elle a le mérite d'être plus polyvalente. Voici quand même le code modifié en aveugle (pas testé) ((lambda ( / target_lay stuff_lay def_lay nam_lay js trans_lay dxf_ent) (setq stuff_lay '("0" "FORT" "CACHE" "COTATION" "AXES" "HACHURES" "FIN") target_lay '("Main-1" "Main-1" "Main-2" "Main-3" "Main-4" "Main-16" "Main-19") ) (setq def_lay (tblnext "LAYER" T) nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) (while (setq def_lay (tblnext "LAYER")) (setq nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (if (and (eq trans_lay "Main-3") (eq (cdr (assoc 3 dxf_ent)) "ISO-5")) (entmod (setq dxf_ent (subst (cons 3 "AM_ISO$0") (assoc 3 dxf_ent) dxf_ent))) ) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) ) (foreach n stuff_lay (command "_.purge" "_layer" n "_no")) (command "_.purge" "_dimstyle" "ISO-5" "_no") (prin1) ))
  9. bonuscad

    Sélection de calques

    Désolé, j'avais oublié un " (guillemet) lors de la retranscription pour tes noms de calques :( J'ai corrigé, il te suffit de faire un copier-coller en ligne de commande dans le fichier dessin Autocad qui t'interresse pour faire un test
  10. bonuscad

    longueur d\'un arc

    Je savais bien que l'image venait d'ici, mais pas moyen de remettre la main dessus pour faire un lien :casstet: Très utile ce petit mémo quand on a un trou de mémoire :P
  11. bonuscad

    longueur d\'un arc

    avec ceci tu devrais pouvoir obtenir les éléments qui te sont insdispensables http://xs303.xs.to/xs303/06275/memoarc0rw.png.xs.jpg
  12. bonuscad

    Sélection de calques

    Une première ébauche, non testée en profondeur! Ce qui est déjà indispensable c'est la case des noms de calques qui doit bien correspondre à l'existant (majuscule-minuscule) Assures toi aussi que les calques ne soient pas vérrouilés Voilà fais un 1er test, et on affinera si possible. ((lambda ( / target_lay stuff_lay def_lay nam_lay js trans_lay dxf_ent) (setq stuff_lay '("FORT" "CACHE" "COTATION" "AXES" "HACHURES" "FIN") target_lay '("Main-1" "Main-2" "Main-3" "Main-4" "Main-16" "Main-19") ) (setq def_lay (tblnext "LAYER" T) nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) (while (setq def_lay (tblnext "LAYER")) (setq nam_lay (cdr (assoc 2 def_lay))) (cond ((and (setq js (ssget "_X" (list (cons 8 nam_lay)))) (member nam_lay stuff_lay)) (setq trans_lay (nth (vl-position nam_lay stuff_lay) target_lay) n -1) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n))))) (entmod (subst (cons 8 trans_lay) (assoc 8 dxf_ent) dxf_ent)) ) ) ) ) (foreach n stuff_lay (command "_.purge" "_layer" n "_no")) (prin1) )) [Edité le 7/7/2006 par bonuscad]
  13. Est ce que ceci pourrait être une piste pour toi, j'ai employé un filtre pour facililiter la chose. ((lambda ( / f_m) (while (null (setq f_m (ssget "_:S:E" '((0 . "VIEWPORT,LWPOLYLINE"))))) (princ "\nN'est pas une fenêtre") ) (if (and (setq first_ent (ssname f_m 0)) (setq snd_ent (ssname f_m 1))) (if (eq (cdr (assoc 0 (setq dxf_ent (entget first_ent)))) "LWPOLYLINE") (princ "\nUne polyligne est associée à la fenêtre") (if (eq (cdr (assoc 0 (setq dxf_ent (entget snd_ent)))) "LWPOLYLINE") (princ "\nUne polyligne est associée à la fenêtre") ) ) (setq dxf_ent nil) ) (if dxf_ent (if (null (assoc 62 dxf_ent)) (entmod (append dxf_ent (list (cons 62 (acad_colordlg 1 nil))))) (entmod (subst (cons 62 (acad_colordlg 1 nil)) (assoc 62 dxf_ent) dxf_ent)) ) ) (prin1) ))
  14. Pour la compréhension du code, il vaut mieux mettre les options en entier. "_.Undo" "_begin" -> debut "_.Undo" "_back" -> retour "_begin" va avec "_end" et "_mark" avec "_back" Avec "_Undo", il est bien aussi de controler la variable "UndoCtl" (lecture seule) et suivant sa valeur, parametrer la commande "_.Undo" avec "_Control", sous peine de voir les appels à la commande "_.undo" échouer dans le lisp.
  15. bonuscad

    Poignées superposées

    Ca, a mon avis, je ne pense pas que ce soit un plus! Ceci et un choix de l'utilisateur de faire un polyligne fermée sans passer par l'option "clore". Ou alors de passer dans ce cas le bit 70 de 0 à 1 pour obtenir le même résultat, c'est peut être ce que tu veux faire? Il ne faudra pas oublié de "checker" le dernier arrondi. Je me demande d'ailleurs si ce code 40 peut être affecter pour clore, ou si c'est celui de l'avant dernier segment?
  16. J'ai découvert il y a pas très longtemps (grace à un forum, peut être celui-ci), une option qui ne figure nulle part dans l'aide et qui ouvre d'autre possibilité. Je ne sais pas si cela pourra te combler, mais au message d'option (en ligne de commande) En fait c'est l'option copie, qui permet d'implémenter un angle entre les copies. Je trouve cette option bien pratique pour certain cas, mais tu connaissais peut être !?...
  17. bonuscad

    Poignées superposées

    J'avais déjà monter ce genre de routine, elle travaille sur des polylignes 2D ou 3D, le seul "Hic" est que cette routine supprime les segments d'arcs. Mais gilles va certainement remédier a cette insuffissance et améliorer tout ça ;) Voici déjà ce que j'ai réalisé: (defun c:remove_vertice_overlapped ( / ent dxf_ent typent closed lst e_next nb_vtx lst2 osmd flag) (while (null (setq ent (entsel "\nChoix de la polyligne: ")))) (setq typent (cdr (assoc 0 (setq dxf_ent (entget (car ent)))))) (cond ((eq typent "LWPOLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) lst (mapcar '(lambda (x) (trans x (car ent) 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent))) ) ) ((eq typent "POLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) e_next (entnext (car ent)) ) (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next))))) (if (zerop (boole 1 116 (cdr (assoc 70 dxf_next)))) (setq lst (cons (trans (cdr (assoc 10 dxf_next)) (car ent) 1) lst) ) ) (setq e_next (entnext e_next)) ) (setq lst (reverse lst) ) (print) ) (T (princ "\nN'est pas une Polyligne! ")) ) (cond (lst (setq nb_vtx (length lst)) (if (equal (last lst) (car lst)) (setq lst (cdr lst) closed 1)) (while (car lst) (setq lst2 (cons (car lst) lst2) lst (vl-remove (car lst) lst) ) ) (setq lst (reverse lst2)) (cond ((not (eq nb_vtx (length lst))) (setq osmd (getvar "osmode")) (setvar "osmode" 0) (if (not (equal (cdr (assoc 210 dxf_ent)) '(0.0 0.0 1.0))) (progn (command "_.ucs" "_object" ent) (setq flag T)) (setq flag nil) ) (entdel (car ent)) (command "_.pline") (foreach n lst (command n)) (if (zerop closed) (command "") (command "_close") ) (if flag (command "_.ucs" "_previous")) (setvar "osmode" osmd) (alert "\nLa nouvelle polyligne ne possède plus d'arc.") ) (T (alert "\nPas de sommets en double. Aucun changement!")) ) ) (T (princ "Doit être une LWPolyligne/Polyligne2D ou 3D.")) ) (prin1) )
  18. bonuscad

    Sélection d\'objets

    "SELECT" option "SP" ("_WP")
  19. Je pense à un truc en rapport avec ce SUJET . Tu pourrais par exemple repasser avec une ligne3D les arrêtes de la 3Dface qui intersectent l'autre. Puis avec la routine ajuster les lignes 3D au plan de coupe, il ne te restera plus qu'a relier les 2 nouvelles extrémités. A essayer! :exclam:
  20. Je ne sais pas si ce test est vraiment fiable car j'ai obtenu des résultats variables. Par contre ton test diviser n'est pas objectif car tu fait une division d'entier, alors que celui de multiplier est fait avec des réels (0.5 est un réel et cela suffit). Mais il vrai que j'ai entendu dire qu'il valait mieux executer une multiplication par 0.5 qu'une division par 2.0 pour la rapidité d'execution.....
  21. Ah Ok, je te dirais que la signification des -1, 1 et 0 qui sont donnés me sont complétement obscur. Je pense, sans pouvoir l'affirmer, que sont des bits de control au niveau booléen et qu'ils doivent déterminer les rapports entre les faces et les arrêtes au niveaux du solide (par exemple arrête adjacente bit à 1 pour le sommet x à -1 pour le sommet y et à 0 quand les arrêtes ne se touchent pas). Mais tout ça sont des suppositions, il faudrait décortiquer un solide simple et voir les corrélations. Bonjour la prise de tête :casstet: En tout cas les coordonnés affecté à "plane-surface" ont l'air d'être les centres de gravité (ou orthocentre?) de chaque faces. :mad: Ca y est, j'ai compris ta question en essayant la routine sous une 2005 (je l'ai créé sous une 2000) et effectivement le codage DXF n'est pas identique et retourne des -1 dans la liste Il faut modifier (if (or (eq (type (read data_sol)) 'REAL) (eq (type (read data_sol)) 'INT)) en (if (and (or (eq (type (read data_sol)) 'REAL) (eq (type (read data_sol)) 'INT)) (not (member (read data_sol) '(1 -1)))) [Edité le 27/6/2006 par bonuscad]
  22. Pour être sur j'ai refais un copier-coller depuis le forum directement en ligne de commande, pas de problème :casstet: Donc refais la manip... Attention le code est grossier, c'était juste pour essayer. Comme dit Tramber désactive l'accroche objet et mets toi bien en vue cavalière pour qu'il n'y ait pas de confusion lors de la sélection des arrêtes. Tramber! Tu parles de ça (= (car elt) 1) :exclam: Si c'est cela, c'est juste pour s'assurer que les données DXF sont bien du texte et peuvent être soumis à la routine ACISdecode. Voilà pourquoi je penses que la routine est légère car il y a eu une conversion de texte/réel (dans les 2 sens) et on perd forcément en précision dans les décimales et les point retournés sont imprécis dans les petites dimensions. C'est vraiment du bricolage :( Le raccord pourrait être fait en une seule fois en modifiant la fin: (command "_.fillet" (car lst_pt) "") (foreach n (cdr lst_pt) (command n)) (command "") à la place de: (foreach n lst_pt (command "_.fillet" n "" "")) et rajouter ceci au début (setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384))) [Edité le 27/6/2006 par bonuscad]
  23. Il est là pour ça ... C'est pas du pillage, mais du libre service. On prends ce qui semble répondre à nos attentes. Mais je suis sur que tu vas m'améliorer tout ça, ou trouver de nouvelles idées et le remettre en ligne ;) A moins que tu trouves LA solution miracle :o
  24. Oui "UI", Là des fois je rage quand mon doigt accroche le "i" alors que que je veux faire simplement un "U"
  25. Personnellement j'utiliserais plutôt les Xrefs car il répondent tout à fait à ce genre de situation. Avec lec blocs tu va être obligés de les redéfinir en utilisant la commande "_.-INSERT" "nom-bloc=nomfichier" et répondre oui pour le redéfinir. Tout ça peut s'automatiser, mais ne vaut-il pas mieux s'y prendre autrement?
×
×
  • 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é