Aller au contenu

chris_mtp

Membres
  • Compteur de contenus

    406
  • Inscription

  • Dernière visite

Tout ce qui a été posté par chris_mtp

  1. Bonjour, Merci pour vos réponses. J'ai retrouvé dans mes lips une fonction que Gile avait dévelloper pour attribut une valeur à un attribut défini dans un bloc (defun SetAttValue (blk tag val / lst loop) (setq lst (entget (entnext blk)) loop (= "ATTRIB" (cdr (assoc 0 lst))) ) (while loop (if (= (strcase tag) (cdr (assoc 2 lst))) (progn (entmod (subst (cons 1 val) (assoc 1 lst) lst)) (setq loop nil) (entupd blk) ) (setq lst (entget (entnext (cdr (assoc -1 lst)))) loop (= "ATTRIB" (cdr (assoc 0 lst))) ) ) ) ) Mais je ne vois pas comment sélectionner d'une part les attributs de chaque bloc. Merci par avance de votre aide. John.
  2. C'est bon j'ai pu m'en sortir avec ton code Gile mais j'ai du le remanier et je fais le traitement un bloc après l'autre. UN peu long mais ca se fait bien quand même. John.
  3. Bonjour à tous, Je ne sais pas si ca existe en tout cas j'ai cherché de partout et je n'ai pas trouvé pour l'instant. Je cherche une routine qui permet de définir le nombre de décimales d'un attribut Z d'un point type point topo. Je m'explique, au lieu d'avoir un attribut du type 2.458 avec un bloc point topo à Z=2.458, le lisp doit remplacer la valeur 2.458 par 2.46 à 2 chriffres après la virgule par exemple. DE même, pour bloc à Z = 2.3012 le lisp doit écrire dans l'attribut altitude 2.30 et non 2.3 tout court. Merci par avance de votre aide. John.
  4. chris_mtp

    Carroyage

    FONCTIONNE TRES BIEN SOUS 2008 V FULL JOHN
  5. Bonjour Gile, Le principe est plus difficile à expliquer qu'à faire. Il n'y a pas de questions de rectangles. En topo, certains objets comme des plaques ou des chambres edf gdf telecom sont levés par 3 points dans le sens horaire ou anti horaire selon la codification adopté par le géomètre. En levant un objet par 3 point, Autocad insère le bloc avec comme point d'insertion le premier de ces points puis utilise les second et troisième point pour définir une orientation et une échelle en x et en y. Jusque là, pas de probleme je pense. Le but de la manip est d'insérer un point nodal classique Autocad au centre du bloc. Ce centre peut être défini par le centre de gravité des 3 points levés sur le terrain mais à ce moment, il faut que les points soient levés exactement perpendiculairement sur le terrain, ce qui est rarement le cas. On observe toujours des petits décalages de quelques mm ou cm entre les extremités du bloc et les points levés. J'ai essayé les deux méthodes que tu as préconisé. Pour la seconde, j'ai le retour suivant ; erreur: fonction incorrecte: 0, j'ai inséré ton code comme indiqué, et en vlisp je bloque pour trouver l'erreur dans la fonction. Pour la première, elle insère le point au centre de gravité des 3 points mais pas au centre du bloc. La méthode serait de ; - sélectionner le bloc par 3 points - déterminer l'emprise du bloc avec une région si possible - insérer le point au centre de gravité de la région - effacer le solide région Je ne sais pas par contre si c'est possible de déterminer l'emprise d'un bloc avec une région mais ce serait à mon avis la solution la plus simple et la plus rapide. La fonction de Patrick est bien mais je ne sais pas comment la modifier simplement. En espérant avoir été assez explicité. Merci par avance de votre aide. John
  6. Ne t'inquiètes pas, je ne m'énerve pas, je me répète un peu mais c'est pour que me faire comprendre, c'est tout. Pas de prob, no souci. En effet, je pensais décomposer le bloc, transformer les rectangles en régions car le centre de gravité est une des propriétés de l'entité région mais comment effacer les entités des blocs qui ne servent à rien??? C'est pour cela, je pense qu'il est plus simple le modifier la fonction de Patrick rbl pour remettre le point d'insertion du bloc au centre de celui-ci sans changer la position géométrique de ce bloc. Ou alors de repérer les blocs points topo qui définissent le bloc par 3 point, de calculer le barycentre de ces points puis d'insérer un point Autocad classique en question ??? Mais là, je bloque sérieusement. Merci par avance de votre aide. John.
  7. Un point nodal est un point Autocad classique et non pas un bloc style point topo qui comprend matricule et altitude. Je ne vais pas mettre un bloc point par dessus un autre bloc. Ca n'a pas de sens. UN POINT SIMPLE AUTOCAD C TOUT Et, seulement un point au centre de gravité d'un bloc formé par 3 points levés sur le terrain d'où est calculé une echelle en x et en y. J'espère t'avoir fourni une explication claire cette fois. John.
  8. Je dois mettre un point type nodal au centre de mes blocs par 3 points pour répondre à une exigeance d'un client. Il n'y a pas de probleme avec les blocs levés par un point mais par 3 points, je ne sais pas comment faire. Voilà tout. J'ai essayé par conséquent d'utiliser la fonction de Patrick avec le code ci-dessus mais le bloc change de place. Merci par avance de ton aide. John
  9. Merci de me dire si au moins ce que je voudrais faire est réalisable ou non en lisp en modifiant ou non le code ci-dessus. John.
  10. J'ai essayé un petit lisp que j'ai fait avec une fonction de Patrick RBL qui permet de remettre le point d'insertion d'un bloc au centre de celui-ci mais le bloc change de place. C'est pas bon et je n'ai pas assez de connaissance en vlisp pour adapter la fonction rbl à mes besoins. (defun c:cenblk (/ sel i pti x ent_b bl) (if (not (tblsearch "LAYER" "semis")) (command "_layer" "_N" "semis" "_CO" "7" "semis" "")) (setvar "CLAYER" "semis") (setvar "PDMODE" 3) (setvar "PDSIZE" 0.0625) (setq pti '(0.0 0.0 0.0)) (setq sel (ssget "X" (list (cons 0 "INSERT") (cons 8 "plaques")))) (command "_copy" sel "" pti pti "") (command "chprop" sel "" "ca" "semis" "") (setq sel (ssget "X" (list (cons 0 "INSERT") (cons 8 "semis")))) (setq x 0) (if sel (progn (repeat (sslength sel) (setq ent_b (ssname sel x)) (command "_point" (trans (cdr (assoc 10 (entget ent_b))) ent_b 1 )) (setq x (+ x 1)) ) ) ) (setq sel (ssget "X" (list (cons 0 "INSERT") (cons 8 "semis")))) (command "_erase" sel "") (prin1) ) (defun rbl (bl / dec_x dec_y ent ents mip map modif_ent) (vl-load-com) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) (setq bl (tblnext "block" t)) (while bl (if (/= (logand (cdr (assoc 70 bl)) 16) 16) (progn (setq Ent (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0.0 0.0 0.0)) (cdr (assoc 2 bl)) 1 1 1 0)) (vla-getboundingbox Ent 'Mip 'Map) (setq Dec_x (/ (+ (car (vlax-safearray->list Mip)) (car (vlax-safearray->list Map))) 2) Dec_y (/ (+ (cadr (vlax-safearray->list Mip)) (cadr (vlax-safearray->list Map))) 2) Ents (vlax-safearray->list (vlax-variant-value (vla-explode Ent)))) (vla-delete Ent) (entmake (list (cons 0 "block") (cons 2 (cdr (assoc 2 bl))) (cons 70 64) (cons 10 '(0.0 0.0 0.0)))) (foreach Ent Ents (vla-move Ent (vlax-3d-point (list Dec_x Dec_y 0.0)) (vlax-3d-point '(0.0 0.0 0.0))) (setq Modif_Ent (entget (vlax-vla-object->ename Ent)) Modif_Ent (vl-remove (assoc -1 Modif_Ent) Modif_Ent) Modif_Ent (vl-remove (assoc 5 Modif_Ent) Modif_Ent) Modif_Ent (vl-remove (assoc 330 Modif_Ent) Modif_Ent)) (entmake Modif_Ent) (vla-delete Ent) ) (entmake '((0 . "endblk"))) ) ) (setq bl (tblnext "block")) ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (princ) ) Merci par avance de votre aide. John.
  11. Bonjour à tous, Est-il possible, à partir d'un lisp, de créer des points type nodal sur des blocs tels des plaques électriques ? Les nodals doivent en fait s'insérer sur les 3 blocs points topo qui permettent d'insérer les plaques avec une échelle en X et en Y et une orientation. Il suffit, je pense, de trouver les blocs points topo (avec attribut) proches du bloc par 3 point insérer dans le dessin puis d'insérer des nodals classiques autocad sur ces mêmes blocs points origines. De plus, est il possible à partir d'un bloc par 3 points d'insérer un nodal simple mais au centre du bloc en question ? (un point au centre de gravité du bloc en fait) Merci par avance de votre aide. John.
  12. chris_mtp

    Protéger un fichier DWG

    Si l'utilisateur a un DWG Viewer, il ne pourra rien modifier sinon je ne vois pas commet on peut diffuser un dwg comme çà sans risquer que quelqu'un le modifie sauf en dwf. John
  13. Bonjour à tous, j'ai un problème pour établir une liste de sommet d'une polyligne 3d situé entre deux points d'intersections de ce même polyligne. Je m'explique. J'ai une polyligne 3D A qui représente une coupe TN qui s'intersecte avec une polyligne 3D projet B. La polyligne 3D A est en fait un profil et une autre polyligne 3D C représente l'axe en plan. Bien sur, le nombre de sommet de la polyligne A est identique à celui de la polyligne C. Le but serait de : -Sélectionner la polyligne 3D A -Selectionner la polyligne 3D projet B qui intersecte la coupe TN -Sélectionner l'axe en plan du profil, soit la polyligne 3D C -Déterminer le ou les sommets les plus proches des points d'intersections entre les poly A et B -Couper la polyligne 3D C aux sommets correspondants définis précédemment -Faire l'export des sommets de la polyligne C restante dans excel format CSV Si aucun point d'intersection n'est trouvé, le lisp ne serait pas utilisé donc pas besoin de mettre des conditions en plus. Pour l'export d'une polyligne 3D sous excel format csv, il n'y a pas de problème mais pour trouver les points d'intersections de deux polylignes 3D et surtout pour trouver les sommets les plus proches de ces mêmes intersections, la je bloque. Ca à l'air un peu compliqué comme çà mais avec des images c'est un peu plus compréhensible. Je ne connais plus l'adresse ou on peut poster les images en lien. Merci par avance de votre aide. John
  14. chris_mtp

    liste à comparer

    J'ai essayé de modifier la première partie du code avec le defun nombl mais en intervenant directement dans le while c'est plus simple. Merci de ton aide Gile John.
  15. chris_mtp

    liste à comparer

    Bonjour Patrick35, Je viens juste de voir ta réponse car j'étais en déplacement depuis deux semaines. Oui c'est exactement ce qu'il faut par contre serait il possible au lieu d'afficher le nom du bloc d'avoir la valeur de l'attribut correspond. Merci par avance de ton aide. John.
  16. C'est plus subtil que ce que je pensais. Merci pour ton aide. John.
  17. Le vlisp c'est chaud. J'ai essayé avec (if (eq (vla-get-closed ent) :vlax-true) (vl-remove car lst) ) insérer après le setq lst (trier lst) mais j'ai le retour VLA-OBJECT nil et la .....
  18. Je vais voir ce que je peux faire et je reviens vers toi si j'ai du mal. Merci encore. John
  19. Ce lisp va m'être très utile. Par contre, j'au détecté une anomamie. Si la polyligne est fermé, le code compte un sommet de plus alors qu'il n'y a que 4 blocs sur la même polyligne. Ne pourrait on pas ajuster le code pour les polilygnes fermées (avec un code dxf 8 ou 70) je crois mais en vlisp, comment paramétrer cela ? Merci en tout cas. John.
  20. Merci Patrick pour ce code qui fonctionne pas mal. Par contre, j'ai essayé d'ajouter à la fin une ligne supplémentaire qui indiquerai le nombre de sommet de la polyligne sélectionné et le nombre de blocs trouvés de manière à faire un contrôle mais je n'arrive pas à trouver la bonne liste. J'ai essayé avec (princ (strcat "\nNbre blocs = " (rtos tot 2 0) " Nbre sommets = " (rtos (sslength lst) 2 0))) mais apparemment il y a une coquille. J'ai pas trop de notion en vlisp, c'est pour çà. Merci en tout cas de ton aide. John.
  21. Bonjour à tous, je dois contrôler sur une centaine de polylignes 2D environ s'il y a un bloc sur chacun des sommets de celles-ci. Un bloc ne doit pas se trouver à moins de 0.00001 m du sommet sinon cela me plante un autre programme qui me permet d'éditer le listing des sommets de mes polylignes. J'ai donc essayé de faire la liste de tous les sommets de mes polylignes puis de mes blocs puis de les comparer entre deux mais il arrive d'avoir un sommet d'une polyligne superposés avec un autre sommet d'une autre polyligne mais toujours avec le même bloc. Mes blocs comportent un attrbut avec le numéro du point. Le mieux serait de sélectionner la polyligne à contrôler puis de voir si les coordonnées des sommets correspondent aux coordonnées des blocs inséres sur ces mêmes sommets. Si vous avez des idées ? Merci par avance de votre aide. John.
  22. A priori tout marche correctement, l'impression de plusieurs fichiers le changement d'un attribut spécifique dans un bloc par un autre le changement de texte par un autre les zoom et les enregistrer sous John.
  23. Non, c'est moi. Je connaissais pas SAS avant du coup j'avais pas vu dans les options. J'ai sélectionner le fichier AutoCAD.exe et c'est bon. Je vais le tester pour voir s'il n'y a pas de coquilles avec plusieurs script et je reviens vers toi après. John.
  24. Déjà j'ai téléchargé le SAS. Le programme ne s'installe pas. Je pense que c'est normal. Ensuite, j'ai sélectionner avec le bouton parcourir les fichiers que je veux traiter. J'ai sélectionner le script zoom étendu. La barre de traitement s'affiche et à la moitié, j'ai ce message. et j'ai le message d'erreur. Mes fichiers sont enregistrés en AutoCAD 2007. John.
  25. Salut Eric, J'ai testé ton SAS Lors du traitement j'ai l'erreur Windows ne trouve pas '§GUI_CHEKED' Vérifier que vous avez entré le nom correct, puis réessayez. J'ai AutoCAD 2008 et Windows Vista. J'ai essayé de traiter 66 fichiers dwg avec Zoom étendu. Une solution ? John.
×
×
  • 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é