didicools Posté(e) le 7 mai 2009 Posté(e) le 7 mai 2009 Bonjour a tous, j'ai trouver un lisp sur le net, et ce lisp me permet de noter la longueur d'une polyligne juste au dessus et au centre de celle ci. Ce lisp m'écrit cette longueur sous forme de CHAMP.Il sagit du lisp de Bonuscad : CurveLength_Fielddisponible ici : http://bruno.valsecchi.neuf.fr/bonuscad/CurveLength_Field.lsp Ce que je voudrai c'est que cette longueur soit écrite sous forme d'un bloc avec attribut (attribut qui aurai pour "valeur" le CHAMP initialement prévu dans le lisp). Et que le nom du bloc s'incrémente de 1 à x bloc Une autre chose, ce lisp me note la longueur de la polyligne sur un calque qu'il crée, appelé "Id-Longueurs", ce que je voudrai c'est qu'il me note ces longueurs sur le meme calque que ma polyligne car j'ai des polylignes sur différents calques. Est-il possible de faire ca ? Mon but au final, et de pouvoir extraire ces longueurs sur excel, les modifier et les réinjecter sur autocad, et je voi que que le bloc avec attribut pour faire ca. En espérent que cela est possible. Merci d'avance en tout cas pour toute l'aide que vous pourrez m'apporter. Didicools [Edité le 7/5/2009 par didicools]
bonuscad Posté(e) le 9 mai 2009 Posté(e) le 9 mai 2009 Bonjour, Et que le nom du bloc s'incrémente de 1 à x bloc Si je puis me permettre, je vois pas du tout l'intérêt du bloc dans ce cas précis.Incrémenter le nom du bloc voudrait dire un bloc distinct pour chaque insertion, donc une définition par insertion unique. Par contre un second attribut (en plus du champ) qui s'incrémente, là oui: Une seule définition pour des insertions multiples. Mon but au final, et de pouvoir extraire ces longueurs sur excel, les modifier et les réinjecter sur autocad, et je voi que que le bloc avec attribut pour faire ca. Les réinjecter peut être, mais de là a modifier les longueurs existante des objets concernés, mis à part les réacteurs (que je ne maitrise pas), je vois pas.... Peut être la liaison par la commande "LIAISONDONNEES" ("_DATALINK") mais je pratique pas ce mode de liens et ne connais pas les possibilités de cet outil. Il semble que cela peut faire un liens dans les deux sens sur les DONNÉES essentiellement entre un tableau sous Autocad et une feuille Excel.Commande à voir peut être... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 10 mai 2009 Auteur Posté(e) le 10 mai 2009 pourtant c'est bien ca que je veux, je voudrai que ce soit bien des bloc différent avec tattribut et qui aurai pour valeur la longueur de la polyligne mais sans prendre la polyligne dans le bloc. Le bloc serai constiué juste de l'attribut. Je vous explique ma situation, dans le cadre de tirage de réseau électrique, je représente mon réseau futur par une polyligne, cette polyligne me donne une longueur. Mais mon reseau arrive soit sur une boite, soit chambre de tirage ou soit sur un tableau d'abonné (il sagit d'éclairage public et distribution electrique du reseau EDF) donc a la longueur de la polyligne j'ajoute soit 2m, soit 5m, soit 10m et c'est pas des petite section de cable, donc je peu pas arrondir les longueur.....et j'ai besoin que cette longueur apparaisse sur le plan. Et comme je travail sur des reseau de plusieur km, ca serai pas mal si je pouvais automatiser tout ca en passant par excel. en passant ce cette manière sur excel, je pourai r'envoyé mes longueurs sur chaque bloc. Après si vous avez d'autre proposition plus simple je suis preneur biensur!! Merci!
bonuscad Posté(e) le 11 mai 2009 Posté(e) le 11 mai 2009 Après si vous avez d'autre proposition plus simple je suis preneur biensur!! Avec les XDATA ?Voici un exemple construit à peu près à ton souhait pour te montrer le fonctionnement que l'on peut avoir.Le code servant à construire tes liaisons de câbles. Dans le code j'ai fixé des noms de calques à des type de réseaux. ((eq lay_name "Reseau Distribution Electrique Eclairage") (setq typ_cab "DISTRIBUTION-PUBLIC")) ((eq lay_name "Reseau Distribution Electrique Abonne") (setq typ_cab "DISTRIBUTION-PRIVE")) (T (setq typ_cab "DISTRIBUTION-Inconnue")) Cette liste n'est pas exhaustive et peut être ajustée/complétée ... (defun draw_pt (pt col / rap) (setq rap (/ (getvar "viewsize") 50)) (foreach n (mapcar '(lambda (x) (list ((eval (car x)) (car pt) rap) ((eval (cadr x)) (cadr pt) rap) ) ) '((+ +) (+ -) (- +) (- -)) ) (grdraw (trans pt 0 1) (trans n 0 1) col) ) ) (defun c:CABLAGE ( / js dxf_ent lay_name typ_cab obj_vlax e_length pt_start pt_end minpt maxpt key_cab lg_ext AcDoc Space pt deric rtx htx nw_obj) (princ "\nSélectionnez une polyligne ou entrée pour en créer une.") (setq js (ssget "_+.:E:S" (list '(0 . "LWPOLYLINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (getvar "CTAB")) ) ) ) (if (null js) (progn (setvar "CMDECHO" 1) (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) (setq dxf_ent (entget (entlast))) ) (setq dxf_ent (entget (ssname js 0))) ) (cond ((eq (cdr (assoc 0 dxf_ent)) "LWPOLYLINE") (setq lay_name (cdr (assoc 8 dxf_ent))) (cond ((eq lay_name "Reseau Distribution Electrique Eclairage") (setq typ_cab "DISTRIBUTION-PUBLIC")) ((eq lay_name "Reseau Distribution Electrique Abonne") (setq typ_cab "DISTRIBUTION-PRIVE")) (T (setq typ_cab "DISTRIBUTION-Inconnue")) ) (vl-load-com) (setq obj_vlax (vlax-ename->vla-object (cdar dxf_ent)) e_length (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax)) pt_start (vlax-curve-getStartPoint obj_vlax) pt_end (vlax-curve-getEndPoint obj_vlax) ) (vla-GetBoundingBox obj_vlax 'mnpt 'mxpt) (setq minpt (trans (safearray-value mnpt) 0 1) maxpt (trans (safearray-value mxpt) 0 1) ) (command "_.zoom" "_window" "_none" minpt "_none" maxpt "_.zoom" "0.75x") (redraw (cdar dxf_ent) 3) (draw_pt pt_start 7) (repeat 2 (initget "Boite Chambre Tableau") (setq key_cab (getkword "\nBranchement pour cette extrémité sur [boite/Chambre/Tableau]? : ")) (cond ((eq key_cab "Tableau") (setq lg_ext (cons (cons 10 key_cab) lg_ext))) ((eq key_cab "Chambre") (setq lg_ext (cons (cons 5 key_cab) lg_ext))) (T (setq key_cab "Boite" lg_ext (cons (cons 2 key_cab) lg_ext))) ) (draw_pt pt_start -7) (draw_pt pt_end 7) ) (draw_pt pt_end -7) (if (null (tblsearch "appid" "RESEAU_CABLAGE")) (regapp "RESEAU_CABLAGE") ) (alert (strcat "Information attaché à la polyligne mesurant : " (rtos e_length 2 2) "\net sur le calque : " lay_name "\n" "\nLongueur de cable attaché : " (rtos (+ e_length (caadr lg_ext) (caar lg_ext)) 2 2) "\nPour un(e) : " (strcase (cdadr lg_ext)) " à la 1ere extrémité." "\nEt pour un(e) : " (strcase (cdar lg_ext)) " à la 2ème extrémité." "\nCeci pour une " typ_cab ) ) (redraw (cdar dxf_ent) 4) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (setq pt (vlax-curve-getPointAtDist obj_vlax (* 0.5 e_length)) deriv (vlax-curve-getFirstDeriv obj_vlax (vlax-curve-getParamAtPoint obj_vlax pt)) rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR"))) ) (initget 6) (setq htx (getdist (trans pt 0 1) (strcat "\nSpécifiez la hauteur texte <" (rtos (getvar "TEXTSIZE")) ">: "))) (if htx (setvar "TEXTSIZE" htx)) (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi))) (setq nw_obj (vla-addMtext Space (vlax-3d-point (setq pt (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE")))) 0.0 (rtos (+ e_length (caadr lg_ext) (caar lg_ext)) 2 2) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt (getvar "TEXTSTYLE") lay_name rtx) ) (entmod (append dxf_ent (list (list -3 (list "RESEAU_CABLAGE" (cons 1002 "{") (cons 1000 typ_cab) (cons 1000 (cdadr lg_ext)) (cons 1040 (caadr lg_ext)) (cons 1000 (cdar lg_ext)) (cons 1040 (caar lg_ext)) (cons 1000 "Longueur totale de cable") (cons 1040 (+ e_length (caadr lg_ext) (caar lg_ext))) (cons 1002 "}") ) ) ) ) ) (redraw) ) (T (princ "\nN'est pas une polyligne!")) ) (prin1) ) En voici un autre qui serait un outil de renseignement sur le réseau déjà tracé (defun c:id_cablage ( / esel ename elist xd_list obj_vlax e_length e_data) (while (not (setq esel (entsel "\nChoisir le cablage à identifier: "))) ) (setq ename (car esel)) (sssetfirst nil (ssadd ename)) (setq elist (entget ename (list "RESEAU_CABLAGE"))) (cond ((setq xd_list (assoc -3 elist)) (vl-load-com) (setq obj_vlax (vlax-ename->vla-object ename)) (setq e_length (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax))) (setq xd_list (cdr xd_list)) (setq e_data (mapcar 'cdr (cdr (car xd_list)))) (alert (strcat "Information attaché à la polyligne mesurant : " (rtos e_length 2 2) "\net sur le calque : " (cdr (assoc 8 elist)) "\n" "\nLongueur de cable attaché : " (rtos (cadddr (cddddr e_data)) 2 2) "\nPour un(e) : " (cadddr (cdr e_data)) " à la 1ere extrémité." "\nEt pour un(e) : " (caddr e_data) " à la 2ème extrémité." "\nCeci pour une " (cadr e_data) ) ) ) (T (alert "\nAucune donnée n'est associée à cette sélection!")) ) (sssetfirst nil nil) (prin1) ) On pourrait en faire d'autre suivant les besoins (exportation vers un fichier CSV par exemple) [Edité le 13/5/2009 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 11 mai 2009 Auteur Posté(e) le 11 mai 2009 bonuscad, Ce lisp est impressionnant, c'est incroyable, ca fait exactement ce dont j'ai besoin.Cependant, serait-il possible de marquer le texte sous forme d'un champ, pour que si jamais je modifie un peut la polyligne (allongé ou réduire un peu la polyligne par exemple) la longueur ce met a jour avec un petit "regen".Comme on additionne les longueurs venant des boite, tableau et autre, je pas si les champs pourront ce metre a jour comme dans ton lisp CurveLength_Field. Une autre petite chose, est ce qu'il serai possible d'avoir le choix de tracer la poyligne avec cette commande "cablage" (qui est très bien ;) ) mais aussi de pouvoir sélectionner une polyligne deja existante? Cette requete est moin importante, mais ca serai un petit plus. J'aurai éventuellement d'autre besoin comme additionné toutes les longueurs (i compris longueur de boite et tableau) d'un meme calque et le metre dans un tableau avec le nom du calque en face. Mais ca serai en dernier lieu, sinon je pourai faire ca en faisant une extraction de donné sur excel, et coller le tableau sur autocad, ca m'inquiète pas trop ca. Après j'aurai différent calques, mais la je devrai m'en sortir je croi, ca devrai pas poser de pb, surtout que tu as sorti du lisp le passage ou tu défini les calques. sinon je le répéte ecore une fois, ce lisp est deja génial comme ca, ca répond beaucoup de mes attente, et avec une telle rapidité pour écrire un code si complexe!!!! je dirai 2 mots : CHAPEAU BAS!!!!!!
bonuscad Posté(e) le 12 mai 2009 Posté(e) le 12 mai 2009 serait-il possible de marquer le texte sous forme d'un champ J'ai bien essayé avec quelques tests, j'ai imbriqué une addition en diesel avec la longueur de l'objet.Par exemple j'ai essayé:(strcat"%<\\AcDiesel $(+,10,5,""%<\\AcObjProp Object(%<\\_ObjId "(itoa (vla-get-ObjectID (vlax-ename->vla-object obj)))">%).Length>%"")>%") Ceci fonctionne et me crée bien un champ, MAIS celui-ci ne se met pas à jour avec la commande"_updatefield" ou même à la réouverture du dessin sauvegardé.La seule opération qui me met à jour ce champ et de double-cliquer sur le champ pour rentrer dans l'éditeur de texte et de faire un click-droit pour obtenir un menu contextuel ou je choisis de mettre à jour le champ, ET LA ÇA FONCTIONNE????Donc comme la méthode n'est pas fiable, je préfère laissé tomber (tests réalisés sous une 2009).Peut être une autre personne aura une solution pour les champs. Je laisse la main.Mais vu la réponse à la seconde question, il est simple d'effacer le texte et de recommencer l'opération (qu'il ne faut pas oublier de faire) il serai possible d'avoir le choix de tracer la poyligne avec cette commande "cablage" (qui est très bien ) mais aussi de pouvoir sélectionner une polyligne deja existante? J'ai modifié le code donné précédemment. additionné toutes les longueurs (i compris longueur de boite et tableau) d'un meme calque et le metre dans un tableau Ceci, je pense, est réalisable. Je le ferais à temps perdu... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 12 mai 2009 Posté(e) le 12 mai 2009 La suite pour un métré (vl-load-com) (defun c:Tab_Cable ( / js AcDoc Space nb lst_layer lst_typ lst_1br lst_2br lst_length all_path j end_pos id_path fonts_path file_shx nw_style n obj dxf_ent ename elist xd_list e_data oldim oldlay ins_pt_cell h_t w_c ename_cell n_row n_column) (setq js (ssget "_X" '((0 . "LWPOLYLINE") (-3 ("RESEAU_CABLAGE"))))) (cond (js (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) nb 0 lst_layer '() lst_typ '() lst_1br '() lst_2br '() lst_length '() ) (cond ((null (tblsearch "LAYER" "Tableau-Reseaux-Cables")) (vla-add (vla-get-layers AcDoc) "Tableau-Reseaux-Cables") ) ) (cond ((null (tblsearch "STYLE" "Texte-Cell")) (setq all_path (getenv "ACAD") j 0) (while (setq end_pos (vl-string-position (ascii ";") all_path)) (setq id_path (substr all_path 1 end_pos)) (if (wcmatch (strcase id_path) "*FONTS*") (setq fonts_path (strcat id_path "\\")) ) (setq all_path (substr all_path (+ 2 end_pos))) ) (setq file_shx (getfiled "Selectionnez un fichier de police" fonts_path "shx" 8)) (if (not file_shx) (setq file_shx "txt.shx") ) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Texte-Cell")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list file_shx 0.0 (/ (* 15.0 pi) 180) 1.0 0.0) ) (command "_.ddunits" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) ) ) (repeat (setq n (sslength js)) (setq obj (ssname js (setq n (1- n))) dxf_ent (entget obj) ename (vlax-ename->vla-object obj) elist (entget obj (list "RESEAU_CABLAGE")) xd_list (cdr (assoc -3 elist)) e_data (mapcar 'cdr (cdr (car xd_list))) lst_layer (cons (cdr (assoc 8 dxf_ent)) lst_layer) lst_typ (cons (cadr e_data) lst_typ) lst_1br (cons (cadddr (cdr e_data)) lst_1br) lst_2br (cons (caddr e_data) lst_2br) lst_length (cons (rtos (cadddr (cddddr e_data)) 2) lst_length) nb (1+ nb) ) ) (setq oldim (getvar "dimzin") oldlay (getvar "clayer")) (setvar "dimzin" 0) (setvar "clayer" "Tableau-Reseaux-Cables") (initget 9) (setq ins_pt_cell (getpoint "\nPoint d'insertion haut gauche du tableau: ")) (initget 6) (setq h_t (getdist ins_pt_cell (strcat "\nHauteur du texte <" (rtos (getvar "textsize")) ">: "))) (if (null h_t) (setq h_t (getvar "textsize")) (setvar "textsize" h_t)) (initget 7) (setq w_c (getdist ins_pt_cell "\nLargeur des cellules: ")) (vla-addTable Space (vlax-3d-point (trans ins_pt_cell 1 0)) (+ 3 nb) 5 (+ h_t (* h_t 0.25)) w_c) (setq ename_cell (vlax-ename->vla-object (entlast)) n_row (1+ nb) n_column -1) (vla-rotate ename_cell (vlax-3d-point (trans ins_pt_cell 1 0)) (angle '(0.0 0.0 0.0) (getvar "UCSXDIR"))) (vla-SetCellValue ename_cell 0 0 (vlax-make-variant "TABEAU RECAPITULATIF DE METRE" 8)) (vla-SetCellTextStyle ename_cell 0 0 "Texte-Cell") (vla-SetCellTextHeight ename_cell 0 0 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell 0 0 5) (foreach n (mapcar'list (append lst_layer '("Calque")) (append lst_typ '("Type de cablage")) (append lst_1br '("1er Raccordement par")) (append lst_2br '("2ème Raccordement par")) (append lst_length '("Longueurs de cable")) ) (mapcar '(lambda (el) (vla-SetCellValue ename_cell n_row (setq n_column (1+ n_column)) (vlax-make-variant el 8)) (vla-SetCellTextStyle ename_cell n_row n_column "Texte-Cell") (vla-SetCellTextHeight ename_cell n_row n_column (vlax-make-variant h_t 5)) (if (eq n_row 1) (vla-SetCellAlignment ename_cell n_row n_column 5) (vla-SetCellAlignment ename_cell n_row n_column 6) ) ) n ) (setq n_row (1- n_row) n_column -1) ) (vla-SetText ename_cell (+ 2 nb) 4 (strcat "Total= " "%<\\AcExpr (Sum(E3:E" (itoa (1+ nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 4 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 4 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 4 6) (vlax-release-object ename_cell) (vlax-release-object Space) (setvar "dimzin" oldim) (setvar "clayer" oldlay) ) (T (princ "\nAucune LWPOLYLINE trouvé avec l'application RESEAU_CABLAGE")) ) (prin1) ) [Edité le 13/5/2009 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 14 mai 2009 Auteur Posté(e) le 14 mai 2009 Merci encore bosnuscad, tu es incroyable !!!! j'aurai des évolution a te demander sur le programme "cablage", est ce qu'il serai possible que le texte contenant la longueur de la polyligne du calque "Reseau Distribution Electrique Eclairage" s'ecrive dans un calque qu'on nomerai "Reseau Distribution Electrique Eclairage- TXT" et ainsi de suite pour les autre calque. sachant que les différent calque peuvent etre créé avant dans le dessin, si ca peu te facilité un peu les choses......Juste rajouter "-TXT" au nom du calque en fonction du calque ou ce situe la polyligne. Toujour dans le lisp CABLAGE, est ce qu'il serrai possible de multiplier les longueur par 1.4 ?un exemple : (longueur de la poly + boite + tableau)*1.4 Dernière question, pour le tableau de métré, est ce qu'il est possible d'avoir un total par calque au lieu d'un total général (dans 1 ou plusieur tableau a la rigueur)? par exemple: calque 1 : longueur : 10calque 1 : longueur : 10total : 20calque 2 : longueur : 10calque 2 : longueur : 20total : 30 Le métré ce calcul sur le dessin complet, est ce qu'on peut lilimité le calcul a une selection ? Encore une fois merci pour tout le mal que tu te donne pour moi!!!! C'est vraiment très aimable de ta part!!!!
bonuscad Posté(e) le 14 mai 2009 Posté(e) le 14 mai 2009 Derniers souhaits exaucés, mais après il faudra payer car je ne veux pas réaliser du code "clé en main" pour un besoin plus que spécifique qui ne concerne que toi/ta société sans aucun investissement de développement de ta part :casstet: Tu as quand même une cerise sur le gâteau car j'ai réussi (grâce à l'aide d'internaute) à rendre les champs de mesure dynamique.Donc une modif de la polyligne sera répercuter sur le champ et dans le tableau de métré. MAIS TRES IMPORTANT: ces mesures sont liés aux variables USERR3 USERR4 et USERR5Donc si un autre programme/utilisateur modifie ces variables, les résultats seront erronés.C'est le prix à payer pour pouvoir travailler avec les champ dynamique...Par sécurité, tu peux mettre systématiquement ces variables à leur valeur(setvar "USERR3" 10.0) (setvar "USERR4" 5.0) (setvar "USERR5" 2.0) Je reposte les 2 code aux complet (defun draw_pt (pt col / rap) (setq rap (/ (getvar "viewsize") 50)) (foreach n (mapcar '(lambda (x) (list ((eval (car x)) (car pt) rap) ((eval (cadr x)) (cadr pt) rap) ) ) '((+ +) (+ -) (- +) (- -)) ) (grdraw (trans pt 0 1) (trans n 0 1) col) ) ) (defun c:CABLAGE ( / js dxf_ent lay_name typ_cab obj_vlax e_length pt_start pt_end minpt maxpt key_cab key_usr lg_ext AcDoc Space pt deric rtx htx nw_obj) (princ "\nSélectionnez une polyligne ou entrée pour en créer une.") (setq js (ssget "_+.:E:S" (list '(0 . "LWPOLYLINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (getvar "CTAB")) ) ) ) (if (null js) (progn (setvar "CMDECHO" 1) (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) (setq dxf_ent (entget (entlast))) ) (setq dxf_ent (entget (ssname js 0))) ) (cond ((eq (cdr (assoc 0 dxf_ent)) "LWPOLYLINE") (setvar "USERR3" 10.0) (setvar "USERR4" 5.0) (setvar "USERR5" 2.0) (setq lay_name (cdr (assoc 8 dxf_ent)) key_usr "") (cond ((eq lay_name "Reseau Distribution Electrique Eclairage") (setq typ_cab "DISTRIBUTION-PUBLIC")) ((eq lay_name "Reseau Distribution Electrique Abonne") (setq typ_cab "DISTRIBUTION-PRIVE")) (T (setq typ_cab "DISTRIBUTION-Inconnue")) ) (vl-load-com) (setq obj_vlax (vlax-ename->vla-object (cdar dxf_ent)) e_length (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax)) pt_start (vlax-curve-getStartPoint obj_vlax) pt_end (vlax-curve-getEndPoint obj_vlax) ) (vla-GetBoundingBox obj_vlax 'mnpt 'mxpt) (setq minpt (trans (safearray-value mnpt) 0 1) maxpt (trans (safearray-value mxpt) 0 1) ) (command "_.zoom" "_window" "_none" minpt "_none" maxpt "_.zoom" "0.75x") (redraw (cdar dxf_ent) 3) (draw_pt pt_start 7) (repeat 2 (initget "Boite Chambre Tableau") (setq key_cab (getkword "\nBranchement pour cette extrémité sur [boite/Chambre/Tableau]? : ")) (cond ((eq key_cab "Tableau") (setq lg_ext (cons (cons 10 key_cab) lg_ext) key_usr (strcat "3" key_usr))) ((eq key_cab "Chambre") (setq lg_ext (cons (cons 5 key_cab) lg_ext) key_usr (strcat "4" key_usr))) (T (setq key_cab "Boite" lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "5" key_usr))) ) (draw_pt pt_start -7) (draw_pt pt_end 7) ) (draw_pt pt_end -7) (if (null (tblsearch "appid" "RESEAU_CABLAGE")) (regapp "RESEAU_CABLAGE") ) (alert (strcat "Information attaché à la polyligne mesurant : " (rtos e_length 2 2) "\net sur le calque : " lay_name "\n" "\nLongueur de cable attaché : " (rtos (* 1.4 (+ e_length (caadr lg_ext) (caar lg_ext))) 2 2) "\nPour un(e) : " (strcase (cdadr lg_ext)) " à la 1ere extrémité." "\nEt pour un(e) : " (strcase (cdar lg_ext)) " à la 2ème extrémité." "\nCeci pour une " typ_cab ) ) (redraw (cdar dxf_ent) 4) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((null (tblsearch "LAYER" (strcat lay_name "-TXT"))) (vla-add (vla-get-layers AcDoc) (strcat lay_name "-TXT")) ) ) (setq pt (vlax-curve-getPointAtDist obj_vlax (* 0.5 e_length)) deriv (vlax-curve-getFirstDeriv obj_vlax (vlax-curve-getParamAtPoint obj_vlax pt)) rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR"))) ) (initget 6) (setq htx (getdist (trans pt 0 1) (strcat "\nSpécifiez la hauteur texte <" (rtos (getvar "TEXTSIZE")) ">: "))) (if htx (setvar "TEXTSIZE" htx)) (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi))) (setq nw_obj (vla-addMtext Space (vlax-3d-point (setq pt (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE")))) 0.0 (strcat "%<\\AcExpr " "%<\\AcExpr (%<\\AcVar " (strcat "USERR" (substr key_usr 1 1)) ">% + " "%<\\AcVar " (strcat "USERR" (substr key_usr 2 1)) ">% + " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID obj_vlax)) ">%).Length>%)>% * 1.4 >%" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt (getvar "TEXTSTYLE") (strcat lay_name "-TXT") rtx) ) (entmod (append dxf_ent (list (list -3 (list "RESEAU_CABLAGE" (cons 1002 "{") (cons 1000 typ_cab) (cons 1000 (cdadr lg_ext)) (cons 1040 (caadr lg_ext)) (cons 1000 (cdar lg_ext)) (cons 1040 (caar lg_ext)) (cons 1000 "Longueur totale de cable") (cons 1040 (* 1.4 (+ e_length (caadr lg_ext) (caar lg_ext)))) (cons 1002 "}") ) ) ) ) ) (redraw) ) (T (princ "\nN'est pas une polyligne!")) ) (prin1) ) (vl-load-com) (defun c:Tab_Cable ( / js AcDoc Space nb lst_layer lst_typ lst_1br lst_2br key_usr lst_length all_path j end_pos id_path fonts_path file_shx nw_style n obj dxf_ent ename elist xd_list e_data oldim oldlay ins_pt_cell h_t w_c ename_cell n_row n_column) (princ "\nSélection d'une polyligne comme modèle pour désignation du calque à traiter.") (while (null (setq js (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (-3 ("RESEAU_CABLAGE")))))) (princ "\nSélection vide, ou n''est pas une polyligne valable!") ) (setq js (ssget "_X" (list '(0 . "LWPOLYLINE") '(-3 ("RESEAU_CABLAGE")) (assoc 8 (entget (ssname js 0))) ) ) ) (cond (js (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) nb 0 lst_layer '() lst_typ '() lst_1br '() lst_2br '() lst_length '() ) (cond ((null (tblsearch "LAYER" "Tableau-Reseaux-Cables")) (vla-add (vla-get-layers AcDoc) "Tableau-Reseaux-Cables") ) ) (cond ((null (tblsearch "STYLE" "Texte-Cell")) (setq all_path (getenv "ACAD") j 0) (while (setq end_pos (vl-string-position (ascii ";") all_path)) (setq id_path (substr all_path 1 end_pos)) (if (wcmatch (strcase id_path) "*FONTS*") (setq fonts_path (strcat id_path "\\")) ) (setq all_path (substr all_path (+ 2 end_pos))) ) (setq file_shx (getfiled "Selectionnez un fichier de police" fonts_path "shx" 8)) (if (not file_shx) (setq file_shx "txt.shx") ) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Texte-Cell")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list file_shx 0.0 (/ (* 15.0 pi) 180) 1.0 0.0) ) (command "_.ddunits" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) ) ) (repeat (setq n (sslength js)) (setq obj (ssname js (setq n (1- n))) dxf_ent (entget obj) ename (vlax-ename->vla-object obj) elist (entget obj (list "RESEAU_CABLAGE")) xd_list (cdr (assoc -3 elist)) e_data (mapcar 'cdr (cdr (car xd_list))) lst_layer (cons (cdr (assoc 8 dxf_ent)) lst_layer) lst_typ (cons (cadr e_data) lst_typ) lst_1br (cons (cadddr (cdr e_data)) lst_1br) lst_2br (cons (caddr e_data) lst_2br) key_usr (strcat (cond ((eq (cadddr (cdr e_data)) "Tableau") "3") ((eq (cadddr (cdr e_data)) "Chambre") "4") ((eq (cadddr (cdr e_data)) "Boite") "5") ) (cond ((eq (caddr e_data) "Tableau") "3") ((eq (caddr e_data) "Chambre") "4") ((eq (caddr e_data) "Boite") "5") ) ) lst_length (cons (strcat "%<\\AcExpr " "%<\\AcExpr (%<\\AcVar " (strcat "USERR" (substr key_usr 1 1)) ">% + " "%<\\AcVar " (strcat "USERR" (substr key_usr 2 1)) ">% + " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID ename)) ">%).Length>%)>% * 1.4 \\f \"%lu6\">%" ) lst_length ) nb (1+ nb) ) ) (setq oldim (getvar "dimzin") oldlay (getvar "clayer")) (setvar "dimzin" 0) (setvar "clayer" "Tableau-Reseaux-Cables") (initget 9) (setq ins_pt_cell (getpoint "\nPoint d'insertion haut gauche du tableau: ")) (initget 6) (setq h_t (getdist ins_pt_cell (strcat "\nHauteur du texte <" (rtos (getvar "textsize")) ">: "))) (if (null h_t) (setq h_t (getvar "textsize")) (setvar "textsize" h_t)) (initget 7) (setq w_c (getdist ins_pt_cell "\nLargeur des cellules: ")) (vla-addTable Space (vlax-3d-point (trans ins_pt_cell 1 0)) (+ 3 nb) 5 (+ h_t (* h_t 0.25)) w_c) (setq ename_cell (vlax-ename->vla-object (entlast)) n_row (1+ nb) n_column -1) (vla-rotate ename_cell (vlax-3d-point (trans ins_pt_cell 1 0)) (angle '(0.0 0.0 0.0) (getvar "UCSXDIR"))) (vla-SetCellValue ename_cell 0 0 (vlax-make-variant "TABEAU RECAPITULATIF DE METRE" 8)) (vla-SetCellTextStyle ename_cell 0 0 "Texte-Cell") (vla-SetCellTextHeight ename_cell 0 0 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell 0 0 5) (foreach n (mapcar'list (append lst_layer '("Calque")) (append lst_typ '("Type de cablage")) (append lst_1br '("1er Raccordement par")) (append lst_2br '("2ème Raccordement par")) (append lst_length '("Longueurs de cable")) ) (mapcar '(lambda (el) (vla-SetText ename_cell n_row (setq n_column (1+ n_column)) el) (vla-SetCellTextStyle ename_cell n_row n_column "Texte-Cell") (vla-SetCellTextHeight ename_cell n_row n_column (vlax-make-variant h_t 5)) (if (eq n_row 1) (vla-SetCellAlignment ename_cell n_row n_column 5) (vla-SetCellAlignment ename_cell n_row n_column 6) ) ) n ) (setq n_row (1- n_row) n_column -1) ) (vla-SetText ename_cell (+ 2 nb) 4 (strcat "Total= " "%<\\AcExpr (Sum(E3:E" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 4 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 4 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 4 6) (vlax-release-object ename_cell) (vlax-release-object Space) (setvar "dimzin" oldim) (setvar "clayer" oldlay) ) (T (princ "\nAucune LWPOLYLINE trouvé avec l'application RESEAU_CABLAGE")) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 14 mai 2009 Posté(e) le 14 mai 2009 mais après il faudra payer car je ne veux pas réaliser du code "clé en main" pour un besoin plus que spécifique qui ne concerne que toi/ta société sans aucun investissement de développement de ta part Entièrement d'accord avec toi, bonuscad ! Petite suggestion, plutôt que d'utiliser les variables USERR* pour stocker des valeurs, tu pourrais utiliser les ldatas (stockées dans le dessin) ou setenv pour les stocker dans la base de registre. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didicools Posté(e) le 14 mai 2009 Auteur Posté(e) le 14 mai 2009 merci vraiment pour tout bonuscad!!!! je suis déjà très étonné que tu es accepté de faire cet énorme boulot, de t'investir autant rien que pour moi!!!je vais essayé de m'y mettre au lisp, c'est dingue tout ce qu'on peu faire avec!!! j'aurai juste une question pour me permettre de moduler un peu le lisp, j'aurai éventuellement besoin de rajouter différent type d'extrémité, c'est a dire, en plus de boite, chambre, tableau, avec les longueur associé. Donc je me demandé si je peu allé plus loin que USERR5, y a t-il une limite pour les variable USERR ? Sinon pour le tableau de métré c'est parfait!!!! c'est vraiment un travail enorme!!!! Si c'est pas trop indiscret, quel age as tu ? Et combien de temps t'a-t-il fallu pour maitriser le lisp a ce point ?Que me suggère tu pour commencer dans le lisp, as tu des lien intéressant pour apprendre ?
didicools Posté(e) le 14 mai 2009 Auteur Posté(e) le 14 mai 2009 bon j'ai trouvé la réponse pour les USERR on est limité a 5, je vais essayé de faire avec vlax-ldata-put, on verra ce que ca donne <acronym class=dict title=....
didicools Posté(e) le 14 mai 2009 Auteur Posté(e) le 14 mai 2009 bon je m'en sors pas avec les ldata, trop novice......Mais je desespère pas <acronym class=dict title=
bonuscad Posté(e) le 14 mai 2009 Posté(e) le 14 mai 2009 je vais essayé de faire avec vlax-ldata-put En effet (gile) a conseillé l'usage des ldata qui seraient moins volatiles que les variables USERR1-5 qui sont elles (bien que conservées) facilement écrasées par d'éventuel usage de lisp qui utiliserais celles-ci. Par contre je vois ne voit pas (pour l'instant) comment relire ces ldata avec les outils actuellement à dispositions dans les champs dynamiques de façon à conserver ses liens dynamique comme j'ai pu le faire avec les variables USERR. Si c'est pas trop indiscret, quel age as tu ? -> 50 combien de temps t'a-t-il fallu pour maitriser le lisp a ce point ? J'ai commencé à le pratiquer le lisp depuis la version 9 en autodidacte avec:le bouquin Autolisp d'autodesk, un autre conseillé (à l'époque) aussi par autodesk et le magazine ou Dominique Vaquant (et d'autres) proposait des routines concrètes.Sans oublié bien sur les forums lorsque la porte d'internet c'est ouverte pour moi.Ici j'ai eu le plaisir de connaitre ici des grands lispeur (gile), Patrick_35, ElpanovEvgeniy, Serge Camiré (et tout les autres qui suivent aussi leur chemin). Les connaitre (pour certain) à leur début et voir où ils en sont aujourd'hui m'épate, ils ont beaucoup plus vite appris que moi. On se complète tous sur ce forum, on a chacun des points fort dans le développement.Certain dans la géométrie, d'autre dans l'échange de données entres applications, et d'autre encore dans l'imbrication de fonction récursive (à y perdre son latin). Que me suggère tu pour commencer dans le lisp, as tu des lien intéressant pour apprendre ? Si tu débute vraiment, tu peux déjà commencer par des scripts, Rebcao et Tramber (pour ne pas les oublier) ont présenter plein de solutions.Je te dis de commencer par le script, car c'est une manière très séquentielle d'enchainer des actions. Tes premier lisp risquent fort de ressembler à un enchainement de commande, puis par la suite tu étofferas d'algorithme plus complexe. Il ne vas pas sans dire que tu trouveras beaucoup, beaucoup d'information ici, ainsi que des liens externes. Pour le lisp, une recherche avec le mot (defun dans tous les forums, risque te donner de la lecture pour un très long moment. :P Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 14 mai 2009 Posté(e) le 14 mai 2009 Salut, Je n'ai pas le courage de reprendre tout le code pour voir tout ce qu'il faudrait modifier.Mais en gros, ça serait remplacer les :(setvar "userr3" 10.0) (setvar "userr3" 5.0) (setvar "userr5" 2.0)par(vlax-ldata-put "cablage" "3" 10.0) (vlax-ldata-put "cablage" "4" 5.0) (vlax-ldata-put "cablage" "5" 2.0) et remplacer dans la construction des code de champ :(strcat "% "% (strcat "USERR" (substr key_usr 1 1)) ">% + " "% (strcat "USERR" (substr key_usr 2 1)) ">% + " "% (itoa (vla-get-ObjectID obj_vlax)) ">%).Length>%)>% * 1.4 >%" ) par(strcat "% "% (rtos (vlax-ldata-get "cablage" (substr key_usr 1 1))) " + " (rtos (vlax-ldata-get "cablage" (substr key_usr 2 1))) " + " "% (itoa (vla-get-ObjectID obj_vlax)) ">%).Length>%)>% * 1.4 >%" ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 14 mai 2009 Posté(e) le 14 mai 2009 Salut et merci, Je pense que tu as tout bon :D En prenant l'exemple simple (avec une ligne) que j'avais pris pour exposer mon problème avec l'expression diesel, ça fonctionne impeccable. ((lambda ( / ) (vl-load-com) (princ "\nSelect a line.") (while (null (setq js (ssget "_+.:E:S" '((0 . "LINE")))))) (setq obj_vlax (vlax-ename->vla-object (ssname js 0))) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (vlax-ldata-put "cablage" "3" 10.0) (vlax-ldata-put "cablage" "4" 5.0) (initget 1) (vla-addMtext Space (vlax-3d-point (trans (getpoint "\nInsertion point of field: ") 1 0)) 0.0 (strcat "%<\\AcExpr " "%<\\AcExpr (" (rtos (vlax-ldata-get "cablage" "3")) " + " (rtos (vlax-ldata-get "cablage" "4")) " + " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID obj_vlax)) ">%).Length>%)>% * 1.4 >%" ) ) )) Je laisse didicools plancher un peu sur les modifs du code Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 17 mai 2009 Auteur Posté(e) le 17 mai 2009 Merci bonuscad et (gile) J'ai modifier le code, ca marche nikel, j'ai rajouté des tenant et aboutissant, ca marche nikel, le tableau de métré ca marche nikel <acronym class=dict title=, tout va bien. Je vais essayé de rajouter une colone dans le tableau, c'est une colone qui fairai le total des longueur sans les boite, chambre....j'ai déjà commencé a regarder et j'y suis presque donc ca devrai allé.
bonuscad Posté(e) le 17 mai 2009 Posté(e) le 17 mai 2009 j'ai déjà commencé a regarder et j'y suis presque donc ca devrai allé. Excellent, donc tu n'es pas aussi novice que tu pouvais le prétendre. Si tu bloques, n'hésite pas à proposer ce que tu as fais, qu'on puisse t'aider. Bonne continuation. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 17 mai 2009 Auteur Posté(e) le 17 mai 2009 ca y est, c'est bon, j'ai réussi. c'est beaucoup plus simple de prendre les parties existante et les modifier un peu, que de créer le code complet!! pour l'instant je sais modifier mais pas créé. Je disais donc que j'ai réussi en copiant des bou de code. Donc pour voir si ce que j'ai fais te parais simple ou si j'ai cherché compliqué, peu tu regarder ce que tu en pense.(J'ai écris quelque explication sur ce que j'ai fait après le code) (vl-load-com) (defun c:Tab_Cable ( / js AcDoc Space nb lst_layer lst_typ lst_1br lst_2br key_usr lst_length lst_length2 all_path j end_pos id_path fonts_path file_shx nw_style n obj dxf_ent ename elist xd_list e_data oldim oldlay ins_pt_cell h_t w_c ename_cell n_row n_column) (princ "\nSélection d'une polyligne comme modèle pour désignation du calque à traiter.") (while (null (setq js (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (-3 ("RESEAU_CABLAGE")))))) (princ "\nSélection vide, ou n''est pas une polyligne valable!") ) (setq js (ssget "_X" (list '(0 . "LWPOLYLINE") '(-3 ("RESEAU_CABLAGE")) (assoc 8 (entget (ssname js 0))) ) ) ) (cond (js (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) nb 0 lst_layer '() lst_typ '() lst_1br '() lst_2br '() lst_length '() lst_length2 '() ) (cond ((null (tblsearch "LAYER" "Tableau-Reseaux-Cables")) (vla-add (vla-get-layers AcDoc) "Tableau-Reseaux-Cables") ) ) (cond ((null (tblsearch "STYLE" "Texte-Cell")) (setq all_path (getenv "ACAD") j 0) (while (setq end_pos (vl-string-position (ascii ";") all_path)) (setq id_path (substr all_path 1 end_pos)) (if (wcmatch (strcase id_path) "*FONTS*") (setq fonts_path (strcat id_path "\\")) ) (setq all_path (substr all_path (+ 2 end_pos))) ) (setq file_shx (getfiled "Selectionnez un fichier de police" fonts_path "shx" 8)) (if (not file_shx) (setq file_shx "txt.shx") ) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Texte-Cell")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list file_shx 0.0 (/ (* 15.0 pi) 180) 1.0 0.0) ) (command "_.ddunits" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) ) ) (repeat (setq n (sslength js)) (setq obj (ssname js (setq n (1- n))) dxf_ent (entget obj) ename (vlax-ename->vla-object obj) elist (entget obj (list "RESEAU_CABLAGE")) xd_list (cdr (assoc -3 elist)) e_data (mapcar 'cdr (cdr (car xd_list))) lst_layer (cons (cdr (assoc 8 dxf_ent)) lst_layer) lst_typ (cons (cadr e_data) lst_typ) lst_1br (cons (cadddr (cdr e_data)) lst_1br) lst_2br (cons (caddr e_data) lst_2br) key_usr (strcat (cond ((eq (cadddr (cdr e_data)) "Tableau") "3") ((eq (cadddr (cdr e_data)) "Chambre") "4") ((eq (cadddr (cdr e_data)) "Boite") "5") ) (cond ((eq (caddr e_data) "Tableau") "3") ((eq (caddr e_data) "Chambre") "4") ((eq (caddr e_data) "Boite") "5") ) ) lst_length (cons (strcat "%<\\AcExpr " "%<\\AcExpr (" (rtos (vlax-ldata-get "cablage" (substr key_usr 1 1))) " + " (rtos (vlax-ldata-get "cablage" (substr key_usr 2 1))) " + " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID ename)) ">%).Length>%)>% * 1.4 \\f \"%lu6\">%" ) lst_length ) lst_length2 (cons (strcat "%<\\AcExpr " "%<\\AcExpr (" "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID ename)) ">%).Length>%)>% * 1.4 \\f \"%lu6\">%" ) lst_length2 ) nb (1+ nb) ) ) (setq oldim (getvar "dimzin") oldlay (getvar "clayer")) (setvar "dimzin" 0) (setvar "clayer" "Tableau-Reseaux-Cables") (initget 9) (setq ins_pt_cell (getpoint "\nPoint d'insertion haut gauche du tableau: ")) (initget 6) (setq h_t (getdist ins_pt_cell (strcat "\nHauteur du texte <" (rtos (getvar "textsize")) ">: "))) (if (null h_t) (setq h_t (getvar "textsize")) (setvar "textsize" h_t)) (initget 7) (setq w_c (getdist ins_pt_cell "\nLargeur des cellules: ")) (vla-addTable Space (vlax-3d-point (trans ins_pt_cell 1 0)) (+ 3 nb) 6 (+ h_t (* h_t 0.25)) w_c) (setq ename_cell (vlax-ename->vla-object (entlast)) n_row (1+ nb) n_column -1) (vla-rotate ename_cell (vlax-3d-point (trans ins_pt_cell 1 0)) (angle '(0.0 0.0 0.0) (getvar "UCSXDIR"))) (vla-SetCellValue ename_cell 0 0 (vlax-make-variant "TABEAU RECAPITULATIF DE METRE" 8)) (vla-SetCellTextStyle ename_cell 0 0 "Texte-Cell") (vla-SetCellTextHeight ename_cell 0 0 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell 0 0 5) (foreach n (mapcar'list (append lst_layer '("Calque")) (append lst_typ '("Type de cablage")) (append lst_1br '("1er Raccordement par")) (append lst_2br '("2ème Raccordement par")) (append lst_length '("Longueurs de cable")) (append lst_length2 '("Longueurs de cable2")) ) (mapcar '(lambda (el) (vla-SetText ename_cell n_row (setq n_column (1+ n_column)) el) (vla-SetCellTextStyle ename_cell n_row n_column "Texte-Cell") (vla-SetCellTextHeight ename_cell n_row n_column (vlax-make-variant h_t 5)) (if (eq n_row 1) (vla-SetCellAlignment ename_cell n_row n_column 5) (vla-SetCellAlignment ename_cell n_row n_column 6) ) ) n ) (setq n_row (1- n_row) n_column -1) ) (vla-SetText ename_cell (+ 2 nb) 4 (strcat "Total= " "%<\\AcExpr (Sum(E3:E" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 4 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 4 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 4 6) (setq n_row (1- n_row) n_column -1) (vla-SetText ename_cell (+ 2 nb) 5 (strcat "Total= " "%<\\AcExpr (Sum(F3:F" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 5 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 5 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 5 6) (vlax-release-object ename_cell) (vlax-release-object Space) (setvar "dimzin" oldim) (setvar "clayer" oldlay) ) (T (princ "\nAucune LWPOLYLINE trouvé avec l'application RESEAU_CABLAGE")) ) (prin1) ) Donc en fait j'ai recréé une variable "lst_length2", j'ai rajouté une colone, j'ai copier colé la partie qui consiste a mettre les longueurs dans les cases, en retirant les tenant et aboutissant. Puis j'ai copier collé la partie pour faire la somme. Et la je me demande quelque chose, un truc que j'ai pas compris, a quoi sert cette ligne de code: (setq n_row (1- n_row) n_column -1) je sais qu'il faut la mettre (sinon ca marche pas, j'ai essayé <acronym class=dict title=) mais pourquoi, a quoi sert-elle ? une autre ligne que je comprend pas très bien: (vla-SetText ename_cell (+ 2 nb) 5 (strcat "Total= " "%<\\AcExpr (Sum(F3:F" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 5 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 5 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 5 6) si je comprend bien les commandes, le "5" correspond a la colonne ? ou c'est le "6" tout a la fin?Parce qu'au final ca s'écrit bien dans la colonne 6. Sinon a quoi sert ce "5"? Merci pour vos éclaircissement futur !!!
bonuscad Posté(e) le 18 mai 2009 Posté(e) le 18 mai 2009 Déjà, si ça fonctionne, c'est déjà un bon point.Pas de remarque particulière mis à part ta variable lst_length2 que tu peux évaluer plus simplement lst_length2 (cons (strcat "%<\\AcExpr (" "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID ename)) ">%).Length>%) * 1.4 \\f \"%lu6\">%" ) lst_length2 ) un truc que j'ai pas compris, a quoi sert cette ligne de code:(setq n_row (1- n_row) n_column -1) Je suis dans une boucle (foreach) (pour chaque élément de la liste) où j'écris les valeur dans les cellules.n_row étant le nombre de rangées et n_colum le nombre de colonnes et que les listes sont inversées, je commence à écrire les valeurs par la fin du tableau et je DECREMENTE mes valeur de rangées et colonnes pour remonter vers le haut du tableau. si je comprend bien les commandes, le "5" correspond a la colonne ? ou c'est le "6" tout a la fin?Parce qu'au final ca s'écrit bien dans la colonne 6. Sinon a quoi sert ce "5"? Les appels à (vla_SetCellXXXX nom_du_tableau rangée colonne "valeur_pour_la_fonction_XXX") sont identiques quelque soit la fonction.Il faut savoir que l'indice des rangées et colonnes DEBUTE à 0 et non à 1. Pour (vla-SetCellAlignment ename_cell (+ 2 nb) 5 6) le 6 est l'option d'alignement du texte de la cellule. 1 acBottomCenter 2 acBottomLeft 3 acBottomRight 4 acMiddleCenter 5 acMiddleLeft 6 acMiddleRight 7 acTopCenter 8 acTopLeft 9 acTopRight Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 18 mai 2009 Auteur Posté(e) le 18 mai 2009 je comprend mieux pour les colone, sufisait de savoir que ca commencé a 0. Par contre pour le (setq n_row (1- n_row) n_column -1) je comprend pas pourquoi je dois le remetre, surtout que je suis sortis de la boucle et que la commande qui suit ne fait pas intervenir les valeurs de "n_row" ni de "n_column". surtout que dans la commande qui suit, on lui dit ou écrir la formule. c'est dans ce passage: (foreach n ... ... ... ... (setq n_row (1- n_row) n_column -1) ) (vla-SetText ename_cell (+ 2 nb) 4 (strcat "Total= " "%<\\AcExpr (Sum(E3:E" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 4 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 4 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 4 6) [surligneur] (setq n_row (1- n_row) n_column -1)[/surligneur] (vla-SetText ename_cell (+ 2 nb) 5 (strcat "Total= " "%<\\AcExpr (Sum(F3:F" (itoa (+ 2 nb)) ")) \\f \"%lu6\">%") ) (vla-SetCellTextStyle ename_cell (+ 2 nb) 5 "Texte-Cell") (vla-SetCellTextHeight ename_cell (+ 2 nb) 5 (vlax-make-variant h_t 5)) (vla-SetCellAlignment ename_cell (+ 2 nb) 5 6) (vlax-release-object ename_cell) (vlax-release-object Space) (setvar "dimzin" oldim) (setvar "clayer" oldlay) ) [Edité le 18/5/2009 par didicools]
bonuscad Posté(e) le 18 mai 2009 Posté(e) le 18 mai 2009 Par contre pour le (setq n_row (1- n_row) n_column -1)je comprend pas pourquoi je dois le remetre Je n'avais pas vu qu'il était répété en dehors de la boucle. :P Dans mon code original je n'avais pas cette ligne. (un copier-coller en trop peut être !) Je vois pas pourquoi tu dois la remettre??? J'ai essayé ton code en le supprimant et pour moi ça fonctionne sans problème. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didicools Posté(e) le 15 juin 2009 Auteur Posté(e) le 15 juin 2009 Salut bonuscad ! Je reviens vers toi pour mon petit programme de cablage qui fonctionne a merveille grace a toi, cependant, j'ai un petit souci que j'arrive pas a résoudre et je comprend pas pourquoi. je t'explique, j'ai rajouté plusieur type de tenants et d'aboutissants, mon probleme selon moi ce citue a cet endroi : (initget "poteauEP poteauBT Poste Candelabre Boite BOrne COffret Armoire") (setq key_cab (getkword "\nBranchement pour cette extrémité sur [poteauEP/poteauBT/Poste/Candelabre/Boite/BOrne/COffret/Armoire]? : ")) (cond ((eq key_cab "poteauEP") (setq lg_ext (cons (cons 11 key_cab) lg_ext) key_usr (strcat "3" key_usr))) ((eq key_cab "poteauBT") (setq lg_ext (cons (cons 3 key_cab) lg_ext) key_usr (strcat "4" key_usr))) ((eq key_cab "Poste") (setq lg_ext (cons (cons 5 key_cab) lg_ext) key_usr (strcat "5" key_usr))) ((eq key_cab "Candelabre") (setq lg_ext (cons (cons 2.5 key_cab) lg_ext) key_usr (strcat "6" key_usr))) ((eq key_cab "Boite") (setq lg_ext (cons (cons 1 key_cab) lg_ext) key_usr (strcat "7" key_usr))) ((eq key_cab "BOrne") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "8" key_usr))) ((eq key_cab "COffret") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "9" key_usr))) ((eq key_cab "Armoire") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "10" key_usr))) ) le "key_usr (strcat "10" key_usr)))" ne fonctionne pas, si je remplace le "10" par un "G", ou une letre quelconque, ca fonctionne. mais pourquoi ? il accepte pas qu'on met 2 caractère peu etre ?ou alors ca vient du "(vlax-ldata-put "cablage" "10" 2.0)" un peu plus haut dans le programme qui accepte pas 2 caractère ?? j'espère que tu poura eclairer ma lanterne, je te met le programme complet a la suite. (defun draw_pt (pt col / rap) (setq rap (/ (getvar "viewsize") 50)) (foreach n (mapcar '(lambda (x) (list ((eval (car x)) (car pt) rap) ((eval (cadr x)) (cadr pt) rap) ) ) '((+ +) (+ -) (- +) (- -)) ) (grdraw (trans pt 0 1) (trans n 0 1) col) ) ) (defun c:CABLAGE ( / js dxf_ent lay_name typ_cab obj_vlax e_length pt_start pt_end minpt maxpt key_cab key_usr lg_ext AcDoc Space pt deric rtx htx nw_obj) (princ "\nSélectionnez une polyligne ou entrée pour en créer une.") (setq js (ssget "_+.:E:S" (list '(0 . "LWPOLYLINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (getvar "CTAB")) ) ) ) (if (null js) (progn (setvar "CMDECHO" 1) (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) (setq dxf_ent (entget (entlast))) ) (setq dxf_ent (entget (ssname js 0))) ) (cond ((eq (cdr (assoc 0 dxf_ent)) "LWPOLYLINE") (vlax-ldata-put "cablage" "3" 11.0) (vlax-ldata-put "cablage" "4" 3.0) (vlax-ldata-put "cablage" "5" 5.0) (vlax-ldata-put "cablage" "6" 2.5) (vlax-ldata-put "cablage" "7" 1.0) (vlax-ldata-put "cablage" "8" 2.0) (vlax-ldata-put "cablage" "9" 2.0) (vlax-ldata-put "cablage" "G" 2.0) (setq lay_name (cdr (assoc 8 dxf_ent)) key_usr "") (cond ((eq lay_name "Reseau Distribution Electrique Eclairage") (setq typ_cab "DISTRIBUTION-PUBLIC")) ((eq lay_name "Reseau Distribution Electrique Abonne") (setq typ_cab "DISTRIBUTION-PRIVE")) (T (setq typ_cab "DISTRIBUTION-Inconnue")) ) (vl-load-com) (setq obj_vlax (vlax-ename->vla-object (cdar dxf_ent)) e_length (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax)) pt_start (vlax-curve-getStartPoint obj_vlax) pt_end (vlax-curve-getEndPoint obj_vlax) ) (vla-GetBoundingBox obj_vlax 'mnpt 'mxpt) (setq minpt (trans (safearray-value mnpt) 0 1) maxpt (trans (safearray-value mxpt) 0 1) ) (command "_.zoom" "_window" "_none" minpt "_none" maxpt "_.zoom" "0.75x") (redraw (cdar dxf_ent) 3) (draw_pt pt_start 7) (repeat 2 (initget "poteauEP poteauBT Poste Candelabre Boite BOrne COffret Armoire") (setq key_cab (getkword "\nBranchement pour cette extrémité sur [poteauEP/poteauBT/Poste/Candelabre/Boite/BOrne/COffret/Armoire]? : ")) (cond ((eq key_cab "poteauEP") (setq lg_ext (cons (cons 11 key_cab) lg_ext) key_usr (strcat "3" key_usr))) ((eq key_cab "poteauBT") (setq lg_ext (cons (cons 3 key_cab) lg_ext) key_usr (strcat "4" key_usr))) ((eq key_cab "Poste") (setq lg_ext (cons (cons 5 key_cab) lg_ext) key_usr (strcat "5" key_usr))) ((eq key_cab "Candelabre") (setq lg_ext (cons (cons 2.5 key_cab) lg_ext) key_usr (strcat "6" key_usr))) ((eq key_cab "Boite") (setq lg_ext (cons (cons 1 key_cab) lg_ext) key_usr (strcat "7" key_usr))) ((eq key_cab "BOrne") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "8" key_usr))) ((eq key_cab "COffret") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "9" key_usr))) (T (setq key_cab "Armoire") (setq lg_ext (cons (cons 2 key_cab) lg_ext) key_usr (strcat "G" key_usr))) ) (draw_pt pt_start -7) (draw_pt pt_end 7) ) (draw_pt pt_end -7) (if (null (tblsearch "appid" "RESEAU_CABLAGE")) (regapp "RESEAU_CABLAGE") ) (alert (strcat "Information attaché à la polyligne mesurant : " (rtos e_length 2 2) "\net sur le calque : " lay_name "\n" "\nLongueur de cable attaché : " (rtos (* 1.04 (+ e_length (caadr lg_ext) (caar lg_ext))) 2 2) "\nPour un(e) : " (strcase (cdadr lg_ext)) " à la 1ere extrémité." "\nEt pour un(e) : " (strcase (cdar lg_ext)) " à la 2ème extrémité." "\nCeci pour une " typ_cab ) ) (redraw (cdar dxf_ent) 4) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((null (tblsearch "LAYER" (strcat lay_name "-TXT"))) (vla-add (vla-get-layers AcDoc) (strcat lay_name "-TXT")) ) ) (setq pt (vlax-curve-getPointAtDist obj_vlax (* 0.5 e_length)) deriv (vlax-curve-getFirstDeriv obj_vlax (vlax-curve-getParamAtPoint obj_vlax pt)) rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR"))) ) (initget 6) (setq htx (getdist (trans pt 0 1) (strcat "\nSpécifiez la hauteur texte <" (rtos (getvar "TEXTSIZE")) ">: "))) (if htx (setvar "TEXTSIZE" htx)) (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi))) (setq nw_obj (vla-addMtext Space (vlax-3d-point (setq pt (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE")))) 0.0 (strcat "%<\\AcExpr " "%<\\AcExpr (" (rtos (vlax-ldata-get "cablage" (substr key_usr 1 1))) " + " (rtos (vlax-ldata-get "cablage" (substr key_usr 2 1))) " + " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID obj_vlax)) ">%).Length>%)>% * 1.04 >%" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt (getvar "TEXTSTYLE") (strcat lay_name "-TXT") rtx) ) (entmod (append dxf_ent (list (list -3 (list "RESEAU_CABLAGE" (cons 1002 "{") (cons 1000 typ_cab) (cons 1000 (cdadr lg_ext)) (cons 1040 (caadr lg_ext)) (cons 1000 (cdar lg_ext)) (cons 1040 (caar lg_ext)) (cons 1000 "Longueur totale de cable") (cons 1040 (* 1.4 (+ e_length (caadr lg_ext) (caar lg_ext)))) (cons 1002 "}") ) ) ) ) ) (redraw) ) (T (princ "\nN'est pas une polyligne!")) ) (prin1) )
seafishII Posté(e) le 18 juin 2009 Posté(e) le 18 juin 2009 Bonjour,pour cablage:trés bel outil, bravo. tout a fait adapter pour ce que je dois faire.j'essaye désesperemment de limiter à deux chiffres aprés la virgule sans succés.j ai essayé format / controle des unites.dans le lips j ai essayé autour de rtos ( j ai vu ca dans "seglen " de giles mais mes connaissances en lisp proche du zero ne m aident pas beaucoup).de plus j 'essaye aussi de trouver le moyen de forcer le sens de lecture ( vu dans "seglen") pour avoir les textes dans le bon sens quel que soit le sens de la polyligneCordialement.
didicools Posté(e) le 18 juin 2009 Auteur Posté(e) le 18 juin 2009 salut, Pour limité a 2 chiffre après la virgule tu remplace la ligne la : ">%).Length>%)>% * 1.04 >%" par: ">%).Length>%)>% * 1.04 \\f \"%lu6%pr2\">%" pour le sens de lecture j'essayerai de regarder mais je te promet rien, je débute aussi en lisp
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant