Aller au contenu

chris_mtp

Membres
  • Compteur de contenus

    406
  • Inscription

  • Dernière visite

Tout ce qui a été posté par chris_mtp

  1. Merci pour ces infos mais c'est quand même compliqué de faire une dcl. John.
  2. Merci Gile pour ces infos. Dernière petite question. J'essaye de faire une boite de dialogue dcl avec 4 valeurs à entré par l'utilisateur mais il y a un bug. Par contre, pour la liste déroulante, je ne vois pas non plus comment la paramétrer. (defun DoubleInputBox (box msg1 msg2 msg3 msg4 val1 val2 val3 val4/ temp file dcl_id lst) (defun subr (str / pos) (if (and (< 50 (strlen str)) (setq pos (vl-string-position 32 (substr str 1 50) nil T)) ) (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))) ) (strcat ":text_part{label=\"" str "\";}") ) ) (setq temp (vl-filename-mktemp "Tmp.dcl") file (open temp "w") pdcech (list "100" "200" "250" "250" "500" "1000" "1250" "1500" "2000" "2500") ) (write-line (strcat "DoubleInputBox:dialog{key=\"box\";initial_focus=\"val1\";:paragraph{" (subr msg1) "}:edit_box{key=\"val1\";edit_width=54;allow_accept=true;}spacer;:paragraph{" (subr msg2) "}:edit_box{key=\"val2\";edit_width=54;allow_accept=true;}spacer;:paragraph{" (subr msg3) "}edit_box{key=\"val3\";edit_width=25;allow_accept=true;} :popup_list{key=\"pdcech\";edit_width=25;} (subr msg4) "}:edit_box{key=\"val4\";edit_width=54;allow_accept=true;}spacer;ok_cancel;}" :popup_list{key=\"pdcech\";edit_width=25;} ) file ) (close file) (setq dcl_id (load_dialog temp)) (if (not (new_dialog "DoubleInputBox" dcl_id)) (exit) ) (foreach n '("box" "val1" "val2" "val3" "val4") (set_tile n (eval (read n))) ) (action_tile "accept" "(setq lst (list (get_tile \"val1\") (get_tile \"val2\") (get_tile \"val3\") (get_tile \"val4\"))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete temp) lst ) Je me suis inspiré de ton exemple mais j'ai le retour ; erreur: nombre d'arguments insuffisants Merci par avance de ton aide. John.
  3. Bonjour Gile, Je voudrais créer un dcl temporaire dans un lisp où je dois entrer plusieurs valeurs avant de lancer mon lisp. J'ai essayé la fonction DoubleInputBox mais je n'arrive pas à récupérer les valeurs entrées même avec atof. Les valeurs sont bien des strings stockès dans une liste appelée lst donc avec (setq echx (atof (nth 0 lst))) ça doit marché mais j'ai le retour erreur: type d'argument incorrect: consp nil. Par contre, une autre question, comment créer une liste déroulante dans l'inputBox ? Merci par avance de ton aide. John.
  4. Merci Gile pour ces infos. Ca marche nickel comme çà et bravo encore pour cette routine qui va en aider plus d'un à mon avis. John.
  5. Bonjour à tous, Cette routine peut être très utile dans le cas d'un contrôle par exemple entre les données du cadastre et les données graphiques mais petite question (adressé à gile) ; Si les numéros contiennent un préfixe, comment modifié le code pour avoir le même listing ? Merci par avance. John.
  6. A 2 min près. Ca marche nickel maintenant. Merci encore Gile. John.
  7. Merci pour la fonction equal mais dans ce cas comment faire avec mes if (if (not (equal ptd (member ptd lst_b1) 1e-9)) (command "_.circle" ptd 5)) (if (not (equal ptf (member ptf lst_b1) 1e-9)) (command "_.circle" ptf 5)) John
  8. C'est bon j'ai compris pour ta fonction Transblk. Elle me retourne le même résultat que moi mais toujours le même problème. Il y a des cercles sur les blocs plaques alors que l'extremité de mes polylignes arrive bien sur le nodal du bloc et donc sur le nodal du point qu'on calcule. Il doit y avoir un pb de décimales non ? John.
  9. Merci Gile pour ta réponse mais j'ai fait comme tu m'as dit précédemment en calculant les coordonnées de mon point nodal avec les facteurs d'échelle et de rotation du bloc. J'ai vérifié, le calcul des coordonnées du point est correct mais il doit y avoir un autre pb car ca ne marche toujours pas comme je voudrais. J'ai modifié le code. Je pense qu'il doit y avoir un pb de décimales entre le calcul de coordonnées de mon point nodal et les extremites de mes polylignes. Pourtant, j'ai vérifié avec l'Editeur Visual Lisp, la liste lst_b1 me retourne bien une liste de points 2d et les points ptd et ptf sont eux aussi des points 2d et surtout avec le même nombre de décimales. Mais les cercles s'insérent toujours sur les blocs "plaques". Je ne vois pas mon erreur. Par contre, j'ai essayé ta fonction TransBlk. En argument, le point pt correspond à quoi exactement. Merci par avance de ton aide. John.
  10. Rebonjour Gile, J'ai modifié le code pour faire une liste de points 2d seulement. Pour les blocs par un point je n'ai pas de problème maintenant ca marche mais par contre j'ai un autre souci. Je dois pouvoir récupérer le nodal qui est au centre de mon bloc levés par 3 points comme le montre l'image ci-jointe mais je ne vois comment m'y prendre même avec les sous entités DXF je ne vois pas. Le nodal fait partie intégrante du bloc http:// http://www.cijoint.fr/cjlink.php?file=cj200908/cijo9sJNNE.jpg Si vous pouvez m'aider, merci par avance. John.
  11. J'ai trouvé pourquoi la routine bloque, c'était à cause de l'incrément d+1. J'ai modifié le code.
  12. Voici ce que j'ai pu faire (defun c:cpoly (/ ss ss1 pti ptd ptf d long nom dxf_ent lst_b1 i bloc bent echx echy rot ptnod) (setvar "OSMODE" 0) (setvar "CMDECHO" 0) (setq ss1 (ssget "X" (list (cons 0 "INSERT") (cons 8 "POTEAU")))) (repeat (setq i (sslength ss1)) (setq pti (cdr (assoc 10 (entget (ssname ss1 (setq i (1- i))))))) (setq lst_b1 (cons (list (car pti) (cadr pti)) lst_b1)) ) (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 8 "PLAQUE")))) (setq i 0) (repeat (sslength ss) (setq bloc (ssname ss i)) (setq bent (entget bloc)) (setq pti (cdr (assoc 10 bent))) (setq echx (cdr (assoc 41 bent))) (setq echy (cdr (assoc 42 bent))) (setq rot (cdr (assoc 50 bent))) (setq ptnod (polar pti (+ rot (atan (/ echy echx))) (sqrt (+ (* (/ echx 2) (/ echx 2)) (* (/ echy 2) (/ echy 2)))))) (setq lst_b1 (cons (list (car ptnod) (cadr ptnod)) lst_b1)) (setq i (+ i 1)) ) (setq ss (ssget "X" (list (cons 0 "LWPOLYLINE") (cons 8 "CABLE")))) (if (not (tblsearch "LAYER" "ERREUR")) (command "_layer" "_N" "ERREUR" "_CO" "1" "ERREUR" "")) (setvar "CLAYER" "ERREUR") (princ "\nCONTROLE EXTREMITES DES POLYLIGNES") (setq d 0) (setq long (sslength ss)) (while (< d long) (setq nom (ssname ss d)) (setq dxf_ent (entget nom)) (setq ptd (cdr (assoc 10 dxf_ent))) (setq ptf (cdr (assoc 10 (reverse dxf_ent)))) (if (not (member ptd lst_b1)) (command "_.circle" ptd 5) ) (if (not (member ptf lst_b1)) (command "_.circle" ptf 5) ) (setq d (+ d 1)) ) (setvar "OSMODE" 65) (setvar "CMDECHO" 1) (prin1) ) Mais la routine bloque à la fin et me plante AutoCAD à chaque. J'essaye d'abord de faire marcher la routine sur les blocs ponctuel levés par un point avant de me lancer sur les blocs par 3 points et le fameux nodal au centre. Gile, j'ai fait attention à la présentation et je l'ai fait avec AutoLisp. Merci par avance de ton aide. John[Edité le 8/8/2009 par chris_mtp][Edité le 8/8/2009 par chris_mtp][Edité le 9/8/2009 par chris_mtp][Edité le 9/8/2009 par chris_mtp][Edité le 9/8/2009 par chris_mtp] [Edité le 9/8/2009 par chris_mtp]
  13. chris_mtp

    DMPC NUMERIQUE

    Elle a quand même des points dans le système de départ donc après avoir extrait les coordonnées des polylignes et des blocs de ton dessin de départ en les mettant dans un fichier texte et en les convertissant avec Circé tu peux les avoir dans le système d'arrivée. Et donc tu peux utiliser le recalage d'Helmert de Covadis non ? John
  14. chris_mtp

    DMPC NUMERIQUE

    Heureusement que non, surtout pour les projections coniques conforme type Lambert car les déformations seraient trop importantes. Ce n'est pas au logiciel d'imposer à l'utilisateur un système de coordonnées. Oui sauf si tu leur demande un fichier dans un système précis. Pour la transformation de coordonnées entre deux systèmes, il vaut mieux à mon avis adapter la transformation d'helmert appliqué à une zone spécifique et obtenir les coordonnées du système d'arrivée par Circe de manière à réduire les erreurs et les écarts trop grands entre les points transformés par Helmert et les points théoriques convertis par Circe. John.
  15. Merci Gile de me répondre. Le but serait de sélectionner toutes les polylignes 2D d'un calque spécifique et de contrôler que chacune des extremités de ces polylignes soit relié à un bloc. En autre chose, que les coordonnées du point de début et de fin de ma polyligne correspondent au point d'insertion d'un bloc nommé Placard ou xxxx ou .... Les extremités de mes polylignes peuvent être raccordé à 3 blocs différents, soit un Placard soit un Coffret soit une Armoire. Par contre, certains de mes blocs sont levés par 3 points mais les polylignes sont reliés à un point nodal au centre de ces blocs. Le nodal est compris dans le bloc. Je vais mettre en ligne une image pour expliquer clairement ma demande. Merci encore de ton aide. John.
  16. Bonjour à tous, J'ai dans un dessin une centaine de polylignes appartenant à un calque spécifique et chacune des extremités de ces polylignes doit être relié à des blocs nommés soit Placard soit Tampon. J'essaye de programmer un lisp qui me permette de vérifier chacune des extrémités de mes polylignes mais en vain. Si vous avez une idée, merci par avance. John
  17. chris_mtp

    DMPC NUMERIQUE

    Pour les problèmes de transformation entre deux plans, didier a parfaitement raison. Faire une confiance absolue en Covadis est un peu risqué avec l'outil Changement d'un système de projection car aucun résultat n'est affiché mais par contre, l'outil Recalage d'Helmert dans Covadis 2D-Digitalisation est très utile car lui il affiche les résultats point par point. Mais si l'étudiant transforme le dxf du cadastre, il risque d'avoir des problèmes dans le monde du travail. Dans ce cas, vaut mieux demander au cadastre un autre fichier dans le bon système surtout pour un DMPC. John.
  18. chris_mtp

    Autocad et Excel

    Merci Gile pour ce code qui va m'être très utile. C'est sur, je dois encore apprendre le Lisp classique avant de me mettre au Vlisp mais j'avais besoin de cette fonction. Je vais encore bien lire et comprendre ton code. Merci encore pour ton aide John.
  19. chris_mtp

    Autocad et Excel

    la fonction vlax-get-property ne permet que d'extraire les propriétés de la cellule active. C'est bien çà ? Elle ne permet pas de déplacer le curseur sous Excel ou de modifier les propriétés d'une cellule sous Excel. J'ai essayé d'incrémenter la cellule active de A4 en A5 comme décrit dans l'exemple en ajoutant (setq cell (vlax-get-property ExcelApp (Row+n (cell 1)))) à la suite des commands mais il y a toujours une erreur quant à la couleur, il y a aussi un problème. Je ne vois pas comment les utiliser ni dans l'aide ou c'est flou. J'ai ajouté en fin de code la fonction Row+n dont tu en est l'auteur dans le même principe Column+n mais sans succés. Merci encore pour ton aide.. John.
  20. chris_mtp

    Autocad et Excel

    En cherchant dans les fonctions disponibles sur le lien de Tramber http://www.atablex.com/htmls/vlxls-functions.htm j'ai trouvé ceci (Defun vlxls-text-put-aci (xl id aci / Rtn) (if (null aci) (msxl-put-colorindex (msxl-get-font (setq Rtn (msxl-get-range xl id))) (vlax-make-variant -4105) ) (msxl-put-colorindex (msxl-get-font (setq Rtn (msxl-get-range xl id))) (vlxls-color-aci->eci aci) ) ) Rtn ) mais dès que j'essaye de l'intégrer dans le code, j'ai une erreur Autocad. John
  21. chris_mtp

    Autocad et Excel

    Merci Gile pour cette appli surtout à cette heure aussi tardive. C'est exactement ce que je cherché à faire. Par contre, serait il possible sous Excel de mettre en couleur bleu ou rouge la cellule dont on vient de faire un zoom ? Puis de mettre le curseur sous Excel à la cellule N+1 ligne toujours dans la colonne A. Exemple, si sous Excel la cellule active A4, serait il possible après le zoom sous Autocad de mettre le curseur en cellule A5 de manière à répéter la commande ? et donc de mettre la cellule A4 en couleur rouge ou bleu. Sinon, c'est pas grave. Je vais bien ananlyser ton code. Merci encore pour ton aide précieuse. John.
  22. chris_mtp

    Autocad et Excel

    Salut, Gile, Oui, en spécificiant à l'avance le nom du fichier excel, le nom de la feuille et le nom de la cellule où extraire les données ca marche mais mon but est le suivant : Avoir Excel et Autocad ouvert en même temps, être capable avec le lisp de récupérer automatiquement le nom du fichier excel ouvert, le nom de la feuille et le nom de la cellule active où se trouve mon curseur sur Excel pour afficher le numéro du point sous Autocad aux coordonnées indiquées sur Excel avec le X dans la colonne B, le Y dans la colonne C et le Z dans la colonne D. Ou du moins trouver une méthode simple pour spécifiez le fichier feuille et cellule à traiter. Merci par avance de ton aide. John.
  23. chris_mtp

    Autocad et Excel

    Bonjour à tous, Je vous écris car je ne m'en sors pas avec les fonctions VLA. Je vous explique. J'ai Autocad et Excel d'ouvert. Mon fichier excel est composé de la façon suivante 4 colonnes avec pour titre de chacune Numéro X Y et Z Je met mon curseur sous Excel dans la première colonne sur une ligne quelconque, par exemple la cellule A4, je voudrais récupérer les valeurs contenus dans les cellules donc B4, C4 et D4 pour pouvoir ensuite insérer sous Autocad un texte qui correspond au numéro du point en question. J'ai essayé de faire ceci mais c'est pas bon (defun c:zx (/ x y z label) (vl-load-com) (setvar "TEXTSIZE" 10) (setq label (Getcell "A2")) (setq x (atof (Getcell "B2"))) (setq y (atof (Getcell "C2"))) (setq z (atof (Getcell "D2"))) (command "_zoom" "c" (strcat x","y) 15) (command "_text" "bc" (list x y z) 10 100 label) (prin1) ) De là, deux questions, j'ai essayé de mettre au lieu d'une cellule spécifié la référence ActiveCell mais sans retour du type (setq label (Getcell "ActiveCell")) Doit on obligatoirement ouvrir une liaison avec Excel même si Excel est ouvert avec la bonne feuille ? Merci par avance de votre aide. John.
  24. chris_mtp

    Les Conditions...

    Merci Gile, Pour les crochets, dans l'aide Visual Lisp (je suis tes conseils tu vois !!!) , les tests de la fonction cond sont entre crochets du coup j'ai tenté, je pensais que mon erreur venait d'ailleurs mais non en fait. Pour les tabulations c'est un oubli désolé mais sinon ca marche pour le code. J'ai du le modifier un peu en intégrant distof pour convertir un string en décimal. Merci encore. John.
  25. chris_mtp

    Les Conditions...

    Bonjour à tous, J'ai besoin de faire analysé un élement d'une liste entre autre une coordonnées X ou Y qui doit être non nulle et compris entre deux autres valeurs. J'ai donc essayé de faire des conditions multiples avec des if à répétition, utiliser la fonction cond mais sans succès. Voici le bout de code qui me pose problème: (cond [ (/= "0.000000" (nth 1 lstini)) (/= "0.000000" (nth 2 lstini)) (> (nth 1 lstini) (car pt1)) (< (nth 1 lstini) (car pt2)) (> (nth 2 lstini) (cadr pt1)) (< (nth 2 lstini) (cadr pt2)) ] (write-line (strcat (nth 0 lstini) " " (nth 1 lstini) " " (nth 2 lstini) " " (nth 3 lstini)) filcor) ) Mes deux points pt1 et pt2 sont saisies dans le dessin par l'utilisateur. Ce sont deux points extrêmes, point bas gauche et point haut droit d'une fenêtre de capture d'entité sous AutoCAD. Par contre, avec le if pour les deux premiers test, il n'y a pas de souci avec (if (/= "0.000000" [(nth 1 lstini) (nth 2 lstini)]) (write-line (strcat (nth 0 lstini) " " (nth 1 lstini) " " (nth 2 lstini) " " (nth 3 lstini)) filcor) ) mais dans ce cas, je ne peux faire mes tests avec les points pt1 et pt2. Si vous avez une idée, merci par avance de votre aide. John. 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é