-
Compteur de contenus
406 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par chris_mtp
-
Pour le reformatage c'est vrai que je ne n'y fais pas gaffe mais ce n'était pas la peine de le modifier. D'autre part, pour la fonction lst2str j'ai du passer du temps à la comprendre et c'est pour cela que je l'ai modifié et changé de nom pour l'adapter à mes besoins. Mais j'ai pu m'en sortir quand même. John.
-
Merci Gile, J'ai déjà essayé d'adapter le lisp de Bonuscad à mes besoins avec un décalage en Z nul et pas besoin de créer un maillage mais j'aimerais le modifier de manière à non pas décaler la polyligne d'un seul côté mais des deux côtés de l'axe en plan sans devoir pour cela sélectionner un point de chaque côté. et le vlisp je ne comprends pas très bien encore. John.
-
Bonjour à tous, J'essaye de programmer un outil (que je n'ai pas trouver sur ce forum ni ailleurs) qui me permettrait de décaler de part et d'autre un axe (polyligne 3D) selon une distance spécifiée par l'utilisateur mais je ne vois pas comment m'y prendre. J'ai pensé à faire une liste des sommets de la polyligne axe 3D sélectionné. Ensuite de calculer par rapport à cette liste les coordonnées de chaque sommet des polylignes 3D décalé puis ensuite relier ces points par une fonction du type mapcar mais là se pose un problème, comment déterminer les coordonnées des points des polylignes 3D décalés ? Ou peut être que vous avez une solution plus simple ou un lisp à me proposer ? Merci par avance de votre aide. John.
-
Bonjour, Je vous explique. J'ai un fichier de points sous Excel avec 4 colonnes Numéro X Y Z. Je voudrais faire un zoom sur certains de points dans Autocad à partir des coordonnées sous Excel. Serait il possible donc de récupérer le nom du point d'une cellule active sous Excel, récupérer dans des variables les coordonnées de ce point puis faire un zoom centré du type (command "_zoom" "center" (strcat x","y) 15) ? Merci par avance de votre aide. John.
-
Bonjour Voici ce que j'ai pu faire; Certes ce n'est pas un code parfait mais bon ca marche dans les 3 cas que tu m'as conseillé gile (defun c:extatt (/ i file jeu d nom entit nature long coor1 val va1 val2 ent liste att) (setq file (open "C:/export_att.txt" "w")) (write-line (strcat "Numéro" " " "X" " " "Y" " " "Z") file) (princ "\nChoisissez les attributs à exporter") (setq jeu (ssget '((0 . "INSERT")))) (if jeu (progn (setq i 1) (setq d 0) (setq long (sslength jeu)) (while (< d long) (setq nom (ssname jeu d)) (setq entit (entget nom)) (setq coor1 (cdr (assoc 10 entit))) (setq val (car coor1)) (setq val1 (cadr coor1)) (setq val2 (caddr coor1)) (setq ent nom) (if (= (cdr (assoc 0 (entget ent))) "INSERT") (if (= (cdr (assoc 66 (entget ent))) 1) (progn (setq liste nil) (while (if ent (not (= (cdr (assoc 0 (entget ent))) "SEQEND")) ) (if (= (cdr (assoc 0 (entget ent))) "ATTRIB") (setq liste (append liste (list (cdr (assoc 1 (entget ent))))) ) ) (setq ent (entnext ent)) ) ) (setq liste nil) ) ) (if (= liste nil) (write-line (strcat (rtos i 2 0) " " (rtos val 2 4) " " (rtos val1 2 4) " " (rtos val2 2 4) ) file ) (progn (setq att (lst2strg liste " ")) (write-line (strcat (rtos i 2 0) " " (rtos val 2 4) " " (rtos val1 2 4) " " (rtos val2 2 4) " " att ) file ) ) ) (setq i (+ i 1)) (setq d (+ d 1)) ) (close file) ) (progn (princ "\nPas de sélection défini") (close file) ) ) (prin1) ) (defun lst2strg (lst sep) (if (cadr lst) (strcat (vl-princ-to-string (car lst)) sep (lst2str (cdr lst) sep) ) (vl-princ-to-string (car lst)) ) ) John[Edité le 25/7/2009 par chris_mtp]
-
Tu laches rien toi hein avec ton Editeur Lisp mais tu as raison. Je vais m'y mettre Je reviens vers toi si j'ai des soucis. Merci. John
-
Merci Gile pour ces explications mais en ce qui concerne ma question sur la détermination du nombre d'attribut d'un bloc sélectionné,
-
Bonjour Gile, Je ne me sers que très rarement de l'editeur Visual Lisp car je ne sais pas très bien m'en servir. J'ai fait ce code comme j'ai pu et j'ai encore beaucoup de choses à apprendre en lisp mais il marche pour mes beoins donc je ne suis pas trop attardé sur la mise en forme mais c'est vrai que pour le mettre en ligne, j'aurais du faire les quelques modifs que tu m'as signalé avant. Désolé donc pour la mise en forme mais j'y ai remédier. En ce qui concerne ma question, je ne sais pas comment comptabiliser le nombre d'attributs d'un bloc sélectionné puis en extraire les valeurs. Si vous avez des idées ou des exemples, merci par avance. John.
-
Bonjour à tous, Voici un bout de code que j'ai modifié pour faire un export de blocs d'Autocad vers Excel. (defun c:extattributs (/ i nom_fic fic file jeu d nom entit nature long nom_plan coor1 val va1 val2) (princ "\nEXPORTATION D'ATTRIBUTS") (setq nom_fic (getstring "\nNom du fichier de sortie : ")) (setq fic (getfiled "Veuillez indiquer le répertoire de destination" nom_fic "xls" 1)) (setq file (open fic "w")) (write-line (strcat "X" "\t" "Y" "\t" "Z" "\t" "Bloc" "\t" "Calque") file) (princ "\nChoisissez les attributs à exporter") (setq jeu (ssget)) (if jeu (extratt2) (progn (princ "\nPas de sélection défini - ABONDON") (close file) ) ) (princ) ) (defun extratt2() (setq d 0) (setq long (sslength jeu)) (while (< d long) (setq nom (ssname jeu d)) (setq entit (entget nom)) (setq nature (cdr (assoc 0 entit))) (if (= nature "INSERT")(extat2)) (setq d (+ d 1)) );fin while (close file) (princ (strcat "\n" (itoa long) " objets exportés")) ) (defun extat2() (setq nom_plan (cdr (assoc 8 entit))) (setq nom_bloc (cdr (assoc 2 entit))) (setq coor1 (cdr (assoc 10 entit))) (setq val (car coor1)) (setq val1 (cadr coor1)) (setq val2 (caddr coor1)) (write-line (strcat (rtos val 2 5) "\t" (rtos val1 2 5) "\t" (rtos val2 2 5) "\t" nom_bloc "\t" nom_plan) file) ) Maintenant en fait, je souhaiterais non plus exporter seulement les coordonnées du point d'insertion du bloc avec le nom du bloc et du calque d'appartenace mais aussi la valeur des attributs correspondants. Exemple, si je sélectionne un bloc avec n attributs, je devrais avoir avoir dans mon fichier excel de sortie n colonnes avec comme entête l'étiquette de l'attribut et pour chaque bloc la valeur de l'attribut correspondant. J'ai essayé d'utiliser la fonction eattext mais les paramètrages sont longs à effectuer. D'autre part, j'utilise la fonction OpenExcel de Gile qui vient de cette discussion, http://www.cadxp.com/XForum+print-fid-115-tid-23199.html?POSTNUKESID=798cb7ba4c063fc5224ab83c867540d8 pratique pour une manipulation rapide des entités. J'ai essayé de plus de prendre exemple sur des lisps existants comme MAT ou IXL mais en vain. Merci par avance de votre aide. John.[Edité le 19/7/2009 par chris_mtp][Edité le 19/7/2009 par chris_mtp][Edité le 19/7/2009 par chris_mtp][Edité le 19/7/2009 par chris_mtp] [Edité le 19/7/2009 par chris_mtp]
-
Salut Didier, Je n'ai pas fait un lisp aussi court mais je m'en suis sorti quand même comme dit plus haut. Merci quand même de ton aide.
-
Bonjour à tous, Savez vous comment on peut ajouter dans un fichier excel une feuille que l'on appelle par exemple import ? Merci par avance de votre aide. John.
-
Merci Giel pour ces infos. Je préfère conserver l'angle en radians J'ai fait donc (setq angx rotb) (setq angy (+ angx (/ pi 2))) En échangeant le sinus des cosinus car sens trigonométrique, le lisp marche bien testé avec n'importe quel bloc saisi par 3 points et pour n'importe quel valeur de rotation. Merci encore de votre aide. John.
-
Bonjour, Il semblerait que j'ai un souci d'angle pour finaliser ce lisp. Je m'explique. A partir des coordonnées du point d'insertion du bloc, de l'échelle en x et en y puis de l'angle de rotation, je calcule les coordonnées des deux autres points qui permettent de tracer mon bloc. Je récupère la valeur de l'angle de rotation avec (setq rotb (cdr (assoc 50 entit))) (setq angx (/ (* pi rotb) 180)) (setq angy (- (/ pi 2) angx)) puis je calcule un angx pour l'axe des x et un angy pour l'axe des y comme l'indique le lisp précédent. Une question : Quand j'ouvre un dxf avec le bloc notes et que je regarde les paramètres de mon bloc, l'angle de rotation est enregistré en degrés. Est ce une norme autocad ou bien peut on configurer les unités d'angles ? Attention je ne parle pas des paramètres d'affichages dans la fenêtre propriétes ou dans le contrôle des unités car en les modifiant en grades par exemple, le dxf enregistré avec AutoCAD et ouvert avec bloc notes indique toujours un angle en degrés. Merci par avance de votre aide. John
-
Merci pour ces explications détaillées. Ca marche maintenant mais j'ai préféré le while au lieu du repeat avec un setq i (+ i 1) à la fin de ma boucle. Par contre, ca ne m'insère que le premier point au lieu des 3 comme prévu. Un problème dans ma définition des points je pense. Je vais voir ca dans le détail. John.
-
Bonjour Gile J'ai essayé de prendre exemple de ton code en mettant (setq elst (entget (ssname ss (setq n (1- n))))) mais j'ai le retour suivant ; erreur: type d'argument incorrect: lselsetp nil Et sérieux je ne vois pas l'erreur. Merci de ton aide. John
-
Bonjour à tous, J'ai peut être trouver une solution un peu plus simple pour déterminer les coordonnées des 3 points d'insertions d'un bloc par 3 points à partir des valeurs d"échelles en x et en y puis de l'angle de rotation. La seule question est : Peut on récupérer dans une variable les valeurs de ces paramètres en utilisant le bout de code suivant : (setq echx (cdr (assoc 41 (entget (ssname sel (setq i (1- i))))))) (setq echy (cdr (assoc 42 (entget (ssname sel (setq i (1- i))))))) (setq rotb (cdr (assoc 50 (entget (ssname sel (setq i (1- i))))))) car apparemment j'ai le retour suivant lentityp nil et je ne comprend pas pourquoi. Voici le lisp en cours de construction. (defun c:3tps (/ sel i pt1 pt2 pt2x pt2y pt2z pt3 pt3x pt3y pt3z angx angy echx echy rotb) (vl-load-com) (setvar "CMDECHO" 0) (setvar "AUPREC" 4) (setvar "LUPREC" 4) (setvar "PDMODE" 3) (setvar "PDSIZE" 0.0625) (setq sel (ssget "X" (list (cons 0 "INSERT") (cons 8 "plaque")))) (repeat (setq i (sslength sel)) (setq pt1 (cdr (assoc 10 (entget (ssname sel (setq i (1- i))))))) (setq echx (cdr (assoc 41 (entget (ssname sel (setq i (1- i))))))) (setq echy (cdr (assoc 42 (entget (ssname sel (setq i (1- i))))))) (setq rotb (cdr (assoc 50 (entget (ssname sel (setq i (1- i))))))) (setq angx (/ (* (- 100 rotb) 200) 180)) (setq angy (- 100 angx)) (setq pt2x (+ (car pt1) (* echx (sin (/ (* pi angx) 200))))) (setq pt2y (+ (cadr pt1) (* echx (cos (/ (* pi angx) 200))))) (setq pt2z (caddr pt1)) (setq pt2 (list pt2x pt2y pt2z)) (setq pt3x (+ (car pt2) (* echy (sin (/ (* pi (- 400 angy)) 200))))) (setq pt3y (+ (cadr pt2) (* echy (cos (/ (* pi (- 400 angy)) 200))))) (setq pt3z (caddr pt1)) (setq pt3 (list pt3x pt3y pt3z)) (command "_point" pt1 pt2 pt3) ) (setvar "CMDECHO" 1) (princ) ) Merci par avance de votre aide. John.
-
Bonjour à tous, Je dois réaliser plusieurs cotations de plusieurs polylignes 2D avec pour côte maximale 20m à chaque fois. Je m'explique : Il me faut une cotation tous les 20m le long de mes polylignes 2D. Si par exemple j'ai une polyligne constitué de trois sommets et que mon premier segment fait 63.45m, et bien il me faudrait 4 cotations sur mon premier segment avec 3 cotations alignés de 20m et une derniere cotation de 3.45m de manière à respecter une cotation ts les 20m de ma polyligne. Un bon schéma valant mieux qu'un long discours. http://www.cijoint.fr/cjlink.php?file=cj200907/cijKmkoDc0.jpg Et voici le lisp sur lequel je suis en train de modifer mais en vain. (defun c:lwc_dim ( / js ent dxf_ent lst_pt AcDoc Space) (princ "\nSélectionner la polyligne à coter. ") (setq js (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))) (cond (js (vl-load-com) (setq dxf_ent (entget (setq ent (ssname js 0))) lst_pt (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent))) ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (while (cdr lst_pt) (vla-addDimAligned Space (vlax-3d-point (car lst_pt)) (vlax-3d-point (cadr lst_pt)) (vlax-3d-point (polar (mapcar '* (mapcar '+ (car lst_pt) (cadr lst_pt)) '(0.5 0.5 0.5)) (+ (angle (car lst_pt) (cadr lst_pt)) (* pi 0.5)) (* 10 (getvar "DIMTXT")) ) ) ) (setq lst_pt (cdr lst_pt)) ) ) ) (prin1) ) Pour le lisp, le mieux serait de définir la valeur de cotation maximale à utiliser, c'est à dire une cotation tous les 20m ou tous les 40m puis de sélectionner la polyligne 2D à côter. De plus, un autre question, comment faire lorsqu'on modifie certaines valeurs des variables du style de côte comme (setvar "DIMASSOC" 1) (setvar "DIMEXO" 0.0625) (setvar "DIMPOST" "m") ces valeurs s'appliquent au style de côte courant ? Merci par avance de votre aide. John.
-
Merci Gile pour ta réponse. Je sais je ne suis pas très explicite quelque fois mais j'ai pu m'en sortir avec tes infos. J'ai fait une liste de code pour les polylignes, les blocs 1 point et 3 point puis j'ai fait appel à chaque sous routine correspondante selon la valeur du code trouvé dans le fichier texte. Merci encore. John.
-
Désolé de ne pas me faire comprendre du premier coup. Voici un exemple qui je pense sera plus clair . 1 274.6253 336.1729 17.3017 203 2 273.5561 333.2459 17.313 203.3 3 274.4668 332.8913 17.3073 203.5 4 039.2175 387.3724 16.411 202 5 040.9549 384.7242 16.3003 202.2 6 041.7836 385.2299 16.343 202.6 7 380.1717 137.301 19.9 204 8 383.2345 136.6416 19.452 204.3 9 383.4449 137.5947 19.4053 204.8 Dans ce cas, il faut que le code trace une polyligne 3D non fermée de 1 à 2 puis 3 dans un calque spécifique, insérer un bloc en 3 points dans un autre calque avec les points 4,5,6 puis tracé une polyligne 3D de 7 8 et 9. Dans mon code, j'ai trouvé la solution pour insérer des blocs en lisant le fichier texte une fois puis dès qu'il trouve un code correspondant, il met le calque concerné en calque courant par CLAYER puis tracé l'élément en question. Je n'arrive pas à modifier ton code pour tracer seulement des polylignes fermées au code avec le préfixe concerné. Il faudrait à mon avis pour le cas des polylignes 3D traiter le fichier texte dans un autre code pour plus de facilité. J'ai une liste d'une centaine de code au total. Mais on peut voir déjà comme çà avec ces 3 codes exemples. En espérant que je me suis expliqué de façon claire, merci par avance de ton aide. John.
-
Gile, j'ai essayé de modifier ton code selon mes besoins mais je ny arrive pas ya un bug et je sais pas ou. JE veux utiliser ton code en temps que sous routine pour l'utiliser qu'en cas de présence d'un code particulier. Certains codes de mes points doivent être utilisés pour des blocs par un point ou 3 points et d'autres pour le tracé des polylignes 3D or dans ton code, ca ne me trace que des poly 3D donc si on pourrait y mettre en condition un truc du style (if (= (atof cod) 203) (bt lst)) De plus, j'ai l'impression de ta routine reprend la liste depuis le début à chaque fois alors que je voudrais seulement qu'il traite la suite des points les uns après les autres. Si ca peut se servir, j'utilise un préfixe du type .5 pour indiquer que ma poly 3D s'arrête et un suffixe du type .8 pour dire qu'elle s'arrête et qu'elle doit se fermer en son premier point. Merci par avance de ton aide. John. Speedy, regarde tes unités d'insertion à mon avis.
-
Mais quand il y a par exemple dix points qui ont le même code, je ne vois pas comment comparer les chines de caractères ??? Merci de ton aide. John.
-
C'est bon pour les blocs en 3 points, j'ai pu m'en sortir en lisant les deux lignes avec : (setq lst1 (str2lst (read-line file) " ")) (setq pt1 (list (atof (nth 1 lst1)) (atof (nth 2 lst1)) (atof (nth 3 lst1)))) (setq lst2 (str2lst (read-line file) " ")) (setq pt2 (list (atof (nth 1 lst2)) (atof (nth 2 lst2)) (atof (nth 3 lst2)))) Dernière question et après ce sera complet, Comment faire pour tracer une polyligne 3D en une succession de points ayant les 3 premiers caractères du code identique ? Voici un exemple : 25 378.749 805.8548 25.2423 203 26 377.8199 806.6664 25.1894 203.3 27 377.4779 806.3038 25.2085 203.8 Les trois points ont le même code 203 comme préfixe. Le suffixe du code du dernier point est un code de fermeture de la polyligne 3D alors que le .5 indique que la poly ne doit pas être fermée. Et donc la polyligne doit se tracer de 25 à 26 puis à 27. La je pense que ta méthode serait plus simple mais comment intégrer les conditions ? C'est là que je bloque. Merci de ton aide. John.
-
Gile, c'est bon en fait, l'erreur string nil venait de la valeur d'un attribut qui n'était pas dans la liste. Maintenant, j'ai un autre souci pour lequel je ne trouve pas de solution. Je dois insérer un bloc avec attribut en 3 points et donc récupérer les valeurs des coordonnées des points des deux lignes qui suivent mon point d'insertion de mon bloc. Exemple : 25 378.749 805.8548 25.2423 26 377.8199 806.6664 25.1894 27 377.4779 806.3038 25.2085 Je dois insérer mon bloc sur le point 25 avec échelle en x égale à ma distance 25-26 et échelle en y égal à distance 26-27 puis valeur de l'angle de rotation égal à l'angle 25-26 par rapport au nord. Comment faire pour les valeurs des points 26 et 27 pour calculer les paramètres d'insertion de mon bloc echelle en x et y puis valeur de la rotation ? Merci par avance de ton aide. John.
-
Bonjour Gile J'ai pu m'en sortir sur les coordonnées de point d'insertion avec la fonction atof et la fonction rtos pou l'attribut alt. Par contre, mes points s"insérent correctement mais j'ai à la fin une erreur du type Commande: ; erreur: type d'argument incorrect: stringp nil N'est il pas possible de connaître à l'avance le nombre de ligne à traiter pour sortir du programme en douceur ? Merci par avance de ton aide. John.
-
Bonjour Gile Je viens tout juste de rentrer de déplacement désolé pour le retard dans la réponse et merci de ton aide. Voila ce que j'ai pu faire mais apparemment, il y a un souci avec les nth ou autre chose car j'ai le retour d'erreur ; erreur: type d'argument incorrect: numberp: "8.2695" Mon fichier est du type 1 9610.7280 4069.5719 8.2695 100 TEXT Et voici le code (defun c:inspts(/ filename file line lst) (setq filename (getfiled "Sélectionner un fichier point" "" "txt;csv;*" 0)) (setq file (open filename "r")) (while (setq line (read-line file)) (setq lst (str2lst line " ")) (traitement_points lst) (close file) ) (prin1) ) (defun traitement_points (lst / lez cod att1) (setq lez (rtos (nth 3 lst) 2 2)) (setq cod (nth 4 lst)) (setq att1 (nth 5 lst)) (command "_.insert" "PT" (list ((nth 1 lst) (nth 2 lst) (nth 3 lst))) lez cod att1) ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Merci par avance de ton aide. John.
